From 33b9ddb3ecc07e81dd60452ea97ab277376006ec Mon Sep 17 00:00:00 2001 From: showxu <10173746+showxu@users.noreply.github.com> Date: Thu, 1 Oct 2026 02:03:49 +0800 Subject: [PATCH] Apply the canonical Computer MCP family presentation --- .github/brand/social.png | Bin 0 -> 28894 bytes .github/workflows/validate.yml | 1 + AGENTS.md | 8 ++++++++ Documentation/Brand/header.svg | 13 +++++++++++++ README.md | 7 ++++++- Scripts/check-brand.py | 31 +++++++++++++++++++++++++++++++ Tests/test_build_package.py | 1 + brand.lock.json | 16 ++++++++++++++++ 8 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 .github/brand/social.png create mode 100644 Documentation/Brand/header.svg create mode 100644 Scripts/check-brand.py create mode 100644 brand.lock.json diff --git a/.github/brand/social.png b/.github/brand/social.png new file mode 100644 index 0000000000000000000000000000000000000000..a96057e5ace14ce6c9aa3104c799ac11e76caae2 GIT binary patch literal 28894 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 literal 0 HcmV?d00001 diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 53dc8c1..ecc8342 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -21,6 +21,7 @@ jobs: python-version: '3.13' - name: Verify deterministic declaration package run: | + python3 Scripts/check-brand.py python3 -m unittest discover -s Tests -p 'test_*.py' python3 Scripts/build_package.py dist > package-receipt.json - uses: actions/upload-artifact@v7 diff --git a/AGENTS.md b/AGENTS.md index 1cc8695..0638bc7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -162,3 +162,11 @@ Read `README.md` and `computer-mcp-plugin.toml` before changing this package. without explicit authorization. - Preserve native AX fallback and never replay an uncertain write through a second backend. Real GUI verification requires a disposable, authorized target. + +## Brand delivery + +The main Computer MCP repository owns ProductIdentity and BRAND. Imported +`Documentation/Brand/header.svg` travels with the packaged manual; +`.github/brand/social.png` supplies the repository preview. `brand.lock.json` +binds both to canonical exports. Run `python3 Scripts/check-brand.py` locally +and in CI. Update imports with the main repository's `Scripts/brand.py sync`. diff --git a/Documentation/Brand/header.svg b/Documentation/Brand/header.svg new file mode 100644 index 0000000..db4fa76 --- /dev/null +++ b/Documentation/Brand/header.svg @@ -0,0 +1,13 @@ + + Computer MCP — Computer Use + + + + + First-party plugin + Computer MCP + Computer Use + + Native desktop observation and actions + + diff --git a/README.md b/README.md index 3a6c906..d98033a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ -# Computer Use Plugin +![Computer MCP — Computer Use](Documentation/Brand/header.svg) + +# Computer MCP — Computer Use + +Part of the [Computer MCP](https://computer-mcp.github.io/) family. +**Let ChatGPT use your local tools.** A declarative Computer MCP package that connects to the vendor's native Computer Use MCP server and supplies observation/action verification guidance. diff --git a/Scripts/check-brand.py b/Scripts/check-brand.py new file mode 100644 index 0000000..1cb6c74 --- /dev/null +++ b/Scripts/check-brand.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +"""Verify a repository's locked Computer MCP brand delivery without a source checkout.""" + +import hashlib +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +LOCK = ROOT / "brand.lock.json" +if not LOCK.exists(): + LOCK = ROOT / "public/brand/brand.lock.json" +record = json.loads(LOCK.read_text()) +assert record["schema_version"] == 1, "Unsupported brand lock" +assert record["source"] == "https://github.com/computer-mcp/computer-mcp", "Unexpected brand authority" +for name, expected in record["files"].items(): + path = ROOT / name + assert path.resolve().is_relative_to(ROOT), f"Invalid delivery path: {name}" + assert hashlib.sha256(path.read_bytes()).hexdigest() == expected, f"Brand delivery drift: {name}" +if record["consumer"] == "computer-mcp.github.io": + text = (ROOT / "index.html").read_text() + for promise in record["promise"].values(): + assert promise in text, "Website promise differs from the imported brand" + assert 'brand/social-en.png' in text, "Website sharing artwork differs" +else: + manual = ROOT / ("profile/README.md" if record["consumer"] == ".github" else "README.md") + text = manual.read_text() + assert record["name"] in text, "Master name missing from public entry point" + assert record["promise"]["en"] in text, "Master promise missing from public entry point" + header = "brand/header.svg" if record["consumer"] == ".github" else "Documentation/Brand/header.svg" + assert header in text, "Family header missing from public entry point" +print(f"Locked Computer MCP brand verified for {record['consumer']}") diff --git a/Tests/test_build_package.py b/Tests/test_build_package.py index d1400cc..75b2573 100644 --- a/Tests/test_build_package.py +++ b/Tests/test_build_package.py @@ -28,6 +28,7 @@ def test_reproducible_owned_contents(self): "Documentation/Architecture/README.md", "Documentation/Architecture/Package.md", "Documentation/Architecture/Documentation.md", + "Documentation/Brand/header.svg", "skills/observe-act-verify/SKILL.md", "skills/observe-act-verify/agents/openai.yaml", }) diff --git a/brand.lock.json b/brand.lock.json new file mode 100644 index 0000000..a1642cf --- /dev/null +++ b/brand.lock.json @@ -0,0 +1,16 @@ +{ + "schema_version": 1, + "source": "https://github.com/computer-mcp/computer-mcp", + "revision": "3c498108b1b847ae126fd2593cd0d3ddb4d0d9858d0dae214b1439ff69226e50", + "consumer": "plugin-computer-use", + "name": "Computer MCP", + "promise": { + "en": "Let ChatGPT use your local tools.", + "zh-CN": "\u8ba9 ChatGPT\uff0c\u7528\u4e0a\u4f60\u7684\u672c\u673a\u5de5\u5177\u3002" + }, + "files": { + "Documentation/Brand/header.svg": "5594001e817a193ddf54aecdfe95f68e63f27f6398889135a0664f9d5ca7a7ee", + ".github/brand/social.png": "c5aaa0fe908d812b78597478d8b5c21edc30f98ae007de1461bde95dc39fa2cf", + "Scripts/check-brand.py": "2ec3c64469774b48fbfa6fbfa7f6a35c6a172fe4de347beb1881766632fbfdde" + } +}