From c83a808320e2bfdcbea96955d5f7c88399eb8ac6 Mon Sep 17 00:00:00 2001 From: davion-knight <298846663+davion-knight@users.noreply.github.com> Date: Mon, 13 Jul 2026 04:55:02 -0500 Subject: [PATCH] feat(miner-extension): add a standard icon set to the manifest The extension manifest defined no icons. Add a 16/32/48/128 PNG icon set (a dark 'G' mark on the extension's mint accent, matching the opportunity badge) wired into both manifest.icons and the toolbar action's default_icon, and include them in the build package's file list so the packaged extension ships every icon it references. Fixes #4862 --- .../icons/icon-128.png | Bin 0 -> 1385 bytes .../icons/icon-16.png | Bin 0 -> 221 bytes .../icons/icon-32.png | Bin 0 -> 354 bytes .../icons/icon-48.png | Bin 0 -> 496 bytes apps/gittensory-miner-extension/manifest.json | 13 +++- scripts/build-miner-extension.mjs | 8 ++- test/unit/miner-extension-icons.test.ts | 56 ++++++++++++++++++ 7 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 apps/gittensory-miner-extension/icons/icon-128.png create mode 100644 apps/gittensory-miner-extension/icons/icon-16.png create mode 100644 apps/gittensory-miner-extension/icons/icon-32.png create mode 100644 apps/gittensory-miner-extension/icons/icon-48.png create mode 100644 test/unit/miner-extension-icons.test.ts diff --git a/apps/gittensory-miner-extension/icons/icon-128.png b/apps/gittensory-miner-extension/icons/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..acc7ab28e23dfd5fe5e12f28b0ddeae369bf8915 GIT binary patch literal 1385 zcmV-v1(y1WP)jaDIu1XB+m+{ z5p7G}tx8@_o#mF~*}NR=4&n7iyOPIqD?*?elnKuQ?%WTRY->v{0xmZ zYY}FB3x5ft&C{|kU%!UA-q5nG#7PVMf9!DptA3HM62_GOFMj18IQ?{S zMf$t?T;GXmJ|NT|cd`Cny#4Z_cz*V#c>3x^aqs?vMxm2~Vm|1_lc;AcA?*fC~8G^fTJ_}wNIh4?EBaOjlAUFgcHxRr6 zfFkxGO??~JpfLh~9wPcSk^ESsvHFrZmG8F%LEC{L!qA}M81_wZwK2)Z7>^!=S zJ5Y)lbo?X7FO0YhPt2@So#c7%>$rIziEk)8jG(L!_G(ZubkW(BX7b-W8VW>iEE8$P_gh^l9BPqhFaUJ1>?;lH zdRzctAOKjM^Z@`KP5<`c7Xg5QJh?9QQ9=a(JOY4K*8~6ts`>>0o&un&+CKmQ0000k z000mK0szuL0Kh~L0AMN@0I(PY09XzN02G8!5JE{9C1DhWQWQ#AIA!5%3}IskTf^8I z#^z8qhq67K?cp2{!2uB*5yKHN91_JLQ5+M;F>xFe$w84E70Xev92U)C(Hs}gaq(Oj z!G#fA8H4b-G>S{3xHgV!;|vxlaB*bh00=22;Of{8QbaC~ju-$5*T(~Z{j~$j)}X5J z@rkEi0iaq%v=|#$uKW!O0M>xutKhu{z&;REXgZ{8(7W_bp9LQb0B-I(kVf_ahN^H= z?+A%!K>^@q=AaF!D&=aELFgGht3G^*=-UEd8|sfckVit z0IVbW!O(SD3jiw^5iP9*fCY?*mKFlQ6h=f#Q>T{X*$!qzM>|(F;($o~{~iG5FeEyf zyZsi^d;pYf-OZNdSqfvKq4W>{CIo|V1b>pXJJhfOk!nA&K*YZP003q%Dp;DiIxWew zCCmzrmaa)-l`ybXzoxCs3N|p$d)nL@_16ResbPpIAC>^kZwdlp0*`!tXTm2t2t3+v z0fHHmMK&jSYUlYK0U;$oG!y8hZj4sO1}PR{G>uPt@%1giFfS{MunPTZ`|6)!4r{F} rG+mT~U1K3yYxuh4;o@%rXUFXi#^RMR-nz1n00000NkvXXu0mjfkbi7= literal 0 HcmV?d00001 diff --git a/apps/gittensory-miner-extension/icons/icon-16.png b/apps/gittensory-miner-extension/icons/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..ef4576ea84bc877a57a12240a76f9b4dd1fc593c GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFUg1Ln>}1Cjh~U>V4`9-u;~S zyY&3`Kk7owSJ(^`GXMFj@g*o+OyikukT6-pV)vi@$&P>OW%=0+*fu&Q-MEq@Az-!m z-Ts!QNA-@0g(5sc%qJh3GNf?(Y+kkXX8rzkLO^wiZ3}j@9A%ggoH*-rer{8D^NnK* z?>c)IHymQ1^V#dm31bjzM-LV6*%`opAzk zu)iMw2fPPI2Q*&(4-jr(pizP&I$<)9qcM5Yk literal 0 HcmV?d00001 diff --git a/apps/gittensory-miner-extension/icons/icon-48.png b/apps/gittensory-miner-extension/icons/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..ccaf2d2beaed2198981e913f1e14989942136b9f GIT binary patch literal 496 zcmVy`fIpCOJ|S{s zgSu=U^Kx=8J8)px$t368+Wqfr$l`|7!$vt6++!IR7L&g3mnS6dNcZ1P=2G#1c@+xXmRPyq8w`c*b z5jNE2@M#y2d2GCF;_lxU3HXzHi%Rq}W~+U9(RpYa}56R(3TM3b>tsoeOaY zV)AK}#Xv@WDnWiS$6`87enG=xNlAWD&thAJ#l{w!t;G~Jcgb(BlRw~~eZ)lmkdMVN mEBS+N7FP{eT=t-N-R28xV3Yh~vHs!!0000 { + const SIZES = [16, 32, 48, 128] as const; + + it("declares an icon set at the standard sizes in the manifest", () => { + for (const size of SIZES) { + expect(manifest.icons[String(size)]).toBe(`icons/icon-${size}.png`); + } + }); + + it("wires the toolbar action's default_icon at 16/32/48", () => { + for (const size of [16, 32, 48] as const) { + expect(manifest.action.default_icon[String(size)]).toBe( + `icons/icon-${size}.png`, + ); + } + }); + + it("ships every declared icon as a real RGBA PNG whose dimensions match its declared size", () => { + for (const size of SIZES) { + const rel = manifest.icons[String(size)] as string; + const path = `${EXT}/${rel}`; + expect(existsSync(path), `${rel} exists`).toBe(true); + const png = readPng(path); + expect(png.valid, `${rel} is a valid PNG`).toBe(true); + expect(png.width).toBe(size); + expect(png.height).toBe(size); + expect(png.colorType).toBe(6); // 6 = truecolor + alpha (RGBA) + } + }); +});