@kainoa/simplybuild 0.1.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.
- package/README.md +62 -0
- package/dist/app/runSimplyBuild.d.ts +25 -0
- package/dist/app/runSimplyBuild.js +287 -0
- package/dist/app/runSimplyBuild.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +146 -0
- package/dist/cli.js.map +1 -0
- package/dist/discovery/projects.d.ts +2 -0
- package/dist/discovery/projects.js +51 -0
- package/dist/discovery/projects.js.map +1 -0
- package/dist/discovery/schemes.d.ts +3 -0
- package/dist/discovery/schemes.js +67 -0
- package/dist/discovery/schemes.js.map +1 -0
- package/dist/discovery/targets.d.ts +6 -0
- package/dist/discovery/targets.js +133 -0
- package/dist/discovery/targets.js.map +1 -0
- package/dist/matching/targetMatcher.d.ts +15 -0
- package/dist/matching/targetMatcher.js +104 -0
- package/dist/matching/targetMatcher.js.map +1 -0
- package/dist/runner/commandRunner.d.ts +2 -0
- package/dist/runner/commandRunner.js +41 -0
- package/dist/runner/commandRunner.js.map +1 -0
- package/dist/runner/pipelines.d.ts +23 -0
- package/dist/runner/pipelines.js +159 -0
- package/dist/runner/pipelines.js.map +1 -0
- package/dist/runner/xcodebuildmcpRunner.d.ts +14 -0
- package/dist/runner/xcodebuildmcpRunner.js +53 -0
- package/dist/runner/xcodebuildmcpRunner.js.map +1 -0
- package/dist/setup/xcodebuildmcpPrereq.d.ts +9 -0
- package/dist/setup/xcodebuildmcpPrereq.js +120 -0
- package/dist/setup/xcodebuildmcpPrereq.js.map +1 -0
- package/dist/state/store.d.ts +14 -0
- package/dist/state/store.js +126 -0
- package/dist/state/store.js.map +1 -0
- package/dist/types.d.ts +73 -0
- package/dist/types.js +20 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/prompts.d.ts +22 -0
- package/dist/ui/prompts.js +93 -0
- package/dist/ui/prompts.js.map +1 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Simply Xcode Build
|
|
2
|
+
|
|
3
|
+
`simplybuild` is a smart CLI wrapper around `xcodebuildmcp` for one-command iOS build, deploy, and launch.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
- macOS with Xcode
|
|
8
|
+
- Node.js 20+
|
|
9
|
+
- `xcodebuildmcp` available in `PATH` (interactive runs can install it automatically)
|
|
10
|
+
|
|
11
|
+
## Install (local repo)
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install
|
|
15
|
+
npm run build
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Run directly:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
node dist/cli.js --help
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
simplybuild --help
|
|
28
|
+
sb --help
|
|
29
|
+
simplybuild --device "iPhone 15"
|
|
30
|
+
simplybuild --scheme MyApp
|
|
31
|
+
simplybuild --list-devices
|
|
32
|
+
simplybuild --list-projects
|
|
33
|
+
simplybuild --verbose
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Behavior
|
|
37
|
+
|
|
38
|
+
- Auto-discovers `.xcworkspace`/`.xcodeproj` recursively from current directory.
|
|
39
|
+
- If none are found, prompts to search parent directories.
|
|
40
|
+
- Auto-discovers schemes with `xcodebuild -list -json`.
|
|
41
|
+
- Falls back to interactive Clack selectors when target selection is required.
|
|
42
|
+
- `--device` requires exact name match (case-insensitive).
|
|
43
|
+
- Physical deployment asks for one-time confirmation per `{project, deviceId}` and remembers approval.
|
|
44
|
+
- Remembers last successful project/scheme/target context.
|
|
45
|
+
- Checks for `xcodebuildmcp` at startup and can auto-install it via `npm install -g xcodebuildmcp` in interactive mode.
|
|
46
|
+
|
|
47
|
+
## State file
|
|
48
|
+
|
|
49
|
+
State is persisted at:
|
|
50
|
+
|
|
51
|
+
- `$XDG_STATE_HOME/simplybuild/state.json` (if `XDG_STATE_HOME` is set)
|
|
52
|
+
- otherwise `~/.local/state/simplybuild/state.json`
|
|
53
|
+
|
|
54
|
+
Corrupt state files are automatically backed up as:
|
|
55
|
+
|
|
56
|
+
- `state.json.corrupt-<timestamp>`
|
|
57
|
+
|
|
58
|
+
## Notes
|
|
59
|
+
|
|
60
|
+
- `--watch` is intentionally not implemented in v1.
|
|
61
|
+
- In non-interactive (no TTY) mode, commands fail fast when a prompt would be required.
|
|
62
|
+
- In non-interactive mode, missing `xcodebuildmcp` fails with explicit install instructions.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type CliOptions, type ProjectCandidate, type SchemeCandidate, type TargetCandidate } from "../types.js";
|
|
2
|
+
import { type StateStore } from "../state/store.js";
|
|
3
|
+
import { type PromptApi } from "../ui/prompts.js";
|
|
4
|
+
export interface RunSimplyBuildDependencies {
|
|
5
|
+
cwd?: string;
|
|
6
|
+
prompts?: PromptApi;
|
|
7
|
+
stateStore?: StateStore;
|
|
8
|
+
ensureXcodebuildmcpReady?: (prompts: PromptApi, verbose: boolean) => Promise<void>;
|
|
9
|
+
discoverProjects?: (scanRoot: string) => Promise<ProjectCandidate[]>;
|
|
10
|
+
discoverSchemes?: (container: ProjectCandidate) => Promise<SchemeCandidate[]>;
|
|
11
|
+
discoverTargets?: () => Promise<TargetCandidate[]>;
|
|
12
|
+
runSimulatorPipeline?: (ctx: {
|
|
13
|
+
container: ProjectCandidate;
|
|
14
|
+
scheme: string;
|
|
15
|
+
target: TargetCandidate;
|
|
16
|
+
verbose: boolean;
|
|
17
|
+
}, prompts: PromptApi) => Promise<void>;
|
|
18
|
+
runPhysicalPipeline?: (ctx: {
|
|
19
|
+
container: ProjectCandidate;
|
|
20
|
+
scheme: string;
|
|
21
|
+
target: TargetCandidate;
|
|
22
|
+
verbose: boolean;
|
|
23
|
+
}, prompts: PromptApi) => Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare function runSimplyBuild(options: CliOptions, deps?: RunSimplyBuildDependencies): Promise<void>;
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { UserCancelledError, UserFacingError, } from "../types.js";
|
|
3
|
+
import { discoverProjects } from "../discovery/projects.js";
|
|
4
|
+
import { discoverSchemes } from "../discovery/schemes.js";
|
|
5
|
+
import { discoverTargets } from "../discovery/targets.js";
|
|
6
|
+
import { decideTargetFromQuery } from "../matching/targetMatcher.js";
|
|
7
|
+
import { createStateStore } from "../state/store.js";
|
|
8
|
+
import { createPromptApi } from "../ui/prompts.js";
|
|
9
|
+
import { runPhysicalPipeline, runSimulatorPipeline } from "../runner/pipelines.js";
|
|
10
|
+
import { ensureXcodebuildmcpReady } from "../setup/xcodebuildmcpPrereq.js";
|
|
11
|
+
function targetLabel(target) {
|
|
12
|
+
const kindLabel = target.kind === "physical" ? "Device" : "Simulator";
|
|
13
|
+
const osPart = target.os ? ` - ${target.os}` : "";
|
|
14
|
+
const statePart = target.state ? ` (${target.state})` : "";
|
|
15
|
+
return `[${kindLabel}] ${target.name}${osPart}${statePart}`;
|
|
16
|
+
}
|
|
17
|
+
function sortTargetsForSelection(targets, rememberedTargetId) {
|
|
18
|
+
const copy = [...targets];
|
|
19
|
+
copy.sort((a, b) => {
|
|
20
|
+
const aRemembered = rememberedTargetId && a.id === rememberedTargetId ? 1 : 0;
|
|
21
|
+
const bRemembered = rememberedTargetId && b.id === rememberedTargetId ? 1 : 0;
|
|
22
|
+
if (aRemembered !== bRemembered) {
|
|
23
|
+
return bRemembered - aRemembered;
|
|
24
|
+
}
|
|
25
|
+
if (a.kind !== b.kind) {
|
|
26
|
+
return a.kind === "physical" ? -1 : 1;
|
|
27
|
+
}
|
|
28
|
+
if (a.kind === "simulator" && b.kind === "simulator") {
|
|
29
|
+
const aBooted = a.isBooted ? 1 : 0;
|
|
30
|
+
const bBooted = b.isBooted ? 1 : 0;
|
|
31
|
+
if (aBooted !== bBooted) {
|
|
32
|
+
return bBooted - aBooted;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return a.name.localeCompare(b.name);
|
|
36
|
+
});
|
|
37
|
+
return copy;
|
|
38
|
+
}
|
|
39
|
+
function formatCandidateList(values, labelFor, maxItems = 8) {
|
|
40
|
+
if (values.length === 0) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const lines = values.slice(0, maxItems).map((item) => `- ${labelFor(item)}`);
|
|
44
|
+
if (values.length > maxItems) {
|
|
45
|
+
lines.push(`- ...and ${values.length - maxItems} more`);
|
|
46
|
+
}
|
|
47
|
+
return lines;
|
|
48
|
+
}
|
|
49
|
+
function projectKeyFromContainer(container) {
|
|
50
|
+
return path.resolve(container.path);
|
|
51
|
+
}
|
|
52
|
+
function toTimestamp(value) {
|
|
53
|
+
if (!value) {
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
56
|
+
const timestamp = Date.parse(value);
|
|
57
|
+
return Number.isNaN(timestamp) ? 0 : timestamp;
|
|
58
|
+
}
|
|
59
|
+
async function resolveRememberedContainerPath(candidates, stateStore) {
|
|
60
|
+
const withMemory = await Promise.all(candidates.map(async (candidate) => {
|
|
61
|
+
const memory = await stateStore.getProjectMemory(projectKeyFromContainer(candidate));
|
|
62
|
+
return {
|
|
63
|
+
candidate,
|
|
64
|
+
memory,
|
|
65
|
+
};
|
|
66
|
+
}));
|
|
67
|
+
withMemory.sort((a, b) => toTimestamp(b.memory?.updatedAt) - toTimestamp(a.memory?.updatedAt));
|
|
68
|
+
return withMemory.find((entry) => entry.memory)?.candidate.path;
|
|
69
|
+
}
|
|
70
|
+
async function resolveProjectCandidates(startDir, prompts, discoverProjectsFn) {
|
|
71
|
+
let scanDir = path.resolve(startDir);
|
|
72
|
+
while (true) {
|
|
73
|
+
const candidates = await discoverProjectsFn(scanDir);
|
|
74
|
+
if (candidates.length > 0) {
|
|
75
|
+
return candidates;
|
|
76
|
+
}
|
|
77
|
+
const parentDir = path.dirname(scanDir);
|
|
78
|
+
if (parentDir === scanDir) {
|
|
79
|
+
throw new UserFacingError("No Xcode project or workspace found.");
|
|
80
|
+
}
|
|
81
|
+
if (!prompts.interactive) {
|
|
82
|
+
throw new UserFacingError("No Xcode project or workspace found in this directory.", [
|
|
83
|
+
`Run from a folder containing .xcodeproj/.xcworkspace or use an interactive TTY to search parent directories.`,
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
const shouldSearchParent = await prompts.confirm("No Xcode project found here. Search parent directory?", true);
|
|
87
|
+
if (!shouldSearchParent) {
|
|
88
|
+
throw new UserFacingError("No Xcode project selected.");
|
|
89
|
+
}
|
|
90
|
+
scanDir = parentDir;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function pickProject(candidates, prompts, rememberedPath) {
|
|
94
|
+
if (candidates.length === 1) {
|
|
95
|
+
return candidates[0];
|
|
96
|
+
}
|
|
97
|
+
if (!prompts.interactive) {
|
|
98
|
+
throw new UserFacingError("Multiple Xcode containers found but interactive selection is unavailable.", formatCandidateList(candidates, (item) => `${item.kind}: ${item.path}`));
|
|
99
|
+
}
|
|
100
|
+
const selectedPath = await prompts.select("Select project/workspace", candidates.map((candidate) => ({
|
|
101
|
+
value: candidate.path,
|
|
102
|
+
label: `${candidate.name} (${candidate.kind})`,
|
|
103
|
+
hint: candidate.path,
|
|
104
|
+
})), rememberedPath);
|
|
105
|
+
const selected = candidates.find((candidate) => candidate.path === selectedPath);
|
|
106
|
+
if (!selected) {
|
|
107
|
+
throw new UserFacingError("Unable to resolve selected project/workspace.");
|
|
108
|
+
}
|
|
109
|
+
return selected;
|
|
110
|
+
}
|
|
111
|
+
function matchSchemeName(input, schemes) {
|
|
112
|
+
const exact = schemes.find((item) => item.name === input);
|
|
113
|
+
if (exact) {
|
|
114
|
+
return exact.name;
|
|
115
|
+
}
|
|
116
|
+
const caseInsensitive = schemes.find((item) => item.name.toLowerCase() === input.toLowerCase());
|
|
117
|
+
return caseInsensitive?.name;
|
|
118
|
+
}
|
|
119
|
+
async function resolveScheme(container, explicitScheme, rememberedScheme, prompts, discoverSchemesFn) {
|
|
120
|
+
const schemes = await discoverSchemesFn(container);
|
|
121
|
+
if (explicitScheme) {
|
|
122
|
+
if (schemes.length === 0) {
|
|
123
|
+
return explicitScheme;
|
|
124
|
+
}
|
|
125
|
+
const matched = matchSchemeName(explicitScheme, schemes);
|
|
126
|
+
if (!matched) {
|
|
127
|
+
throw new UserFacingError(`Scheme '${explicitScheme}' not found in selected ${container.kind}.`, formatCandidateList(schemes, (item) => item.name));
|
|
128
|
+
}
|
|
129
|
+
return matched;
|
|
130
|
+
}
|
|
131
|
+
if (schemes.length === 0) {
|
|
132
|
+
if (!prompts.interactive) {
|
|
133
|
+
throw new UserFacingError("No schemes discovered automatically.", ["Re-run in interactive mode to enter a scheme manually."]);
|
|
134
|
+
}
|
|
135
|
+
return prompts.text("No schemes discovered. Enter scheme name");
|
|
136
|
+
}
|
|
137
|
+
const nonTestSchemes = schemes.filter((scheme) => !scheme.isLikelyTestScheme);
|
|
138
|
+
if (nonTestSchemes.length === 1) {
|
|
139
|
+
return nonTestSchemes[0].name;
|
|
140
|
+
}
|
|
141
|
+
if (!prompts.interactive) {
|
|
142
|
+
throw new UserFacingError("Multiple schemes found but interactive selection is unavailable.", formatCandidateList(schemes, (item) => item.name));
|
|
143
|
+
}
|
|
144
|
+
return prompts.select("Select scheme", schemes.map((scheme) => ({
|
|
145
|
+
value: scheme.name,
|
|
146
|
+
label: scheme.name,
|
|
147
|
+
hint: scheme.isLikelyTestScheme ? "likely test scheme" : undefined,
|
|
148
|
+
})), rememberedScheme);
|
|
149
|
+
}
|
|
150
|
+
async function selectTargetInteractively(prompts, allTargets, rememberedTargetId, message = "Select target device/simulator") {
|
|
151
|
+
if (!prompts.interactive) {
|
|
152
|
+
throw new UserFacingError("Target selection requires an interactive terminal.", formatCandidateList(allTargets, targetLabel));
|
|
153
|
+
}
|
|
154
|
+
const sorted = sortTargetsForSelection(allTargets, rememberedTargetId);
|
|
155
|
+
const selectedId = await prompts.select(message, sorted.map((target) => ({
|
|
156
|
+
value: target.id,
|
|
157
|
+
label: targetLabel(target),
|
|
158
|
+
})), rememberedTargetId);
|
|
159
|
+
const selected = sorted.find((target) => target.id === selectedId);
|
|
160
|
+
if (!selected) {
|
|
161
|
+
throw new UserFacingError("Unable to resolve selected target.");
|
|
162
|
+
}
|
|
163
|
+
return selected;
|
|
164
|
+
}
|
|
165
|
+
async function resolveTarget(options, allTargets, rememberedTargetId, prompts) {
|
|
166
|
+
if (allTargets.length === 0) {
|
|
167
|
+
throw new UserFacingError("No available devices or simulators were found.");
|
|
168
|
+
}
|
|
169
|
+
if (options.device) {
|
|
170
|
+
const exactMatches = allTargets.filter((target) => target.name.toLowerCase() === options.device?.toLowerCase());
|
|
171
|
+
if (exactMatches.length === 1) {
|
|
172
|
+
return { target: exactMatches[0], source: "explicit" };
|
|
173
|
+
}
|
|
174
|
+
if (exactMatches.length > 1) {
|
|
175
|
+
const selected = await selectTargetInteractively(prompts, exactMatches, rememberedTargetId, "Multiple exact device matches found. Select target");
|
|
176
|
+
return { target: selected, source: "explicit" };
|
|
177
|
+
}
|
|
178
|
+
throw new UserFacingError(`No exact device/simulator match found for '${options.device}'.`, formatCandidateList(allTargets, targetLabel));
|
|
179
|
+
}
|
|
180
|
+
if (options.query) {
|
|
181
|
+
const decision = decideTargetFromQuery(options.query, allTargets);
|
|
182
|
+
if (!decision.requiresInteractive && decision.selected) {
|
|
183
|
+
return {
|
|
184
|
+
target: decision.selected,
|
|
185
|
+
source: "query",
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
if (!prompts.interactive) {
|
|
189
|
+
throw new UserFacingError(`Target query '${options.query}' requires interactive disambiguation.`, formatCandidateList(decision.ranked.map((item) => item.target), targetLabel));
|
|
190
|
+
}
|
|
191
|
+
const selected = await selectTargetInteractively(prompts, allTargets, rememberedTargetId, `Select target for '${options.query}'`);
|
|
192
|
+
return { target: selected, source: "interactive" };
|
|
193
|
+
}
|
|
194
|
+
const selected = await selectTargetInteractively(prompts, allTargets, rememberedTargetId);
|
|
195
|
+
return { target: selected, source: "interactive" };
|
|
196
|
+
}
|
|
197
|
+
export async function runSimplyBuild(options, deps = {}) {
|
|
198
|
+
const cwd = path.resolve(deps.cwd ?? process.cwd());
|
|
199
|
+
const prompts = deps.prompts ?? createPromptApi();
|
|
200
|
+
const stateStore = deps.stateStore ?? createStateStore();
|
|
201
|
+
const ensureXcodebuildmcpReadyFn = deps.ensureXcodebuildmcpReady ?? ensureXcodebuildmcpReady;
|
|
202
|
+
const discoverProjectsFn = deps.discoverProjects ?? discoverProjects;
|
|
203
|
+
const discoverSchemesFn = deps.discoverSchemes ?? discoverSchemes;
|
|
204
|
+
const discoverTargetsFn = deps.discoverTargets ?? discoverTargets;
|
|
205
|
+
const runSimulator = deps.runSimulatorPipeline ?? runSimulatorPipeline;
|
|
206
|
+
const runPhysical = deps.runPhysicalPipeline ?? runPhysicalPipeline;
|
|
207
|
+
await ensureXcodebuildmcpReadyFn(prompts, options.verbose);
|
|
208
|
+
if (options.listProjects) {
|
|
209
|
+
const projects = await discoverProjectsFn(cwd);
|
|
210
|
+
if (projects.length === 0) {
|
|
211
|
+
console.log("No Xcode projects/workspaces found.");
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
for (const project of projects) {
|
|
215
|
+
console.log(`${project.kind}: ${project.path}`);
|
|
216
|
+
}
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (options.listDevices) {
|
|
220
|
+
const targets = await discoverTargetsFn();
|
|
221
|
+
if (targets.length === 0) {
|
|
222
|
+
console.log("No available devices/simulators found.");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
for (const target of sortTargetsForSelection(targets)) {
|
|
226
|
+
console.log(`${targetLabel(target)} :: ${target.id}`);
|
|
227
|
+
}
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (!options.query && !options.device && !prompts.interactive) {
|
|
231
|
+
throw new UserFacingError("Interactive target selection requires a TTY.", ["Use `simplybuild --device \"Exact Name\"` or `simplybuild \"query\"` in non-interactive environments."]);
|
|
232
|
+
}
|
|
233
|
+
prompts.intro("simplybuild");
|
|
234
|
+
try {
|
|
235
|
+
const candidates = await resolveProjectCandidates(cwd, prompts, discoverProjectsFn);
|
|
236
|
+
const rememberedContainerPath = await resolveRememberedContainerPath(candidates, stateStore);
|
|
237
|
+
const selectedContainer = await pickProject(candidates, prompts, rememberedContainerPath);
|
|
238
|
+
const projectKey = projectKeyFromContainer(selectedContainer);
|
|
239
|
+
const projectMemory = await stateStore.getProjectMemory(projectKey);
|
|
240
|
+
const scheme = await resolveScheme(selectedContainer, options.scheme, projectMemory?.lastScheme, prompts, discoverSchemesFn);
|
|
241
|
+
const allTargets = await discoverTargetsFn();
|
|
242
|
+
const { target } = await resolveTarget(options, allTargets, projectMemory?.lastTarget?.id, prompts);
|
|
243
|
+
if (target.kind === "physical") {
|
|
244
|
+
const isApproved = await stateStore.isPhysicalDeviceApproved(projectKey, target.id);
|
|
245
|
+
if (!isApproved) {
|
|
246
|
+
if (!prompts.interactive) {
|
|
247
|
+
throw new UserFacingError(`First physical deployment to ${target.name} requires confirmation in an interactive terminal.`);
|
|
248
|
+
}
|
|
249
|
+
const approved = await prompts.confirm(`First deploy to ${target.name} for this project. Continue?`, true);
|
|
250
|
+
if (!approved) {
|
|
251
|
+
throw new UserCancelledError("Physical deployment not approved.");
|
|
252
|
+
}
|
|
253
|
+
await stateStore.markPhysicalDeviceApproved(projectKey, target.id);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const context = {
|
|
257
|
+
container: selectedContainer,
|
|
258
|
+
scheme,
|
|
259
|
+
target,
|
|
260
|
+
verbose: options.verbose,
|
|
261
|
+
};
|
|
262
|
+
if (target.kind === "simulator") {
|
|
263
|
+
await runSimulator(context, prompts);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
await runPhysical(context, prompts);
|
|
267
|
+
}
|
|
268
|
+
await stateStore.setProjectContext(projectKey, {
|
|
269
|
+
containerPath: selectedContainer.path,
|
|
270
|
+
containerKind: selectedContainer.kind,
|
|
271
|
+
scheme,
|
|
272
|
+
target: {
|
|
273
|
+
kind: target.kind,
|
|
274
|
+
id: target.id,
|
|
275
|
+
name: target.name,
|
|
276
|
+
},
|
|
277
|
+
});
|
|
278
|
+
prompts.outro(`Build and launch complete: ${scheme} -> ${target.name}`);
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
if (error instanceof UserCancelledError) {
|
|
282
|
+
throw error;
|
|
283
|
+
}
|
|
284
|
+
throw error;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=runSimplyBuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runSimplyBuild.js","sourceRoot":"","sources":["../../src/app/runSimplyBuild.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runSimplyBuild } from "./app/runSimplyBuild.js";
|
|
3
|
+
import { UserCancelledError, UserFacingError } from "./types.js";
|
|
4
|
+
const HELP_TEXT = `simplybuild - Smart iOS build/deploy wrapper for xcodebuildmcp
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
simplybuild --help
|
|
8
|
+
sb --help
|
|
9
|
+
simplybuild --device "iPhone 15"
|
|
10
|
+
simplybuild --scheme MyApp
|
|
11
|
+
simplybuild --list-devices
|
|
12
|
+
simplybuild --list-projects
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
--device <name> Exact target name match (case-insensitive)
|
|
16
|
+
--scheme <scheme> Explicit Xcode scheme
|
|
17
|
+
--list-devices List available physical devices and simulators
|
|
18
|
+
--list-projects List discovered .xcodeproj/.xcworkspace in current directory tree
|
|
19
|
+
--verbose Stream underlying command output
|
|
20
|
+
--help, -h Show this help
|
|
21
|
+
`;
|
|
22
|
+
function requireValue(flag, argv, index) {
|
|
23
|
+
const value = argv[index + 1];
|
|
24
|
+
if (!value || value.startsWith("-")) {
|
|
25
|
+
throw new UserFacingError(`Missing value for ${flag}`);
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
function parseCliOptions(argv) {
|
|
30
|
+
const options = {
|
|
31
|
+
listDevices: false,
|
|
32
|
+
listProjects: false,
|
|
33
|
+
verbose: false,
|
|
34
|
+
help: false,
|
|
35
|
+
};
|
|
36
|
+
if (argv.length === 0) {
|
|
37
|
+
options.help = true;
|
|
38
|
+
return { options };
|
|
39
|
+
}
|
|
40
|
+
const positional = [];
|
|
41
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
42
|
+
const arg = argv[i];
|
|
43
|
+
switch (arg) {
|
|
44
|
+
case "--help":
|
|
45
|
+
case "--h":
|
|
46
|
+
case "-h":
|
|
47
|
+
options.help = true;
|
|
48
|
+
break;
|
|
49
|
+
case "--verbose":
|
|
50
|
+
options.verbose = true;
|
|
51
|
+
break;
|
|
52
|
+
case "--list-devices":
|
|
53
|
+
options.listDevices = true;
|
|
54
|
+
break;
|
|
55
|
+
case "--list-projects":
|
|
56
|
+
options.listProjects = true;
|
|
57
|
+
break;
|
|
58
|
+
case "--device":
|
|
59
|
+
options.device = requireValue("--device", argv, i);
|
|
60
|
+
i += 1;
|
|
61
|
+
break;
|
|
62
|
+
case "--scheme":
|
|
63
|
+
options.scheme = requireValue("--scheme", argv, i);
|
|
64
|
+
i += 1;
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
if (arg.startsWith("-")) {
|
|
68
|
+
return {
|
|
69
|
+
options: {
|
|
70
|
+
...options,
|
|
71
|
+
help: true,
|
|
72
|
+
},
|
|
73
|
+
parseError: arg === "--watch"
|
|
74
|
+
? "--watch is intentionally not implemented in simplybuild v1."
|
|
75
|
+
: `Unknown option: ${arg}`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
positional.push(arg);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const isHelpAlias = positional.length === 1 &&
|
|
83
|
+
positional[0].toLowerCase() === "help" &&
|
|
84
|
+
!options.device &&
|
|
85
|
+
!options.scheme &&
|
|
86
|
+
!options.listDevices &&
|
|
87
|
+
!options.listProjects;
|
|
88
|
+
if (isHelpAlias) {
|
|
89
|
+
options.help = true;
|
|
90
|
+
return { options };
|
|
91
|
+
}
|
|
92
|
+
if (positional.length > 0) {
|
|
93
|
+
return {
|
|
94
|
+
options: {
|
|
95
|
+
...options,
|
|
96
|
+
help: true,
|
|
97
|
+
},
|
|
98
|
+
parseError: `Unknown command: ${positional.join(" ")}`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (options.listDevices && options.listProjects) {
|
|
102
|
+
return {
|
|
103
|
+
options: {
|
|
104
|
+
...options,
|
|
105
|
+
help: true,
|
|
106
|
+
},
|
|
107
|
+
parseError: "Use either --list-devices or --list-projects, not both.",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return { options };
|
|
111
|
+
}
|
|
112
|
+
async function main() {
|
|
113
|
+
const argv = process.argv.slice(2);
|
|
114
|
+
const { options, parseError } = parseCliOptions(argv);
|
|
115
|
+
if (options.help) {
|
|
116
|
+
if (parseError) {
|
|
117
|
+
console.error(`Error: ${parseError}`);
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
}
|
|
120
|
+
console.log(HELP_TEXT);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
await runSimplyBuild(options);
|
|
124
|
+
}
|
|
125
|
+
main().catch((error) => {
|
|
126
|
+
if (error instanceof UserCancelledError) {
|
|
127
|
+
process.exitCode = 130;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (error instanceof UserFacingError) {
|
|
131
|
+
console.error(`Error: ${error.message}`);
|
|
132
|
+
for (const detail of error.details ?? []) {
|
|
133
|
+
console.error(detail);
|
|
134
|
+
}
|
|
135
|
+
process.exitCode = 1;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (error instanceof Error) {
|
|
139
|
+
console.error(error.message);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.error(String(error));
|
|
143
|
+
}
|
|
144
|
+
process.exitCode = 1;
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAElF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;CAiBjB,CAAC;AAOF,SAAS,YAAY,CAAC,IAAY,EAAE,IAAc,EAAE,KAAa;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,eAAe,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAc;IACrC,MAAM,OAAO,GAAe;QAC1B,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,KAAK;QACnB,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,KAAK,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,KAAK,gBAAgB;gBACnB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,MAAM;YACR,KAAK,iBAAiB;gBACpB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACnD,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACnD,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR;gBACE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE;4BACP,GAAG,OAAO;4BACV,IAAI,EAAE,IAAI;yBACX;wBACD,UAAU,EACR,GAAG,KAAK,SAAS;4BACf,CAAC,CAAC,6DAA6D;4BAC/D,CAAC,CAAC,mBAAmB,GAAG,EAAE;qBAC/B,CAAC;gBACJ,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,MAAM;QACV,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GACf,UAAU,CAAC,MAAM,KAAK,CAAC;QACvB,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM;QACtC,CAAC,OAAO,CAAC,MAAM;QACf,CAAC,OAAO,CAAC,MAAM;QACf,CAAC,OAAO,CAAC,WAAW;QACpB,CAAC,OAAO,CAAC,YAAY,CAAC;IAExB,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,IAAI,EAAE,IAAI;aACX;YACD,UAAU,EAAE,oBAAoB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;SACvD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO;YACL,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,IAAI,EAAE,IAAI;aACX;YACD,UAAU,EAAE,yDAAyD;SACtE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEtD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const SKIP_DIRS = new Set([".git", "node_modules", "Pods", "DerivedData", "build"]);
|
|
4
|
+
async function scanDirectory(root, current, acc) {
|
|
5
|
+
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
6
|
+
for (const entry of entries) {
|
|
7
|
+
if (!entry.isDirectory()) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
if (entry.isSymbolicLink()) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (SKIP_DIRS.has(entry.name)) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const fullPath = path.join(current, entry.name);
|
|
17
|
+
const relative = path.relative(root, fullPath);
|
|
18
|
+
if (relative.startsWith("..")) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (entry.name.endsWith(".xcworkspace")) {
|
|
22
|
+
acc.push({
|
|
23
|
+
kind: "workspace",
|
|
24
|
+
path: fullPath,
|
|
25
|
+
name: entry.name.replace(/\.xcworkspace$/, ""),
|
|
26
|
+
});
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (entry.name.endsWith(".xcodeproj")) {
|
|
30
|
+
acc.push({
|
|
31
|
+
kind: "project",
|
|
32
|
+
path: fullPath,
|
|
33
|
+
name: entry.name.replace(/\.xcodeproj$/, ""),
|
|
34
|
+
});
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
await scanDirectory(root, fullPath, acc);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function discoverProjects(scanRoot) {
|
|
41
|
+
const root = path.resolve(scanRoot);
|
|
42
|
+
const results = [];
|
|
43
|
+
await scanDirectory(root, root, results);
|
|
44
|
+
return results.sort((a, b) => {
|
|
45
|
+
if (a.kind !== b.kind) {
|
|
46
|
+
return a.kind === "workspace" ? -1 : 1;
|
|
47
|
+
}
|
|
48
|
+
return a.path.localeCompare(b.path);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/discovery/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpF,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe,EAAE,GAAuB;IACjF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;aAC/C,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;aAC7C,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAEzC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
|