From 4a1ff582e945acff00fae66431af2ec2450cb712 Mon Sep 17 00:00:00 2001 From: Ikki Nishihara Date: Wed, 4 Nov 2026 06:44:59 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20macOS=E3=82=A2=E3=83=97=E3=83=AA?= =?UTF-8?q?=E3=81=ABCLI=E3=82=92=E5=90=8C=E6=A2=B1=20(#690)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haranishi <223786623+haranishi@users.noreply.github.com> --- README.md | 2 +- ROADMAP.md | 2 ++ docs/mcp.md | 17 +++++++++++++++-- packaging/macos/package.sh | 6 ++++-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 33b59cdb4..92dcae7bf 100644 --- a/README.md +++ b/README.md @@ -280,7 +280,7 @@ Installers and executables are code-signed. | Build | File | Notes | |---|---|---| -| App, universal (Apple silicon + Intel) | `designcraft--macos-universal.dmg` | Signed and notarized | +| App and bundled CLI, universal (Apple silicon + Intel) | `designcraft--macos-universal.dmg` | Signed and notarized | | Command-line tool, universal | `designcraft-cli--macos-universal.zip` | Signed and notarized | ### Linux diff --git a/ROADMAP.md b/ROADMAP.md index fbbe125af..d9b9b92b5 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -257,6 +257,7 @@ same references), and from the app's JSON control channel. See [docs/agents.md]( > **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-12 · **Change:** minor (text stroke behind fill) · **Target:** Adobe InDesign 2026 > **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (text threads by hand; the alpha gate waits on Primary Text Frame page fixes; Links source paths) · **Target:** Adobe InDesign 2026 > **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (table anchors keep their own paragraphs) · **Target:** Adobe InDesign 2026 +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (CLI bundled with the macOS app) · **Target:** Adobe InDesign 2026 DesignCraft aims at full Adobe InDesign parity, and to be better: faster, open (documented JSON format + IDML), scriptable by agents (MCP), and available on the web. @@ -693,6 +694,7 @@ Newest first. - **2026-10-13** · A parent can be based on another parent (`layout.parents.options`). Pages draw the base parent's items, then the parent's, then their own, on screen and in PDF and image export; chains work, cycles are refused, overrides reach base items, `document.inspect` reports `basedOn`, and IDML round-trips it. No readiness percentage change. - **2026-10-13** · The Text Wrap panel is laid out as InDesign's: the wrap buttons with Invert, and the four offsets (Top, Left, Bottom, Right) showing the object's values, with the link button that sets them all the same. It used to show a single offset, always 0. No readiness percentage change. - **2026-10-13** · Layout ▸ Table of Contents opens a real dialog: title and title style, Include Paragraph Styles and Other Styles lists with Add and Remove, and per style its entry style, page number position (after, before, none), separator and level. Replace Existing regenerates the current table of contents in place; otherwise OK makes a new frame on the page in view. IDML export writes the definition as a TOC style that import reads back, so Update works after a round trip. No readiness percentage change. +- **2026-10-13** · The macOS app bundles its matching headless CLI in `Contents/MacOS`, signed before the app and checked during packaging. The separate CLI ZIP remains available; documented commands use the bundled executable directly. macOS scope of #387; no readiness percentage change. - **2026-10-12** · Placed Excel tables and Excel data-merge records keep numeric precision, including small values, and preserve numeric-looking cached formula strings as text. No readiness percentage change. - **2026-10-12** · The engine's atomic writer, used by saves and exports (documents, snippets, books, libraries, swatches, XML, interchange, MCP, desktop and CLI writes), delegates to craft-libs/craft-atomic. Failed writes retain the original; new files follow the umask and replaced files keep their permissions. Recovery checkpoints and package output keep their own no-follow writers. No readiness percentage change. - **2026-10-12** · The Effects dialog, as in InDesign: Object › Effects (Transparency…, Drop Shadow… and the rest, and their shortcuts) and the Effects panel's fx button open it on the chosen effect, turned on. Transparency and every effect in one window, in the document's units, with X/Y offsets, Preview on the page, Cancel putting things back, and OK as one undo step (`object.effects`). Shadows default to InDesign's 120° light angle. No readiness percentage change. diff --git a/docs/mcp.md b/docs/mcp.md index d0331cf7f..61e59df4d 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -75,15 +75,28 @@ The release packages ship `designcraft-cli` alongside the desktop app, so no bui |---|---| | Windows (MSI) | `%LOCALAPPDATA%\Programs\ArtCraft\DesignCraft\designcraft-cli.exe` by default (`C:\Program Files\ArtCraft\DesignCraft\designcraft-cli.exe` for an all-users install, under `Program Files (x86)` instead for the 32-bit build, or wherever you installed it otherwise), not on `PATH` | | Linux (deb, rpm) | `/usr/bin/designcraft-cli` | -| macOS | the separate `designcraft-cli--macos-.zip` release asset (the `.app` holds only the desktop app) | +| macOS (DMG) | `/Applications/DesignCraft.app/Contents/MacOS/designcraft-cli` after installing the app; the separate CLI ZIP is also available | ```sh # Windows (PowerShell), default install folder claude mcp add designcraft -- "$env:LOCALAPPDATA\Programs\ArtCraft\DesignCraft\designcraft-cli.exe" mcp -# Linux, or macOS with the CLI unzipped onto PATH +# macOS, app installed in Applications +claude mcp add designcraft -- "/Applications/DesignCraft.app/Contents/MacOS/designcraft-cli" mcp +# Linux, or the separate CLI unzipped onto PATH claude mcp add designcraft -- designcraft-cli mcp ``` +The bundled macOS CLI can also run headless jobs directly, without an MCP client or a window: + +```sh +"/Applications/DesignCraft.app/Contents/MacOS/designcraft-cli" --version +"/Applications/DesignCraft.app/Contents/MacOS/designcraft-cli" commands frame.create +``` + +If the app lives elsewhere, use its actual path. Updating the app updates its bundled CLI; moving +it requires updating any saved command or MCP configuration path. Removing the app removes this +CLI too. An independently installed CLI is unaffected, and the DMG adds nothing to `PATH`. + ## Confining file access ```sh diff --git a/packaging/macos/package.sh b/packaging/macos/package.sh index 8b8f6c41e..99069eaa8 100755 --- a/packaging/macos/package.sh +++ b/packaging/macos/package.sh @@ -117,6 +117,7 @@ echo "==> assembling $APP" mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources" # Executable and icon carry the display name (CFBundleExecutable / CFBundleIconFile). cp "$WORK/bin/designcraft" "$APP/Contents/MacOS/DesignCraft" +cp "$WORK/bin/designcraft-cli" "$APP/Contents/MacOS/designcraft-cli" cp "$ROOT/assets/app-icon/designcraft.icns" "$APP/Contents/Resources/DesignCraft.icns" # Required embedded-font notices are independent of optional font inputs. cp "$ROOT/NOTICE" "$APP/Contents/Resources/NOTICE" @@ -129,10 +130,11 @@ plutil -lint "$APP/Contents/Info.plist" printf 'APPL????' >"$APP/Contents/PkgInfo" # Sign inside-out: nested code first, then the bundle itself (no --deep on the final signature). -# Today the only nested code is the main executable; frameworks/helpers would be signed here too. +sign --options runtime "$APP/Contents/MacOS/designcraft-cli" sign --options runtime --entitlements "$HERE/entitlements.plist" "$APP/Contents/MacOS/DesignCraft" sign --options runtime --entitlements "$HERE/entitlements.plist" "$APP" codesign --verify --strict --deep --verbose=2 "$APP" +"$APP/Contents/MacOS/designcraft-cli" --version if [[ "$NOTARIZE" = 1 ]]; then ditto -c -k --keepParent "$APP" "$WORK/DesignCraft-notarize.zip" @@ -206,6 +208,6 @@ ditto -c -k --keepParent "$CLI_DIR" "$CLI_ZIP" # A bare Mach-O can't carry a stapled ticket; Gatekeeper looks the notarization up online. if [[ "$NOTARIZE" = 1 ]]; then notarize "$CLI_ZIP"; fi -"$WORK/bin/designcraft-cli" --version +"$CLI_DIR/designcraft-cli" --version echo "==> done" ls -lh "$DMG" "$CLI_ZIP"