fix: macOSアプリにCLIを同梱 (#690)

Co-authored-by: haranishi <223786623+haranishi@users.noreply.github.com>
This commit is contained in:
Ikki Nishiharaandharanishi authored and GitHub committed 2026-11-03 16:44:59 -05:00
1 parent de4042be41
commit 4a1ff582e9
4 files changed
+22 -5

No files matched your search

+1 -1
View File
@@ -280,7 +280,7 @@ Installers and executables are code-signed.
| Build | File | Notes |
|---|---|---|
| App, universal (Apple silicon + Intel) | `designcraft-<ver>-macos-universal.dmg` | Signed and notarized |
| App and bundled CLI, universal (Apple silicon + Intel) | `designcraft-<ver>-macos-universal.dmg` | Signed and notarized |
| Command-line tool, universal | `designcraft-cli-<ver>-macos-universal.zip` | Signed and notarized |
### Linux
+2
View File
@@ -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.
+15 -2
View File
@@ -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-<version>-macos-<arch>.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
+4 -2
View File
@@ -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"