Skip to content

feat: adopt organization plugin standards and swift-subprocess 1.0 - #19

Merged
showxu merged 5 commits into
masterfrom
feat/plugin-api
Oct 22, 2026
Merged

showxu merged 5 commits into
masterfrom
feat/plugin-api

Conversation

@showxu

@showxu showxu commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Summary

Adopts the organization plugin standards and moves to swift-subprocess 1.0.2.

Plugin standards and release

  • The manifest declares plugin_api = 1.
  • plugin-codex is the documented exception to the organization's reusable release workflow. Its native build cannot be reproduced byte for byte, so release.yml keeps promoting the CI artifacts of the accepted commit, and it meets the same release content standard:
    • Verification: the annotated tag must be signed, pass GitHub verification and point to that commit; the manifest version must equal the tag, plugin_api must be valid, and the archives must match compatibility.artifacts.
    • Contents: a deterministic release-receipt.json (schema 1, reproduction ci-artifact-promotion) references each archive's native receipt; SHA256SUMS covers the archives and all receipts.
    • Publication: draft first; the receipt is uploaded first and freezes provenance; the draft is published only after every digest matches; release immutability is required.
    • Recovery starts from the draft's receipt. Expired artifacts are refused with recovery steps, published Releases are never modified, and incomplete assets are replaced only in drafts.
    • Jobs: verify is read-only and holds no secrets; publish has contents: write and runs no builds; the catalog notification is a separate job and the only holder of the catalog secret.
    • Dry run: publish: false runs the same checks and assembly, without the tag checks, Release writes or secrets.
  • Offline tests against a fake GitHub API cover first publication, each failing step, recovery after a partial upload and CI rerun, incomplete and conflicting assets, expired artifacts and reruns against a published Release.

swift-subprocess 1.0.2

  • ManagedLineProcess+Darwin.swift uses the 1.0 API. Child input follows the write contract shared with the host:
    • writes are admitted one at a time in arrival order;
    • a cancelled waiter never writes;
    • an admitted write completes independently of its caller;
    • a partially written frame retires the input;
    • teardown signals termination at once but closes the descriptor only after the active write has settled.
  • A no-op SIGPIPE handler is installed once, only over the default disposition, so a write to an exited child reports an error instead of terminating the adapter, while children still start with the default disposition.
  • Dependency requirements follow the organization's VERSIONING rules: swift-subprocess .upToNextMinor(from: "1.0.2"), ArgumentParser and GRDB from: at the resolved versions, the MCP SDK fork and swift-codex exact.

Validation

  • Every step of ci.yml run locally: version check, lockfile drift, release gate, schema checks, strict format lint, 260 Swift tests without parallelism, 73 Python tests, packaging and relocated package acceptance, and the workflow check.
  • The lifecycle tests passed 5 times in a row, and each required case fails without its protection.
  • Live publication runs through release.yml at the first plugin release.

@showxu
showxu merged commit 4180d1a into master Oct 22, 2026
2 checks passed
@showxu
showxu deleted the feat/plugin-api branch October 22, 2026 06:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant