[workspace]
resolver = "2"
# Use a glob instead of an explicit list: incremental crate creation in Step 0
# does not require editing `members` each time (per implementer Phase 1 batch 2
# workspace-masking feedback: listing a non-existent crate makes `cargo build -p X`
# fail at the resolve stage). The glob picks up every manifest under crates/,
# naturally supporting incremental creation.
members = ["crates/*"]
exclude = [
  "vendor/agent",
  "vendor/anthropic-agent-sdk",
  "vendor/casement",
  "vendor/jian",
  "vendor/skia-safe-op",
  "node_modules",
]

[workspace.package]
version = "0.1.0"
edition = "2021"
rust-version = "1.85"
license = "MIT"
authors = ["ZSeven-W <fini.yang@gmail.com>"]
repository = "https://github.com/ZSeven-W/openpencil"

[workspace.dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
thiserror = "1"
anyhow = "1"
tracing = "0.1"

# WASM-boundary related (per kickoff §1.2 blacklist = must not appear here).
# Intentionally NOT exposing tokio / reqwest / agent / pen-agent-cli /
# pen-server / native-tls in workspace.dependencies — these are used only
# inside native-only crates via dev-deps or target-specific deps.

# Step 1b §3.2 P0.5B Run path (2026-05-09): wasm32-unknown-unknown skia
# build via `vendor/skia-safe-op` — fork of rust-skia 0.97.0 with a new
# build_support/platform/wasm_unknown.rs target that produces .o files
# free of emscripten runtime imports.
#
# IMPORTANT: `[patch.crates-io]` is workspace-global, NOT target-scoped.
# Every `skia-safe` / `skia-bindings` consumer in this workspace —
# including `op-host-native` (macOS / Linux / Windows desktop,
# `gl` feature) — now resolves through this fork on every target.
# Cargo does not natively support per-target patches, so this is the
# accepted blast radius.
#
# Compatibility surface vs upstream rust-skia 0.97.0:
#   - every upstream platform module (macos / linux / windows /
#     emscripten / android / ios / ohos / alpine) is byte-identical;
#     only `wasm_unknown` is new
#   - the dispatch table adds one new arm for
#     `("wasm32", "unknown", "unknown", _)`; every existing target
#     tuple still resolves to the same upstream module as before
#   - the binary-cache feature URL + skia-binaries archive layout are
#     untouched, so native desktop builds continue to download the
#     prebuilt artifact instead of compiling Skia from source
#
# Trade-offs accepted:
#   - upstream rust-skia patches will not flow until we re-vendor
#   - `Cargo.lock` records `path` sources for skia-bindings/skia-safe
#     instead of `registry+…`, surfacing the fork in audit tools
#
# When upstream rust-skia ships a wasm32-unknown-unknown platform
# module of its own, this whole [patch] block can go away.
[patch.crates-io]
skia-bindings = { path = "vendor/skia-safe-op/skia-bindings" }
skia-safe = { path = "vendor/skia-safe-op/skia-safe" }
