From 67567e5d5ef0241d0d016e14a370ad74f998ed03 Mon Sep 17 00:00:00 2001 From: Matthew Breedlove Date: Mon, 11 Aug 2025 03:57:44 -0400 Subject: [PATCH] Updated custom commands to receive statusline json via stdin, added configurable timeout to custom commands --- README.md | 23 +++++++++++++++++- package.json | 2 +- screenshots/ccusage.png | Bin 0 -> 25368 bytes src/ccstatusline.ts | 6 +++-- src/config.ts | 1 + src/tui.tsx | 50 ++++++++++++++++++++++++++++++++++++++-- 6 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 screenshots/ccusage.png diff --git a/README.md b/README.md index b4710be..a081a8d 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,9 @@ Once configured, ccstatusline automatically formats your Claude Code status line - **c** - Clear entire line - **r** - Toggle raw value mode (no labels) - **e** - Edit value (for custom-text and custom-command items) +- **w** - Set max width (for custom-command items) +- **t** - Set timeout in milliseconds (for custom-command items) +- **p** - Toggle preserve colors (for custom-command items) - **Space** - Change separator character (for separator items) - **ESC** - Go back @@ -108,15 +111,33 @@ Add static text to your status line. Perfect for: #### Custom Command Widget Execute shell commands and display their output dynamically: - Refreshes whenever the statusline is updated by Claude Code +- Receives the full Claude Code JSON data via stdin (model info, session ID, transcript path, etc.) - Displays command output inline in your status line +- Configurable timeout (default: 1000ms) - Examples: - `pwd | xargs basename` - Show current directory name - `node -v` - Display Node.js version - `git rev-parse --short HEAD` - Show current commit hash - `date +%H:%M` - Display current time - `curl -s wttr.in?format="%t"` - Show current temperature + - `npx -y ccusage statusline` - Display Claude usage metrics (set timeout: 5000ms) -> ⚠️ **Note:** Commands should complete quickly (<1s) to avoid delays. Long-running commands will be killed after timeout. +> ⚠️ **Note:** Commands should complete quickly to avoid delays. Long-running commands will be killed after the configured timeout. If you're not seeing output from your custom command, try increasing the timeout value (press 't' in the editor). + +> 💡 **Tip:** Custom commands can be other Claude Code compatible status line formatters! They receive the same JSON via stdin that ccstatusline receives from Claude Code, allowing you to chain or combine multiple status line tools. + +### 🔗 Integration Example: ccusage + +[ccusage](https://github.com/samuelint/ccusage) is a tool that tracks and displays Claude Code usage metrics. You can integrate it directly into your status line: + +1. Add a Custom Command widget +2. Set command: `npx -y ccusage statusline` +3. Set timeout: `5000` (5 seconds for initial download) +4. Enable "preserve colors" to keep ccusage's color formatting + +![ccusage integration](https://raw.githubusercontent.com/sirmalloc/ccstatusline/main/screenshots/ccusage.png) + +The command receives Claude Code's JSON data via stdin, allowing ccusage to access session information, model details, and transcript data for accurate usage tracking. ### ✂️ Smart Truncation diff --git a/package.json b/package.json index 63edf4d..1682c39 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ccstatusline", - "version": "1.0.14", + "version": "1.0.15", "description": "A customizable status line formatter for Claude Code CLI", "module": "src/ccstatusline.ts", "type": "module", diff --git a/screenshots/ccusage.png b/screenshots/ccusage.png new file mode 100644 index 0000000000000000000000000000000000000000..739d0f3348f1260b88e93749b237d89c81bf8260 GIT binary patch literal 25368 zcmZ^L1z40#_cx`43P^}_DM)w63epWy0@6r#*HRMF(!J8%-6bvE-QB&w#)t3oK5u>g zxvra?`<^*x=KSW|XJ*bhyWf-)Bwt_Q$avLzI!Ztqdk56e;1yuhk$@c zYyRPblH~`<54Kje4j=6dj7&s~Z4FISBt_Zy_;?Wz-hDUH*H@8ZeAjP)qp#mT%s_|X z;HnZ560V}}Gtkl5G2HP>zl$OvNk?bxHTGIJ0tzb;zE^W^2U-@(q5rS0xV~o%Dk@>I zeploaBMQv#=neGse<4)G56NP@KO&>henUt6OBcbA0Fe~U*cP#JlJW>wp9}kjv?3*% z!j$3xIeIt|{x4$^Yh!r z68)8v=x5-EiHrLeRnZ z3%`n(#6QU&?}Vt#oSf|VSy)_MU71}um~9<|Ag}XyjmS=VWecL-CuhfuXIllMofv?~eZU_t!X0+|2*ola1p)#d;Kw<#!DW z8#61*zj!~A3jTh|uVn6KV)aSP-1-ro$3BGF*trD%(f=4j&Z!Pfe*PbcAjPt8Ax|FiO+gn}%;MgI>d{=)emPalC6#t>xr*Q5z!;4oV> zBOts-kQNhBbwfN#NA<#+#_jXjZ@rEFx*|a3|Be)~6G;=6MdeQ=E-wC3NmU84(ntgw z|CwQ55QRKHJwMFX7nl$`b#NC8mrhwB?%3xYq3$%%xyDtek7wL`@yNHQAf zqoTYzs}+O$e{j}9e?+c*(|LA%b~S-QNa#fX>I*!?cCBD}`akkl`tIAUexY4&9)Pt9 ziZJnkeX7L&_VUjoDN6V4{t9Vy+*S89&HWQ@kMB;0AYyRgVXCdD%70D3zi#|eC@4gM z@=6JRezm6_m*m1jjofnYhpRFfdpd?cLH!;L8}ZXXV&DH|JUVisL5Yd3flC>Gwsn3C ziN2K(8;3}_YJ|)~1{j>HrIH7SC5C>mf zaRy)}<6S7GDZH1mW2F-Hf5ATVXg>c0r`N8-j1>BD!-Oh_!oHpIZT}h6d4&AsfJMz3oU+}kI$cY?HDNcw-fmd2>n^7 zb2M~-nMO~{fiHD_L$qRgC!R{-&@ zknfVfg_r& z!nB-DmI&W5h>ME)*HXpHVC7mXI$mDTtJTq9d@kG6z_qe6?-uAF7k}~uzpD4M)nUN4B~+B)vnnxEY+@zu1KXFO4v4Xgxu zau&Loa~=7KU4W7d98fwi=zcX@luY(z!eITu^*c;xHQGL1ACsB^S1JAGq$jv9#AYeb zxWX_lA;ECFK;o~Ak+4S>LTMr~j7e?jmA}6aQ16KZJwpf%9s|L^e zO|JzyMsFWhhml42-HS*o-$l?TKQ++vzHi<>bkL1mi%nNtyED*f{NbEL`uM~5^0Q;v z<710#_RYm6HHL6^r?iQ(;QV|C#{N-_NIhmS9x=DI>PRV+Kny9N97L{=E^NeP8F&?5 z!)Xi}67PHnw<9iQOQXBT9yRe9>5fD`3O1m(nGI)F*X-RL=*-l z=8twY+qU{03)C@e6L?i(gS^?XEN9Eq%CzguBF}MYHV6777N;dldKFv!QfU+<G2ZIIQ!uC3t&Muk)L=cDyi(goJ)a zad~Ha+mE!gwD0oT%U%GRl40mG+c5;FZc^TstAo9$JrFUW1uQtB2vXlzc;1GKs=+KN zflmu6pE@^R%0{(uGkzW_)!~{yDyeRWlhDG7&bNMA+CGw&MxGhI7z+@hzRdjZ8NhuiR%iY*wWc30j_7 zbv`?yv)z)1;+4l{tw~WwI-;@AdKm90CBxGB?DpRB2U)ui0z=)lVSl)zOa^lPGqx;H zd4ldTZ7W$?7?l^tghHQR=K((0p`+th4-NmKH<9&-`Cs9tz6gHh=V*oDr!IUT)w zPTQGTP=Fn9T0*jkjtkOAar`n()M{sxXtOXK@wv%zm&<+vmhphC-i{~?T}{`tI~AI{ zzt-3TST~7G)(SXvU1LRYhBUt>fabSmS*oAjwYwh_^Ios2=bnOIG!pN|;*Q@o(s8?% z9~vocbcAk$z4owkBe%fFdz=u;)FBPmURiH1%?`cmUPkeP44++!IJ{R`(C7y_LpClT z4ab3a(Pq~u4ZPF?%7r)aRhwD9YWj2nzZrOkZn@%#8qsvCB4h7U#|V)rf6Djwwq{Ke zDX6`RRNFPzqL_F+JZPNX8o`qu?S);BCt%l1To`gKSZ1E1UAx(D^i5o|rBWy2dKLO4 zp!9{KrU4nW40l$`ROPlU*lTnnM&N3fd%d z;M}SWeH{_G$rJp0@>jF3N>;383oP8V7YbxDUM-V#F0k~PsU5w=eA{yuQnIWS)=Z*6 zF94H-Ylm-os$0~%880fLeKRloyy(#t`-u=8H9Fbh*AFS+4Ihd)*Z2n2fvcE;#C1W5 zWrR);trdo9yTa#Y53=_QPf~eoe$H5L?RF;1C3#-Cr|&o|Yd~ z5W641?H4pEI9|sk3auq?DW7gO7c8zecK7MlzRz9K;QGU?}ze9z6uWR+3W}kL% ziRw^z^AWrc_?0R{953LNfaCSa?`+U-kG=XOVr1y z0>1M$4QKkTw>4Vzd%2b`4qA@Qm$8Bs`xbAJ;k!H!4A(XLd_-*`<4>I>e%5g=!aG8G z`(+e4`)$3HlP?%`T#31{e1LYe6Qk*zWfSYOBg|z|yz0zv?2(HB-mm8gP2=mj3{%#d z{3b)>nHoG%H}CVlwY=fkcwwBAI(Z!?Eq|(%D;OF)SiX+&{f&k!Qt@ zI)&TXZ#sPXEff`*OJ1-@y16c9t{l+|p>aF?LuR(-cg(J^QHSWDs9_|h9ei8Ny zC;BHK+lVwbpU`kwrGJ@0*4tB;k_`<#pAIq57dTq{()x|7dbM{yy~&lfSoRilAL=(K zFe|iYoz6Ykg&Iu7GbH>mSYo+}x`@vldEDaRb2VVBY0%}Wmr_99RHhfIq;?WY- zxsUQnXuS{uW9%RPxxz*M9ik5tSW!pes*54V-w2g_in3NKp8Q(ym?ScdscUSdiG27z zeYl@lL;+Yhj3k^WKgx{!fY4A&O}M3pR(f!-!;}YRMDNp-YP^`Rw*i06@O* zC1SgJz@Z$wfajK;v1#7B`q^t3mc8MviWf&IZd=kEp5ONu%K73f$1}EMt=Pa!=gN&u zR6OTf+~$O=)9h8teXogz$yV^;rLrb#CZ&pk6^~Nz>E#&`iWuk5!83fy-|~bL1>{cZDlJUGqtxocE-ua34Sin?-~Obepw|kk-rh<`%-_sB^$`_*R(9HM zT7_mwedW1tVwEzg#Wl^criZzijTIVrchBR}(*{T|8&Bv}95UWSkGgcf`1U!I0yj6_r=ciNnN2U|LJp%j%FK zSL=9NZCZ4VMxsOfGntjy;?YgB7@KY2@QC2jbZu7jMaLn2puu4+@+mAX5Z(1jmR>MU zPi1^?YApMwjuC|G?hM>O8IPf+lf9*1FNkl|;1+GMxQd+E2)LbdHuGYynzPz~l?PaX z_5lhbDBlJB9nUaA-t+~mczmL_P~Lk>pI;Yenn~|VBRKcWyB>8X+85rEH?6M&$}Ue& zUoMbYh9(!M)-t-3)9HEhNs4+X8B@#m2xaL?GD7uPaiUI@iom?T9C^5%NH9V zq&aCT`8n16UWY4Dmc!Fjig(TG-tVnim72{p(pKOEL^_`N31m{Z2!P=x>BbQ`fv^{0 zz1b$^m0C?6D%0of&P$4K(74`ChF9Wq5>IiF1F`LzYNlX+j=f%V~YV#P6HR^Cw_G|0(vI519G^X{{3+z)g_OYK{Sfo3LS$3w^13F7S+m&w`Pv ztLq${Z@t-iO~2ZmG99=JGd7G8eAJt&)mWMm%?^MBJ(TMubMUz`-xBvG7s_l|fSU1rW;vmuHDv0d zjwJP(*w5$caW95^*U!5f$V3*J-jr2A#9n;5A<^@F}EO_eDOIHPVoL#DJ?> z*Eo}fQ*Pu9w5vcBw@LI!nV+jztT?lyv+8;WD*l?6>xuPY^9Exw!W)x>jnrLHJI2fw zc^k;#v{fP~Sl4=)%|;0U{cg8LSZ!9?V*~Lblw2j#!xnC5{H9kUq3c%S)dls3>kIkZ9_`%~bvwpm0)SXseTb)LUa zrgUHP019P{`u?d3tf9o#j>O|RNRb8$%P-KA>kawpQ>;^j>x&p(iCAk#Y3Xk?YsKmG zKS~FQX3C>JNJbVYe~C)vvHqb3IY*;LY^Z2JbM7yLp`qV%;T!h%-ac^vyV$`I#bY}% zT$)`^BPkX<$~j7HF35w=LeKpO6GG>3p3s>N~b@Iphh8gB&rnEp95BiMA0Z$J9`@KY?h-jWQL7 z%&Im_^#${tRXYe24$vMgKXdUaAh#j}Kp_bupFaMKsxj1T{>l5Z&K#NBa*dSW!1*Aj zrQOnks<(l~;hzp2g2eX}L%3Iqx_TWNo=yjA{540g5RXs$MiJRsK_g!vzx8ET%<25#tHl#~a>FFre;J08*Z1ghVbk8~8*muL+u+&EM@TbwRs z1iP|M^h+lb#o?bmBTyJ&=8QEmlUJ5u;JtUZfvj2%h8AeGHAS{Wq@5RW*7rc`O+YT% zgViZ_Cu%kKQe8rx$EK3LMIhgUCYD-VvRL*BRsG<=d+sYJ85Gfn$ql8X&S#QZkM7`b z2;eS7*L!nmA*Cp+ZcxI@RHZ;{ZK5}9c~Edq0=`W&Uu&Wd!c!r4S@h2D?=(B zo#(?I4SZNwSjdR&aWqJ2`;LV{FR3Ny85X>RV9C;&jTee7-kmNfq;u28ZX1Q@a}_S6 zZD0q#XX*!1dkK`IcR(y;2E6&J9O&P#1q$b-OYel--0m!Ay}BZY{H5YkKD?J=nlhi(~8$oTUp?2nf4^`M1k|Ak*(V)lrM?Hwe52c5)_I}LSz{0TRsI>?zxXj z=S76Jt1k3G!Ih!73Td=3rD03*<2$J9RSK*0=0wZsaL&a^Av!oMy1^F9fAip-JCYe! ztxZ00oFlBfGvf1Di5`FvcrOisTzxE^Tx61 z4h=fUZ-UhA1(pOXyLm& zL+AyD-IrS%F>YJGbO1bLxg91KNi@V&U-Qd>>Mzf<#uLPw;hDVMB#hgItiE?S(L0uE z0gqt{_uQqP#^<^xP4RJ&^3KIVaL;LBVov~zsTNZ;yzktqY5?TmLvgQrh|KLM=vnqU zYII->EC*$O@!KPtQ=JY}W@CjOUN|usaiyOnxVP{NSKeAw_L} z9xYY7u={i~(|$8lX<@%z;N#Qu_2OZ>?mkL8990kCpVg(43%L*6thrzqAe1Dp^0Zwr z`AQ|2F?WY5M9x&}bp4aWhiiFiJSuIcawdd-=iVLYS=_#}4%$2}Y_FLbQ`p}hTXg@RI;snB@gGAq#nuUXJQ17i`R^vBt zATY1Su~F!j+WFNa?KuMaKpELdXoO&2@JwMqS(I=jAg?XtNHv{i8pOE*HEWrSB;~3Y zzB#)to_dH~WWzKu*&c;2%%5hB#u4<>w6n~wH;=#aG(F!0UyRmk&FDM~?R`2DFd>RR zl_YcfJYZaqB!{T097ZPzy&Yn~&FD%$9nG~~e42VCq^~rFNbq>327lj2Z(p4g?Baz$ zez{dI;N5TLCvflxr;QwdkBow+&m%tMqe@1T`_9Jgfz=qsuPgiF9XCJYh7S$Y{_{-I zhyuIYeyiiN%c%9n3l%+hCieM`c(c`VLBA%v)UAAw=LC<8P+MK6y1kmoh5zf+?q{8} zXgTidc=Sx5f>Qk`hg!z;<(+F`>Eb2ftbOkvKTEO&^SSF<}cJkk}&&nGy9ZLvE8U;<9K7Itdc8n6yzeqI%79h z-nZcX-mXTPn3Q>!{I$taHkG%~Xd z@Z==F(M#>+S)=Yp1zz5afZ73ENAHRFvU|8j7g#;rf1ilGYJ~XB9K)L9`d}QJ+0>x8 z1s8gsdWy4|gEKmKY2ctF^>CL7&iKS~KX2-iY1)--qA1qDdB*w~!{d-;Nn<4c_Tmfs z#XijX!%0Ys#QSeA&%5qOZpd^mDcJ>|^YP73&j1}{*q6+5Ar3Dd<6(ZOVZ^ZcrtPYh zz%R}%(J{IqalahYG@-DJA*@%Fk`iRbwn-qpA9Ed~!cN$SJT`T;ESLj47nv`49j?&SOLaG+ z?@2xnBq?Vrsj7xV0q$x5PTp{9jfNk?i5VXiEay zKSV%)6isr=x-V;~@zdE07GraPVezN+9Tpaj_x_W4F)SWSK~dV&EbS<*V zYNYXLg!BynzBUfvKt28)9Qo_bLGv35{vE*4`Pk9K<2T^MwYzDl2SCV*Dw<7898ZR6DfbZ zLxz&u-p#vTV8}!o< zv`xe(Tm)}|nonAgU)GdPX0&?tpX-T(knQd5HN_vmMe9)}L+^Z0Al}|n1z{e7@j3{) z;~L%0!(P$f)x3I2QFy}7-%ludTJtfxWm2ZhUUqIw@8Xs3*Ts#GP8Q|@@`eGK z;_{F+-jwNU#Nt^EnkDa#uM^;(R*uE|1R&bQfW_ifhV799 zwLj8_H3iQ#6VPZc$Oraq>zQt3X)adlt*)D!M@K{p=yb82z;dRH$1Ih_%{gsx7g~&q zgL8IxDqADi>Ur~CMFmHz*5ZlYLT{)%Ch*~y;LJD>*l;=095*xyfG;tt-JiC>Md)VR zK5K)=x#jOE=>=7l*8w2w2Bcr!Xy}+CuX))q*W}z|?@y za@tEDdIHbLt&Id?Gg}uG;&yl-GH-$s!mF~rRe}Ki?-^$|4kGM@#ftZ9uQAh^l?LIQ z)pQUq9W!Ef0!Y&h$ro=mdsHM{sLg6z9Yyx}vO6!aVw<-d-4MK$m+F;gKVm? zH$`flrq?D~B<;a{{ujtm56$3yY0i#KagiXwYwqJ{6&tg5RKPB3EDNz#d(I%*Tts4cbKW=d6^KK7OzLU3TTdG>oK^wb75#71@^?0Z&LM>aDya_?MgS2?Pt(7lM*jp;h zcF0IgEN0ydLzsvIN72Y*_V!UTGpp|#iMi#(l+(bp+xT8s6F*qUe^z7|9eStm!Zxxv zj9)n;>1>6~$=#U1rN?x$``e2t<0ZL+t*AEOYo>z-s>C`QOAVJCm1oNztR4K-jeg1ahf( zc5y>x0N1T)&r6qJ;O2hS7fJGV^s1~twrD?JD&+Qpkw9NYM)oB(c8Kq@gZ)EptBwP; z;@XRuiQ4cl3U1q;=%q`=x^N%Zw#L`sK=Z~=fxw{zrj#9oR5I{n#&oYiCxPBO+?T!Q zYK<;=-rr?2Kd#@NpHouabjh$@4}62!zhhz&fvi(M=5I(sGQmZh8iiH)Dxpf6I-$Mx z8KD?_T^DbnW|%Q=wgRMusx8>W@tt!a`5V6ajdNag;Pm z$jY5f?6yq&VTk~~LQv0!d+-j>?cg{&<*p;UoLnS!VMQxhrAq+5iz3hAOUq;t*lf9f zFi@&^8eHk!oTC0&az^l7qkh**qAg4o!y&(H&BLE7tOce8hTQr^OH0z%Y_JtAH~SU) z373AZc=3(DHUDpz8^X~a3WpNfu4 z6DvAg;RU737Cp$0XGr?sLE<+Y8+aci_5e@yFqsU*kQ88o2@8tQk{Q zzRD2{c8naZfDhtC$Q%i3sh9Q%8Hy|JM{qHi4%}l>fNh4fpcv({6p)^(meHnV*{TJk zlEWSCW|9rE7L3A0)Cnu&1Z5!4V zj7#J{eO3CT?tv$_YxL%UaZT^Q;C5WFXZF3OZ&=>94sXmio$$F&4@WzvC!|57!GpB= zQ=X=$P#-HfWJ@Wj|6Rh@2Hz?vUzGlA%@FjKuvhQ9*|J!R_fi)Ec;1BL#AhV?Vb1Pb z4fACImlxdJe%f&foHT4=RyYb_wrsDg2zjoF7C|j463TWsTz~cd5*sC3uGu0kJ1vkC zHG9dOAqeh3b~AHxZ?|Ur!nIiVF@LPu)Ru`{09{T&no|2X6e%^KFi5eEtY0Lgo%le) z-C$b%L%t_1?j@T;^hiQl^K@ze}Hcp zuxWWlE#n8)$bE=KU>fflIJM>O2Ay)(M`v3|>i|y8ZAoDB-NI-GX5&Xk(&V{X zP#w3Y{dt_9_ttOKzXyDcc7>klyS_ZT&g^ge?;S#eD0-aixLQkR?iL*=ebf19PFXp^ zRC_}{bx`BP=V9BlXMAN(QX;FOA}MW?&*1vNA@yN6mB(Q0he$s)s#D9s$;pYt!Tn*4 z?k8Dthf$$7cuk#)+WE|6#JKrZYPWZZdi2f^8E$YrR?FvPO?~a%t}anVT}Z5Ydm(Om ze2YOSt^1iP6|skB_Zcer*Rbl?D#KBeY4pf=2K9~CceG&Z0h}f8+4R?37Y4Zpat?;z z!_oF6D~VlWypP3Mp7 z#C_&9VsOJ_T6xiB+=-g=gw<7rx(Ck}^n#qlv<0?pUJA+5NbLwdf==`E*PUhWK5y{$ zx5))9f<7Ey{uHGnT-)7>pCG#ouDQrlkc%j9FJ}<)sZ(SwxV|_+w3)JVk`(%m5fkOAv+~T{U!+!c}#;wabmqeq6_4~thiM*FS zrJsx(Zv&9M%+;2z+>(plq_iv%m%mRPG^LNU9vo0Z!kKukQ6axw8p*4kyel2_v&I2{ z6loRgjdy0OXmVO!v`y;HqLTQR8mW@|kvSW!Z>xsCl^pV}Rn@apss5`*NBZ~Xq+E1- z^{`brj>AJIR^H;48Eg`Wi+nPIla2wG<(HBiBLrj2t}-kK+Lz+?5*w(V|V%e(jnN`q@j z!Txr##^}8ySLx~33U+7pS}&6YCu2g(&C~w69OgdU=yONGkA=!;Nz`i_I-%!&d}vnK zk%7T4hAV!>SK_gN^kkjh$p1bu{$8^iqRC}kt~)b32NU$gnJK|H94h0?3=%fd*atj= zO6qKrBe~tG@Ek7kZN^P^dO4~bunA(qLdFc=qz{Wn z4=HaY?u_4f&#OQ2;!v{~&oo#s_?RE*;?1VuFQxrvdC+*GXD^Y-dZt`EF^w%xw+>p* z4fBHm`}_HApM?(bD{4xi9n9MLw!@*jRZUSt&X9#V^MIV6VrjX6kC~4Nm}j?GKL7x$ zfG^gciyE+5wpwh+>68ybh_$8|75;dDAXn%LM zAZcFK5~R1|%6xtCV7=47yT~Xg{SVWt^96;3eyiSQ7Nc82ID{8xLo*ku=|xpn8X-wY zsJQAPOFd;vB(K-0N?-lUkZ5^a~nptO3H#xGPz%2I{pMwmK`38qee0kxo%9_QF zp-I#A<@%K$DDjM#DUx=aRS>5>L zzksL$uE$lHr@0B>Bgc<>j+a=%Ft-!&PmMUgGdRn(vL*HOYp?E>t8K~UpF<+*S5hMK zGdz~80Htp=A7HiWx`0+^)z>!X%wM%*5$=Vy1K}p5Kj(v#!Ryh`qKBE4_RmdDoyb^` z@5zosw&XEmKgPteT}~H1jU6a&;SX?;o#305f4key@h;sPbsne08?bl}Q(t5U`lwys zsUOB?|27nBGE|RA`#${@4{U37es;8opwEe1=E`3&mlx<-MEwKS4>z82!)=%EiEto8 zM>rScNske5m(vBmyUSg=Z4eRsIry}cM^B@S+|!DL?~7C4V=f27Y|94wMyBK$ zc$0r8-r|Z1PvybqWeT@hl`9CC#IuVWz$;5I)9drIpG~v*OYN85b8rJK>sDK45|?FO zu0<`Ub_S>j*tSr6>T4;W6P(PUJH61Vqgd8^Ud^daJaEnsyr)$;sKAzRq5G>Q_2F95 z-u@*J=3Y5(qk8kuXB8NCwssa=X%E%%s#V(Uze&)x=?MvzG+Np;V#KfJ8-58vHbWYj z>_%RNpQR7DlzIab%fYy_V>7L;t5AT~!!ZxdVZlhhl8@ffL;*KYz%H$=ScjFZ2~Yk2 z+{Ltzn8Fkw*}!8nFxY_=zxTEFmgO1PaRn4nx>!e7Tm2pY9)S~jfp)gGV!GE1WccAQ zk8qgPv{%Iq)N1HK+Z^2GbJNy-H8l8-O~;xArG9&=8;5Zhm8f!}`exeRYTJ~~5r1OD zL>Bu(6NBmKmuMH`FZ-M!phJDAs2EkhJwtyX?x3=*_A)?fSPB2Ev1=3neO;RiqaSqOg2%6nT6pNx4~QwO}<-wt)$nyOFE$0dr!)vE8M^sO?GWlI~N zvwHtYI15?Yb#+94A379E{g~-Fh2m9~QoDB$ZJtB~Zk__)Y6!9O7+wRl{cBH6El+Ks z-1L{Q2^N;!-wp-8;=teDJK{UH?s)ar>NGnPY_w5ri8A)Q4CJkbP^syX=fxu#l26@- zSsd*NVx zlFPJKiRFT>!e~~3X?WpV;kS&btLM3za!xf_7sET$(m96xl=M_2=+Xm8@(1^IPqj0! zX1L8)S^}#)5sL-d9%c>~E=@~YYMs=nuQSsb1Ve@wri;(!{S_IU(lsdi8f21&A{ z@t|sUFfS5eCp2%V0Lmm_(s|VS?3WgQ4)hy&3H$8&7cI!L$5Raz+%U)R8YGXEDb#Z( zth%R`ql#+6dfw8O>j{3y>zl{fPP+k7P772$HTVTEnY_2K5_-t5>QTy=3`wAEZ0GR?2{>gBPrGS%) zYST3E*JE59j{u);^!6lOU@S|GA&nPEGMU#_@TKr#eCc6&X*ZUb4Ba7^*xLJ`>+&7**7JlXP#lM^+M;=KJvRcu zwKuS75XJ6|(Wc>dyH3?m`NBD`!L3u4`_>#=oKBO70H)Q^nU&Rh=M+z$PabV|>BA{r zw0oCsTW1DN`!k=}NWC)Tgsr*ICr<;?{_!OqW>h3h?E!MB5rdeKT%*~M&wG2Hg9J82 zqvKQjh2YkGE2WFylRYp4EQ8l1$W4zZ1@=Bl7rrJjT$Dk0cJXOzdzm-KG>73Jo`js} zRUSkNco{+XTHy%7+ivwG%nPBWSZ2sEh6TJ;V@0H_o z0j2m|N$bTW`+1NozQOvV_qf{+`Vi;%itOr%mnGy=hvM7dZx9>zyB@l|@n#-DLBU!Y z$p~+f#X76bSViHyq&PA0SQW4Aff$%38zJ6 zUtn6bV*4TAb2I~d*6JEJ3Rk`dl6cL+<4m$my^D~~Bp zko!x;8l)C7CiCgURkoIi!-7ZCT?7=?1D?AZn;4sc6k*{GN|Q|9!0U(Pq@?$4+7^eB z)BWygiNyS0_h@jCmu1%Fw49i)c3+7vmOY&iSREkN9XV+bX2ibbDL2&sS$V@9as@v* zea;`zY&2|~kYFOZy(CD>yl_2&n^gsW`0^!aV@;{C;tce-ATV1TJ}gc=3{6}Pk9Pgi z$jd@JKH8LQ7s``Q4mbF4ijTP3)gT@7xK~RAAO@Fik^dSIXNBt9yA1b`55=x26cYxD z&lk8FW66spQq(G2dJ*}kCLiZFnx!!gi)-m-%A=&Gr7NrFrLJ=`|FFGaf^EF%8 z`@8&0GYfKFLp}uh2@Bveds@f$08Q-S^}0$b6=!brLIj?KJZJh~wTyNo zeBjTO8e=}aNO0%g1HOO2eeGb0ZP5d!U_A56y%#p0KneH0Vym(|38`Owzy^&xp#A<9 z)PbSm_~WA3aURRhK`4<=?$5(8l_s6 z+oidd_{n_c3P@|QQ4!-Ll*37|s?N(%xmR#-YhH3yGBA8q6vlD%BH*Nj7;d#$D)55i&@Y8Eni=%b2z z^QMxq7Wz!txkFA0@AyvkzIQi~j}cfIYmA8@S8I@_FN-Zafqx#8Q8}#GcH@fDQ)?qH ziLlM4k;j)bDKeTA4|_H7CK7cjT@WmUM@ou(gCu-E-giDt@QkyRUAs5p^5FA(xK7hkDdqXqT*sney!kUs`OVM4m|Ma4(^ycN9@j>MP8b};B!Zz;+{f} z<-oDyMAejzy+C(KqMf^dsijYjxWk1=a=uw$j*R3aev;r$z(We~k3Uu4_6Np1{;&dF z{tT@8aff+m_Uo1v0fAim_iq9GLxmG|QwflF#+x<%5e8ecpjcz2^bshvn-*|?$|j#e z$@Wd1SgIdGgi?Wo4};dBN`puZbztP~9aH}YW4Cubv>W|?(4U%Yyw&~pSB0@>)TuU` z*n8x@9HxWQ`=hb0#!#hbJzohG7frdMF4Xfo|2vvX zB1xCimCwoFPP~jX&d5gPUkGzl> z4eMH>SzRPY;wWgM%Sz?bjhL#GZf@$5yao8k$)4bt{|vh@x>yvJC9X$2)o8elA+|h%#B$%a(H5<> z`ulhK*FKo`wTBeywuT{3YNLO=uh{p^z0jG_;@@Q>$fBlJ7R5F1&4~QunP~vMAAF_4 zxRsxuZ?1;-3V#8DEYBcD%cND;_48cuKyu#M#s)Gi1H9jt+>UD%0ti~*)d?D>M(a&K z+Us_9NlVCMXh>PC=+`|ZPa-h)P+rGorN&SFypMt5CeZjsHCVMeYV0!m>8rf^7Y*VZ zT#cEsJik)Tt5U2k&n?K>2Z4Y&_BKI;BHwb%UL>JdA{G|gtJcQ$3k^+8-$&1V;k=b_ z!q^tUvxVNynNyHzijGP^D+nI^c(QZE?X^6WQC|nbay2R}wjGeMjx3;&f(sYFwUgOc zMN>{#(t;mlP4M7plfKqRMXj3KJbVa6!_zSg;fTgqPjnrs{v|e01|m)avO-RGbqBYn z8}xzo7G_diN08U*AMk)>Hex>QV5$HTd+)1oc#*q#sF=Sha0vT(H*X6K%oj@bTX zS09z~|Fv^oUrlZ88dn6RD2P-6K}0~R0s_*j(n0CHY(S6}ihxK7MMO}VG^I)}A%qfo z2}MAVA{`P)s745p5+D#rIN5uj?_%$9&L42bIO}SyHRhTZ>tfD#zR&M@V#EH@?#QLK zYQMwPj1Jt#6yIFKAyst`frNmDlz?on0(Y}egQx5yTKYj=V+K)OqayJ4+|=CESd*d3 zZ@B%&N@@G>5)QT#5~hlV0oChbXadTAEAc zN)uW3U2UFhE!}^ynQ2HOVD9VlAKq{3F+D%lA_8D%FBix!c z4I0BQFdtpIK4+m&dEG zjd!#Lfe2@xKo%-p=>o>D%=E7DJ^5g22;OspUGaG$z&cF(33=*vCY5%5T!0%2A4l9E zX>B0~qGnF6(09>w++sbqG_!C`#C>k>f)7H@ydiupXGF)O9I-Wwm-?~KbZwM5ztMv* zd0>G`hmdn+Ve=s8={AT8dlC?aROCa)8KMchKF49 z2GK*W@24_sz_nO=St)S;jo-^g2eyLys#ZP%ww`Q#I1XUTU}{0JBk;z-rDfJF8py1V zFJNHl3k`Ml8{Z;)s#s4Zeuv4(p!;njW>?@uLXv(jF8N-Uqov4WmE9ePRJjpG>$6hx z0dXYOD+Fk9M09O3`FQ(JRIjC%tblz}G5;AovKUtKJby5RfD;vY1B;X5n0?RBd5>p0 ziCSGij!$=Zq)<^#dwgs#-wQ!0${m9}_vX`jyaruy6x51aUAtz^$Q|~JQ7kVH%gn;+ zvDuNZ&{8*Mm?M?Qg}VpV4fQ-JpUjl-5*doh;|G_q(8~H>b@yE6StI~ElDGGq2Zfn| ze*%=ai8I>0EOpJB;G@hR4!j0WnOQR&k5dT05PY<02;|ZCWC_9g<$2 zkMy&dt0P9OSv(vY%~)4W1&tLq{Sn~i%AuAWg+{4adBYRY#Ff z(R(MeaQj5#J|+Aj=uF!+RE>PHMaKl2uvgD1BTO0uqByEEnlo!=oqvDQj3)IlWT~8M z{36v$N{+fhOvCW`ox4(%X9!NOTR>!+?zP|)hs*htlH5E2YXA(cc-GCdH&Og;=+cdr*p@!&3U1rJU+t3e6u%q4F*;lqy1;^77QN$( z9C&=gbH^cH`sAC};aP)DU51MROw{E#$pL34cjnUIcSW(@k%%g?13K ziSAhOUWY3;Af}&wL04xfrxR^-XS{+CWpNWdk_YkH+4#L;Xt--X^)V~0uReYp7AfFj zxV*BVg9M+OoBlC#6(wr>PRPXJi40Bn7<6^#vBzcs&{*1OG5z-T8b%Kk#ez0}C4k5< zr&$P<^3z?kwZDYCV~Db|zG|HYm1 zFOe1xUp)1`T5ed-Gv^QyRbG%+L49QVAx|oN_cy}&8UQB2WTdQ=I&B3gY#Z{t1U4Oe z6K@MVo-yKXpOohSUDaQ`gqY>2|uEWto-o-rBR1II}O z5KR4{vSxKL=r%iT=Z!Tv9*-Ft5r7!6(F!2kPJevmvT$J2-Nq0Sm*U>n;$i8~;fUX{ zmBRrhx*p3X2UcMl8*I=cgS=0;04HIg#FmXD!Wz+oj0N}YCtMFr^GgEozIJsBVP{)8Oy!nZqvK~{ncYwJxw&~$#p3c9@GT_800KImj$ zIH%1nJAzxeIelQ$>)b-$X1W&Fxkc?&JSq&EF;jso6F%bShaY9NmKCa84yJojjwxPV z#U}UbnbbK0SQj!vzXap2L#r(k!WG6>cd!eVogxfc-+tcUuAVWfwoM}$u>q|Pzmkrw zUi@4tQDd99QTl3-aaP?#X)vpNdgLa`M&jgyBU8nD7ST=z5WGAX8N!1Co=VI3AWbW) zs`iQBuPGzMDT12}HRn6)c71fSt;UpI82(6$c-&un7i-{BJs-yt5!8qCloXy(@!Ub_ znpIhRgP$(I@eP&1+!i|(_$+&i4b#7*x_&0#d0pi+`4g1+aoUvBc=zo`X~HrP%fb)m z#i|s_@h9sY;0q_8H+_e{&-PpNos)G(pJ8K;a?lYl%>I^I<3vqT8^{{nq+zw*4QAFF zXZ`Zn8EA|6%GMa&@oh7SGg_&>&gW2WTR9~PtF^Dw4avQfvz~tUO=^QeKo2~bT;f)j z=6KG{z9M%A11OZ6o&IbH+MI6w3L|F<-I96K?b+10Cu=?~+r{9y=7~L#sDYG0#0-Al zM75JTcMW;4@MbN|S9g)pPO_d@WtX#I8mm+Kd*fEEQhLs|tsLL=uq9YGS%?Ee{f7-2J;{z*`VWS2W9f&BFZ%HXaKA$suuHr=Or?WKKa*-OBzs&=D1|Z zqJ?GwsxSc`9XnR;DiZht##)A+!>yBB!)B4=vy+FY5Q6ukEn=xd`QQDnnwJ#xc0;gF zwU*euWm0Fh2c~~p&j5OBl`~d;!n;n4#1QjyOB1U3TyS1`NL6^|y}sclO>gUmG0n|c z^{Zi#K~CD`dDP-TwTC3}AQcdZC|@VxLc6L<|9df2o%F!#rYEuM&1I?-LKs(*4+_i^ zu9MpkFzm#~Js{z4PgujF%yU?O@cT7P(&SLro_|bpk?qP05=wmO_2Jbh^sk=xPheO8HmtT%A));3k*VL>6)&cW_JpCZa$~ejlTYa?`eCGC_Rr{6`M&w zdG)Y^x;+YXWfP*Vg>*FH-4KXaxqR0i96Wssm)ROY9MsF zcT%sF`YC86GQRO;%!q*aYHzlaFa8DfexkYQs*wP;cbn%se&**L28K^@PwM8TSZ(vy z^As)?h}}wL(g}sat4mcLF7rK1>Qoad$PT2%0mHAyZw_YcGaQ6)4l*?tTAXUFU~VNG z;L0U-vYd2ZCkHVU1;_dA9_?D}kFl2`6k1AJu8)uJd}#z=zZ#!bd#DhOAdK9$JRv7H z=lx#As|A|yENa_Qd=p>b1n!)0yf@EKaIG%|O7JH7x{YtXyXr$3EDMN53Bpv~n4sx7 zpw64oCo)OxQ9;jq1<>K=t1>)nH0Q$mQc0w*Gf9iDue7JSqe=+QU2l-P7zw7U%0T)6~& z1uYG)`4WgLqb^$Fb&q6W*g40-J?re(G{t$?*;Uupsy~b)!>=%(U*U}+xj%&|lNO%4 zJ5=M^ecx_lrZTEVGGu)Q7Xw9ppT{2IaJ01{dgSnxj$KVd%Lm@iG6aqwKP`1T{^m>m zW@Nfc^}3y8PIi){Z0(3{JHf}VH#D(h~naROP+ZD?ZNA7 zVq5ru^;T^9z7g{9(w1gppQpp2x!3Qw!*I64B1k`7fjy)I2b67UWANrce!xd?74iPJ{tAS$Mx@cBpCn0BKLY;v7V6^zOp+|@X2tqzLcYUwPUH=M z=yth2*N3*mqcm}$fk9aEG^l@H2ol*a3axwatyI1V5C=VY_?1Vl#&q%xC8;~|!dd5` z%0{;LERjg8^G47=-gQHVbd=)^v#EbDByP>|^1??;hLw#Zp(XwU(e2jxGfNs88oQ{m z{dj(91EqT5M|3Brs|=uL@CoCPBaM`ll*qMpuM~|e45Ux3if=P_tf%NT5H#mwI%)IJ zTOYrZd<_VAR^xp#ZhY!(BU3zdDfmq9?2+wM8UI4Jg41_kyH};PgtM<;`K!G+dcH)j zpPvI>nljHTMr&APKU!!$kBo9$!VX~So)ZQ5^Qa>9HZt@N3R?HpNTIJ^3t@40pEV3z zV^kkwp92uI#HwzcAdO$Z2y4*$t^aMJ{0|W5+e&6}+q(7=o4p@hI4lmNsQ2S=u+fth zZ@~SyVbG0+uIVVGo4H9lbpFEZj&9MAy`O%f)jmqQ#j9RP5OAq%l{z7Y&RD4;XUnpEr7~S0mQ^LpAynidB|Y_v2W=ejb~-XeG!rV$x*@s;!)CsK3y}9c#ofUo6nub!54!Oew>s)1D34XfLSR$mTS!9W@Im42eHg@ zHGUISy(X9z^f5%0eX_wMy<%H&sj4#D-ZCAe@4_Vq!o+a^b|$P(xqo-v6PN)KQ!G+w zQXDZA56+tzTkvJUyNk7r&|Z6O#D;edzGTKx@7>iZjj`Q?)C`ab$oxAq>qeoysR)0t@)8|$KExD>z(p%t@ zZUp-PMwc8s<^8pVZw#U9f$H~>wsJIUrTTm%B&<2fDwK<%Qw6_cWrz8X-gq7Z-D5(! zk$$cUV4eqjPlc__hny`X_>VF`eR-0f4ArQ>ZgbL+*kg%;fx=A#&E8^5k6@(33Pjh} zwmiBA0EC9_Lj(jAg*{)uwE9)BExq;X3%(bG%A8D-G!%Xev{xA|N^GfnI^2Y*{45B4 zZuKKDNLWk0WKRE58kJb_MEv2AiFWMb(wFo}w)*g9LCdXzxc20qYhQvi=?*Z*%-pcG zLE4`e%HYm0stqPFISXf7jW;XY~ z0)D$Uw7ZpsCVFrAEWy~vBc_L|BLQMd>NC2=kq&pweR9fOJ;c=^QeWQ&w41>}>5 z#(xwXfw5Z4{(@{Y2a$IOE`QVDfId183kb21+?RQgpI>(R(x6?&5gp1UIp($|x&Uc!`Ng%d zVBE~NpDUl^UTe(7%4%K+r|_r#q-D6LPo=l9q_ik~vEch&=L9A`#&v}#;)PGNUhM^W;DB%L!gl{c_Pa~gqk1)1!8E-2=At~>nc>i9eFb;|YpB~s z;jc}O+F5$S3^nx><&SMPkn??K`NiLdes)ql7u_y49ZI56S_=DSq*~!0u8ih-!IkyL zu;AP153Qs??*J7a>=~E;{$#pYh>;}YanOvWm)tR^Rh;uHD2&*lPR?MMp^8QC{l>?n zytWst_G{0UBTR=ItLB)93I;z2fTy2h-*d{_zjq!qVt-YR-fna*`c~F1p71__ zc_oYLEM_mRo9PnQyo8;)`bTr|+&4N$nh<$%Uo~i3sX%Ee!0}?HMU&ZJpqB}xU?7Bk zBFHmd=q=ODMf%X=;5+3n1tCYa>K7{>s54=lRuKtB`KRP*mHn;k~?s@D=uYL-IN zXMDxU!ihd|?NU5YNC`HU-el1b)m-X5=3EnQ*xuDA?J_tPmdjioFU)D!!0#Ip?2jBw zxEjWA%J9`Q>C(*pw(3NV`J~yEXb(jmv5aP!2#*kk?7M$RT?)YB0(#Q;%eeM8@sG#; z$uM`9>Mqwa?%%vk*IOgboxS`GF}w*W0i|dVi@wR(wGx{-Al%?`Es-(o^jX+6n{h~n zGCzo*2x!2E1=Y9-*E)BYDj|YQLaJ^Ik}f8^e_z#@Sap!xEaM4>(!9dR(^znm@qK6+ z_AsH=Ik`|JHoMIvUsK-y;FFA;sR>qB;h*bb_cKbaGBUeQZ&f9j#?@Xa(w94)9yz{8 z_NyW$4d~`=Gc^Kfk8NRc7YnAUOuEs81r^o6<{qr6%r0_6M@Pre>1l6<#_h-;!wLt% zq#*6xE_VuLz*LqY0#ga+v7onW{YNNp6evFOeKMe1@5t)6y}_&Dof(t}W%0?

_&Z9|e;a!)+ zqnFUK?DU|2dSFx=ueVfBACe(1Q{g{bRsSh={t^fN8kP_#_o3~v(O9VOXsnnW{tXI^nU@D C$H_+k literal 0 HcmV?d00001 diff --git a/src/ccstatusline.ts b/src/ccstatusline.ts index efdd2ed..6c42683 100644 --- a/src/ccstatusline.ts +++ b/src/ccstatusline.ts @@ -480,11 +480,13 @@ function renderSingleLine(items: StatusItem[], settings: any, data: StatusJSON, case 'custom-command': if (item.commandPath) { try { - // Execute the command with a timeout + // Execute the command with JSON input via stdin + const timeout = item.timeout || 1000; // Default to 1000ms if not specified const output = execSync(item.commandPath, { encoding: 'utf8', + input: JSON.stringify(data), stdio: ['pipe', 'pipe', 'ignore'], - timeout: 1000 // 1 second timeout + timeout: timeout }).trim(); if (output) { diff --git a/src/config.ts b/src/config.ts index d95222f..989d2a2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -21,6 +21,7 @@ export interface StatusItem { commandPath?: string; // For custom-command type - the command to execute maxWidth?: number; // For custom-command type - max width of output preserveColors?: boolean; // For custom-command type - preserve ANSI colors from command output + timeout?: number; // For custom-command type - timeout in milliseconds (default: 1000) } export type FlexMode = 'full' | 'full-minus-40' | 'full-until-compact'; diff --git a/src/tui.tsx b/src/tui.tsx index c50ef11..ac244df 100644 --- a/src/tui.tsx +++ b/src/tui.tsx @@ -416,6 +416,8 @@ const ItemsEditor: React.FC = ({ items, onUpdate, onBack, line const [commandCursorPos, setCommandCursorPos] = useState(0); const [editingMaxWidth, setEditingMaxWidth] = useState(false); const [maxWidthInput, setMaxWidthInput] = useState(''); + const [editingTimeout, setEditingTimeout] = useState(false); + const [timeoutInput, setTimeoutInput] = useState(''); const separatorChars = ['|', '-', ',', ' ']; useInput((input, key) => { @@ -521,6 +523,34 @@ const ItemsEditor: React.FC = ({ items, onUpdate, onBack, line } else if (input && /\d/.test(input)) { setMaxWidthInput(maxWidthInput + input); } + } else if (editingTimeout) { + // In timeout editing mode + if (key.return) { + // Save the timeout + const currentItem = items[selectedIndex]; + if (currentItem) { + const timeout = parseInt(timeoutInput, 10); + const newItems = [...items]; + if (!isNaN(timeout) && timeout > 0) { + newItems[selectedIndex] = { ...currentItem, timeout: timeout }; + } else { + // Remove timeout if invalid (will use default 1000ms) + const { timeout: _, ...rest } = currentItem; + newItems[selectedIndex] = rest; + } + onUpdate(newItems); + } + setEditingTimeout(false); + setTimeoutInput(''); + } else if (key.escape) { + // Cancel editing + setEditingTimeout(false); + setTimeoutInput(''); + } else if (key.backspace || key.delete) { + setTimeoutInput(timeoutInput.slice(0, -1)); + } else if (input && /\d/.test(input)) { + setTimeoutInput(timeoutInput + input); + } } else if (moveMode) { // In move mode, use up/down to move the selected item if (key.upArrow && selectedIndex > 0) { @@ -658,6 +688,13 @@ const ItemsEditor: React.FC = ({ items, onUpdate, onBack, line setMaxWidthInput(currentItem.maxWidth ? currentItem.maxWidth.toString() : ''); setEditingMaxWidth(true); } + } else if (input === 't' && items.length > 0) { + // Edit timeout for custom command + const currentItem = items[selectedIndex]; + if (currentItem && currentItem.type === 'custom-command') { + setTimeoutInput(currentItem.timeout ? currentItem.timeout.toString() : '1000'); + setEditingTimeout(true); + } } else if (input === 'p' && items.length > 0) { // Toggle preserve colors for custom command const currentItem = items[selectedIndex]; @@ -764,7 +801,7 @@ const ItemsEditor: React.FC = ({ items, onUpdate, onBack, line helpText += ', (e)dit text'; } if (isCustomCommand) { - helpText += ', (e)dit cmd, (w)idth, (p)reserve colors'; + helpText += ', (e)dit cmd, (w)idth, (t)imeout, (p)reserve colors'; } helpText += ', Enter to move, (a)dd, (i)nsert, (d)elete, (c)lear line'; if (canToggleRaw) { @@ -798,6 +835,11 @@ const ItemsEditor: React.FC = ({ items, onUpdate, onBack, line Enter max width (blank for no limit): {maxWidthInput} Press Enter to save, ESC to cancel + ) : editingTimeout ? ( + + Enter timeout in milliseconds (default 1000): {timeoutInput} + Press Enter to save, ESC to cancel + ) : moveMode ? ( ↑↓ to move item, ESC or Enter to exit move mode ) : ( @@ -902,7 +944,11 @@ const ColorMenu: React.FC = ({ items, onUpdate, onBack }) => { case 'terminal-width': return 'Terminal Width'; case 'version': return 'Version'; case 'custom-text': return `Custom Text (${item.customText || 'Empty'})`; - case 'custom-command': return `Custom Command (${item.commandPath ? item.commandPath.substring(0, 20) + (item.commandPath.length > 20 ? '...' : '') : 'No command'})`; + case 'custom-command': { + const cmd = item.commandPath ? item.commandPath.substring(0, 20) + (item.commandPath.length > 20 ? '...' : '') : 'No command'; + const timeout = item.timeout ? ` ${item.timeout}ms` : ''; + return `Custom Command (${cmd}${timeout})`; + } default: return item.type; } };