ccommand 1.0.91 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,6 +20,7 @@ ccommand -v # 查看版本 view version
20
20
  ccommand find # 查找workspace find workspace
21
21
  ccommand # 执行当前script Execute the current script
22
22
  ccommand --init # 自动检测当前shell并输出集成脚本 Auto-detect shell and output init script
23
+ ccommand --install # 自动写入 shell 配置并生效(仅需执行一次)
23
24
  ccommand --init zsh # 输出shell集成脚本 eval "$(ccommand --init zsh)"
24
25
  CCOMMAND_BIN="node ./cli.mjs" ccommand --init zsh # 本地调试时指定二进制
25
26
  ccommand -help # 查看帮助 view help
package/dist/cli.cjs CHANGED
@@ -1 +1 @@
1
- require(`./src-BVkU499C.cjs`).t();
1
+ require(`./src-BhzUCm-2.cjs`).t();
package/dist/cli.mjs CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./src-DYLp0dfY.mjs";e();export{};
1
+ import{t as e}from"./src-BdGNEekO.mjs";e();export{};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- const e=require(`./src-BVkU499C.cjs`);exports.ccommand=e.t;
1
+ const e=require(`./src-BhzUCm-2.cjs`);exports.ccommand=e.t;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./src-DYLp0dfY.mjs";export{e as ccommand};
1
+ import{t as e}from"./src-BdGNEekO.mjs";export{e as ccommand};
@@ -0,0 +1,29 @@
1
+ import e from"node:fs/promises";import t from"node:path";import n from"node:process";import r from"@simon_he/colorize";import{isPlainObject as i,memorizeFn as a}from"lazy-js-utils";import{getPkg as o,getPkgTool as s,jsShell as c}from"lazy-js-utils/node";import l from"fast-glob";import{exec as u}from"node:child_process";import{promisify as d}from"node:util";import{Buffer as f}from"node:buffer";import p from"node:os";import m from"node:readline";var h=`1.1.0`;const g=console.log,_=(n.env.PI_LANG||n.env.LANG||``).startsWith(`zh`),v=_?`已取消...`:`Cancelled...`,y=_?`当前目录并未找到 package.json 文件`:`package.json file not found in current directory`,b=_?`正在为您执行...`:`is running for you...`;function x(){return g(`${v}`),n.exit(130)}const S=/^[\w./:@%+=,-]+$/;function C(e){let t=[],n=``,r=null,i=!1,a=()=>{i&&=(t.push(n),n=``,!1)};for(let t=0;t<e.length;t++){let o=e[t];if(r){if(o===r){r=null,i=!0;continue}if(r===`"`&&o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(/\s/.test(o)){for(a();t+1<e.length&&/\s/.test(e[t+1]);)t++;continue}if(o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0}return a(),t}function ee(e){if(!e)return[];if(Array.isArray(e))return e;let t=e.trim();return t?C(t):[]}function w(e){return e===``?`''`:S.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function T(e){return e.filter(e=>typeof e==`string`).map(w).join(` `)}function E(e){return S.test(e)}function te(e){let t=e[0];if(!t)return[``,``,[]];let n=e.indexOf(`--`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1),i=t[0]||``,a=t[1]||``,o=t.slice(2);return i.startsWith(`-`)?[``,``,e.slice()]:[i,a,[...o,...r]]}return t.startsWith(`-`)?[``,``,e.slice()]:e[1]&&e[1].startsWith(`-`)?[t,``,e.slice(1)]:[t,e[1]||``,e.slice(2)]}function D(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ne(e,t){let r=Object.keys(e),i=r.find(e=>e.startsWith(t));if(i)return i;try{if(!t)return;let e=t.split(``).map(e=>D(e)).join(`[_-\\w$.:]*`),n=new RegExp(e);return r.find(e=>n.test(e))}catch(e){g(`${_?`正则错误`:`RegExp error`}: ${e}`),n.exit(1)}}async function O(e){let{termStart:t,params:n,dirname:r,argv:i,val:a,isZh:o,pushHistory:s,jsShell:c,isNeedPrefix:l,fuzzyWorkspace:u}=e,d=[...n||[]],f=``;t!==`npm`&&d.length&&!d[0].startsWith(`--`)&&(f=d[0],d=d.slice(1));let p=f||a||u||``;a=`${p}`;let m=l(d)&&d.length>0&&d[0]!==`--`,h=[];if(t===`npm`){h.push(`run`),r&&h.push(`--prefix`,r),p&&h.push(p);let e=[...d];e[0]===`--`&&e.shift(),e.length&&h.push(`--`,...e)}else t===`pnpm`?(h.push(`run`),r&&h.push(`--filter`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`yarn`?(r&&h.push(`workspace`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`bun`?(h.push(`run`),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`make`&&(p&&h.push(p),m&&h.push(`--`),h.push(...d));let g=T([t,...h]),_=[];i[0]===`find`?(_.push(`pfind`),r&&_.push(r)):_.push(`prun`),p&&_.push(p),_.push(...d);let v=T(_);return e.recordHistory!==!1&&await s(v),{command:g,text:_.map((e,t)=>t===_.length-1&&E(e)?e:w(e)).join(` `),val:a,historyText:v}}let k=null,A=[],j=null,M=null;function N(){return A}async function P(r){let i=r===`pnpm`?t.resolve(n.cwd(),`pnpm-workspace.yaml`):t.resolve(n.cwd(),`package.json`);try{try{M=(await e.stat(i)).mtimeMs}catch{}return await e.readFile(i,`utf-8`)}catch{return``}}async function F(e,t){if(!t)return[];if(e===`pnpm`)try{if(!k){let e=await import(`yamljs`);k=e&&e.default||e}let e=k.parse(t)?.packages;return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}try{let e=JSON.parse(t)?.workspaces;return i(e)?e?.packages||[]:Array.isArray(e)?e:[]}catch{return[]}}async function I(e){if(!e.length)return{};let t=await l(e.map(e=>`${e}/package.json`),{dot:!0,ignore:[`**/node_modules/**`]});return(await Promise.all(t.map(async e=>{try{let t=await o(e);if(!t)return null;let{name:n,scripts:r}=t;return{name:n,scripts:r}}catch{return null}}))).reduce((e,t)=>(!t||!t.name||!t.scripts||(e[t.name]=Object.keys(t.scripts).reduce((e,n)=>(n.startsWith(`//`)||(e[n]=t.scripts[n]),e),{})),e),{})}async function L(r){if(j)try{let i=r===`pnpm`?t.resolve(n.cwd(),`pnpm-workspace.yaml`):t.resolve(n.cwd(),`package.json`),a=await e.stat(i);if(M&&a.mtimeMs<=M)return j}catch{return j}return j=await I(await F(r,await P(r)))||{},A=Object.keys(j).filter(e=>j&&j[e]&&Object.keys(j[e]).length),j}async function R(e){return L(e)}const z=a(o),B={};async function re(e,t){try{let n=e||`root`;if(B[n])return B[n];let r;return!e||t===`bun`||t===`npm`?r=(await z(`./package.json`))?.scripts:(t===`pnpm`||t===`yarn`)&&(r=(await R(t))[e]||(await z(`${e}/package.json`))?.scripts),r&&(B[n]=r),r}catch{return null}}async function ie(e,t,n,r,i,a,o,s,c,l){let u,d=``,f=r[0]?.trim(),p=T([t,...n]),m=T([t||r[0]||``,...n]);t&&f&&f!==t?console.log(o({text:`🤔 ${o({text:`'${r[0]}'`,color:`cyan`})} ${s?`自动的为您匹配成`:`automatically match for you`} ${o({text:`'${p}'`,color:`cyan`})} `,color:`yellow`})):t&&console.log(o({text:`🤔 is running for you... ${p}`,color:`magenta`}));let h=()=>{switch(e){case`npm`:{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),T([`npm`,...e])}case`pnpm`:return T([`pnpm`,`run`,t,...n]);case`yarn`:return T([`yarn`,t,...n]);case`bun`:return T([`bun`,`run`,t,...n]);case`make`:return T([`make`,t,...n]);default:return T([t,...n])}},g=()=>{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),T([`npm`,...e])};switch(e){case`npm`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`pnpm`:{let{status:e,result:t=``}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});if(d=t,u=e,d.includes(`pnpm versions with respective Node.js version support`)){console.log(o({text:s?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let{status:e,result:t}=await a(g(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t}break}case`yarn`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`bun`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`make`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}}if(u===0){let e=T([`prun`,t,...n]);return await i(e),console.log(o({color:`green`,text:`\n${e} ${c} 🎉`}))}return console.log(o({color:`red`,text:`\ncommand ${o({bold:!0,color:`cyan`,text:`'${m}'`})} ${l} ❌`}))}let V=null;async function ae(){return V||(V=(await import(`@simon_he/colorize`)).default,V)}const H=new Map;function oe(){let e=(n.env.CCOMMAND_NO_HISTORY||n.env.NO_HISTORY||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}function se(){let e=n.env.CCOMMAND_HISTORY_HINT||``;if(e)return e;let r=n.env.HOME||p.homedir(),i=n.env.XDG_CACHE_HOME||t.join(r,`.cache`);return t.join(i,`ccommand`,`last-history`)}async function ce(n){let r=se();try{await e.mkdir(t.dirname(r),{recursive:!0});let i=Date.now();await e.writeFile(r,`${i}\t${n}\n`,`utf8`)}catch{}}function le(){return(n.env.SHELL||`/bin/bash`).split(`/`).pop()||`bash`}function ue(e){let r=n.env.HOME||p.homedir(),i=``,a=`bash`;switch(e){case`zsh`:i=t.join(r,`.zsh_history`),a=`zsh`;break;case`bash`:i=n.env.HISTFILE||t.join(r,`.bash_history`),a=`bash`;break;case`fish`:i=t.join(r,`.local`,`share`,`fish`,`fish_history`),a=`fish`;break;default:i=n.env.HISTFILE||t.join(r,`.bash_history`),a=`bash`}return{historyFile:i,historyFormat:a}}function de(e,t){if(t===`fish`){let t=e.split(/\r?\n/),n=[],r=[];for(let e of t)e.startsWith(`- cmd: `)?(r.length&&(n.push(r.join(`
2
+ `)),r=[]),r.push(e)):r.length?r.push(e):e.trim()!==``&&n.push(e);return r.length&&n.push(r.join(`
3
+ `)),n.filter(Boolean)}if(t===`zsh`)return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);let n=e.split(/\r?\n/),r=[];for(let e=0;e<n.length;e++){let t=n[e];if(t.startsWith(`#`)){let i=n[e+1]??``;r.push(`${t}\n${i}`),e++}else t.trim()!==``&&r.push(t)}return r}function U(e,t){if(t===`fish`){let t=e.split(`
4
+ `)[0].match(/^- cmd: (.*)$/);return(t?t[1]:e).trim()}if(t===`zsh`){let t=e.match(/^[^;]*;(.+)$/);return(t?t[1]:e).trim()}if(e.startsWith(`#`)){let t=e.split(/\r?\n/);return(t[1]??t[0]).trim()}return e.trim()}async function W(t){if(oe())return;let r=await ae();g(r({text:`${_?`快捷指令`:`shortcut command`}: ${t}`,color:`blue`,bold:!0}));let i=le(),{historyFile:a,historyFormat:o}=ue(i);try{await ce(t);try{await e.access(a)}catch{g(r({text:`${_?`未找到 ${i} 历史文件`:`${i} history file not found`}`,color:`yellow`}));return}let s=await e.stat(a).catch(()=>null),c=Math.floor(Date.now()/1e3),l=``;l=o===`zsh`?`: ${c}:0;${t}`:o===`fish`?`- cmd: ${t}\n when: ${c}`:n.env.HISTTIMEFORMAT?`#${c}\n${t}`:t;let u=[],d=H.get(a);u=d&&s&&d.mtimeMs===s.mtimeMs&&d.size===s.size&&d.format===o?d.entries.slice():de(await e.readFile(a,`utf8`),o);let p=[],m=U(l,o),h=null;for(let e of u){if(U(e,o)===m){if(o===`fish`){h=e;continue}continue}p.push(e)}if(o===`fish`&&h){let e=h.split(`
5
+ `),t=!1,n=e.map(e=>e.trim().startsWith(`when:`)||e.startsWith(` when:`)?(t=!0,` when: ${c}`):e);t||n.splice(1,0,` when: ${c}`),p.push(n.join(`
6
+ `))}else p.push(l);let v=``;v=o===`fish`?`${p.map(e=>e.trimEnd()).join(`
7
+ `)}\n`:`${p.join(`
8
+ `)}\n`;let y=`${a}.ccommand.tmp`;await e.writeFile(y,v,`utf8`),await e.rename(y,a);try{let t=await e.stat(a);H.set(a,{mtimeMs:t.mtimeMs,size:t.size,entries:p,format:o})}catch{H.set(a,{mtimeMs:Date.now(),size:f.byteLength(v),entries:p,format:o})}}catch(e){g(r({text:`${_?`❌ 添加到 ${i} 历史记录失败`:`❌ Failed to add to ${i} history`}${e?`: ${String(e)}`:``}`,color:`red`}))}}const fe=d(u),G={};async function K(e){if(G[e]!==void 0)return G[e];try{return await fe(`command -v ${e}`),G[e]=!0,!0}catch{return G[e]=!1,!1}}let q=null;async function pe(){return q===null&&(q=await K(`bun`)?`bun`:await K(`esno`)?`esno`:await K(`tsx`)?`tsx`:null),q}async function J(e,t,i,a){let o=T([`prun`,e]);await W(o);let{status:s}=await c(t,{errorExit:!1,isLog:!1,stdio:`inherit`}),l=s===0;return l||(n.exitCode=s??1),g(r({color:l?`green`:`red`,text:`\n"${o}" ${l?i:a} ${l?`🎉`:`❌`}`})),l}async function Y(e,i,a){let o=t.extname(e),s=`node`;if(o===`.ts`)if(q===null&&await pe(),q)s=q;else return g(r({text:_?`没有找到可以直接执行TypeScript的工具,推荐安装下列工具之一:
9
+ - npm install -g bun
10
+ - npm install -g esno
11
+ - npm install -g tsx`:`No TypeScript executor found. Recommend installing one of:
12
+ - npm install -g bun
13
+ - npm install -g esno
14
+ - npm install -g tsx`,color:`yellow`})),n.exitCode=1,!1;return J(e,T([s,e]),i,a)}async function me(n,r,i){let a=[`.js`,`.ts`,`.mjs`,`.cjs`],o=t.extname(n);if(o&&a.includes(o)&&await e.stat(n).then(e=>e.isFile()).catch(()=>!1))return await Y(n,r,i),!0;if(!o)for(let t of a){let a=`${n}${t}`;if(await e.stat(a).then(e=>e.isFile()).catch(()=>!1))return await Y(a,r,i),!0}let s=await e.stat(n).catch(()=>null);if(s&&s.isDirectory())for(let o of a){let a=t.join(n,`index${o}`);if(await e.stat(a).then(e=>e.isFile()).catch(()=>!1))return await Y(a,r,i),!0}return!1}async function he(e,n,i){e.endsWith(`.py`)?await J(e,`python ${e}`,n,i):e.endsWith(`.rs`)&&((await c(`rustc ${e}`)).status===0&&(await c(`./${t.basename(e,`.rs`)}`,{stdio:`inherit`})).status===0?(await W(`prun ${e}`),g(r({color:`green`,text:`\n"prun --${e}" ${n} 🎉`}))):g(r({color:`red`,text:`\ncommand "prun ${e}" ${i} ❌`})))}async function ge(t){try{let n=(await e.readFile(t,`utf-8`)).split(/\r?\n/),r=new Set;for(let e=0;e<n.length;e++){let t=n[e].trim();if(t.startsWith(`.PHONY:`)){let e=t.substring(7).replace(/\\\\$/g,``).trim();for(let t of e.split(/\s+/))t&&r.add(t)}}let i=[];for(let e of r){let t=``;for(let r=0;r<n.length;r++){let i=n[r];if(!i)continue;let a=i.trimStart();if(a.startsWith(`${e}:`)||a.startsWith(`${e} :`)){let e=a.split(`:`,2)[1]||``,i=e.indexOf(`;`);if(i!==-1&&(t=e.slice(i+1).trim()),!t&&r+1<n.length){let e=n[r+1];e.startsWith(` `)&&(t=e.trim())}if(!t){let n=e.trim();t=n?n.replace(/\s+/g,` `).slice(0,120):``}break}}i.push({name:e,detail:t?`${t}...`:``})}return i}catch{return[]}}const _e=new Set([`-`,`_`,` `,`.`,`/`,`\\`,`:`]);function ve(e){return e>=`a`&&e<=`z`}function ye(e){return e>=`A`&&e<=`Z`}function be(e,t){if(t<=0)return!0;let n=e[t-1]||``,r=e[t]||``;return _e.has(n)?!0:ve(n)&&ye(r)}function xe(e,t){let n=[],r=0;for(let i=0;i<t.length&&r<e.length;i++)t[i]===e[r]&&(n.push(i),r++);return r===e.length?n:null}function Se(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(!n)return{score:0,positions:[]};if(r===n)return{score:1e5,positions:[...t].map((e,t)=>t)};if(r.startsWith(n))return{score:9e4-(t.length-e.length),positions:[...e].map((e,t)=>t)};let i=r.indexOf(n);if(i!==-1)return{score:7e4-i,positions:[...e].map((e,t)=>i+t)};let a=xe(n,r);if(!a)return null;let o=1e3,s=-1;for(let e of a)o+=10,e===s+1&&(o+=15),e===0&&(o+=12),be(t,e)&&(o+=8),s!==-1&&(o-=e-s-1),s=e;return o+=Math.max(0,30-(t.length-e.length)),{score:o,positions:a}}function Ce(e,t){let n=e.trim().split(/\s+/).filter(Boolean);if(!n.length)return{score:0,positions:[]};let r=0,i=[];for(let e of n){let n=Se(e,t);if(!n)return null;r+=n.score,i.push(...n.positions)}return{score:r,positions:i}}function X(e,t){if(!t.trim())return e.map((e,t)=>({item:e,score:0,index:t,positions:[]}));let n=e.map((e,n)=>{let r=Ce(t,e);return r?{item:e,score:r.score,index:n,positions:r.positions}:null}).filter(Boolean);return n.sort((e,t)=>t.score===e.score?e.index-t.index:t.score-e.score),n}function we(e,t){return!t||t<=0||e.length<=t?e:t<=3?e.slice(0,t):`${e.slice(0,t-3)}...`}function Te(e,t){if(!t||t<=0||e.length<=t)return{text:e,visibleLength:e.length};if(t<=3)return{text:e.slice(0,t),visibleLength:t};let n=t-3;return{text:`${e.slice(0,n)}...`,visibleLength:n}}function Ee(e,t,n,r){if(!n||!t.length)return e;let i=new Set(t),a=``;for(let t=0;t<e.length;t++){let o=e[t]||``;i.has(t)?a+=`${n}${o}${r}`:a+=o}return a}function De(e,t){return t?`\u001B[2m${e}\u001B[0m`:e}function Oe(){return!!(n.stdin.isTTY&&n.stdout.isTTY)}function ke(){let e=(n.env.CCOMMAND_NO_PICKER||n.env.NO_PICKER||n.env.CCOMMAND_NO_GUM||n.env.NO_GUM||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function Z(e){return!(ke()||!Oe()||n.env.CI)}async function Q(e,{placeholder:t,maxItems:r}={}){if(!Oe())return{status:130,result:``};let i=n.stdin,a=n.stdout,o=!!(a.isTTY&&!n.env.NO_COLOR),s=(t||(_?`请选择一个选项`:`Select`)).trim(),c=_?`上/下选择 左/右移动 Enter确认 Esc取消`:`Up/Down Move Left/Right Cursor Enter select Esc cancel`,l=``,u=0,d=0,f=0,p=0,h=Math.max(4,Math.min(r||10,(a.rows||24)-5)),g=X(e,l),v=()=>{o&&a.write(`\x1B[?25l`)},y=()=>{o&&a.write(`\x1B[?25h`)},b=()=>{if(p){for(let e=0;e<p;e++)m.clearLine(a,0),e<p-1&&m.moveCursor(a,0,-1);m.cursorTo(a,0),p=0}},x=()=>{u<d?d=u:u>=d+h&&(d=u-h+1),d<0&&(d=0)},S=()=>{b();let e=[],t=`? ${s}`;e.push(De(we(t,a.columns),o));let n=` > ${l.slice(0,f)}|${l.slice(f)}`;e.push(we(n,a.columns)),g.length?(x(),g.slice(d,d+h).forEach((t,n)=>{let r=d+n===u,i=r?`> `:` `,s=a.columns?Math.max(0,a.columns-i.length):void 0,c=Te(t.item,s),l=t.positions.filter(e=>e>=0&&e<c.visibleLength),f=o&&r?`\x1B[44m`:``,p=o?`${f}\u001B[1m\u001B[35m`:``,m=o?`\x1B[0m`:``,h=f?`${m}${f}`:m,g=``;f&&(g+=f),g+=i,g+=Ee(c.text,l,p,h),f&&(g+=m),e.push(g)})):e.push(_?` (无匹配)`:` (no matches)`),e.push(``);let r=g.length?`(${u+1}/${g.length})`:``;e.push(De(` ${c} ${r}`.trimEnd(),o)),a.write(e.join(`
15
+ `)),p=e.length},C=()=>{g=X(e,l),u=0,u>=g.length&&(u=g.length-1),u<0&&(u=0),f>l.length&&(f=l.length),f<0&&(f=0),x()};return new Promise(e=>{let t=!1;function n(n,i){t||(t=!0,r(),e({status:n,result:i}))}function r(){i.removeListener(`data`,o),i.isTTY&&i.setRawMode(!1),i.pause(),b(),y()}function o(e){let t=e.toString(`utf8`);if(t===``||t===``)return n(130,``);if(t===`\r`||t===`
16
+ `){if(!g.length){a.write(`\x07`);return}return n(0,g[u]?.item||``)}if(t.startsWith(`\x1B`)){if(t===`\x1B`)return n(130,``);if(t===`\x1B[A`){g.length&&(u=u>0?u-1:g.length-1),S();return}if(t===`\x1B[B`){g.length&&(u=u<g.length-1?u+1:0),S();return}if(t===`\x1B[D`){f>0&&f--,S();return}if(t===`\x1B[C`){f<l.length&&f++,S();return}if(t===`\x1B[5~`){u=Math.max(0,u-h),S();return}if(t===`\x1B[6~`){u=Math.min(g.length-1,u+h),S();return}if(t===`\x1B[3~`){f<l.length&&(l=`${l.slice(0,f)}${l.slice(f+1)}`,C(),S());return}return}if(t===``||t===`\b`||t===`\b`){l.length&&f>0&&(l=`${l.slice(0,f-1)}${l.slice(f)}`,f=Math.max(0,f-1),C(),S());return}let r=``;for(let e of t)e>=` `&&e!==``&&(r+=e);r&&(l=`${l.slice(0,f)}${r}${l.slice(f)}`,f+=r.length,C(),S())}i.isTTY&&i.setRawMode(!0),i.resume(),i.on(`data`,o),v(),S()})}const Ae=new Set([`1`,`true`,`yes`]);function je(){let e=n.env.CCOMMAND_NO_AUTO_INSTALL||n.env.NO_AUTO_INSTALL||``;return Ae.has(e.toLowerCase())}function Me(){let e=n.env.SHELL||``;return n.env.FISH_VERSION&&`fish`||n.env.ZSH_VERSION&&`zsh`||n.env.BASH_VERSION&&`bash`||e&&e.split(`/`).pop()||``}function Ne(e){let r=n.env.HOME||p.homedir();return e===`fish`?t.join(r,`.config`,`fish`,`config.fish`):e===`zsh`?t.join(r,`.zshrc`):e===`bash`?t.join(r,`.bashrc`):``}function Pe(e,t=`ccommand`){let n=t||`ccommand`;return e===`fish`?`eval (${n} --init fish)`:`eval "$(${n} --init ${e})"`}function Fe(e){return e.includes(`# ccommand init`)||e.includes(`ccommand --init`)}async function Ie(i={}){if(je())return!1;let a=Me();if(!a)return!1;let o=Ne(a);if(!o)return!1;let s=``;try{s=await e.readFile(o,`utf8`)}catch{}if(!i.force&&s&&Fe(s))return!1;let c=[``,`# ccommand init`,Pe(a,i.bin||n.env.CCOMMAND_BIN||`ccommand`),``].join(`
17
+ `);try{return await e.mkdir(t.dirname(o),{recursive:!0}),await e.writeFile(o,`${s.trimEnd()}${c}`,`utf8`),i.quiet||g(r({color:`yellow`,text:_?`已自动写入 ${o},请重新打开终端或执行: source ${o}`:`Auto-installed shell hook into ${o}. Please reopen the terminal or run: source ${o}`})),!0}catch{return!1}}const Le=a(o),Re=re,ze=O,$=ie;function Be(e,t,n){return!!(n[1]&&t.length)}async function Ve(i=n.argv.slice(2)){let a=_?`当前目录不存在任何子目录`:`The current directory does not have any subdirectories`,o=_?`运行成功`:`run successfully`,l=_?`运行失败`:`run error`,u=ee(i),d=u[0]||``,f=d===`init`||d===`--init`,p=d===`-h`||d===`--help`,m=d===`-v`||d===`--version`;if(d===`--install`||d===`install`){await Ie({force:!0,quiet:!1,bin:n.env.CCOMMAND_BIN||`ccommand`});return}if(!f&&!p&&!m&&await Ie({quiet:!0,bin:n.env.CCOMMAND_BIN||`ccommand`}),f){let e=u[1],t=u[2],i=n.env.CCOMMAND_BIN,a=w(t||i||`ccommand`),o=n.env.SHELL||``,s=n.env.FISH_VERSION&&`fish`||n.env.ZSH_VERSION&&`zsh`||n.env.BASH_VERSION&&`bash`||o&&o.split(`/`).pop()||``,c=e||s||`zsh`,l=``;if(c===`zsh`)l=[`ccommand() {`,` local bin=${a}`,` local -a cmd`," cmd=(${=bin})",' command "${cmd[@]}" "$@"',`}`,`__ccommand_sync_history() {`,' local history_disable=${CCOMMAND_NO_HISTORY:-${NO_HISTORY:-""}}'," local history_disable_lower=${history_disable:l}",` if [[ $history_disable_lower == "1" || $history_disable_lower == "true" || $history_disable_lower == "yes" ]]; then`,` return`,` fi`," local history_hint=${CCOMMAND_HISTORY_HINT:-${XDG_CACHE_HOME:-$HOME/.cache}/ccommand/last-history}",` if [[ ! -f $history_hint ]]; then`,` return`,` fi`,` local line`,` line=$(<"$history_hint")`," local hint_ts=${line%%$'\\t'*}"," local hint_cmd=${line#*$'\\t'}",` if [[ -z $hint_ts || $hint_ts == $line ]]; then`,` hint_cmd=$line`,` hint_ts=""`,` fi`,' if [[ -n $hint_ts && $hint_ts == ${__CCOMMAND_HISTORY_HINT_TS:-""} ]]; then',` return`,` fi`,` __CCOMMAND_HISTORY_HINT_TS=$hint_ts`,` fc -R`,` if [[ $hint_cmd != pfind* && $hint_cmd != prun* ]]; then`,` return`,` fi`,` local last_line`,` last_line=$(fc -l -1 2>/dev/null)`,` local last_cmd`,` last_cmd=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*[0-9]+[[:space:]]*//")`,` if [[ $last_cmd == "$hint_cmd" ]]; then`,` return`,` fi`,` if [[ $last_cmd == ccommand || $last_cmd == ccommand\\ * ]]; then`,` local last_num`,` last_num=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*([0-9]+).*/\\1/")`,` if [[ -n $last_num ]]; then`,` history -d $last_num 2>/dev/null`,` fi`,` fi`,` print -s -- "$hint_cmd"`,`}`,``,`if ! typeset -f __ccommand_precmd >/dev/null; then`,` __ccommand_precmd() { __ccommand_sync_history }`,` autoload -Uz add-zsh-hook`,` add-zsh-hook precmd __ccommand_precmd`,`fi`].join(`
18
+ `);else if(c===`bash`)l=[`ccommand() {`,` local bin=${a}`,` local -a cmd`,` read -r -a cmd <<< "$bin"`,' command "${cmd[@]}" "$@"',`}`,`__ccommand_sync_history() {`,' local history_disable=${CCOMMAND_NO_HISTORY:-${NO_HISTORY:-""}}',` local history_disable_lower`,` history_disable_lower=$(printf '%s' "$history_disable" | tr '[:upper:]' '[:lower:]')`,` if [[ $history_disable_lower == "1" || $history_disable_lower == "true" || $history_disable_lower == "yes" ]]; then`,` return`,` fi`," local history_hint=${CCOMMAND_HISTORY_HINT:-${XDG_CACHE_HOME:-$HOME/.cache}/ccommand/last-history}",` if [[ ! -f $history_hint ]]; then`,` return`,` fi`,` local line`,` line=$(<"$history_hint")`,` local hint_ts="\${line%%$'\\t'*}"`,` local hint_cmd="\${line#*$'\\t'}"`,` if [[ -z $hint_ts || $hint_ts == "$line" ]]; then`,` hint_cmd="$line"`,` hint_ts=""`,` fi`,' if [[ -n $hint_ts && $hint_ts == "${__CCOMMAND_HISTORY_HINT_TS:-}" ]]; then',` return`,` fi`,` __CCOMMAND_HISTORY_HINT_TS=$hint_ts`,` if [[ $hint_cmd != pfind* && $hint_cmd != prun* ]]; then`,` return`,` fi`,` history -n`,` local last_line`,` last_line=$(history 1)`,` local last_cmd`,` last_cmd=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*[0-9]+[[:space:]]*//")`,` if [[ $last_cmd == "$hint_cmd" ]]; then`,` return`,` fi`,` if [[ $last_cmd == ccommand || $last_cmd == ccommand\\ * ]]; then`,` local last_num`,` last_num=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*([0-9]+).*/\\1/")`,` if [[ -n $last_num ]]; then`,` history -d "$last_num" 2>/dev/null`,` fi`,` fi`,` history -s -- "$hint_cmd"`,`}`,``,'if [[ -z "${__CCOMMAND_PROMPT_INSTALLED:-}" ]]; then',` __CCOMMAND_PROMPT_INSTALLED=1`,' if [[ -n "${PROMPT_COMMAND:-}" ]]; then',' PROMPT_COMMAND="__ccommand_sync_history;${PROMPT_COMMAND}"',` else`,` PROMPT_COMMAND="__ccommand_sync_history"`,` fi`,`fi`].join(`
19
+ `);else if(c===`fish`)l=[`function ccommand`,` set -l bin ${a}`,` set -l cmd (string split -- " " $bin)`,` command $cmd $argv`,` set -l history_disable $CCOMMAND_NO_HISTORY`,` if test -z "$history_disable"`,` set history_disable $NO_HISTORY`,` end`,` set history_disable (string lower -- (string trim -- "$history_disable"))`,` if test "$history_disable" != "1" -a "$history_disable" != "true" -a "$history_disable" != "yes"`,` history --merge`,` set -l history_hint $CCOMMAND_HISTORY_HINT`,` if test -z "$history_hint"`,` set -l cache_home $XDG_CACHE_HOME`,` if test -z "$cache_home"`,` set cache_home "$HOME/.cache"`,` end`,` set history_hint "$cache_home/ccommand/last-history"`,` end`,` if test -f "$history_hint"`,` set -l last_cmd (string trim -- (cat "$history_hint"))`,` set -l last_cmd (string replace -r "^[0-9]+\\t" "" -- "$last_cmd")`,` if string match -q "pfind*" -- "$last_cmd"; or string match -q "prun*" -- "$last_cmd"`,` set -l last_hist (history --max=1)`,` if test "$last_hist" != "$last_cmd"`,` history add -- "$last_cmd"`,` end`,` end`,` end`,` end`,`end`].join(`
20
+ `);else return g(r({color:`red`,text:_?`不支持的 shell: ${c}`:`Unsupported shell: ${c}`}));return console.log(l)}if(u[0]===`-v`||u[0]===`--version`)return g(r({text:_?`ccommand 当前版本: ${h}`:`ccommand Version: ${h}`,color:`green`}));if(u[0]===`-h`||u[0]===`--help`){let e=(await import(`terminal-link`)).default,t=e(_?`打开一个新的问题`:`open an issue`,`https://github.com/Simon-He95/ccommand/issues`),n=e(_?`✨帮助点一个星星`:`✨star it`,`https://github.com/Simon-He95/ccommand`);return g(r({color:`white`,text:`
21
+ ${r({bold:!0,text:`Common Commands:`,bgColor:`blue`})}
22
+ ${r({text:`- ccommand -v 查看当前版本
23
+ - ccommand -help 查看帮助
24
+ - ccommand 执行当前package.json
25
+ - ccommand find 查找当前workspace的所有目录
26
+ - ccommand --init [zsh|bash|fish] [bin] 输出 shell 集成脚本(未传则自动检测)
27
+ `,color:`cyan`})}
28
+ If you encounter any problems, you can ${r({color:`magenta`,text:t})}.
29
+ If you like it, please ${r({text:n,bold:!0,color:`cyan`})} `}))}else if(u[0]?.endsWith(`.py`)||u[0]?.endsWith(`.rs`)){await he(u[0],o,l);return}let v;try{v=await s()}catch{try{if(await e.readFile(t.resolve(n.cwd(),`./Makefile`),`utf-8`)){v=`make`;let e=await ge(`./Makefile`),t=e.reduce((e,t)=>{let{name:n,detail:r}=t;return e[n]=r,e},{}),n=``,i=[];if(u.length){let e=u[0];if(i=u.slice(1),n=ne(t,e)||``,!n)return g(r({color:`red`,text:y}))}else{if(!await Z(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 make 目标名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a make target explicitly.`}));let{result:t,status:i}=await Q(e.map(e=>e.name),{placeholder:_?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(i===130)return x();n=t}await $(v,n.trim(),i,u,W,c,r,_,o,l);return}else return g(r({color:`red`,text:y}))}catch{if(u[0]!==`find`)return g(r({color:`red`,text:y}))}}let[S,C,E]=te(u),D=S,O;if(u[0]===`find`){if(C)await R(v),D=N().filter(e=>e.includes(C))[0];else if(v===`yarn`){if(await R(v),!N().length)return g(r({color:`yellow`,text:a}));if(!await Z(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:t}=await Q(N(),{placeholder:_?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(D=e,t===130)return x()}else if(v===`pnpm`){if(await R(v),!N().length)return g(r({color:`yellow`,text:a}));if(!await Z(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:t}=await Q(N(),{placeholder:_?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(t===130)return x();D=e.trim()}else return g(r({color:`red`,text:_?`find指令只能支持在yarn或pnpm的monorepo模式下使用`:`find command only support yarn or pnpm`}));O=await Re(D,v)||void 0}else{O=await Re(D,v)||void 0;try{let t=(await Le(`./package.json`)||{})?.scripts;if(t&&t[u[0]]){await $(v,u[0],u.slice(1),u,W,c,r,_,o,l);return}else if(t&&S){let i=ne(t,u[0]);if(i){let e=u.slice(1);await $(v,i,e,u,W,c,r,_,o,l);return}else{if(await me(u[0],o,l))return;let t=`${S}.py`;if(await e.stat(t).then(e=>e.isFile()).catch(()=>!1)){g(r({text:`🤔 ${_?`找到Python文件`:`Found Python file`}: ${t}`,color:`yellow`}));return}let i=`${S}.rs`;if(await e.stat(i).then(e=>e.isFile()).catch(()=>!1))return;g(r({color:`red`,text:`"${u[0]}" ${_?`在工作区、当前目录中找不到任何可执行的脚本或文件,请检查`:`is not found in workspace, current directory or current scripts, please check`}`})),n.exit(1)}}}catch{}}let k=``;if(!C||u[0]===`find`&&(!u[2]||u[2].startsWith(`--`))){if(!O||Object.keys(O).length===0)return g(r({color:`red`,text:_?`找不到任何可执行脚本`:`No scripts found`}));let e=Object.keys(O).map(e=>`${e}: ${(O?.[e]??``).replace(/[\r\n]+/g,` `)}`);if(!await Z(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入脚本名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a script name explicitly.`}));let{result:t,status:n}=await Q(e,{placeholder:_?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return x();k=t.substring(0,t.indexOf(`: `))}if(!C&&!k)return x();g(r({text:`🤔 ${b} ${k}`,color:`magenta`}));let{command:A,text:j,val:M,historyText:P}=await ze({termStart:v,params:E,dirname:D,argv:u,val:k,runMsg:b,isZh:_,pushHistory:W,jsShell:c,isNeedPrefix:e=>Be(u[0],e,u),fuzzyWorkspace:C,recordHistory:u[0]!==`find`}),F=A;k=M;let{status:I,result:L=``}=await c(F,{errorExit:!1,stdio:`inherit`});if(u[0]===`find`&&await W(P),I===0)return g(r({color:`green`,text:`\n${j} 🎉`}));if(L.includes(`pnpm versions with respective Node.js version support`)){g(r({text:_?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let e=[...E];e[0]===`--`&&e.shift();let{status:t}=await c(T([`npm`,`run`,k,...e.length?[`--`,...e]:[]]),`inherit`);if(t===0)return g(r({color:`green`,text:`\n${j} 🎉`}))}g(r({color:`red`,text:`\ncommand ${k} ${l} ❌`}))}export{Ve as t};
@@ -0,0 +1,29 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs/promises`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`@simon_he/colorize`);d=s(d);let f=require(`lazy-js-utils`),p=require(`lazy-js-utils/node`),m=require(`fast-glob`);m=s(m);let h=require(`node:child_process`),g=require(`node:util`),_=require(`node:buffer`),v=require(`node:os`);v=s(v);let y=require(`node:readline`);y=s(y);var b=`1.1.0`;const x=console.log,S=(u.default.env.PI_LANG||u.default.env.LANG||``).startsWith(`zh`),C=S?`已取消...`:`Cancelled...`,w=S?`当前目录并未找到 package.json 文件`:`package.json file not found in current directory`,T=S?`正在为您执行...`:`is running for you...`;function E(){return x(`${C}`),u.default.exit(130)}const D=/^[\w./:@%+=,-]+$/;function O(e){let t=[],n=``,r=null,i=!1,a=()=>{i&&=(t.push(n),n=``,!1)};for(let t=0;t<e.length;t++){let o=e[t];if(r){if(o===r){r=null,i=!0;continue}if(r===`"`&&o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(/\s/.test(o)){for(a();t+1<e.length&&/\s/.test(e[t+1]);)t++;continue}if(o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0}return a(),t}function ee(e){if(!e)return[];if(Array.isArray(e))return e;let t=e.trim();return t?O(t):[]}function k(e){return e===``?`''`:D.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function A(e){return e.filter(e=>typeof e==`string`).map(k).join(` `)}function j(e){return D.test(e)}function te(e){let t=e[0];if(!t)return[``,``,[]];let n=e.indexOf(`--`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1),i=t[0]||``,a=t[1]||``,o=t.slice(2);return i.startsWith(`-`)?[``,``,e.slice()]:[i,a,[...o,...r]]}return t.startsWith(`-`)?[``,``,e.slice()]:e[1]&&e[1].startsWith(`-`)?[t,``,e.slice(1)]:[t,e[1]||``,e.slice(2)]}function M(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function N(e,t){let n=Object.keys(e),r=n.find(e=>e.startsWith(t));if(r)return r;try{if(!t)return;let e=t.split(``).map(e=>M(e)).join(`[_-\\w$.:]*`),r=new RegExp(e);return n.find(e=>r.test(e))}catch(e){x(`${S?`正则错误`:`RegExp error`}: ${e}`),u.default.exit(1)}}async function ne(e){let{termStart:t,params:n,dirname:r,argv:i,val:a,isZh:o,pushHistory:s,jsShell:c,isNeedPrefix:l,fuzzyWorkspace:u}=e,d=[...n||[]],f=``;t!==`npm`&&d.length&&!d[0].startsWith(`--`)&&(f=d[0],d=d.slice(1));let p=f||a||u||``;a=`${p}`;let m=l(d)&&d.length>0&&d[0]!==`--`,h=[];if(t===`npm`){h.push(`run`),r&&h.push(`--prefix`,r),p&&h.push(p);let e=[...d];e[0]===`--`&&e.shift(),e.length&&h.push(`--`,...e)}else t===`pnpm`?(h.push(`run`),r&&h.push(`--filter`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`yarn`?(r&&h.push(`workspace`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`bun`?(h.push(`run`),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`make`&&(p&&h.push(p),m&&h.push(`--`),h.push(...d));let g=A([t,...h]),_=[];i[0]===`find`?(_.push(`pfind`),r&&_.push(r)):_.push(`prun`),p&&_.push(p),_.push(...d);let v=A(_);return e.recordHistory!==!1&&await s(v),{command:g,text:_.map((e,t)=>t===_.length-1&&j(e)?e:k(e)).join(` `),val:a,historyText:v}}let P=null,F=[],I=null,L=null;function R(){return F}async function re(e){let t=e===`pnpm`?l.default.resolve(u.default.cwd(),`pnpm-workspace.yaml`):l.default.resolve(u.default.cwd(),`package.json`);try{try{L=(await c.default.stat(t)).mtimeMs}catch{}return await c.default.readFile(t,`utf-8`)}catch{return``}}async function ie(e,t){if(!t)return[];if(e===`pnpm`)try{if(!P){let e=await import(`yamljs`);P=e&&e.default||e}let e=P.parse(t)?.packages;return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}try{let e=JSON.parse(t)?.workspaces;return(0,f.isPlainObject)(e)?e?.packages||[]:Array.isArray(e)?e:[]}catch{return[]}}async function ae(e){if(!e.length)return{};let t=await(0,m.default)(e.map(e=>`${e}/package.json`),{dot:!0,ignore:[`**/node_modules/**`]});return(await Promise.all(t.map(async e=>{try{let t=await(0,p.getPkg)(e);if(!t)return null;let{name:n,scripts:r}=t;return{name:n,scripts:r}}catch{return null}}))).reduce((e,t)=>(!t||!t.name||!t.scripts||(e[t.name]=Object.keys(t.scripts).reduce((e,n)=>(n.startsWith(`//`)||(e[n]=t.scripts[n]),e),{})),e),{})}async function oe(e){if(I)try{let t=e===`pnpm`?l.default.resolve(u.default.cwd(),`pnpm-workspace.yaml`):l.default.resolve(u.default.cwd(),`package.json`),n=await c.default.stat(t);if(L&&n.mtimeMs<=L)return I}catch{return I}return I=await ae(await ie(e,await re(e)))||{},F=Object.keys(I).filter(e=>I&&I[e]&&Object.keys(I[e]).length),I}async function z(e){return oe(e)}const B=(0,f.memorizeFn)(p.getPkg),V={};async function se(e,t){try{let n=e||`root`;if(V[n])return V[n];let r;return!e||t===`bun`||t===`npm`?r=(await B(`./package.json`))?.scripts:(t===`pnpm`||t===`yarn`)&&(r=(await z(t))[e]||(await B(`${e}/package.json`))?.scripts),r&&(V[n]=r),r}catch{return null}}async function ce(e,t,n,r,i,a,o,s,c,l){let u,d=``,f=r[0]?.trim(),p=A([t,...n]),m=A([t||r[0]||``,...n]);t&&f&&f!==t?console.log(o({text:`🤔 ${o({text:`'${r[0]}'`,color:`cyan`})} ${s?`自动的为您匹配成`:`automatically match for you`} ${o({text:`'${p}'`,color:`cyan`})} `,color:`yellow`})):t&&console.log(o({text:`🤔 is running for you... ${p}`,color:`magenta`}));let h=()=>{switch(e){case`npm`:{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),A([`npm`,...e])}case`pnpm`:return A([`pnpm`,`run`,t,...n]);case`yarn`:return A([`yarn`,t,...n]);case`bun`:return A([`bun`,`run`,t,...n]);case`make`:return A([`make`,t,...n]);default:return A([t,...n])}},g=()=>{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),A([`npm`,...e])};switch(e){case`npm`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`pnpm`:{let{status:e,result:t=``}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});if(d=t,u=e,d.includes(`pnpm versions with respective Node.js version support`)){console.log(o({text:s?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let{status:e,result:t}=await a(g(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t}break}case`yarn`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`bun`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`make`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}}if(u===0){let e=A([`prun`,t,...n]);return await i(e),console.log(o({color:`green`,text:`\n${e} ${c} 🎉`}))}return console.log(o({color:`red`,text:`\ncommand ${o({bold:!0,color:`cyan`,text:`'${m}'`})} ${l} ❌`}))}let H=null;async function le(){return H||(H=(await import(`@simon_he/colorize`)).default,H)}const U=new Map;function ue(){let e=(u.default.env.CCOMMAND_NO_HISTORY||u.default.env.NO_HISTORY||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}function de(){let e=u.default.env.CCOMMAND_HISTORY_HINT||``;if(e)return e;let t=u.default.env.HOME||v.default.homedir(),n=u.default.env.XDG_CACHE_HOME||l.default.join(t,`.cache`);return l.default.join(n,`ccommand`,`last-history`)}async function fe(e){let t=de();try{await c.default.mkdir(l.default.dirname(t),{recursive:!0});let n=Date.now();await c.default.writeFile(t,`${n}\t${e}\n`,`utf8`)}catch{}}function pe(){return(u.default.env.SHELL||`/bin/bash`).split(`/`).pop()||`bash`}function me(e){let t=u.default.env.HOME||v.default.homedir(),n=``,r=`bash`;switch(e){case`zsh`:n=l.default.join(t,`.zsh_history`),r=`zsh`;break;case`bash`:n=u.default.env.HISTFILE||l.default.join(t,`.bash_history`),r=`bash`;break;case`fish`:n=l.default.join(t,`.local`,`share`,`fish`,`fish_history`),r=`fish`;break;default:n=u.default.env.HISTFILE||l.default.join(t,`.bash_history`),r=`bash`}return{historyFile:n,historyFormat:r}}function he(e,t){if(t===`fish`){let t=e.split(/\r?\n/),n=[],r=[];for(let e of t)e.startsWith(`- cmd: `)?(r.length&&(n.push(r.join(`
2
+ `)),r=[]),r.push(e)):r.length?r.push(e):e.trim()!==``&&n.push(e);return r.length&&n.push(r.join(`
3
+ `)),n.filter(Boolean)}if(t===`zsh`)return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);let n=e.split(/\r?\n/),r=[];for(let e=0;e<n.length;e++){let t=n[e];if(t.startsWith(`#`)){let i=n[e+1]??``;r.push(`${t}\n${i}`),e++}else t.trim()!==``&&r.push(t)}return r}function W(e,t){if(t===`fish`){let t=e.split(`
4
+ `)[0].match(/^- cmd: (.*)$/);return(t?t[1]:e).trim()}if(t===`zsh`){let t=e.match(/^[^;]*;(.+)$/);return(t?t[1]:e).trim()}if(e.startsWith(`#`)){let t=e.split(/\r?\n/);return(t[1]??t[0]).trim()}return e.trim()}async function G(e){if(ue())return;let t=await le();x(t({text:`${S?`快捷指令`:`shortcut command`}: ${e}`,color:`blue`,bold:!0}));let n=pe(),{historyFile:r,historyFormat:i}=me(n);try{await fe(e);try{await c.default.access(r)}catch{x(t({text:`${S?`未找到 ${n} 历史文件`:`${n} history file not found`}`,color:`yellow`}));return}let a=await c.default.stat(r).catch(()=>null),o=Math.floor(Date.now()/1e3),s=``;s=i===`zsh`?`: ${o}:0;${e}`:i===`fish`?`- cmd: ${e}\n when: ${o}`:u.default.env.HISTTIMEFORMAT?`#${o}\n${e}`:e;let l=[],d=U.get(r);l=d&&a&&d.mtimeMs===a.mtimeMs&&d.size===a.size&&d.format===i?d.entries.slice():he(await c.default.readFile(r,`utf8`),i);let f=[],p=W(s,i),m=null;for(let e of l){if(W(e,i)===p){if(i===`fish`){m=e;continue}continue}f.push(e)}if(i===`fish`&&m){let e=m.split(`
5
+ `),t=!1,n=e.map(e=>e.trim().startsWith(`when:`)||e.startsWith(` when:`)?(t=!0,` when: ${o}`):e);t||n.splice(1,0,` when: ${o}`),f.push(n.join(`
6
+ `))}else f.push(s);let h=``;h=i===`fish`?`${f.map(e=>e.trimEnd()).join(`
7
+ `)}\n`:`${f.join(`
8
+ `)}\n`;let g=`${r}.ccommand.tmp`;await c.default.writeFile(g,h,`utf8`),await c.default.rename(g,r);try{let e=await c.default.stat(r);U.set(r,{mtimeMs:e.mtimeMs,size:e.size,entries:f,format:i})}catch{U.set(r,{mtimeMs:Date.now(),size:_.Buffer.byteLength(h),entries:f,format:i})}}catch(e){x(t({text:`${S?`❌ 添加到 ${n} 历史记录失败`:`❌ Failed to add to ${n} history`}${e?`: ${String(e)}`:``}`,color:`red`}))}}const ge=(0,g.promisify)(h.exec),K={};async function q(e){if(K[e]!==void 0)return K[e];try{return await ge(`command -v ${e}`),K[e]=!0,!0}catch{return K[e]=!1,!1}}let J=null;async function _e(){return J===null&&(J=await q(`bun`)?`bun`:await q(`esno`)?`esno`:await q(`tsx`)?`tsx`:null),J}async function Y(e,t,n,r){let i=A([`prun`,e]);await G(i);let{status:a}=await(0,p.jsShell)(t,{errorExit:!1,isLog:!1,stdio:`inherit`}),o=a===0;return o||(u.default.exitCode=a??1),x((0,d.default)({color:o?`green`:`red`,text:`\n"${i}" ${o?n:r} ${o?`🎉`:`❌`}`})),o}async function X(e,t,n){let r=l.default.extname(e),i=`node`;if(r===`.ts`)if(J===null&&await _e(),J)i=J;else return x((0,d.default)({text:S?`没有找到可以直接执行TypeScript的工具,推荐安装下列工具之一:
9
+ - npm install -g bun
10
+ - npm install -g esno
11
+ - npm install -g tsx`:`No TypeScript executor found. Recommend installing one of:
12
+ - npm install -g bun
13
+ - npm install -g esno
14
+ - npm install -g tsx`,color:`yellow`})),u.default.exitCode=1,!1;return Y(e,A([i,e]),t,n)}async function ve(e,t,n){let r=[`.js`,`.ts`,`.mjs`,`.cjs`],i=l.default.extname(e);if(i&&r.includes(i)&&await c.default.stat(e).then(e=>e.isFile()).catch(()=>!1))return await X(e,t,n),!0;if(!i)for(let i of r){let r=`${e}${i}`;if(await c.default.stat(r).then(e=>e.isFile()).catch(()=>!1))return await X(r,t,n),!0}let a=await c.default.stat(e).catch(()=>null);if(a&&a.isDirectory())for(let i of r){let r=l.default.join(e,`index${i}`);if(await c.default.stat(r).then(e=>e.isFile()).catch(()=>!1))return await X(r,t,n),!0}return!1}async function ye(e,t,n){e.endsWith(`.py`)?await Y(e,`python ${e}`,t,n):e.endsWith(`.rs`)&&((await(0,p.jsShell)(`rustc ${e}`)).status===0&&(await(0,p.jsShell)(`./${l.default.basename(e,`.rs`)}`,{stdio:`inherit`})).status===0?(await G(`prun ${e}`),x((0,d.default)({color:`green`,text:`\n"prun --${e}" ${t} 🎉`}))):x((0,d.default)({color:`red`,text:`\ncommand "prun ${e}" ${n} ❌`})))}async function be(e){try{let t=(await c.default.readFile(e,`utf-8`)).split(/\r?\n/),n=new Set;for(let e=0;e<t.length;e++){let r=t[e].trim();if(r.startsWith(`.PHONY:`)){let e=r.substring(7).replace(/\\\\$/g,``).trim();for(let t of e.split(/\s+/))t&&n.add(t)}}let r=[];for(let e of n){let n=``;for(let r=0;r<t.length;r++){let i=t[r];if(!i)continue;let a=i.trimStart();if(a.startsWith(`${e}:`)||a.startsWith(`${e} :`)){let e=a.split(`:`,2)[1]||``,i=e.indexOf(`;`);if(i!==-1&&(n=e.slice(i+1).trim()),!n&&r+1<t.length){let e=t[r+1];e.startsWith(` `)&&(n=e.trim())}if(!n){let t=e.trim();n=t?t.replace(/\s+/g,` `).slice(0,120):``}break}}r.push({name:e,detail:n?`${n}...`:``})}return r}catch{return[]}}const xe=new Set([`-`,`_`,` `,`.`,`/`,`\\`,`:`]);function Se(e){return e>=`a`&&e<=`z`}function Ce(e){return e>=`A`&&e<=`Z`}function we(e,t){if(t<=0)return!0;let n=e[t-1]||``,r=e[t]||``;return xe.has(n)?!0:Se(n)&&Ce(r)}function Te(e,t){let n=[],r=0;for(let i=0;i<t.length&&r<e.length;i++)t[i]===e[r]&&(n.push(i),r++);return r===e.length?n:null}function Ee(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(!n)return{score:0,positions:[]};if(r===n)return{score:1e5,positions:[...t].map((e,t)=>t)};if(r.startsWith(n))return{score:9e4-(t.length-e.length),positions:[...e].map((e,t)=>t)};let i=r.indexOf(n);if(i!==-1)return{score:7e4-i,positions:[...e].map((e,t)=>i+t)};let a=Te(n,r);if(!a)return null;let o=1e3,s=-1;for(let e of a)o+=10,e===s+1&&(o+=15),e===0&&(o+=12),we(t,e)&&(o+=8),s!==-1&&(o-=e-s-1),s=e;return o+=Math.max(0,30-(t.length-e.length)),{score:o,positions:a}}function De(e,t){let n=e.trim().split(/\s+/).filter(Boolean);if(!n.length)return{score:0,positions:[]};let r=0,i=[];for(let e of n){let n=Ee(e,t);if(!n)return null;r+=n.score,i.push(...n.positions)}return{score:r,positions:i}}function Oe(e,t){if(!t.trim())return e.map((e,t)=>({item:e,score:0,index:t,positions:[]}));let n=e.map((e,n)=>{let r=De(t,e);return r?{item:e,score:r.score,index:n,positions:r.positions}:null}).filter(Boolean);return n.sort((e,t)=>t.score===e.score?e.index-t.index:t.score-e.score),n}function ke(e,t){return!t||t<=0||e.length<=t?e:t<=3?e.slice(0,t):`${e.slice(0,t-3)}...`}function Ae(e,t){if(!t||t<=0||e.length<=t)return{text:e,visibleLength:e.length};if(t<=3)return{text:e.slice(0,t),visibleLength:t};let n=t-3;return{text:`${e.slice(0,n)}...`,visibleLength:n}}function je(e,t,n,r){if(!n||!t.length)return e;let i=new Set(t),a=``;for(let t=0;t<e.length;t++){let o=e[t]||``;i.has(t)?a+=`${n}${o}${r}`:a+=o}return a}function Me(e,t){return t?`\u001B[2m${e}\u001B[0m`:e}function Ne(){return!!(u.default.stdin.isTTY&&u.default.stdout.isTTY)}function Pe(){let e=(u.default.env.CCOMMAND_NO_PICKER||u.default.env.NO_PICKER||u.default.env.CCOMMAND_NO_GUM||u.default.env.NO_GUM||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function Z(e){return!(Pe()||!Ne()||u.default.env.CI)}async function Q(e,{placeholder:t,maxItems:n}={}){if(!Ne())return{status:130,result:``};let r=u.default.stdin,i=u.default.stdout,a=!!(i.isTTY&&!u.default.env.NO_COLOR),o=(t||(S?`请选择一个选项`:`Select`)).trim(),s=S?`上/下选择 左/右移动 Enter确认 Esc取消`:`Up/Down Move Left/Right Cursor Enter select Esc cancel`,c=``,l=0,d=0,f=0,p=0,m=Math.max(4,Math.min(n||10,(i.rows||24)-5)),h=Oe(e,c),g=()=>{a&&i.write(`\x1B[?25l`)},_=()=>{a&&i.write(`\x1B[?25h`)},v=()=>{if(p){for(let e=0;e<p;e++)y.default.clearLine(i,0),e<p-1&&y.default.moveCursor(i,0,-1);y.default.cursorTo(i,0),p=0}},b=()=>{l<d?d=l:l>=d+m&&(d=l-m+1),d<0&&(d=0)},x=()=>{v();let e=[],t=`? ${o}`;e.push(Me(ke(t,i.columns),a));let n=` > ${c.slice(0,f)}|${c.slice(f)}`;e.push(ke(n,i.columns)),h.length?(b(),h.slice(d,d+m).forEach((t,n)=>{let r=d+n===l,o=r?`> `:` `,s=i.columns?Math.max(0,i.columns-o.length):void 0,c=Ae(t.item,s),u=t.positions.filter(e=>e>=0&&e<c.visibleLength),f=a&&r?`\x1B[44m`:``,p=a?`${f}\u001B[1m\u001B[35m`:``,m=a?`\x1B[0m`:``,h=f?`${m}${f}`:m,g=``;f&&(g+=f),g+=o,g+=je(c.text,u,p,h),f&&(g+=m),e.push(g)})):e.push(S?` (无匹配)`:` (no matches)`),e.push(``);let r=h.length?`(${l+1}/${h.length})`:``;e.push(Me(` ${s} ${r}`.trimEnd(),a)),i.write(e.join(`
15
+ `)),p=e.length},C=()=>{h=Oe(e,c),l=0,l>=h.length&&(l=h.length-1),l<0&&(l=0),f>c.length&&(f=c.length),f<0&&(f=0),b()};return new Promise(e=>{let t=!1;function n(n,r){t||(t=!0,a(),e({status:n,result:r}))}function a(){r.removeListener(`data`,o),r.isTTY&&r.setRawMode(!1),r.pause(),v(),_()}function o(e){let t=e.toString(`utf8`);if(t===``||t===``)return n(130,``);if(t===`\r`||t===`
16
+ `){if(!h.length){i.write(`\x07`);return}return n(0,h[l]?.item||``)}if(t.startsWith(`\x1B`)){if(t===`\x1B`)return n(130,``);if(t===`\x1B[A`){h.length&&(l=l>0?l-1:h.length-1),x();return}if(t===`\x1B[B`){h.length&&(l=l<h.length-1?l+1:0),x();return}if(t===`\x1B[D`){f>0&&f--,x();return}if(t===`\x1B[C`){f<c.length&&f++,x();return}if(t===`\x1B[5~`){l=Math.max(0,l-m),x();return}if(t===`\x1B[6~`){l=Math.min(h.length-1,l+m),x();return}if(t===`\x1B[3~`){f<c.length&&(c=`${c.slice(0,f)}${c.slice(f+1)}`,C(),x());return}return}if(t===``||t===`\b`||t===`\b`){c.length&&f>0&&(c=`${c.slice(0,f-1)}${c.slice(f)}`,f=Math.max(0,f-1),C(),x());return}let r=``;for(let e of t)e>=` `&&e!==``&&(r+=e);r&&(c=`${c.slice(0,f)}${r}${c.slice(f)}`,f+=r.length,C(),x())}r.isTTY&&r.setRawMode(!0),r.resume(),r.on(`data`,o),g(),x()})}const Fe=new Set([`1`,`true`,`yes`]);function Ie(){let e=u.default.env.CCOMMAND_NO_AUTO_INSTALL||u.default.env.NO_AUTO_INSTALL||``;return Fe.has(e.toLowerCase())}function Le(){let e=u.default.env.SHELL||``;return u.default.env.FISH_VERSION&&`fish`||u.default.env.ZSH_VERSION&&`zsh`||u.default.env.BASH_VERSION&&`bash`||e&&e.split(`/`).pop()||``}function Re(e){let t=u.default.env.HOME||v.default.homedir();return e===`fish`?l.default.join(t,`.config`,`fish`,`config.fish`):e===`zsh`?l.default.join(t,`.zshrc`):e===`bash`?l.default.join(t,`.bashrc`):``}function ze(e,t=`ccommand`){let n=t||`ccommand`;return e===`fish`?`eval (${n} --init fish)`:`eval "$(${n} --init ${e})"`}function Be(e){return e.includes(`# ccommand init`)||e.includes(`ccommand --init`)}async function Ve(e={}){if(Ie())return!1;let t=Le();if(!t)return!1;let n=Re(t);if(!n)return!1;let r=``;try{r=await c.default.readFile(n,`utf8`)}catch{}if(!e.force&&r&&Be(r))return!1;let i=[``,`# ccommand init`,ze(t,e.bin||u.default.env.CCOMMAND_BIN||`ccommand`),``].join(`
17
+ `);try{return await c.default.mkdir(l.default.dirname(n),{recursive:!0}),await c.default.writeFile(n,`${r.trimEnd()}${i}`,`utf8`),e.quiet||x((0,d.default)({color:`yellow`,text:S?`已自动写入 ${n},请重新打开终端或执行: source ${n}`:`Auto-installed shell hook into ${n}. Please reopen the terminal or run: source ${n}`})),!0}catch{return!1}}const He=(0,f.memorizeFn)(p.getPkg),Ue=se,We=ne,$=ce;function Ge(e,t,n){return!!(n[1]&&t.length)}async function Ke(e=u.default.argv.slice(2)){let t=S?`当前目录不存在任何子目录`:`The current directory does not have any subdirectories`,n=S?`运行成功`:`run successfully`,r=S?`运行失败`:`run error`,i=ee(e),a=i[0]||``,o=a===`init`||a===`--init`,s=a===`-h`||a===`--help`,f=a===`-v`||a===`--version`;if(a===`--install`||a===`install`){await Ve({force:!0,quiet:!1,bin:u.default.env.CCOMMAND_BIN||`ccommand`});return}if(!o&&!s&&!f&&await Ve({quiet:!0,bin:u.default.env.CCOMMAND_BIN||`ccommand`}),o){let e=i[1],t=i[2],n=u.default.env.CCOMMAND_BIN,r=k(t||n||`ccommand`),a=u.default.env.SHELL||``,o=u.default.env.FISH_VERSION&&`fish`||u.default.env.ZSH_VERSION&&`zsh`||u.default.env.BASH_VERSION&&`bash`||a&&a.split(`/`).pop()||``,s=e||o||`zsh`,c=``;if(s===`zsh`)c=[`ccommand() {`,` local bin=${r}`,` local -a cmd`," cmd=(${=bin})",' command "${cmd[@]}" "$@"',`}`,`__ccommand_sync_history() {`,' local history_disable=${CCOMMAND_NO_HISTORY:-${NO_HISTORY:-""}}'," local history_disable_lower=${history_disable:l}",` if [[ $history_disable_lower == "1" || $history_disable_lower == "true" || $history_disable_lower == "yes" ]]; then`,` return`,` fi`," local history_hint=${CCOMMAND_HISTORY_HINT:-${XDG_CACHE_HOME:-$HOME/.cache}/ccommand/last-history}",` if [[ ! -f $history_hint ]]; then`,` return`,` fi`,` local line`,` line=$(<"$history_hint")`," local hint_ts=${line%%$'\\t'*}"," local hint_cmd=${line#*$'\\t'}",` if [[ -z $hint_ts || $hint_ts == $line ]]; then`,` hint_cmd=$line`,` hint_ts=""`,` fi`,' if [[ -n $hint_ts && $hint_ts == ${__CCOMMAND_HISTORY_HINT_TS:-""} ]]; then',` return`,` fi`,` __CCOMMAND_HISTORY_HINT_TS=$hint_ts`,` fc -R`,` if [[ $hint_cmd != pfind* && $hint_cmd != prun* ]]; then`,` return`,` fi`,` local last_line`,` last_line=$(fc -l -1 2>/dev/null)`,` local last_cmd`,` last_cmd=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*[0-9]+[[:space:]]*//")`,` if [[ $last_cmd == "$hint_cmd" ]]; then`,` return`,` fi`,` if [[ $last_cmd == ccommand || $last_cmd == ccommand\\ * ]]; then`,` local last_num`,` last_num=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*([0-9]+).*/\\1/")`,` if [[ -n $last_num ]]; then`,` history -d $last_num 2>/dev/null`,` fi`,` fi`,` print -s -- "$hint_cmd"`,`}`,``,`if ! typeset -f __ccommand_precmd >/dev/null; then`,` __ccommand_precmd() { __ccommand_sync_history }`,` autoload -Uz add-zsh-hook`,` add-zsh-hook precmd __ccommand_precmd`,`fi`].join(`
18
+ `);else if(s===`bash`)c=[`ccommand() {`,` local bin=${r}`,` local -a cmd`,` read -r -a cmd <<< "$bin"`,' command "${cmd[@]}" "$@"',`}`,`__ccommand_sync_history() {`,' local history_disable=${CCOMMAND_NO_HISTORY:-${NO_HISTORY:-""}}',` local history_disable_lower`,` history_disable_lower=$(printf '%s' "$history_disable" | tr '[:upper:]' '[:lower:]')`,` if [[ $history_disable_lower == "1" || $history_disable_lower == "true" || $history_disable_lower == "yes" ]]; then`,` return`,` fi`," local history_hint=${CCOMMAND_HISTORY_HINT:-${XDG_CACHE_HOME:-$HOME/.cache}/ccommand/last-history}",` if [[ ! -f $history_hint ]]; then`,` return`,` fi`,` local line`,` line=$(<"$history_hint")`,` local hint_ts="\${line%%$'\\t'*}"`,` local hint_cmd="\${line#*$'\\t'}"`,` if [[ -z $hint_ts || $hint_ts == "$line" ]]; then`,` hint_cmd="$line"`,` hint_ts=""`,` fi`,' if [[ -n $hint_ts && $hint_ts == "${__CCOMMAND_HISTORY_HINT_TS:-}" ]]; then',` return`,` fi`,` __CCOMMAND_HISTORY_HINT_TS=$hint_ts`,` if [[ $hint_cmd != pfind* && $hint_cmd != prun* ]]; then`,` return`,` fi`,` history -n`,` local last_line`,` last_line=$(history 1)`,` local last_cmd`,` last_cmd=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*[0-9]+[[:space:]]*//")`,` if [[ $last_cmd == "$hint_cmd" ]]; then`,` return`,` fi`,` if [[ $last_cmd == ccommand || $last_cmd == ccommand\\ * ]]; then`,` local last_num`,` last_num=$(printf "%s" "$last_line" | sed -E "s/^[[:space:]]*([0-9]+).*/\\1/")`,` if [[ -n $last_num ]]; then`,` history -d "$last_num" 2>/dev/null`,` fi`,` fi`,` history -s -- "$hint_cmd"`,`}`,``,'if [[ -z "${__CCOMMAND_PROMPT_INSTALLED:-}" ]]; then',` __CCOMMAND_PROMPT_INSTALLED=1`,' if [[ -n "${PROMPT_COMMAND:-}" ]]; then',' PROMPT_COMMAND="__ccommand_sync_history;${PROMPT_COMMAND}"',` else`,` PROMPT_COMMAND="__ccommand_sync_history"`,` fi`,`fi`].join(`
19
+ `);else if(s===`fish`)c=[`function ccommand`,` set -l bin ${r}`,` set -l cmd (string split -- " " $bin)`,` command $cmd $argv`,` set -l history_disable $CCOMMAND_NO_HISTORY`,` if test -z "$history_disable"`,` set history_disable $NO_HISTORY`,` end`,` set history_disable (string lower -- (string trim -- "$history_disable"))`,` if test "$history_disable" != "1" -a "$history_disable" != "true" -a "$history_disable" != "yes"`,` history --merge`,` set -l history_hint $CCOMMAND_HISTORY_HINT`,` if test -z "$history_hint"`,` set -l cache_home $XDG_CACHE_HOME`,` if test -z "$cache_home"`,` set cache_home "$HOME/.cache"`,` end`,` set history_hint "$cache_home/ccommand/last-history"`,` end`,` if test -f "$history_hint"`,` set -l last_cmd (string trim -- (cat "$history_hint"))`,` set -l last_cmd (string replace -r "^[0-9]+\\t" "" -- "$last_cmd")`,` if string match -q "pfind*" -- "$last_cmd"; or string match -q "prun*" -- "$last_cmd"`,` set -l last_hist (history --max=1)`,` if test "$last_hist" != "$last_cmd"`,` history add -- "$last_cmd"`,` end`,` end`,` end`,` end`,`end`].join(`
20
+ `);else return x((0,d.default)({color:`red`,text:S?`不支持的 shell: ${s}`:`Unsupported shell: ${s}`}));return console.log(c)}if(i[0]===`-v`||i[0]===`--version`)return x((0,d.default)({text:S?`ccommand 当前版本: ${b}`:`ccommand Version: ${b}`,color:`green`}));if(i[0]===`-h`||i[0]===`--help`){let e=(await import(`terminal-link`)).default,t=e(S?`打开一个新的问题`:`open an issue`,`https://github.com/Simon-He95/ccommand/issues`),n=e(S?`✨帮助点一个星星`:`✨star it`,`https://github.com/Simon-He95/ccommand`);return x((0,d.default)({color:`white`,text:`
21
+ ${(0,d.default)({bold:!0,text:`Common Commands:`,bgColor:`blue`})}
22
+ ${(0,d.default)({text:`- ccommand -v 查看当前版本
23
+ - ccommand -help 查看帮助
24
+ - ccommand 执行当前package.json
25
+ - ccommand find 查找当前workspace的所有目录
26
+ - ccommand --init [zsh|bash|fish] [bin] 输出 shell 集成脚本(未传则自动检测)
27
+ `,color:`cyan`})}
28
+ If you encounter any problems, you can ${(0,d.default)({color:`magenta`,text:t})}.
29
+ If you like it, please ${(0,d.default)({text:n,bold:!0,color:`cyan`})} `}))}else if(i[0]?.endsWith(`.py`)||i[0]?.endsWith(`.rs`)){await ye(i[0],n,r);return}let m;try{m=await(0,p.getPkgTool)()}catch{try{if(await c.default.readFile(l.default.resolve(u.default.cwd(),`./Makefile`),`utf-8`)){m=`make`;let e=await be(`./Makefile`),t=e.reduce((e,t)=>{let{name:n,detail:r}=t;return e[n]=r,e},{}),a=``,o=[];if(i.length){let e=i[0];if(o=i.slice(1),a=N(t,e)||``,!a)return x((0,d.default)({color:`red`,text:w}))}else{if(!await Z(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 make 目标名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a make target explicitly.`}));let{result:t,status:n}=await Q(e.map(e=>e.name),{placeholder:S?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return E();a=t}await $(m,a.trim(),o,i,G,p.jsShell,d.default,S,n,r);return}else return x((0,d.default)({color:`red`,text:w}))}catch{if(i[0]!==`find`)return x((0,d.default)({color:`red`,text:w}))}}let[h,g,_]=te(i),v=h,y;if(i[0]===`find`){if(g)await z(m),v=R().filter(e=>e.includes(g))[0];else if(m===`yarn`){if(await z(m),!R().length)return x((0,d.default)({color:`yellow`,text:t}));if(!await Z(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:n}=await Q(R(),{placeholder:S?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(v=e,n===130)return E()}else if(m===`pnpm`){if(await z(m),!R().length)return x((0,d.default)({color:`yellow`,text:t}));if(!await Z(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:n}=await Q(R(),{placeholder:S?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(n===130)return E();v=e.trim()}else return x((0,d.default)({color:`red`,text:S?`find指令只能支持在yarn或pnpm的monorepo模式下使用`:`find command only support yarn or pnpm`}));y=await Ue(v,m)||void 0}else{y=await Ue(v,m)||void 0;try{let e=(await He(`./package.json`)||{})?.scripts;if(e&&e[i[0]]){await $(m,i[0],i.slice(1),i,G,p.jsShell,d.default,S,n,r);return}else if(e&&h){let t=N(e,i[0]);if(t){let e=i.slice(1);await $(m,t,e,i,G,p.jsShell,d.default,S,n,r);return}else{if(await ve(i[0],n,r))return;let e=`${h}.py`;if(await c.default.stat(e).then(e=>e.isFile()).catch(()=>!1)){x((0,d.default)({text:`🤔 ${S?`找到Python文件`:`Found Python file`}: ${e}`,color:`yellow`}));return}let t=`${h}.rs`;if(await c.default.stat(t).then(e=>e.isFile()).catch(()=>!1))return;x((0,d.default)({color:`red`,text:`"${i[0]}" ${S?`在工作区、当前目录中找不到任何可执行的脚本或文件,请检查`:`is not found in workspace, current directory or current scripts, please check`}`})),u.default.exit(1)}}}catch{}}let C=``;if(!g||i[0]===`find`&&(!i[2]||i[2].startsWith(`--`))){if(!y||Object.keys(y).length===0)return x((0,d.default)({color:`red`,text:S?`找不到任何可执行脚本`:`No scripts found`}));let e=Object.keys(y).map(e=>`${e}: ${(y?.[e]??``).replace(/[\r\n]+/g,` `)}`);if(!await Z(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入脚本名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a script name explicitly.`}));let{result:t,status:n}=await Q(e,{placeholder:S?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return E();C=t.substring(0,t.indexOf(`: `))}if(!g&&!C)return E();x((0,d.default)({text:`🤔 ${T} ${C}`,color:`magenta`}));let{command:D,text:O,val:j,historyText:M}=await We({termStart:m,params:_,dirname:v,argv:i,val:C,runMsg:T,isZh:S,pushHistory:G,jsShell:p.jsShell,isNeedPrefix:e=>Ge(i[0],e,i),fuzzyWorkspace:g,recordHistory:i[0]!==`find`}),ne=D;C=j;let{status:P,result:F=``}=await(0,p.jsShell)(ne,{errorExit:!1,stdio:`inherit`});if(i[0]===`find`&&await G(M),P===0)return x((0,d.default)({color:`green`,text:`\n${O} 🎉`}));if(F.includes(`pnpm versions with respective Node.js version support`)){x((0,d.default)({text:S?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let e=[..._];e[0]===`--`&&e.shift();let{status:t}=await(0,p.jsShell)(A([`npm`,`run`,C,...e.length?[`--`,...e]:[]]),`inherit`);if(t===0)return x((0,d.default)({color:`green`,text:`\n${O} 🎉`}))}x((0,d.default)({color:`red`,text:`\ncommand ${C} ${r} ❌`}))}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ke}});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ccommand",
3
3
  "type": "module",
4
- "version": "1.0.91",
4
+ "version": "1.1.0",
5
5
  "description": "ccommand",
6
6
  "author": "Simon He",
7
7
  "license": "MIT",
@@ -31,6 +31,21 @@
31
31
  "files": [
32
32
  "dist"
33
33
  ],
34
+ "scripts": {
35
+ "build": "tsdown ./src/index.ts ./src/cli.ts --minify --format cjs,esm",
36
+ "dev": "tsdown ./src/index.ts ./src/cli.ts --watch",
37
+ "play": "pnpm run -C playground dev",
38
+ "play:build": "pnpm run -C playground build",
39
+ "format": "prettier --write --cache .",
40
+ "lint": "eslint .",
41
+ "lint:fix": "eslint . --fix",
42
+ "test": "vitest --dir test -u",
43
+ "ptest": "pnpm run -C playground test -u",
44
+ "preview": "pnpm run -C playground preview",
45
+ "test:e2e": "cypress open",
46
+ "prepublishOnly": "nr build",
47
+ "release": "bumpp --commit --tag --push && git push origin --tags -f && npm publish"
48
+ },
34
49
  "dependencies": {
35
50
  "@simon_he/colorize": "^0.0.1",
36
51
  "fast-glob": "^3.3.3",
@@ -56,19 +71,5 @@
56
71
  "prettier --write --cache --ignore-unknown"
57
72
  ],
58
73
  "*.{vue,js,ts,jsx,tsx,md,json}": "eslint --fix"
59
- },
60
- "scripts": {
61
- "build": "tsdown ./src/index.ts ./src/cli.ts --minify --format cjs,esm",
62
- "dev": "tsdown ./src/index.ts ./src/cli.ts --watch",
63
- "play": "pnpm run -C playground dev",
64
- "play:build": "pnpm run -C playground build",
65
- "format": "prettier --write --cache .",
66
- "lint": "eslint .",
67
- "lint:fix": "eslint . --fix",
68
- "test": "vitest --dir test -u",
69
- "ptest": "pnpm run -C playground test -u",
70
- "preview": "pnpm run -C playground preview",
71
- "test:e2e": "cypress open",
72
- "release": "bumpp --commit --tag --push && git push origin --tags -f && npm publish"
73
74
  }
74
- }
75
+ }
@@ -1,28 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs/promises`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`@simon_he/colorize`);d=s(d);let f=require(`lazy-js-utils`),p=require(`lazy-js-utils/node`),m=require(`fast-glob`);m=s(m);let h=require(`node:child_process`),g=require(`node:util`),_=require(`node:buffer`),v=require(`node:os`);v=s(v);let y=require(`node:readline`);y=s(y);var b=`1.0.91`;const x=console.log,S=(u.default.env.PI_LANG||u.default.env.LANG||``).startsWith(`zh`),C=S?`已取消...`:`Cancelled...`,w=S?`当前目录并未找到 package.json 文件`:`package.json file not found in current directory`,T=S?`正在为您执行...`:`is running for you...`;function E(){return x(`${C}`),u.default.exit(130)}const D=/^[\w./:@%+=,-]+$/;function O(e){let t=[],n=``,r=null,i=!1,a=()=>{i&&=(t.push(n),n=``,!1)};for(let t=0;t<e.length;t++){let o=e[t];if(r){if(o===r){r=null,i=!0;continue}if(r===`"`&&o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(/\s/.test(o)){for(a();t+1<e.length&&/\s/.test(e[t+1]);)t++;continue}if(o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0}return a(),t}function ee(e){if(!e)return[];if(Array.isArray(e))return e;let t=e.trim();return t?O(t):[]}function k(e){return e===``?`''`:D.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function A(e){return e.filter(e=>typeof e==`string`).map(k).join(` `)}function te(e){return D.test(e)}function ne(e){let t=e[0];if(!t)return[``,``,[]];let n=e.indexOf(`--`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1),i=t[0]||``,a=t[1]||``,o=t.slice(2);return i.startsWith(`-`)?[``,``,e.slice()]:[i,a,[...o,...r]]}return t.startsWith(`-`)?[``,``,e.slice()]:e[1]&&e[1].startsWith(`-`)?[t,``,e.slice(1)]:[t,e[1]||``,e.slice(2)]}function re(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function j(e,t){let n=Object.keys(e),r=n.find(e=>e.startsWith(t));if(r)return r;try{if(!t)return;let e=t.split(``).map(e=>re(e)).join(`[_-\\w$.:]*`),r=new RegExp(e);return n.find(e=>r.test(e))}catch(e){x(`${S?`正则错误`:`RegExp error`}: ${e}`),u.default.exit(1)}}async function ie(e){let{termStart:t,params:n,dirname:r,argv:i,val:a,isZh:o,pushHistory:s,jsShell:c,isNeedPrefix:l,fuzzyWorkspace:u}=e,d=[...n||[]],f=``;t!==`npm`&&d.length&&!d[0].startsWith(`--`)&&(f=d[0],d=d.slice(1));let p=f||a||u||``;a=`${p}`;let m=l(d)&&d.length>0&&d[0]!==`--`,h=[];if(t===`npm`){h.push(`run`),r&&h.push(`--prefix`,r),p&&h.push(p);let e=[...d];e[0]===`--`&&e.shift(),e.length&&h.push(`--`,...e)}else t===`pnpm`?(h.push(`run`),r&&h.push(`--filter`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`yarn`?(r&&h.push(`workspace`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`bun`?(h.push(`run`),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`make`&&(p&&h.push(p),m&&h.push(`--`),h.push(...d));let g=A([t,...h]),_=[];return i[0]===`find`?(_.push(`pfind`),r&&_.push(r)):_.push(`prun`),p&&_.push(p),_.push(...d),await s(A(_)),{command:g,text:_.map((e,t)=>t===_.length-1&&te(e)?e:k(e)).join(` `),val:a}}let M=null,N=[],P=null,F=null;function I(){return N}async function ae(e){let t=e===`pnpm`?l.default.resolve(u.default.cwd(),`pnpm-workspace.yaml`):l.default.resolve(u.default.cwd(),`package.json`);try{try{F=(await c.default.stat(t)).mtimeMs}catch{}return await c.default.readFile(t,`utf-8`)}catch{return``}}async function oe(e,t){if(!t)return[];if(e===`pnpm`)try{if(!M){let e=await import(`yamljs`);M=e&&e.default||e}let e=M.parse(t)?.packages;return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}try{let e=JSON.parse(t)?.workspaces;return(0,f.isPlainObject)(e)?e?.packages||[]:Array.isArray(e)?e:[]}catch{return[]}}async function se(e){if(!e.length)return{};let t=await(0,m.default)(e.map(e=>`${e}/package.json`),{dot:!0,ignore:[`**/node_modules/**`]});return(await Promise.all(t.map(async e=>{try{let t=await(0,p.getPkg)(e);if(!t)return null;let{name:n,scripts:r}=t;return{name:n,scripts:r}}catch{return null}}))).reduce((e,t)=>(!t||!t.name||!t.scripts||(e[t.name]=Object.keys(t.scripts).reduce((e,n)=>(n.startsWith(`//`)||(e[n]=t.scripts[n]),e),{})),e),{})}async function ce(e){if(P)try{let t=e===`pnpm`?l.default.resolve(u.default.cwd(),`pnpm-workspace.yaml`):l.default.resolve(u.default.cwd(),`package.json`),n=await c.default.stat(t);if(F&&n.mtimeMs<=F)return P}catch{return P}return P=await se(await oe(e,await ae(e)))||{},N=Object.keys(P).filter(e=>P&&P[e]&&Object.keys(P[e]).length),P}async function L(e){return ce(e)}const le=(0,f.memorizeFn)(p.getPkg),R={};async function ue(e,t){try{let n=e||`root`;if(R[n])return R[n];let r;return!e||t===`bun`||t===`npm`?r=(await le(`./package.json`))?.scripts:(t===`pnpm`||t===`yarn`)&&(r=(await L(t))[e]||(await le(`${e}/package.json`))?.scripts),r&&(R[n]=r),r}catch{return null}}async function de(e,t,n,r,i,a,o,s,c,l){let u,d=``,f=r[0]?.trim(),p=A([t,...n]),m=A([t||r[0]||``,...n]);t&&f&&f!==t?console.log(o({text:`🤔 ${o({text:`'${r[0]}'`,color:`cyan`})} ${s?`自动的为您匹配成`:`automatically match for you`} ${o({text:`'${p}'`,color:`cyan`})} `,color:`yellow`})):t&&console.log(o({text:`🤔 is running for you... ${p}`,color:`magenta`}));let h=()=>{switch(e){case`npm`:{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),A([`npm`,...e])}case`pnpm`:return A([`pnpm`,`run`,t,...n]);case`yarn`:return A([`yarn`,t,...n]);case`bun`:return A([`bun`,`run`,t,...n]);case`make`:return A([`make`,t,...n]);default:return A([t,...n])}},g=()=>{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),A([`npm`,...e])};switch(e){case`npm`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`pnpm`:{let{status:e,result:t=``}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});if(d=t,u=e,d.includes(`pnpm versions with respective Node.js version support`)){console.log(o({text:s?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let{status:e,result:t}=await a(g(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t}break}case`yarn`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`bun`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`make`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}}if(u===0){let e=A([`prun`,t,...n]);return await i(e),console.log(o({color:`green`,text:`\n${e} ${c} 🎉`}))}return console.log(o({color:`red`,text:`\ncommand ${o({bold:!0,color:`cyan`,text:`'${m}'`})} ${l} ❌`}))}let z=null;async function fe(){return z||(z=(await import(`@simon_he/colorize`)).default,z)}const B=new Map;function pe(){let e=(u.default.env.CCOMMAND_NO_HISTORY||u.default.env.NO_HISTORY||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function V(e){if(pe())return;let t=await fe();x(t({text:`${S?`快捷指令`:`shortcut command`}: ${e}`,color:`blue`,bold:!0}));let n=(u.default.env.SHELL||`/bin/bash`).split(`/`).pop()||`bash`,r=``,i=`bash`,a=u.default.env.HOME||v.default.homedir();switch(n){case`zsh`:r=l.default.join(a,`.zsh_history`),i=`zsh`;break;case`bash`:r=u.default.env.HISTFILE||l.default.join(a,`.bash_history`),i=`bash`;break;case`fish`:r=l.default.join(a,`.local`,`share`,`fish`,`fish_history`),i=`fish`;break;default:r=u.default.env.HISTFILE||l.default.join(a,`.bash_history`),i=`bash`}try{try{await c.default.access(r)}catch{x(t({text:`${S?`未找到 ${n} 历史文件`:`${n} history file not found`}`,color:`yellow`}));return}let a=await c.default.stat(r).catch(()=>null),o=Math.floor(Date.now()/1e3),s=``;s=i===`zsh`?`: ${o}:0;${e}`:i===`fish`?`- cmd: ${e}\n when: ${o}`:u.default.env.HISTTIMEFORMAT?`#${o}\n${e}`:e;function l(e){if(i===`fish`){let t=e.split(/\r?\n/),n=[],r=[];for(let e of t)e.startsWith(`- cmd: `)?(r.length&&(n.push(r.join(`
2
- `)),r=[]),r.push(e)):r.length?r.push(e):e.trim()!==``&&n.push(e);return r.length&&n.push(r.join(`
3
- `)),n.filter(Boolean)}else if(i===`zsh`)return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);else{let t=e.split(/\r?\n/),n=[];for(let e=0;e<t.length;e++){let r=t[e];if(r.startsWith(`#`)){let i=t[e+1]??``;n.push(`${r}\n${i}`),e++}else r.trim()!==``&&n.push(r)}return n}}let d=[],f=B.get(r);d=f&&a&&f.mtimeMs===a.mtimeMs&&f.size===a.size&&f.format===i?f.entries.slice():l(await c.default.readFile(r,`utf8`));function p(e){if(i===`fish`){let t=e.split(`
4
- `)[0].match(/^- cmd: (.*)$/);return(t?t[1]:e).trim()}else if(i===`zsh`){let t=e.match(/^[^;]*;(.+)$/);return(t?t[1]:e).trim()}else{if(e.startsWith(`#`)){let t=e.split(/\r?\n/);return(t[1]??t[0]).trim()}return e.trim()}}let m=[],h=p(s),g=null;for(let e of d){if(p(e)===h){if(i===`fish`){g=e;continue}continue}m.push(e)}if(i===`fish`&&g){let e=g.split(`
5
- `),t=!1,n=e.map(e=>e.trim().startsWith(`when:`)||e.startsWith(` when:`)?(t=!0,` when: ${o}`):e);t||n.splice(1,0,` when: ${o}`),m.push(n.join(`
6
- `))}else m.push(s);let v=``;v=i===`fish`?`${m.map(e=>e.trimEnd()).join(`
7
- `)}\n`:`${m.join(`
8
- `)}\n`;let y=`${r}.ccommand.tmp`;await c.default.writeFile(y,v,`utf8`),await c.default.rename(y,r);try{let e=await c.default.stat(r);B.set(r,{mtimeMs:e.mtimeMs,size:e.size,entries:m,format:i})}catch{B.set(r,{mtimeMs:Date.now(),size:_.Buffer.byteLength(v),entries:m,format:i})}}catch(e){x(t({text:`${S?`❌ 添加到 ${n} 历史记录失败`:`❌ Failed to add to ${n} history`}${e?`: ${String(e)}`:``}`,color:`red`}))}}const me=(0,g.promisify)(h.exec),H={};async function U(e){if(H[e]!==void 0)return H[e];try{return await me(`command -v ${e}`),H[e]=!0,!0}catch{return H[e]=!1,!1}}let W=null;async function he(){return W===null&&(W=await U(`bun`)?`bun`:await U(`esno`)?`esno`:await U(`tsx`)?`tsx`:null),W}async function G(e,t,n,r){let i=A([`prun`,e]);await V(i);let{status:a}=await(0,p.jsShell)(t,{errorExit:!1,isLog:!1,stdio:`inherit`}),o=a===0;return o||(u.default.exitCode=a??1),x((0,d.default)({color:o?`green`:`red`,text:`\n"${i}" ${o?n:r} ${o?`🎉`:`❌`}`})),o}async function K(e,t,n){let r=l.default.extname(e),i=`node`;if(r===`.ts`)if(W===null&&await he(),W)i=W;else return x((0,d.default)({text:S?`没有找到可以直接执行TypeScript的工具,推荐安装下列工具之一:
9
- - npm install -g bun
10
- - npm install -g esno
11
- - npm install -g tsx`:`No TypeScript executor found. Recommend installing one of:
12
- - npm install -g bun
13
- - npm install -g esno
14
- - npm install -g tsx`,color:`yellow`})),u.default.exitCode=1,!1;return G(e,A([i,e]),t,n)}async function ge(e,t,n){let r=[`.js`,`.ts`,`.mjs`,`.cjs`],i=l.default.extname(e);if(i&&r.includes(i)&&await c.default.stat(e).then(e=>e.isFile()).catch(()=>!1))return await K(e,t,n),!0;if(!i)for(let i of r){let r=`${e}${i}`;if(await c.default.stat(r).then(e=>e.isFile()).catch(()=>!1))return await K(r,t,n),!0}let a=await c.default.stat(e).catch(()=>null);if(a&&a.isDirectory())for(let i of r){let r=l.default.join(e,`index${i}`);if(await c.default.stat(r).then(e=>e.isFile()).catch(()=>!1))return await K(r,t,n),!0}return!1}async function _e(e,t,n){e.endsWith(`.py`)?await G(e,`python ${e}`,t,n):e.endsWith(`.rs`)&&((await(0,p.jsShell)(`rustc ${e}`)).status===0&&(await(0,p.jsShell)(`./${l.default.basename(e,`.rs`)}`,{stdio:`inherit`})).status===0?(await V(`prun ${e}`),x((0,d.default)({color:`green`,text:`\n"prun --${e}" ${t} 🎉`}))):x((0,d.default)({color:`red`,text:`\ncommand "prun ${e}" ${n} ❌`})))}async function ve(e){try{let t=(await c.default.readFile(e,`utf-8`)).split(/\r?\n/),n=new Set;for(let e=0;e<t.length;e++){let r=t[e].trim();if(r.startsWith(`.PHONY:`)){let e=r.substring(7).replace(/\\\\$/g,``).trim();for(let t of e.split(/\s+/))t&&n.add(t)}}let r=[];for(let e of n){let n=``;for(let r=0;r<t.length;r++){let i=t[r];if(!i)continue;let a=i.trimStart();if(a.startsWith(`${e}:`)||a.startsWith(`${e} :`)){let e=a.split(`:`,2)[1]||``,i=e.indexOf(`;`);if(i!==-1&&(n=e.slice(i+1).trim()),!n&&r+1<t.length){let e=t[r+1];e.startsWith(` `)&&(n=e.trim())}if(!n){let t=e.trim();n=t?t.replace(/\s+/g,` `).slice(0,120):``}break}}r.push({name:e,detail:n?`${n}...`:``})}return r}catch{return[]}}const ye=new Set([`-`,`_`,` `,`.`,`/`,`\\`,`:`]);function be(e){return e>=`a`&&e<=`z`}function xe(e){return e>=`A`&&e<=`Z`}function Se(e,t){if(t<=0)return!0;let n=e[t-1]||``,r=e[t]||``;return ye.has(n)?!0:be(n)&&xe(r)}function Ce(e,t){let n=[],r=0;for(let i=0;i<t.length&&r<e.length;i++)t[i]===e[r]&&(n.push(i),r++);return r===e.length?n:null}function we(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(!n)return{score:0,positions:[]};if(r===n)return{score:1e5,positions:[...t].map((e,t)=>t)};if(r.startsWith(n))return{score:9e4-(t.length-e.length),positions:[...e].map((e,t)=>t)};let i=r.indexOf(n);if(i!==-1)return{score:7e4-i,positions:[...e].map((e,t)=>i+t)};let a=Ce(n,r);if(!a)return null;let o=1e3,s=-1;for(let e of a)o+=10,e===s+1&&(o+=15),e===0&&(o+=12),Se(t,e)&&(o+=8),s!==-1&&(o-=e-s-1),s=e;return o+=Math.max(0,30-(t.length-e.length)),{score:o,positions:a}}function Te(e,t){let n=e.trim().split(/\s+/).filter(Boolean);if(!n.length)return{score:0,positions:[]};let r=0,i=[];for(let e of n){let n=we(e,t);if(!n)return null;r+=n.score,i.push(...n.positions)}return{score:r,positions:i}}function q(e,t){if(!t.trim())return e.map((e,t)=>({item:e,score:0,index:t}));let n=e.map((e,n)=>{let r=Te(t,e);return r?{item:e,score:r.score,index:n}:null}).filter(Boolean);return n.sort((e,t)=>t.score===e.score?e.index-t.index:t.score-e.score),n}function J(e,t){return!t||t<=0||e.length<=t?e:t<=3?e.slice(0,t):`${e.slice(0,t-3)}...`}function Y(){return!!(u.default.stdin.isTTY&&u.default.stdout.isTTY)}function Ee(){let e=(u.default.env.CCOMMAND_NO_PICKER||u.default.env.NO_PICKER||u.default.env.CCOMMAND_NO_GUM||u.default.env.NO_GUM||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function X(e){return!(Ee()||!Y()||u.default.env.CI)}async function Z(e,{placeholder:t,maxItems:n}={}){if(!Y())return{status:130,result:``};let r=u.default.stdin,i=u.default.stdout,a=!!(i.isTTY&&!u.default.env.NO_COLOR),o=(t||(S?`请选择一个选项`:`Select`)).trim(),s=S?`上/下选择 左/右移动 Enter确认 Esc取消`:`Up/Down Move Left/Right Cursor Enter select Esc cancel`,c=``,l=0,d=0,f=0,p=0,m=Math.max(4,Math.min(n||10,(i.rows||24)-5)),h=q(e,c),g=()=>{a&&i.write(`\x1B[?25l`)},_=()=>{a&&i.write(`\x1B[?25h`)},v=()=>{if(p){for(let e=0;e<p;e++)y.default.clearLine(i,0),e<p-1&&y.default.moveCursor(i,0,-1);y.default.cursorTo(i,0),p=0}},b=(e,t)=>!t||!a?e:`\u001B[1m\u001B[36m${e}\u001B[0m`,x=()=>{l<d?d=l:l>=d+m&&(d=l-m+1),d<0&&(d=0)},C=()=>{v();let e=[],t=`? ${o}`;e.push(J(t,i.columns));let n=` > ${c.slice(0,f)}|${c.slice(f)}`;e.push(J(n,i.columns)),h.length?(x(),h.slice(d,d+m).forEach((t,n)=>{let r=d+n===l,a=J(`${r?`> `:` `}${t.item}`,i.columns);e.push(b(a,r))})):e.push(S?` (无匹配)`:` (no matches)`);let r=h.length?`(${l+1}/${h.length})`:``;e.push(` ${s} ${r}`.trimEnd()),i.write(e.join(`
15
- `)),p=e.length},w=()=>{h=q(e,c),l=0,l>=h.length&&(l=h.length-1),l<0&&(l=0),f>c.length&&(f=c.length),f<0&&(f=0),x()};return new Promise(e=>{let t=!1;function n(n,r){t||(t=!0,a(),e({status:n,result:r}))}function a(){r.removeListener(`data`,o),r.isTTY&&r.setRawMode(!1),r.pause(),v(),_()}function o(e){let t=e.toString(`utf8`);if(t===``||t===``)return n(130,``);if(t===`\r`||t===`
16
- `){if(!h.length){i.write(`\x07`);return}return n(0,h[l]?.item||``)}if(t.startsWith(`\x1B`)){if(t===`\x1B`)return n(130,``);if(t===`\x1B[A`){l>0&&l--,C();return}if(t===`\x1B[B`){l<h.length-1&&l++,C();return}if(t===`\x1B[D`){f>0&&f--,C();return}if(t===`\x1B[C`){f<c.length&&f++,C();return}if(t===`\x1B[5~`){l=Math.max(0,l-m),C();return}if(t===`\x1B[6~`){l=Math.min(h.length-1,l+m),C();return}if(t===`\x1B[3~`){f<c.length&&(c=`${c.slice(0,f)}${c.slice(f+1)}`,w(),C());return}return}if(t===``||t===`\b`||t===`\b`){c.length&&f>0&&(c=`${c.slice(0,f-1)}${c.slice(f)}`,f=Math.max(0,f-1),w(),C());return}let r=``;for(let e of t)e>=` `&&e!==``&&(r+=e);r&&(c=`${c.slice(0,f)}${r}${c.slice(f)}`,f+=r.length,w(),C())}r.isTTY&&r.setRawMode(!0),r.resume(),r.on(`data`,o),g(),C()})}const De=(0,f.memorizeFn)(p.getPkg),Q=ue,Oe=ie,$=de;function ke(e,t,n){return!!(n[1]&&t.length)}async function Ae(e=u.default.argv.slice(2)){let t=S?`当前目录不存在任何子目录`:`The current directory does not have any subdirectories`,n=S?`运行成功`:`run successfully`,r=S?`运行失败`:`run error`,i=ee(e);if(i[0]===`init`||i[0]===`--init`){let e=i[1],t=i[2],n=u.default.env.CCOMMAND_BIN,r=k(t||n||`ccommand`),a=u.default.env.SHELL||``,o=u.default.env.FISH_VERSION&&`fish`||u.default.env.ZSH_VERSION&&`zsh`||u.default.env.BASH_VERSION&&`bash`||a&&a.split(`/`).pop()||``,s=e||o||`zsh`,c=``;if(s===`zsh`)c=[`ccommand() {`,` local bin=${r}`,` local -a cmd`," cmd=(${=bin})",' command "${cmd[@]}" "$@"',` fc -R`,`}`].join(`
17
- `);else if(s===`bash`)c=[`ccommand() {`,` local bin=${r}`,` local -a cmd`,` read -r -a cmd <<< "$bin"`,' command "${cmd[@]}" "$@"',` history -n`,`}`].join(`
18
- `);else if(s===`fish`)c=[`function ccommand`,` set -l bin ${r}`,` set -l cmd (string split -- " " $bin)`,` command $cmd $argv`,` history --merge`,`end`].join(`
19
- `);else return x((0,d.default)({color:`red`,text:S?`不支持的 shell: ${s}`:`Unsupported shell: ${s}`}));return console.log(c)}if(i[0]===`-v`||i[0]===`--version`)return x((0,d.default)({text:S?`ccommand 当前版本: ${b}`:`ccommand Version: ${b}`,color:`green`}));if(i[0]===`-h`||i[0]===`--help`){let e=(await import(`terminal-link`)).default,t=e(S?`打开一个新的问题`:`open an issue`,`https://github.com/Simon-He95/ccommand/issues`),n=e(S?`✨帮助点一个星星`:`✨star it`,`https://github.com/Simon-He95/ccommand`);return x((0,d.default)({color:`white`,text:`
20
- ${(0,d.default)({bold:!0,text:`Common Commands:`,bgColor:`blue`})}
21
- ${(0,d.default)({text:`- ccommand -v 查看当前版本
22
- - ccommand -help 查看帮助
23
- - ccommand 执行当前package.json
24
- - ccommand find 查找当前workspace的所有目录
25
- - ccommand --init [zsh|bash|fish] [bin] 输出 shell 集成脚本(未传则自动检测)
26
- `,color:`cyan`})}
27
- If you encounter any problems, you can ${(0,d.default)({color:`magenta`,text:t})}.
28
- If you like it, please ${(0,d.default)({text:n,bold:!0,color:`cyan`})} `}))}else if(i[0]?.endsWith(`.py`)||i[0]?.endsWith(`.rs`)){await _e(i[0],n,r);return}let a;try{a=await(0,p.getPkgTool)()}catch{try{if(await c.default.readFile(l.default.resolve(u.default.cwd(),`./Makefile`),`utf-8`)){a=`make`;let e=await ve(`./Makefile`),t=e.reduce((e,t)=>{let{name:n,detail:r}=t;return e[n]=r,e},{}),o=``,s=[];if(i.length){let e=i[0];if(s=i.slice(1),o=j(t,e)||``,!o)return x((0,d.default)({color:`red`,text:w}))}else{if(!await X(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 make 目标名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a make target explicitly.`}));let{result:t,status:n}=await Z(e.map(e=>e.name),{placeholder:S?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return E();o=t}await $(a,o.trim(),s,i,V,p.jsShell,d.default,S,n,r);return}else return x((0,d.default)({color:`red`,text:w}))}catch{if(i[0]!==`find`)return x((0,d.default)({color:`red`,text:w}))}}let[o,s,f]=ne(i),m=o,h;if(i[0]===`find`){if(s)await L(a),m=I().filter(e=>e.includes(s))[0];else if(a===`yarn`){if(await L(a),!I().length)return x((0,d.default)({color:`yellow`,text:t}));if(!await X(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:n}=await Z(I(),{placeholder:S?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(m=e,n===130)return E()}else if(a===`pnpm`){if(await L(a),!I().length)return x((0,d.default)({color:`yellow`,text:t}));if(!await X(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:n}=await Z(I(),{placeholder:S?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(n===130)return E();m=e.trim()}else return x((0,d.default)({color:`red`,text:S?`find指令只能支持在yarn或pnpm的monorepo模式下使用`:`find command only support yarn or pnpm`}));h=await Q(m,a)||void 0}else{h=await Q(m,a)||void 0;try{let e=(await De(`./package.json`)||{})?.scripts;if(e&&e[i[0]]){await $(a,i[0],i.slice(1),i,V,p.jsShell,d.default,S,n,r);return}else if(e&&o){let t=j(e,i[0]);if(t){let e=i.slice(1);await $(a,t,e,i,V,p.jsShell,d.default,S,n,r);return}else{if(await ge(i[0],n,r))return;let e=`${o}.py`;if(await c.default.stat(e).then(e=>e.isFile()).catch(()=>!1)){x((0,d.default)({text:`🤔 ${S?`找到Python文件`:`Found Python file`}: ${e}`,color:`yellow`}));return}let t=`${o}.rs`;if(await c.default.stat(t).then(e=>e.isFile()).catch(()=>!1))return;x((0,d.default)({color:`red`,text:`"${i[0]}" ${S?`在工作区、当前目录中找不到任何可执行的脚本或文件,请检查`:`is not found in workspace, current directory or current scripts, please check`}`})),u.default.exit(1)}}}catch{}}let g=``;if(!s||i[0]===`find`&&(!i[2]||i[2].startsWith(`--`))){if(!h||Object.keys(h).length===0)return x((0,d.default)({color:`red`,text:S?`找不到任何可执行脚本`:`No scripts found`}));let e=Object.keys(h).map(e=>`${e}: ${(h?.[e]??``).replace(/[\r\n]+/g,` `)}`);if(!await X(S))return x((0,d.default)({color:`yellow`,text:S?`未检测到可用的交互环境或交互选择已被禁用,请直接传入脚本名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a script name explicitly.`}));let{result:t,status:n}=await Z(e,{placeholder:S?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return E();g=t.substring(0,t.indexOf(`: `))}if(!s&&!g)return E();x((0,d.default)({text:`🤔 ${T} ${g}`,color:`magenta`}));let{command:_,text:v,val:y}=await Oe({termStart:a,params:f,dirname:m,argv:i,val:g,runMsg:T,isZh:S,pushHistory:V,jsShell:p.jsShell,isNeedPrefix:e=>ke(i[0],e,i),fuzzyWorkspace:s}),C=_;g=y;let{status:D,result:O=``}=await(0,p.jsShell)(C,{errorExit:!1,stdio:`inherit`});if(D===0)return x((0,d.default)({color:`green`,text:`\n${v} 🎉`}));if(O.includes(`pnpm versions with respective Node.js version support`)){x((0,d.default)({text:S?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let e=[...f];e[0]===`--`&&e.shift();let{status:t}=await(0,p.jsShell)(A([`npm`,`run`,g,...e.length?[`--`,...e]:[]]),`inherit`);if(t===0)return x((0,d.default)({color:`green`,text:`\n${v} 🎉`}))}x((0,d.default)({color:`red`,text:`\ncommand ${g} ${r} ❌`}))}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ae}});
@@ -1,28 +0,0 @@
1
- import e from"node:fs/promises";import t from"node:path";import n from"node:process";import r from"@simon_he/colorize";import{isPlainObject as i,memorizeFn as a}from"lazy-js-utils";import{getPkg as o,getPkgTool as s,jsShell as c}from"lazy-js-utils/node";import l from"fast-glob";import{exec as u}from"node:child_process";import{promisify as d}from"node:util";import{Buffer as f}from"node:buffer";import p from"node:os";import m from"node:readline";var h=`1.0.91`;const g=console.log,_=(n.env.PI_LANG||n.env.LANG||``).startsWith(`zh`),v=_?`已取消...`:`Cancelled...`,y=_?`当前目录并未找到 package.json 文件`:`package.json file not found in current directory`,b=_?`正在为您执行...`:`is running for you...`;function x(){return g(`${v}`),n.exit(130)}const S=/^[\w./:@%+=,-]+$/;function C(e){let t=[],n=``,r=null,i=!1,a=()=>{i&&=(t.push(n),n=``,!1)};for(let t=0;t<e.length;t++){let o=e[t];if(r){if(o===r){r=null,i=!0;continue}if(r===`"`&&o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0;continue}if(o===`"`||o===`'`){r=o,i=!0;continue}if(/\s/.test(o)){for(a();t+1<e.length&&/\s/.test(e[t+1]);)t++;continue}if(o===`\\`){let r=e[t+1];if(r){n+=r,i=!0,t++;continue}}n+=o,i=!0}return a(),t}function w(e){if(!e)return[];if(Array.isArray(e))return e;let t=e.trim();return t?C(t):[]}function T(e){return e===``?`''`:S.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}function E(e){return e.filter(e=>typeof e==`string`).map(T).join(` `)}function D(e){return S.test(e)}function ee(e){let t=e[0];if(!t)return[``,``,[]];let n=e.indexOf(`--`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1),i=t[0]||``,a=t[1]||``,o=t.slice(2);return i.startsWith(`-`)?[``,``,e.slice()]:[i,a,[...o,...r]]}return t.startsWith(`-`)?[``,``,e.slice()]:e[1]&&e[1].startsWith(`-`)?[t,``,e.slice(1)]:[t,e[1]||``,e.slice(2)]}function O(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function k(e,t){let r=Object.keys(e),i=r.find(e=>e.startsWith(t));if(i)return i;try{if(!t)return;let e=t.split(``).map(e=>O(e)).join(`[_-\\w$.:]*`),n=new RegExp(e);return r.find(e=>n.test(e))}catch(e){g(`${_?`正则错误`:`RegExp error`}: ${e}`),n.exit(1)}}async function A(e){let{termStart:t,params:n,dirname:r,argv:i,val:a,isZh:o,pushHistory:s,jsShell:c,isNeedPrefix:l,fuzzyWorkspace:u}=e,d=[...n||[]],f=``;t!==`npm`&&d.length&&!d[0].startsWith(`--`)&&(f=d[0],d=d.slice(1));let p=f||a||u||``;a=`${p}`;let m=l(d)&&d.length>0&&d[0]!==`--`,h=[];if(t===`npm`){h.push(`run`),r&&h.push(`--prefix`,r),p&&h.push(p);let e=[...d];e[0]===`--`&&e.shift(),e.length&&h.push(`--`,...e)}else t===`pnpm`?(h.push(`run`),r&&h.push(`--filter`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`yarn`?(r&&h.push(`workspace`,r),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`bun`?(h.push(`run`),p&&h.push(p),m&&h.push(`--`),h.push(...d)):t===`make`&&(p&&h.push(p),m&&h.push(`--`),h.push(...d));let g=E([t,...h]),_=[];return i[0]===`find`?(_.push(`pfind`),r&&_.push(r)):_.push(`prun`),p&&_.push(p),_.push(...d),await s(E(_)),{command:g,text:_.map((e,t)=>t===_.length-1&&D(e)?e:T(e)).join(` `),val:a}}let j=null,M=[],N=null,P=null;function F(){return M}async function te(r){let i=r===`pnpm`?t.resolve(n.cwd(),`pnpm-workspace.yaml`):t.resolve(n.cwd(),`package.json`);try{try{P=(await e.stat(i)).mtimeMs}catch{}return await e.readFile(i,`utf-8`)}catch{return``}}async function ne(e,t){if(!t)return[];if(e===`pnpm`)try{if(!j){let e=await import(`yamljs`);j=e&&e.default||e}let e=j.parse(t)?.packages;return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}try{let e=JSON.parse(t)?.workspaces;return i(e)?e?.packages||[]:Array.isArray(e)?e:[]}catch{return[]}}async function re(e){if(!e.length)return{};let t=await l(e.map(e=>`${e}/package.json`),{dot:!0,ignore:[`**/node_modules/**`]});return(await Promise.all(t.map(async e=>{try{let t=await o(e);if(!t)return null;let{name:n,scripts:r}=t;return{name:n,scripts:r}}catch{return null}}))).reduce((e,t)=>(!t||!t.name||!t.scripts||(e[t.name]=Object.keys(t.scripts).reduce((e,n)=>(n.startsWith(`//`)||(e[n]=t.scripts[n]),e),{})),e),{})}async function ie(r){if(N)try{let i=r===`pnpm`?t.resolve(n.cwd(),`pnpm-workspace.yaml`):t.resolve(n.cwd(),`package.json`),a=await e.stat(i);if(P&&a.mtimeMs<=P)return N}catch{return N}return N=await re(await ne(r,await te(r)))||{},M=Object.keys(N).filter(e=>N&&N[e]&&Object.keys(N[e]).length),N}async function I(e){return ie(e)}const L=a(o),R={};async function ae(e,t){try{let n=e||`root`;if(R[n])return R[n];let r;return!e||t===`bun`||t===`npm`?r=(await L(`./package.json`))?.scripts:(t===`pnpm`||t===`yarn`)&&(r=(await I(t))[e]||(await L(`${e}/package.json`))?.scripts),r&&(R[n]=r),r}catch{return null}}async function oe(e,t,n,r,i,a,o,s,c,l){let u,d=``,f=r[0]?.trim(),p=E([t,...n]),m=E([t||r[0]||``,...n]);t&&f&&f!==t?console.log(o({text:`🤔 ${o({text:`'${r[0]}'`,color:`cyan`})} ${s?`自动的为您匹配成`:`automatically match for you`} ${o({text:`'${p}'`,color:`cyan`})} `,color:`yellow`})):t&&console.log(o({text:`🤔 is running for you... ${p}`,color:`magenta`}));let h=()=>{switch(e){case`npm`:{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),E([`npm`,...e])}case`pnpm`:return E([`pnpm`,`run`,t,...n]);case`yarn`:return E([`yarn`,t,...n]);case`bun`:return E([`bun`,`run`,t,...n]);case`make`:return E([`make`,t,...n]);default:return E([t,...n])}},g=()=>{let e=[`run`,t];return n.length&&(n[0]!==`--`&&e.push(`--`),e.push(...n)),E([`npm`,...e])};switch(e){case`npm`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`pnpm`:{let{status:e,result:t=``}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});if(d=t,u=e,d.includes(`pnpm versions with respective Node.js version support`)){console.log(o({text:s?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let{status:e,result:t}=await a(g(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t}break}case`yarn`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`bun`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}case`make`:{let{status:e,result:t}=await a(h(),{errorExit:!1,isLog:!1,stdio:`inherit`});u=e,d=t;break}}if(u===0){let e=E([`prun`,t,...n]);return await i(e),console.log(o({color:`green`,text:`\n${e} ${c} 🎉`}))}return console.log(o({color:`red`,text:`\ncommand ${o({bold:!0,color:`cyan`,text:`'${m}'`})} ${l} ❌`}))}let z=null;async function se(){return z||(z=(await import(`@simon_he/colorize`)).default,z)}const B=new Map;function ce(){let e=(n.env.CCOMMAND_NO_HISTORY||n.env.NO_HISTORY||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function V(r){if(ce())return;let i=await se();g(i({text:`${_?`快捷指令`:`shortcut command`}: ${r}`,color:`blue`,bold:!0}));let a=(n.env.SHELL||`/bin/bash`).split(`/`).pop()||`bash`,o=``,s=`bash`,c=n.env.HOME||p.homedir();switch(a){case`zsh`:o=t.join(c,`.zsh_history`),s=`zsh`;break;case`bash`:o=n.env.HISTFILE||t.join(c,`.bash_history`),s=`bash`;break;case`fish`:o=t.join(c,`.local`,`share`,`fish`,`fish_history`),s=`fish`;break;default:o=n.env.HISTFILE||t.join(c,`.bash_history`),s=`bash`}try{try{await e.access(o)}catch{g(i({text:`${_?`未找到 ${a} 历史文件`:`${a} history file not found`}`,color:`yellow`}));return}let t=await e.stat(o).catch(()=>null),c=Math.floor(Date.now()/1e3),l=``;l=s===`zsh`?`: ${c}:0;${r}`:s===`fish`?`- cmd: ${r}\n when: ${c}`:n.env.HISTTIMEFORMAT?`#${c}\n${r}`:r;function u(e){if(s===`fish`){let t=e.split(/\r?\n/),n=[],r=[];for(let e of t)e.startsWith(`- cmd: `)?(r.length&&(n.push(r.join(`
2
- `)),r=[]),r.push(e)):r.length?r.push(e):e.trim()!==``&&n.push(e);return r.length&&n.push(r.join(`
3
- `)),n.filter(Boolean)}else if(s===`zsh`)return e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);else{let t=e.split(/\r?\n/),n=[];for(let e=0;e<t.length;e++){let r=t[e];if(r.startsWith(`#`)){let i=t[e+1]??``;n.push(`${r}\n${i}`),e++}else r.trim()!==``&&n.push(r)}return n}}let d=[],p=B.get(o);d=p&&t&&p.mtimeMs===t.mtimeMs&&p.size===t.size&&p.format===s?p.entries.slice():u(await e.readFile(o,`utf8`));function m(e){if(s===`fish`){let t=e.split(`
4
- `)[0].match(/^- cmd: (.*)$/);return(t?t[1]:e).trim()}else if(s===`zsh`){let t=e.match(/^[^;]*;(.+)$/);return(t?t[1]:e).trim()}else{if(e.startsWith(`#`)){let t=e.split(/\r?\n/);return(t[1]??t[0]).trim()}return e.trim()}}let h=[],v=m(l),y=null;for(let e of d){if(m(e)===v){if(s===`fish`){y=e;continue}continue}h.push(e)}if(s===`fish`&&y){let e=y.split(`
5
- `),t=!1,n=e.map(e=>e.trim().startsWith(`when:`)||e.startsWith(` when:`)?(t=!0,` when: ${c}`):e);t||n.splice(1,0,` when: ${c}`),h.push(n.join(`
6
- `))}else h.push(l);let b=``;b=s===`fish`?`${h.map(e=>e.trimEnd()).join(`
7
- `)}\n`:`${h.join(`
8
- `)}\n`;let x=`${o}.ccommand.tmp`;await e.writeFile(x,b,`utf8`),await e.rename(x,o);try{let t=await e.stat(o);B.set(o,{mtimeMs:t.mtimeMs,size:t.size,entries:h,format:s})}catch{B.set(o,{mtimeMs:Date.now(),size:f.byteLength(b),entries:h,format:s})}}catch(e){g(i({text:`${_?`❌ 添加到 ${a} 历史记录失败`:`❌ Failed to add to ${a} history`}${e?`: ${String(e)}`:``}`,color:`red`}))}}const le=d(u),H={};async function U(e){if(H[e]!==void 0)return H[e];try{return await le(`command -v ${e}`),H[e]=!0,!0}catch{return H[e]=!1,!1}}let W=null;async function ue(){return W===null&&(W=await U(`bun`)?`bun`:await U(`esno`)?`esno`:await U(`tsx`)?`tsx`:null),W}async function G(e,t,i,a){let o=E([`prun`,e]);await V(o);let{status:s}=await c(t,{errorExit:!1,isLog:!1,stdio:`inherit`}),l=s===0;return l||(n.exitCode=s??1),g(r({color:l?`green`:`red`,text:`\n"${o}" ${l?i:a} ${l?`🎉`:`❌`}`})),l}async function K(e,i,a){let o=t.extname(e),s=`node`;if(o===`.ts`)if(W===null&&await ue(),W)s=W;else return g(r({text:_?`没有找到可以直接执行TypeScript的工具,推荐安装下列工具之一:
9
- - npm install -g bun
10
- - npm install -g esno
11
- - npm install -g tsx`:`No TypeScript executor found. Recommend installing one of:
12
- - npm install -g bun
13
- - npm install -g esno
14
- - npm install -g tsx`,color:`yellow`})),n.exitCode=1,!1;return G(e,E([s,e]),i,a)}async function de(n,r,i){let a=[`.js`,`.ts`,`.mjs`,`.cjs`],o=t.extname(n);if(o&&a.includes(o)&&await e.stat(n).then(e=>e.isFile()).catch(()=>!1))return await K(n,r,i),!0;if(!o)for(let t of a){let a=`${n}${t}`;if(await e.stat(a).then(e=>e.isFile()).catch(()=>!1))return await K(a,r,i),!0}let s=await e.stat(n).catch(()=>null);if(s&&s.isDirectory())for(let o of a){let a=t.join(n,`index${o}`);if(await e.stat(a).then(e=>e.isFile()).catch(()=>!1))return await K(a,r,i),!0}return!1}async function fe(e,n,i){e.endsWith(`.py`)?await G(e,`python ${e}`,n,i):e.endsWith(`.rs`)&&((await c(`rustc ${e}`)).status===0&&(await c(`./${t.basename(e,`.rs`)}`,{stdio:`inherit`})).status===0?(await V(`prun ${e}`),g(r({color:`green`,text:`\n"prun --${e}" ${n} 🎉`}))):g(r({color:`red`,text:`\ncommand "prun ${e}" ${i} ❌`})))}async function pe(t){try{let n=(await e.readFile(t,`utf-8`)).split(/\r?\n/),r=new Set;for(let e=0;e<n.length;e++){let t=n[e].trim();if(t.startsWith(`.PHONY:`)){let e=t.substring(7).replace(/\\\\$/g,``).trim();for(let t of e.split(/\s+/))t&&r.add(t)}}let i=[];for(let e of r){let t=``;for(let r=0;r<n.length;r++){let i=n[r];if(!i)continue;let a=i.trimStart();if(a.startsWith(`${e}:`)||a.startsWith(`${e} :`)){let e=a.split(`:`,2)[1]||``,i=e.indexOf(`;`);if(i!==-1&&(t=e.slice(i+1).trim()),!t&&r+1<n.length){let e=n[r+1];e.startsWith(` `)&&(t=e.trim())}if(!t){let n=e.trim();t=n?n.replace(/\s+/g,` `).slice(0,120):``}break}}i.push({name:e,detail:t?`${t}...`:``})}return i}catch{return[]}}const me=new Set([`-`,`_`,` `,`.`,`/`,`\\`,`:`]);function he(e){return e>=`a`&&e<=`z`}function ge(e){return e>=`A`&&e<=`Z`}function _e(e,t){if(t<=0)return!0;let n=e[t-1]||``,r=e[t]||``;return me.has(n)?!0:he(n)&&ge(r)}function ve(e,t){let n=[],r=0;for(let i=0;i<t.length&&r<e.length;i++)t[i]===e[r]&&(n.push(i),r++);return r===e.length?n:null}function ye(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(!n)return{score:0,positions:[]};if(r===n)return{score:1e5,positions:[...t].map((e,t)=>t)};if(r.startsWith(n))return{score:9e4-(t.length-e.length),positions:[...e].map((e,t)=>t)};let i=r.indexOf(n);if(i!==-1)return{score:7e4-i,positions:[...e].map((e,t)=>i+t)};let a=ve(n,r);if(!a)return null;let o=1e3,s=-1;for(let e of a)o+=10,e===s+1&&(o+=15),e===0&&(o+=12),_e(t,e)&&(o+=8),s!==-1&&(o-=e-s-1),s=e;return o+=Math.max(0,30-(t.length-e.length)),{score:o,positions:a}}function be(e,t){let n=e.trim().split(/\s+/).filter(Boolean);if(!n.length)return{score:0,positions:[]};let r=0,i=[];for(let e of n){let n=ye(e,t);if(!n)return null;r+=n.score,i.push(...n.positions)}return{score:r,positions:i}}function q(e,t){if(!t.trim())return e.map((e,t)=>({item:e,score:0,index:t}));let n=e.map((e,n)=>{let r=be(t,e);return r?{item:e,score:r.score,index:n}:null}).filter(Boolean);return n.sort((e,t)=>t.score===e.score?e.index-t.index:t.score-e.score),n}function J(e,t){return!t||t<=0||e.length<=t?e:t<=3?e.slice(0,t):`${e.slice(0,t-3)}...`}function Y(){return!!(n.stdin.isTTY&&n.stdout.isTTY)}function xe(){let e=(n.env.CCOMMAND_NO_PICKER||n.env.NO_PICKER||n.env.CCOMMAND_NO_GUM||n.env.NO_GUM||``).toLowerCase();return e===`1`||e===`true`||e===`yes`}async function X(e){return!(xe()||!Y()||n.env.CI)}async function Z(e,{placeholder:t,maxItems:r}={}){if(!Y())return{status:130,result:``};let i=n.stdin,a=n.stdout,o=!!(a.isTTY&&!n.env.NO_COLOR),s=(t||(_?`请选择一个选项`:`Select`)).trim(),c=_?`上/下选择 左/右移动 Enter确认 Esc取消`:`Up/Down Move Left/Right Cursor Enter select Esc cancel`,l=``,u=0,d=0,f=0,p=0,h=Math.max(4,Math.min(r||10,(a.rows||24)-5)),g=q(e,l),v=()=>{o&&a.write(`\x1B[?25l`)},y=()=>{o&&a.write(`\x1B[?25h`)},b=()=>{if(p){for(let e=0;e<p;e++)m.clearLine(a,0),e<p-1&&m.moveCursor(a,0,-1);m.cursorTo(a,0),p=0}},x=(e,t)=>!t||!o?e:`\u001B[1m\u001B[36m${e}\u001B[0m`,S=()=>{u<d?d=u:u>=d+h&&(d=u-h+1),d<0&&(d=0)},C=()=>{b();let e=[],t=`? ${s}`;e.push(J(t,a.columns));let n=` > ${l.slice(0,f)}|${l.slice(f)}`;e.push(J(n,a.columns)),g.length?(S(),g.slice(d,d+h).forEach((t,n)=>{let r=d+n===u,i=J(`${r?`> `:` `}${t.item}`,a.columns);e.push(x(i,r))})):e.push(_?` (无匹配)`:` (no matches)`);let r=g.length?`(${u+1}/${g.length})`:``;e.push(` ${c} ${r}`.trimEnd()),a.write(e.join(`
15
- `)),p=e.length},w=()=>{g=q(e,l),u=0,u>=g.length&&(u=g.length-1),u<0&&(u=0),f>l.length&&(f=l.length),f<0&&(f=0),S()};return new Promise(e=>{let t=!1;function n(n,i){t||(t=!0,r(),e({status:n,result:i}))}function r(){i.removeListener(`data`,o),i.isTTY&&i.setRawMode(!1),i.pause(),b(),y()}function o(e){let t=e.toString(`utf8`);if(t===``||t===``)return n(130,``);if(t===`\r`||t===`
16
- `){if(!g.length){a.write(`\x07`);return}return n(0,g[u]?.item||``)}if(t.startsWith(`\x1B`)){if(t===`\x1B`)return n(130,``);if(t===`\x1B[A`){u>0&&u--,C();return}if(t===`\x1B[B`){u<g.length-1&&u++,C();return}if(t===`\x1B[D`){f>0&&f--,C();return}if(t===`\x1B[C`){f<l.length&&f++,C();return}if(t===`\x1B[5~`){u=Math.max(0,u-h),C();return}if(t===`\x1B[6~`){u=Math.min(g.length-1,u+h),C();return}if(t===`\x1B[3~`){f<l.length&&(l=`${l.slice(0,f)}${l.slice(f+1)}`,w(),C());return}return}if(t===``||t===`\b`||t===`\b`){l.length&&f>0&&(l=`${l.slice(0,f-1)}${l.slice(f)}`,f=Math.max(0,f-1),w(),C());return}let r=``;for(let e of t)e>=` `&&e!==``&&(r+=e);r&&(l=`${l.slice(0,f)}${r}${l.slice(f)}`,f+=r.length,w(),C())}i.isTTY&&i.setRawMode(!0),i.resume(),i.on(`data`,o),v(),C()})}const Se=a(o),Q=ae,Ce=A,$=oe;function we(e,t,n){return!!(n[1]&&t.length)}async function Te(i=n.argv.slice(2)){let a=_?`当前目录不存在任何子目录`:`The current directory does not have any subdirectories`,o=_?`运行成功`:`run successfully`,l=_?`运行失败`:`run error`,u=w(i);if(u[0]===`init`||u[0]===`--init`){let e=u[1],t=u[2],i=n.env.CCOMMAND_BIN,a=T(t||i||`ccommand`),o=n.env.SHELL||``,s=n.env.FISH_VERSION&&`fish`||n.env.ZSH_VERSION&&`zsh`||n.env.BASH_VERSION&&`bash`||o&&o.split(`/`).pop()||``,c=e||s||`zsh`,l=``;if(c===`zsh`)l=[`ccommand() {`,` local bin=${a}`,` local -a cmd`," cmd=(${=bin})",' command "${cmd[@]}" "$@"',` fc -R`,`}`].join(`
17
- `);else if(c===`bash`)l=[`ccommand() {`,` local bin=${a}`,` local -a cmd`,` read -r -a cmd <<< "$bin"`,' command "${cmd[@]}" "$@"',` history -n`,`}`].join(`
18
- `);else if(c===`fish`)l=[`function ccommand`,` set -l bin ${a}`,` set -l cmd (string split -- " " $bin)`,` command $cmd $argv`,` history --merge`,`end`].join(`
19
- `);else return g(r({color:`red`,text:_?`不支持的 shell: ${c}`:`Unsupported shell: ${c}`}));return console.log(l)}if(u[0]===`-v`||u[0]===`--version`)return g(r({text:_?`ccommand 当前版本: ${h}`:`ccommand Version: ${h}`,color:`green`}));if(u[0]===`-h`||u[0]===`--help`){let e=(await import(`terminal-link`)).default,t=e(_?`打开一个新的问题`:`open an issue`,`https://github.com/Simon-He95/ccommand/issues`),n=e(_?`✨帮助点一个星星`:`✨star it`,`https://github.com/Simon-He95/ccommand`);return g(r({color:`white`,text:`
20
- ${r({bold:!0,text:`Common Commands:`,bgColor:`blue`})}
21
- ${r({text:`- ccommand -v 查看当前版本
22
- - ccommand -help 查看帮助
23
- - ccommand 执行当前package.json
24
- - ccommand find 查找当前workspace的所有目录
25
- - ccommand --init [zsh|bash|fish] [bin] 输出 shell 集成脚本(未传则自动检测)
26
- `,color:`cyan`})}
27
- If you encounter any problems, you can ${r({color:`magenta`,text:t})}.
28
- If you like it, please ${r({text:n,bold:!0,color:`cyan`})} `}))}else if(u[0]?.endsWith(`.py`)||u[0]?.endsWith(`.rs`)){await fe(u[0],o,l);return}let d;try{d=await s()}catch{try{if(await e.readFile(t.resolve(n.cwd(),`./Makefile`),`utf-8`)){d=`make`;let e=await pe(`./Makefile`),t=e.reduce((e,t)=>{let{name:n,detail:r}=t;return e[n]=r,e},{}),n=``,i=[];if(u.length){let e=u[0];if(i=u.slice(1),n=k(t,e)||``,!n)return g(r({color:`red`,text:y}))}else{if(!await X(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 make 目标名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a make target explicitly.`}));let{result:t,status:i}=await Z(e.map(e=>e.name),{placeholder:_?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(i===130)return x();n=t}await $(d,n.trim(),i,u,V,c,r,_,o,l);return}else return g(r({color:`red`,text:y}))}catch{if(u[0]!==`find`)return g(r({color:`red`,text:y}))}}let[f,p,m]=ee(u),v=f,S;if(u[0]===`find`){if(p)await I(d),v=F().filter(e=>e.includes(p))[0];else if(d===`yarn`){if(await I(d),!F().length)return g(r({color:`yellow`,text:a}));if(!await X(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:t}=await Z(F(),{placeholder:_?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(v=e,t===130)return x()}else if(d===`pnpm`){if(await I(d),!F().length)return g(r({color:`yellow`,text:a}));if(!await X(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入 workspace 名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a workspace name explicitly.`}));let{result:e,status:t}=await Z(F(),{placeholder:_?`🤔请选择一个要执行的目录`:`Please select a directory to execute`});if(t===130)return x();v=e.trim()}else return g(r({color:`red`,text:_?`find指令只能支持在yarn或pnpm的monorepo模式下使用`:`find command only support yarn or pnpm`}));S=await Q(v,d)||void 0}else{S=await Q(v,d)||void 0;try{let t=(await Se(`./package.json`)||{})?.scripts;if(t&&t[u[0]]){await $(d,u[0],u.slice(1),u,V,c,r,_,o,l);return}else if(t&&f){let i=k(t,u[0]);if(i){let e=u.slice(1);await $(d,i,e,u,V,c,r,_,o,l);return}else{if(await de(u[0],o,l))return;let t=`${f}.py`;if(await e.stat(t).then(e=>e.isFile()).catch(()=>!1)){g(r({text:`🤔 ${_?`找到Python文件`:`Found Python file`}: ${t}`,color:`yellow`}));return}let i=`${f}.rs`;if(await e.stat(i).then(e=>e.isFile()).catch(()=>!1))return;g(r({color:`red`,text:`"${u[0]}" ${_?`在工作区、当前目录中找不到任何可执行的脚本或文件,请检查`:`is not found in workspace, current directory or current scripts, please check`}`})),n.exit(1)}}}catch{}}let C=``;if(!p||u[0]===`find`&&(!u[2]||u[2].startsWith(`--`))){if(!S||Object.keys(S).length===0)return g(r({color:`red`,text:_?`找不到任何可执行脚本`:`No scripts found`}));let e=Object.keys(S).map(e=>`${e}: ${(S?.[e]??``).replace(/[\r\n]+/g,` `)}`);if(!await X(_))return g(r({color:`yellow`,text:_?`未检测到可用的交互环境或交互选择已被禁用,请直接传入脚本名称`:`Interactive picker is unavailable (non-interactive or disabled). Please pass a script name explicitly.`}));let{result:t,status:n}=await Z(e,{placeholder:_?`🤔请选择一个要执行的指令`:`Please select a command to run`});if(n===130)return x();C=t.substring(0,t.indexOf(`: `))}if(!p&&!C)return x();g(r({text:`🤔 ${b} ${C}`,color:`magenta`}));let{command:D,text:O,val:A}=await Ce({termStart:d,params:m,dirname:v,argv:u,val:C,runMsg:b,isZh:_,pushHistory:V,jsShell:c,isNeedPrefix:e=>we(u[0],e,u),fuzzyWorkspace:p}),j=D;C=A;let{status:M,result:N=``}=await c(j,{errorExit:!1,stdio:`inherit`});if(M===0)return g(r({color:`green`,text:`\n${O} 🎉`}));if(N.includes(`pnpm versions with respective Node.js version support`)){g(r({text:_?`正在尝试使用 npm 再次执行...`:`Trying to use npm to run again...`,color:`yellow`}));let e=[...m];e[0]===`--`&&e.shift();let{status:t}=await c(E([`npm`,`run`,C,...e.length?[`--`,...e]:[]]),`inherit`);if(t===0)return g(r({color:`green`,text:`\n${O} 🎉`}))}g(r({color:`red`,text:`\ncommand ${C} ${l} ❌`}))}export{Te as t};