@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nomac/cli",
3
- "version": "0.13.2",
4
- "description": "Cloud Mac sessions over SSH and HTTPS, plus iOS builds and publishing — built for agents.",
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
- Use a full cloud Mac over SSH, HTTPS or MCP for macOS tools, Xcode and iOS
5
- development. Start sessions, sync files, run commands, retrieve work and
6
- stop.
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 provides a full macOS VM with administrator access, Xcode and the iOS
12
- Simulator. You choose the commands and tools. Mac time is prepaid credit.
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. SSH disconnects
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 simctl,
87
- and give the human `open_mac_desktop` when they want to see the screen.
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, gh, Git LFS, jq.
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
- /** Shown to everyone: the Mac tools and support. The rest serve Builder subscribers. */
406
- const PUBLIC_TOOLS = new Set([...MAC_TOOLS.map(t => t.name), "report_issue"]);
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
- * The Builder (publishing) plans are closed to new subscriptions, so their tools
411
- * are listed only for accounts that still have one. Hidden tools still answer
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 || PUBLIC_TOOLS.has(t.name));
417
+ return TOOLS.filter(t => legacy || !BUILDER_TOOLS.has(t.name));
417
418
  }
418
419
 
419
420
  export async function runMcpServer() {