From 7ecd740f8251f72d7fbb09c28a40715df49cd7b9 Mon Sep 17 00:00:00 2001 From: richblack Date: Fri, 31 Jul 2026 20:39:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=93=81=E7=89=8C=20icon=20=E8=90=BD=E5=9C=B0?= =?UTF-8?q?=EF=BC=9A=E6=89=98=E7=9B=A4=EF=BC=8Fapp=EF=BC=8Fmsix=EF=BC=8Fla?= =?UTF-8?q?nding=20favicon=20=E7=94=A8=20leo=20=E7=9A=84=20CIS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用戶從 rag.arcrun.dev → install.arcrun.dev → 自己的 portal → 托盤, 四個地方應該看到同一個 icon。此前最不一致的就是托盤(Fyne 內建的通用 「儲存」圖示,main.go:1016 留著 TODO)。 素材真身=InkStoneCo/arcrun-cis/(leo 用 Claude Design 做的 CIS)。 托盤(trayicon.go,新檔) - macOS:template 單色(純黑+alpha),系統依選單列深淺自動反色。 ⚠️ fyne v2.5.3 只有 *theme.ThemedResource 才會走 systray.SetTemplateIcon (driver_desktop.go:169);傳一般 StaticResource 會走 SetIcon=不反色。 - Windows:完整墨底 icon(template 是 mac 專有)。 - 兩份都用 go:embed 內嵌,不讀外部路徑——打包後工作目錄不是原始碼目錄。 - 選單列用雙 chevron 而非完整方形字符:CIS 規定 26px 以下降級成 chevron, 方塊裡的字符只佔高度 ~28%,22pt 下只剩 ~4px 會糊掉。 app 圖示 - icon.png 換成 CIS 1024 原生;icns 重產含 16→1024 全套 Retina 階梯。 msix(Store) - 圖示改成預先產好、隨 repo 版控的 assets/store/(含 gen-store-assets.py 可重跑)。 - 修掉一個實際的變形 bug:舊版 `sips -z 150 310 icon.png` 會把方形 icon **橫向拉扁**成寬磚(實測產出的字符明顯變形),違反 CIS「never skew or stretch」。 寬磚改用橫式 lockup 等比置中於墨底。 - 補 71x71/310x310/targetsize-16/24/32/48/256,manifest 一併宣告; BackgroundColor 從 transparent 改成品牌 Ink #17181A。 landing favicon(rag.arcrun.dev) - LOGO_SVG 從琥珀金圓圈暫代圖換成 CIS 正式 mark(單色,CIS:彩色 chevron 在產品裡代表「這條關係是活的」,用在 logo 會是謊話)。 - 修掉名實不符:`/favicon.ico` 過去回的是 SVG 位元組卻標 image/svg+xml (線上實測 200 但 type=image/svg+xml),老瀏覽器與抓圖服務畫不出來。 現在 .ico 回真 ICO(16/32/48 三尺寸)、apple-touch-icon.png 回真 PNG(180)。 - 三個頁面(首頁/privacy/support)補上 icon link 宣告(此前完全沒有)。 ⚠️ installer 這次沒動:`install.arcrun.dev` 的真身是 `installer/oauth-prototype/worker.js`(不在本分支,見 wiki decisions-summary 「installer 有兩個 worker,改錯=白做」),另立一筆處理。 實測證據 - mac .app 執行檔內 grep 到 tray-template.png 位元組(sha f6af940d,位移 14001472); Windows exe 內 grep 到 tray-windows.png(sha 59f4f1ac);各自平台只嵌自己那份 (另一份被 linker 消掉=runtime.GOOS 編譯期常數,正確)。 - msix 重打包過 makemsix unpack 回讀驗證,包內 11 張圖示齊全。 - 已部署 arcrun-landing(版本 b79d19df)。繞快取實測 rag.arcrun.dev: favicon.ico→image/x-icon 1573B(3 icons,sha 151e645b=與本機產出同一顆)、 apple-touch-icon.png→image/png 180x180、首頁 head 三個 link 宣告都在。 ⚠️ 舊版 max-age=86400 的邊緣快取未 purge(無 zone token),24h 內自然過期。 Co-Authored-By: Claude Opus 5 (1M context) --- cmd/arcrun-tray/assets/store/README.md | 38 +++++ .../assets/store/Square150x150Logo.png | Bin 0 -> 4422 bytes .../assets/store/Square310x310Logo.png | Bin 0 -> 8968 bytes .../assets/store/Square44x44Logo.png | Bin 0 -> 1350 bytes .../store/Square44x44Logo.targetsize-16.png | Bin 0 -> 538 bytes .../store/Square44x44Logo.targetsize-24.png | Bin 0 -> 718 bytes .../store/Square44x44Logo.targetsize-256.png | Bin 0 -> 5662 bytes .../store/Square44x44Logo.targetsize-32.png | Bin 0 -> 834 bytes .../store/Square44x44Logo.targetsize-48.png | Bin 0 -> 1206 bytes .../assets/store/Square71x71Logo.png | Bin 0 -> 2145 bytes cmd/arcrun-tray/assets/store/StoreLogo.png | Bin 0 -> 1497 bytes .../assets/store/Wide310x150Logo.png | Bin 0 -> 5330 bytes .../assets/store/gen-store-assets.py | 108 +++++++++++++ cmd/arcrun-tray/assets/tray-template.png | Bin 0 -> 412 bytes cmd/arcrun-tray/assets/tray-windows.png | Bin 0 -> 1494 bytes cmd/arcrun-tray/build-msix.sh | 147 ++++++++++++++++++ cmd/arcrun-tray/icon.png | Bin 4176 -> 11838 bytes cmd/arcrun-tray/main.go | 3 +- cmd/arcrun-tray/trayicon.go | 44 ++++++ 19 files changed, 338 insertions(+), 2 deletions(-) create mode 100644 cmd/arcrun-tray/assets/store/README.md create mode 100644 cmd/arcrun-tray/assets/store/Square150x150Logo.png create mode 100644 cmd/arcrun-tray/assets/store/Square310x310Logo.png create mode 100644 cmd/arcrun-tray/assets/store/Square44x44Logo.png create mode 100644 cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-16.png create mode 100644 cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-24.png create mode 100644 cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-256.png create mode 100644 cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-32.png create mode 100644 cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-48.png create mode 100644 cmd/arcrun-tray/assets/store/Square71x71Logo.png create mode 100644 cmd/arcrun-tray/assets/store/StoreLogo.png create mode 100644 cmd/arcrun-tray/assets/store/Wide310x150Logo.png create mode 100644 cmd/arcrun-tray/assets/store/gen-store-assets.py create mode 100644 cmd/arcrun-tray/assets/tray-template.png create mode 100644 cmd/arcrun-tray/assets/tray-windows.png create mode 100644 cmd/arcrun-tray/build-msix.sh create mode 100644 cmd/arcrun-tray/trayicon.go diff --git a/cmd/arcrun-tray/assets/store/README.md b/cmd/arcrun-tray/assets/store/README.md new file mode 100644 index 0000000..1a34155 --- /dev/null +++ b/cmd/arcrun-tray/assets/store/README.md @@ -0,0 +1,38 @@ +# Microsoft Store 圖示素材(msix) + +這裡的 PNG 是 **產物**,但**隨 repo 版控**——因為 `build-msix.sh` 打包時只做 `cp`, +不在打包當下重算(打包機不一定拿得到 CIS 素材)。 + +## 真身在哪 + +品牌素材真身=`InkStoneCo/arcrun-cis/`(leo 的 CIS,2026-07-31)。 +**不要在這裡改圖**;要改品牌就改 CIS,然後重跑產生器。 + +## 重新產生 + +```bash +python3 gen-store-assets.py # 需要 Pillow +# CIS 不在預設位置時: +ARCRUN_CIS=/path/to/arcrun-cis python3 gen-store-assets.py +``` + +## 每個檔案是什麼 + +| 檔案 | 尺寸 | 用途 | 取材 | +|---|---|---|---| +| `Square44x44Logo.png` | 44×44 | 應用程式清單、工作列 | 方形 icon | +| `StoreLogo.png` | 50×50 | Store 頁面小圖 | 方形 icon | +| `Square71x71Logo.png` | 71×71 | 小磚 | 方形 icon | +| `Square150x150Logo.png` | 150×150 | 中磚(預設磚) | 方形 icon | +| `Square310x310Logo.png` | 310×310 | 大磚 | 方形 icon | +| `Wide310x150Logo.png` | 310×150 | 寬磚 | **橫式 lockup** | +| `Square44x44Logo.targetsize-{16,24}.png` | 16/24 | 工作列小圖 | **雙 chevron** | +| `Square44x44Logo.targetsize-{32,48,256}.png` | 32/48/256 | 檔案總管各檢視 | 方形 icon | + +## 兩條「為什麼不是直接縮」的理由(別再改回去) + +1. **寬磚不能用方形 icon 硬拉**。舊版寫 `sips -z 150 310 icon.png`, + `sips -z` 會**照給定的長寬直接拉扁**——實測產出的字符明顯變形, + 違反 CIS 的 Don't「never skew or stretch」。寬磚要用橫式 lockup。 +2. **16/24px 不能用完整方形 icon**。CIS 明寫「26px 以下降級成 chevron」: + 方形 icon 裡的字符只佔畫面高度約 28%,16px 下只剩約 4px 高,糊成一團。 diff --git a/cmd/arcrun-tray/assets/store/Square150x150Logo.png b/cmd/arcrun-tray/assets/store/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..56fce140935fa41c5e388c1386d15062f97fb103 GIT binary patch literal 4422 zcmdUz`8N~{)W`K$itLmvMi^7Fq#h|_h-Qo-JK0B(5-o;g&0bm=+;yB zEY=)tN*rkLn3_nryq%e7D{b=DDRb)^wqp3(QNDPFFFpRa9lCo)tnRwVbr%>?P;gdn zwP9z!7opyE)m;5j9-!Vhpx4{ieB)KYX5QnS5!&O@DafPUh2k<`RD#s%dgm1yjub|D_%B54vLm*NnU^PM%i0NIVvIxp+){ z%$uw%D~voBl)fWcBV0AoyAmu9Ne~mhFFz_Uj#0|X z<6Y+jR88L=ET0-$800n@CBOO^M1AMGsji8v6?bxS;x^`$<`&Y~nU*0VzPUFnN6b7> z%$zXq-kHG2aTm&c$k)NapPPI29)#>{>AT}==gd;&JH#UHcc`Axz5bC0nRX}nUj<3B z!P!r0jAE07cXd(cEt&WIq2eal7-^rm=aHyI$6=T@k&)8bX{H7O`3!a*v~3T2^$%}` zL%RF>yV}IGTJp}{X8-;oOI7o(9Ur6iwo7xy}>qC62>& zaGQP=E=SF(*o`ZRWoBi)J1vcOBgrHV`*g!lixOF8+7d*?tgFev5fKKHVKX67%K={V zh-(?2yvZAhoX5>)sf9DE>2U3OCB$@)!FsOqXVgTAU^PuJUw4xh)>>{;G^yc_ z9}a+O>+~>2x?!})sRT6jE!mHruof|1*{Nz6v|cUCrxZS9*n?eYw@-jenKuCPZMO|! zqM2v`ZSk|vQo%qV@Z=}v^y=pCKc4&fewi!-NaPN5@-3C?ah3W{c5pbjPLp8Diam6v zTj$j5{3xa;H9kHny1#DLBN`*(6+-rV;WrPn6g{R`Q(Ya{Ch~WY6k6)|_z5M=(UbIc zy$gCJ_4V>_dY9MDr6JeE3@j1UDoUTQQq*HxpqvCyw?0;nCSy( z0S{;U*RUwHB3Ax0mB%4lW$9KuB#84x?zyay@cG+cK2}opd0br+Mz=Q^PEKLFO}pz~ zEp?{0Y4?3h5Ur#%q`&J`D=XOK5*kXno}FlBnarJ`6@Lf z)`~So(JA!Y6*fy(N{#)|#rq?}{kTRP=!CV5b)jJ#-l6zJhFN|iR%OrR2UIa5M6A9%;bm|XWvD*FN$Ot~EL!mn zAXLvwcNCY6QUd}*!uxQ@!%d`mPDJ)`3eY)LmC(C#89Ax>Hu66zr?b#X*bEP&q3B*vU*7gcXp&L!W%|FaBTZ!h)Pj4Tn7Ei4%3~ zJzbZSF+gKaqq&?YiB?;QocDhIl#822^?!m1Z6SXVfjFAd{2BgAXx4*9+t+7|0b;

zY}ntq#3cd!OPF5^_q*b&TYT+F7EqXXpy>=KEGM=Ax!JQYhm>OL^5zLPH5=BS>|qhI3}?^DUoeo;idh%Wc$p{@lqRQ(W z?Adhp_09RgR@)m^^PVb#C#Tyd7al%sl3JJ$m_!tULq&BA4^F(Xe*HOtpn?o*=M0x8 zt^Ik``OuPbJJ{4KhFpM-Q1KgibbX)8kNU(|pYV>&?aes@xYAOsBFw6CCMD)7_zfUl ze2L?wW-M>?=yZuaP()8e?gYkLUb3$>E{rCXlt?59_)h%^{V@g1B=k;Ql286NFc7QI z49-7VF{D`@DOl`#N!;)C0Nf%b&g1Cu;@T}SbIV`s6)iVYfL1&O695#-)tdLU>w42E ztzWX>X|dP8E(JQvED!bB@N`(4nrz~xVaE)}(Bh)f_mYxxALDpE)Y^f zzfeymXF4;1mM>^qG&=`}(#lGMDeu#Wh&OMh+mofjBIm)ZD~ND#E`R3gce0P&K{~G1 zanY&GEDZVp_bb@I|Uz8=F3H}5Yb<^oO?+0%hs3F1c!ux3%e>}9EKYMeS+ zWnh=K3lUZ{$d1HeVTU>HcqlpMAbM$nV!V>CfD_QutCNlBwT;^CRB*@fXAB1efio<+ zD*Jce>nMogLfoD96yXu+WY*O7-o=s!cV6C!3$Ea7did!{i8j2}S5}2TzdZ6rgf&*> zHPi?{7JTP)(Zl(hB*I`{b*VSrP!9w;?0zBlq`toX;f1%oup1FG*zvDAq)^Ksu*4-Koy5ym;*a5<0J^NQT+osNy)%&!nMP0LN z33qi?+V|V8e{tRM!<*2Hb)UzB`zP4_WaHM5VI;bCtM(L1!{A}Mu3JehxCB@5eqYs< zAYzERXBncb<|OjqoB_zm^)8+(VgLBi%S~fX`}Ke;|JWVYZ9)R(`d^{LgXfh4Y%Pgb zW9t=0?E-Z3c`DU2{byjfQA()JO5-n(r<#*OhDI${5fa2F1+tnm$GK}nKQTy!h@u#5T8`k2y^ek~{`lml=EC+h;uEhMT z8%B1uBpgQV+!c{ucyWqRrrEiWmp>}6siXNZFgk0h?h9hy3?`-N&=HAN^vOQl&%&di7K13U|6A&=wbZdV1Dh!IhZ))dtQoRKBmp zUt5Gc0o^y6nL58!?Du{Ksv|X`dy}8JWIKw=oh#eB2CY?`c&|S>JNR)chAdzv zJ8|Mt4!Cor|Af7S;7F-MA>^!TX>a1IddZ>n?e{UcxL2Vu1Z-ikIWsL9lCq)3;FB`X z5hoAr8Pz1oxCB{#`}`x@&zzwg*Ji8pK^H%N-m>(q8L@RI zsxUB^i6RJR+p&x@&SwvVY9gECO$xv!_BS`_Snwy z#qbSjO8h|T=otaA&JTbC*_qCX&coU)v-=i7LIPg8FFVlB%^mA)HIa?7Hb!;F@BH~q z`F)m1o?1g4e9Z)+sYwOc@_OqU$H>17fM;?wxDgMp?9Us&N&|g+J4Zu60L{T9zhn4_ zd^18KRFlEjqr(9{^L?QoE-!{StPF4l4jtQLeeB@wZL&?8X0~dEjG?`ee31EvBeotM zDa5K~`Gl%Q$!OYq{048%zmD;i^zydwYZbkDqS^x+n`>=i`nwonG@;Lo(5-)b`Pnc@ z>sInG>G9~rtCHW41r;d~kqFl7v7GeExl>R;o@8YXMm*}lHM{kkW>?*O$Gw-}RgbK&I3sN}a4U6Yh<6D%^ojbRd zbo<+lz5?pF0zf-QE|->whVeozN5Kt`O5RUj~%<*Ju05!_OXP!mKCZ+0RAx)uh@$upId@L|O3A_D{6$3}pn z$?zTOHuve?Y*x(1l&3tn#=y-31{h;6};gA9Wu335eB7?ZL@zjcS1yl+~Z6%Z7hb2yV zmHE02>k__&RJs|pnw>TYjp^=YD5k{is!B@iO;YA=A;_lZ$^WyaexT)mcU?5T{0hH|`rrQu4+3TlC7E82{~x~po5lbD literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/Square310x310Logo.png b/cmd/arcrun-tray/assets/store/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ee5deb8f8dee51a3c4d51213ff3bd1446726a8e3 GIT binary patch literal 8968 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 literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/Square44x44Logo.png b/cmd/arcrun-tray/assets/store/Square44x44Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcb8b33da3abe3d8e85bf26d47c9d03311bc4c9 GIT binary patch literal 1350 zcmV-M1-bf(P)ZQ3<5fXfX*PGGYIGm0y=}3Pv-`M z;UC%mQ^G_>Q4$a$a|pUl_PLUt7s9HlBCaTSuxbe+ktmEtW15{vPE1Uos%iL`%~_T>8ETYoA|(k&zJ0X7k;ELLe5qgUy>a;fG5Xv47uQghof% zpW)vkOhG6k;cyt!)6+;K5*QmBA`nBJ#aW2Y!8J(@OfL{^|tVHe!m~>$KQd& zZilKSA+xa}!r6|+6_v7}uvi{A@P^b7jZCK2i9|wf+~}4?#S7%3#jezIw6;4I$_1r% z84L#RJ{OJ3&0Dt0Jd2I}(mk|pYimpSYi;#QbDm9>FRIAOX~ve2Qo>|1VQ6RwgM)+E zxBmcYAAJm~o_+@X{rz0xJ$qio^z>Ak+9}&)Ga5~3XnY01U=aEF`8a!~3vPEkqOlm? zZ@1eKINFYmjt;Jx-`|Snrh|yb<5{Om&Xyp@u~>{9gvUa#SPP)UqX+~7@Or)I>+MDT zOIu*GS$Tu^Zq{rzBN~muX0zeP>%DMQE+4Zny_B80Dk^w0*@QyEOC;{j+4tXjm&sD*UVD8n zMn^|^6J#SXwzeL|v#VFLU&?mh_3J1oDEJFm!i+6JL1_{kdizaucYlf9yBlG%S`m-m zNoA87;r`)IfwgIJ^0QB{efxGON*ud(dC=W`j@yIDj*Q^Y!MC^-tX3=9+dJStauj)H zb6U01kgd6?@yqN^`Ow3)ay&dHRaKRqhDK>L<&h`Z+}y%KxpMikwB;A2ghIa#XSpnX zV1fLqyPNNcMWb@Zj+a?vuF5JFoH@@beZIpf!5uqxEG5XlEjlU*WrKuAYm?E)J9jwC zv0?o>zDAj;taR~O%XCszarVq-C|ru>o~;bv)wQJ5C@!-^Kyy#Xv`O^-|opF@U0?B0f+1mYAHxBelzL^X4tC zAYIEvHYZ^wOM+KjR4Nq$$fxyx0x-saa}K-RPR(hgX{vns z{|Q9Plaqu)vl(Eg^MS{4j8aOlEDJw<>N@F7)4(aL`-CybwO+5s%eo;)qminLgTX+OzgR3( zC!A~VR}zD>Hilu=#@nB5tk#{Bik!ERsZS=PRx7}EyDc6cdu3hM842m;{X04SHYvq% z%nZX&sw~Jqe@wZQ4~GNTwyicvjr;wc6sc5*#PXRP0df!uq{P$5L{)#6Oja(o5ev!r cDgI_Z0G3cpJt#XJdjJ3c07*qoM6N<$g51vf*#H0l literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-24.png b/cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-24.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5999685e56a945d07febc5c261ca299eb7c369 GIT binary patch literal 718 zcmV;<0x|uGP)qPU@gHd33R&i-ZL{T*ie3yLt}i&WRvgi&S$>w&Aj1GI7+O6VKj2`e+S^4>tPs1 zUHU=cuOS)+6GAY9a{@$e+cuL@YTffZMnr@a9TAV_Kuxl>wZ)>*C@wF5gs!g3kk99t zWm$T1%WA^+iwiJ#YXEY&U(7UX)>j*97pW1B#3ndGtZ}dLxThIXD-J~(>&ZkwG+Q-(ZobXxj;mqg6l#e*)0`xc=(Pil}dmB zB&CNVBWYQ7(z&OD8h{$Hcqf?wn3OJLNhwh|J9hkJ4P;-yHpFTQ()jp8Pl%$1{P_M&o;`OS)QWri z`sKz(0aO}Au?QC~UV_stZ92_0MXomhQEv#w_>RUIXGpmBxj1Ty5|v`_PEqP8DQaku z!;Rdg;Yf^HTHA4Q@^NM5NQHt6iA1;LK9lZ`J&?s>Q5RKDo=zWnnsF6;3toMrZ8y7kJdQ7B zrt!(sXMAPllh1J+)k1W$o11-!OG_X4)bxxm5^O`K*t4OR57OT!J48Py{{Kt=4~QOk13W71r2qf`07*qoM6N<$f}EXH A_W%F@ literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-256.png b/cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9179247979a6b3185454f911fdecd210d9064b GIT binary patch literal 5662 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 M07*qoM6N<$g7Y1Pl>h($ literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-48.png b/cmd/arcrun-tray/assets/store/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..33c3528562837ef19ce293c81223ecc7e9f2a12f GIT binary patch literal 1206 zcmV;n1WEgeP)r(9NQlUl4ulpiY{!q3(jW7_&8)_| zV8j+c3kQQi1OkEO$wnhIO+z>wMkKQS%{0RNufA-9-Cl^No_qqQ$}8aa`(ZYl+1rFf zI7vq!>gm6|UZ|>yoSbYtzHc9_)-?EhJ}fOQZ4iy+)cE$hJ8aysW6z_r{RSIM0;66I zCBRAAfN&(jBHw+-30KdL__hBY`tSXOUe{e*yV{J5j0}#-Y9mOH$z(!9!zI+!z0G6x z!a{U){3lQdq07-TLecwIf)?=k9-#5cC#bHj=CSdy`_MEK_GD%8_ugI?ic3m))AgxD zX*NAQjq|U+hRc^f=CQuMK9s$93JZQeQp{#HM2|yhx~&M1AWc(o=ldTpIy#El+E-C< zHnFHJX2kRuC8umW@c_!d^C6L{vT*< zX+_mbRUDc2_IA{qJ%`N944#t+XWLzf>VS&(<+C-&&fd%EV%u#)D7XZJQKe9AI+qIH zbH^Uv7JzmJTdud7i21xSY+z>qdZ2 z%0Pg7z9I~q>tBC!8{=bt#=NU2%RZQ!n_JULNj$Z|%8JuyZf;r;_8WIAk7tU#8VZH@ zB(AI|-;_fI91lj_4y39W|7(JUktdwaI;5nSvD;=t?JMUvLe!<+x^Mwr-vbN`48(Gl zS}>&^ovOpb!*G4l!hivi`|>n2vGDnNgEK|Xl7;x z!65ZwI^48acbJ=-M>rfpip9byxB4`udGw*NhcA4IbCNcIu==HgghxFUy{~M1E8STb zw?f|RdYj0#cc&mAIRqq!faDO690HOn+a07*qoM6N<$f)rRY&Hw-a literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/Square71x71Logo.png b/cmd/arcrun-tray/assets/store/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..62821badac041c4021632f92c8d58c205dcc475e GIT binary patch literal 2145 zcmbtW`9Bkk1Lk#KSt*Sei}3oGqs+OzZ&*%B&!8<$JNQlac^6>CT*x6dT9;MBHB`kR4?hRKI zczA@>>@3aPFyx;li4H|<`GL+~iL0hoqHOJAa1)=g{*HwZ#(%i@%}0i%X({PacHi0d zrJ!eL9zM(1$eViZRbPgQlNNaNvNbH6`84!?V0de_*QaZQFHi4i^h6obX$(4TeYfjT z7HF)eWpYxJrf+D-U?o>V}OWp3~)dd|ut!)N?NM%&;?4JPTbLSAR z&Pn$XJX}tO=*k{ECIS@{*u*sqEX-gZjZ|_wwHRw$tmQp~l3QHVy(M=s~KN;ghA^Bb_+(`LXgF)(8Y7M@5S2t3U;5@lg~_;S&})Drjxshnbn%m6gy2?p9AB z5%||2duxDFng`vGxRgFwuXpJ2))hp_FzLAB>8dpcLV=RR;}1Bli`}0$fx5 zv`qdiDJ-oXNMfVfd?Jnd8~u9(VH^w;hsz2YH7l&wkQPh%Jw9AlKPS-M#Zy5Odoh5O zB4a^jP79lWDxxC-(Iup?ClR;;%AAr_=}qdWqj-))y1Dl;`jyDG?}_k4ZY9bKyqbzS zwZ3tmF%w)707#!o_{O;D3m?*Y_4i3)6eX;}AVs_=58a)bnD7`;Xbyq?UIm!uMj7)N z#lFtxJw9j~?d)S%TU#r%GF=2#Qo@?Kn5!uA2VgKjkNMV2*09Ig&|H6i1JiiHA}&s! z{lxZ?1|jgxmBxM5IcGmV$+FnLnkp%uJCcP;yvL$7#X#AVl3OT%z1TXZ^s;Kcp_UY= z`HWzd2xJtp?G-L>ky|}7a0)3SBlC8hYitnzL)W7=KmU07$l#LNzfCSa?SE+aqv6NI zc-1~m9+TY~{J6OEHbvg3y*#>%a@{~xhR{#UCBX*C#kh;@8+!AY4Md2p6vHM>uQG-jyv0YX?nF{;+BrsN|H=p#H3(BJuu^ODOGgfh$pq z{SsWtSG((PWan>Ae%d>^%Y|wKk6EbI&AJl47b8idp~ur196%KvBsoSl!50)1Jh_48 zL&n_NFO^bHUTxn3RX=`gJ=L8mJwkD>M>P|`U>y;8`RT@{Yx1qFtwb_;t^@b?6a_9l8ZQKZXxVky?fc*>JfR3UN6RvS!Q zTeh#AYUJGn(<&Q=#}58X^4nsu77a6D;G(m{o)Bhm>6kW&gVL^HbUBaDyL)f6VDZOu zyX)s>W_Cia;xfLptu$abSF3Akt}?nKzJAWP*6@0nDS@2C6WH0Euy^vSq*1+5?6yX5 zjCfz)4QDsEUQmE&W&uym1go1m;xIY=>w((xJ@^N=Ts)tH1LC2%wP6{lqUiS4{Qd}_Eu)0FwQrm zoKXys!0w7kAVHSp5`>OX)B5|BsDU9Nb-~)zk?##7`CS&)qPdmB_ZOHq%L)q4D*;c$ zixCcYFH+M7C=~zmva0p2dno3-Nls1g z_*Jay?TnY(3Qp|2QwL}k8rbpQhD9_*%gd_H9^4tH>fcqu&xxv{+}6NI9_L7V8qNu+ z)~Z!KsE@`G2G$^*~6D4ABJM8GCqi9eC`l94()l HqcZ*jRFwb` literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/StoreLogo.png b/cmd/arcrun-tray/assets/store/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf8626e200e99ce3d5d42086aedddb2be731046 GIT binary patch literal 1497 zcmV;~1t$85P) zT};zg6#w;7C~fKN2Q5U%HqF@LCS(uOmg!U+4?5ivCe%ij#V<5b7j>DFkxiIRgKio> zSQf#Lp$N3-eB0+c6O-}g>!y3~!F~g6DeWJYbFhpRfuj4${k`<|a_>FocYf!bdyA@| zaQ+x1fPf?rkOTsfKtK`*NCE*#ARq|@B!Pe=5Re1{l0ZNb2uK0}NgyBz1SEm_-!P(5 zsU|*0M@MH|Ll_$y`~MLk2jlTLgb++ZtJOkLlqqXyE|E+U3*_eJ&Y93-r4~7rm6gSx zlOy@4b;I#E7A{w33cuga%FsT8ArD>M9`yG1^1k}|dVJb+XimzgGWjnG9X2#Hgv!d- z(bRYdWo4zbmH+1Tdg1Z(;P8>pCe}`lAblr?)~{cOj;rm^>GTNr{n$|BL|@-+SS)5J z$|$1IDDv|1aD#|C9K5%=xjAEHW+g(7L?RKCmpkzNci-|{C>X@O-|u0;v(MtGc}AXV zX=%ZS2S0+zWSUaU6!`~UFV?-W_D?c_0II8<`1w{J%qAmMJYvJc&}p@4WR5c#v)S}y zL{c4vy3Lp8&O)Qf!Fzl6b2=5xpO3E24m?*<0-w(dNBMGAPOVl?G0J2fJiuFTu18y2 zD~v`Xf`I^PoG$#*-w&-e7b=zD`q1n3=y7+!Znr}v1S`{g{B!7Zy6M|@CaFbaMn*=s zFv-x+;2`t{10sWAoH%g;2M!#-Ksba|t1EH$?maI4bRzU!r_Ljb} z_xte55<52#Ap{c+4-CL!HskiKUYJZqsIzmhb?Y{`J=bA0&YPn6oVpf~A!k-sRB(-0 zt@%hKl31}~Irn}dITOf1uh$1h`K#Eydl!UIK}jZ2U*CXGcmTN?%|yVc8y-7)1jdIX zJRT2z`0*!h3ezbvD-k|Ck$}x=#f7%>Shj3g+KMqILeZQKlxm?+2rn*LgzG(S6crUi zQIgnRw*wv5x;Q8VMNwFBvg33*d5%bIuiMFOo`Nx5oy^*P$-!7OipE19GYRTAn>TMk zY1zwo`k4i2ZEXWo<878yNpF=jNA*M`Zr;4XB$9~)wr#7!wa#u77TVZ3x>I85B;4a9 zs6L6vOvOH{A`~Tq!NBQ6<2!fmpuPQTm@QTW{9ZOrAR~0K5usF#a1dfKl$Dn9{ZUj@ z#3V?G&Tcmf3T#Y(Kmlky|J4Kux7&ld9pfY@7}KRx#)_o!mQot zij0V)j8T85MAxGX0rC3e4mjtx*((&q%fUxgcXAgp`Bi zOzJU5#%Y{-V@>xa%EURqW*3kI0+K*L5(r2F z0ZAYr2?Qj8fFux*1Ok#kKoST@0`Xrv@OR-4-}0+wateCJ00000NkvXXu0mjf{kFhR literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/Wide310x150Logo.png b/cmd/arcrun-tray/assets/store/Wide310x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..20fea938e37b06d4a8f60f8eb70ac86c6e2c1ac0 GIT binary patch literal 5330 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 SGPR_j(0%$GSfOG6;r{@~$#c&D literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/assets/store/gen-store-assets.py b/cmd/arcrun-tray/assets/store/gen-store-assets.py new file mode 100644 index 0000000..096df63 --- /dev/null +++ b/cmd/arcrun-tray/assets/store/gen-store-assets.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +"""重新產生 Microsoft Store(msix)的圖示素材。 + +素材真身=leo 的 CIS(`InkStoneCo/arcrun-cis/`),本腳本只做「等比縮 + 置中合成」。 + +守 CIS 的 Don't:**不拉扁、不歪斜、不加第二個顏色**。 +- 方形磚 → 用方形 icon(`arcrun-icon-ink-1024.png`)等比縮。 +- 寬磚 310×150 → 用**橫式 lockup**(`arcrun-lockup-h-paper-on-ink.png`)置中於墨底。 + 不能拿方形 icon 硬拉成 310×150——舊版 `sips -z 150 310` 就是這樣把方形字符拉扁的。 +- targetsize-16/24(工作列小圖)→ CIS 規定 26px 以下降級成 chevron, + 完整字符在這尺寸只剩約 4px 高,會糊掉。 + +用法(需要 Pillow): + python3 gen-store-assets.py +產物寫回本目錄、隨 repo 版控;`build-msix.sh` 只負責 cp 進包裡。 +""" +import os +from pathlib import Path + +from PIL import Image, ImageDraw + +HERE = Path(__file__).resolve().parent +# CIS 住在 InkStoneCo 頂層。預設往上找,找不到時用 ARCRUN_CIS 指過去。 +CIS = Path(os.environ["ARCRUN_CIS"]) if os.environ.get("ARCRUN_CIS") else None +if CIS is None: + for parent in HERE.parents: + cand = parent / "arcrun-cis" + if cand.is_dir(): + CIS = cand + break + +INK = (23, 24, 26, 255) +PAPER = (253, 252, 251, 255) + + +def load(name: str) -> Image.Image: + if CIS is None or not (CIS / name).exists(): + raise SystemExit( + f"❌ 找不到 CIS 素材 {name}(找過 {CIS})\n" + f" 指過去:ARCRUN_CIS=/path/to/arcrun-cis python3 {Path(__file__).name}") + return Image.open(CIS / name).convert("RGBA") + + +def chevron_on_ink(size: int, inset: float = 0.20) -> Image.Image: + """雙 chevron(paper)置中於墨底——給 26px 以下的小尺寸用。 + + 幾何與 CIS `chevron-double.svg` 同一組座標(24-grid、stroke 2.8)。 + 先超取樣畫再縮,邊緣才不會鋸齒。 + """ + ss = size * 16 + unit = ss / 24.0 + layer = Image.new("RGBA", (ss, ss), (0, 0, 0, 0)) + d = ImageDraw.Draw(layer) + w = max(1, round(2.8 * unit)) + for dx in (0, 7): + d.line([((5 + dx) * unit, 5 * unit), + ((12 + dx) * unit, 12 * unit), + ((5 + dx) * unit, 19 * unit)], + fill=PAPER, width=w, joint="curve") + + art = layer.crop(layer.split()[3].getbbox()) + target = ss * (1 - 2 * inset) + scale = target / max(art.size) + nw, nh = max(1, round(art.size[0] * scale)), max(1, round(art.size[1] * scale)) + art = art.resize((nw, nh), Image.LANCZOS) + + out = Image.new("RGBA", (ss, ss), INK) + out.paste(art, ((ss - nw) // 2, (ss - nh) // 2), art) + return out.resize((size, size), Image.LANCZOS) + + +def wide_tile(w: int, h: int, pad_ratio: float = 0.14) -> Image.Image: + """寬磚:橫式 lockup 等比 fit 進墨底,四周留白(CIS clear space)。""" + lock = load("arcrun-lockup-h-paper-on-ink.png") + canvas = Image.new("RGBA", (w, h), INK) + lw, lh = lock.size + scale = min(w * (1 - 2 * pad_ratio) / lw, h * (1 - 2 * pad_ratio) / lh) + nw, nh = max(1, round(lw * scale)), max(1, round(lh * scale)) + art = lock.resize((nw, nh), Image.LANCZOS) + canvas.paste(art, ((w - nw) // 2, (h - nh) // 2), art) + return canvas + + +def main() -> None: + square = load("arcrun-icon-ink-1024.png") + made = [] + + for name, s in [("Square44x44Logo", 44), ("StoreLogo", 50), + ("Square71x71Logo", 71), ("Square150x150Logo", 150), + ("Square310x310Logo", 310)]: + square.resize((s, s), Image.LANCZOS).save(HERE / f"{name}.png") + made.append((f"{name}.png", s, s)) + + # 工作列 / 開始功能表多尺寸:26px 以下用 chevron(CIS 規定),其餘用方形 icon + for s in (16, 24, 32, 48, 256): + img = chevron_on_ink(s) if s <= 26 else square.resize((s, s), Image.LANCZOS) + img.save(HERE / f"Square44x44Logo.targetsize-{s}.png") + made.append((f"Square44x44Logo.targetsize-{s}.png", s, s)) + + wide_tile(310, 150).save(HERE / "Wide310x150Logo.png") + made.append(("Wide310x150Logo.png", 310, 150)) + + for n, w, h in made: + print(f"✅ {n}: {w}x{h}") + + +if __name__ == "__main__": + main() diff --git a/cmd/arcrun-tray/assets/tray-template.png b/cmd/arcrun-tray/assets/tray-template.png new file mode 100644 index 0000000000000000000000000000000000000000..a25660e518eb447d02d75363f3e5b4f70d1a8b13 GIT binary patch literal 412 zcmV;N0b~A&P)(yq$fj2C!XPPt4ObUq^CkjA1l&#GOH9>@kmdH zl0H(T?-l7~kMv9^=|e^O0T?W)St^mvpJzi!A1Km~iu9sKI><8K0QQ|_*p+@#q!$YL zwMg$t!?{ErpMjy0n)yP$JEqsFKI^}tVQEMtmVUa#(zKRXS~wC*OLJmr^OIWIUZ$2d z@J(w+q_%Ph?flh4Xv^9$zt@YD&AKj9OkPz*B9TahU*j9sJ}fiSZN)7B00003Q_j}IwukZPt-}z*?xjMX)59GxXTe^vX^b3<6>oDU)gM2D>&1Rk>bdF4?JzQ20r; zpkj+%a=uIJYC#R$JE?COzvhPfQ9rct!~%e&3j{dQsM}$7OAF200N=ixaWM@jqdV0Z zlBdt+Uqlxd7Y}n9VTVrBK>L;Bt!?_v%nqQ@$`9RUGM2$it8d_KbO%x+0}F+K_GUW< z=krNvT;d(z#C&OU8MIpG{Htiyb*WSt&>pCsn~zU+sp#yfuiQfk;Pge!eK6SVE-IB; z9ndMOqN?gY@j6ul4o~BK%WiVyLk1AiRh98_bAm>Riat9q4iKB$rzeIX7CLq?Vc(rDAB9JM{UpeEmrFIRhFE7_N_@MY6{{Fzc0kbwC&Y~`=wwguWUflEU zJzV_ID|`l76q+}hqecjxD0~1P7Dn^CLc1lJxK|`x?iwV6l2fF|+MXPmtqvJ_q)DJB z4%jWnZadJnsSTeZrR3bzZL^5R`8eMfYP_oRPR^MwTHFezc5E-uwCBdw7SrYii=}%& z7-caXW7;Htrb-H4p{UejFn3GZ7v~A`a+cjcfg(jqe;OHy+*~0K3+slB-&L3y0I+(@ zMh?dkc63SK^O;}9cT)YRFnKWmp=F2A&^lJGl$3(iTNrQCQAk_^&d$z4Wf;zAGMOA3 z=#pyk7ptpq_ux`V>EohxH+MfqS{jv7%tFPl_MfM>>&nFj1$e8tb-;`LW)h(*3Mkhs z443Th?u|%RMzih1Lk=S7IokWe!`|i^+M6itzH$54_ZNy@i14K5&8=;u8FQ6{IwM$7 zgy@lQOl#!h=lYj`H!*9Hu$&M*1hZt*%F4SXUbE&izk0F*t5UD`g>iIcamZV10Po1Q z-rEb#|0l3JplxfjxkfFqr2!je`SK+u!s3^ixowv)2A6whZBt-1H8s^bzv{n}yoEp_ zyB;)emR7pVF(umh9p?BW#a@Mo<1q)#P3YopA18ZR;iX(ZP6V*~^oL?G#ideMUuDFp zomFk{WA+EZO?XoA7>wzgI(cogo~tJbyBm5@nklusB;$;vgFm~rYx zp-@RnHK!1Ni}=&Wy?E@{)#g?I7pJUp*JF}xZNmy6xm?o36_G_MHmJvt+g z7ZrOHc(Z$l8JFCZW1zPL`Ug!y?r)TEl(HB$K__Y8BkOH}b=PxxW-tNt$aVpk2vWdX m>--dP|AVk^74Rj02LP@w*|wCQAKc|N;Dm!Kw(9uBYySdh>&62B literal 0 HcmV?d00001 diff --git a/cmd/arcrun-tray/build-msix.sh b/cmd/arcrun-tray/build-msix.sh new file mode 100644 index 0000000..b093886 --- /dev/null +++ b/cmd/arcrun-tray/build-msix.sh @@ -0,0 +1,147 @@ +#!/usr/bin/env bash +# build-msix.sh — 把 Windows 托盤打包成 Microsoft Store 用的 .msix(rag-beta 關 8)。 +# +# 🎯 重點:**在 Mac 上就打得出 msix**,不需要 Windows 機器、不需要 MakeAppx。 +# 靠的是微軟自家的開源跨平台工具 msix-packaging 的 `makemsix`。 +# (2026-07-31 本機實測通過:pack 出 17 MB msix,unpack 回讀 SHA 與原 exe 一致。) +# +# ⚠️ **不必自購簽章憑證**:送 Store 的 msix 不用簽——微軟過審後會用自己的憑證重簽。 +# (官方原文見 docs/store-submission.md §2)。但**側載**(不走 Store)就必須自己簽。 +# +# 前置(一次就好): +# brew install mingw-w64 cmake icu4c # 交叉編譯器 + 建置工具 + Xerces 需要的 ICU +# bash build-msix.sh --setup # 建 makemsix(約 5-10 分鐘,只需跑一次) +# +# 用法: +# bash build-msix.sh # 產出 dist-msix/ArcrunRAG.msix +# 產物:dist-msix/ArcrunRAG.msix(**未簽章,這是對的**——Store 會重簽) +set -euo pipefail +cd "$(dirname "$0")" + +MSIX_SDK_DIR="${MSIX_SDK_DIR:-$HOME/.cache/msix-packaging}" +MAKEMSIX="$MSIX_SDK_DIR/.vs/bin/makemsix" + +# ── --setup:建 makemsix(一次性)──────────────────────────────────────── +if [[ "${1:-}" == "--setup" ]]; then + echo "① clone msix-packaging(微軟開源,匿名讀取,不碰 GitHub 寫入)" + [[ -d "$MSIX_SDK_DIR" ]] || git clone --depth 1 https://github.com/microsoft/msix-packaging.git "$MSIX_SDK_DIR" + + echo "② 修 C++ 標準:14 → 17" + # 為什麼要修:這套 SDK 停在 2022 年、寫死 C++14,但 Homebrew 現在的 ICU 標頭 + # 用了 std::is_same_v 等 C++17 語法 ⇒ 不修必炸 'no template named is_same_v'。 + # **兩個檔都要改**——頂層改了還會被 xerces 子專案的設定蓋回去(實際踩過的坑)。 + for f in "$MSIX_SDK_DIR/CMakeLists.txt" "$MSIX_SDK_DIR/lib/xerces/CMakeLists.txt"; do + sed -i.bak 's/set(CMAKE_CXX_STANDARD 14)/set(CMAKE_CXX_STANDARD 17)/' "$f" + done + + ICU_PREFIX="$(brew --prefix icu4c@77 2>/dev/null || brew --prefix icu4c)" + [[ -f "$ICU_PREFIX/include/unicode/uset.h" ]] || { echo "❌ 找不到 ICU 標頭。先跑:brew install icu4c" >&2; exit 1; } + + echo "③ cmake 配置(--pack 才會有打包功能,預設是關的)" + mkdir -p "$MSIX_SDK_DIR/.vs" && cd "$MSIX_SDK_DIR/.vs" + cmake -DCMAKE_BUILD_TYPE=MinSizeRel -DXML_PARSER=xerces -DSKIP_BUNDLES=off \ + -DUSE_VALIDATION_PARSER=on -DMSIX_PACK=on -DMSIX_SAMPLES=off -DMSIX_TESTS=off \ + -DCMAKE_OSX_ARCHITECTURES="$(uname -m)" -DCMAKE_TOOLCHAIN_FILE=../cmake/macos.cmake \ + -DUSE_MSIX_SDK_ZLIB=on -DMACOS=on -DCMAKE_CXX_FLAGS="-I$ICU_PREFIX/include" .. + echo "④ 編(約 5-10 分鐘)" + make -j"$(sysctl -n hw.ncpu)" + echo "✅ makemsix 完成:$MAKEMSIX" + exit 0 +fi + +[[ -x "$MAKEMSIX" ]] || { echo "❌ 找不到 makemsix。先跑一次:bash build-msix.sh --setup" >&2; exit 1; } + +# ── 版本號 ──────────────────────────────────────────────────────────────── +# ⚠️ Store 規定第四段固定 0(保留給 Store 用),前三段各 0-65535、第一段不可為 0。 +VERSION_RAW="${VERSION:-$(git describe --tags --always 2>/dev/null || echo 1.0.0)}" +VERSION_NUM="$(echo "$VERSION_RAW" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" +[[ -n "$VERSION_NUM" ]] || VERSION_NUM="1.0.0" +MSIX_VERSION="${VERSION_NUM}.0" +# ⚠️ 變數後緊接全形括號必須用 ${} 包起來——全形字元會被 bash 當成變數名的一部分。 +echo "🏷 msix 版本:${MSIX_VERSION}(來源 ${VERSION_RAW})" + +# Identity 三值——**必須與 Partner Center 完全一致**,故從環境變數帶入,預設佔位。 +IDENTITY_NAME="${IDENTITY_NAME:-PLACEHOLDER.ArcrunRAG}" +PUBLISHER="${PUBLISHER:-CN=PLACEHOLDER}" +PUBLISHER_DISPLAY="${PUBLISHER_DISPLAY:-PLACEHOLDER}" + +echo "① 編 Windows exe(沿用既有腳本,單一 exe 內嵌 collector)" +bash build-windows.sh >/dev/null +[[ -f dist-windows/arcrun-tray.exe ]] || { echo "❌ exe 沒編出來" >&2; exit 1; } + +OUT="dist-msix" +rm -rf "$OUT" && mkdir -p "$OUT/root/Assets" +cp dist-windows/arcrun-tray.exe "$OUT/root/" + +echo "② 複製 Store 圖示(品牌素材,2026-07-31 換成 leo 的 CIS)" +# 為什麼不用 `sips -z` 現產:`sips -z 150 310` 會**把方形 icon 橫向拉扁**成 310×150 +#(實測產出的 `a>>` 明顯變形)——CIS 的 Don't 明講「never skew or stretch」。 +# ⇒ 改成預先產好、隨 repo 版控的 assets/store/: +# 方形磚=方形 icon 直接等比縮;寬磚 310×150=**橫式 lockup**(arc >>run)置中於墨底。 +# 產生方式與規範見 assets/store/README.md(可重跑)。 +cp assets/store/*.png "$OUT/root/Assets/" + +echo "③ 寫 AppxManifest.xml(能力宣告誠實且最小化)" +cat > "$OUT/root/AppxManifest.xml" < + + + + Arcrun RAG + $PUBLISHER_DISPLAY + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + +EOF + +echo "④ 打包 msix" +"$MAKEMSIX" pack -d "$OUT/root" -p "$OUT/ArcrunRAG.msix" >/dev/null + +echo "⑤ 回讀驗證(unpack 會驗 blockmap 雜湊,能過=結構合法)" +"$MAKEMSIX" unpack -p "$OUT/ArcrunRAG.msix" -d "$OUT/verify" -ss >/dev/null +a="$(shasum < dist-windows/arcrun-tray.exe)"; b="$(shasum < "$OUT/verify/arcrun-tray.exe")" +[[ "$a" == "$b" ]] || { echo "❌ 回讀的 exe 與原檔不一致" >&2; exit 1; } +rm -rf "$OUT/verify" "$OUT/root" + +echo +echo "✅ 完成:$OUT/ArcrunRAG.msix($(du -h "$OUT/ArcrunRAG.msix" | cut -f1),未簽章=送 Store 正確狀態)" +if [[ "$IDENTITY_NAME" == PLACEHOLDER* ]]; then + echo + echo "⚠️ 現在是**佔位身分**,這顆還不能送審。leo 在 Partner Center 保留名稱後,照這樣重跑:" + echo " IDENTITY_NAME='' PUBLISHER='' \\" + echo " PUBLISHER_DISPLAY='<發行者顯示名稱>' bash build-msix.sh" + echo " 三個值抄自 Partner Center →〔產品〕→〔產品管理〕→〔產品識別資料〕" +fi +echo +echo "⛔ 這台機器驗不到、必須真 Windows 的部分:實際安裝、托盤 icon、選資料夾對話框。" diff --git a/cmd/arcrun-tray/icon.png b/cmd/arcrun-tray/icon.png index ec864e07798b9eb20bb850328eabc2742688ea34..f7c99379f43220f3757b8824d76d62392c828b7f 100644 GIT binary patch literal 11838 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 literal 4176 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4YzZe(<#64XcLn`LHy>@Y>fQJa{ zLGf0dwxk)-mzSw@*h@7ju)qHj#je$u_~6^|_L+16H{&<{|M&M3GsBOquV>rd{hG|= zaP;fhdGCH1GA?-ZE6uHHMIw`)^*ZlNV;tT9^N= zRqpovov%Kabx5@{@%Wx;X^dbfdnRo1}R2^84L^y+!%P&7#LOvGBk5C zFl3ENjfTc(+8A8ffy?gy=g$8-U)#HNGf4O_1QgWH5n$Nk3d*+{JM8>8815-Cun9AW z#K^0&Fyw>` 方塊(字在 22pt 下只剩 ~4px 高,糊掉)。 +// - Windows 系統匣=完整墨底 icon(系統匣背景不固定,template 那套是 mac 專有)。 +// +// ⚠️ fyne v2.5.3 的判斷點(internal/driver/glfw/driver_desktop.go:169): +// **只有 `*theme.ThemedResource` 才會走 `systray.SetTemplateIcon`**, +// 傳一般的 `StaticResource` 會走 `SetIcon`=不反色。所以 mac 這條一定要包 ThemedResource, +// 不能只是「給一張黑白圖」就以為會自動反色。 +// +// 用 go:embed 內嵌,**不讀外部檔案路徑**——打包成 .app/.msix 後工作目錄不是原始碼目錄, +// 靠相對路徑找圖必 404(icon 不見)。 +var ( + //go:embed assets/tray-template.png + trayTemplatePNG []byte + + //go:embed assets/tray-windows.png + trayWindowsPNG []byte +) + +// trayIcon 回傳當前平台該用的托盤 icon。 +func trayIcon() fyne.Resource { + if runtime.GOOS == "windows" { + return fyne.NewStaticResource("arcrun-tray.png", trayWindowsPNG) + } + // mac(與 Linux 一併走這條:深色 panel 下同樣需要單色可反轉的圖) + return theme.NewThemedResource( + fyne.NewStaticResource("arcrun-tray-template.png", trayTemplatePNG), + ) +}