forked from 1b-agent/opencadstudio-upstream
Found while building an out-of-tree scripting plugin from scratch against this doc and the actual ocs_plugin_api/host source. Two categories: Fixed outright (docs/examples didn't match the real code): - The worked CadModule example returned Vec<RibbonGroup> from ribbon_groups(); the real trait requires &[RibbonGroup] - the example wouldn't compile. Fixed with the OnceLock pattern the host's own benchmark code already uses. - Reconciled a contradiction between "process isolation removes the need for a shared Rust ABI" and the exact-rustc_version requirement described a few paragraphs earlier in the same doc. - The roadmap's "Next" list still had external automation as unstarted; --mcp/--serve are real and operational (src/cli.rs, src/mcp.rs). - Added the missing plugin.toml to docs/plugin-template-v2 (its own DESIGN.md already claimed one could be installed). - Documented that plugin-template's CI floats rust-toolchain@stable, which doesn't guarantee matching the host's exact rustc - added acadrust_source to both templates' plugin.toml plus the release.yml step that fills it from Cargo.lock's resolved acadrust source, alongside the existing rustc_version fill. Flagging for your call, not fixed here (found the behavior, not sure it's the intended one, prefer to ask than guess at a fix): - acadrust_compatible()'s ABI gate only runs at all if plugin.toml declares acadrust_source - an undeclared field is silently treated as compatible, unlike rustc_version (undeclared = incompatible). The same shortcut appears in two places: ExternalPlugin::acadrust_compatible (src/plugin/external.rs) and the inline check inside fetch_release_info (src/plugin/marketplace.rs). If this is deliberate (e.g. back-compat with manifests from before the field existed), no action needed beyond a comment; if not, both call sites need the same fix. - The command line still uppercases typed/pasted input even with the `>` literal-spaces prefix (Message::CommandInput, src/app/update/mod.rs) - `>` only stops a space from auto-submitting the line, it doesn't skip `s.to_uppercase()`. A plugin command needing a case-sensitive typed argument has no escape today short of automation. - fetch_release_info (src/plugin/marketplace.rs) returns every release under a linked repo with no filter on the manifest's own id field (which it already parses to build ReleaseInfo) - a repo hosting more than one plugin under tag-namespaced releases surfaces all of them mixed together in one plugin's version list. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
57 lines
2.1 KiB
YAML
57 lines
2.1 KiB
YAML
name: release
|
|
|
|
# Build the plugin cdylib for each desktop platform and attach the binaries
|
|
# (plus plugin.toml) to a GitHub Release on a v* tag. Open CAD Studio's Plugin
|
|
# Manager reads the assets, picks the one matching the user's OS/arch, and
|
|
# installs it. Rename the `asset:` files to your plugin id.
|
|
on:
|
|
push:
|
|
tags: ["v*"]
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
jobs:
|
|
build:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- os: ubuntu-latest
|
|
ext: so
|
|
asset: opencad.my_plugin-linux-x86_64.so
|
|
- os: windows-latest
|
|
ext: dll
|
|
asset: opencad.my_plugin-windows-x86_64.dll
|
|
- os: macos-latest
|
|
ext: dylib
|
|
asset: opencad.my_plugin-macos-aarch64.dylib
|
|
runs-on: ${{ matrix.os }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
# NOTE: @stable floats to whatever's current when this job runs, which
|
|
# is NOT the same thing as "matches the host's rustc exactly" — the API
|
|
# v4+ load check compares plugin.toml's rustc_version to the host's
|
|
# build-time compiler byte-for-byte (see plugin-architecture.md's
|
|
# "Build-time ABI metadata"). Pin this to the host's actual toolchain
|
|
# version (check crates/ocs_plugin_api/src/version_info.rs's embedded
|
|
# value, or the host's own CI config) before a real release, or your
|
|
# binary may be refused at load with a version-mismatch error.
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- run: cargo build --release
|
|
- name: Stage release asset
|
|
shell: bash
|
|
run: |
|
|
mkdir -p dist
|
|
cp target/release/*.${{ matrix.ext }} "dist/${{ matrix.asset }}"
|
|
acadrust_source=$(grep -A3 '^name = "acadrust"' Cargo.lock | grep '^source' | head -1 | sed 's/^source = "//;s/"$//')
|
|
sed \
|
|
-e "s|__RUSTC_VERSION__|$(rustc --version)|" \
|
|
-e "s|__ACADRUST_SOURCE__|$acadrust_source|" \
|
|
plugin.toml > dist/plugin.toml
|
|
- uses: softprops/action-gh-release@v2
|
|
with:
|
|
files: |
|
|
dist/${{ matrix.asset }}
|
|
dist/plugin.toml
|