diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cae4a17d..bbb2a0a8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,6 @@ -# Release pipeline: every push to `release` builds signed installers for every platform and -# creates or updates the draft GitHub Release "LightCraft v". See docs/releasing.md. +# Release pipeline: every push to `release` builds platform artifacts (signed where credentials +# are configured) and creates or updates the draft GitHub Release "LightCraft v". +# See docs/releasing.md. # # All jobs run in the `release` environment (restricted to the `release` branch), which holds # the signing secrets. Every secret is optional: missing ones produce unsigned artifacts and a diff --git a/AGENTS.md b/AGENTS.md index c3072de8..588b6f41 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # LightCraft — instructions for agents -LightCraft is a clean-room, open-source, pure-Rust photo library + non-destructive raw developer targeting Adobe Lightroom parity (and beyond). Native on macOS, Windows, Linux; web via WASM. Sibling of `../pdfcraft` (Acrobat), `../photocraft` (Photoshop), `../drawcraft` (Illustrator) and `../filmcraft` (Premiere), with the same conventions. +LightCraft is a clean-room, open-source, pure-Rust photo library + non-destructive raw developer targeting Adobe Lightroom parity (and beyond). Native on macOS, Windows, Linux; web via WASM. Sibling of `../pdfcraft` (Acrobat), `../photocraft` (Photoshop), `../vectorcraft` (Illustrator) and `../filmcraft` (Premiere), with the same conventions. ## Start every session here 1. Read `plan/STATUS.md` (current milestone, next unchecked task, blockers). diff --git a/CLAUDE.md b/CLAUDE.md index c3072de8..588b6f41 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,6 +1,6 @@ # LightCraft — instructions for agents -LightCraft is a clean-room, open-source, pure-Rust photo library + non-destructive raw developer targeting Adobe Lightroom parity (and beyond). Native on macOS, Windows, Linux; web via WASM. Sibling of `../pdfcraft` (Acrobat), `../photocraft` (Photoshop), `../drawcraft` (Illustrator) and `../filmcraft` (Premiere), with the same conventions. +LightCraft is a clean-room, open-source, pure-Rust photo library + non-destructive raw developer targeting Adobe Lightroom parity (and beyond). Native on macOS, Windows, Linux; web via WASM. Sibling of `../pdfcraft` (Acrobat), `../photocraft` (Photoshop), `../vectorcraft` (Illustrator) and `../filmcraft` (Premiere), with the same conventions. ## Start every session here 1. Read `plan/STATUS.md` (current milestone, next unchecked task, blockers). diff --git a/README.md b/README.md index 13ed80d7..6ff6bf3d 100644 --- a/README.md +++ b/README.md @@ -233,11 +233,11 @@ lightcraft --control 7980 ~/Pictures/trip {"method": "ui.screenshot", "params": {"path": "after.png"}} ``` -- **91 engine commands** and **48 UI commands.** List them all with `engine.commands`; read every slider's range, - default and current value with `develop.controls`. -- **MCP server.** `lightcraft-cli mcp` gives Claude (or any MCP client) ~100 tools: import, query, develop, mask, - render (returned as an image), export. It runs headless, or attached to the running app with screenshots, clicks - and gestures. See [docs/mcp.md](docs/mcp.md). +- **Command registry.** `engine.commands` lists the available commands; `develop.controls` lists every slider's + range, default and current value. +- **MCP server.** `lightcraft-cli mcp` exposes the command registry to Claude (or any MCP client), alongside + helpers for import, query, develop, mask, render (returned as an image) and export. It runs headless, or attached + to the running app with screenshots, clicks and gestures. See [docs/mcp.md](docs/mcp.md). ```sh cargo build --release -p lightcraft-cli diff --git a/docs/mcp.md b/docs/mcp.md index 826a4454..0e0e14b1 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -112,8 +112,8 @@ command registry (engine commands, plus the app's UI commands such as `view.deta connected): the id with `.` replaced by `_` and a `cmd_` prefix — `photo.rate` → `cmd_photo_rate`, `develop.set` → `cmd_develop_set`, `edit.undo` → `cmd_edit_undo`. Arguments are the command's JSON params (documented in each tool's description and by `list_commands`). Pass `--compact` to -leave these out (about 90 headless / 140 connected) when a client struggles with many tools; -`run_command` still reaches every command. +leave these per-command tools out when a client struggles with a large tool list; `run_command` +still reaches every command. ## Resources diff --git a/docs/releasing.md b/docs/releasing.md new file mode 100644 index 00000000..b19d975d --- /dev/null +++ b/docs/releasing.md @@ -0,0 +1,56 @@ +# Releasing LightCraft + +The release pipeline is [`.github/workflows/release.yml`](../.github/workflows/release.yml). +It runs on every push to the `release` branch. A maintainer can also dispatch it manually, with +an optional version override such as `1.2.0-rc.1`; the release environment's branch restrictions +still apply. + +## Prepare and start a release + +1. Merge the release-ready changes into `release`. +2. Set the workspace version in `Cargo.toml` (for example, with `cargo xtask version set 1.2.0`). + For a manual workflow run, the version input can override the workspace version for that run. + Use a semantic version such as `1.2.0` or `1.2.0-rc.1`; versions containing a hyphen are + marked as prereleases. +3. Push to `release`, or dispatch the workflow from a branch allowed by the `release` environment. +4. Check the workflow run and its artifacts. On success, the workflow creates or updates a **draft** + GitHub Release named `LightCraft v`, targeted at the commit that triggered the run. + Review the draft and its `SHA256SUMS.txt`, then publish it in GitHub Releases when ready. + +The workflow replaces assets when it updates an existing draft. It stops rather than overwriting a +release that has already been published, so bump the version before producing another release. + +## Builds and artifacts + +Release jobs build macOS universal, Windows x86/x64/ARM64, Linux x86_64/aarch64, and the WASM web +app. The platform scripts in [`packaging/`](../packaging/) write their outputs to `dist/release/`: + +- macOS: app DMG and CLI ZIP. +- Windows: MSI installer and portable ZIP for each architecture. +- Linux: AppImage, `.deb`, `.rpm`, and `.tar.gz` for each architecture. +- Web: `lightcraft-web-.zip`. + +The Linux builds run on Ubuntu 22.04 and target glibc 2.35 or newer. AppImages and binaries may +also require system libraries for the windowing stack; the `.deb` and `.rpm` packages declare +their runtime dependencies. + +Release builds fetch the pinned [`storytold/craft-fonts`](https://github.com/storytold/craft-fonts) +revision and require it (`CRAFT_FONTS_REQUIRED=1`). Keep that pin deliberate when updating the +workflow. + +## Signing credentials + +All credentials are stored as secrets in the GitHub `release` environment. Signing is optional: +without platform signing credentials, packaging continues with unsigned artifacts and warnings. +macOS notarization is a separate optional step; when its credentials are absent, a build with a +signing identity is signed but not notarized. Configure only the platform credentials you need: + +- **macOS signing:** `APPLE_CERTIFICATE`, `APPLE_CERTIFICATE_PASSWORD`, and `KEYCHAIN_PASSWORD`. + **Notarization** additionally needs all of `APPLE_ID`, `APPLE_PASSWORD` (an app-specific + password), and `APPLE_TEAM_ID`. +- **Windows signing:** either `WINDOWS_CERTIFICATE` and `WINDOWS_CERTIFICATE_PASSWORD`, or Azure + Trusted Signing credentials: `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, + `AZURE_SIGNING_ENDPOINT`, `AZURE_SIGNING_ACCOUNT`, and `AZURE_CERT_PROFILE`. + +Linux and web artifacts are not code-signed by this workflow. The release job computes SHA-256 +checksums for the complete artifact set and attaches the checksum file to the draft release.