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"])