@lahat-group/cli 2.0.0 → 2.0.1
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.js +45 -36
- package/package.json +1 -1
- package/skill/SKILL.md +48 -14
package/dist/index.js
CHANGED
|
@@ -1,61 +1,70 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __cr } from 'module'; const require = __cr(import.meta.url);
|
|
3
|
-
var
|
|
4
|
-
`).replace(/^/gm," ".repeat(s))}let l=[`Usage: ${t.commandUsage(e)}`,""],h=t.commandDescription(e);h.length>0&&(l=l.concat([t.wrap(h,i,0),""]));let f=t.visibleArguments(e).map(b=>c(t.argumentTerm(b),t.argumentDescription(b)));f.length>0&&(l=l.concat(["Arguments:",a(f),""]));let w=t.visibleOptions(e).map(b=>c(t.optionTerm(b),t.optionDescription(b)));if(w.length>0&&(l=l.concat(["Options:",a(w),""])),this.showGlobalOptions){let b=t.visibleGlobalOptions(e).map(
|
|
3
|
+
var Ft=Object.create;var $e=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames;var Mt=Object.getPrototypeOf,Bt=Object.prototype.hasOwnProperty;var N=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var Wt=(n,e)=>()=>(n&&(e=n(n=0)),e);var P=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var Jt=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ut(e))!Bt.call(n,i)&&i!==t&&$e(n,i,{get:()=>e[i],enumerable:!(r=Lt(e,i))||r.enumerable});return n};var zt=(n,e,t)=>(t=n!=null?Ft(Mt(n)):{},Jt(e||!n||!n.__esModule?$e(t,"default",{value:n,enumerable:!0}):t,n));import Br from"path";import{fileURLToPath as Jr}from"url";var u=Wt(()=>{"use strict"});var H=P(Q=>{"use strict";u();var U=class extends Error{constructor(e,t,r){super(r),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=t,this.exitCode=e,this.nestedError=void 0}},X=class extends U{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};Q.CommanderError=U;Q.InvalidArgumentError=X});var M=P(ee=>{"use strict";u();var{InvalidArgumentError:Gt}=H(),Z=class{constructor(e,t){switch(this.description=t||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case"<":this.required=!0,this._name=e.slice(1,-1);break;case"[":this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:t.concat(e)}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(t,r)=>{if(!this.argChoices.includes(t))throw new Gt(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,r):t},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function Kt(n){let e=n.name()+(n.variadic===!0?"...":"");return n.required?"<"+e+">":"["+e+"]"}ee.Argument=Z;ee.humanReadableArgName=Kt});var re=P(Ee=>{"use strict";u();var{humanReadableArgName:Yt}=M(),te=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let t=e.commands.filter(i=>!i._hidden),r=e._getHelpCommand();return r&&!r._hidden&&t.push(r),this.sortSubcommands&&t.sort((i,s)=>i.name().localeCompare(s.name())),t}compareOptions(e,t){let r=i=>i.short?i.short.replace(/^-/,""):i.long.replace(/^--/,"");return r(e).localeCompare(r(t))}visibleOptions(e){let t=e.options.filter(i=>!i.hidden),r=e._getHelpOption();if(r&&!r.hidden){let i=r.short&&e._findOption(r.short),s=r.long&&e._findOption(r.long);!i&&!s?t.push(r):r.long&&!s?t.push(e.createOption(r.long,r.description)):r.short&&!i&&t.push(e.createOption(r.short,r.description))}return this.sortOptions&&t.sort(this.compareOptions),t}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let t=[];for(let r=e.parent;r;r=r.parent){let i=r.options.filter(s=>!s.hidden);t.push(...i)}return this.sortOptions&&t.sort(this.compareOptions),t}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(t=>{t.description=t.description||e._argsDescription[t.name()]||""}),e.registeredArguments.find(t=>t.description)?e.registeredArguments:[]}subcommandTerm(e){let t=e.registeredArguments.map(r=>Yt(r)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(t?" "+t:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,t){return t.visibleCommands(e).reduce((r,i)=>Math.max(r,t.subcommandTerm(i).length),0)}longestOptionTermLength(e,t){return t.visibleOptions(e).reduce((r,i)=>Math.max(r,t.optionTerm(i).length),0)}longestGlobalOptionTermLength(e,t){return t.visibleGlobalOptions(e).reduce((r,i)=>Math.max(r,t.optionTerm(i).length),0)}longestArgumentTermLength(e,t){return t.visibleArguments(e).reduce((r,i)=>Math.max(r,t.argumentTerm(i).length),0)}commandUsage(e){let t=e._name;e._aliases[0]&&(t=t+"|"+e._aliases[0]);let r="";for(let i=e.parent;i;i=i.parent)r=i.name()+" "+r;return r+t+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let t=[];return e.argChoices&&t.push(`choices: ${e.argChoices.map(r=>JSON.stringify(r)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&t.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&t.push(`env: ${e.envVar}`),t.length>0?`${e.description} (${t.join(", ")})`:e.description}argumentDescription(e){let t=[];if(e.argChoices&&t.push(`choices: ${e.argChoices.map(r=>JSON.stringify(r)).join(", ")}`),e.defaultValue!==void 0&&t.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),t.length>0){let r=`(${t.join(", ")})`;return e.description?`${e.description} ${r}`:r}return e.description}formatHelp(e,t){let r=t.padWidth(e,t),i=t.helpWidth||80,s=2,o=2;function c(b,$){if($){let Y=`${b.padEnd(r+o)}${$}`;return t.wrap(Y,i-s,r+o)}return b}function a(b){return b.join(`
|
|
4
|
+
`).replace(/^/gm," ".repeat(s))}let l=[`Usage: ${t.commandUsage(e)}`,""],h=t.commandDescription(e);h.length>0&&(l=l.concat([t.wrap(h,i,0),""]));let f=t.visibleArguments(e).map(b=>c(t.argumentTerm(b),t.argumentDescription(b)));f.length>0&&(l=l.concat(["Arguments:",a(f),""]));let w=t.visibleOptions(e).map(b=>c(t.optionTerm(b),t.optionDescription(b)));if(w.length>0&&(l=l.concat(["Options:",a(w),""])),this.showGlobalOptions){let b=t.visibleGlobalOptions(e).map($=>c(t.optionTerm($),t.optionDescription($)));b.length>0&&(l=l.concat(["Global Options:",a(b),""]))}let S=t.visibleCommands(e).map(b=>c(t.subcommandTerm(b),t.subcommandDescription(b)));return S.length>0&&(l=l.concat(["Commands:",a(S),""])),l.join(`
|
|
5
5
|
`)}padWidth(e,t){return Math.max(t.longestOptionTermLength(e,t),t.longestGlobalOptionTermLength(e,t),t.longestSubcommandTermLength(e,t),t.longestArgumentTermLength(e,t))}wrap(e,t,r,i=40){let s=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",o=new RegExp(`[\\n][${s}]+`);if(e.match(o))return e;let c=t-r;if(c<i)return e;let a=e.slice(0,r),l=e.slice(r).replace(`\r
|
|
6
6
|
`,`
|
|
7
7
|
`),h=" ".repeat(r),w="\\s\u200B",S=new RegExp(`
|
|
8
|
-
|.{1,${c-1}}([${w}]|$)|[^${w}]+?([${w}]|$)`,"g"),b=l.match(S)||[];return a+b.map((
|
|
9
|
-
`?"":(
|
|
10
|
-
`)}}
|
|
8
|
+
|.{1,${c-1}}([${w}]|$)|[^${w}]+?([${w}]|$)`,"g"),b=l.match(S)||[];return a+b.map(($,Y)=>$===`
|
|
9
|
+
`?"":(Y>0?h:"")+$.trimEnd()).join(`
|
|
10
|
+
`)}};Ee.Help=te});var oe=P(se=>{"use strict";u();var{InvalidArgumentError:Xt}=H(),ne=class{constructor(e,t){this.flags=e,this.description=t||"",this.required=e.includes("<"),this.optional=e.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(e),this.mandatory=!1;let r=Zt(e);this.short=r.shortFlag,this.long=r.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith("--no-")),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(e,t){return this.defaultValue=e,this.defaultValueDescription=t,this}preset(e){return this.presetArg=e,this}conflicts(e){return this.conflictsWith=this.conflictsWith.concat(e),this}implies(e){let t=e;return typeof e=="string"&&(t={[e]:!0}),this.implied=Object.assign(this.implied||{},t),this}env(e){return this.envVar=e,this}argParser(e){return this.parseArg=e,this}makeOptionMandatory(e=!0){return this.mandatory=!!e,this}hideHelp(e=!0){return this.hidden=!!e,this}_concatValue(e,t){return t===this.defaultValue||!Array.isArray(t)?[e]:t.concat(e)}choices(e){return this.argChoices=e.slice(),this.parseArg=(t,r)=>{if(!this.argChoices.includes(t))throw new Xt(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(t,r):t},this}name(){return this.long?this.long.replace(/^--/,""):this.short.replace(/^-/,"")}attributeName(){return Qt(this.name().replace(/^no-/,""))}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},ie=class{constructor(e){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,e.forEach(t=>{t.negate?this.negativeOptions.set(t.attributeName(),t):this.positiveOptions.set(t.attributeName(),t)}),this.negativeOptions.forEach((t,r)=>{this.positiveOptions.has(r)&&this.dualOptions.add(r)})}valueFromOption(e,t){let r=t.attributeName();if(!this.dualOptions.has(r))return!0;let i=this.negativeOptions.get(r).presetArg,s=i!==void 0?i:!1;return t.negate===(s===e)}};function Qt(n){return n.split("-").reduce((e,t)=>e+t[0].toUpperCase()+t.slice(1))}function Zt(n){let e,t,r=n.split(/[ |,]+/);return r.length>1&&!/^[[<]/.test(r[1])&&(e=r.shift()),t=r.shift(),!e&&/^-[^-]$/.test(t)&&(e=t,t=void 0),{shortFlag:e,longFlag:t}}se.Option=ne;se.DualOptions=ie});var Pe=P(Se=>{"use strict";u();function er(n,e){if(Math.abs(n.length-e.length)>3)return Math.max(n.length,e.length);let t=[];for(let r=0;r<=n.length;r++)t[r]=[r];for(let r=0;r<=e.length;r++)t[0][r]=r;for(let r=1;r<=e.length;r++)for(let i=1;i<=n.length;i++){let s=1;n[i-1]===e[r-1]?s=0:s=1,t[i][r]=Math.min(t[i-1][r]+1,t[i][r-1]+1,t[i-1][r-1]+s),i>1&&r>1&&n[i-1]===e[r-2]&&n[i-2]===e[r-1]&&(t[i][r]=Math.min(t[i][r],t[i-2][r-2]+1))}return t[n.length][e.length]}function tr(n,e){if(!e||e.length===0)return"";e=Array.from(new Set(e));let t=n.startsWith("--");t&&(n=n.slice(2),e=e.map(o=>o.slice(2)));let r=[],i=3,s=.4;return e.forEach(o=>{if(o.length<=1)return;let c=er(n,o),a=Math.max(n.length,o.length);(a-c)/a>s&&(c<i?(i=c,r=[o]):c===i&&r.push(o))}),r.sort((o,c)=>o.localeCompare(c)),t&&(r=r.map(o=>`--${o}`)),r.length>1?`
|
|
11
11
|
(Did you mean one of ${r.join(", ")}?)`:r.length===1?`
|
|
12
|
-
(Did you mean ${r[0]}?)`:""}Se.suggestSimilar=
|
|
13
|
-
- specify the name in Command constructor or using .name()`);return t=t||{},t.isDefault&&(this._defaultCommandName=e._name),(t.noHelp||t.hidden)&&(e._hidden=!0),this._registerCommand(e),e.parent=this,e._checkForBrokenPassThrough(),this}createArgument(e,t){return new
|
|
14
|
-
Expecting one of '${r.join("', '")}'`);return this._lifeCycleHooks[e]?this._lifeCycleHooks[e].push(t):this._lifeCycleHooks[e]=[t],this}exitOverride(e){return e?this._exitCallback=e:this._exitCallback=t=>{if(t.code!=="commander.executeSubCommandAsync")throw t},this}_exit(e,t,r){this._exitCallback&&this._exitCallback(new
|
|
15
|
-
- already used by option '${t.flags}'`)}this.options.push(e)}_registerCommand(e){let t=i=>[i.name()].concat(i.aliases()),r=t(e).find(i=>this._findCommand(i));if(r){let i=t(this._findCommand(r)).join("|"),s=t(e).join("|");throw new Error(`cannot add command '${s}' as already have command '${i}'`)}this.commands.push(e)}addOption(e){this._registerOption(e);let t=e.name(),r=e.attributeName();if(e.negate){let s=e.long.replace(/^--no-/,"--");this._findOption(s)||this.setOptionValueWithSource(r,e.defaultValue===void 0?!0:e.defaultValue,"default")}else e.defaultValue!==void 0&&this.setOptionValueWithSource(r,e.defaultValue,"default");let i=(s,o,c)=>{s==null&&e.presetArg!==void 0&&(s=e.presetArg);let a=this.getOptionValue(r);s!==null&&e.parseArg?s=this._callParseArg(e,s,a,o):s!==null&&e.variadic&&(s=e._concatValue(s,a)),s==null&&(e.negate?s=!1:e.isBoolean()||e.optional?s=!0:s=""),this.setOptionValueWithSource(r,s,c)};return this.on("option:"+t,s=>{let o=`error: option '${e.flags}' argument '${s}' is invalid.`;i(s,o,"cli")}),e.envVar&&this.on("optionEnv:"+t,s=>{let o=`error: option '${e.flags}' value '${s}' from env '${e.envVar}' is invalid.`;i(s,o,"env")}),this}_optionEx(e,t,r,i,s){if(typeof t=="object"&&t instanceof
|
|
12
|
+
(Did you mean ${r[0]}?)`:""}Se.suggestSimilar=tr});var Ne=P(qe=>{"use strict";u();var rr=N("events").EventEmitter,ae=N("child_process"),A=N("path"),ce=N("fs"),g=N("process"),{Argument:nr,humanReadableArgName:ir}=M(),{CommanderError:ue}=H(),{Help:sr}=re(),{Option:ke,DualOptions:or}=oe(),{suggestSimilar:Re}=Pe(),le=class n extends rr{constructor(e){super(),this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=e||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:t=>g.stdout.write(t),writeErr:t=>g.stderr.write(t),getOutHelpWidth:()=>g.stdout.isTTY?g.stdout.columns:void 0,getErrHelpWidth:()=>g.stderr.isTTY?g.stderr.columns:void 0,outputError:(t,r)=>r(t)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(e){return this._outputConfiguration=e._outputConfiguration,this._helpOption=e._helpOption,this._helpCommand=e._helpCommand,this._helpConfiguration=e._helpConfiguration,this._exitCallback=e._exitCallback,this._storeOptionsAsProperties=e._storeOptionsAsProperties,this._combineFlagAndOptionalValue=e._combineFlagAndOptionalValue,this._allowExcessArguments=e._allowExcessArguments,this._enablePositionalOptions=e._enablePositionalOptions,this._showHelpAfterError=e._showHelpAfterError,this._showSuggestionAfterError=e._showSuggestionAfterError,this}_getCommandAndAncestors(){let e=[];for(let t=this;t;t=t.parent)e.push(t);return e}command(e,t,r){let i=t,s=r;typeof i=="object"&&i!==null&&(s=i,i=null),s=s||{};let[,o,c]=e.match(/([^ ]+) *(.*)/),a=this.createCommand(o);return i&&(a.description(i),a._executableHandler=!0),s.isDefault&&(this._defaultCommandName=a._name),a._hidden=!!(s.noHelp||s.hidden),a._executableFile=s.executableFile||null,c&&a.arguments(c),this._registerCommand(a),a.parent=this,a.copyInheritedSettings(this),i?this:a}createCommand(e){return new n(e)}createHelp(){return Object.assign(new sr,this.configureHelp())}configureHelp(e){return e===void 0?this._helpConfiguration:(this._helpConfiguration=e,this)}configureOutput(e){return e===void 0?this._outputConfiguration:(Object.assign(this._outputConfiguration,e),this)}showHelpAfterError(e=!0){return typeof e!="string"&&(e=!!e),this._showHelpAfterError=e,this}showSuggestionAfterError(e=!0){return this._showSuggestionAfterError=!!e,this}addCommand(e,t){if(!e._name)throw new Error(`Command passed to .addCommand() must have a name
|
|
13
|
+
- specify the name in Command constructor or using .name()`);return t=t||{},t.isDefault&&(this._defaultCommandName=e._name),(t.noHelp||t.hidden)&&(e._hidden=!0),this._registerCommand(e),e.parent=this,e._checkForBrokenPassThrough(),this}createArgument(e,t){return new nr(e,t)}argument(e,t,r,i){let s=this.createArgument(e,t);return typeof r=="function"?s.default(i).argParser(r):s.default(r),this.addArgument(s),this}arguments(e){return e.trim().split(/ +/).forEach(t=>{this.argument(t)}),this}addArgument(e){let t=this.registeredArguments.slice(-1)[0];if(t&&t.variadic)throw new Error(`only the last argument can be variadic '${t.name()}'`);if(e.required&&e.defaultValue!==void 0&&e.parseArg===void 0)throw new Error(`a default value for a required argument is never used: '${e.name()}'`);return this.registeredArguments.push(e),this}helpCommand(e,t){if(typeof e=="boolean")return this._addImplicitHelpCommand=e,this;e=e??"help [command]";let[,r,i]=e.match(/([^ ]+) *(.*)/),s=t??"display help for command",o=this.createCommand(r);return o.helpOption(!1),i&&o.arguments(i),s&&o.description(s),this._addImplicitHelpCommand=!0,this._helpCommand=o,this}addHelpCommand(e,t){return typeof e!="object"?(this.helpCommand(e,t),this):(this._addImplicitHelpCommand=!0,this._helpCommand=e,this)}_getHelpCommand(){return this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))?(this._helpCommand===void 0&&this.helpCommand(void 0,void 0),this._helpCommand):null}hook(e,t){let r=["preSubcommand","preAction","postAction"];if(!r.includes(e))throw new Error(`Unexpected value for event passed to hook : '${e}'.
|
|
14
|
+
Expecting one of '${r.join("', '")}'`);return this._lifeCycleHooks[e]?this._lifeCycleHooks[e].push(t):this._lifeCycleHooks[e]=[t],this}exitOverride(e){return e?this._exitCallback=e:this._exitCallback=t=>{if(t.code!=="commander.executeSubCommandAsync")throw t},this}_exit(e,t,r){this._exitCallback&&this._exitCallback(new ue(e,t,r)),g.exit(e)}action(e){let t=r=>{let i=this.registeredArguments.length,s=r.slice(0,i);return this._storeOptionsAsProperties?s[i]=this:s[i]=this.opts(),s.push(this),e.apply(this,s)};return this._actionHandler=t,this}createOption(e,t){return new ke(e,t)}_callParseArg(e,t,r,i){try{return e.parseArg(t,r)}catch(s){if(s.code==="commander.invalidArgument"){let o=`${i} ${s.message}`;this.error(o,{exitCode:s.exitCode,code:s.code})}throw s}}_registerOption(e){let t=e.short&&this._findOption(e.short)||e.long&&this._findOption(e.long);if(t){let r=e.long&&this._findOption(e.long)?e.long:e.short;throw new Error(`Cannot add option '${e.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${r}'
|
|
15
|
+
- already used by option '${t.flags}'`)}this.options.push(e)}_registerCommand(e){let t=i=>[i.name()].concat(i.aliases()),r=t(e).find(i=>this._findCommand(i));if(r){let i=t(this._findCommand(r)).join("|"),s=t(e).join("|");throw new Error(`cannot add command '${s}' as already have command '${i}'`)}this.commands.push(e)}addOption(e){this._registerOption(e);let t=e.name(),r=e.attributeName();if(e.negate){let s=e.long.replace(/^--no-/,"--");this._findOption(s)||this.setOptionValueWithSource(r,e.defaultValue===void 0?!0:e.defaultValue,"default")}else e.defaultValue!==void 0&&this.setOptionValueWithSource(r,e.defaultValue,"default");let i=(s,o,c)=>{s==null&&e.presetArg!==void 0&&(s=e.presetArg);let a=this.getOptionValue(r);s!==null&&e.parseArg?s=this._callParseArg(e,s,a,o):s!==null&&e.variadic&&(s=e._concatValue(s,a)),s==null&&(e.negate?s=!1:e.isBoolean()||e.optional?s=!0:s=""),this.setOptionValueWithSource(r,s,c)};return this.on("option:"+t,s=>{let o=`error: option '${e.flags}' argument '${s}' is invalid.`;i(s,o,"cli")}),e.envVar&&this.on("optionEnv:"+t,s=>{let o=`error: option '${e.flags}' value '${s}' from env '${e.envVar}' is invalid.`;i(s,o,"env")}),this}_optionEx(e,t,r,i,s){if(typeof t=="object"&&t instanceof ke)throw new Error("To add an Option object use addOption() instead of option() or requiredOption()");let o=this.createOption(t,r);if(o.makeOptionMandatory(!!e.mandatory),typeof i=="function")o.default(s).argParser(i);else if(i instanceof RegExp){let c=i;i=(a,l)=>{let h=c.exec(a);return h?h[0]:l},o.default(s).argParser(i)}else o.default(i);return this.addOption(o)}option(e,t,r,i){return this._optionEx({},e,t,r,i)}requiredOption(e,t,r,i){return this._optionEx({mandatory:!0},e,t,r,i)}combineFlagAndOptionalValue(e=!0){return this._combineFlagAndOptionalValue=!!e,this}allowUnknownOption(e=!0){return this._allowUnknownOption=!!e,this}allowExcessArguments(e=!0){return this._allowExcessArguments=!!e,this}enablePositionalOptions(e=!0){return this._enablePositionalOptions=!!e,this}passThroughOptions(e=!0){return this._passThroughOptions=!!e,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(e=!0){if(this.options.length)throw new Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw new Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!e,this}getOptionValue(e){return this._storeOptionsAsProperties?this[e]:this._optionValues[e]}setOptionValue(e,t){return this.setOptionValueWithSource(e,t,void 0)}setOptionValueWithSource(e,t,r){return this._storeOptionsAsProperties?this[e]=t:this._optionValues[e]=t,this._optionValueSources[e]=r,this}getOptionValueSource(e){return this._optionValueSources[e]}getOptionValueSourceWithGlobals(e){let t;return this._getCommandAndAncestors().forEach(r=>{r.getOptionValueSource(e)!==void 0&&(t=r.getOptionValueSource(e))}),t}_prepareUserArgs(e,t){if(e!==void 0&&!Array.isArray(e))throw new Error("first parameter to parse must be array or undefined");if(t=t||{},e===void 0&&t.from===void 0){g.versions?.electron&&(t.from="electron");let i=g.execArgv??[];(i.includes("-e")||i.includes("--eval")||i.includes("-p")||i.includes("--print"))&&(t.from="eval")}e===void 0&&(e=g.argv),this.rawArgs=e.slice();let r;switch(t.from){case void 0:case"node":this._scriptPath=e[1],r=e.slice(2);break;case"electron":g.defaultApp?(this._scriptPath=e[1],r=e.slice(2)):r=e.slice(1);break;case"user":r=e.slice(0);break;case"eval":r=e.slice(1);break;default:throw new Error(`unexpected parse option { from: '${t.from}' }`)}return!this._name&&this._scriptPath&&this.nameFromFilename(this._scriptPath),this._name=this._name||"program",r}parse(e,t){let r=this._prepareUserArgs(e,t);return this._parseCommand([],r),this}async parseAsync(e,t){let r=this._prepareUserArgs(e,t);return await this._parseCommand([],r),this}_executeSubCommand(e,t){t=t.slice();let r=!1,i=[".js",".ts",".tsx",".mjs",".cjs"];function s(h,f){let w=A.resolve(h,f);if(ce.existsSync(w))return w;if(i.includes(A.extname(f)))return;let S=i.find(b=>ce.existsSync(`${w}${b}`));if(S)return`${w}${S}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let o=e._executableFile||`${this._name}-${e._name}`,c=this._executableDir||"";if(this._scriptPath){let h;try{h=ce.realpathSync(this._scriptPath)}catch{h=this._scriptPath}c=A.resolve(A.dirname(h),c)}if(c){let h=s(c,o);if(!h&&!e._executableFile&&this._scriptPath){let f=A.basename(this._scriptPath,A.extname(this._scriptPath));f!==this._name&&(h=s(c,`${f}-${e._name}`))}o=h||o}r=i.includes(A.extname(o));let a;g.platform!=="win32"?r?(t.unshift(o),t=Te(g.execArgv).concat(t),a=ae.spawn(g.argv[0],t,{stdio:"inherit"})):a=ae.spawn(o,t,{stdio:"inherit"}):(t.unshift(o),t=Te(g.execArgv).concat(t),a=ae.spawn(g.execPath,t,{stdio:"inherit"})),a.killed||["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(f=>{g.on(f,()=>{a.killed===!1&&a.exitCode===null&&a.kill(f)})});let l=this._exitCallback;a.on("close",h=>{h=h??1,l?l(new ue(h,"commander.executeSubCommandAsync","(close)")):g.exit(h)}),a.on("error",h=>{if(h.code==="ENOENT"){let f=c?`searched for local subcommand relative to directory '${c}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",w=`'${o}' does not exist
|
|
16
16
|
- if '${e._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
|
|
17
17
|
- if the default executable name is not suitable, use the executableFile option to supply a custom name or path
|
|
18
|
-
- ${f}`;throw new Error(w)}else if(h.code==="EACCES")throw new Error(`'${o}' not executable`);if(!l)g.exit(1);else{let f=new
|
|
18
|
+
- ${f}`;throw new Error(w)}else if(h.code==="EACCES")throw new Error(`'${o}' not executable`);if(!l)g.exit(1);else{let f=new ue(1,"commander.executeSubCommandAsync","(error)");f.nestedError=h,l(f)}}),this.runningCommand=a}_dispatchSubcommand(e,t,r){let i=this._findCommand(e);i||this.help({error:!0});let s;return s=this._chainOrCallSubCommandHook(s,i,"preSubcommand"),s=this._chainOrCall(s,()=>{if(i._executableHandler)this._executeSubCommand(i,t.concat(r));else return i._parseCommand(t,r)}),s}_dispatchHelpCommand(e){e||this.help();let t=this._findCommand(e);return t&&!t._executableHandler&&t.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,t)=>{e.required&&this.args[t]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(r,i,s)=>{let o=i;if(i!==null&&r.parseArg){let c=`error: command-argument value '${i}' is invalid for argument '${r.name()}'.`;o=this._callParseArg(r,i,s,c)}return o};this._checkNumberOfArguments();let t=[];this.registeredArguments.forEach((r,i)=>{let s=r.defaultValue;r.variadic?i<this.args.length?(s=this.args.slice(i),r.parseArg&&(s=s.reduce((o,c)=>e(r,c,o),r.defaultValue))):s===void 0&&(s=[]):i<this.args.length&&(s=this.args[i],r.parseArg&&(s=e(r,s,r.defaultValue))),t[i]=s}),this.processedArgs=t}_chainOrCall(e,t){return e&&e.then&&typeof e.then=="function"?e.then(()=>t()):t()}_chainOrCallHooks(e,t){let r=e,i=[];return this._getCommandAndAncestors().reverse().filter(s=>s._lifeCycleHooks[t]!==void 0).forEach(s=>{s._lifeCycleHooks[t].forEach(o=>{i.push({hookedCommand:s,callback:o})})}),t==="postAction"&&i.reverse(),i.forEach(s=>{r=this._chainOrCall(r,()=>s.callback(s.hookedCommand,this))}),r}_chainOrCallSubCommandHook(e,t,r){let i=e;return this._lifeCycleHooks[r]!==void 0&&this._lifeCycleHooks[r].forEach(s=>{i=this._chainOrCall(i,()=>s(this,t))}),i}_parseCommand(e,t){let r=this.parseOptions(t);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(r.operands),t=r.unknown,this.args=e.concat(t),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),t);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(t),this._dispatchSubcommand(this._defaultCommandName,e,t);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(r.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let i=()=>{r.unknown.length>0&&this.unknownOption(r.unknown[0])},s=`command:${this.name()}`;if(this._actionHandler){i(),this._processArguments();let o;return o=this._chainOrCallHooks(o,"preAction"),o=this._chainOrCall(o,()=>this._actionHandler(this.processedArgs)),this.parent&&(o=this._chainOrCall(o,()=>{this.parent.emit(s,e,t)})),o=this._chainOrCallHooks(o,"postAction"),o}if(this.parent&&this.parent.listenerCount(s))i(),this._processArguments(),this.parent.emit(s,e,t);else if(e.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",e,t);this.listenerCount("command:*")?this.emit("command:*",e,t):this.commands.length?this.unknownCommand():(i(),this._processArguments())}else this.commands.length?(i(),this.help({error:!0})):(i(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(t=>t._name===e||t._aliases.includes(e))}_findOption(e){return this.options.find(t=>t.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(t=>{t.mandatory&&e.getOptionValue(t.attributeName())===void 0&&e.missingMandatoryOptionValue(t)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(r=>{let i=r.attributeName();return this.getOptionValue(i)===void 0?!1:this.getOptionValueSource(i)!=="default"});e.filter(r=>r.conflictsWith.length>0).forEach(r=>{let i=e.find(s=>r.conflictsWith.includes(s.attributeName()));i&&this._conflictingOption(r,i)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let t=[],r=[],i=t,s=e.slice();function o(a){return a.length>1&&a[0]==="-"}let c=null;for(;s.length;){let a=s.shift();if(a==="--"){i===r&&i.push(a),i.push(...s);break}if(c&&!o(a)){this.emit(`option:${c.name()}`,a);continue}if(c=null,o(a)){let l=this._findOption(a);if(l){if(l.required){let h=s.shift();h===void 0&&this.optionMissingArgument(l),this.emit(`option:${l.name()}`,h)}else if(l.optional){let h=null;s.length>0&&!o(s[0])&&(h=s.shift()),this.emit(`option:${l.name()}`,h)}else this.emit(`option:${l.name()}`);c=l.variadic?l:null;continue}}if(a.length>2&&a[0]==="-"&&a[1]!=="-"){let l=this._findOption(`-${a[1]}`);if(l){l.required||l.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${l.name()}`,a.slice(2)):(this.emit(`option:${l.name()}`),s.unshift(`-${a.slice(2)}`));continue}}if(/^--[^=]+=/.test(a)){let l=a.indexOf("="),h=this._findOption(a.slice(0,l));if(h&&(h.required||h.optional)){this.emit(`option:${h.name()}`,a.slice(l+1));continue}}if(o(a)&&(i=r),(this._enablePositionalOptions||this._passThroughOptions)&&t.length===0&&r.length===0){if(this._findCommand(a)){t.push(a),s.length>0&&r.push(...s);break}else if(this._getHelpCommand()&&a===this._getHelpCommand().name()){t.push(a),s.length>0&&t.push(...s);break}else if(this._defaultCommandName){r.push(a),s.length>0&&r.push(...s);break}}if(this._passThroughOptions){i.push(a),s.length>0&&i.push(...s);break}i.push(a)}return{operands:t,unknown:r}}opts(){if(this._storeOptionsAsProperties){let e={},t=this.options.length;for(let r=0;r<t;r++){let i=this.options[r].attributeName();e[i]=i===this._versionOptionName?this._version:this[i]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,t)=>Object.assign(e,t.opts()),{})}error(e,t){this._outputConfiguration.outputError(`${e}
|
|
19
19
|
`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError=="string"?this._outputConfiguration.writeErr(`${this._showHelpAfterError}
|
|
20
20
|
`):this._showHelpAfterError&&(this._outputConfiguration.writeErr(`
|
|
21
|
-
`),this.outputHelp({error:!0}));let r=t||{},i=r.exitCode||1,s=r.code||"commander.error";this._exit(i,s,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in g.env){let t=e.attributeName();(this.getOptionValue(t)===void 0||["default","config","env"].includes(this.getOptionValueSource(t)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,g.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new
|
|
22
|
-
`),this._exit(0,"commander.version",e)}),this}description(e,t){return e===void 0&&t===void 0?this._description:(this._description=e,t&&(this._argsDescription=t),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(t=this.commands[this.commands.length-1]),e===t._name)throw new Error("Command alias can't be the same as its name");let r=this.parent?._findCommand(e);if(r){let i=[r.name()].concat(r.aliases()).join("|");throw new Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${i}'`)}return t._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(t=>this.alias(t)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let t=this.registeredArguments.map(r=>
|
|
21
|
+
`),this.outputHelp({error:!0}));let r=t||{},i=r.exitCode||1,s=r.code||"commander.error";this._exit(i,s,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in g.env){let t=e.attributeName();(this.getOptionValue(t)===void 0||["default","config","env"].includes(this.getOptionValueSource(t)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,g.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new or(this.options),t=r=>this.getOptionValue(r)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(r));this.options.filter(r=>r.implied!==void 0&&t(r.attributeName())&&e.valueFromOption(this.getOptionValue(r.attributeName()),r)).forEach(r=>{Object.keys(r.implied).filter(i=>!t(i)).forEach(i=>{this.setOptionValueWithSource(i,r.implied[i],"implied")})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:"commander.missingArgument"})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,t){let r=o=>{let c=o.attributeName(),a=this.getOptionValue(c),l=this.options.find(f=>f.negate&&c===f.attributeName()),h=this.options.find(f=>!f.negate&&c===f.attributeName());return l&&(l.presetArg===void 0&&a===!1||l.presetArg!==void 0&&a===l.presetArg)?l:h||o},i=o=>{let c=r(o),a=c.attributeName();return this.getOptionValueSource(a)==="env"?`environment variable '${c.envVar}'`:`option '${c.flags}'`},s=`error: ${i(e)} cannot be used with ${i(t)}`;this.error(s,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let t="";if(e.startsWith("--")&&this._showSuggestionAfterError){let i=[],s=this;do{let o=s.createHelp().visibleOptions(s).filter(c=>c.long).map(c=>c.long);i=i.concat(o),s=s.parent}while(s&&!s._enablePositionalOptions);t=Re(e,i)}let r=`error: unknown option '${e}'${t}`;this.error(r,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,r=t===1?"":"s",s=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${t} argument${r} but got ${e.length}.`;this.error(s,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],t="";if(this._showSuggestionAfterError){let i=[];this.createHelp().visibleCommands(this).forEach(s=>{i.push(s.name()),s.alias()&&i.push(s.alias())}),t=Re(e,i)}let r=`error: unknown command '${e}'${t}`;this.error(r,{code:"commander.unknownCommand"})}version(e,t,r){if(e===void 0)return this._version;this._version=e,t=t||"-V, --version",r=r||"output the version number";let i=this.createOption(t,r);return this._versionOptionName=i.attributeName(),this._registerOption(i),this.on("option:"+i.name(),()=>{this._outputConfiguration.writeOut(`${e}
|
|
22
|
+
`),this._exit(0,"commander.version",e)}),this}description(e,t){return e===void 0&&t===void 0?this._description:(this._description=e,t&&(this._argsDescription=t),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(t=this.commands[this.commands.length-1]),e===t._name)throw new Error("Command alias can't be the same as its name");let r=this.parent?._findCommand(e);if(r){let i=[r.name()].concat(r.aliases()).join("|");throw new Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${i}'`)}return t._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(t=>this.alias(t)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let t=this.registeredArguments.map(r=>ir(r));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?t:[]).join(" ")}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}nameFromFilename(e){return this._name=A.basename(e,A.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let t=this.createHelp();return t.helpWidth===void 0&&(t.helpWidth=e&&e.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth()),t.formatHelp(this,t)}_getHelpContext(e){e=e||{};let t={error:!!e.error},r;return t.error?r=i=>this._outputConfiguration.writeErr(i):r=i=>this._outputConfiguration.writeOut(i),t.write=e.write||r,t.command=this,t}outputHelp(e){let t;typeof e=="function"&&(t=e,e=void 0);let r=this._getHelpContext(e);this._getCommandAndAncestors().reverse().forEach(s=>s.emit("beforeAllHelp",r)),this.emit("beforeHelp",r);let i=this.helpInformation(r);if(t&&(i=t(i),typeof i!="string"&&!Buffer.isBuffer(i)))throw new Error("outputHelp callback must return a string or a Buffer");r.write(i),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",r),this._getCommandAndAncestors().forEach(s=>s.emit("afterAllHelp",r))}helpOption(e,t){return typeof e=="boolean"?(e?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(e=e??"-h, --help",t=t??"display help for command",this._helpOption=this.createOption(e,t),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this}help(e){this.outputHelp(e);let t=g.exitCode||0;t===0&&e&&typeof e!="function"&&e.error&&(t=1),this._exit(t,"commander.help","(outputHelp)")}addHelpText(e,t){let r=["beforeAll","before","after","afterAll"];if(!r.includes(e))throw new Error(`Unexpected value for position to addHelpText.
|
|
23
23
|
Expecting one of '${r.join("', '")}'`);let i=`${e}Help`;return this.on(i,s=>{let o;typeof t=="function"?o=t({error:s.error,command:s.command}):o=t,o&&s.write(`${o}
|
|
24
|
-
`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(i=>t.is(i))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function Re(n){return n.map(e=>{if(!e.startsWith("--inspect"))return e;let t,r="127.0.0.1",i="9229",s;return(s=e.match(/^(--inspect(-brk)?)$/))!==null?t=s[1]:(s=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(t=s[1],/^\d+$/.test(s[3])?i=s[3]:r=s[3]):(s=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=s[1],r=s[3],i=s[4]),t&&i!=="0"?`${t}=${r}:${parseInt(i)+1}`:e})}He.Command=ue});var De=k(O=>{"use strict";u();var{Argument:Ne}=M(),{Command:le}=qe(),{CommanderError:nr,InvalidArgumentError:Ve}=N(),{Help:ir}=te(),{Option:Ie}=se();O.program=new le;O.createCommand=n=>new le(n);O.createOption=(n,e)=>new Ie(n,e);O.createArgument=(n,e)=>new Ne(n,e);O.Command=le;O.Option=Ie;O.Argument=Ne;O.Help=ir;O.CommanderError=nr;O.InvalidArgumentError=Ve;O.InvalidOptionArgumentError=Ve});u();u();var Fe=Ut(De(),1),{program:y,createCommand:nn,createArgument:sn,createOption:on,CommanderError:an,InvalidArgumentError:cn,InvalidOptionArgumentError:un,Command:ln,Argument:hn,Option:dn,Help:mn}=Fe.default;u();import{existsSync as Or}from"fs";u();u();u();u();var _=class extends Error{response;request;options;constructor(e,t,r){let i=e.status||e.status===0?e.status:"",s=e.statusText??"",o=`${i} ${s}`.trim(),c=o?`status code ${o}`:"an unknown error";super(`Request failed with ${c}: ${t.method} ${t.url}`),this.name="HTTPError",this.response=e,this.request=t,this.options=r}};u();var R=class extends Error{name="NonError";value;constructor(e){let t="Non-error value was thrown";try{typeof e=="string"?t=e:e&&typeof e=="object"&&"message"in e&&typeof e.message=="string"&&(t=e.message)}catch{}super(t),this.value=e}};u();var H=class extends Error{name="ForceRetryError";customDelay;code;customRequest;constructor(e){let t=e?.cause?e.cause instanceof Error?e.cause:new R(e.cause):void 0;super(e?.code?`Forced retry: ${e.code}`:"Forced retry",t?{cause:t}:void 0),this.customDelay=e?.delay,this.code=e?.code,this.customRequest=e?.request}};u();u();var he=(()=>{let n=!1,e=!1,t=typeof globalThis.ReadableStream=="function",r=typeof globalThis.Request=="function";if(t&&r)try{e=new globalThis.Request("https://empty.invalid",{body:new globalThis.ReadableStream,method:"POST",get duplex(){return n=!0,"half"}}).headers.has("Content-Type")}catch(i){if(i instanceof Error&&i.message==="unsupported BodyInit type")return!1;throw i}return n&&!e})(),Le=typeof globalThis.AbortController=="function",U=typeof globalThis.AbortSignal=="function"&&typeof globalThis.AbortSignal.any=="function",Me=typeof globalThis.ReadableStream=="function",Ue=typeof globalThis.FormData=="function",B=["get","post","put","patch","head","delete"],sr=()=>{};sr();var Be={json:"application/json",text:"text/*",formData:"multipart/form-data",arrayBuffer:"*/*",blob:"*/*",bytes:"*/*"},W=2147483647,We=new TextEncoder().encode("------WebKitFormBoundaryaxpyiPgbbPti10Rw").length,J=Symbol("stop"),V=class{options;constructor(e){this.options=e}},Je=n=>new V(n),ze={json:!0,parseJson:!0,stringifyJson:!0,searchParams:!0,prefixUrl:!0,retry:!0,timeout:!0,hooks:!0,throwHttpErrors:!0,onDownloadProgress:!0,onUploadProgress:!0,fetch:!0,context:!0},Ge={next:!0},Ke={method:!0,headers:!0,body:!0,mode:!0,credentials:!0,cache:!0,redirect:!0,referrer:!0,referrerPolicy:!0,integrity:!0,keepalive:!0,signal:!0,window:!0,duplex:!0};var or=n=>{if(!n)return 0;if(n instanceof FormData){let e=0;for(let[t,r]of n)e+=We,e+=new TextEncoder().encode(`Content-Disposition: form-data; name="${t}"`).length,e+=typeof r=="string"?new TextEncoder().encode(r).length:r.size;return e}if(n instanceof Blob)return n.size;if(n instanceof ArrayBuffer)return n.byteLength;if(typeof n=="string")return new TextEncoder().encode(n).length;if(n instanceof URLSearchParams)return new TextEncoder().encode(n.toString()).length;if("byteLength"in n)return n.byteLength;if(typeof n=="object"&&n!==null)try{let e=JSON.stringify(n);return new TextEncoder().encode(e).length}catch{return 0}return 0},Ye=(n,e,t)=>{let r,i=0;return n.pipeThrough(new TransformStream({transform(s,o){if(o.enqueue(s),r){i+=r.byteLength;let c=e===0?0:i/e;c>=1&&(c=1-Number.EPSILON),t?.({percent:c,totalBytes:Math.max(e,i),transferredBytes:i},r)}r=s},flush(){r&&(i+=r.byteLength,t?.({percent:1,totalBytes:Math.max(e,i),transferredBytes:i},r))}}))},Xe=(n,e)=>{if(!n.body)return n;if(n.status===204)return new Response(null,{status:n.status,statusText:n.statusText,headers:n.headers});let t=Math.max(0,Number(n.headers.get("content-length"))||0);return new Response(Ye(n.body,t,e),{status:n.status,statusText:n.statusText,headers:n.headers})},Qe=(n,e,t)=>{if(!n.body)return n;let r=or(t??n.body);return new Request(n,{duplex:"half",body:Ye(n.body,r,e)})};u();u();var $=n=>n!==null&&typeof n=="object";var I=(...n)=>{for(let e of n)if((!$(e)||Array.isArray(e))&&e!==void 0)throw new TypeError("The `options` argument must be an object");return pe({},...n)},de=(n={},e={})=>{let t=new globalThis.Headers(n),r=e instanceof globalThis.Headers,i=new globalThis.Headers(e);for(let[s,o]of i.entries())r&&o==="undefined"||o===void 0?t.delete(s):t.set(s,o);return t};function z(n,e,t){return Object.hasOwn(e,t)&&e[t]===void 0?[]:pe(n[t]??[],e[t]??[])}var me=(n={},e={})=>({beforeRequest:z(n,e,"beforeRequest"),beforeRetry:z(n,e,"beforeRetry"),afterResponse:z(n,e,"afterResponse"),beforeError:z(n,e,"beforeError")}),ar=(n,e)=>{let t=new URLSearchParams;for(let r of[n,e])if(r!==void 0)if(r instanceof URLSearchParams)for(let[i,s]of r.entries())t.append(i,s);else if(Array.isArray(r))for(let i of r){if(!Array.isArray(i)||i.length!==2)throw new TypeError("Array search parameters must be provided in [[key, value], ...] format");t.append(String(i[0]),String(i[1]))}else if($(r))for(let[i,s]of Object.entries(r))s!==void 0&&t.append(i,String(s));else{let i=new URLSearchParams(r);for(let[s,o]of i.entries())t.append(s,o)}return t},pe=(...n)=>{let e={},t={},r={},i,s=[];for(let o of n)if(Array.isArray(o))Array.isArray(e)||(e=[]),e=[...e,...o];else if($(o)){for(let[c,a]of Object.entries(o)){if(c==="signal"&&a instanceof globalThis.AbortSignal){s.push(a);continue}if(c==="context"){if(a!=null&&(!$(a)||Array.isArray(a)))throw new TypeError("The `context` option must be an object");e={...e,context:a==null?{}:{...e.context,...a}};continue}if(c==="searchParams"){a==null?i=void 0:i=i===void 0?a:ar(i,a);continue}$(a)&&c in e&&(a=pe(e[c],a)),e={...e,[c]:a}}$(o.hooks)&&(r=me(r,o.hooks),e.hooks=r),$(o.headers)&&(t=de(t,o.headers),e.headers=t)}return i!==void 0&&(e.searchParams=i),s.length>0&&(s.length===1?e.signal=s[0]:U?e.signal=AbortSignal.any(s):e.signal=s.at(-1)),e};u();var et=n=>B.includes(n)?n.toUpperCase():n,cr=["get","put","head","delete","options","trace"],ur=[408,413,429,500,502,503,504],lr=[413,429,503],Ze={limit:2,methods:cr,statusCodes:ur,afterStatusCodes:lr,maxRetryAfter:Number.POSITIVE_INFINITY,backoffLimit:Number.POSITIVE_INFINITY,delay:n=>.3*2**(n-1)*1e3,jitter:void 0,retryOnTimeout:!1},tt=(n={})=>{if(typeof n=="number")return{...Ze,limit:n};if(n.methods&&!Array.isArray(n.methods))throw new Error("retry.methods must be an array");if(n.methods&&=n.methods.map(t=>t.toLowerCase()),n.statusCodes&&!Array.isArray(n.statusCodes))throw new Error("retry.statusCodes must be an array");let e=Object.fromEntries(Object.entries(n).filter(([,t])=>t!==void 0));return{...Ze,...e}};u();u();var P=class extends Error{request;constructor(e){super(`Request timed out: ${e.method} ${e.url}`),this.name="TimeoutError",this.request=e}};async function fe(n,e,t,r){return new Promise((i,s)=>{let o=setTimeout(()=>{t&&t.abort(),s(new P(n))},r.timeout);r.fetch(n,e).then(i).catch(s).then(()=>{clearTimeout(o)})})}u();async function ge(n,{signal:e}){return new Promise((t,r)=>{e&&(e.throwIfAborted(),e.addEventListener("abort",i,{once:!0}));function i(){clearTimeout(s),r(e.reason)}let s=setTimeout(()=>{e?.removeEventListener("abort",i),t()},n)})}u();var rt=(n,e)=>{let t={};for(let r in e)Object.hasOwn(e,r)&&!(r in Ke)&&!(r in ze)&&(!(r in n)||r in Ge)&&(t[r]=e[r]);return t},nt=n=>n===void 0?!1:Array.isArray(n)?n.length>0:n instanceof URLSearchParams?n.size>0:typeof n=="object"?Object.keys(n).length>0:typeof n=="string"?n.trim().length>0:!!n;u();function it(n){return n instanceof _||n?.name===_.name}function st(n){return n instanceof P||n?.name===P.name}var D=class n{static create(e,t){let r=new n(e,t),i=async()=>{if(typeof r.#e.timeout=="number"&&r.#e.timeout>W)throw new RangeError(`The \`timeout\` option cannot be greater than ${W}`);await Promise.resolve();let o=await r.#b();for(let c of r.#e.hooks.afterResponse){let a=r.#d(o.clone()),l;try{l=await c(r.request,r.#c(),a,{retryCount:r.#r})}catch(f){throw r.#s(a),r.#s(o),f}if(l instanceof V)throw r.#s(a),r.#s(o),new H(l.options);let h=l instanceof globalThis.Response?l:o;a!==h&&r.#s(a),o!==h&&r.#s(o),o=h}if(r.#d(o),!o.ok&&(typeof r.#e.throwHttpErrors=="function"?r.#e.throwHttpErrors(o.status):r.#e.throwHttpErrors)){let c=new _(o,r.request,r.#c());for(let a of r.#e.hooks.beforeError)c=await a(c,{retryCount:r.#r});throw c}if(r.#e.onDownloadProgress){if(typeof r.#e.onDownloadProgress!="function")throw new TypeError("The `onDownloadProgress` option must be a function");if(!Me)throw new Error("Streams are not supported in your environment. `ReadableStream` is missing.");let c=o.clone();return r.#s(o),Xe(c,r.#e.onDownloadProgress)}return o},s=r.#m(i).finally(()=>{let o=r.#o;r.#l(o?.body??void 0),r.#l(r.request.body??void 0)});for(let[o,c]of Object.entries(Be))o==="bytes"&&typeof globalThis.Response?.prototype?.bytes!="function"||(s[o]=async()=>{r.request.headers.set("accept",r.request.headers.get("accept")||c);let a=await s;if(o==="json"){if(a.status===204)return"";let l=await a.text();return l===""?"":t.parseJson?t.parseJson(l):JSON.parse(l)}return a[o]()});return s}static#f(e){return e&&typeof e=="object"&&!Array.isArray(e)&&!(e instanceof URLSearchParams)?Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0)):e}request;#n;#r=0;#t;#e;#o;#i;#a;constructor(e,t={}){if(this.#t=e,this.#e={...t,headers:de(this.#t.headers,t.headers),hooks:me({beforeRequest:[],beforeRetry:[],beforeError:[],afterResponse:[]},t.hooks),method:et(t.method??this.#t.method??"GET"),prefixUrl:String(t.prefixUrl||""),retry:tt(t.retry),throwHttpErrors:t.throwHttpErrors??!0,timeout:t.timeout??1e4,fetch:t.fetch??globalThis.fetch.bind(globalThis),context:t.context??{}},typeof this.#t!="string"&&!(this.#t instanceof URL||this.#t instanceof globalThis.Request))throw new TypeError("`input` must be a string, URL, or Request");if(this.#e.prefixUrl&&typeof this.#t=="string"){if(this.#t.startsWith("/"))throw new Error("`input` must not begin with a slash when using `prefixUrl`");this.#e.prefixUrl.endsWith("/")||(this.#e.prefixUrl+="/"),this.#t=this.#e.prefixUrl+this.#t}Le&&U&&(this.#i=this.#e.signal??this.#t.signal,this.#n=new globalThis.AbortController,this.#e.signal=this.#i?AbortSignal.any([this.#i,this.#n.signal]):this.#n.signal),he&&(this.#e.duplex="half"),this.#e.json!==void 0&&(this.#e.body=this.#e.stringifyJson?.(this.#e.json)??JSON.stringify(this.#e.json),this.#e.headers.set("content-type",this.#e.headers.get("content-type")??"application/json"));let r=t.headers&&new globalThis.Headers(t.headers).has("content-type");if(this.#t instanceof globalThis.Request&&(Ue&&this.#e.body instanceof globalThis.FormData||this.#e.body instanceof URLSearchParams)&&!r&&this.#e.headers.delete("content-type"),this.request=new globalThis.Request(this.#t,this.#e),nt(this.#e.searchParams)){let s="?"+(typeof this.#e.searchParams=="string"?this.#e.searchParams.replace(/^\?/,""):new URLSearchParams(n.#f(this.#e.searchParams)).toString()),o=this.request.url.replace(/(?:\?.*?)?(?=#|$)/,s);this.request=new globalThis.Request(o,this.#e)}if(this.#e.onUploadProgress){if(typeof this.#e.onUploadProgress!="function")throw new TypeError("The `onUploadProgress` option must be a function");if(!he)throw new Error("Request streams are not supported in your environment. The `duplex` option for `Request` is not available.");this.request=this.#p(this.request,this.#e.body??void 0)}}#u(){let e=this.#e.retry.delay(this.#r),t=e;this.#e.retry.jitter===!0?t=Math.random()*e:typeof this.#e.retry.jitter=="function"&&(t=this.#e.retry.jitter(e),(!Number.isFinite(t)||t<0)&&(t=e));let r=this.#e.retry.backoffLimit??Number.POSITIVE_INFINITY;return Math.min(r,t)}async#g(e){if(this.#r++,this.#r>this.#e.retry.limit)throw e;let t=e instanceof Error?e:new R(e);if(t instanceof H)return t.customDelay??this.#u();if(!this.#e.retry.methods.includes(this.request.method.toLowerCase()))throw e;if(this.#e.retry.shouldRetry!==void 0){let r=await this.#e.retry.shouldRetry({error:t,retryCount:this.#r});if(r===!1)throw e;if(r===!0)return this.#u()}if(st(e)&&!this.#e.retry.retryOnTimeout)throw e;if(it(e)){if(!this.#e.retry.statusCodes.includes(e.response.status))throw e;let r=e.response.headers.get("Retry-After")??e.response.headers.get("RateLimit-Reset")??e.response.headers.get("X-RateLimit-Retry-After")??e.response.headers.get("X-RateLimit-Reset")??e.response.headers.get("X-Rate-Limit-Reset");if(r&&this.#e.retry.afterStatusCodes.includes(e.response.status)){let i=Number(r)*1e3;Number.isNaN(i)?i=Date.parse(r)-Date.now():i>=Date.parse("2024-01-01")&&(i-=Date.now());let s=this.#e.retry.maxRetryAfter??i;return i<s?i:s}if(e.response.status===413)throw e}return this.#u()}#d(e){return this.#e.parseJson&&(e.json=async()=>this.#e.parseJson(await e.text())),e}#l(e){e&&e.cancel().catch(()=>{})}#s(e){this.#l(e.body??void 0)}async#m(e){try{return await e()}catch(t){let r=Math.min(await this.#g(t),W);if(this.#r<1)throw t;if(await ge(r,this.#i?{signal:this.#i}:{}),t instanceof H&&t.customRequest){let i=this.#e.signal?new globalThis.Request(t.customRequest,{signal:this.#e.signal}):new globalThis.Request(t.customRequest);this.#h(i)}for(let i of this.#e.hooks.beforeRetry){let s=await i({request:this.request,options:this.#c(),error:t,retryCount:this.#r});if(s instanceof globalThis.Request){this.#h(s);break}if(s instanceof globalThis.Response)return s;if(s===J)return}return this.#m(e)}}async#b(){this.#n?.signal.aborted&&(this.#n=new globalThis.AbortController,this.#e.signal=this.#i?AbortSignal.any([this.#i,this.#n.signal]):this.#n.signal,this.request=new globalThis.Request(this.request,{signal:this.#e.signal}));for(let t of this.#e.hooks.beforeRequest){let r=await t(this.request,this.#c(),{retryCount:this.#r});if(r instanceof Response)return r;if(r instanceof globalThis.Request){this.#h(r);break}}let e=rt(this.request,this.#e);return this.#o=this.request,this.request=this.#o.clone(),this.#e.timeout===!1?this.#e.fetch(this.#o,e):fe(this.#o,e,this.#n,this.#e)}#c(){if(!this.#a){let{hooks:e,...t}=this.#e;this.#a=Object.freeze(t)}return this.#a}#h(e){this.#a=void 0,this.request=this.#p(e)}#p(e,t){return!this.#e.onUploadProgress||!e.body?e:Qe(e,this.#e.onUploadProgress,t??this.#e.body??void 0)}};var be=n=>{let e=(t,r)=>D.create(t,I(n,r));for(let t of B)e[t]=(r,i)=>D.create(r,I(n,i,{method:t}));return e.create=t=>be(I(t)),e.extend=t=>(typeof t=="function"&&(t=t(n??{})),be(I(n,t))),e.stop=J,e.retry=Je,e},hr=be(),F=hr;var dr="https://pro.lahat.group/api";function ye(){return process.env.WARDROBE_API_URL??dr}function C(n){if(!n)throw new Error("Not authenticated. Run `wardrobe login` first.");return F.create({prefixUrl:ye(),headers:{Authorization:`Bearer ${n}`},retry:0})}u();import{readFileSync as mr,writeFileSync as pr,mkdirSync as fr,rmSync as gr,existsSync as br}from"fs";import{homedir as yr}from"os";import{join as ot}from"path";function at(){return process.env.WARDROBE_CONFIG_DIR??ot(yr(),".config","wardrobe")}function we(){return ot(at(),"config.json")}function x(){let n=we();if(!br(n))return null;try{return JSON.parse(mr(n,"utf8"))}catch{return null}}function ct(n){fr(at(),{recursive:!0,mode:448}),pr(we(),JSON.stringify(n,null,2),{mode:384})}function ut(){gr(we(),{force:!0})}u();import{readFileSync as wr}from"fs";function _r(){return new Promise((n,e)=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>t+=r),process.stdin.on("end",()=>n(t)),process.stdin.on("error",e)})}async function A(n){let e=n==="-"?await _r():wr(n,"utf8");try{return JSON.parse(e)}catch(t){throw new Error(`Failed to parse JSON input: ${t.message}`)}}function p(n,e,t){e?process.stdout.write(JSON.stringify(n,null,2)+`
|
|
25
|
-
`):t()}function
|
|
26
|
-
`)}async function ht(n,e={}){let t=await
|
|
24
|
+
`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(i=>t.is(i))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function Te(n){return n.map(e=>{if(!e.startsWith("--inspect"))return e;let t,r="127.0.0.1",i="9229",s;return(s=e.match(/^(--inspect(-brk)?)$/))!==null?t=s[1]:(s=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(t=s[1],/^\d+$/.test(s[3])?i=s[3]:r=s[3]):(s=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=s[1],r=s[3],i=s[4]),t&&i!=="0"?`${t}=${r}:${parseInt(i)+1}`:e})}qe.Command=le});var De=P(O=>{"use strict";u();var{Argument:He}=M(),{Command:he}=Ne(),{CommanderError:ar,InvalidArgumentError:Ie}=H(),{Help:cr}=re(),{Option:Ve}=oe();O.program=new he;O.createCommand=n=>new he(n);O.createOption=(n,e)=>new Ve(n,e);O.createArgument=(n,e)=>new He(n,e);O.Command=he;O.Option=Ve;O.Argument=He;O.Help=cr;O.CommanderError=ar;O.InvalidArgumentError=Ie;O.InvalidOptionArgumentError=Ie});u();u();var Fe=zt(De(),1),{program:y,createCommand:un,createArgument:ln,createOption:hn,CommanderError:dn,InvalidArgumentError:mn,InvalidOptionArgumentError:pn,Command:fn,Argument:gn,Option:bn,Help:yn}=Fe.default;u();import{existsSync as Ar}from"fs";u();u();u();u();var _=class extends Error{response;request;options;constructor(e,t,r){let i=e.status||e.status===0?e.status:"",s=e.statusText??"",o=`${i} ${s}`.trim(),c=o?`status code ${o}`:"an unknown error";super(`Request failed with ${c}: ${t.method} ${t.url}`),this.name="HTTPError",this.response=e,this.request=t,this.options=r}};u();var T=class extends Error{name="NonError";value;constructor(e){let t="Non-error value was thrown";try{typeof e=="string"?t=e:e&&typeof e=="object"&&"message"in e&&typeof e.message=="string"&&(t=e.message)}catch{}super(t),this.value=e}};u();var q=class extends Error{name="ForceRetryError";customDelay;code;customRequest;constructor(e){let t=e?.cause?e.cause instanceof Error?e.cause:new T(e.cause):void 0;super(e?.code?`Forced retry: ${e.code}`:"Forced retry",t?{cause:t}:void 0),this.customDelay=e?.delay,this.code=e?.code,this.customRequest=e?.request}};u();u();var de=(()=>{let n=!1,e=!1,t=typeof globalThis.ReadableStream=="function",r=typeof globalThis.Request=="function";if(t&&r)try{e=new globalThis.Request("https://empty.invalid",{body:new globalThis.ReadableStream,method:"POST",get duplex(){return n=!0,"half"}}).headers.has("Content-Type")}catch(i){if(i instanceof Error&&i.message==="unsupported BodyInit type")return!1;throw i}return n&&!e})(),Le=typeof globalThis.AbortController=="function",B=typeof globalThis.AbortSignal=="function"&&typeof globalThis.AbortSignal.any=="function",Ue=typeof globalThis.ReadableStream=="function",Me=typeof globalThis.FormData=="function",W=["get","post","put","patch","head","delete"],ur=()=>{};ur();var Be={json:"application/json",text:"text/*",formData:"multipart/form-data",arrayBuffer:"*/*",blob:"*/*",bytes:"*/*"},J=2147483647,We=new TextEncoder().encode("------WebKitFormBoundaryaxpyiPgbbPti10Rw").length,z=Symbol("stop"),I=class{options;constructor(e){this.options=e}},Je=n=>new I(n),ze={json:!0,parseJson:!0,stringifyJson:!0,searchParams:!0,prefixUrl:!0,retry:!0,timeout:!0,hooks:!0,throwHttpErrors:!0,onDownloadProgress:!0,onUploadProgress:!0,fetch:!0,context:!0},Ge={next:!0},Ke={method:!0,headers:!0,body:!0,mode:!0,credentials:!0,cache:!0,redirect:!0,referrer:!0,referrerPolicy:!0,integrity:!0,keepalive:!0,signal:!0,window:!0,duplex:!0};var lr=n=>{if(!n)return 0;if(n instanceof FormData){let e=0;for(let[t,r]of n)e+=We,e+=new TextEncoder().encode(`Content-Disposition: form-data; name="${t}"`).length,e+=typeof r=="string"?new TextEncoder().encode(r).length:r.size;return e}if(n instanceof Blob)return n.size;if(n instanceof ArrayBuffer)return n.byteLength;if(typeof n=="string")return new TextEncoder().encode(n).length;if(n instanceof URLSearchParams)return new TextEncoder().encode(n.toString()).length;if("byteLength"in n)return n.byteLength;if(typeof n=="object"&&n!==null)try{let e=JSON.stringify(n);return new TextEncoder().encode(e).length}catch{return 0}return 0},Ye=(n,e,t)=>{let r,i=0;return n.pipeThrough(new TransformStream({transform(s,o){if(o.enqueue(s),r){i+=r.byteLength;let c=e===0?0:i/e;c>=1&&(c=1-Number.EPSILON),t?.({percent:c,totalBytes:Math.max(e,i),transferredBytes:i},r)}r=s},flush(){r&&(i+=r.byteLength,t?.({percent:1,totalBytes:Math.max(e,i),transferredBytes:i},r))}}))},Xe=(n,e)=>{if(!n.body)return n;if(n.status===204)return new Response(null,{status:n.status,statusText:n.statusText,headers:n.headers});let t=Math.max(0,Number(n.headers.get("content-length"))||0);return new Response(Ye(n.body,t,e),{status:n.status,statusText:n.statusText,headers:n.headers})},Qe=(n,e,t)=>{if(!n.body)return n;let r=lr(t??n.body);return new Request(n,{duplex:"half",body:Ye(n.body,r,e)})};u();u();var E=n=>n!==null&&typeof n=="object";var V=(...n)=>{for(let e of n)if((!E(e)||Array.isArray(e))&&e!==void 0)throw new TypeError("The `options` argument must be an object");return fe({},...n)},me=(n={},e={})=>{let t=new globalThis.Headers(n),r=e instanceof globalThis.Headers,i=new globalThis.Headers(e);for(let[s,o]of i.entries())r&&o==="undefined"||o===void 0?t.delete(s):t.set(s,o);return t};function G(n,e,t){return Object.hasOwn(e,t)&&e[t]===void 0?[]:fe(n[t]??[],e[t]??[])}var pe=(n={},e={})=>({beforeRequest:G(n,e,"beforeRequest"),beforeRetry:G(n,e,"beforeRetry"),afterResponse:G(n,e,"afterResponse"),beforeError:G(n,e,"beforeError")}),hr=(n,e)=>{let t=new URLSearchParams;for(let r of[n,e])if(r!==void 0)if(r instanceof URLSearchParams)for(let[i,s]of r.entries())t.append(i,s);else if(Array.isArray(r))for(let i of r){if(!Array.isArray(i)||i.length!==2)throw new TypeError("Array search parameters must be provided in [[key, value], ...] format");t.append(String(i[0]),String(i[1]))}else if(E(r))for(let[i,s]of Object.entries(r))s!==void 0&&t.append(i,String(s));else{let i=new URLSearchParams(r);for(let[s,o]of i.entries())t.append(s,o)}return t},fe=(...n)=>{let e={},t={},r={},i,s=[];for(let o of n)if(Array.isArray(o))Array.isArray(e)||(e=[]),e=[...e,...o];else if(E(o)){for(let[c,a]of Object.entries(o)){if(c==="signal"&&a instanceof globalThis.AbortSignal){s.push(a);continue}if(c==="context"){if(a!=null&&(!E(a)||Array.isArray(a)))throw new TypeError("The `context` option must be an object");e={...e,context:a==null?{}:{...e.context,...a}};continue}if(c==="searchParams"){a==null?i=void 0:i=i===void 0?a:hr(i,a);continue}E(a)&&c in e&&(a=fe(e[c],a)),e={...e,[c]:a}}E(o.hooks)&&(r=pe(r,o.hooks),e.hooks=r),E(o.headers)&&(t=me(t,o.headers),e.headers=t)}return i!==void 0&&(e.searchParams=i),s.length>0&&(s.length===1?e.signal=s[0]:B?e.signal=AbortSignal.any(s):e.signal=s.at(-1)),e};u();var et=n=>W.includes(n)?n.toUpperCase():n,dr=["get","put","head","delete","options","trace"],mr=[408,413,429,500,502,503,504],pr=[413,429,503],Ze={limit:2,methods:dr,statusCodes:mr,afterStatusCodes:pr,maxRetryAfter:Number.POSITIVE_INFINITY,backoffLimit:Number.POSITIVE_INFINITY,delay:n=>.3*2**(n-1)*1e3,jitter:void 0,retryOnTimeout:!1},tt=(n={})=>{if(typeof n=="number")return{...Ze,limit:n};if(n.methods&&!Array.isArray(n.methods))throw new Error("retry.methods must be an array");if(n.methods&&=n.methods.map(t=>t.toLowerCase()),n.statusCodes&&!Array.isArray(n.statusCodes))throw new Error("retry.statusCodes must be an array");let e=Object.fromEntries(Object.entries(n).filter(([,t])=>t!==void 0));return{...Ze,...e}};u();u();var k=class extends Error{request;constructor(e){super(`Request timed out: ${e.method} ${e.url}`),this.name="TimeoutError",this.request=e}};async function ge(n,e,t,r){return new Promise((i,s)=>{let o=setTimeout(()=>{t&&t.abort(),s(new k(n))},r.timeout);r.fetch(n,e).then(i).catch(s).then(()=>{clearTimeout(o)})})}u();async function be(n,{signal:e}){return new Promise((t,r)=>{e&&(e.throwIfAborted(),e.addEventListener("abort",i,{once:!0}));function i(){clearTimeout(s),r(e.reason)}let s=setTimeout(()=>{e?.removeEventListener("abort",i),t()},n)})}u();var rt=(n,e)=>{let t={};for(let r in e)Object.hasOwn(e,r)&&!(r in Ke)&&!(r in ze)&&(!(r in n)||r in Ge)&&(t[r]=e[r]);return t},nt=n=>n===void 0?!1:Array.isArray(n)?n.length>0:n instanceof URLSearchParams?n.size>0:typeof n=="object"?Object.keys(n).length>0:typeof n=="string"?n.trim().length>0:!!n;u();function it(n){return n instanceof _||n?.name===_.name}function st(n){return n instanceof k||n?.name===k.name}var D=class n{static create(e,t){let r=new n(e,t),i=async()=>{if(typeof r.#e.timeout=="number"&&r.#e.timeout>J)throw new RangeError(`The \`timeout\` option cannot be greater than ${J}`);await Promise.resolve();let o=await r.#b();for(let c of r.#e.hooks.afterResponse){let a=r.#d(o.clone()),l;try{l=await c(r.request,r.#c(),a,{retryCount:r.#r})}catch(f){throw r.#s(a),r.#s(o),f}if(l instanceof I)throw r.#s(a),r.#s(o),new q(l.options);let h=l instanceof globalThis.Response?l:o;a!==h&&r.#s(a),o!==h&&r.#s(o),o=h}if(r.#d(o),!o.ok&&(typeof r.#e.throwHttpErrors=="function"?r.#e.throwHttpErrors(o.status):r.#e.throwHttpErrors)){let c=new _(o,r.request,r.#c());for(let a of r.#e.hooks.beforeError)c=await a(c,{retryCount:r.#r});throw c}if(r.#e.onDownloadProgress){if(typeof r.#e.onDownloadProgress!="function")throw new TypeError("The `onDownloadProgress` option must be a function");if(!Ue)throw new Error("Streams are not supported in your environment. `ReadableStream` is missing.");let c=o.clone();return r.#s(o),Xe(c,r.#e.onDownloadProgress)}return o},s=r.#m(i).finally(()=>{let o=r.#o;r.#l(o?.body??void 0),r.#l(r.request.body??void 0)});for(let[o,c]of Object.entries(Be))o==="bytes"&&typeof globalThis.Response?.prototype?.bytes!="function"||(s[o]=async()=>{r.request.headers.set("accept",r.request.headers.get("accept")||c);let a=await s;if(o==="json"){if(a.status===204)return"";let l=await a.text();return l===""?"":t.parseJson?t.parseJson(l):JSON.parse(l)}return a[o]()});return s}static#f(e){return e&&typeof e=="object"&&!Array.isArray(e)&&!(e instanceof URLSearchParams)?Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0)):e}request;#n;#r=0;#t;#e;#o;#i;#a;constructor(e,t={}){if(this.#t=e,this.#e={...t,headers:me(this.#t.headers,t.headers),hooks:pe({beforeRequest:[],beforeRetry:[],beforeError:[],afterResponse:[]},t.hooks),method:et(t.method??this.#t.method??"GET"),prefixUrl:String(t.prefixUrl||""),retry:tt(t.retry),throwHttpErrors:t.throwHttpErrors??!0,timeout:t.timeout??1e4,fetch:t.fetch??globalThis.fetch.bind(globalThis),context:t.context??{}},typeof this.#t!="string"&&!(this.#t instanceof URL||this.#t instanceof globalThis.Request))throw new TypeError("`input` must be a string, URL, or Request");if(this.#e.prefixUrl&&typeof this.#t=="string"){if(this.#t.startsWith("/"))throw new Error("`input` must not begin with a slash when using `prefixUrl`");this.#e.prefixUrl.endsWith("/")||(this.#e.prefixUrl+="/"),this.#t=this.#e.prefixUrl+this.#t}Le&&B&&(this.#i=this.#e.signal??this.#t.signal,this.#n=new globalThis.AbortController,this.#e.signal=this.#i?AbortSignal.any([this.#i,this.#n.signal]):this.#n.signal),de&&(this.#e.duplex="half"),this.#e.json!==void 0&&(this.#e.body=this.#e.stringifyJson?.(this.#e.json)??JSON.stringify(this.#e.json),this.#e.headers.set("content-type",this.#e.headers.get("content-type")??"application/json"));let r=t.headers&&new globalThis.Headers(t.headers).has("content-type");if(this.#t instanceof globalThis.Request&&(Me&&this.#e.body instanceof globalThis.FormData||this.#e.body instanceof URLSearchParams)&&!r&&this.#e.headers.delete("content-type"),this.request=new globalThis.Request(this.#t,this.#e),nt(this.#e.searchParams)){let s="?"+(typeof this.#e.searchParams=="string"?this.#e.searchParams.replace(/^\?/,""):new URLSearchParams(n.#f(this.#e.searchParams)).toString()),o=this.request.url.replace(/(?:\?.*?)?(?=#|$)/,s);this.request=new globalThis.Request(o,this.#e)}if(this.#e.onUploadProgress){if(typeof this.#e.onUploadProgress!="function")throw new TypeError("The `onUploadProgress` option must be a function");if(!de)throw new Error("Request streams are not supported in your environment. The `duplex` option for `Request` is not available.");this.request=this.#p(this.request,this.#e.body??void 0)}}#u(){let e=this.#e.retry.delay(this.#r),t=e;this.#e.retry.jitter===!0?t=Math.random()*e:typeof this.#e.retry.jitter=="function"&&(t=this.#e.retry.jitter(e),(!Number.isFinite(t)||t<0)&&(t=e));let r=this.#e.retry.backoffLimit??Number.POSITIVE_INFINITY;return Math.min(r,t)}async#g(e){if(this.#r++,this.#r>this.#e.retry.limit)throw e;let t=e instanceof Error?e:new T(e);if(t instanceof q)return t.customDelay??this.#u();if(!this.#e.retry.methods.includes(this.request.method.toLowerCase()))throw e;if(this.#e.retry.shouldRetry!==void 0){let r=await this.#e.retry.shouldRetry({error:t,retryCount:this.#r});if(r===!1)throw e;if(r===!0)return this.#u()}if(st(e)&&!this.#e.retry.retryOnTimeout)throw e;if(it(e)){if(!this.#e.retry.statusCodes.includes(e.response.status))throw e;let r=e.response.headers.get("Retry-After")??e.response.headers.get("RateLimit-Reset")??e.response.headers.get("X-RateLimit-Retry-After")??e.response.headers.get("X-RateLimit-Reset")??e.response.headers.get("X-Rate-Limit-Reset");if(r&&this.#e.retry.afterStatusCodes.includes(e.response.status)){let i=Number(r)*1e3;Number.isNaN(i)?i=Date.parse(r)-Date.now():i>=Date.parse("2024-01-01")&&(i-=Date.now());let s=this.#e.retry.maxRetryAfter??i;return i<s?i:s}if(e.response.status===413)throw e}return this.#u()}#d(e){return this.#e.parseJson&&(e.json=async()=>this.#e.parseJson(await e.text())),e}#l(e){e&&e.cancel().catch(()=>{})}#s(e){this.#l(e.body??void 0)}async#m(e){try{return await e()}catch(t){let r=Math.min(await this.#g(t),J);if(this.#r<1)throw t;if(await be(r,this.#i?{signal:this.#i}:{}),t instanceof q&&t.customRequest){let i=this.#e.signal?new globalThis.Request(t.customRequest,{signal:this.#e.signal}):new globalThis.Request(t.customRequest);this.#h(i)}for(let i of this.#e.hooks.beforeRetry){let s=await i({request:this.request,options:this.#c(),error:t,retryCount:this.#r});if(s instanceof globalThis.Request){this.#h(s);break}if(s instanceof globalThis.Response)return s;if(s===z)return}return this.#m(e)}}async#b(){this.#n?.signal.aborted&&(this.#n=new globalThis.AbortController,this.#e.signal=this.#i?AbortSignal.any([this.#i,this.#n.signal]):this.#n.signal,this.request=new globalThis.Request(this.request,{signal:this.#e.signal}));for(let t of this.#e.hooks.beforeRequest){let r=await t(this.request,this.#c(),{retryCount:this.#r});if(r instanceof Response)return r;if(r instanceof globalThis.Request){this.#h(r);break}}let e=rt(this.request,this.#e);return this.#o=this.request,this.request=this.#o.clone(),this.#e.timeout===!1?this.#e.fetch(this.#o,e):ge(this.#o,e,this.#n,this.#e)}#c(){if(!this.#a){let{hooks:e,...t}=this.#e;this.#a=Object.freeze(t)}return this.#a}#h(e){this.#a=void 0,this.request=this.#p(e)}#p(e,t){return!this.#e.onUploadProgress||!e.body?e:Qe(e,this.#e.onUploadProgress,t??this.#e.body??void 0)}};var ye=n=>{let e=(t,r)=>D.create(t,V(n,r));for(let t of W)e[t]=(r,i)=>D.create(r,V(n,i,{method:t}));return e.create=t=>ye(V(t)),e.extend=t=>(typeof t=="function"&&(t=t(n??{})),ye(V(n,t))),e.stop=z,e.retry=Je,e},fr=ye(),F=fr;var gr="https://pro.lahat.group/api";function we(){return process.env.WARDROBE_API_URL??gr}function C(n){if(!n)throw new Error("Not authenticated. Run `wardrobe login` first.");return F.create({prefixUrl:we(),headers:{Authorization:`Bearer ${n}`},retry:0})}u();import{readFileSync as br,writeFileSync as yr,mkdirSync as wr,rmSync as _r,existsSync as jr}from"fs";import{homedir as Or}from"os";import{join as ot}from"path";function at(){return process.env.WARDROBE_CONFIG_DIR??ot(Or(),".config","wardrobe")}function _e(){return ot(at(),"config.json")}function x(){let n=_e();if(!jr(n))return null;try{return JSON.parse(br(n,"utf8"))}catch{return null}}function ct(n){wr(at(),{recursive:!0,mode:448}),yr(_e(),JSON.stringify(n,null,2),{mode:384})}function ut(){_r(_e(),{force:!0})}u();import{readFileSync as xr}from"fs";function Cr(){return new Promise((n,e)=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",r=>t+=r),process.stdin.on("end",()=>n(t)),process.stdin.on("error",e)})}async function v(n){let e=n==="-"?await Cr():xr(n,"utf8");try{return JSON.parse(e)}catch(t){throw new Error(`Failed to parse JSON input: ${t.message}`)}}function p(n,e,t){e?process.stdout.write(JSON.stringify(n,null,2)+`
|
|
25
|
+
`):t()}function je(){return C(x()?.accessToken??null)}async function lt(n={}){let e={};for(let r of["width","height","depth"])n[r]!==void 0&&(e[r]=n[r]);let t=await je().get("configs/init",{searchParams:e}).json();process.stdout.write(JSON.stringify(t.config,null,2)+`
|
|
26
|
+
`)}async function ht(n,e={}){let t=await v(n),r=await je().post("configs/validate",{json:{config:t}}).json();p(r,!!e.json,()=>{if(r.valid)process.stdout.write(`valid
|
|
27
27
|
`);else for(let i of r.errors)process.stdout.write(`${i.severity}: ${i.path} \u2014 ${i.message}
|
|
28
|
-
`)}),r.valid||(process.exitCode=1)}async function dt(n,e={}){let t=
|
|
28
|
+
`)}),r.valid||(process.exitCode=1)}async function dt(n,e={}){let t=je(),r=n==="-"||Ar(n)?await v(n):(await t.get(`designs/${n}`).json()).config,i=await t.post("configs/describe",{json:{config:r,locale:e.locale??"en"}}).json();p(i.lines,!!e.json,()=>process.stdout.write(i.lines.join(`
|
|
29
29
|
`)+`
|
|
30
|
-
`))}u();import{spawn as
|
|
30
|
+
`))}u();import{spawn as vr}from"child_process";import{setTimeout as $r}from"timers/promises";function Er(n){let e=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";try{vr(e,[n],{stdio:"ignore",detached:!0}).unref()}catch{}}async function mt(n={}){let e=we(),t=await F.post(`${e}/auth/device/code`,{retry:0}).json(),r=`${t.verification_uri}?code=${encodeURIComponent(t.user_code)}`;n.json||(process.stdout.write(`
|
|
31
31
|
To authorize this CLI, visit:
|
|
32
32
|
${t.verification_uri}
|
|
33
33
|
`),process.stdout.write(`and enter code: ${t.user_code}
|
|
34
34
|
|
|
35
|
-
`),
|
|
35
|
+
`),Er(r));let i=t.interval,s=Date.now()+t.expires_in*1e3;for(;Date.now()<s;){await $r(i*1e3);try{let o=await F.post(`${e}/auth/device/token`,{json:{device_code:t.device_code},retry:0}).json();ct({...x(),accessToken:o.access_token,apiUrl:e}),p({status:"authorized",scopes:o.scopes},!!n.json,()=>process.stdout.write(`Authorized. Agent key saved.
|
|
36
36
|
`));return}catch(o){let a=(o instanceof _?await o.response.json().catch(()=>({})):{}).error;if(a==="authorization_pending")continue;if(a==="slow_down"||o instanceof _&&o.response.status===429){i+=5;continue}throw new Error(`Login failed: ${a??o.message}`)}}throw new Error("Login timed out. Run `wardrobe login` again.")}u();async function pt(n={}){let t=await C(x()?.accessToken??null).get("auth/me").json();p(t,!!n.json,()=>{process.stdout.write(`${t.displayName} <${t.email}> \u2014 account role: ${t.role}
|
|
37
37
|
`),t.agent&&process.stdout.write(`Agent key scopes: ${t.agent.scopes.join(", ")}
|
|
38
38
|
`)})}function ft(n={}){ut(),p({status:"logged_out"},!!n.json,()=>process.stdout.write(`Logged out.
|
|
39
|
-
`))}u();u();import{writeFileSync as gt}from"fs";function
|
|
39
|
+
`))}u();u();import{writeFileSync as gt}from"fs";function j(){return C(x()?.accessToken??null)}function Oe(n){let e=(n??"").replace(/\D/g,"");return e.startsWith("972")?`0${e.slice(3)}`:e}async function bt(n,e={}){let t=await j().get(`projects/${n}`).json();p(t,!!e.json,()=>{process.stdout.write(`${t.id} ${t.name}
|
|
40
40
|
`),t.customer&&process.stdout.write(`customer: ${t.customer.customerName??"\u2014"} ${t.customer.phoneNumber??""}
|
|
41
41
|
`),t.createdBy&&process.stdout.write(`designer: ${t.createdBy.displayName??"\u2014"} (${t.createdBy.id??""})
|
|
42
|
-
`)})}async function yt(n,e={}){let t=await
|
|
43
|
-
`)})}async function wt(n={}){let e=await
|
|
44
|
-
`)})}async function _t(n,e={}){let t=await
|
|
45
|
-
`))}async function
|
|
46
|
-
`)})}async function
|
|
47
|
-
`);return}for(let
|
|
48
|
-
`)}})}async function
|
|
49
|
-
`))}async function
|
|
50
|
-
`))}async function At(n={}){let e=await
|
|
51
|
-
`)
|
|
52
|
-
`))}async function vt(n={}){if(!n
|
|
53
|
-
`)}
|
|
54
|
-
`)}
|
|
42
|
+
`)})}async function yt(n,e={}){let t=await j().get(`projects/${n}/members`).json();p(t.members,!!e.json,()=>{for(let r of t.members)process.stdout.write(`${r.userId} ${r.role} ${r.displayName??r.email??""}
|
|
43
|
+
`)})}async function wt(n={}){let e=await j().get("customers").json();p(e.customers,!!n.json,()=>{for(let t of e.customers)process.stdout.write(`${t.id} ${t.customerName??""} ${t.phoneNumber??""}
|
|
44
|
+
`)})}async function _t(n,e={}){let t=await j().get(`customers/${n}`).json();p(t,!!e.json,()=>process.stdout.write(`${t.id} ${t.customerName??""} ${t.phoneNumber??""} ${t.email??""}
|
|
45
|
+
`))}async function jt(n,e={}){let r=(await j().get(`customers/${n}/projects`).json()).projects??[];p(r,!!e.json,()=>{for(let i of r)process.stdout.write(`${i.id} ${i.name}
|
|
46
|
+
`)})}async function Ot(n={}){if(n.open&&!n.project)throw new Error("--open requires --project <id>.");let e,t=null;if(n.project)n.open?(t=(await j().get("orders/open",{searchParams:{projectId:n.project}}).json()).order,e=t?[t]:[]):e=(await j().get("orders",{searchParams:{projectId:n.project}}).json()).orders??[];else{let r={};n.limit!==void 0&&(r.limit=n.limit),n.since!==void 0&&(r.updatedSince=n.since),e=(await j().get("orders",{searchParams:r}).json()).orders??[]}p(n.open?{order:t}:e,!!n.json,()=>{if(e.length===0){process.stdout.write(`no orders
|
|
47
|
+
`);return}for(let r of e){let i=r.totalPrice!==void 0?`${r.totalPrice} ${r.currency??"NIS"}`:"";process.stdout.write(`${r.id??""} #${r.orderNumber??"\u2014"} rev${r.revisionNumber??1} ${r.status??""} ${i}
|
|
48
|
+
`)}})}async function xt(n,e={}){let t=e.out??`order-${n}.pdf`,r=Buffer.from(await j().get(`orders/${n}/pdf`).arrayBuffer());gt(t,r),p({path:t,bytes:r.length},!!e.json,()=>process.stdout.write(`${t} ${r.length} bytes
|
|
49
|
+
`))}async function Ct(n,e={}){let t=e.out??`design-${n}.jpg`,r=Buffer.from(await j().get(`designs/${n}/thumbnail`).arrayBuffer());gt(t,r),p({path:t,bytes:r.length},!!e.json,()=>process.stdout.write(`${t} ${r.length} bytes
|
|
50
|
+
`))}async function At(n={}){let e={};n.limit!==void 0&&(e.limit=n.limit),n.since!==void 0&&(e.createdSince=n.since);let t=await j().get("users",{searchParams:e}).json();p(t.users,!!n.json,()=>{if(t.users.length===0){process.stdout.write(`no users
|
|
51
|
+
`);return}for(let r of t.users)process.stdout.write(`${r.id??""} ${r.email??""} ${r.displayName??""} ${r.role??""} ${r.createdAt??""}
|
|
52
|
+
`)})}async function vt(n,e={}){if(!n)throw new Error("phone is required.");let t=await j().get("users/by-phone",{searchParams:{phone:n}}).json();p(t.users,!!e.json,()=>{if(t.users.length===0){process.stdout.write(`no matching user
|
|
53
|
+
`);return}for(let r of t.users)process.stdout.write(`${r.id??""} ${r.email??""} ${r.displayName??""} ${r.role??""}
|
|
54
|
+
`)})}async function $t(n={}){let e=await j().get("help-texts").json();p(e,!!n.json,()=>process.stdout.write(`${Object.keys(e).length} help text(s)
|
|
55
|
+
`))}function L(){return C(x()?.accessToken??null)}async function Et(n,e={}){let t=await v(n),r=await L().post("price",{json:{config:t}}).json();p(r,!!e.json,()=>process.stdout.write(`${r.total} ${r.currency}
|
|
56
|
+
`))}async function St(n={}){let e={};n.project?e.projectId=n.project:(n.limit!==void 0&&(e.limit=n.limit),n.since!==void 0&&(e.updatedSince=n.since));let t=await L().get("designs",{searchParams:e}).json();p(t.designs,!!n.json,()=>{if(t.designs.length===0){process.stdout.write(`no designs
|
|
57
|
+
`);return}for(let r of t.designs){let i=n.project?"":` ${r.projectId??""}`;process.stdout.write(`${r.id} ${r.name}${i}
|
|
58
|
+
`)}})}async function Pt(n={}){if(n.project){let r=await L().get(`quotations/project/${n.project}`).json();p(r,!!n.json,()=>{process.stdout.write(`quote #${r.quoteNumber}, ${r.revisionNumber} revision(s)
|
|
59
|
+
`);for(let i of r.revisions)process.stdout.write(`rev${i.revisionNumber} ${i.totalPrice+i.serviceTotal} ${i.currency} ${i.at}
|
|
60
|
+
`)});return}let e={};n.limit!==void 0&&(e.limit=n.limit),n.since!==void 0&&(e.updatedSince=n.since);let t=await L().get("quotations",{searchParams:e}).json();p(t.quotations,!!n.json,()=>{if(t.quotations.length===0){process.stdout.write(`no quotations
|
|
61
|
+
`);return}for(let r of t.quotations){let i=r.totalPrice!==null?`${r.totalPrice+(r.serviceTotal??0)} ${r.currency??"NIS"}`:"";process.stdout.write(`${r.projectId} quote #${r.quoteNumber} rev${r.revisionNumber} ${i} ${r.generatedAt??""}
|
|
62
|
+
`)}})}async function kt(n={}){let t=(await L().get("projects").json()).projects;if(n.phone){let r=Oe(n.phone);t=t.filter(i=>Oe(i.customer?.phoneNumber)===r)}if(n.designer){let r=n.designer.toLowerCase();t=t.filter(i=>i.createdBy?.id===n.designer||(i.createdBy?.displayName??"").toLowerCase().includes(r))}p(t,!!n.json,()=>{for(let r of t){let i=r.createdBy?.displayName?` ${r.createdBy.displayName}`:"",s=r.customer?.customerName?` ${r.customer.customerName}`:"";process.stdout.write(`${r.id} ${r.name}${s}${i}
|
|
63
|
+
`)}})}u();function xe(){return C(x()?.accessToken??null)}async function Rt(n,e={}){let t=await v(n),r=await xe().post("price",{json:{config:t},searchParams:{preview:"bom"}}).json();p(r,!!e.json,()=>{process.stdout.write(`${r.total} ${r.currency}
|
|
55
64
|
`);for(let i of r.bomPreview?.lines??[])process.stdout.write(` ${i.qty}\xD7 ${i.part} (${i.sku}) ${i.widthMm}\xD7${i.heightMm}mm
|
|
56
|
-
`)})}async function
|
|
57
|
-
`))}async function
|
|
58
|
-
`))}u();import{fileURLToPath as
|
|
65
|
+
`)})}async function Ce(n,e={}){if(!e.project)throw new Error("--project <id> is required.");let t=await v(n),r=await xe().post("designs",{json:{projectId:e.project,name:e.name??"CLI design",config:t}}).json();p(r,!!e.json,()=>process.stdout.write(`${r.id}
|
|
66
|
+
`))}async function Tt(n,e={}){if(!e.file&&!e.name)throw new Error("Nothing to update \u2014 pass --file <config> and/or --name <name>.");let t=xe(),r=await t.get(`designs/${n}`).json(),i={};e.file&&(i.config=await v(e.file)),e.name&&(i.name=e.name),r.version!==void 0&&(i.version=r.version);let s=await t.put(`designs/${n}`,{json:i}).json();p(s,!!e.json,()=>process.stdout.write(`${s.id} v${s.version??"?"}
|
|
67
|
+
`))}u();import{fileURLToPath as Sr}from"url";import{dirname as qt,join as R}from"path";import{homedir as Pr}from"os";import{existsSync as kr,mkdirSync as Rr,readdirSync as Tr,copyFileSync as qr,statSync as Nr}from"fs";function Hr(){let n=qt(Sr(import.meta.url));for(let e=0;e<6;e++){let t=R(n,"skill");if(kr(R(t,"SKILL.md")))return t;n=qt(n)}throw new Error("Bundled SKILL.md not found next to the CLI package")}function Ir(n){let e=n?R(process.cwd(),".claude"):R(Pr(),".claude");return R(e,"skills","wardrobe-configurator")}function Vr(n={}){let e=n.sourceDir??Hr(),t=n.targetDir??Ir(!!n.project);Rr(t,{recursive:!0});let r=[];for(let i of Tr(e)){let s=R(e,i);Nr(s).isFile()&&(qr(s,R(t,i)),r.push(i))}return{target:t,files:r}}function Nt(n){let e=Vr({project:n.project});p(e,!!n.json,()=>{process.stdout.write(`Installed ${e.files.length} file(s) to ${e.target}
|
|
59
68
|
`),process.stdout.write(`Restart Claude Code, then invoke /wardrobe-configurator
|
|
60
|
-
`)})}u();async function
|
|
69
|
+
`)})}u();async function Dr(n){if(!(n instanceof _))return null;try{return await n.response.json()}catch{return null}}async function Ht(n,e){let t=await Dr(n);if(e)return JSON.stringify(t?{error:t.error??"request_failed",...t}:{error:n.message},null,2);if(!t)return`Error: ${n.message}`;let r=[t.error??"Request failed"];return t.detail&&r.push(t.detail),t.fix_hint&&r.push(`fix: ${t.fix_hint}`),t.issues&&r.push(JSON.stringify(t.issues)),`Error: ${r.join(" \u2014 ")}`}u();var It="2.0.1";y.name("wardrobe").description("Wardrobe configurator CLI").version(It);y.command("login").description("Authenticate via the OAuth device flow").option("--json","machine-readable output").action(n=>mt(n));y.command("whoami").description("Show the authenticated user").option("--json","machine-readable output").action(n=>pt(n));y.command("logout").description("Remove the stored agent key").option("--json","machine-readable output").action(n=>ft(n));y.command("init").description("Emit a fresh, valid WardrobeConfig JSON (via the API)").option("--width <cm>","total width in cm",n=>Number(n)).option("--height <cm>","height in cm",n=>Number(n)).option("--depth <cm>","depth in cm",n=>Number(n)).action(n=>lt(n));y.command("validate <file>").description("Validate a config against the live rules (file or - for stdin)").option("--json","machine-readable output").action((n,e)=>ht(n,e));y.command("describe <idOrFile>").description("Describe a config (local file/-) or saved design (id), via the API").option("--locale <locale>","en or he","en").option("--json","machine-readable output").action((n,e)=>dt(n,e));y.command("price <file>").description("Price a config via the API (file or - for stdin)").option("--json","machine-readable output").action((n,e)=>Et(n,e));y.command("plan <file>").description("Dry-run: price a config + BOM preview (mutates nothing)").option("--json","machine-readable output").action((n,e)=>Rt(n,e));y.command("apply <file>").description("Save a config as a design (file or - for stdin)").requiredOption("--project <id>","project id").option("--name <name>","design name").option("--json","machine-readable output").action((n,e)=>Ce(n,e));var K=y.command("designs").description("Manage saved designs");K.command("list").description("List designs in a project, or the newest across every project with --project omitted").option("--project <id>","project id").option("--limit <n>","cross-project mode only: max rows (default 20, max 100)",n=>Number(n)).option("--since <iso>","cross-project mode only: only designs updated at/after this ISO 8601 timestamp").option("--json","machine-readable output").action(n=>St(n));K.command("create <file>").description("Save a config as a new design in a project (same as `apply`)").requiredOption("--project <id>","project id").option("--name <name>","design name").option("--json","machine-readable output").action((n,e)=>Ce(n,e));K.command("update <id>").description("Revise a saved design (config and/or name)").option("--file <file>","new config JSON (file or - for stdin)").option("--name <name>","new design name").option("--json","machine-readable output").action((n,e)=>Tt(n,e));K.command("thumbnail <id>").description("Download a design's thumbnail image").option("--out <file>","destination path").option("--json","machine-readable output").action((n,e)=>Ct(n,e));var Ae=y.command("projects").description("Manage projects");Ae.command("list").description("List accessible projects").option("--phone <number>","filter by the customer's phone number").option("--designer <idOrName>","filter by the designer who owns the project").option("--json","machine-readable output").action(n=>kt(n));Ae.command("get <id>").description("Show one project").option("--json","machine-readable output").action((n,e)=>bt(n,e));Ae.command("members <id>").description("List a project's owner and members").option("--json","machine-readable output").action((n,e)=>yt(n,e));var ve=y.command("customers").description("Read customers");ve.command("list").description("List your customers").option("--json","machine-readable output").action(n=>wt(n));ve.command("get <id>").description("Show one customer").option("--json","machine-readable output").action((n,e)=>_t(n,e));ve.command("projects <id>").description("List a customer's projects").option("--json","machine-readable output").action((n,e)=>jt(n,e));var Vt=y.command("orders").description("Read orders");Vt.command("list").description("List a project's orders, or the newest-updated across every project with --project omitted").option("--project <id>","project id").option("--open","only the project's active (non-cancelled) order (requires --project)").option("--limit <n>","cross-project mode only: max rows (default 20, max 100)",n=>Number(n)).option("--since <iso>","cross-project mode only: only orders updated at/after this ISO 8601 timestamp").option("--json","machine-readable output").action(n=>Ot(n));Vt.command("pdf <id>").description("Download an order PDF").option("--out <file>","destination path").option("--json","machine-readable output").action((n,e)=>xt(n,e));var Fr=y.command("quotations").description("Read quotations (requires quotations:read)");Fr.command("list").description("Show a project's quote history, or the newest-generated across every project with --project omitted").option("--project <id>","project id").option("--limit <n>","cross-project mode only: max rows (default 20, max 100)",n=>Number(n)).option("--since <iso>","cross-project mode only: only quotations generated at/after this ISO 8601 timestamp").option("--json","machine-readable output").action(n=>Pt(n));var Dt=y.command("users").description("Read registered accounts (requires staff:read)");Dt.command("list").description("List registered users, newest-registered first").option("--limit <n>","max rows (default 20, max 100)",n=>Number(n)).option("--since <iso>","only users registered at/after this ISO 8601 timestamp").option("--json","machine-readable output").action(n=>At(n));Dt.command("by-phone <phone>").description("Find the account(s) tied to a phone number (the linked client, plus any designer who owns a project for that customer)").option("--json","machine-readable output").action((n,e)=>vt(n,e));y.command("help-texts").description("Read the help-text table").option("--json","machine-readable output").action(n=>$t(n));var Lr=y.command("skill").description("Manage the bundled Claude Skill");Lr.command("install").description("Install the wardrobe-configurator Skill for Claude Code").option("--project","install into ./.claude/skills instead of ~/.claude/skills").option("--json","machine-readable output").action(n=>Nt(n));y.parseAsync().catch(async n=>{let e=await Ht(n,process.argv.includes("--json"));process.stderr.write(`${e}
|
|
61
70
|
`),process.exit(1)});
|
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wardrobe-configurator
|
|
3
|
-
description: Use when the user wants to build, configure, validate, price, or order a wardrobe/closet design from the terminal — phrases like "configure a wardrobe", "price a design", "build a closet layout", "validate my wardrobe config" — OR wants to look up existing wardrobe data: projects, customers, designers, orders and their PDFs, e.g. "which projects does this designer have", "find the customer with phone 05x", "who is on this project", "what is the status of this order", "download the order PDF". Drives the `wardrobe` CLI (HTTP client over the configurator API); a WardrobeConfig JSON file on disk is the unit of work for design verbs, and every lookup verb is read-only.
|
|
3
|
+
description: Use when the user wants to build, configure, validate, price, or order a wardrobe/closet design from the terminal — phrases like "configure a wardrobe", "price a design", "build a closet layout", "validate my wardrobe config" — OR wants to look up existing wardrobe data: projects, customers, designers, orders, quotations and their PDFs, or (staff only) registered users across the whole system, e.g. "which projects does this designer have", "find the customer with phone 05x", "who is on this project", "what is the status of this order", "download the order PDF", "who signed up recently", "which account owns this phone number", "what's the latest quote we generated". Drives the `wardrobe` CLI (HTTP client over the configurator API); a WardrobeConfig JSON file on disk is the unit of work for design verbs, and every lookup verb is read-only.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Wardrobe Configurator CLI
|
|
@@ -71,7 +71,7 @@ or a saved design id.
|
|
|
71
71
|
## Reading what exists
|
|
72
72
|
|
|
73
73
|
Every read the key can reach has a verb. **All of them are GETs** — the CLI can read
|
|
74
|
-
customers and
|
|
74
|
+
customers, orders and quotations but never create or change them (`customers:write`,
|
|
75
75
|
`orders:write` and `quotations:write` are not on the CLI's key, so those routes
|
|
76
76
|
answer `403 insufficient_scope` whoever signed in).
|
|
77
77
|
|
|
@@ -86,32 +86,67 @@ answer `403 insufficient_scope` whoever signed in).
|
|
|
86
86
|
| `wardrobe customers get <id>` | One customer |
|
|
87
87
|
| `wardrobe customers projects <id>` | That customer's projects |
|
|
88
88
|
| `wardrobe designs list --project <id>` | Designs saved in a project |
|
|
89
|
+
| `wardrobe designs list` | The newest designs across every project you can see (all yours, or the whole tenant with `staff:read`) |
|
|
90
|
+
| `wardrobe designs list --limit <n>` `--since <ISO>` | Same, paged — `--limit` caps rows (default 20, max 100), `--since` filters by `updatedAt >=` |
|
|
89
91
|
| `wardrobe designs thumbnail <id> --out f.jpg` | The design's rendered thumbnail |
|
|
90
92
|
| `wardrobe orders list --project <id>` | Every order the project has had |
|
|
91
93
|
| `wardrobe orders list --project <id> --open` | Only its active (non-cancelled) order |
|
|
94
|
+
| `wardrobe orders list` | The newest-**updated** orders across every project you can see — "what moved", not "what's new": a status change or a revision surfaces an old order here too |
|
|
95
|
+
| `wardrobe orders list --limit <n>` `--since <ISO>` | Same, paged (`--since` filters by `updatedAt >=`) |
|
|
92
96
|
| `wardrobe orders pdf <id> --out f.pdf` | The order PDF |
|
|
97
|
+
| `wardrobe quotations list --project <id>` | That project's quote number + full revision history |
|
|
98
|
+
| `wardrobe quotations list` | Every quotation you can see, **newest-generated first** — this is "latest quotes generation" |
|
|
99
|
+
| `wardrobe quotations list --limit <n>` `--since <ISO>` | Same, paged (`--since` filters by `updatedAt >=`, i.e. last generated at/after) |
|
|
100
|
+
| `wardrobe users list` | Registered accounts, **newest-registered first** — staff only, see below |
|
|
101
|
+
| `wardrobe users list --limit <n>` `--since <ISO>` | Same, paged (`--since` filters by `createdAt >=`) — `--limit 5` with no `--since` is "the latest registered users"; omit both, paging with `--since` off the last row's timestamp, for "every user in the system" |
|
|
102
|
+
| `wardrobe users by-phone <number>` | The account(s) tied to that phone number: the linked client account plus every designer who owns a project for a customer with it — staff only |
|
|
93
103
|
| `wardrobe help-texts` | The help-text table |
|
|
94
104
|
|
|
95
105
|
`projects list` already returns each project's **customer and owning designer inline** —
|
|
96
106
|
so "who is the customer on each of this designer's projects" is one call plus a filter,
|
|
97
107
|
never one call per project. Prefer `--phone` / `--designer` over fetching and grepping.
|
|
98
108
|
|
|
109
|
+
Every cross-project/cross-tenant list (`designs`, `orders`, `quotations`, `users`) takes
|
|
110
|
+
`--limit` (1–100, default 20) and a `--since` cursor — pass the last row's timestamp
|
|
111
|
+
back as `--since` to page further instead of guessing an offset. A malformed `--since` or
|
|
112
|
+
an out-of-range `--limit` is a `400`, not a silently-ignored filter — read the error
|
|
113
|
+
rather than retrying blind.
|
|
114
|
+
|
|
99
115
|
### What you can see is not what exists
|
|
100
116
|
|
|
101
117
|
The list is bounded by the key, so an empty result is as often a **visibility** answer as
|
|
102
118
|
a data one. `wardrobe whoami --json` reports the truth under `agent.scopes` and `role`:
|
|
103
119
|
|
|
104
|
-
- An ordinary designer or client sees **their own** projects
|
|
105
|
-
to. A project belonging to someone else
|
|
120
|
+
- An ordinary designer or client sees **their own** projects, designs, orders and
|
|
121
|
+
quotations, plus ones they were invited to. A project belonging to someone else
|
|
122
|
+
answers `403 Forbidden`, not `404`. `wardrobe users list` and `users by-phone` answer
|
|
123
|
+
`403 Forbidden` outright — there is no per-row visibility to fall back to; the whole
|
|
124
|
+
surface is staff-only (see below).
|
|
106
125
|
- A key approved by an **admin or support** user *and* carrying **`staff:read`** sees
|
|
107
|
-
**every** project, customer and
|
|
126
|
+
**every** project, customer, order and quotation in the system — and can use
|
|
127
|
+
`wardrobe users list` / `users by-phone` at all. That scope is granted only to
|
|
108
128
|
staff, only for GETs, and is listed by name on the consent screen. The same approver
|
|
109
129
|
also receives **`staff:write`**, which lets `designs create` / `designs update` land in
|
|
110
|
-
a project the admin does not own. A key logged in before 2026-09-05 lacks
|
|
111
|
-
|
|
130
|
+
a project the admin does not own. A key logged in before 2026-09-05 lacks `staff:read`
|
|
131
|
+
and before 2026-09-12 lacks `quotations:read` — a `403 insufficient_scope` on
|
|
132
|
+
`quotations list`, or a `403 Forbidden` on a write to someone else's project, means
|
|
133
|
+
`wardrobe login` again.
|
|
112
134
|
|
|
113
135
|
Never tell a user something does not exist when you only know your key cannot see it.
|
|
114
|
-
Say which it is: `403 Forbidden` means the row is someone else's, `
|
|
136
|
+
Say which it is: `403 Forbidden` means the row is someone else's (or, for `users`, that
|
|
137
|
+
your key isn't staff at all), `404` means it is gone.
|
|
138
|
+
|
|
139
|
+
### `wardrobe users` is a directory lookup, not a customer lookup
|
|
140
|
+
|
|
141
|
+
`users list` / `users by-phone` read the `User` **account** table — designers, admins,
|
|
142
|
+
support and self-serve clients who can sign in — not the per-project `Customer` contact
|
|
143
|
+
card `wardrobe customers` reads. A phone number usually resolves to a **designer**
|
|
144
|
+
(whoever owns the project for the customer with that number), occasionally to a
|
|
145
|
+
**client** account too (if that customer accepted a project invitation and has their own
|
|
146
|
+
login). It is normal for `users by-phone` to return more than one account, or to return
|
|
147
|
+
zero when the number belongs to a customer nobody has invited to sign in — that is not
|
|
148
|
+
an error, and it does not mean the phone number is unknown; check `wardrobe projects list
|
|
149
|
+
--phone <number>` for the project/customer side of the same question.
|
|
115
150
|
|
|
116
151
|
### Not available here
|
|
117
152
|
|
|
@@ -119,8 +154,6 @@ Don't reach for these; they are not CLI verbs and not agent-reachable:
|
|
|
119
154
|
|
|
120
155
|
- **Anything under `/admin`**, plus commissions and invitations — barred to every agent
|
|
121
156
|
key at the mount (`403 agent_not_permitted`). No scope unlocks them.
|
|
122
|
-
- **Quotation history.** `POST /quotations/pdf` is open to other clients, but reading a
|
|
123
|
-
project's past quotes is JWT-only — a human in the web app.
|
|
124
157
|
- **Manufacturing-files export.** Staff-only, through the web app.
|
|
125
158
|
|
|
126
159
|
## WardrobeConfig shape (top-level)
|
|
@@ -147,10 +180,11 @@ Prefer generating the skeleton with `wardrobe init` rather than hand-writing it
|
|
|
147
180
|
|
|
148
181
|
- **The CLI can read orders but never place one.** Its key carries `profile:read`,
|
|
149
182
|
`projects:read`, `customers:read`, `designs:read`, `designs:write`, `orders:read`,
|
|
150
|
-
`price:read` (+ `staff:read` and `staff:write` for staff) —
|
|
151
|
-
and so is every admin scope. `wardrobe
|
|
152
|
-
|
|
153
|
-
Don't attempt it, and
|
|
183
|
+
`price:read`, `quotations:read` (+ `staff:read` and `staff:write` for staff) —
|
|
184
|
+
**every write beyond designs is absent**, and so is every admin scope. `wardrobe
|
|
185
|
+
orders list`, `orders pdf` and `quotations list` work; creating or changing an order,
|
|
186
|
+
a customer or a quotation answers `403 insufficient_scope`. Don't attempt it, and
|
|
187
|
+
don't attempt admin/catalog operations.
|
|
154
188
|
- To turn a saved design into an order, direct the **human** to the web app: they
|
|
155
189
|
open the project, review the design, and complete the **verify-details** flow —
|
|
156
190
|
which computes the final price, freezes the PDF, and advances the order. Only a
|