From a08f4008caa710cc5e3bc14264c46c72ad109950 Mon Sep 17 00:00:00 2001 From: Supriya Sanjay Date: Fri, 2 Oct 2026 15:27:49 -0400 Subject: [PATCH 1/3] Add Claude directory metadata --- .claude-plugin/icon.png | Bin 0 -> 29728 bytes .claude-plugin/plugin.json | 2 ++ tests/test_repository_layout.py | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 .claude-plugin/icon.png diff --git a/.claude-plugin/icon.png b/.claude-plugin/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..977cdd29c7cdab77d8c03155e5c3253475c5d7ee GIT binary patch literal 29728 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 XHV1~Epxt>vf-mKG>M`ljtegJ;%>wDo literal 0 HcmV?d00001 diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index eb17efc..aafe396 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -2,11 +2,13 @@ "name": "parallel", "version": "0.10.0", "description": "Web search and page fetching through Parallel's hosted MCP server — free, no account or API key needed — plus CLI-backed deep research, data enrichment, entity discovery (FindAll), and web monitoring.", + "icon": "./.claude-plugin/icon.png", "author": { "name": "Parallel Web Systems", "email": "support@parallel.ai" }, "homepage": "https://docs.parallel.ai/home", + "privacyPolicyUrl": "https://parallel.ai/privacy-policy", "repository": "https://github.com/parallel-web/parallel-agent-skills", "license": "MIT", "keywords": [ diff --git a/tests/test_repository_layout.py b/tests/test_repository_layout.py index 422818d..6d75b84 100644 --- a/tests/test_repository_layout.py +++ b/tests/test_repository_layout.py @@ -76,6 +76,24 @@ def test_claude_marketplace_uses_productivity_category(self): self.assertEqual("productivity", marketplace["plugins"][0]["category"]) + def test_claude_manifest_declares_directory_metadata(self): + manifest = json.loads(CLAUDE_PLUGIN_MANIFEST.read_text(encoding="utf-8")) + icon_path = REPO_ROOT / manifest["icon"] + icon = icon_path.read_bytes() + + self.assertEqual("./.claude-plugin/icon.png", manifest["icon"]) + self.assertTrue(icon_path.is_file()) + self.assertTrue(icon.startswith(b"\x89PNG\r\n\x1a\n")) + dimensions = tuple( + int.from_bytes(icon[offset : offset + 4], "big") for offset in (16, 20) + ) + + self.assertEqual((1024, 1024), dimensions) + self.assertLess(len(icon), 2 * 1024 * 1024) + self.assertEqual( + "https://parallel.ai/privacy-policy", manifest["privacyPolicyUrl"] + ) + def test_codex_manifest_uses_live_policy_urls(self): manifest = json.loads(CODEX_PLUGIN_MANIFEST.read_text(encoding="utf-8")) interface = manifest["interface"] From ebe666e32b559748ddf445f6103f6f98c8d1940a Mon Sep 17 00:00:00 2001 From: Supriya Sanjay Date: Fri, 2 Oct 2026 15:51:27 -0400 Subject: [PATCH 2/3] Use dark Parallel directory icon --- .claude-plugin/icon.png | Bin 29728 -> 8613 bytes tests/test_repository_layout.py | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.claude-plugin/icon.png b/.claude-plugin/icon.png index 977cdd29c7cdab77d8c03155e5c3253475c5d7ee..44f2e1cdab2d463b14a38945395e68a362ad92ff 100644 GIT binary patch literal 8613 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 ZFZJi)wUO3HTY0p$o95JwOM) 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 XHV1~Epxt>vf-mKG>M`ljtegJ;%>wDo diff --git a/tests/test_repository_layout.py b/tests/test_repository_layout.py index 6d75b84..ac0f24b 100644 --- a/tests/test_repository_layout.py +++ b/tests/test_repository_layout.py @@ -88,7 +88,10 @@ def test_claude_manifest_declares_directory_metadata(self): int.from_bytes(icon[offset : offset + 4], "big") for offset in (16, 20) ) - self.assertEqual((1024, 1024), dimensions) + self.assertEqual(dimensions[0], dimensions[1]) + for dimension in dimensions: + self.assertGreaterEqual(dimension, 512) + self.assertLessEqual(dimension, 2048) self.assertLess(len(icon), 2 * 1024 * 1024) self.assertEqual( "https://parallel.ai/privacy-policy", manifest["privacyPolicyUrl"] From 4e45f6b4b4cb8c208474fef342b36988e013b426 Mon Sep 17 00:00:00 2001 From: George Pickett Date: Mon, 5 Oct 2026 10:27:51 -0700 Subject: [PATCH 3/3] Use automatic directory icon discovery --- .claude-plugin/plugin.json | 1 - tests/test_repository_layout.py | 21 --------------------- 2 files changed, 22 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index aafe396..afd2ede 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -2,7 +2,6 @@ "name": "parallel", "version": "0.10.0", "description": "Web search and page fetching through Parallel's hosted MCP server — free, no account or API key needed — plus CLI-backed deep research, data enrichment, entity discovery (FindAll), and web monitoring.", - "icon": "./.claude-plugin/icon.png", "author": { "name": "Parallel Web Systems", "email": "support@parallel.ai" diff --git a/tests/test_repository_layout.py b/tests/test_repository_layout.py index ac0f24b..422818d 100644 --- a/tests/test_repository_layout.py +++ b/tests/test_repository_layout.py @@ -76,27 +76,6 @@ def test_claude_marketplace_uses_productivity_category(self): self.assertEqual("productivity", marketplace["plugins"][0]["category"]) - def test_claude_manifest_declares_directory_metadata(self): - manifest = json.loads(CLAUDE_PLUGIN_MANIFEST.read_text(encoding="utf-8")) - icon_path = REPO_ROOT / manifest["icon"] - icon = icon_path.read_bytes() - - self.assertEqual("./.claude-plugin/icon.png", manifest["icon"]) - self.assertTrue(icon_path.is_file()) - self.assertTrue(icon.startswith(b"\x89PNG\r\n\x1a\n")) - dimensions = tuple( - int.from_bytes(icon[offset : offset + 4], "big") for offset in (16, 20) - ) - - self.assertEqual(dimensions[0], dimensions[1]) - for dimension in dimensions: - self.assertGreaterEqual(dimension, 512) - self.assertLessEqual(dimension, 2048) - self.assertLess(len(icon), 2 * 1024 * 1024) - self.assertEqual( - "https://parallel.ai/privacy-policy", manifest["privacyPolicyUrl"] - ) - def test_codex_manifest_uses_live_policy_urls(self): manifest = json.loads(CODEX_PLUGIN_MANIFEST.read_text(encoding="utf-8")) interface = manifest["interface"]