From c2c19673114ff536afefbe07f640f94d21e09cba 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 -> 29889 bytes .github/workflows/validate.yml | 1 + AGENTS.md | 8 ++++++++ Documentation/Brand/header.svg | 13 +++++++++++++ README.md | 7 ++++++- Scripts/check-brand.py | 31 +++++++++++++++++++++++++++++++ brand.lock.json | 16 ++++++++++++++++ 7 files changed, 75 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..596cd54d6038ef5f4242e223ecd67598ead19c6e GIT binary patch literal 29889 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 package-receipt.json - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 diff --git a/AGENTS.md b/AGENTS.md index f273b63..8d50532 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,3 +11,11 @@ Keep vendor installation, authentication, subscription/API usage, updates, plugi Use Python standard library only unless a dependency demonstrably removes required complexity. Tests must cover MCP initialization, tool discovery, stream-json parsing, permission-boundary rejection, cancellation, deterministic package contents, and executable archive mode. Before handoff run unit tests, the native non-model interface check, deterministic package build, Computer MCP package validation/doctor where available, and git status. Do not publish or create a release implicitly. + +## 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..3e4bfb1 --- /dev/null +++ b/Documentation/Brand/header.svg @@ -0,0 +1,13 @@ + + Computer MCP — Claude Code + + + + + First-party plugin + Computer MCP + Claude Code + + Claude Code CLI and streaming MCP adapter + + diff --git a/README.md b/README.md index 3118448..c9e7c67 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ -# Claude Code Plugin +![Computer MCP — Claude Code](Documentation/Brand/header.svg) + +# Computer MCP — Claude Code + +Part of the [Computer MCP](https://computer-mcp.github.io/) family. +**Let ChatGPT use your local tools.** An independent Computer MCP plugin for Claude Code. The same package contributes a canonical CLI Tree, a stdio MCP adapter and client-neutral usage Skills. It does not link Computer MCP Core or require a host release to add vendor behavior. 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/brand.lock.json b/brand.lock.json new file mode 100644 index 0000000..745410d --- /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-claude", + "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": "713529d7dc33dc58f41057da09a346955cb6fcb6a5cc4e1aff1939c51bf7f6c2", + ".github/brand/social.png": "52692bada153a18888d7bd37eb39c87d269f1b7e351f53b13d2f12d8ac069e61", + "Scripts/check-brand.py": "2ec3c64469774b48fbfa6fbfa7f6a35c6a172fe4de347beb1881766632fbfdde" + } +}