lim 0.19.4 → 0.19.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -424,6 +424,9 @@ lim xcode create --rm --region us-west --hard-timeout 1h
424
424
  # Build (automatically syncs the project path first)
425
425
  lim xcode build ./MyProject --scheme MyApp --workspace MyApp.xcworkspace
426
426
 
427
+ # Run a project command (syncs the current directory first)
428
+ lim xcode run -- make api
429
+
427
430
  # Build and upload artifact
428
431
  lim xcode build ./MyProject --scheme MyApp --upload my-app-build
429
432
 
@@ -670,6 +673,19 @@ lim asset pull my-app-build -o ./build-output
670
673
 
671
674
  `lim xcode build [PATH]` automatically performs a one-shot code sync for the given project path before invoking `xcodebuild`. The sync step automatically ignores build artifacts (`build/`, `DerivedData/`, `.build/`), dependency folders (`Pods/`, `Carthage/Build/`, `.swiftpm/`), and user-specific files (`xcuserdata/`, `.dSYM/`).
672
675
 
676
+ #### Run project commands
677
+
678
+ `lim xcode run [RELATIVE_CWD] -- <COMMAND...>` syncs the current directory and runs a one-shot command in the Xcode sandbox. The remote working directory defaults to the synced workspace root:
679
+
680
+ ```bash
681
+ lim xcode run -- make api
682
+ lim xcode run apps/api -- make generate
683
+ lim xcode run --env API_ENV=development -- npm run generate
684
+ lim xcode run --no-sync -- mise run build
685
+ ```
686
+
687
+ The sandbox includes Node, Ruby, CMake, Mint, and mise. mise and Mint installs are scoped to the instance's sandbox home. Homebrew is not available because its macOS packages require a shared system prefix; use mise, Mint, SwiftPM, or project-local binaries instead. Commands stream stdout and stderr and return the remote exit code, but do not provide an interactive terminal.
688
+
673
689
  For [XcodeGen](https://github.com/yonaskolb/XcodeGen) projects whose generated `.xcodeproj` is gitignored, the server generates it from your synced `project.yml` automatically before the build — it looks next to a pinned `--project`/`--workspace` path, at the synced folder root, and one directory level down. If your spec has a different name or location, pin it with `--xcodegen-spec <path>`, optionally control the output directory with `--xcodegen-project <dir>`, and anchor relative paths in the spec with `--xcodegen-project-root <dir>`; all paths are relative to the synced folder root and mirror `xcodegen generate --spec/--project/--project-root`. Passing any of these flags always regenerates the project on the server:
674
690
 
675
691
  ```bash
@@ -0,0 +1,26 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class XcodeRun extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static args: {
7
+ cwd: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ id: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ env: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ timeout: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ 'no-sync': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ 'basis-cache-dir': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
15
+ ignore: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
16
+ include: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ 'additional-file': import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
19
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
20
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
21
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
22
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
23
+ };
24
+ run(): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/xcode/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMjD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,MAAM,CAAC,OAAO,SAAuC;IACrD,MAAM,CAAC,WAAW,SAC8F;IAEhH,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,IAAI;;MAMT;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;MAuCV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyD3B"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../../base-command");
5
+ const ignore_patterns_1 = require("../../lib/ignore-patterns");
6
+ const duration_1 = require("../../lib/duration");
7
+ const bytes_1 = require("../../lib/bytes");
8
+ const additional_files_1 = require("../../lib/additional-files");
9
+ class XcodeRun extends base_command_1.BaseCommand {
10
+ async run() {
11
+ const delimiter = this.argv.indexOf('--');
12
+ if (delimiter < 0) {
13
+ this.error('Separate the remote command with `--`, for example: lim xcode run -- make api');
14
+ }
15
+ const commandArgs = this.argv.slice(delimiter + 1);
16
+ if (commandArgs.length === 0) {
17
+ this.error('A command is required after `--`.');
18
+ }
19
+ const { args, flags } = await this.parse(XcodeRun, this.argv.slice(0, delimiter));
20
+ this.setParsedFlags(flags);
21
+ const env = parseEnvironmentEntries(flags.env ?? [], (message) => this.error(message));
22
+ const commandLine = commandArgs.length === 1 ? commandArgs[0] : commandArgs.map(quoteShellArgument).join(' ');
23
+ await this.withAuth(async () => {
24
+ const target = await this.resolveXcodeTargetOrCreate(flags.id);
25
+ const xcodeClient = await this.resolveXcodeClient(target);
26
+ if (!flags['no-sync']) {
27
+ const syncPath = process.cwd();
28
+ this.info(`Syncing ${syncPath} to instance ${target.id}...`);
29
+ const syncStart = Date.now();
30
+ const result = await xcodeClient.sync(syncPath, {
31
+ watch: false,
32
+ install: false,
33
+ basisCacheDir: flags['basis-cache-dir'],
34
+ ignore: (0, ignore_patterns_1.compileIgnorePatterns)(flags.ignore),
35
+ include: (0, ignore_patterns_1.compileIgnorePatterns)(flags.include),
36
+ additionalFiles: (0, additional_files_1.parseAdditionalFileFlags)(flags['additional-file']),
37
+ });
38
+ const syncDuration = (0, duration_1.formatDurationMs)(Date.now() - syncStart);
39
+ const syncedSize = result.bytesSent !== undefined ? ` (${(0, bytes_1.formatBytes)(result.bytesSent)} sent)` : '';
40
+ this.info(`Sync completed in ${syncDuration}${syncedSize}.`);
41
+ }
42
+ this.info(`Running in ${args.cwd ?? '.'}: ${commandLine}`);
43
+ const proc = xcodeClient.run(commandLine, {
44
+ cwd: args.cwd ?? '.',
45
+ ...(env && { env }),
46
+ ...(flags.timeout !== undefined && { timeoutSeconds: flags.timeout }),
47
+ });
48
+ proc.stdout.on('data', (line) => process.stdout.write(line + '\n'));
49
+ proc.stderr.on('data', (line) => process.stderr.write(line + '\n'));
50
+ const result = await proc;
51
+ if (result.exitCode !== 0) {
52
+ if (result.timedOut) {
53
+ this.error('Timed out waiting for the command to finish; the remote command may still be running.', { exit: result.exitCode });
54
+ }
55
+ this.error(`Command failed with exit code ${result.exitCode}`, { exit: result.exitCode });
56
+ }
57
+ });
58
+ }
59
+ }
60
+ XcodeRun.summary = 'Run a command on an Xcode sandbox';
61
+ XcodeRun.description = 'Sync the current directory, then run a one-shot shell command in the remote workspace with streamed output.';
62
+ XcodeRun.examples = [
63
+ '<%= config.bin %> xcode run -- make api',
64
+ '<%= config.bin %> xcode run apps/api -- make generate',
65
+ '<%= config.bin %> xcode run --env API_ENV=development -- npm run generate',
66
+ '<%= config.bin %> xcode run --no-sync -- mise run build',
67
+ ];
68
+ XcodeRun.args = {
69
+ cwd: core_1.Args.string({
70
+ description: 'Remote working directory relative to the synced workspace root. Defaults to ".".',
71
+ required: false,
72
+ default: '.',
73
+ }),
74
+ };
75
+ XcodeRun.flags = {
76
+ ...base_command_1.BaseCommand.baseFlags,
77
+ id: core_1.Flags.string({
78
+ description: 'Xcode instance ID to run on. Defaults to the most recent standalone Xcode target.',
79
+ }),
80
+ env: core_1.Flags.string({
81
+ description: 'Environment variable in KEY=VALUE form. Repeat for multiple variables.',
82
+ multiple: true,
83
+ multipleNonGreedy: true,
84
+ }),
85
+ timeout: core_1.Flags.integer({
86
+ description: 'Server-side command timeout in seconds. Defaults to 3600, max 21600.',
87
+ min: 1,
88
+ max: 21600,
89
+ }),
90
+ 'no-sync': core_1.Flags.boolean({
91
+ description: 'Skip syncing the current directory before running the command.',
92
+ default: false,
93
+ }),
94
+ 'basis-cache-dir': core_1.Flags.string({
95
+ description: 'Directory to use for the client-side delta sync cache.',
96
+ }),
97
+ ignore: core_1.Flags.string({
98
+ description: 'Regular expression to ignore matching relative paths during sync. Repeat for multiple.',
99
+ multiple: true,
100
+ multipleNonGreedy: true,
101
+ }),
102
+ include: core_1.Flags.string({
103
+ description: 'Regular expression to force-sync matching relative paths even when gitignored. Repeat for multiple.',
104
+ multiple: true,
105
+ multipleNonGreedy: true,
106
+ }),
107
+ 'additional-file': core_1.Flags.string({
108
+ description: 'Additional file to sync as localPath=remotePath, for example ~/.netrc=~/.netrc. Repeat for multiple.',
109
+ multiple: true,
110
+ multipleNonGreedy: true,
111
+ }),
112
+ };
113
+ exports.default = XcodeRun;
114
+ function quoteShellArgument(value) {
115
+ return `'${value.split("'").join("'\"'\"'")}'`;
116
+ }
117
+ function parseEnvironmentEntries(entries, fail) {
118
+ if (entries.length === 0)
119
+ return undefined;
120
+ const env = {};
121
+ for (const entry of entries) {
122
+ const separator = entry.indexOf('=');
123
+ if (separator <= 0) {
124
+ fail(`Invalid --env value ${JSON.stringify(entry)}; expected KEY=VALUE.`);
125
+ }
126
+ const key = entry.slice(0, separator);
127
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
128
+ fail(`Invalid environment variable name ${JSON.stringify(key)}.`);
129
+ }
130
+ env[key] = entry.slice(separator + 1);
131
+ }
132
+ return env;
133
+ }
134
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/xcode/run.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lim",
3
- "version": "0.19.4",
3
+ "version": "0.19.5",
4
4
  "description": "Use remote XCode, iOS Simulator, Android Emulator and more to build and test apps from Linux, Windows or macOS.",
5
5
  "bin": {
6
6
  "lim": "./bin/run.js"
@@ -25,7 +25,7 @@
25
25
  "test": "jest"
26
26
  },
27
27
  "dependencies": {
28
- "@limrun/api": "0.42.2",
28
+ "@limrun/api": "0.43.0",
29
29
  "@oclif/core": "^4",
30
30
  "cli-progress": "^3.12.0",
31
31
  "cli-table3": "^0.6.5",
@@ -70,7 +70,7 @@
70
70
  "description": "Install Limrun skills for AI coding agents (Claude Code, Cursor, Codex). Run `lim skills install` to set up."
71
71
  },
72
72
  "xcode": {
73
- "description": "Execute any task on remote XCode sandboxes: create, list, get, delete, sync, build, attach-simulator"
73
+ "description": "Execute any task on remote XCode sandboxes: create, list, get, delete, sync, build, run, attach-simulator"
74
74
  }
75
75
  }
76
76
  },