Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ Use this check:
## Task Route

- Before changing versions, dependencies, packaging or release workflows, read
`Documentation/Architecture/VersioningAndRelease.md` and use its existing project check entry points.
the [organization VERSIONING](https://github.com/computer-mcp/.github/blob/master/VERSIONING.md)
for version rules and `Documentation/Reference/Release.md` for release facts
and check entry points.

- For repository-native documentation placement, read `Documentation/README.md`
before editing.
Expand Down
2 changes: 0 additions & 2 deletions Documentation/Architecture/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# Architecture

[Package](Package.md) defines ownership, runtime and distribution boundaries.
[Versioning and Release](VersioningAndRelease.md) defines version authority,
acceptance and publication.
87 changes: 0 additions & 87 deletions Documentation/Architecture/VersioningAndRelease.md

This file was deleted.

4 changes: 2 additions & 2 deletions Documentation/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Documentation

- [Architecture](Architecture/README.md): current component ownership and lifecycle.
- [Versioning and Release](Architecture/VersioningAndRelease.md): version authority, acceptance and publication rules.
- [Interface](Reference/Interface.md): CLI and MCP contracts, error and retention behavior.
- [Installation](Reference/Installation.md): dependencies, grants, packaging and validation.
- [Release](Reference/Release.md): publishing a release and notifying the plugin catalog.
- [Release](Reference/Release.md): version sources, compatibility, acceptance and
publication.
117 changes: 101 additions & 16 deletions Documentation/Reference/Release.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,68 @@
# Release

This guide covers `release.yml` and notification of the official plugin catalog.
[Versioning and Release](../Architecture/VersioningAndRelease.md) owns this
repository's version sources and acceptance checks. The organization's
[VERSIONING.md](https://github.com/computer-mcp/.github/blob/master/VERSIONING.md)
owns shared versioning, release contents, immutability and recovery rules.
Release status: [CI](https://github.com/computer-mcp/plugin-cursor/blob/master/.github/workflows/ci.yml)
builds candidate archives on pull requests, `master` pushes and manual runs.
[`release.yml`](https://github.com/computer-mcp/plugin-cursor/blob/master/.github/workflows/release.yml)
implements dry runs and publication; native and host acceptance are manual.

The repository owner must enable GitHub release immutability before the first
release. The release workflow refuses publication unless it can verify that
setting; enabling it is a prerequisite to publishing.
The organization [VERSIONING](https://github.com/computer-mcp/.github/blob/master/VERSIONING.md)
owns version rules, including tags, version choice and the changelog. This
reference records this repository's version sources, compatibility, release
procedure and checks. The shared
[release workflow guide](https://github.com/computer-mcp/.github/blob/master/Documentation/Reference/PluginRelease.md)
describes workflow verification and recovery.

## Publish
## Components and Version Sources

| Shipped component | Version meaning | Version source | Mirrors and derived fields | Update and read-only check |
| --- | --- | --- | --- | --- |
| `cursor.zip` plugin package | Package version | `version` in [`computer-mcp-plugin.toml`](../../computer-mcp-plugin.toml) | adapter `--version`, builder receipt, release tag, `release-receipt.json`, catalog entry | Edit the manifest; `Tests/test_package.py` checks the packaged adapter's `--version` |

The archive contains the manifest, `cli-tree.json`, `bin/`, `skills/`, the README,
contribution guide, license, notices, `Documentation/` and `Examples/`.
Tests, build scripts and workflows are excluded from the archive.

## Compatibility Surface

The package contributes a file-backed CLI tree, stdio MCP adapter and Skills.
[Interface](Interface.md) owns the CLI argv and output mapping, MCP tools and
resources, session and permission semantics, retention, cancellation and errors.
The manifest owns `plugin_api` and the minimum host and architecture declarations
in `[compatibility]`. Validate changes to those bounds against the selected host.

## Dependencies and Verified Combinations

The package uses the Python standard library only and requires Python 3.13 or
newer on the host launch PATH. CI runs the tests on Python 3.13 and 3.14 and
checks that 3.11 and 3.12 are rejected before any vendor process starts.

`cli-tree.json` pins the exact Cursor Agent version through its
`executable_checks`, applied before projected CLI calls and new ACP sessions.
A different vendor version requires a reviewed tree update verified with
`Scripts/validate_native.py` against the real executable. ACP initialization
uses the separate `Scripts/probe_acp.py` check. Native version/help, fixture
protocol, selected-host interoperability and authenticated execution are
separate evidence classes; see [Installation](Installation.md).

## Derived Metadata and Drift Checks

`Scripts/build_package.py` verifies the plugin ID, parses the CLI tree, and
produces the same archive bytes from the same source. Its builder receipt prints
the ID, version and SHA-256. The release caller passes this builder to the shared
release workflow.

`bin/plugin_runtime.py` is copied from the organization's canonical runtime.
The `runtime` job in `ci.yml` verifies its digest against the pinned
`plugin-runtime.yml`; runtime updates and that workflow pin move together.
Adapter and probe callers extract the native assertion from the CLI tree with
`expected_version` before calling `verify_version`.

## Candidate, Acceptance and Publication

Publication depends on the repository's GitHub release immutability setting.
The shared workflow checks that setting before writing a Release.

### Publish

1. Confirm that `version` in `computer-mcp-plugin.toml` has not been released
and that the reviewed `master` commit has successful `ci.yml` from a `push`.
Expand All @@ -27,19 +79,19 @@ setting; enabling it is a prerequisite to publishing.
4. Run the native version/help, ACP initialization and isolated host checks in
[Installation](Installation.md#isolated-host-interoperability) against that
exact archive. Record the manual acceptance results and their limits in the
draft Release notes. Create and push the signed annotated `vX.Y.Z` tag on
the accepted commit, and target the draft Release at that full commit SHA.
draft Release notes. Create and push the version tag that
[VERSIONING](https://github.com/computer-mcp/.github/blob/master/VERSIONING.md) requires on the accepted commit, and target the draft
Release at that full commit SHA.
5. Dispatch `release.yml` with `ref` set to that version tag and `publish: true`.
The workflow verifies the tag signature and manifest version, repeats the
source and archive checks, completes and verifies the draft assets, and
publishes. Its dependent notifier runs only when `publish` is true and the
shared workflow reports `published: true`.

The shared workflow generates the deterministic receipt and checksums under the
organization's [release contents contract](https://github.com/computer-mcp/.github/blob/master/VERSIONING.md#plugin-release-contents).
Manual acceptance evidence belongs in the Release notes.
The shared workflow generates the receipt and checksums; CI's
`package-receipt.json` remains builder metadata in the source CI artifact.

## Catalog notification
### Catalog notification

`notify-catalog.yml` runs when a release is published, edited, released,
unpublished or deleted, and on manual dispatch. It asks the website to reconcile
Expand All @@ -64,7 +116,40 @@ job after confirmed publication. Only the notifier receives
`CATALOG_APP_PRIVATE_KEY`; the reusable release workflow receives no catalog
secret. Dry runs do not notify the catalog.

## Retry
## Evidence Reuse and Invalidation

The CI artifact name identifies the source commit and Python version. The release
workflow verifies CI provenance and artifact digests; `release-receipt.json`
records the commit, CI run and attempt, artifact digest and archive SHA-256.

An archive with the accepted digest keeps its archive acceptance for the tested
combination. Reuse of manual results is reviewed against the native dependency,
selected host, check definitions and relevant environment recorded with them.
Changes to packaged files produce a new archive and require the affected checks
again. A check-only change can reuse unchanged archive bytes with fresh affected
checks. Source tests do not replace installation, native or authenticated
execution evidence. Keep failed-check output and result limits with the manual
acceptance record.

## Entry Points and Artifact Retention

| Operation | Existing command or explicit manual procedure | Required access |
| --- | --- | --- |
| Version update and check | Edit `computer-mcp-plugin.toml`; `python3 -m unittest discover -s Tests -p 'test_*.py'` | Local checkout |
| Candidate validation and build | `ci.yml`; locally `python3 Scripts/build_package.py dist` | CI or local checkout |
| Native acceptance | `python3 Scripts/validate_native.py --executable <agent>`; `python3 Scripts/probe_acp.py --executable <agent> --output <probe-receipt.json>` | User-installed native executable |
| Exact archive host acceptance | `python3 Scripts/validate_host.py --host <computer-mcp> --expected-host-version X.Y.Z --archive dist/cursor.zip --output <new-evidence-directory>`; see [Installation](Installation.md#isolated-host-interoperability) | Selected host binary and candidate archive |
| Acceptance and publication | Manual checks above; dispatch `release.yml`, dry run first | Repository Actions; publication also needs a signing key and release write access |
| Status and interrupted-run recovery | Inspect CI or `release.yml`; follow [Retry](#retry) | Repository Actions |
| Cleanup | Delete obsolete output and evidence under ignored `dist/`, and `package-receipt.json` | Local checkout |

The builder refuses to overwrite a different archive, and `validate_host.py`
requires a new evidence directory. Remove obsolete build output before rebuilding
changed source. Keep local output and evidence under ignored `dist/`; remove
them after use unless an acceptance record requires retention. CI sets no
per-artifact retention override.

### Retry

For a failed publication, use **Re-run failed jobs**. Recovery preserves the
receipt's frozen CI provenance and retains matching draft assets. Follow the
Expand Down
Loading