Show "works with" app logos and filter by app
@slashclone/integration-logos
Add a "works with" feature to a catalog or marketplace: each item shows logos of the apps it integrates with, and people can browse and filter search by app. Tags are detected from strong signals like env vars, hosts, and MCP servers before mentions, owners can override them, and logos come from simple-icons with a lettered fallback, an SVG safety check, and a dry-run retag job.
- Activity
- New: be the first to try it
- Installs
- 0 installs
- Likes
- 0 likes
- Clones
- 0 clones
- 1{
- 2 "name": "integration-logos",
- 3 "owner": "slashclone",
- 4 "version": "0.1.1",
- 5 "type": "skill",
- 6 "title": "Show \"works with\" app logos and filter by app",
- 7 "description": "Add a \"works with\" feature to a catalog or marketplace: each item shows logos of the apps it integrates with, and people can browse and filter search by app. Tags are detected from strong signals like env vars, hosts, and MCP servers before mentions, owners can override them, and logos come from simple-icons with a lettered fallback, an SVG safety check, and a dry-run retag job.",
- 8 "category": "other",
- 9 "license": "MIT",
- 10 "compat": [
- 11 "claude-code"
- 12 ],
- 13 "permissions": {
- 14 "shell": [
- 15 "node scripts/detect-integrations.mjs",
- 16 "node scripts/check-svg.mjs"
- 17 ],
- 18 "files": {
- 19 "read": [
- 20 "./examples/**",
- 21 "./data/**"
- 22 ],
- 23 "write": [
- 24 "./out/integrations*",
- 25 "./out/svg-check*"
- 26 ]
- 27 }
- 28 },
- 29 "tests": {
- 30 "cases": [
- 31 {
- 32 "name": "tags strong signals and skips weak mentions",
- 33 "inputs": {},
- 34 "checks": [
- 35 {
- 36 "type": "command_exits_zero",
- 37 "command": "node scripts/detect-integrations.mjs --catalog examples/catalog.json --item examples/item.json --out out/integrations.json"
- 38 },
- 39 {
- 40 "type": "file_contains",
- 41 "path": "out/integrations.json",
- 42 "text": "\"github\": \"mcp\""
- 43 },
- 44 {
- 45 "type": "file_contains",
- 46 "path": "out/integrations.json",
- 47 "text": "\"slack\": \"network\""
- 48 },
- 49 {
- 50 "type": "file_not_contains",
- 51 "path": "out/integrations.json",
- 52 "text": "\"make\""
- 53 },
- 54 {
- 55 "type": "file_not_contains",
- 56 "path": "out/integrations.json",
- 57 "text": "\"notion\""
- 58 },
- 59 {
- 60 "type": "file_not_contains",
- 61 "path": "out/integrations.json",
- 62 "text": "\"linear\""
- 63 },
- 64 {
- 65 "type": "file_not_contains",
- 66 "path": "out/integrations.json",
- 67 "text": "\"stripe\""
- 68 }
- 69 ]
- 70 },
- 71 {
- 72 "name": "counts aliases and capitalized names in the description",
- 73 "inputs": {
- 74 "data/item.json": "{\"name\":\"sync\",\"description\":\"Copies Notion pages into a Make scenario and files Linear issues.\"}"
- 75 },
- 76 "checks": [
- 77 {
- 78 "type": "command_exits_zero",
- 79 "command": "node scripts/detect-integrations.mjs --catalog examples/catalog.json --item data/item.json --out out/integrations.json"
- 80 },
- 81 {
- 82 "type": "file_contains",
- 83 "path": "out/integrations.json",
- 84 "text": "\"notion\": \"mention\""
- 85 },
- 86 {
- 87 "type": "file_contains",
- 88 "path": "out/integrations.json",
- 89 "text": "\"make\": \"mention\""
- 90 },
- 91 {
- 92 "type": "file_contains",
- 93 "path": "out/integrations.json",
- 94 "text": "\"linear\": \"mention\""
- 95 }
- 96 ]
- 97 },
- 98 {
- 99 "name": "passes a plain logo and rejects one with script",
- 100 "inputs": {
- 101 "data/logos/bad.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><script>alert(1)</script></svg>"
- 102 },
- 103 "checks": [
- 104 {
- 105 "type": "command_exits_zero",
- 106 "command": "node scripts/check-svg.mjs examples/logos"
- 107 },
- 108 {
- 109 "type": "command_exits_zero",
- 110 "command": "node scripts/check-svg.mjs data/logos --report out/svg-check.json --report-only"
- 111 },
- 112 {
- 113 "type": "file_contains",
- 114 "path": "out/svg-check.json",
- 115 "text": "has a script element"
- 116 },
- 117 {
- 118 "type": "file_contains",
- 119 "path": "out/svg-check.json",
- 120 "text": "\"ok\": false"
- 121 }
- 122 ]
- 123 }
- 124 ]
- 125 }
- 126}
