cleye 2.3.0 → 2.5.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/dist/index.cjs +5 -5
- package/dist/index.mjs +4 -4
- package/package.json +4 -2
- package/skills/cleye/SKILL.md +263 -0
package/dist/index.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"use strict";var D=Object.defineProperty;var o=(t,e)=>D(t,"name",{value:e,configurable:!0});var M=require("type-flag"),R=require("tty"),
|
|
1
|
+
"use strict";var D=Object.defineProperty;var o=(t,e)=>D(t,"name",{value:e,configurable:!0});var M=require("type-flag"),R=require("tty"),q=require("terminal-columns");const A=new Uint32Array(65536),U=o((t,e)=>{const r=t.length,a=e.length,n=1<<r-1;let s=-1,i=0,f=r,l=r;for(;l--;)A[t.charCodeAt(l)]|=1<<l;for(l=0;l<a;l++){let h=A[e.charCodeAt(l)];const u=h|i;h|=(h&s)+s^s,i|=~(h|s),s&=h,i&n&&f++,s&n&&f--,i=i<<1|1,s=s<<1|~(u|i),i&=u}for(l=r;l--;)A[t.charCodeAt(l)]=0;return f},"myers_32"),L=o((t,e)=>{const r=e.length,a=t.length,n=[],s=[],i=Math.ceil(r/32),f=Math.ceil(a/32);for(let c=0;c<i;c++)s[c]=-1,n[c]=0;let l=0;for(;l<f-1;l++){let c=0,p=-1;const m=l*32,y=Math.min(32,a)+m;for(let d=m;d<y;d++)A[t.charCodeAt(d)]|=1<<d;for(let d=0;d<r;d++){const v=A[e.charCodeAt(d)],w=s[d/32|0]>>>d&1,g=n[d/32|0]>>>d&1,O=v|c,N=((v|g)&p)+p^p|v|g;let x=c|~(N|p),j=p&N;x>>>31^w&&(s[d/32|0]^=1<<d),j>>>31^g&&(n[d/32|0]^=1<<d),x=x<<1|w,j=j<<1|g,p=j|~(O|x),c=x&O}for(let d=m;d<y;d++)A[t.charCodeAt(d)]=0}let h=0,u=-1;const $=l*32,C=Math.min(32,a-$)+$;for(let c=$;c<C;c++)A[t.charCodeAt(c)]|=1<<c;let E=a;for(let c=0;c<r;c++){const p=A[e.charCodeAt(c)],m=s[c/32|0]>>>c&1,y=n[c/32|0]>>>c&1,d=p|h,v=((p|y)&u)+u^u|p|y;let w=h|~(v|u),g=u&v;E+=w>>>a-1&1,E-=g>>>a-1&1,w>>>31^m&&(s[c/32|0]^=1<<c),g>>>31^y&&(n[c/32|0]^=1<<c),w=w<<1|m,g=g<<1|y,u=g|~(d|w),h=w&d}for(let c=$;c<C;c++)A[t.charCodeAt(c)]=0;return E},"myers_x"),F=o((t,e)=>{if(t.length<e.length){const r=e;e=t,t=r}return e.length===0?t.length:t.length<=32?U(t,e):L(t,e)},"distance"),T=o((t,e)=>{let r=1/0,a=0;for(let n=0;n<e.length;n++){const s=F(t,e[n]);s<r&&(r=s,a=n)}return e[a]},"closest"),H=o(t=>t.replaceAll(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),"camelCase"),V=o(t=>t.replaceAll(/\B([A-Z])/g,"-$1").toLowerCase(),"kebabCase"),J={"> 80":[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"auto"}],"> 40":[{width:"auto",paddingLeft:2,paddingRight:8,preprocess:o(t=>t.trim(),"preprocess")},{width:"100%",paddingLeft:2,paddingBottom:1}],"> 0":{stdoutColumns:1e3,columns:[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"content-width"}]}};function W(t){let e=!1;return{type:"table",data:{tableData:Object.keys(t).sort((n,s)=>n.localeCompare(s)).map(n=>{const s=t[n],i="alias"in s;return i&&(e=!0),{name:n,flag:s,flagFormatted:`--${V(n)}`,aliasesEnabled:e,aliasFormatted:i?`-${s.alias}`:void 0}}).map(n=>(n.aliasesEnabled=e,[{type:"flagName",data:n},{type:"flagDescription",data:n}])),tableBreakpoints:J}}}o(W,"renderFlags");const k=o(t=>!t||(t.version??(t.help?t.help.version:void 0)),"getVersion"),B=o(t=>{const e="parent"in t&&t.parent?.name;return(e?`${e} `:"")+t.name},"getName");function z(t){const e=[];t.name&&e.push(B(t));const r=k(t)??("parent"in t&&k(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")}
|
|
2
2
|
`}}o(z,"getNameAndVersion");function K(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description}
|
|
3
3
|
`}}o(K,"getDescription");function Z(t){const e=t.help||{};if("usage"in e)return e.usage?{id:"usage",type:"section",data:{title:"Usage:",body:Array.isArray(e.usage)?e.usage.join(`
|
|
4
|
-
`):e.usage}}:void 0;if(t.name){const r=[],a=[
|
|
4
|
+
`):e.usage}}:void 0;if(t.name){const r=[],a=[B(t)];if(t.flags&&Object.keys(t.flags).length>0&&a.push("[flags...]"),t.parameters&&t.parameters.length>0){const{parameters:n}=t,s=n.indexOf("--"),i=s!==-1&&n.slice(s+1).some(f=>f.startsWith("<"));a.push(n.map(f=>f!=="--"?f:i?"--":"[--]").join(" "))}if(a.length>1&&r.push(a.join(" ")),"commands"in t&&t.commands?.length&&r.push(`${t.name} <command>`),r.length>0)return{id:"usage",type:"section",data:{title:"Usage:",body:r.join(`
|
|
5
5
|
`)}}}}o(Z,"getUsage");function G(t){return!("commands"in t)||!t.commands?.length?void 0:{id:"commands",type:"section",data:{title:"Commands:",body:{type:"table",data:{tableData:t.commands.map(a=>{const{help:n}=a.options;return[a.options.name,typeof n=="object"&&n.description||""]}),tableOptions:[{width:"content-width",paddingLeft:2,paddingRight:8}]}},indentBody:0}}}o(G,"getCommands");function Q(t){if(!(!t.flags||Object.keys(t.flags).length===0))return{id:"flags",type:"section",data:{title:"Flags:",body:W(t.flags),indentBody:0}}}o(Q,"getFlags");function X(t){const{help:e}=t;if(!e||!e.examples||e.examples.length===0)return;let{examples:r}=e;if(Array.isArray(r)&&(r=r.join(`
|
|
6
6
|
`)),r)return{id:"examples",type:"section",data:{title:"Examples:",body:r}}}o(X,"getExamples");function Y(t){if(!("alias"in t)||!t.alias)return;const{alias:e}=t;return{id:"aliases",type:"section",data:{title:"Aliases:",body:Array.isArray(e)?e.join(", "):e}}}o(Y,"getAliases");const ee=o(t=>[z,K,Z,G,Q,X,Y].map(e=>e(t)).filter(Boolean),"generateHelp"),te=R.WriteStream.prototype.hasColors();class re{static{o(this,"Renderers")}text(e){return e}bold(e){return te?`\x1B[1m${e}\x1B[22m`:e.toLocaleUpperCase()}indentText({text:e,spaces:r}){return e.replaceAll(/^/gm," ".repeat(r))}heading(e){return this.bold(e)}section({title:e,body:r,indentBody:a=2}){return`${(e?`${this.heading(e)}
|
|
7
7
|
`:"")+(r?this.indentText({text:this.render(r),spaces:a}):"")}
|
|
8
|
-
`}table({tableData:e,tableOptions:r,tableBreakpoints:a}){return
|
|
9
|
-
`);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const
|
|
10
|
-
`),a(),process.exit(1);t[l]=h}}o(I,"mapParametersToArguments");function ae(t){return t!==!1}o(ae,"helpEnabled");const se=o(t=>{const e=[];for(const[r,a]of Object.entries(t))if(e.push(r),a&&typeof a=="object"&&"alias"in a){const{alias:n}=a;typeof n=="string"&&n?e.push(n):Array.isArray(n)&&e.push(...n.filter(Boolean))}return e},"getKnownFlagNames"),ie=o((t,e)=>{if(t.length<3||e.length===0)return;const r=T(t,e);return
|
|
8
|
+
`}table({tableData:e,tableOptions:r,tableBreakpoints:a}){return q.terminalColumns(e.map(n=>n.map(s=>this.render(s))),a?q.breakpoints(a):r)}flagParameter(e){return e===Boolean?"":e===String?"<string>":e===Number?"<number>":Array.isArray(e)?this.flagParameter(e[0]):"<value>"}flagOperator(e){return" "}flagName(e){const{flag:r,flagFormatted:a,aliasesEnabled:n,aliasFormatted:s}=e;let i="";if(s?i+=`${s}, `:n&&(i+=" "),i+=a,"placeholder"in r&&typeof r.placeholder=="string")i+=`${this.flagOperator(e)}${r.placeholder}`;else{const f=this.flagParameter("type"in r?r.type:r);f&&(i+=`${this.flagOperator(e)}${f}`)}return i}flagDefault(e){return JSON.stringify(e)}flagDescription({flag:e}){let r="description"in e?e.description??"":"";if("default"in e){let{default:a}=e;typeof a=="function"&&(a=a()),a&&(r+=` (default: ${this.flagDefault(a)})`)}return r}render(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(r=>this.render(r)).join(`
|
|
9
|
+
`);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const P=o(t=>t.length>0&&!t.includes(" "),"isValidScriptName"),{stringify:b}=JSON,ne=/[|\\{}()[\]^$+*?.]/;function S(t){const e=[];let r,a;for(const n of t){if(a)throw new Error(`Invalid parameter: Spread parameter ${b(a)} must be last`);const s=n[0],i=n.at(-1);let f;if(s==="<"&&i===">"&&(f=!0,r))throw new Error(`Invalid parameter: Required parameter ${b(n)} cannot come after optional parameter ${b(r)}`);if(s==="["&&i==="]"&&(f=!1,r=n),f===void 0)throw new Error(`Invalid parameter: ${b(n)}. Must be wrapped in <> (required parameter) or [] (optional parameter)`);let l=n.slice(1,-1);const h=l.slice(-3)==="...";h&&(a=n,l=l.slice(0,-3));const u=l.match(ne);if(u)throw new Error(`Invalid parameter: ${b(n)}. Invalid character found ${b(u[0])}`);e.push({name:l,required:f,spread:h})}return e}o(S,"parseParameters");function I(t,e,r,a){for(let n=0;n<e.length;n+=1){const{name:s,required:i,spread:f}=e[n],l=H(s);if(l in t)throw new Error(`Invalid parameter: ${b(s)} is used more than once.`);const h=f?r.slice(n):r[n];if(f&&(n=e.length),i&&(!h||f&&h.length===0))return console.error(`Error: Missing required parameter ${b(s)}
|
|
10
|
+
`),a(),process.exit(1);t[l]=h}}o(I,"mapParametersToArguments");function ae(t){return t!==!1}o(ae,"helpEnabled");const se=o(t=>{const e=[];for(const[r,a]of Object.entries(t))if(e.push(r),a&&typeof a=="object"&&"alias"in a){const{alias:n}=a;typeof n=="string"&&n?e.push(n):Array.isArray(n)&&e.push(...n.filter(Boolean))}return e},"getKnownFlagNames"),ie=o((t,e)=>{if(t.length<3||e.length===0)return;const r=T(t,e);return F(t,r)<=2?r:void 0},"findClosestFlag"),oe=o((t,e)=>{const r=Object.keys(t);if(r.length!==0){for(const a of r){const n=ie(a,e),s=n?` (Did you mean --${n}?)`:"";console.error(`Error: Unknown flag: --${a}.${s}`)}process.exit(1)}},"handleUnknownFlags");function _(t,e,r,a){const n={...e.flags},s=e.version&&!("version"in n);s&&(n.version={type:Boolean,description:"Show version"});const{help:i}=e,f=ae(i);f&&!("help"in n)&&(n.help={type:Boolean,alias:"h",description:"Show help"});const l=M.typeFlag(n,a,{ignore:e.ignoreArgv,booleanNegation:e.booleanFlagNegation??e.parent?.booleanFlagNegation}),h=o(()=>{console.log(e.version)},"showVersion");if(s&&l.flags.version===!0)return h(),process.exit(0);const u=new re,$=f&&i?.render?i.render:m=>u.render(m),C=o(m=>{const y=ee({...e,...m?{help:m}:{},flags:n});console.log($(y,u))},"showHelp");if(f&&l.flags.help===!0)return C(),process.exit(0);if((e.strictFlags??e.parent?.strictFlags)&&oe(l.unknownFlags,se(n)),e.parameters){let{parameters:m}=e,y=l._;const d=m.indexOf("--"),v=m.slice(d+1),w=Object.create(null);let g=[];d>-1&&v.length>0&&(m=m.slice(0,d),g=l._["--"],y=y.slice(0,-g.length||void 0)),I(w,S(m),y,C),d>-1&&v.length>0&&I(w,S(v),g,C),Object.assign(l._,w)}const c={...l,showVersion:h,showHelp:C},p={command:t,...c};if(typeof r=="function"){const m=r(c);if(m&&"then"in m)return Object.assign(Promise.resolve(m),p)}return p}o(_,"cliBase");function le(t,e){const r=new Map;for(const a of e){const n=[a.options.name],{alias:s}=a.options;s&&(Array.isArray(s)?n.push(...s):n.push(s));for(const i of n){if(r.has(i))throw new Error(`Duplicate command name found: ${b(i)}`);r.set(i,a)}}return r.get(t)}o(le,"getCommand");function ce(t,e,r=process.argv.slice(2)){if(!t)throw new Error("Options is required");if("name"in t&&(!t.name||t.name!==t.name.trim()))throw new Error(`Invalid script name: ${b(t.name)}`);const a=r[0];if(t.commands&&a&&P(a)){const n=le(a,t.commands);if(n)return _(n.options.name,{...n.options,parent:t},n.callback,r.slice(1))}return _(void 0,t,e,r)}o(ce,"cli");function de(t,e){if(!t)throw new Error("Command options are required");const{name:r}=t;if(r===void 0)throw new Error("Command name is required");if(!P(r))throw new Error(`Invalid command name ${JSON.stringify(r)}. Command names must be one word.`);return{options:t,callback:e}}o(de,"command"),exports.cli=ce,exports.command=de;
|
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
var _=Object.defineProperty;var o=(t,e)=>_(t,"name",{value:e,configurable:!0});import{typeFlag as D}from"type-flag";import M from"tty";import{terminalColumns as R,breakpoints as U}from"terminal-columns";const A=new Uint32Array(65536),L=o((t,e)=>{const r=t.length,a=e.length,n=1<<r-1;let s=-1,i=0,d=r,l=r;for(;l--;)A[t.charCodeAt(l)]|=1<<l;for(l=0;l<a;l++){let h=A[e.charCodeAt(l)];const u=h|i;h|=(h&s)+s^s,i|=~(h|s),s&=h,i&n&&d++,s&n&&d--,i=i<<1|1,s=s<<1|~(u|i),i&=u}for(l=r;l--;)A[t.charCodeAt(l)]=0;return d},"myers_32"),T=o((t,e)=>{const r=e.length,a=t.length,n=[],s=[],i=Math.ceil(r/32),d=Math.ceil(a/32);for(let c=0;c<i;c++)s[c]=-1,n[c]=0;let l=0;for(;l<d-1;l++){let c=0,p=-1;const m=l*32,y=Math.min(32,a)+m;for(let f=m;f<y;f++)A[t.charCodeAt(f)]|=1<<f;for(let f=0;f<r;f++){const v=A[e.charCodeAt(f)],w=s[f/32|0]>>>f&1,g=n[f/32|0]>>>f&1,
|
|
1
|
+
var _=Object.defineProperty;var o=(t,e)=>_(t,"name",{value:e,configurable:!0});import{typeFlag as D}from"type-flag";import M from"tty";import{terminalColumns as R,breakpoints as U}from"terminal-columns";const A=new Uint32Array(65536),L=o((t,e)=>{const r=t.length,a=e.length,n=1<<r-1;let s=-1,i=0,d=r,l=r;for(;l--;)A[t.charCodeAt(l)]|=1<<l;for(l=0;l<a;l++){let h=A[e.charCodeAt(l)];const u=h|i;h|=(h&s)+s^s,i|=~(h|s),s&=h,i&n&&d++,s&n&&d--,i=i<<1|1,s=s<<1|~(u|i),i&=u}for(l=r;l--;)A[t.charCodeAt(l)]=0;return d},"myers_32"),T=o((t,e)=>{const r=e.length,a=t.length,n=[],s=[],i=Math.ceil(r/32),d=Math.ceil(a/32);for(let c=0;c<i;c++)s[c]=-1,n[c]=0;let l=0;for(;l<d-1;l++){let c=0,p=-1;const m=l*32,y=Math.min(32,a)+m;for(let f=m;f<y;f++)A[t.charCodeAt(f)]|=1<<f;for(let f=0;f<r;f++){const v=A[e.charCodeAt(f)],w=s[f/32|0]>>>f&1,g=n[f/32|0]>>>f&1,O=v|c,N=((v|g)&p)+p^p|v|g;let x=c|~(N|p),j=p&N;x>>>31^w&&(s[f/32|0]^=1<<f),j>>>31^g&&(n[f/32|0]^=1<<f),x=x<<1|w,j=j<<1|g,p=j|~(O|x),c=x&O}for(let f=m;f<y;f++)A[t.charCodeAt(f)]=0}let h=0,u=-1;const C=l*32,$=Math.min(32,a-C)+C;for(let c=C;c<$;c++)A[t.charCodeAt(c)]|=1<<c;let E=a;for(let c=0;c<r;c++){const p=A[e.charCodeAt(c)],m=s[c/32|0]>>>c&1,y=n[c/32|0]>>>c&1,f=p|h,v=((p|y)&u)+u^u|p|y;let w=h|~(v|u),g=u&v;E+=w>>>a-1&1,E-=g>>>a-1&1,w>>>31^m&&(s[c/32|0]^=1<<c),g>>>31^y&&(n[c/32|0]^=1<<c),w=w<<1|m,g=g<<1|y,u=g|~(f|w),h=w&f}for(let c=C;c<$;c++)A[t.charCodeAt(c)]=0;return E},"myers_x"),F=o((t,e)=>{if(t.length<e.length){const r=e;e=t,t=r}return e.length===0?t.length:t.length<=32?L(t,e):T(t,e)},"distance"),H=o((t,e)=>{let r=1/0,a=0;for(let n=0;n<e.length;n++){const s=F(t,e[n]);s<r&&(r=s,a=n)}return e[a]},"closest"),V=o(t=>t.replaceAll(/[\W_]([a-z\d])?/gi,(e,r)=>r?r.toUpperCase():""),"camelCase"),J=o(t=>t.replaceAll(/\B([A-Z])/g,"-$1").toLowerCase(),"kebabCase"),W={"> 80":[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"auto"}],"> 40":[{width:"auto",paddingLeft:2,paddingRight:8,preprocess:o(t=>t.trim(),"preprocess")},{width:"100%",paddingLeft:2,paddingBottom:1}],"> 0":{stdoutColumns:1e3,columns:[{width:"content-width",paddingLeft:2,paddingRight:8},{width:"content-width"}]}};function z(t){let e=!1;return{type:"table",data:{tableData:Object.keys(t).sort((n,s)=>n.localeCompare(s)).map(n=>{const s=t[n],i="alias"in s;return i&&(e=!0),{name:n,flag:s,flagFormatted:`--${J(n)}`,aliasesEnabled:e,aliasFormatted:i?`-${s.alias}`:void 0}}).map(n=>(n.aliasesEnabled=e,[{type:"flagName",data:n},{type:"flagDescription",data:n}])),tableBreakpoints:W}}}o(z,"renderFlags");const q=o(t=>!t||(t.version??(t.help?t.help.version:void 0)),"getVersion"),k=o(t=>{const e="parent"in t&&t.parent?.name;return(e?`${e} `:"")+t.name},"getName");function K(t){const e=[];t.name&&e.push(k(t));const r=q(t)??("parent"in t&&q(t.parent));if(r&&e.push(`v${r}`),e.length!==0)return{id:"name",type:"text",data:`${e.join(" ")}
|
|
2
2
|
`}}o(K,"getNameAndVersion");function Z(t){const{help:e}=t;if(!(!e||!e.description))return{id:"description",type:"text",data:`${e.description}
|
|
3
3
|
`}}o(Z,"getDescription");function G(t){const e=t.help||{};if("usage"in e)return e.usage?{id:"usage",type:"section",data:{title:"Usage:",body:Array.isArray(e.usage)?e.usage.join(`
|
|
4
|
-
`):e.usage}}:void 0;if(t.name){const r=[],a=[
|
|
4
|
+
`):e.usage}}:void 0;if(t.name){const r=[],a=[k(t)];if(t.flags&&Object.keys(t.flags).length>0&&a.push("[flags...]"),t.parameters&&t.parameters.length>0){const{parameters:n}=t,s=n.indexOf("--"),i=s!==-1&&n.slice(s+1).some(d=>d.startsWith("<"));a.push(n.map(d=>d!=="--"?d:i?"--":"[--]").join(" "))}if(a.length>1&&r.push(a.join(" ")),"commands"in t&&t.commands?.length&&r.push(`${t.name} <command>`),r.length>0)return{id:"usage",type:"section",data:{title:"Usage:",body:r.join(`
|
|
5
5
|
`)}}}}o(G,"getUsage");function Q(t){return!("commands"in t)||!t.commands?.length?void 0:{id:"commands",type:"section",data:{title:"Commands:",body:{type:"table",data:{tableData:t.commands.map(a=>{const{help:n}=a.options;return[a.options.name,typeof n=="object"&&n.description||""]}),tableOptions:[{width:"content-width",paddingLeft:2,paddingRight:8}]}},indentBody:0}}}o(Q,"getCommands");function X(t){if(!(!t.flags||Object.keys(t.flags).length===0))return{id:"flags",type:"section",data:{title:"Flags:",body:z(t.flags),indentBody:0}}}o(X,"getFlags");function Y(t){const{help:e}=t;if(!e||!e.examples||e.examples.length===0)return;let{examples:r}=e;if(Array.isArray(r)&&(r=r.join(`
|
|
6
6
|
`)),r)return{id:"examples",type:"section",data:{title:"Examples:",body:r}}}o(Y,"getExamples");function ee(t){if(!("alias"in t)||!t.alias)return;const{alias:e}=t;return{id:"aliases",type:"section",data:{title:"Aliases:",body:Array.isArray(e)?e.join(", "):e}}}o(ee,"getAliases");const te=o(t=>[K,Z,G,Q,X,Y,ee].map(e=>e(t)).filter(Boolean),"generateHelp"),re=M.WriteStream.prototype.hasColors();class ne{static{o(this,"Renderers")}text(e){return e}bold(e){return re?`\x1B[1m${e}\x1B[22m`:e.toLocaleUpperCase()}indentText({text:e,spaces:r}){return e.replaceAll(/^/gm," ".repeat(r))}heading(e){return this.bold(e)}section({title:e,body:r,indentBody:a=2}){return`${(e?`${this.heading(e)}
|
|
7
7
|
`:"")+(r?this.indentText({text:this.render(r),spaces:a}):"")}
|
|
8
8
|
`}table({tableData:e,tableOptions:r,tableBreakpoints:a}){return R(e.map(n=>n.map(s=>this.render(s))),a?U(a):r)}flagParameter(e){return e===Boolean?"":e===String?"<string>":e===Number?"<number>":Array.isArray(e)?this.flagParameter(e[0]):"<value>"}flagOperator(e){return" "}flagName(e){const{flag:r,flagFormatted:a,aliasesEnabled:n,aliasFormatted:s}=e;let i="";if(s?i+=`${s}, `:n&&(i+=" "),i+=a,"placeholder"in r&&typeof r.placeholder=="string")i+=`${this.flagOperator(e)}${r.placeholder}`;else{const d=this.flagParameter("type"in r?r.type:r);d&&(i+=`${this.flagOperator(e)}${d}`)}return i}flagDefault(e){return JSON.stringify(e)}flagDescription({flag:e}){let r="description"in e?e.description??"":"";if("default"in e){let{default:a}=e;typeof a=="function"&&(a=a()),a&&(r+=` (default: ${this.flagDefault(a)})`)}return r}render(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(r=>this.render(r)).join(`
|
|
9
|
-
`);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const
|
|
10
|
-
`),a(),process.exit(1);t[l]=h}}o(S,"mapParametersToArguments");function se(t){return t!==!1}o(se,"helpEnabled");const ie=o(t=>{const e=[];for(const[r,a]of Object.entries(t))if(e.push(r),a&&typeof a=="object"&&"alias"in a){const{alias:n}=a;typeof n=="string"&&n?e.push(n):Array.isArray(n)&&e.push(...n.filter(Boolean))}return e},"getKnownFlagNames"),oe=o((t,e)=>{if(t.length<3||e.length===0)return;const r=H(t,e);return
|
|
9
|
+
`);if("type"in e&&this[e.type]){const r=this[e.type];if(typeof r=="function")return r.call(this,e.data)}throw new Error(`Invalid node type: ${JSON.stringify(e)}`)}}const B=o(t=>t.length>0&&!t.includes(" "),"isValidScriptName"),{stringify:b}=JSON,ae=/[|\\{}()[\]^$+*?.]/;function P(t){const e=[];let r,a;for(const n of t){if(a)throw new Error(`Invalid parameter: Spread parameter ${b(a)} must be last`);const s=n[0],i=n.at(-1);let d;if(s==="<"&&i===">"&&(d=!0,r))throw new Error(`Invalid parameter: Required parameter ${b(n)} cannot come after optional parameter ${b(r)}`);if(s==="["&&i==="]"&&(d=!1,r=n),d===void 0)throw new Error(`Invalid parameter: ${b(n)}. Must be wrapped in <> (required parameter) or [] (optional parameter)`);let l=n.slice(1,-1);const h=l.slice(-3)==="...";h&&(a=n,l=l.slice(0,-3));const u=l.match(ae);if(u)throw new Error(`Invalid parameter: ${b(n)}. Invalid character found ${b(u[0])}`);e.push({name:l,required:d,spread:h})}return e}o(P,"parseParameters");function S(t,e,r,a){for(let n=0;n<e.length;n+=1){const{name:s,required:i,spread:d}=e[n],l=V(s);if(l in t)throw new Error(`Invalid parameter: ${b(s)} is used more than once.`);const h=d?r.slice(n):r[n];if(d&&(n=e.length),i&&(!h||d&&h.length===0))return console.error(`Error: Missing required parameter ${b(s)}
|
|
10
|
+
`),a(),process.exit(1);t[l]=h}}o(S,"mapParametersToArguments");function se(t){return t!==!1}o(se,"helpEnabled");const ie=o(t=>{const e=[];for(const[r,a]of Object.entries(t))if(e.push(r),a&&typeof a=="object"&&"alias"in a){const{alias:n}=a;typeof n=="string"&&n?e.push(n):Array.isArray(n)&&e.push(...n.filter(Boolean))}return e},"getKnownFlagNames"),oe=o((t,e)=>{if(t.length<3||e.length===0)return;const r=H(t,e);return F(t,r)<=2?r:void 0},"findClosestFlag"),le=o((t,e)=>{const r=Object.keys(t);if(r.length!==0){for(const a of r){const n=oe(a,e),s=n?` (Did you mean --${n}?)`:"";console.error(`Error: Unknown flag: --${a}.${s}`)}process.exit(1)}},"handleUnknownFlags");function I(t,e,r,a){const n={...e.flags},s=e.version&&!("version"in n);s&&(n.version={type:Boolean,description:"Show version"});const{help:i}=e,d=se(i);d&&!("help"in n)&&(n.help={type:Boolean,alias:"h",description:"Show help"});const l=D(n,a,{ignore:e.ignoreArgv,booleanNegation:e.booleanFlagNegation??e.parent?.booleanFlagNegation}),h=o(()=>{console.log(e.version)},"showVersion");if(s&&l.flags.version===!0)return h(),process.exit(0);const u=new ne,C=d&&i?.render?i.render:m=>u.render(m),$=o(m=>{const y=te({...e,...m?{help:m}:{},flags:n});console.log(C(y,u))},"showHelp");if(d&&l.flags.help===!0)return $(),process.exit(0);if((e.strictFlags??e.parent?.strictFlags)&&le(l.unknownFlags,ie(n)),e.parameters){let{parameters:m}=e,y=l._;const f=m.indexOf("--"),v=m.slice(f+1),w=Object.create(null);let g=[];f>-1&&v.length>0&&(m=m.slice(0,f),g=l._["--"],y=y.slice(0,-g.length||void 0)),S(w,P(m),y,$),f>-1&&v.length>0&&S(w,P(v),g,$),Object.assign(l._,w)}const c={...l,showVersion:h,showHelp:$},p={command:t,...c};if(typeof r=="function"){const m=r(c);if(m&&"then"in m)return Object.assign(Promise.resolve(m),p)}return p}o(I,"cliBase");function ce(t,e){const r=new Map;for(const a of e){const n=[a.options.name],{alias:s}=a.options;s&&(Array.isArray(s)?n.push(...s):n.push(s));for(const i of n){if(r.has(i))throw new Error(`Duplicate command name found: ${b(i)}`);r.set(i,a)}}return r.get(t)}o(ce,"getCommand");function fe(t,e,r=process.argv.slice(2)){if(!t)throw new Error("Options is required");if("name"in t&&(!t.name||t.name!==t.name.trim()))throw new Error(`Invalid script name: ${b(t.name)}`);const a=r[0];if(t.commands&&a&&B(a)){const n=ce(a,t.commands);if(n)return I(n.options.name,{...n.options,parent:t},n.callback,r.slice(1))}return I(void 0,t,e,r)}o(fe,"cli");function de(t,e){if(!t)throw new Error("Command options are required");const{name:r}=t;if(r===void 0)throw new Error("Command name is required");if(!B(r))throw new Error(`Invalid command name ${JSON.stringify(r)}. Command names must be one word.`);return{options:t,callback:e}}o(de,"command");export{fe as cli,de as command};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cleye",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "The intuitive CLI development tool",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -19,8 +19,10 @@
|
|
|
19
19
|
"email": "hiroki.osame@gmail.com"
|
|
20
20
|
},
|
|
21
21
|
"files": [
|
|
22
|
-
"dist"
|
|
22
|
+
"dist",
|
|
23
|
+
"skills"
|
|
23
24
|
],
|
|
25
|
+
"type": "module",
|
|
24
26
|
"main": "./dist/index.cjs",
|
|
25
27
|
"module": "./dist/index.mjs",
|
|
26
28
|
"types": "./dist/index.d.cts",
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cleye
|
|
3
|
+
description: cleye CLI development tool — argv parsing with typed parameters, flags, commands, and auto-generated help. Use when building Node.js CLI scripts with cleye or when the user imports `cli` or `command` from `cleye`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# cleye
|
|
7
|
+
|
|
8
|
+
## Quick Patterns
|
|
9
|
+
|
|
10
|
+
| Task | Pattern |
|
|
11
|
+
|------|---------|
|
|
12
|
+
| Basic CLI | `cli({ name, parameters, flags })` |
|
|
13
|
+
| Named command | `command({ name, parameters, flags }, callback)` |
|
|
14
|
+
| Register commands | `cli({ commands: [cmd1, cmd2] })` |
|
|
15
|
+
| Async callback | `await cli({ ... }, async (argv) => { ... })` |
|
|
16
|
+
| Raw argv | `cli({ ... }, callback, process.argv.slice(2))` |
|
|
17
|
+
|
|
18
|
+
## Parameters
|
|
19
|
+
|
|
20
|
+
Positional arguments mapped to named properties on `argv._`.
|
|
21
|
+
|
|
22
|
+
| Format | Description |
|
|
23
|
+
|--------|-------------|
|
|
24
|
+
| `<name>` | Required |
|
|
25
|
+
| `[name]` | Optional |
|
|
26
|
+
| `<name...>` | Required spread (1+) |
|
|
27
|
+
| `[name...]` | Optional spread (0+) |
|
|
28
|
+
| `--` | End-of-flags separator |
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
const argv = cli({
|
|
32
|
+
parameters: ['<required>', '[optional]', '[rest...]']
|
|
33
|
+
})
|
|
34
|
+
argv._.required // string
|
|
35
|
+
argv._.optional // string | undefined
|
|
36
|
+
argv._.rest // string[]
|
|
37
|
+
argv._['--'] // string[] — everything after --
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Multi-word names use camelCase on `argv._`: `'<first name>'` → `argv._.firstName`.
|
|
41
|
+
|
|
42
|
+
## Flags
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
const argv = cli({
|
|
46
|
+
flags: {
|
|
47
|
+
verbose: Boolean, // shorthand
|
|
48
|
+
output: {
|
|
49
|
+
type: String,
|
|
50
|
+
alias: 'o',
|
|
51
|
+
default: 'dist',
|
|
52
|
+
description: 'Output directory',
|
|
53
|
+
placeholder: '<path>'
|
|
54
|
+
},
|
|
55
|
+
count: {
|
|
56
|
+
type: [Number], // array: -n 1 -n 2
|
|
57
|
+
alias: 'n'
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
argv.flags.verbose // boolean | undefined
|
|
63
|
+
argv.flags.output // string
|
|
64
|
+
argv.flags.count // number[]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Flag name is camelCase; parsed from kebab-case CLI input (`--output-dir` → `outputDir`).
|
|
68
|
+
|
|
69
|
+
**Delimiters** — `=`, `:`, and `.` all work as value separators:
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
--flag=value --flag:value --flag.value
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Use `:` when the value itself contains `=` (e.g. `--define:KEY=VALUE`).
|
|
76
|
+
|
|
77
|
+
**Counting flags** — use `[Boolean]` and check `.length`:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
cli({
|
|
81
|
+
flags: {
|
|
82
|
+
verbose: {
|
|
83
|
+
type: [Boolean],
|
|
84
|
+
alias: 'v'
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
// -vvv → argv.flags.verbose.length === 3
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Optional value** — custom type returns `true` when no value is given:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
const OptionalString = (value: string) => value || true
|
|
95
|
+
cli({ flags: { tag: OptionalString } })
|
|
96
|
+
// --tag → true
|
|
97
|
+
// --tag beta → 'beta'
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Boolean Flag Negation
|
|
101
|
+
|
|
102
|
+
By default, set a boolean flag to `false` using the `=` operator:
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
--verbose=false # → false
|
|
106
|
+
--verbose false # → true (false treated as separate argument)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
To also support the `--no-<flag>` convention, enable `booleanFlagNegation` (additive — `=false` still works):
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
cli({
|
|
113
|
+
flags: { verbose: Boolean },
|
|
114
|
+
booleanFlagNegation: true
|
|
115
|
+
})
|
|
116
|
+
// --no-verbose → false
|
|
117
|
+
// --verbose=false → false (still works)
|
|
118
|
+
// Last-wins: --verbose --no-verbose → false
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Commands inherit `booleanFlagNegation` from the parent `cli()` but can override it.
|
|
122
|
+
|
|
123
|
+
## Strict Flags
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
cli({
|
|
127
|
+
flags: { foo: Boolean },
|
|
128
|
+
strictFlags: true
|
|
129
|
+
})
|
|
130
|
+
// --baz → Error: Unknown flag: --baz. (Did you mean --foo?)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Commands inherit `strictFlags` but can override it.
|
|
134
|
+
|
|
135
|
+
## Commands
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
// install-command.ts
|
|
139
|
+
export const installCommand = command({
|
|
140
|
+
name: 'install',
|
|
141
|
+
alias: ['i', 'add'],
|
|
142
|
+
parameters: ['<package name>'],
|
|
143
|
+
flags: { saveDev: Boolean }
|
|
144
|
+
}, (argv) => {
|
|
145
|
+
argv._.packageName // string
|
|
146
|
+
argv.flags.saveDev // boolean | undefined
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
// main.ts
|
|
150
|
+
cli({
|
|
151
|
+
name: 'npm',
|
|
152
|
+
version: '1.0.0',
|
|
153
|
+
commands: [installCommand]
|
|
154
|
+
})
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
When a command is matched, `argv.command` narrows the type for type-safe branching.
|
|
158
|
+
|
|
159
|
+
## Help & Version
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
cli({
|
|
163
|
+
name: 'my-script',
|
|
164
|
+
version: '1.2.3', // enables --version; also shown in --help
|
|
165
|
+
help: {
|
|
166
|
+
description: 'Does things',
|
|
167
|
+
usage: 'my-script [flags] <file>',
|
|
168
|
+
examples: ['my-script foo.txt', 'my-script --output=dist foo.txt'],
|
|
169
|
+
version: '1.2.3' // show version in --help without handling --version
|
|
170
|
+
}
|
|
171
|
+
})
|
|
172
|
+
// help: false — disables --help handling; call argv.showHelp() manually
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Custom Flag Types
|
|
176
|
+
|
|
177
|
+
Any function `(value: string) => T` works as a flag type — the return type is inferred.
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
// Validation + narrowing
|
|
181
|
+
const Port = (value: string) => {
|
|
182
|
+
const n = Number(value)
|
|
183
|
+
if (!Number.isInteger(n) || n < 1 || n > 65_535) { throw new Error(`Invalid port: ${value}`) }
|
|
184
|
+
return n
|
|
185
|
+
}
|
|
186
|
+
// argv.flags.port → number
|
|
187
|
+
|
|
188
|
+
// Enum
|
|
189
|
+
const sizes = ['small', 'medium', 'large'] as const
|
|
190
|
+
const Size = (v: string) => {
|
|
191
|
+
if (!(sizes as readonly string[]).includes(v)) { throw new Error(`Expected: ${sizes.join(', ')}`) }
|
|
192
|
+
return v as typeof sizes[number]
|
|
193
|
+
}
|
|
194
|
+
// argv.flags.size → 'small' | 'medium' | 'large'
|
|
195
|
+
|
|
196
|
+
// Comma-separated list
|
|
197
|
+
const List = (v: string) => v.split(',')
|
|
198
|
+
// --tags a,b,c → argv.flags.tags === ['a', 'b', 'c']
|
|
199
|
+
|
|
200
|
+
// Inline JSON
|
|
201
|
+
cli({ flags: { data: JSON.parse } })
|
|
202
|
+
// --data '{"key":1}' → argv.flags.data === { key: 1 }
|
|
203
|
+
|
|
204
|
+
// Dot-nested object (combine with . delimiter)
|
|
205
|
+
const Env = (v: string): Record<string, string | true> => {
|
|
206
|
+
const [k, value] = v.split('=')
|
|
207
|
+
return { [k]: value ?? true }
|
|
208
|
+
}
|
|
209
|
+
cli({ flags: { env: [Env] } })
|
|
210
|
+
// --env.TOKEN=abc --env.CI → merge to { TOKEN: 'abc', CI: true }
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Help Customization
|
|
214
|
+
|
|
215
|
+
```ts
|
|
216
|
+
cli({
|
|
217
|
+
help: {
|
|
218
|
+
render(nodes, renderers) {
|
|
219
|
+
nodes.push('\nDocs: https://example.com')
|
|
220
|
+
renderers.flagOperator = () => '=' // --flag=<value>
|
|
221
|
+
return renderers.render(nodes)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
})
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Default renderers: `/src/render-help/renderers.ts`.
|
|
228
|
+
|
|
229
|
+
## ignoreArgv
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
cli({
|
|
233
|
+
ignoreArgv(type, flagOrArgv, value) {
|
|
234
|
+
if (type === 'unknown-flag') { return true } // silently skip unknown flags
|
|
235
|
+
}
|
|
236
|
+
})
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
`type`: `'known-flag' | 'unknown-flag' | 'argument'`
|
|
240
|
+
|
|
241
|
+
## Return Type
|
|
242
|
+
|
|
243
|
+
```ts
|
|
244
|
+
type ParsedArgv = {
|
|
245
|
+
_: string[] & Parameters
|
|
246
|
+
flags: { [name: string]: InferredType }
|
|
247
|
+
unknownFlags: { [name: string]: (string | boolean)[] }
|
|
248
|
+
showVersion: () => void
|
|
249
|
+
showHelp: (options?: HelpOptions) => void
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## TypeScript Exports
|
|
254
|
+
|
|
255
|
+
```ts
|
|
256
|
+
import type { Flags, Renderers, TypeFlag } from 'cleye'
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
| Type | Use |
|
|
260
|
+
|------|-----|
|
|
261
|
+
| `Flags` | Type for the `flags` option object |
|
|
262
|
+
| `Renderers` | Help renderer class type for `help.render` customization |
|
|
263
|
+
| `TypeFlag` | Re-export from `type-flag` for portable type declarations |
|