@nomac/cli 0.13.2 → 0.13.3
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/package.json +2 -2
- package/skill/SKILL.md +17 -9
- package/src/mcp.mjs +8 -7
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nomac/cli",
|
|
3
|
-
"version": "0.13.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.13.3",
|
|
4
|
+
"description": "A real cloud Mac for AI agents: Xcode, the iOS Simulator, signing, TestFlight and App Store publishing, by the minute, over MCP, SSH and HTTPS.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
package/skill/SKILL.md
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: nomac
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
A real cloud Mac for agents on Linux, Windows or a sandbox: build, run and
|
|
5
|
+
test iOS and macOS apps with Xcode and the iOS Simulator (simulator-use),
|
|
6
|
+
sign, send to TestFlight and publish. Fully enabled for the agent, $0.80 an
|
|
7
|
+
hour by the minute, over SSH, HTTPS or MCP.
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
# nomac: a Mac for your agent
|
|
10
11
|
|
|
11
|
-
NoMac
|
|
12
|
-
|
|
12
|
+
NoMac gives your agent a full macOS VM that is entirely its own: administrator,
|
|
13
|
+
no prompts, nothing blocked, with Xcode and the iOS Simulator. You choose the
|
|
14
|
+
commands and tools. Mac time is prepaid credit.
|
|
13
15
|
|
|
14
16
|
## Cloud Mac setup and workflow
|
|
15
17
|
|
|
@@ -49,7 +51,9 @@ Simulator. You choose the commands and tools. Mac time is prepaid credit.
|
|
|
49
51
|
The CLI keeps the project on the account's drive, in `~/drive/src/<folder
|
|
50
52
|
name>`, which is kept between sessions; stopping deletes everything else on
|
|
51
53
|
the Mac, logs included. Download what you need from outside `~/drive` before
|
|
52
|
-
stopping.
|
|
54
|
+
stopping. Keep the drive under 10 GB: a Mac that does not hold it yet downloads
|
|
55
|
+
all of it before it boots; `nomac-drive` on the Mac shows what takes the space,
|
|
56
|
+
and `nomac-drive clean` deletes stale build products. SSH disconnects
|
|
53
57
|
do not stop the session. Ready time includes idle time; queue/setup are free.
|
|
54
58
|
A Mac stops at its time limit (2 hours unless `nomac start --max-duration`
|
|
55
59
|
set another), its spend cap, when credit runs out, or when idle; a build left
|
|
@@ -83,10 +87,14 @@ MP4 and prints a share link); MCP `start_mac_recording`, `stop_mac_recording`.
|
|
|
83
87
|
Commands drive any app with AppleScript without a permission prompt. For real
|
|
84
88
|
keyboard and mouse, also on the lock screen and in password dialogs, use
|
|
85
89
|
`nomac input type TEXT`, `nomac input click X Y`, `nomac unlock` (MCP
|
|
86
|
-
`mac_input`): each answers with a screenshot. Drive the Simulator with
|
|
87
|
-
|
|
90
|
+
`mac_input`): each answers with a screenshot. Drive the Simulator with
|
|
91
|
+
simulator-use, preinstalled: `simulator-use look` reads the screen as text,
|
|
92
|
+
`simulator-use act 'tap "Sign In"'` taps and types by label, `simulator-use run`
|
|
93
|
+
builds, installs and launches (simctl works too). Give the human
|
|
94
|
+
`open_mac_desktop` when they want to see the screen.
|
|
88
95
|
`get_mac_session` (and `nomac status --json`) lists what
|
|
89
|
-
is installed: Ruby with CocoaPods, xcbeautify, xcodegen,
|
|
96
|
+
is installed: Node, Python, uv, nvm, Ruby with CocoaPods, xcbeautify, xcodegen,
|
|
97
|
+
gh, Git LFS, jq and simulator-use.
|
|
90
98
|
Pipe xcodebuild through `xcbeautify`. Simulator devices share names across iOS
|
|
91
99
|
runtimes: pick one by ID (`xcrun simctl list devices available`) or with
|
|
92
100
|
`OS=27.0` in `-destination`. Apple Intelligence cannot generate on a virtual
|
package/src/mcp.mjs
CHANGED
|
@@ -21,7 +21,8 @@ const INSTRUCTIONS = [
|
|
|
21
21
|
"NoMac gives you a cloud Mac with Xcode, billed from prepaid credit ($0.80 an hour, by the minute).",
|
|
22
22
|
"Use it when work needs macOS that this machine does not have (Windows, Linux or a cloud sandbox): building, running or testing an iOS, iPadOS, watchOS, visionOS or macOS app (Swift, SwiftUI, React Native, Expo, Flutter, Capacitor), the iOS Simulator, Xcode, code signing, TestFlight or App Store submission.",
|
|
23
23
|
"Typical flow: get_mac_credits, start_mac, poll get_mac_session until ready, put code there (exec_mac with git clone into ~/drive/src, write_mac_file, fetch_to_mac, create_mac_upload_link), run exec_mac, get results with read_mac_file or create_mac_download_link, then stop_mac.",
|
|
24
|
-
"The account's drive at ~/drive (20 GB) is on every Mac and kept between sessions; everything outside it is deleted at stop. Clone and build in ~/drive/src/<repo>, so the next session rebuilds only what changed.",
|
|
24
|
+
"The account's drive at ~/drive (20 GB) is on every Mac and kept between sessions; everything outside it is deleted at stop. Clone and build in ~/drive/src/<repo>, so the next session rebuilds only what changed. Keep it under 10 GB: a Mac that does not hold it yet downloads all of it before it boots; nomac-drive on the Mac shows what takes the space, and nomac-drive clean deletes stale build products.",
|
|
25
|
+
"For the iOS Simulator, simulator-use is on the Mac (run it with exec_mac): simulator-use look reads the screen as text, simulator-use act 'tap \"Sign In\"' taps and types by label, and simulator-use run builds, installs and launches the app; ~/NOMAC.md has the rest.",
|
|
25
26
|
"When an answer says low_credit (under an hour of Mac time left), tell the human before a long build and offer its buy_url: a Mac stops when the credit runs out. For a refill, suggest 3 packs ($30, +5%).",
|
|
26
27
|
"One Mac runs per account at a time: start_mac while one runs answers session_limit_reached with its id, to use. For work that needs two at once, start_mac with parallel: true starts a second (accounts that bought credit, while NoMac has a Mac to spare); it runs without the drive.",
|
|
27
28
|
"exec_mac returns a quick command's output in the same call; pass wait_seconds: 50 for builds and tests. A command still running comes back as a job: poll get_mac_job with its job_id, then read_mac_output.",
|
|
@@ -402,18 +403,18 @@ export const TOOLS = [
|
|
|
402
403
|
},
|
|
403
404
|
];
|
|
404
405
|
|
|
405
|
-
/**
|
|
406
|
-
const
|
|
406
|
+
/** The Builder's own tools: its plans are closed, so they are listed only for accounts that still have one. */
|
|
407
|
+
const BUILDER_TOOLS = new Set(["check_project", "get_billing_status", "get_refund_status", "push_project", "build", "status", "get_failure"]);
|
|
407
408
|
let subscriber;
|
|
408
409
|
|
|
409
410
|
/**
|
|
410
|
-
*
|
|
411
|
-
*
|
|
412
|
-
* when called, so existing subscribers' agents keep working.
|
|
411
|
+
* Everyone gets the Mac, App Store and support tools (publish follows send_to_testflight for
|
|
412
|
+
* every account); the Builder's own tools are listed only for its remaining subscribers.
|
|
413
|
+
* Hidden tools still answer when called, so existing subscribers' agents keep working.
|
|
413
414
|
*/
|
|
414
415
|
export async function listedTools(isSubscriber = () => (subscriber ??= api("GET", "/api/v1/billing/status").then(s => Boolean(s?.tier) && s.tier !== "none", () => false))) {
|
|
415
416
|
const legacy = await isSubscriber();
|
|
416
|
-
return TOOLS.filter(t => legacy ||
|
|
417
|
+
return TOOLS.filter(t => legacy || !BUILDER_TOOLS.has(t.name));
|
|
417
418
|
}
|
|
418
419
|
|
|
419
420
|
export async function runMcpServer() {
|