@donna-orchestrator/bridge 0.2.21
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 +45 -0
- package/dist/cli.js +301 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +98 -0
- package/dist/config.js.map +1 -0
- package/dist/executor.js +150 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.js +248 -0
- package/dist/index.js.map +1 -0
- package/dist/install.js +194 -0
- package/dist/install.js.map +1 -0
- package/dist/launchd.js +146 -0
- package/dist/launchd.js.map +1 -0
- package/dist/lifecycle.js +228 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/pair.js +88 -0
- package/dist/pair.js.map +1 -0
- package/dist/preflight.js +117 -0
- package/dist/preflight.js.map +1 -0
- package/dist/scope-guard.js +25 -0
- package/dist/scope-guard.js.map +1 -0
- package/dist/stream-parser.js +116 -0
- package/dist/stream-parser.js.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/uninstall.js +172 -0
- package/dist/uninstall.js.map +1 -0
- package/dist/workspace.js +362 -0
- package/dist/workspace.js.map +1 -0
- package/dist/xcode-probe.js +272 -0
- package/dist/xcode-probe.js.map +1 -0
- package/package.json +26 -0
- package/templates/launchagent-bridge.plist.template +28 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Xcode + simulator + swift probe (#295).
|
|
3
|
+
*
|
|
4
|
+
* Discovers installed `/Applications/Xcode*.app` bundles, validates each via
|
|
5
|
+
* `xcodebuild -version`, enumerates iOS / watchOS / tvOS / visionOS runtimes
|
|
6
|
+
* from `xcrun simctl list runtimes`, and probes the `swift` compiler. Emits
|
|
7
|
+
* the result to `~/.donna-bridge/tool-report.json` so the bridge can re-load
|
|
8
|
+
* the latest report on each connect and the orchestrator can surface "what
|
|
9
|
+
* does this Mac actually have" in its dashboard.
|
|
10
|
+
*
|
|
11
|
+
* Schema mirrors `runner/native/tools.ts` / #278 — each tool maps to either
|
|
12
|
+
* a missing-tool stub or a `{ installed: true, version, path? }` block. We
|
|
13
|
+
* additionally enumerate the Xcode bundles list because the bridge has to
|
|
14
|
+
* choose one (the runner uses the system `xcode-select -p` pointer; the
|
|
15
|
+
* bridge maintains its own pointer per the spec).
|
|
16
|
+
*/
|
|
17
|
+
import { execFile } from 'node:child_process';
|
|
18
|
+
import fs from 'node:fs';
|
|
19
|
+
import path from 'node:path';
|
|
20
|
+
import { getToolReportPath, getConfigDir } from './config.js';
|
|
21
|
+
const PROBE_TIMEOUT_MS = 5_000;
|
|
22
|
+
const APPLICATIONS_DIR = '/Applications';
|
|
23
|
+
function execFileP(bin, args, env) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
execFile(bin, args, {
|
|
26
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
27
|
+
encoding: 'utf-8',
|
|
28
|
+
env: env ?? process.env,
|
|
29
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
30
|
+
}, (err, stdout, stderr) => {
|
|
31
|
+
if (err) {
|
|
32
|
+
reject(err);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
resolve({ stdout: stdout ?? '', stderr: stderr ?? '' });
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run a version-style probe. On any failure returns `{ installed: false }`
|
|
41
|
+
* with the error message captured for the report. Never throws.
|
|
42
|
+
*/
|
|
43
|
+
async function probeVersion(bin, args) {
|
|
44
|
+
try {
|
|
45
|
+
const { stdout, stderr } = await execFileP(bin, args);
|
|
46
|
+
const raw = (stdout || stderr || '').trim();
|
|
47
|
+
const version = parseVersion(raw);
|
|
48
|
+
return { installed: true, version, path: bin };
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return {
|
|
52
|
+
installed: false,
|
|
53
|
+
error: err instanceof Error ? err.message : String(err),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Pull the first dotted-numeric version token from raw output. */
|
|
58
|
+
export function parseVersion(raw) {
|
|
59
|
+
if (!raw)
|
|
60
|
+
return undefined;
|
|
61
|
+
const firstLine = raw.split('\n')[0]?.trim() ?? '';
|
|
62
|
+
const m = firstLine.match(/(\d+\.\d+(?:\.\d+)?(?:[-+][\w.]+)?)/);
|
|
63
|
+
return m ? m[1] : firstLine || undefined;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse `xcodebuild -version` output. Format:
|
|
67
|
+
* Xcode 16.2
|
|
68
|
+
* Build version 16C5032a
|
|
69
|
+
*/
|
|
70
|
+
export function parseXcodebuildVersion(raw) {
|
|
71
|
+
const versionMatch = raw.match(/Xcode\s+(\d+(?:\.\d+)+)/i);
|
|
72
|
+
const buildMatch = raw.match(/Build version\s+([A-Za-z0-9]+)/i);
|
|
73
|
+
return {
|
|
74
|
+
version: versionMatch ? versionMatch[1] : undefined,
|
|
75
|
+
build: buildMatch ? buildMatch[1] : undefined,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse `xcrun simctl list runtimes --json` output. Returns runtimes where
|
|
80
|
+
* `isAvailable === true`. Pure function so the test can drive it without
|
|
81
|
+
* shelling out.
|
|
82
|
+
*/
|
|
83
|
+
export function parseSimctlRuntimes(raw) {
|
|
84
|
+
let parsed;
|
|
85
|
+
try {
|
|
86
|
+
parsed = JSON.parse(raw);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
if (!Array.isArray(parsed.runtimes))
|
|
92
|
+
return [];
|
|
93
|
+
const out = [];
|
|
94
|
+
for (const entry of parsed.runtimes) {
|
|
95
|
+
if (!entry || typeof entry !== 'object')
|
|
96
|
+
continue;
|
|
97
|
+
const e = entry;
|
|
98
|
+
if (e.isAvailable === false)
|
|
99
|
+
continue;
|
|
100
|
+
const identifier = typeof e.identifier === 'string' ? e.identifier : '';
|
|
101
|
+
if (!identifier)
|
|
102
|
+
continue;
|
|
103
|
+
// identifier looks like `com.apple.CoreSimulator.SimRuntime.iOS-18-2`
|
|
104
|
+
const m = identifier.match(/SimRuntime\.([A-Za-z]+)-(\d+(?:-\d+)*)/);
|
|
105
|
+
let platform = e.platform ?? (m ? m[1] : 'unknown');
|
|
106
|
+
let version = e.version ?? (m ? m[2].replace(/-/g, '.') : '');
|
|
107
|
+
if (!version && typeof e.name === 'string') {
|
|
108
|
+
const nm = e.name.match(/(\d+(?:\.\d+)+)/);
|
|
109
|
+
if (nm)
|
|
110
|
+
version = nm[1];
|
|
111
|
+
}
|
|
112
|
+
if (!version)
|
|
113
|
+
continue;
|
|
114
|
+
out.push({ platform, version, identifier });
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* List `/Applications/Xcode*.app` bundles. Validates each via
|
|
120
|
+
* `xcodebuild -version` with `DEVELOPER_DIR` pointing at the bundle's
|
|
121
|
+
* Developer dir — a bundle whose xcodebuild can't run is reported with no
|
|
122
|
+
* version so callers can still surface it as "installed but broken".
|
|
123
|
+
*
|
|
124
|
+
* `applicationsDir` is overridable so tests can drive the parsing without
|
|
125
|
+
* touching the real `/Applications` directory.
|
|
126
|
+
*/
|
|
127
|
+
export async function listXcodeBundles(applicationsDir = APPLICATIONS_DIR) {
|
|
128
|
+
let entries;
|
|
129
|
+
try {
|
|
130
|
+
entries = await fs.promises.readdir(applicationsDir);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
const candidates = entries
|
|
136
|
+
.filter((name) => /^Xcode.*\.app$/i.test(name))
|
|
137
|
+
.map((name) => path.join(applicationsDir, name));
|
|
138
|
+
const out = [];
|
|
139
|
+
for (const bundlePath of candidates) {
|
|
140
|
+
const developerDir = path.join(bundlePath, 'Contents', 'Developer');
|
|
141
|
+
let version;
|
|
142
|
+
let build;
|
|
143
|
+
try {
|
|
144
|
+
const { stdout } = await execFileP('xcodebuild', ['-version'], {
|
|
145
|
+
...process.env,
|
|
146
|
+
DEVELOPER_DIR: developerDir,
|
|
147
|
+
});
|
|
148
|
+
const parsed = parseXcodebuildVersion(stdout);
|
|
149
|
+
version = parsed.version;
|
|
150
|
+
build = parsed.build;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Bundle exists but xcodebuild won't run from it — still report it so
|
|
154
|
+
// `donna-bridge xcode select` can show the bundle in the list.
|
|
155
|
+
}
|
|
156
|
+
out.push({ path: bundlePath, developerDir, version, build });
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Probe simctl runtimes against a specific Developer dir. `xcrun` requires
|
|
162
|
+
* `DEVELOPER_DIR` to resolve simctl when the system pointer is unset.
|
|
163
|
+
*/
|
|
164
|
+
export async function probeSimulatorRuntimes(developerDir) {
|
|
165
|
+
const env = developerDir ? { ...process.env, DEVELOPER_DIR: developerDir } : undefined;
|
|
166
|
+
try {
|
|
167
|
+
const { stdout } = await execFileP('xcrun', ['simctl', 'list', 'runtimes', '--json'], env);
|
|
168
|
+
return parseSimctlRuntimes(stdout);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Run the full probe, write the report to disk, and return it. Pure-ish: it
|
|
176
|
+
* shells out a lot but never throws — every probe failure surfaces as a
|
|
177
|
+
* stubbed `installed: false` entry.
|
|
178
|
+
*
|
|
179
|
+
* `opts.applicationsDir` is overridable for tests.
|
|
180
|
+
* `opts.developerDir` (when supplied) is used to resolve `xcrun simctl`.
|
|
181
|
+
*/
|
|
182
|
+
export async function runXcodeProbe(opts = {}) {
|
|
183
|
+
const xcodeBundles = await listXcodeBundles(opts.applicationsDir);
|
|
184
|
+
// For the simctl probe, prefer an explicitly-passed Developer dir, then the
|
|
185
|
+
// first probed Xcode bundle's dir (so `xcrun simctl` doesn't trip over a
|
|
186
|
+
// missing CommandLineTools pointer). If neither, simctl falls through to
|
|
187
|
+
// the user's system default.
|
|
188
|
+
const developerDir = opts.developerDir ?? xcodeBundles.find((b) => b.version)?.developerDir;
|
|
189
|
+
const simulatorRuntimes = await probeSimulatorRuntimes(developerDir);
|
|
190
|
+
const [claude, xcodebuild, swift, git, node] = await Promise.all([
|
|
191
|
+
probeVersion('claude', ['--version']),
|
|
192
|
+
probeVersion('xcodebuild', ['-version']),
|
|
193
|
+
probeVersion('swift', ['--version']),
|
|
194
|
+
probeVersion('git', ['--version']),
|
|
195
|
+
probeVersion(process.execPath, ['--version']),
|
|
196
|
+
]);
|
|
197
|
+
const report = {
|
|
198
|
+
generatedAt: new Date().toISOString(),
|
|
199
|
+
xcodeBundles,
|
|
200
|
+
simulatorRuntimes,
|
|
201
|
+
tools: { claude, xcodebuild, swift, git, node },
|
|
202
|
+
};
|
|
203
|
+
if (!opts.skipWrite) {
|
|
204
|
+
writeToolReport(report);
|
|
205
|
+
}
|
|
206
|
+
return report;
|
|
207
|
+
}
|
|
208
|
+
/** Persist a tool report to `~/.donna-bridge/tool-report.json`. */
|
|
209
|
+
export function writeToolReport(report) {
|
|
210
|
+
const dir = getConfigDir();
|
|
211
|
+
if (!fs.existsSync(dir)) {
|
|
212
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
213
|
+
}
|
|
214
|
+
fs.writeFileSync(getToolReportPath(), JSON.stringify(report, null, 2), { mode: 0o600 });
|
|
215
|
+
}
|
|
216
|
+
/** Load the most recent tool report. Returns null when none exists. */
|
|
217
|
+
export function readToolReport() {
|
|
218
|
+
const file = getToolReportPath();
|
|
219
|
+
if (!fs.existsSync(file))
|
|
220
|
+
return null;
|
|
221
|
+
try {
|
|
222
|
+
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Build the `capabilities.tools` map advertised in `runner:hello`. Mirrors
|
|
230
|
+
* `probesToCapabilityTools` in `runner/native/tools.ts` so the orchestrator's
|
|
231
|
+
* matcher sees a consistent shape. The simulator entries are exposed as
|
|
232
|
+
* `ios_simulator` / `watchos_simulator` / etc. keys for `required_tools`
|
|
233
|
+
* matching (#293).
|
|
234
|
+
*/
|
|
235
|
+
export function reportToCapabilityTools(report) {
|
|
236
|
+
const tools = {};
|
|
237
|
+
if (report.tools.claude.installed)
|
|
238
|
+
tools.claude_cli = report.tools.claude.version ?? '';
|
|
239
|
+
if (report.tools.xcodebuild.installed)
|
|
240
|
+
tools.xcode = report.tools.xcodebuild.version ?? '';
|
|
241
|
+
if (report.tools.swift.installed)
|
|
242
|
+
tools.swift = report.tools.swift.version ?? '';
|
|
243
|
+
if (report.tools.git.installed)
|
|
244
|
+
tools.git = report.tools.git.version ?? '';
|
|
245
|
+
if (report.tools.node.installed)
|
|
246
|
+
tools.node = report.tools.node.version ?? '';
|
|
247
|
+
// Pick the highest version per simulator platform.
|
|
248
|
+
const bestPerPlatform = new Map();
|
|
249
|
+
for (const rt of report.simulatorRuntimes) {
|
|
250
|
+
const key = `${rt.platform.toLowerCase()}_simulator`;
|
|
251
|
+
const prev = bestPerPlatform.get(key);
|
|
252
|
+
if (!prev || compareVersions(rt.version, prev) > 0) {
|
|
253
|
+
bestPerPlatform.set(key, rt.version);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
for (const [k, v] of bestPerPlatform)
|
|
257
|
+
tools[k] = v;
|
|
258
|
+
return tools;
|
|
259
|
+
}
|
|
260
|
+
function compareVersions(a, b) {
|
|
261
|
+
const pa = a.split('.').map((n) => parseInt(n, 10) || 0);
|
|
262
|
+
const pb = b.split('.').map((n) => parseInt(n, 10) || 0);
|
|
263
|
+
const len = Math.max(pa.length, pb.length);
|
|
264
|
+
for (let i = 0; i < len; i++) {
|
|
265
|
+
const x = pa[i] ?? 0;
|
|
266
|
+
const y = pb[i] ?? 0;
|
|
267
|
+
if (x !== y)
|
|
268
|
+
return x - y;
|
|
269
|
+
}
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=xcode-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode-probe.js","sourceRoot":"","sources":["../xcode-probe.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@donna-orchestrator/bridge",
|
|
3
|
+
"version": "0.2.21",
|
|
4
|
+
"description": "Apple Platform Bridge — runtime + CLI that connects a developer Mac to a Donna orchestrator and executes Apple-platform stages (Xcode / Swift) only. Refuses non-Apple dispatches with runner:scope_violation.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"donna-bridge": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=22"
|
|
11
|
+
},
|
|
12
|
+
"os": [
|
|
13
|
+
"darwin"
|
|
14
|
+
],
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/",
|
|
17
|
+
"templates/",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"ws": "^8.18.0"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>Label</key>
|
|
6
|
+
<string>{{LABEL}}</string>
|
|
7
|
+
<key>ProgramArguments</key>
|
|
8
|
+
<array>
|
|
9
|
+
<string>{{PROGRAM}}</string>
|
|
10
|
+
{{PROGRAM_ARGS}}
|
|
11
|
+
</array>
|
|
12
|
+
<key>EnvironmentVariables</key>
|
|
13
|
+
<dict>
|
|
14
|
+
{{ENV_VARS}}
|
|
15
|
+
</dict>
|
|
16
|
+
<key>RunAtLoad</key>
|
|
17
|
+
<true/>
|
|
18
|
+
<key>KeepAlive</key>
|
|
19
|
+
<dict>
|
|
20
|
+
<key>SuccessfulExit</key>
|
|
21
|
+
<false/>
|
|
22
|
+
</dict>
|
|
23
|
+
<key>StandardOutPath</key>
|
|
24
|
+
<string>{{STDOUT_PATH}}</string>
|
|
25
|
+
<key>StandardErrorPath</key>
|
|
26
|
+
<string>{{STDERR_PATH}}</string>
|
|
27
|
+
</dict>
|
|
28
|
+
</plist>
|