From ba56ef312df23819f9988bc69eb844b8bcae0c02 Mon Sep 17 00:00:00 2001 From: Elliot Chen Date: Tue, 22 Sep 2026 19:11:18 +0800 Subject: [PATCH] chore: add EverMe branding to Codex plugin --- cli/internal/plugin/codex_marketplace_test.go | 19 ++++++++++++++++-- plugins/everme/.codex-plugin/plugin.json | 4 +++- plugins/everme/assets/everme-logo.png | Bin 0 -> 11628 bytes 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 plugins/everme/assets/everme-logo.png diff --git a/cli/internal/plugin/codex_marketplace_test.go b/cli/internal/plugin/codex_marketplace_test.go index d713b45..2ac4984 100644 --- a/cli/internal/plugin/codex_marketplace_test.go +++ b/cli/internal/plugin/codex_marketplace_test.go @@ -1,7 +1,9 @@ package plugin import ( + "bytes" "encoding/json" + "image/png" "os" "path/filepath" "runtime" @@ -94,8 +96,10 @@ func TestCodexMarketplaceStructure(t *testing.T) { Skills string `json:"skills"` Hooks string `json:"hooks"` Interface struct { - DisplayName string `json:"displayName"` - Category string `json:"category"` + DisplayName string `json:"displayName"` + Category string `json:"category"` + Logo string `json:"logo"` + ComposerIcon string `json:"composerIcon"` } `json:"interface"` } require.NoError(t, json.Unmarshal(pluginRaw, &plugin), "plugin.json must parse as JSON") @@ -113,6 +117,17 @@ func TestCodexMarketplaceStructure(t *testing.T) { assert.Equal(t, "./hooks/hooks.json", plugin.Hooks, "hooks must point at the bundled Codex lifecycle registration") assert.NotEmpty(t, plugin.Interface.DisplayName) assert.NotEmpty(t, plugin.Interface.Category) + assert.Equal(t, "./assets/everme-logo.png", plugin.Interface.Logo) + assert.Equal(t, "./assets/everme-logo.png", plugin.Interface.ComposerIcon) + + logoPath := filepath.Join(pluginRoot, "assets", "everme-logo.png") + logoRaw, err := os.ReadFile(logoPath) + require.NoError(t, err, "plugin logo must exist at %s", logoPath) + logoConfig, err := png.DecodeConfig(bytes.NewReader(logoRaw)) + require.NoError(t, err, "plugin logo must be a valid PNG") + assert.Equal(t, logoConfig.Width, logoConfig.Height, "plugin logo must be square") + assert.GreaterOrEqual(t, logoConfig.Width, 48, "plugin logo must meet OpenAI's minimum dimensions") + assert.LessOrEqual(t, logoConfig.Width, 4096, "plugin logo must meet OpenAI's maximum dimensions") // Native lifecycle hooks now save completed turns independently of // whether the LLM chooses an MCP tool, so the marketplace capability diff --git a/plugins/everme/.codex-plugin/plugin.json b/plugins/everme/.codex-plugin/plugin.json index 249912a..10e6889 100644 --- a/plugins/everme/.codex-plugin/plugin.json +++ b/plugins/everme/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "everme", - "version": "0.7.2", + "version": "0.7.3", "description": "Persistent memory recall and lifecycle capture for Codex sessions via EverMe.", "author": { "name": "EverMind AI", @@ -32,6 +32,8 @@ "Load my EverMe memory for this Codex session.", "Recall what we decided about EverMe last time." ], + "logo": "./assets/everme-logo.png", + "composerIcon": "./assets/everme-logo.png", "websiteURL": "https://everme.evermind.ai" } } diff --git a/plugins/everme/assets/everme-logo.png b/plugins/everme/assets/everme-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb92150825ed0cfbf0c14f7cffcb585761ac4ce GIT binary patch literal 11628 zcmb7~by%Chwy&|GrBI+qad&qwP^`E+6o*3a;I748i={ZExND2MySrO(=cN1Yv+q9l z+X$Hy}Jc7sp1A_@8 z`&mrg9roA&#T!R*_H|AktJ8;?2sR0rk6+2Wblfc&^-c?XWbbxxCo@ zEMl%4DYqZQSREKayBcxoxlS?Y8Q{OnOA#Dr_TcrZ$WX#Hm6$ys&w-L<^ju`vR#s}% zQBqQ#eSon3`sU(7m*;E}q|w(JlWrjBW;Z1$S~T*z^*Bl;tA>;HEMaAL_vtvQ9pN^}~=!+#d<>Ats#8h#2lZ8K> zb+GD%axF%p*8plj%Vl&RZJwIfR3xuu+Ux#v!eei4P&u043Nm*P`Na5TH%c^ga|g0(@9U|j0T?$A4$$2kLg;y6xEj+ z@*==0c&VHIskz?>KAyIA`Y8BxmO0PbQ1OSOjbDFS6|L|U0C`p@d{;RD>#o3pVqAfK znI5~Jqs(e==zf6!Zvcx`uUWC5zqkPh+#3ulg;&}xymy7PD}PL%vsk}GOixZF4j$^kS4haZ_m zN=>t)BO}pE{H44o%%r9xm(Cog$hx36Se2Y_d}Uvdue5M25WvD?PGR&UUB56;h= z*K2vNtjwH*+B(Ztupe_s1vF5!N>0u4XgS6nOH!LqSx;>y4S>NZw@TA}lC`t5kk6?N zXvT*xPu&UaH!>64Uu@>{^&8fZ{C)Vo68xrWIjzJQWku62uHVxmCa}4+w9-BK(Q^O~ zmcK(fzj&Q9OQ3Eb*1`qI0OIH5mBm=0MRHFd(^yY^AcVb#ks7P@zxL$f1ZI7)(jaOT z8(s5&>mU+(zn}RNF4oIHZ7w-Di{-vddZA`Zo%qR^`iNM_I9ON5;hcLqfs6RzRHdsEy>%9Av6|)$7`@@Pa(2xzrq1^Qz}I}s zRI8YUlrIvy`7@*__UL|kx+Bx6|BBvpo$>}>NW>gW+)?6394&n&Lg3e8ic`4EL8N8C zftjat98;d9M@~(R$--5i_g8fdcWN?% zpoorO+S;~YZQlF0wlW_0A@n)9n52I?sVl*6OQ^%l*;1&vH}Zi$xW$MAxi<2%0Ed{{ z*!d{5C$?%~WI1FCeAX)#3d&&)lcPL9j(8gtb@3< z??33S$>BPvtP$W~-`uNr6BJ!_3-f0CIw%fZA!Y#X9Ri!gBm5x9k>}4*oWb#RfovEj)%U zERnqk8dW(;^mT)hzsA!~DhPa~_{y6>Us9B=ik-anm|l?SV`1azMIL1P+0=12&4^4R zL0E@FPY1u=Qc222IJ=Rmw$3==SaZ1=lYvWv=oY8Dr{WGGm+;wNkle#5z;|dyf=!Zz z##w*|DV0u^t@R40cRX@aWr(M3UM?t*oun_ zh3~{f{?D-@<#TwNNuJ1Ndp_c^p&+St5b1ZmB$bsS3={}_capKOEBdZy#qVQis8fxU zcAX}Zc2-N0uq#txaEe*Vwc|QLFgS9@w(Np(0~R~u9}Z!Bc)(-R87Y5MS%@ySh;o5K zn*;cV1Iz+u5rD}5=?P~D_rZx{JogCJwEeVPYqHSZJEx}rv%z@jv&IU9fwfyg`5aaa@)Kzi-}+n3~{QK|gpgjMz)jil4^(S6czEIz*rSnDIQ46jl)K z3%$$Wx6qC?b}S#y-YZkUk`mC6Np9!*ELMH&uLE2Kz*+9D&K%4){OW*)xfQJ2r-M7) z^b+&X(fR5E4{RkAz)5Rf0XUg7L2W`}9ZwXl{QXx|QP;8Jk49>8;tgnsgxqBupkEqu z4Sm_q-iFJcWWVuangR~YpLdRkT-djw(`2=X)$&?M$#eOYlStS>zgTGt$f

nBL;v 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