Lahfir
3cffbd67f6
feat(ffi): ship C-ABI cdylib with review hardening and release pipeline ( #26 )
...
Lands the full agent-desktop FFI layer with every PR #22 review finding resolved, modular refactor applied, todo-resolve batches (011 + 006) closed, and a production release pipeline that bundles the prebuilt cdylib for 5 target triples alongside the CLI on every GitHub Release.
**FFI surface**
- Panic-unwind cdylib boundary via `trap_panic` / `trap_panic_ptr` / `trap_panic_const_ptr` / `trap_panic_void`
- Runtime main-thread enforcement on every macOS-sensitive entrypoint; TLS errno-style last-error lifetime
- Every `#[repr(i32)]` field validated at the C boundary via `try_from_c_enum!` — arbitrary bit patterns return `ErrInvalidArgs` without UB
- BFS flat-tree layout with `child_start` / `child_count`; iterative traversal
- Opaque list handles (`AdAppList`, `AdWindowList`, `AdSurfaceList`, `AdNotificationList`); opaque `AdImageBuffer` with `_data` / `_size` / `_width` / `_height` / `_format` accessors
- `AdNativeHandle` single-owner single-thread contract; zero-on-free makes double-call deterministic
- Fail-closed UTF-8 for optional filter pointers (`try_c_to_string` tri-state)
- `AdTreeOptions` fully honored in `ad_get_tree` (include_bounds / interactive_only / compact)
- Verified notification action identity (`NotificationIdentity` fingerprint) — refuses to press if NC reordered between list and act
**Release pipeline**
- New `build-ffi` matrix in `.github/workflows/release.yml` producing `libagent_desktop_ffi.{dylib,so,dll}` tarballs for aarch64/x86_64-apple-darwin, x86_64/aarch64-unknown-linux-gnu, x86_64-pc-windows-msvc
- macOS `install_name = @rpath/libagent_desktop_ffi.dylib` baked in by `build.rs` and CI-verified via `otool -D`
- `actions/attest-build-provenance@v4.1.0` — keyless Sigstore provenance over every release artifact; `gh attestation verify`
- `checksums.txt` covers both CLI and FFI assets; asset-count assertion bumped 3 → 8
- npm package stays CLI-only; Python/Swift/Go/Ruby/Node/C hosts pull dylib tarball directly from the Release
- README gains a "Language bindings (FFI)" section with platform→artifact table
**Docs**
- `skills/agent-desktop-ffi/` — SKILL.md + build-and-link.md + ownership.md + threading.md + error-handling.md
- `docs/solutions/best-practices/` — two new solution docs (deterministic build-artifact marker, identity fingerprint against OS reorder)
**Verification**
- `cargo clippy --all-targets -- -D warnings` — clean
- `cargo test --lib --workspace` — 139 passed (5 suites)
- `cargo test -p agent-desktop-ffi --tests` — 87 passed (4 suites, including new `c_header_compile` C-ABI harness)
- macOS PR CI green on multiple runs; latest: 24561160455
- Python `ctypes.CDLL` round-trip from a freshly extracted FFI tarball confirmed; adapter lifecycle + `ad_list_apps` enumeration clean; `install_name` survives the tarball
Closes #22 (superseded).
2026-04-17 04:00:43 -07:00
Lahfir
a346f242c2
feat: Phase 1 foundation — workspace scaffold, core engine, macOS adapter, 31 commands
...
Implements the complete agent-desktop Phase 1 specification:
- Workspace: 5-crate layout (core, macos, windows/linux stubs, binary)
- Core: AccessibilityNode, Action, ErrorCode, PlatformAdapter trait, RefMap
with atomic writes, SnapshotEngine with depth-first ref allocation
- macOS adapter: AXUIElement tree traversal, action execution, input
synthesis via CGEvent, screenshot via CGWindowListCreateImage, clipboard
via pbpaste/pbcopy, window listing and app management via osascript
- 31 CLI subcommands via clap derive: snapshot, find, screenshot, get, is,
click, double-click, right-click, type, set-value, focus, select, toggle,
expand, collapse, scroll, press, launch, close-app, list-windows,
list-apps, focus-window, clipboard-get/set, wait, status, permissions,
version, batch
- Windows/Linux: not-supported stubs ready for Phase 2 implementation
- JSON output contract: {version,ok,command,data} envelope with structured
error payloads including SCREAMING_SNAKE_CASE error codes
- Ref system: @e{N} sequential refs for interactive elements, stored at
~/.agent-desktop/last_refmap.json with 0o600/0o700 permissions
- CI: GitHub Actions macOS runner with dependency isolation check, clippy,
unit tests, release build, and 15MB binary size gate
2026-02-19 10:44:38 -08:00