From 746d0583ee6ee01698e77e96f25279f2ec75d8bd Mon Sep 17 00:00:00 2001 From: bntvllnt <32437578+bntvllnt@users.noreply.github.com> Date: Sun, 27 Sep 2026 19:26:14 +0200 Subject: [PATCH] feat: add Claude plugin icon and clearer description (0.1.0-canary.2) Claude-Session: https://claude.ai/code/session_01QibzbuYP9NMPNKJdURfxfE --- .claude-plugin/marketplace.json | 2 +- CHANGELOG.md | 4 ++++ README.md | 1 + VERSION | 2 +- assets/claude-icon.svg | 10 ++++++++++ plugins/claude/.claude-plugin/icon.svg | 10 ++++++++++ plugins/claude/.claude-plugin/plugin.json | 4 ++-- plugins/claude/SOURCE.json | 3 ++- plugins/codex/SOURCE.json | 2 +- plugins/codex/plugin.json | 4 ++-- plugins/cursor/.cursor-plugin/plugin.json | 4 ++-- plugins/cursor/SOURCE.json | 2 +- scripts/sync.py | 9 +++++++-- tests/test_sync.py | 1 + 14 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 assets/claude-icon.svg create mode 100644 plugins/claude/.claude-plugin/icon.svg diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 6d3b1f4..c486983 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -1,5 +1,5 @@ { - "description": "Vstack portable workflows and engineering principles for Claude Code.", + "description": "Evidence-led engineering workflows to plan, build, review, and ship software, with shared thinking, orchestration, and collaboration principles.", "name": "vllnt-stack", "owner": { "name": "vllnt" diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f48cf4..1c5661c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +## 0.1.0-canary.2 + +- Add a Claude plugin icon owned by this repository (`assets/claude-icon.svg`) and a clearer shared plugin and Claude marketplace description, both through the generator. + - Record Claude Code installation of `0.1.0-canary.1` from the public GitHub marketplace source; skill invocation behavior remains unverified. ## 0.1.0-canary.1 diff --git a/README.md b/README.md index 4f10ee9..5ea569f 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Then start a new chat and invoke a namespaced skill such as `/vstack:plan-work`. | `upstream.lock.json` | Trusted upstream repository and immutable commit | | `VERSION` | Shared distribution version | | `scripts/sync.py` | Standard-library generator and read-only drift check | +| `assets/claude-icon.svg` | Claude plugin icon, copied into the Claude package as `.claude-plugin/icon.svg` | | `plugins/claude/` | Generated Claude Code native plugin | | `plugins/codex/` | Generated portable Agent Plugin for Codex | | `plugins/cursor/` | Generated Cursor native plugin and principles rule | diff --git a/VERSION b/VERSION index 5e06194..2de5777 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0-canary.1 +0.1.0-canary.2 diff --git a/assets/claude-icon.svg b/assets/claude-icon.svg new file mode 100644 index 0000000..1f4882c --- /dev/null +++ b/assets/claude-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/claude/.claude-plugin/icon.svg b/plugins/claude/.claude-plugin/icon.svg new file mode 100644 index 0000000..1f4882c --- /dev/null +++ b/plugins/claude/.claude-plugin/icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/plugins/claude/.claude-plugin/plugin.json b/plugins/claude/.claude-plugin/plugin.json index c2f50f6..e71b6ec 100644 --- a/plugins/claude/.claude-plugin/plugin.json +++ b/plugins/claude/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "author": { "name": "vllnt" }, - "description": "Vstack portable workflows and engineering principles.", + "description": "Evidence-led engineering workflows to plan, build, review, and ship software, with shared thinking, orchestration, and collaboration principles.", "homepage": "https://github.com/vllnt/stack", "keywords": [ "workflows", @@ -13,5 +13,5 @@ "license": "MIT", "name": "vstack", "repository": "https://github.com/vllnt/stack", - "version": "0.1.0-canary.1" + "version": "0.1.0-canary.2" } diff --git a/plugins/claude/SOURCE.json b/plugins/claude/SOURCE.json index ff50159..3df7b24 100644 --- a/plugins/claude/SOURCE.json +++ b/plugins/claude/SOURCE.json @@ -1,6 +1,7 @@ { "files": { - ".claude-plugin/plugin.json": "029df1dbf5659bdedbc95b13a5c14c41957984dfee6b77b86e6b54cb742a2de1", + ".claude-plugin/icon.svg": "dc3b420724330eed1296c63c5c6d3290fa031d0eceb39180a2258f6992c76108", + ".claude-plugin/plugin.json": "0919a260d3a18cb7ff5af325773db6fe870ca9530707d40321c440e4405ee147", "LICENSE": "24ba061a4603738ddd5105ef4abc198eeded5ac7efce23b360561816f4dd6559", "skills/build-landing-page/README.md": "46a280eadac8962180cf3f0c42eb0e845a3b0156a644569182d932881e1d51f8", "skills/build-landing-page/SKILL.md": "b08e4963d6149f3647b28a0d9dccdc8793812abab95a1d081d93699e142de0f0", diff --git a/plugins/codex/SOURCE.json b/plugins/codex/SOURCE.json index 7af8334..fdefa4f 100644 --- a/plugins/codex/SOURCE.json +++ b/plugins/codex/SOURCE.json @@ -1,7 +1,7 @@ { "files": { "LICENSE": "24ba061a4603738ddd5105ef4abc198eeded5ac7efce23b360561816f4dd6559", - "plugin.json": "01f8bb9782de6474631228eaff7938845536ec3e87b5d8ec8fe3008dea678448", + "plugin.json": "49d516ebfeb52c9e1822809a2a3297383049163540f5bcf22f025238ce3adb32", "skills/build-landing-page/README.md": "46a280eadac8962180cf3f0c42eb0e845a3b0156a644569182d932881e1d51f8", "skills/build-landing-page/SKILL.md": "b08e4963d6149f3647b28a0d9dccdc8793812abab95a1d081d93699e142de0f0", "skills/build-landing-page/references/copywriting-formulas.md": "6d19f6166e1badcfdda0af4f8b303160e94ee6e6149321157e12849654cc013e", diff --git a/plugins/codex/plugin.json b/plugins/codex/plugin.json index 346a29f..30903eb 100644 --- a/plugins/codex/plugin.json +++ b/plugins/codex/plugin.json @@ -3,8 +3,8 @@ "author": { "name": "vllnt" }, - "description": "Vstack portable workflows and engineering principles.", + "description": "Evidence-led engineering workflows to plan, build, review, and ship software, with shared thinking, orchestration, and collaboration principles.", "license": "MIT", "name": "vstack", - "version": "0.1.0-canary.1" + "version": "0.1.0-canary.2" } diff --git a/plugins/cursor/.cursor-plugin/plugin.json b/plugins/cursor/.cursor-plugin/plugin.json index 4fd93b1..51e1c50 100644 --- a/plugins/cursor/.cursor-plugin/plugin.json +++ b/plugins/cursor/.cursor-plugin/plugin.json @@ -2,8 +2,8 @@ "author": { "name": "vllnt" }, - "description": "Vstack portable workflows and engineering principles.", + "description": "Evidence-led engineering workflows to plan, build, review, and ship software, with shared thinking, orchestration, and collaboration principles.", "license": "MIT", "name": "vstack", - "version": "0.1.0-canary.1" + "version": "0.1.0-canary.2" } diff --git a/plugins/cursor/SOURCE.json b/plugins/cursor/SOURCE.json index 9dc4196..36a2dbb 100644 --- a/plugins/cursor/SOURCE.json +++ b/plugins/cursor/SOURCE.json @@ -1,6 +1,6 @@ { "files": { - ".cursor-plugin/plugin.json": "04856abc090a6a763556b93285974a550c3018ade4002f656c91b0e5623f1068", + ".cursor-plugin/plugin.json": "1cc6f42293e41b85702cc04ca4aa89022eb0783f9a543af886f04f4f952b8f4f", "LICENSE": "24ba061a4603738ddd5105ef4abc198eeded5ac7efce23b360561816f4dd6559", "rules/vstack-principles.mdc": "5234bc0506e0a328d6163cd83785d2f37dd1fc23ef84287d71e03b92459e064a", "skills/build-landing-page/README.md": "46a280eadac8962180cf3f0c42eb0e845a3b0156a644569182d932881e1d51f8", diff --git a/scripts/sync.py b/scripts/sync.py index 8996b3a..725eca9 100644 --- a/scripts/sync.py +++ b/scripts/sync.py @@ -21,6 +21,9 @@ ROOT = Path(__file__).resolve().parents[1] UPSTREAM = "https://github.com/vllnt/skills.git" REPOSITORY = "https://github.com/vllnt/stack" +DESCRIPTION = ("Evidence-led engineering workflows to plan, build, review, and ship software, " + "with shared thinking, orchestration, and collaboration principles.") +CLAUDE_ICON = ROOT / "assets" / "claude-icon.svg" HOSTS = ("claude", "codex", "cursor") PRINCIPLES = tuple(f"vllnt-{name}-principles" for name in ("thinking", "orchestration", "collaboration")) MAX_ARCHIVE = 32 * 1024 * 1024 @@ -220,7 +223,7 @@ def build(files: dict[str, bytes], lock: dict, version: str) -> dict[str, bytes] output = {} for host in HOSTS: manifest = {"name": "vstack", "version": version, - "description": "Vstack portable workflows and engineering principles.", + "description": DESCRIPTION, "author": {"name": "vllnt"}, "license": "MIT"} if host == "claude": manifest.update({"homepage": REPOSITORY, "repository": REPOSITORY, @@ -230,6 +233,8 @@ def build(files: dict[str, bytes], lock: dict, version: str) -> dict[str, bytes] manifest_path = {"claude": ".claude-plugin/plugin.json", "codex": "plugin.json", "cursor": ".cursor-plugin/plugin.json"}[host] package = {**skills, "LICENSE": files["LICENSE"], manifest_path: encoded(manifest)} + if host == "claude": + package[".claude-plugin/icon.svg"] = CLAUDE_ICON.read_bytes() if host == "cursor": package["rules/vstack-principles.mdc"] = rule package["SOURCE.json"] = encoded({"upstream": lock, "files": { @@ -239,7 +244,7 @@ def build(files: dict[str, bytes], lock: dict, version: str) -> dict[str, bytes] catalog = {"name": "vllnt-stack", "owner": {"name": "vllnt"}, "plugins": [{"name": "vstack", "source": f"./plugins/{host}"}]} if host == "claude": - catalog["description"] = "Vstack portable workflows and engineering principles for Claude Code." + catalog["description"] = DESCRIPTION output[f".{host}-plugin/marketplace.json"] = encoded(catalog) output[".agents/plugins/marketplace.json"] = encoded({ "name": "vllnt-stack", "interface": {"displayName": "Vstack"}, diff --git a/tests/test_sync.py b/tests/test_sync.py index 548b641..6998182 100644 --- a/tests/test_sync.py +++ b/tests/test_sync.py @@ -53,6 +53,7 @@ def test_deterministic_standalone_packages_and_provenance(self): self.assertEqual(package["skills/test-work/SKILL.md"], files["workflows/test-work/SKILL.md"]) self.assertEqual("rules/vstack-principles.mdc" in package, host == "cursor") self.assertEqual(package["LICENSE"], files["LICENSE"]) + self.assertEqual(".claude-plugin/icon.svg" in package, host == "claude") claude = json.loads(first[".claude-plugin/marketplace.json"]) codex = json.loads(first[".agents/plugins/marketplace.json"]) cursor = json.loads(first[".cursor-plugin/marketplace.json"])