create-crust 0.3.0 → 0.3.2

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.
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
- import{existsSync as wn,readdirSync as pi}from"node:fs";import{basename as yn,join as bi,resolve as ze}from"node:path";import{mkdir as On,writeFile as re}from"node:fs/promises";import{dirname as M,join as F,posix as Ue,resolve as ue,win32 as Ve}from"node:path";import{existsSync as qe,realpathSync as $n,statSync as Cn}from"node:fs";import{fileURLToPath as En}from"node:url";import{AsyncLocalStorage as xn}from"node:async_hooks";import{Writable as In}from"node:stream";import{parseArgs as jn}from"node:util";import{isPromise as Nn}from"node:util/types";import{homedir as kn}from"node:os";var p=class extends Error{code;details;cause;constructor(e,t,...n){super(t);this.name="CrustError",this.code=e,this.details=n[0]}is(e){return Object.is(this.code,e)}withCause(e){return this.cause=e,this}toJSON(){return{code:this.code,message:this.message,details:this.details}}};function se(e,t){if(e==="")throw new p("DEFINITION",`Flag ${t} spellings must be non-empty`,{subject:"flag",name:e,reason:"empty-spelling"});if(t!=="short"&&e.startsWith("no-"))throw new p("DEFINITION",`Flag ${t} "${e}" must not start with "no-"; the prefix is reserved for boolean negation`,{subject:"flag",name:e,reason:"reserved-no-prefix"});if(e==="__proto__")throw new p("DEFINITION",`Flag ${t} "__proto__" is a reserved spelling`,{subject:"flag",name:e,reason:"reserved-spelling"})}function He(e,t){return[e,...t.short===void 0?[]:[t.short],...t.aliases??[]]}function Je(e){return e.type==="boolean"&&e.noNegate!==!0}function Xe(e){if(e.choices&&e.default!==void 0){let t="multiple"in e&&e.multiple?e.default:[e.default];for(let n of t)if(!e.choices.includes(n))throw new p("DEFINITION","default must be one of choices")}return Object.freeze({...e,..."aliases"in e&&e.aliases?{aliases:Object.freeze([...e.aliases])}:{},...e.choices?{choices:Object.freeze([...e.choices])}:{},..."multiple"in e&&e.multiple&&Array.isArray(e.default)?{default:Object.freeze([...e.default])}:{}})}function Ze(e,t){if(se(e,"canonical"),t.short!==void 0)se(t.short,"short");for(let r of t.aliases??[])se(r,"alias");let n=He(e,t);if(new Set(n).size!==n.length)throw new p("DEFINITION",`Flag "${e}" repeats one of its own spellings`,{subject:"flag",name:e,reason:"flag-collision"});if(t.short!==void 0&&t.short.length!==1)throw new p("DEFINITION","Short flags must be one character");return Xe(t)}function Qe(e){if(e.name==="")throw new p("DEFINITION","Argument names must be non-empty",{subject:"argument",name:e.name,reason:"empty-name"});return Xe(e)}var An=Symbol("crust.defining");function q(e){return e[An]}var et=Symbol.for("crust.contextSources");function K(e,t){let n=new Set(e.map((o)=>o.name)),r=new Set,s=(o)=>{if(r.has(o))return;r.add(o);let i="contextName"in o?o.contextName:o.name;if(!n.has(i))throw new p("DEFINITION",`No provider for Context "${i}"`,{subject:"context",name:i,reason:"missing-context"});for(let a of o.uses)s(a)};for(let o of t)s(o)}function Tn(e){return typeof e==="function"}var _n=class{#e=[];#t=!1;#n(){if(this.#t)throw ReferenceError("AsyncDisposableStack is already disposed")}use(e){this.#n();let t=Pn(e)?e[Symbol.asyncDispose]:e[Symbol.dispose];return this.#e.push(()=>t.call(e)),e}defer(e){if(this.#n(),!Tn(e))throw TypeError("defer callback is not callable");this.#e.push(e)}async[Symbol.asyncDispose](){this.#t=!0;let e=[];for(let t=this.#e.length-1;t>=0;t--)try{await this.#e[t]()}catch(n){e.push(n)}if(e.length===1)throw e[0];if(e.length>1)throw AggregateError(e,"Disposal failed")}},Fn=globalThis.AsyncDisposableStack??_n;function Pn(e){return typeof e[Symbol.asyncDispose]==="function"}function Dn(e){if(e===null||typeof e!=="object"&&typeof e!=="function")return!1;let t=e;return typeof t[Symbol.asyncDispose]==="function"||typeof t[Symbol.dispose]==="function"}function Rn(e,t,n){if(!Dn(e)||n.has(e))return;n.add(e),t.use(e)}function Mn(e,t,n){let r=new Map(e.map((d)=>[d.name,d])),s=new Map,o=new WeakSet,i,a=!1;n.defer(()=>{a=!0});let c=(d,m,h=new Set)=>{if(d.name===m)return[d.name];if(h.has(d.name))return;h.add(d.name);for(let w of d.waitingOn){let S=s.get(w);if(!S)continue;let O=c(S,m,h);if(O)return[d.name,...O]}},l=(d)=>{try{let m=new Set;for(let h=d;h!=null&&!m.has(h);h=h.cause)if(m.add(h),h instanceof p&&h.code==="DEFINITION"&&h.details?.reason==="flags-before-validation")return!0;return!1}catch{return!1}};function u(d){let m=Promise.reject(d);return m.catch(()=>{}),m}let f=(d)=>(m)=>{let h=d?` (pulled while constructing Context "${d.name}")`:"";if(a)return u(new p("DEFINITION",`Context "${m}" cannot be pulled from onError because invocation Contexts have already been disposed.`,{subject:"context",name:m,reason:"context-after-disposal"}));let w=r.get(m);if(!w)return u(new p("DEFINITION",`No provider for Context "${m}". Add .provide(${m}(...)) to the app or an ancestor command.${h}`,{subject:"context",name:m,reason:"missing-context"}));if(i===void 0&&Object.keys(w.ownedFlags).length>0)return u(new p("DEFINITION",`Context "${m}" owns flags and cannot be pulled before flag validation${h}. Pull it from an action or a postRun hook after a validated invocation.`,{subject:"context",name:m,reason:"flags-before-validation"}));let S=s.get(m);if(!S){let O=Promise.withResolvers();O.promise.catch(()=>{}),S={name:m,promise:O.promise,resolve:O.resolve,reject:O.reject,waitingOn:new Set,settled:!1},s.set(m,S);let v=S;(async()=>{try{let C=Object.fromEntries(Object.keys(w.ownedFlags).map((x)=>[x,i?.[x]])),I=await w.setup({...t,flags:C,ctx:g(w.uses,v),defer(x){if(v.settled)throw new p("DEFINITION",`Context "${m}" cannot register cleanup after its setup has finished.`,{subject:"context",name:m,reason:"context-defer-after-setup"});n.defer(x)}});Rn(I,n,o),v.resolve(I)}catch(C){if(l(C))s.delete(m);v.reject(C)}finally{v.settled=!0}})()}if(d&&!S.settled){let O=c(S,d.name);if(O)return u(new p("DEFINITION",`Context dependency cycle: ${[d.name,...O].map((v)=>`"${v}"`).join(" -> ")}`,{subject:"context",name:d.name,reason:"context-cycle"}));return d.waitingOn.add(m),S.promise.finally(()=>d.waitingOn.delete(m))}return S.promise},g=(d,m)=>{let h={},w=(S)=>{let O="contextName"in S?S.contextName:S.name;if(Object.hasOwn(h,O))return;Object.defineProperty(h,O,{enumerable:!0,get:()=>f(m)(O)});for(let v of S.uses??[])w(v)};for(let S of d)w(S);return Object.defineProperty(h,et,{value:Object.freeze([...d])}),Object.freeze(h)};return{bag:(d)=>g(d,null),setValidatedFlags(d){i=d},async settle(){for(;;){let d=[...s.values()].filter((m)=>!m.settled);if(d.length===0)return;await Promise.allSettled(d.map((m)=>m.promise))}}}}var Bn=Object.freeze({[Symbol("crust.finished")]:!0});function ae(){return Bn}function tt(e){return{meta:{name:e},localFlags:{},ownedFlags:{},effectiveFlags:{},flagSpellings:new Map,args:[],subCommands:{},contexts:[],demands:[],extensions:[],run:void 0}}function A(e,t,n,r){n=Ze(t,n);let s=He(t,n),o=Object.hasOwn(e.effectiveFlags,t)?t:s.map((a)=>e.flagSpellings.get(a)?.canonicalName).find((a)=>a!==void 0);if(o!==void 0)throw new p("DEFINITION",`Flag "${t}" collides with existing flag "${o}" on command "${e.meta.name}"`,{subject:"flag",name:t,reason:"flag-collision"});(r==="local"?e.localFlags:e.ownedFlags)[t]=n,e.effectiveFlags[t]=n;let i={canonicalName:t,def:n,negatable:Je(n)};if(e.flagSpellings.set(t,{...i,kind:"canonical"}),n.short!==void 0)e.flagSpellings.set(n.short,{...i,kind:"short"});for(let a of n.aliases??[])e.flagSpellings.set(a,{...i,kind:"alias"})}function nt(e,t,n,r){if(A(e,t,n,"owned"),!r)return;for(let s of Object.values(e.subCommands))nt(s,t,n,!0)}function Ln(e,t,n){for(let r of t.commands??[])e.subCommands[r.name]=n(r,e,t.id)}function zn(e,t){for(let[n,r]of Object.entries(t.flags??{})){let{recursive:s=!0,...o}=r;nt(e,n,o,s)}}function T(e){let t={};for(let[n,r]of Object.entries(e.subCommands))t[n]=T(r);return{...e,meta:{...e.meta},localFlags:{...e.localFlags},ownedFlags:{...e.ownedFlags},effectiveFlags:{...e.effectiveFlags},flagSpellings:new Map([...e.flagSpellings].map(([n,r])=>[n,{...r,def:e.effectiveFlags[r.canonicalName]}])),args:[...e.args],subCommands:t,contexts:e.contexts.map((n)=>({...n})),demands:[...e.demands],extensions:[...e.extensions],run:e.run}}function Wn({subject:e,name:t}){return new p("DEFINITION",`${e==="command"?"Command":"Extension"} "${t}" contains invalid documentation sections`,{subject:e,name:t,reason:"invalid-sections"})}function rt(e,t){let{title:n,body:r,only:s,except:o}=e;if(!n.trim()||/[\r\n]/.test(n)||!r.trim()||s?.length===0||o?.length===0||s!==void 0&&o!==void 0)throw Wn(t);let i=(a)=>Object.freeze(a.map((c)=>typeof c==="string"?c:c.id));return Object.freeze({title:n,body:r,...s?{only:i(s)}:o?{except:i(o)}:{}})}function fe(e,t){return t.map((n)=>rt(n,{subject:"command",name:e}))}function Un(e,t,n){let r=e;for(let s of t){let o=Object.hasOwn(r.subCommands,s)?r.subCommands[s]:void 0;if(!o)throw new p("DEFINITION",`Extension "${n.id}" section target "${t.join(" ")}" is not a canonical command path`,{subject:"extension",name:n.id,reason:"invalid-section-path"});r=o}return r}function Vn(e,t,n){if(!t.sections)return;let r={subject:"extension",name:t.id},s=t.sections(n);for(let o of s){let i=rt(o,r),a=Un(e,o.command,t);a.meta.sections=[...a.meta.sections??[],i]}}function st(e,t,n){let r=T(e),s=new Set(t.flatMap((i)=>!n.has(i.id)&&e.extensions.includes(i)?[i.id]:[])),o=(i)=>{i.contexts=i.contexts.filter((u)=>u.extensionId===void 0||s.has(u.extensionId));let a=Object.keys(i.effectiveFlags),c=i.localFlags,l={};for(let{instance:u}of i.contexts)Object.assign(l,u.ownedFlags);i.localFlags={},i.ownedFlags={},i.effectiveFlags={},i.flagSpellings=new Map;for(let u of a){let f=Object.hasOwn(l,u)?"owned":"local",g=f==="owned"?l:c;if(Object.hasOwn(g,u))A(i,u,g[u],f)}for(let u of Object.values(i.subCommands))o(u)};o(r);for(let i of t){if(s.has(i.id))continue;let a=i.provides??[];if(a.length===0)continue;let c=(l,u)=>{let f=a.filter((m)=>!u.has(m.name)),g=f.map((m)=>({instance:m,extensionId:i.id}));l.contexts.push(...g);for(let m of f)for(let[h,w]of Object.entries(m.ownedFlags))A(l,h,w,"owned");let d=new WeakSet(l.contexts.map(({instance:m})=>m));for(let m of Object.values(l.subCommands)){let h=new Set(u);for(let{instance:w}of m.contexts)if(!d.has(w))h.add(w.name);c(m,h)}};c(r,new Set)}return r}function qn(e){let t=ue(e);if(qe(t)&&!Cn(t).isDirectory())t=M(t);while(!0){if(qe(F(t,"package.json")))return t;let n=M(t);if(n===t)return null;t=n}}var ot="CRUST_INTERNAL_BUILD_OUT_DIR";function Kn(){let{Bun:e,Deno:t}=globalThis,n=e?.main??"";return n.startsWith("/$bunfs/")||/^[A-Za-z]:[\\/]~BUN[\\/]/.test(n)||t?.build?.standalone===!0}function de(e){if(e===""||e==="."||e===".."||/[\\/]/.test(e))throw Error(`Artifact name must be a single directory name, got ${JSON.stringify(e)}.`);if(Kn())return F(M(process.execPath),e);return ue(En(import.meta.url),"..","..",e)}var Yn=Symbol.for("crustjs.terminal.io"),Gn=Symbol.for("crustjs.terminal.ambient-callbacks"),Hn=globalThis,Jn=globalThis,ce=Hn[Yn]??=new xn,it=Jn[Gn]??=new WeakMap;function Xn(e,t){let n=ce.getStore();return ce.run({input:e.input??n?.input,output:e.output??n?.output},t)}function Zn(e){let t="",n=new In({decodeStrings:!1,write(r,s,o){t+=r.toString();let i=t.indexOf(`
2
+ import{existsSync as En,readdirSync as bi}from"node:fs";import{basename as In,join as wi,resolve as ze}from"node:path";import{mkdir as Kn,writeFile as ae}from"node:fs/promises";import{dirname as Je,join as Xe,posix as Ze,resolve as Jn,win32 as Qe}from"node:path";import{existsSync as Ue,statSync as kn}from"node:fs";import{dirname as Ve,isAbsolute as Ii,join as An,resolve as Tn}from"node:path";function qe(e){let t=Tn(e);if(Ue(t)&&!kn(t).isDirectory())t=Ve(t);while(!0){if(Ue(An(t,"package.json")))return t;let n=Ve(t);if(n===t)return null;t=n}}import{realpathSync as _n}from"node:fs";import{dirname as Pn,join as ne,resolve as Fn}from"node:path";import{fileURLToPath as Rn}from"node:url";var re="CRUST_INTERNAL_BUILD_OUT_DIR";function Dn(){let{Bun:e,Deno:t}=globalThis,n=e?.main??"";return n.startsWith("/$bunfs/")||/^[A-Za-z]:[\\/]~BUN[\\/]/.test(n)||t?.build?.standalone===!0}function se(e){if(e===""||e==="."||e===".."||/[\\/]/.test(e))throw Error(`Artifact name must be a single directory name, got ${JSON.stringify(e)}.`);if(Dn())return ne(Pn(process.execPath),e);return Fn(Rn(import.meta.url),"..","..",e)}import{AsyncLocalStorage as Mn}from"node:async_hooks";import{Writable as Bn}from"node:stream";var Ln=Symbol.for("crustjs.terminal.io"),zn=Symbol.for("crustjs.terminal.ambient-callbacks"),Wn=globalThis,Un=globalThis,U=Wn[Ln]??=new Mn,He=Un[zn]??=new WeakMap;function oe(e,t){let n=U.getStore();return U.run({input:e.input??n?.input,output:e.output??n?.output},t)}function V(){return U.getStore()}function Vn(e){let t="",n=new Bn({decodeStrings:!1,write(r,s,o){t+=r.toString();let i=t.indexOf(`
3
3
  `);while(i!==-1)e.stderr(t.slice(0,i)),t=t.slice(i+1),i=t.indexOf(`
4
- `);o()}});return it.set(n,e),n}function at(e,t){let n=ce.getStore();return Xn({input:n?.input,output:n?.output&&!it.has(n.output)?n.output:Zn(e)},t)}function Qn(e){let t=Number(e);return Number.isNaN(t)?void 0:t}function er(e){return e==="true"||e==="1"}function tr(e){try{return new URL(e)}catch{throw new p("PARSE",`Invalid URL "${e}"${/^[a-z][a-z0-9+.-]*:/i.test(e)?"":" (missing protocol — e.g. https://example.com)"}`)}}function V(e){if(e==="")throw new p("PARSE","Path cannot be empty");let t=e.replace(/^~(?=\/|$)/,kn());return ue(process.cwd(),t)}function nr(e){try{return JSON.parse(e)}catch(t){throw new p("PARSE",`Invalid JSON: ${t instanceof Error?t.message:String(t)}. Tip: wrap JSON in single quotes on the command line, e.g. --flag '{"k":1}'`)}}function rr(e){let t={};for(let[n,r]of e){let s={type:r.def.type==="boolean"?"boolean":"string"};if(r.def.multiple)s.multiple=!0;if(r.kind==="canonical"){if(r.def.short)s.short=r.def.short;t[n]=s;continue}if(r.kind==="alias")t[n]=s}return t}function ct(e,t,n){if(t==="number"){let r=Qn(e);if(r===void 0)throw new p("PARSE",`Expected number for ${n}, got "${e}"`);return r}if(t==="boolean")return er(e);if(t==="url")return tr(e);if(t==="path")return V(e);if(t==="json")return nr(e);return e}function me(e,t,n){if(!t.includes(e))throw new p("PARSE",`Invalid value "${e}" for ${n}. Expected one of: ${t.join(", ")}`)}function B(e,t,n,r){let s=r===void 0?n:`${n} element [${r}]`,o;try{if(o=e(t),Nn(o))throw o.catch(()=>{}),Error("parse must be synchronous")}catch(i){throw new p("PARSE",`Failed to parse ${s}: ${i instanceof Error?i.message:String(i)}`).withCause(i)}return o}function lt(e,t){let{default:n,parse:r}=e;if(n===void 0)return;if(r){if(Array.isArray(n))return n.map((s,o)=>B(r,String(s),t,o));return B(r,String(n),t)}if(e.type==="path"){if(Array.isArray(n))return n.map((s)=>V(String(s)));return V(String(n))}return"multiple"in e&&e.multiple&&Array.isArray(n)?[...n]:n}function sr(e,t,n){if(n.kind==="boolean")return n.value;let r=`--${e}`,s=(o,i)=>{if(t.choices)me(o,t.choices,r);if(t.parse)return B(t.parse,o,r,i);return ct(o,t.type,r)};return Array.isArray(n.value)?n.value.map(s):s(n.value)}function or(e,t){let n={};for(let r of e){if(r.kind!=="option")continue;let{canonicalName:s,def:o}=t.get(r.name),i=n[s];if(o.type==="boolean"){let a=!r.rawName.startsWith("--no-");if(o.multiple&&i?.kind==="boolean"&&Array.isArray(i.value))i.value.push(a);else n[s]={kind:"boolean",value:o.multiple?[a]:a}}else{let a=r.value;if(o.multiple&&i?.kind==="string"&&Array.isArray(i.value))i.value.push(a);else n[s]={kind:"string",value:o.multiple?[a]:a}}}return n}function ir(e,t,n){let r={};for(let s of Object.keys(t))if(!Object.hasOwn(e,s)&&t[s]!==void 0)throw new p("PARSE",`Unknown flag "--${s}"`,{flag:s,reason:"unknown-flag"});for(let[s,o]of Object.entries(e)){let i=Object.hasOwn(t,s)?t[s]:void 0;if(!(i===void 0||o.multiple&&Array.isArray(i)&&i.length===0)){r[s]=n(s,o,i);continue}r[s]=lt(o,`--${s}`)}return r}function ar(e,t){for(let[n,r]of Object.entries(e))if(r.required===!0&&r.default===void 0){if(t[n]===void 0)throw new p("VALIDATION",`Missing required flag "--${n}"`)}}function cr(e,t,n,r){if(e.schema)return t;if(e.choices)me(t,e.choices,n);if(e.parse)return B(e.parse,t,n,r);return ct(t,e.type,n)}function lr(e,t,n){let r={},s=0;for(let o of e){let{name:i}=o,a=`<${i}>`;if(Object.defineProperty(r,i,{value:void 0,writable:!0,enumerable:!0,configurable:!0}),o.variadic)r[i]=t.slice(s).map((c,l)=>n(o,c,a,l)),s=t.length;else if(s<t.length)r[i]=n(o,t[s],a),s++;else r[i]=lt(o,a)}return{args:r,consumed:s}}function ur(e,t){for(let n of e){if(n==="--")return;if(!n.startsWith("--no-"))continue;let r=n.indexOf("="),s=r===-1?n.slice(5):n.slice(5,r),o=t.get(s);if(!o||o.def.type!=="boolean"||o.negatable)continue;throw new p("PARSE",`Flag "--${o.canonicalName}" does not support negation ("--no-${s}")`)}}function fr(e,t){let n=e.flagSpellings,r=rr(n);ur(t,n);let s;try{s=jn({args:t,options:r,strict:!0,allowPositionals:!0,allowNegative:!0,tokens:!0})}catch(c){if(c instanceof Error){let l=c.message.match(/Unknown option '(.+?)'/);if(l)throw new p("PARSE",`Unknown flag "${l[1]}"`).withCause(c);if("code"in c&&c.code==="ERR_PARSE_ARGS_INVALID_OPTION_VALUE"&&c.message.length>0)throw new p("PARSE",c.message).withCause(c)}throw new p("PARSE","Failed to parse command arguments").withCause(c)}let o=[],i=[],a=!1;for(let c of s.tokens){if(c.kind==="option-terminator"){a=!0;continue}if(c.kind==="positional")(a?o:i).push(c.value)}return{positionals:i,flagValues:or(s.tokens,n),rawArgs:o}}function dr(e,t,n){let r=e.schema?e.type==="boolean"?"boolean":"string":e.type,s;if(r==="url")s=t instanceof URL;else if(r==="json"){let o=[t],i=new Set;s=!0;while(o.length>0){let a=o.pop();if(a instanceof URL){s=!1;break}if(Array.isArray(a)&&!i.has(a))i.add(a),o.push(...a)}}else s=typeof t===(r==="path"?"string":r);if(!s)throw new p("PARSE",`Expected ${r} for ${n}`);if(t===!1&&"noNegate"in e&&e.noNegate)throw new p("PARSE",`Flag "${n}" does not support negation`)}function le(e,t,n,r){if(dr(e,t,n),e.choices)me(String(t),e.choices,n);if(e.parse)return B(e.parse,String(t),n,r);if(e.type==="path")return V(String(t));return t}function mr(e,t,n){let r=`--${e}`;if(t.multiple){if(!Array.isArray(n))throw new p("PARSE",`Expected an occurrence array for ${r}`);return n.map((s,o)=>le(t,s,r,o))}return le(t,n,r)}function ut(e,t,n,r,s){let o=ir(e.effectiveFlags,n,s);return{...lr(e.args,t,r),flags:o}}function gr(e,t){let{positionals:n,flagValues:r,rawArgs:s}=fr(e,t),{args:o,flags:i,consumed:a}=ut(e,n,r,cr,sr);return{args:o,flags:i,excessArgs:n.slice(a),rawArgs:s}}function hr(e,t){let{args:n,flags:r,raw:s}=t,o=[],i;for(let l of e.args){let u=n&&Object.hasOwn(n,l.name)?n[l.name]:void 0;if(u===void 0){i=l.name;continue}if(i!==void 0)throw new p("PARSE",`Argument <${l.name}> cannot be provided after omitted argument <${i}>`,{argument:l.name,reason:"positional-gap"});if(l.variadic){if(!Array.isArray(u))throw new p("PARSE",`Expected an occurrence array for <${l.name}>`);o.push(...u)}else o.push(u)}for(let l of Object.keys(n??{}))if(!e.args.some((u)=>u.name===l)&&n?.[l]!==void 0)throw new p("PARSE",`Unknown argument "${l}"`,{argument:l,reason:"unknown-argument"});let{args:a,flags:c}=ut(e,o,r??{},le,mr);return{args:a,flags:c,excessArgs:[],rawArgs:[...s??[]]}}function pr(e,t){let{args:n,effectiveFlags:r}=e,{args:s,flags:o}=t;if(t.excessArgs.length>0)throw new p("VALIDATION",`Unexpected positional argument${t.excessArgs.length===1?"":"s"}: ${t.excessArgs.map((i)=>JSON.stringify(i)).join(", ")}`);for(let i of n){let{name:a}=i,c=`argument "<${a}>"`,l=s[a];if(i.required===!0&&i.default===void 0){if(i.variadic){if(!Array.isArray(l)||l.length===0)throw new p("VALIDATION",`Missing required ${c}`)}else if(l===void 0)throw new p("VALIDATION",`Missing required ${c}`)}}ar(r,o)}function br(e){return typeof e==="number"}function wr(e){return e.map((t,n)=>br(t)?`[${t}]`:n>0?`.${String(t)}`:String(t)).join("")}function yr(e){return typeof e==="object"&&e!==null&&"key"in e}function vr(e){if(!e)return[];return e.map((t)=>yr(t)?t.key:t)}function Sr(e,t=[]){return e.map((n)=>{let r=vr(n.path),s=[...t,...r];return{message:n.message,path:wr(s)}})}async function Ke(e,t,n,r){let s=await e["~standard"].validate(t);if(s.issues)return r.push(...Sr(s.issues,n)),{ok:!1};return{ok:!0,value:s.value}}async function Or(e,t){let n=[],r=new Map(Object.entries(t.args)),s=new Map(Object.entries(t.flags));for(let o of e.args){if(o.schema===void 0)continue;let i=await Ke(o.schema,r.get(o.name),["args",o.name],n);if(i.ok)r.set(o.name,i.value)}for(let[o,i]of Object.entries(e.effectiveFlags)){if(i.schema===void 0)continue;let a=await Ke(i.schema,s.get(o),["flags",o],n);if(a.ok)s.set(o,a.value)}if(n.length>0)throw new p("VALIDATION",`Invalid input:
4
+ `);o()}});return He.set(n,e),n}function ie(e,t){let n=U.getStore();return oe({input:n?.input,output:n?.output&&!He.has(n.output)?n.output:Vn(e)},t)}import{parseArgs as Xn}from"node:util";import{isPromise as Zn}from"node:util/types";function Ge(e){let t=Number(e);return Number.isNaN(t)?void 0:t}function Ye(e){return e==="true"||e==="1"}import{homedir as Qn}from"node:os";function qn(e){return typeof e==="number"}function Hn(e){return e.map((t,n)=>qn(t)?`[${t}]`:n>0?`.${String(t)}`:String(t)).join("")}function Gn(e){return typeof e==="object"&&e!==null&&"key"in e}function Yn(e){if(!e)return[];return e.map((t)=>Gn(t)?t.key:t)}function Ke(e,t=[]){return e.map((n)=>{let r=Yn(n.path),s=[...t,...r];return{message:n.message,path:Hn(s)}})}var p=class extends Error{code;details;cause;constructor(e,t,...n){super(t);this.name="CrustError",this.code=e,this.details=n[0]}is(e){return Object.is(this.code,e)}withCause(e){return this.cause=e,this}toJSON(){return{code:this.code,message:this.message,details:this.details}}};function ce(e,t){if(e==="")throw new p("DEFINITION",`Flag ${t} spellings must be non-empty`,{subject:"flag",name:e,reason:"empty-spelling"});if(t!=="short"&&e.startsWith("no-"))throw new p("DEFINITION",`Flag ${t} "${e}" must not start with "no-"; the prefix is reserved for boolean negation`,{subject:"flag",name:e,reason:"reserved-no-prefix"});if(e==="__proto__")throw new p("DEFINITION",`Flag ${t} "__proto__" is a reserved spelling`,{subject:"flag",name:e,reason:"reserved-spelling"})}function rt(e,t){return[e,...t.short===void 0?[]:[t.short],...t.aliases??[]]}function st(e){return e.type==="boolean"&&e.noNegate!==!0}function ot(e){if(e.choices&&e.default!==void 0){let t="multiple"in e&&e.multiple?e.default:[e.default];for(let n of t)if(!e.choices.includes(n))throw new p("DEFINITION","default must be one of choices")}return Object.freeze({...e,..."aliases"in e&&e.aliases?{aliases:Object.freeze([...e.aliases])}:{},...e.choices?{choices:Object.freeze([...e.choices])}:{},..."multiple"in e&&e.multiple&&Array.isArray(e.default)?{default:Object.freeze([...e.default])}:{}})}function it(e,t){if(ce(e,"canonical"),t.short!==void 0)ce(t.short,"short");for(let r of t.aliases??[])ce(r,"alias");let n=rt(e,t);if(new Set(n).size!==n.length)throw new p("DEFINITION",`Flag "${e}" repeats one of its own spellings`,{subject:"flag",name:e,reason:"flag-collision"});if(t.short!==void 0&&t.short.length!==1)throw new p("DEFINITION","Short flags must be one character");return ot(t)}function at(e){if(e.name==="")throw new p("DEFINITION","Argument names must be non-empty",{subject:"argument",name:e.name,reason:"empty-name"});return ot(e)}var er=Symbol("crust.defining");function H(e){return e[er]}var ct=Symbol.for("crust.contextSources");function G(e,t){let n=new Set(e.map((o)=>o.name)),r=new Set,s=(o)=>{if(r.has(o))return;r.add(o);let i="contextName"in o?o.contextName:o.name;if(!n.has(i))throw new p("DEFINITION",`No provider for Context "${i}"`,{subject:"context",name:i,reason:"missing-context"});for(let a of o.uses)s(a)};for(let o of t)s(o)}function tr(e){return typeof e==="function"}var nr=class{#e=[];#t=!1;#n(){if(this.#t)throw ReferenceError("AsyncDisposableStack is already disposed")}use(e){this.#n();let t=sr(e)?e[Symbol.asyncDispose]:e[Symbol.dispose];return this.#e.push(()=>t.call(e)),e}defer(e){if(this.#n(),!tr(e))throw TypeError("defer callback is not callable");this.#e.push(e)}async[Symbol.asyncDispose](){this.#t=!0;let e=[];for(let t=this.#e.length-1;t>=0;t--)try{await this.#e[t]()}catch(n){e.push(n)}if(e.length===1)throw e[0];if(e.length>1)throw AggregateError(e,"Disposal failed")}},rr=globalThis.AsyncDisposableStack??nr;function sr(e){return typeof e[Symbol.asyncDispose]==="function"}function or(e){if(e===null||typeof e!=="object"&&typeof e!=="function")return!1;let t=e;return typeof t[Symbol.asyncDispose]==="function"||typeof t[Symbol.dispose]==="function"}function ir(e,t,n){if(!or(e)||n.has(e))return;n.add(e),t.use(e)}function ar(e,t,n){let r=new Map(e.map((d)=>[d.name,d])),s=new Map,o=new WeakSet,i,a=!1;n.defer(()=>{a=!0});let c=(d,m,h=new Set)=>{if(d.name===m)return[d.name];if(h.has(d.name))return;h.add(d.name);for(let w of d.waitingOn){let S=s.get(w);if(!S)continue;let x=c(S,m,h);if(x)return[d.name,...x]}},l=(d)=>{try{let m=new Set;for(let h=d;h!=null&&!m.has(h);h=h.cause)if(m.add(h),h instanceof p&&h.code==="DEFINITION"&&h.details?.reason==="flags-before-validation")return!0;return!1}catch{return!1}};function u(d){let m=Promise.reject(d);return m.catch(()=>{}),m}let f=(d)=>(m)=>{let h=d?` (pulled while constructing Context "${d.name}")`:"";if(a)return u(new p("DEFINITION",`Context "${m}" cannot be pulled from onError because invocation Contexts have already been disposed.`,{subject:"context",name:m,reason:"context-after-disposal"}));let w=r.get(m);if(!w)return u(new p("DEFINITION",`No provider for Context "${m}". Add .provide(${m}(...)) to the app or an ancestor command.${h}`,{subject:"context",name:m,reason:"missing-context"}));if(i===void 0&&Object.keys(w.ownedFlags).length>0)return u(new p("DEFINITION",`Context "${m}" owns flags and cannot be pulled before flag validation${h}. Pull it from an action or a postRun hook after a validated invocation.`,{subject:"context",name:m,reason:"flags-before-validation"}));let S=s.get(m);if(!S){let x=Promise.withResolvers();x.promise.catch(()=>{}),S={name:m,promise:x.promise,resolve:x.resolve,reject:x.reject,waitingOn:new Set,settled:!1},s.set(m,S);let v=S;(async()=>{try{let O=Object.fromEntries(Object.keys(w.ownedFlags).map((E)=>[E,i?.[E]])),I=await w.setup({...t,flags:O,ctx:g(w.uses,v),defer(E){if(v.settled)throw new p("DEFINITION",`Context "${m}" cannot register cleanup after its setup has finished.`,{subject:"context",name:m,reason:"context-defer-after-setup"});n.defer(E)}});ir(I,n,o),v.resolve(I)}catch(O){if(l(O))s.delete(m);v.reject(O)}finally{v.settled=!0}})()}if(d&&!S.settled){let x=c(S,d.name);if(x)return u(new p("DEFINITION",`Context dependency cycle: ${[d.name,...x].map((v)=>`"${v}"`).join(" -> ")}`,{subject:"context",name:d.name,reason:"context-cycle"}));return d.waitingOn.add(m),S.promise.finally(()=>d.waitingOn.delete(m))}return S.promise},g=(d,m)=>{let h={},w=(S)=>{let x="contextName"in S?S.contextName:S.name;if(Object.hasOwn(h,x))return;Object.defineProperty(h,x,{enumerable:!0,get:()=>f(m)(x)});for(let v of S.uses??[])w(v)};for(let S of d)w(S);return Object.defineProperty(h,ct,{value:Object.freeze([...d])}),Object.freeze(h)};return{bag:(d)=>g(d,null),setValidatedFlags(d){i=d},async settle(){for(;;){let d=[...s.values()].filter((m)=>!m.settled);if(d.length===0)return;await Promise.allSettled(d.map((m)=>m.promise))}}}}var cr=Object.freeze({[Symbol("crust.finished")]:!0});function fe(){return cr}function lt(e){return{meta:{name:e},localFlags:{},ownedFlags:{},effectiveFlags:{},flagSpellings:new Map,args:[],subCommands:{},contexts:[],demands:[],extensions:[],run:void 0}}function A(e,t,n,r){n=it(t,n);let s=rt(t,n),o=Object.hasOwn(e.effectiveFlags,t)?t:s.map((a)=>e.flagSpellings.get(a)?.canonicalName).find((a)=>a!==void 0);if(o!==void 0)throw new p("DEFINITION",`Flag "${t}" collides with existing flag "${o}" on command "${e.meta.name}"`,{subject:"flag",name:t,reason:"flag-collision"});(r==="local"?e.localFlags:e.ownedFlags)[t]=n,e.effectiveFlags[t]=n;let i={canonicalName:t,def:n,negatable:st(n)};if(e.flagSpellings.set(t,{...i,kind:"canonical"}),n.short!==void 0)e.flagSpellings.set(n.short,{...i,kind:"short"});for(let a of n.aliases??[])e.flagSpellings.set(a,{...i,kind:"alias"})}function ut(e,t,n,r){if(A(e,t,n,"owned"),!r)return;for(let s of Object.values(e.subCommands))ut(s,t,n,!0)}function lr(e,t,n){for(let r of t.commands??[])e.subCommands[r.name]=n(r,e,t.id)}function ur(e,t){for(let[n,r]of Object.entries(t.flags??{})){let{recursive:s=!0,...o}=r;ut(e,n,o,s)}}function T(e){let t={};for(let[n,r]of Object.entries(e.subCommands))t[n]=T(r);return{...e,meta:{...e.meta},localFlags:{...e.localFlags},ownedFlags:{...e.ownedFlags},effectiveFlags:{...e.effectiveFlags},flagSpellings:new Map([...e.flagSpellings].map(([n,r])=>[n,{...r,def:e.effectiveFlags[r.canonicalName]}])),args:[...e.args],subCommands:t,contexts:e.contexts.map((n)=>({...n})),demands:[...e.demands],extensions:[...e.extensions],run:e.run}}function fr({subject:e,name:t}){return new p("DEFINITION",`${e==="command"?"Command":"Extension"} "${t}" contains invalid documentation sections`,{subject:e,name:t,reason:"invalid-sections"})}function ft(e,t){let{title:n,body:r,only:s,except:o}=e;if(!n.trim()||/[\r\n]/.test(n)||!r.trim()||s?.length===0||o?.length===0||s!==void 0&&o!==void 0)throw fr(t);let i=(a)=>Object.freeze(a.map((c)=>typeof c==="string"?c:c.id));return Object.freeze({title:n,body:r,...s?{only:i(s)}:o?{except:i(o)}:{}})}function me(e,t){return t.map((n)=>ft(n,{subject:"command",name:e}))}function dr(e,t,n){let r=e;for(let s of t){let o=Object.hasOwn(r.subCommands,s)?r.subCommands[s]:void 0;if(!o)throw new p("DEFINITION",`Extension "${n.id}" section target "${t.join(" ")}" is not a canonical command path`,{subject:"extension",name:n.id,reason:"invalid-section-path"});r=o}return r}function mr(e,t,n){if(!t.sections)return;let r={subject:"extension",name:t.id},s=t.sections(n);for(let o of s){let i=ft(o,r),a=dr(e,o.command,t);a.meta.sections=[...a.meta.sections??[],i]}}function dt(e,t,n){let r=T(e),s=new Set(t.flatMap((i)=>!n.has(i.id)&&e.extensions.includes(i)?[i.id]:[])),o=(i)=>{i.contexts=i.contexts.filter((u)=>u.extensionId===void 0||s.has(u.extensionId));let a=Object.keys(i.effectiveFlags),c=i.localFlags,l={};for(let{instance:u}of i.contexts)Object.assign(l,u.ownedFlags);i.localFlags={},i.ownedFlags={},i.effectiveFlags={},i.flagSpellings=new Map;for(let u of a){let f=Object.hasOwn(l,u)?"owned":"local",g=f==="owned"?l:c;if(Object.hasOwn(g,u))A(i,u,g[u],f)}for(let u of Object.values(i.subCommands))o(u)};o(r);for(let i of t){if(s.has(i.id))continue;let a=i.provides??[];if(a.length===0)continue;let c=(l,u)=>{let f=a.filter((m)=>!u.has(m.name)),g=f.map((m)=>({instance:m,extensionId:i.id}));l.contexts.push(...g);for(let m of f)for(let[h,w]of Object.entries(m.ownedFlags))A(l,h,w,"owned");let d=new WeakSet(l.contexts.map(({instance:m})=>m));for(let m of Object.values(l.subCommands)){let h=new Set(u);for(let{instance:w}of m.contexts)if(!d.has(w))h.add(w.name);c(m,h)}};c(r,new Set)}return r}function gr(e){try{return new URL(e)}catch{throw new p("PARSE",`Invalid URL "${e}"${/^[a-z][a-z0-9+.-]*:/i.test(e)?"":" (missing protocol — e.g. https://example.com)"}`)}}function q(e){if(e==="")throw new p("PARSE","Path cannot be empty");let t=e.replace(/^~(?=\/|$)/,Qn());return Jn(process.cwd(),t)}function hr(e){try{return JSON.parse(e)}catch(t){throw new p("PARSE",`Invalid JSON: ${t instanceof Error?t.message:String(t)}. Tip: wrap JSON in single quotes on the command line, e.g. --flag '{"k":1}'`)}}function pr(e){let t={};for(let[n,r]of e){let s={type:r.def.type==="boolean"?"boolean":"string"};if(r.def.multiple)s.multiple=!0;if(r.kind==="canonical"){if(r.def.short)s.short=r.def.short;t[n]=s;continue}if(r.kind==="alias")t[n]=s}return t}function mt(e,t,n){if(t==="number"){let r=Ge(e);if(r===void 0)throw new p("PARSE",`Expected number for ${n}, got "${e}"`);return r}if(t==="boolean")return Ye(e);if(t==="url")return gr(e);if(t==="path")return q(e);if(t==="json")return hr(e);return e}function ge(e,t,n){if(!t.includes(e))throw new p("PARSE",`Invalid value "${e}" for ${n}. Expected one of: ${t.join(", ")}`)}function D(e,t,n,r){let s=r===void 0?n:`${n} element [${r}]`,o;try{if(o=e(t),Zn(o))throw o.catch(()=>{}),Error("parse must be synchronous")}catch(i){throw new p("PARSE",`Failed to parse ${s}: ${i instanceof Error?i.message:String(i)}`).withCause(i)}return o}function gt(e,t){let{default:n,parse:r}=e;if(n===void 0)return;if(r){if(Array.isArray(n))return n.map((s,o)=>D(r,String(s),t,o));return D(r,String(n),t)}if(e.type==="path"){if(Array.isArray(n))return n.map((s)=>q(String(s)));return q(String(n))}return"multiple"in e&&e.multiple&&Array.isArray(n)?[...n]:n}function br(e,t,n){if(n.kind==="boolean")return n.value;let r=`--${e}`,s=(o,i)=>{if(t.choices)ge(o,t.choices,r);if(t.parse)return D(t.parse,o,r,i);return mt(o,t.type,r)};return Array.isArray(n.value)?n.value.map(s):s(n.value)}function wr(e,t){let n={};for(let r of e){if(r.kind!=="option")continue;let{canonicalName:s,def:o}=t.get(r.name),i=n[s];if(o.type==="boolean"){let a=!r.rawName.startsWith("--no-");if(o.multiple&&i?.kind==="boolean"&&Array.isArray(i.value))i.value.push(a);else n[s]={kind:"boolean",value:o.multiple?[a]:a}}else{let a=r.value;if(o.multiple&&i?.kind==="string"&&Array.isArray(i.value))i.value.push(a);else n[s]={kind:"string",value:o.multiple?[a]:a}}}return n}function yr(e,t,n){let r={};for(let s of Object.keys(t))if(!Object.hasOwn(e,s)&&t[s]!==void 0)throw new p("PARSE",`Unknown flag "--${s}"`,{flag:s,reason:"unknown-flag"});for(let[s,o]of Object.entries(e)){let i=Object.hasOwn(t,s)?t[s]:void 0;if(!(i===void 0||o.multiple&&Array.isArray(i)&&i.length===0)){r[s]=n(s,o,i);continue}r[s]=gt(o,`--${s}`)}return r}function vr(e,t){for(let[n,r]of Object.entries(e))if(r.required===!0&&r.default===void 0){if(t[n]===void 0)throw new p("VALIDATION",`Missing required flag "--${n}"`)}}function Sr(e,t,n,r){if(e.schema)return t;if(e.choices)ge(t,e.choices,n);if(e.parse)return D(e.parse,t,n,r);return mt(t,e.type,n)}function xr(e,t,n){let r={},s=0;for(let o of e){let{name:i}=o,a=`<${i}>`;if(Object.defineProperty(r,i,{value:void 0,writable:!0,enumerable:!0,configurable:!0}),o.variadic)r[i]=t.slice(s).map((c,l)=>n(o,c,a,l)),s=t.length;else if(s<t.length)r[i]=n(o,t[s],a),s++;else r[i]=gt(o,a)}return{args:r,consumed:s}}function Or(e,t){for(let n of e){if(n==="--")return;if(!n.startsWith("--no-"))continue;let r=n.indexOf("="),s=r===-1?n.slice(5):n.slice(5,r),o=t.get(s);if(!o||o.def.type!=="boolean"||o.negatable)continue;throw new p("PARSE",`Flag "--${o.canonicalName}" does not support negation ("--no-${s}")`)}}function $r(e,t){let n=e.flagSpellings,r=pr(n);Or(t,n);let s;try{s=Xn({args:t,options:r,strict:!0,allowPositionals:!0,allowNegative:!0,tokens:!0})}catch(c){if(c instanceof Error){let l=c.message.match(/Unknown option '(.+?)'/);if(l)throw new p("PARSE",`Unknown flag "${l[1]}"`).withCause(c);if("code"in c&&c.code==="ERR_PARSE_ARGS_INVALID_OPTION_VALUE"&&c.message.length>0)throw new p("PARSE",c.message).withCause(c)}throw new p("PARSE","Failed to parse command arguments").withCause(c)}let o=[],i=[],a=!1;for(let c of s.tokens){if(c.kind==="option-terminator"){a=!0;continue}if(c.kind==="positional")(a?o:i).push(c.value)}return{positionals:i,flagValues:wr(s.tokens,n),rawArgs:o}}function Cr(e,t,n){let r=e.schema?e.type==="boolean"?"boolean":"string":e.type,s;if(r==="url")s=t instanceof URL;else if(r==="json"){let o=[t],i=new Set;s=!0;while(o.length>0){let a=o.pop();if(a instanceof URL){s=!1;break}if(Array.isArray(a)&&!i.has(a))i.add(a),o.push(...a)}}else s=typeof t===(r==="path"?"string":r);if(!s)throw new p("PARSE",`Expected ${r} for ${n}`);if(t===!1&&"noNegate"in e&&e.noNegate)throw new p("PARSE",`Flag "${n}" does not support negation`)}function de(e,t,n,r){if(Cr(e,t,n),e.choices)ge(String(t),e.choices,n);if(e.parse)return D(e.parse,String(t),n,r);if(e.type==="path")return q(String(t));return t}function Er(e,t,n){let r=`--${e}`;if(t.multiple){if(!Array.isArray(n))throw new p("PARSE",`Expected an occurrence array for ${r}`);return n.map((s,o)=>de(t,s,r,o))}return de(t,n,r)}function ht(e,t,n,r,s){let o=yr(e.effectiveFlags,n,s);return{...xr(e.args,t,r),flags:o}}function Ir(e,t){let{positionals:n,flagValues:r,rawArgs:s}=$r(e,t),{args:o,flags:i,consumed:a}=ht(e,n,r,Sr,br);return{args:o,flags:i,excessArgs:n.slice(a),rawArgs:s}}function jr(e,t){let{args:n,flags:r,raw:s}=t,o=[],i;for(let l of e.args){let u=n&&Object.hasOwn(n,l.name)?n[l.name]:void 0;if(u===void 0){i=l.name;continue}if(i!==void 0)throw new p("PARSE",`Argument <${l.name}> cannot be provided after omitted argument <${i}>`,{argument:l.name,reason:"positional-gap"});if(l.variadic){if(!Array.isArray(u))throw new p("PARSE",`Expected an occurrence array for <${l.name}>`);o.push(...u)}else o.push(u)}for(let l of Object.keys(n??{}))if(!e.args.some((u)=>u.name===l)&&n?.[l]!==void 0)throw new p("PARSE",`Unknown argument "${l}"`,{argument:l,reason:"unknown-argument"});let{args:a,flags:c}=ht(e,o,r??{},de,Er);return{args:a,flags:c,excessArgs:[],rawArgs:[...s??[]]}}function Nr(e,t){let{args:n,effectiveFlags:r}=e,{args:s,flags:o}=t;if(t.excessArgs.length>0)throw new p("VALIDATION",`Unexpected positional argument${t.excessArgs.length===1?"":"s"}: ${t.excessArgs.map((i)=>JSON.stringify(i)).join(", ")}`);for(let i of n){let{name:a}=i,c=`argument "<${a}>"`,l=s[a];if(i.required===!0&&i.default===void 0){if(i.variadic){if(!Array.isArray(l)||l.length===0)throw new p("VALIDATION",`Missing required ${c}`)}else if(l===void 0)throw new p("VALIDATION",`Missing required ${c}`)}}vr(r,o)}async function et(e,t,n,r){let s=await e["~standard"].validate(t);if(s.issues)return r.push(...Ke(s.issues,n)),{ok:!1};return{ok:!0,value:s.value}}async function kr(e,t){let n=[],r=new Map(Object.entries(t.args)),s=new Map(Object.entries(t.flags));for(let o of e.args){if(o.schema===void 0)continue;let i=await et(o.schema,r.get(o.name),["args",o.name],n);if(i.ok)r.set(o.name,i.value)}for(let[o,i]of Object.entries(e.effectiveFlags)){if(i.schema===void 0)continue;let a=await et(i.schema,s.get(o),["flags",o],n);if(a.ok)s.set(o,a.value)}if(n.length>0)throw new p("VALIDATION",`Invalid input:
5
5
  ${n.map((o)=>` - ${o.path}: ${o.message}`).join(`
6
- `)}`,{issues:n});return{args:Object.fromEntries(r),flags:Object.fromEntries(s)}}function ft(e){return e.meta.hidden!==!0}function ge(e){for(let t of Object.keys(e))if(e[t]===void 0)delete e[t];return Object.freeze(e)}function he(e){if(e instanceof URL)return e.href;if(Array.isArray(e))return Object.freeze(e.map(he));return e}function $r(e){return ge({name:e.name,type:e.type,description:e.description,required:e.required,variadic:e.variadic,choices:e.choices?Object.freeze([...e.choices]):void 0,default:he(e.default)})}function Cr(e){return ge({type:e.type,description:e.description,short:e.short,aliases:e.aliases?Object.freeze([...e.aliases]):void 0,required:e.required,multiple:e.multiple,negatable:Je(e),noNegate:"noNegate"in e?e.noNegate:void 0,choices:e.choices?Object.freeze([...e.choices]):void 0,default:he(e.default)})}function j(e){let t={};for(let[r,s]of Object.entries(e.effectiveFlags))t[r]=Cr(s);let n={};for(let[r,s]of Object.entries(e.subCommands))n[r]=j(s);return Object.freeze({meta:ge({name:e.meta.name,description:e.meta.description,version:e.meta.version,usage:e.meta.usage,sections:e.meta.sections?Object.freeze(e.meta.sections.map((r)=>Object.freeze({...r}))):void 0,aliases:e.meta.aliases?Object.freeze([...e.meta.aliases]):void 0,hidden:e.meta.hidden}),hasAction:e.run!==void 0,args:Object.freeze(e.args.map($r)),flags:Object.freeze(t),subCommands:Object.freeze(n)})}function Er(e,t){for(let[n,r]of Object.entries(e)){let s=r.meta.aliases;if(!s)continue;if(s.includes(t))return{canonicalName:n,node:r}}return null}function Ye(e,t){if(t==="--")return null;if(t.startsWith("--")){let r=t.indexOf("="),s=r===-1?t.slice(2):t.slice(2,r),o=e.get(s);if(o)return{consumesValue:o.def.type!=="boolean"&&r===-1};if(s.startsWith("no-")){if(e.get(s.slice(3))?.negatable)return{consumesValue:!1}}return null}let n=t.slice(1);if(n.length===0)return null;for(let r=0;r<n.length;r++){let s=e.get(n[r]);if(!s)return null;if(s.def.type!=="boolean")return{consumesValue:r===n.length-1}}return{consumesValue:!1}}function dt(e,t){let n=[e.meta.name],r=e,s=t,o=[],i=[],a=(c,l)=>{if(i.length===0)return;let u=c.flagSpellings;for(let{token:f,consumesValue:g}of i){let d=Ye(u,f);if(d!==null&&d.consumesValue===g)continue;throw new p("PARSE",`Flag "${f}" cannot be used before subcommand "${l}" because "${l}" does not accept it.`,{flag:f,reason:"flag-not-forwardable"})}};while(s.length>0){let c=r.subCommands;if(Object.keys(c).length===0)break;let l=s[0];if(!l)break;if(l.startsWith("-")){let g=Ye(r.flagSpellings,l);if(!g)break;o.push(l),i.push({token:l,consumesValue:g.consumesValue}),s=s.slice(1);let d=s[0];if(g.consumesValue&&d!==void 0)o.push(d),s=s.slice(1);continue}if(Object.hasOwn(c,l)&&c[l]){a(c[l],l),r=c[l],n.push(l),s=s.slice(1);continue}let u=Er(c,l);if(u){a(u.node,l),r=u.node,n.push(u.canonicalName),s=s.slice(1);continue}if(r.run)break;let f=j(r);throw new p("COMMAND_NOT_FOUND",`Unknown command "${l}".`,{input:l,available:Object.entries(f.subCommands).flatMap(([g,d])=>ft(d)?[g]:[]),commandPath:[...n],parentCommand:f})}return{command:r,argv:[...o,...s],commandPath:n}}function xr(){var e=typeof SuppressedError=="function"?SuppressedError:function(s,o){var i=Error();return i.name="SuppressedError",i.error=s,i.suppressed=o,i},t={},n=[];function r(s,o){if(o!=null){if(Object(o)!==o)throw TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(s)var i=o[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(i===void 0&&(i=o[Symbol.dispose||Symbol.for("Symbol.dispose")],s))var a=i;if(typeof i!="function")throw TypeError("Object is not disposable.");a&&(i=function(){try{a.call(o)}catch(l){return Promise.reject(l)}}),n.push({v:o,d:i,a:s})}else s&&n.push({d:o,a:s});return o}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var o,i=this.e,a=0;function c(){for(;o=n.pop();)try{if(!o.a&&a===1)return a=0,n.push(o),Promise.resolve().then(c);if(o.d){var u=o.d.call(o.v);if(o.a)return a|=2,Promise.resolve(u).then(c,l)}else a|=1}catch(f){return l(f)}if(a===1)return i!==t?Promise.reject(i):Promise.resolve();if(i!==t)throw i}function l(u){return i=i!==t?new e(u,i):u,c()}return c()}}}var Ir={stdout:(e)=>console.log(e),stderr:(e)=>console.error(e)},jr="CRUST_INTERNAL_SNAPSHOT_PATH",R=130;function oe(e){if(!(e instanceof Error))return!1;return e.name==="AbortError"}function mt(e){if(Object.freeze(e),Object.freeze(e.localFlags),Object.freeze(e.ownedFlags),Object.freeze(e.effectiveFlags),e.meta.sections)Object.freeze(e.meta.sections);Object.freeze(e.meta),Object.freeze(e.contexts),Object.freeze(e.extensions),Object.freeze(e.args);for(let t of Object.values(e.subCommands))mt(t);Object.freeze(e.subCommands)}function Nr(e){return typeof e==="symbol"}function kr(e){let t=Ue.normalize(e.replaceAll("\\","/")),n=/^[A-Za-z]:/;if(Ue.isAbsolute(t)||Ve.isAbsolute(e)||Ve.isAbsolute(t)||n.test(e)||n.test(t))throw Error(`Artifact path "${e}" must be relative to outDir.`);if(t===".."||t.startsWith("../"))throw Error(`Artifact path "${e}" escapes outDir.`);if(t==="."||t==="./")throw Error(`Artifact path "${e}" must name a file inside outDir.`);return t}var Ge=new WeakMap;function gt(e,t){let n=T(e),r=Object.freeze([...e.extensions]);for(let s of r)Ln(n,s,t);for(let s of r)zn(n,s);return{rootNode:n,extensions:r}}function ht(e,t){let n=j(e);for(let r of t)Vn(e,r,n);return mt(e),e}function L(e,t){let n=Ge.get(e);if(n)return n;let r=gt(e,t);return ht(r.rootNode,r.extensions),Ge.set(e,r),r}function Ar(e,t){let n=dt(e,[...t]);return{argv:t,route:n,parsed:gr(n.command,n.argv)}}function pe(e,t){let n=dt(e,[...t]);if(n.argv.length>0){let r=n.argv[0],s=j(n.command);throw new p("COMMAND_NOT_FOUND",`Unknown command "${r}".`,{input:r,available:Object.entries(s.subCommands).flatMap(([o,i])=>ft(i)?[o]:[]),commandPath:n.commandPath,parentCommand:s})}return n}function Tr(e,t,n){let r=pe(e,t);return{argv:t,route:r,parsed:hr(r.command,n)}}async function pt(e,t,n,r,s){try{var o=xr();let{rootNode:i,extensions:a}=t,{argv:c,route:l,parsed:u}="argv"in e?Ar(i,e.argv):Tr(i,e.path,e.input),f=l.command,g=o.a(new Fn),d=f.contexts.map(({instance:C})=>C),m=Mn(d,n,g),h=j(i),w=Object.freeze({argv:[...c],rootCommand:h,command:f===i?h:j(f),commandPath:Object.freeze([...l.commandPath]),args:u.args,flags:u.flags,rawArgs:u.rawArgs,ctx:m.bag(a.flatMap((C)=>C.uses??[])),finish:ae,stdout:n.stdout,stderr:n.stderr});r?.(w);let S=async()=>{pr(f,u);let C=await Or(f,u);if(m.setValidatedFlags(C.flags),!f.run)return;let I={args:C.args,flags:C.flags,ctx:m.bag(d),rawArgs:u.rawArgs,command:w.command,rootCommand:h,stdout:n.stdout,stderr:n.stderr};return await f.run(I)},O,v={status:"completed"};try{try{for(let x of a)if(await x.hooks?.preRun?.(w)===ae()){v={status:"finished",by:x.id};break}if(v.status!=="finished")O=await S()}catch(x){let E=await s?.(x,w);v={status:"failed",error:x,...E===void 0?{}:{by:E}}}Object.freeze(v);let C=!1,I;for(let x of a.toReversed())try{await x.hooks?.postRun?.(w,v)}catch(E){if(v.status!=="failed"&&!C)C=!0,I=E}if(v.status==="failed")throw v.error;if(C)throw I}finally{await m.settle()}return v.status==="finished"?{status:"finished",by:v.by}:{status:"completed",result:O}}catch(i){o.e=i}finally{await o.d()}}async function ie(e,t,n,r,s,o=!1){let i=()=>{if(o)return;let u=e instanceof Error?e.message:String(e);r.stderr(`Error: ${u}`)};function a(u){return Promise.reject(new p("DEFINITION",`Context "${String(u)}" cannot be pulled from onError because invocation Contexts have already been disposed.`,{subject:"context",name:String(u),reason:"context-after-disposal"}))}let c=new Proxy({},{get:(u,f)=>f==="then"||Nr(f)?void 0:a(f)}),l=s??Object.freeze({argv:[...t],rootCommand:j(n.rootNode),command:j(n.rootNode),commandPath:Object.freeze([n.rootNode.meta.name]),args:Object.freeze({}),flags:Object.freeze({}),rawArgs:[],finish:ae,stdout:r.stdout,stderr:r.stderr,ctx:c});try{for(let u of n.extensions)if(await u.hooks?.onError?.(e,l))return u.id}catch{}i()}function _r(e){return e!==void 0&&Object.keys(e).length>0}async function be(e,t,n,r){let s=[],o=[];try{let i={...n},a={stdout(c){s.push(c),i.stdout?.(c)},stderr(c){o.push(c),i.stderr?.(c)}};return{...await at(a,async()=>await pt(t,L(e,r),a)),stdout:s.join(`
6
+ `)}`,{issues:n});return{args:Object.fromEntries(r),flags:Object.fromEntries(s)}}function pt(e){return e.meta.hidden!==!0}function he(e){for(let t of Object.keys(e))if(e[t]===void 0)delete e[t];return Object.freeze(e)}function pe(e){if(e instanceof URL)return e.href;if(Array.isArray(e))return Object.freeze(e.map(pe));return e}function Ar(e){return he({name:e.name,type:e.type,description:e.description,required:e.required,variadic:e.variadic,choices:e.choices?Object.freeze([...e.choices]):void 0,default:pe(e.default)})}function Tr(e){return he({type:e.type,description:e.description,short:e.short,aliases:e.aliases?Object.freeze([...e.aliases]):void 0,required:e.required,multiple:e.multiple,negatable:st(e),noNegate:"noNegate"in e?e.noNegate:void 0,choices:e.choices?Object.freeze([...e.choices]):void 0,default:pe(e.default)})}function j(e){let t={};for(let[r,s]of Object.entries(e.effectiveFlags))t[r]=Tr(s);let n={};for(let[r,s]of Object.entries(e.subCommands))n[r]=j(s);return Object.freeze({meta:he({name:e.meta.name,description:e.meta.description,version:e.meta.version,usage:e.meta.usage,sections:e.meta.sections?Object.freeze(e.meta.sections.map((r)=>Object.freeze({...r}))):void 0,aliases:e.meta.aliases?Object.freeze([...e.meta.aliases]):void 0,hidden:e.meta.hidden}),hasAction:e.run!==void 0,args:Object.freeze(e.args.map(Ar)),flags:Object.freeze(t),subCommands:Object.freeze(n)})}function _r(e,t){for(let[n,r]of Object.entries(e)){let s=r.meta.aliases;if(!s)continue;if(s.includes(t))return{canonicalName:n,node:r}}return null}function tt(e,t){if(t==="--")return null;if(t.startsWith("--")){let r=t.indexOf("="),s=r===-1?t.slice(2):t.slice(2,r),o=e.get(s);if(o)return{consumesValue:o.def.type!=="boolean"&&r===-1};if(s.startsWith("no-")){if(e.get(s.slice(3))?.negatable)return{consumesValue:!1}}return null}let n=t.slice(1);if(n.length===0)return null;for(let r=0;r<n.length;r++){let s=e.get(n[r]);if(!s)return null;if(s.def.type!=="boolean")return{consumesValue:r===n.length-1}}return{consumesValue:!1}}function bt(e,t){let n=[e.meta.name],r=e,s=t,o=[],i=[],a=(c,l)=>{if(i.length===0)return;let u=c.flagSpellings;for(let{token:f,consumesValue:g}of i){let d=tt(u,f);if(d!==null&&d.consumesValue===g)continue;throw new p("PARSE",`Flag "${f}" cannot be used before subcommand "${l}" because "${l}" does not accept it.`,{flag:f,reason:"flag-not-forwardable"})}};while(s.length>0){let c=r.subCommands;if(Object.keys(c).length===0)break;let l=s[0];if(!l)break;if(l.startsWith("-")){let g=tt(r.flagSpellings,l);if(!g)break;o.push(l),i.push({token:l,consumesValue:g.consumesValue}),s=s.slice(1);let d=s[0];if(g.consumesValue&&d!==void 0)o.push(d),s=s.slice(1);continue}if(Object.hasOwn(c,l)&&c[l]){a(c[l],l),r=c[l],n.push(l),s=s.slice(1);continue}let u=_r(c,l);if(u){a(u.node,l),r=u.node,n.push(u.canonicalName),s=s.slice(1);continue}if(r.run)break;let f=j(r);throw new p("COMMAND_NOT_FOUND",`Unknown command "${l}".`,{input:l,available:Object.entries(f.subCommands).flatMap(([g,d])=>pt(d)?[g]:[]),commandPath:[...n],parentCommand:f})}return{command:r,argv:[...o,...s],commandPath:n}}function Pr(){var e=typeof SuppressedError=="function"?SuppressedError:function(s,o){var i=Error();return i.name="SuppressedError",i.error=s,i.suppressed=o,i},t={},n=[];function r(s,o){if(o!=null){if(Object(o)!==o)throw TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(s)var i=o[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(i===void 0&&(i=o[Symbol.dispose||Symbol.for("Symbol.dispose")],s))var a=i;if(typeof i!="function")throw TypeError("Object is not disposable.");a&&(i=function(){try{a.call(o)}catch(l){return Promise.reject(l)}}),n.push({v:o,d:i,a:s})}else s&&n.push({d:o,a:s});return o}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var o,i=this.e,a=0;function c(){for(;o=n.pop();)try{if(!o.a&&a===1)return a=0,n.push(o),Promise.resolve().then(c);if(o.d){var u=o.d.call(o.v);if(o.a)return a|=2,Promise.resolve(u).then(c,l)}else a|=1}catch(f){return l(f)}if(a===1)return i!==t?Promise.reject(i):Promise.resolve();if(i!==t)throw i}function l(u){return i=i!==t?new e(u,i):u,c()}return c()}}}var Fr={stdout:(e)=>console.log(e),stderr:(e)=>console.error(e)},Rr="CRUST_INTERNAL_SNAPSHOT_PATH",R=130;function le(e){if(!(e instanceof Error))return!1;return e.name==="AbortError"}function wt(e){if(Object.freeze(e),Object.freeze(e.localFlags),Object.freeze(e.ownedFlags),Object.freeze(e.effectiveFlags),e.meta.sections)Object.freeze(e.meta.sections);Object.freeze(e.meta),Object.freeze(e.contexts),Object.freeze(e.extensions),Object.freeze(e.args);for(let t of Object.values(e.subCommands))wt(t);Object.freeze(e.subCommands)}function Dr(e){return typeof e==="symbol"}function Mr(e){let t=Ze.normalize(e.replaceAll("\\","/")),n=/^[A-Za-z]:/;if(Ze.isAbsolute(t)||Qe.isAbsolute(e)||Qe.isAbsolute(t)||n.test(e)||n.test(t))throw Error(`Artifact path "${e}" must be relative to outDir.`);if(t===".."||t.startsWith("../"))throw Error(`Artifact path "${e}" escapes outDir.`);if(t==="."||t==="./")throw Error(`Artifact path "${e}" must name a file inside outDir.`);return t}var nt=new WeakMap;function yt(e,t){let n=T(e),r=Object.freeze([...e.extensions]);for(let s of r)lr(n,s,t);for(let s of r)ur(n,s);return{rootNode:n,extensions:r}}function vt(e,t){let n=j(e);for(let r of t)mr(e,r,n);return wt(e),e}function M(e,t){let n=nt.get(e);if(n)return n;let r=yt(e,t);return vt(r.rootNode,r.extensions),nt.set(e,r),r}function Br(e,t){let n=bt(e,[...t]);return{argv:t,route:n,parsed:Ir(n.command,n.argv)}}function be(e,t){let n=bt(e,[...t]);if(n.argv.length>0){let r=n.argv[0],s=j(n.command);throw new p("COMMAND_NOT_FOUND",`Unknown command "${r}".`,{input:r,available:Object.entries(s.subCommands).flatMap(([o,i])=>pt(i)?[o]:[]),commandPath:n.commandPath,parentCommand:s})}return n}function Lr(e,t,n){let r=be(e,t);return{argv:t,route:r,parsed:jr(r.command,n)}}async function St(e,t,n,r,s){try{var o=Pr();let{rootNode:i,extensions:a}=t,{argv:c,route:l,parsed:u}="argv"in e?Br(i,e.argv):Lr(i,e.path,e.input),f=l.command,g=o.a(new rr),d=f.contexts.map(({instance:O})=>O),m=ar(d,n,g),h=j(i),w=Object.freeze({argv:[...c],rootCommand:h,command:f===i?h:j(f),commandPath:Object.freeze([...l.commandPath]),args:u.args,flags:u.flags,rawArgs:u.rawArgs,ctx:m.bag(a.flatMap((O)=>O.uses??[])),finish:fe,stdout:n.stdout,stderr:n.stderr});r?.(w);let S=async()=>{Nr(f,u);let O=await kr(f,u);if(m.setValidatedFlags(O.flags),!f.run)return;let I={args:O.args,flags:O.flags,ctx:m.bag(d),rawArgs:u.rawArgs,command:w.command,rootCommand:h,stdout:n.stdout,stderr:n.stderr};return await f.run(I)},x,v={status:"completed"};try{try{for(let E of a)if(await E.hooks?.preRun?.(w)===fe()){v={status:"finished",by:E.id};break}if(v.status!=="finished")x=await S()}catch(E){let C=await s?.(E,w);v={status:"failed",error:E,...C===void 0?{}:{by:C}}}Object.freeze(v);let O=!1,I;for(let E of a.toReversed())try{await E.hooks?.postRun?.(w,v)}catch(C){if(v.status!=="failed"&&!O)O=!0,I=C}if(v.status==="failed")throw v.error;if(O)throw I}finally{await m.settle()}return v.status==="finished"?{status:"finished",by:v.by}:{status:"completed",result:x}}catch(i){o.e=i}finally{await o.d()}}async function ue(e,t,n,r,s,o=!1){let i=()=>{if(o)return;let u=e instanceof Error?e.message:String(e);r.stderr(`Error: ${u}`)};function a(u){return Promise.reject(new p("DEFINITION",`Context "${String(u)}" cannot be pulled from onError because invocation Contexts have already been disposed.`,{subject:"context",name:String(u),reason:"context-after-disposal"}))}let c=new Proxy({},{get:(u,f)=>f==="then"||Dr(f)?void 0:a(f)}),l=s??Object.freeze({argv:[...t],rootCommand:j(n.rootNode),command:j(n.rootNode),commandPath:Object.freeze([n.rootNode.meta.name]),args:Object.freeze({}),flags:Object.freeze({}),rawArgs:[],finish:fe,stdout:r.stdout,stderr:r.stderr,ctx:c});try{for(let u of n.extensions)if(await u.hooks?.onError?.(e,l))return u.id}catch{}i()}function zr(e){return e!==void 0&&Object.keys(e).length>0}async function we(e,t,n,r){let s=[],o=[];try{let i={...n},a={stdout(c){s.push(c),i.stdout?.(c)},stderr(c){o.push(c),i.stderr?.(c)}};return{...await ie(a,async()=>await St(t,M(e,r),a)),stdout:s.join(`
7
7
  `),stderr:o.join(`
8
8
  `)}}catch(i){return{status:"failed",error:i,stdout:s.join(`
9
9
  `),stderr:o.join(`
10
- `)}}}async function bt(e,t,n){let r=t?.argv??process.argv.slice(2),s={...Ir,...t?.io},o=process.env[jr];if(o){try{let a=gt(e,n),c=()=>j(ht(T(a.rootNode),a.extensions)),l=c(),u=process.env[ot];if(u){let f=[],g=new Map;for(let d of a.extensions){if(!d.build)continue;try{let m=(await d.build({snapshot:l})).map((h)=>{let w=kr(h.path),S=w.toLowerCase();for(let[O,v]of g)if(O===S||O.startsWith(`${S}/`)||S.startsWith(`${O}/`))throw Error(`Artifact path "${w}" collides with "${v.path}" produced by Extension "${v.id}".`);return g.set(S,{id:d.id,path:w}),{path:w,content:h.content}});for(let h of m){let w=F(u,h.path);await On(M(w),{recursive:!0}),await re(w,h.content)}f.push({id:d.id,files:m.map((h)=>h.path)})}catch(m){let h=m instanceof Error?m.message:String(m);throw Error(`Extension "${d.id}" build failed: ${h}`,{cause:m})}l=c()}await re(F(M(o),"build-report.json"),JSON.stringify({extensions:f}))}await re(o,JSON.stringify(l))}catch(a){let c=a instanceof Error?a.message:String(a);return console.error(c),process.exit(1)}return process.exit(0)}let i=async()=>{let a;try{a=L(e,n)}catch(u){if(oe(u))return process.exitCode=R,R;let f=u instanceof Error?u.message:String(u);return s.stderr(`Error: ${f}`),process.exitCode=1,1}let c,l=!1;try{await pt({argv:r},a,s,(u)=>{c=u},async(u,f)=>{l=!0;let g=oe(u);return process.exitCode=g?R:1,ie(u,r,a,s,f,g)})}catch(u){if(oe(u)){if(!l)await ie(u,r,a,s,c,!0);return process.exitCode=R,R}if(process.exitCode=1,!l)await ie(u,r,a,s,c);return 1}return 0};return await(_r(t?.io)?at(s,i):i())}var ye=Symbol.for("crust.commandDefinition");function P(e,t,n){let r=e[ye],s=e.name,o=n?`Extension "${n}" command "${s}"`:`Command "${s}"`,i=(u)=>({subject:n?"extension":"command",name:n??s,reason:u}),a=new Y(s);for(let[u,f]of Object.entries(t.ownedFlags))A(a._node,u,f,"owned");a._node.contexts=t.contexts.map((u)=>({...u}));let c=r.recipe(a);if(!(c instanceof Y)||c._ancestorOwnedFlags!==a._ancestorOwnedFlags)throw new p("DEFINITION",`${o} definition must return the same command builder it received`,i("foreign-command-builder"));if(c._node.extensions.length>0)throw new p("DEFINITION",`${o} cannot register Extensions inside command definitions`,i("nested-command-extension"));let l=T(c._node);return K(l.contexts.map(({instance:u})=>u),l.demands),l.meta={name:s,...r.meta},l}function we(e,t=[]){if(e.trim()==="")throw new p("DEFINITION","Command name must be a non-empty string",{subject:"command",name:e,reason:"empty-name"});if(e==="__proto__")throw new p("DEFINITION",'Command name "__proto__" is reserved',{subject:"command",name:e,reason:"reserved-name"});if(t.includes(e))throw new p("DEFINITION",`Command "${e}" must not list its own canonical name as an alias`,{subject:"command",name:e,reason:"alias-collision"});return e}function Fr(e){return typeof e==="function"}function Pr(e,t,n){let r=!Fr(t),s=r?t:{},o=r?n:t,i=we(e,s.aliases);for(let d of s.aliases??[])if(d===""||/[ \t\n\r\v\f]/.test(d)||d.startsWith("-"))throw new p("DEFINITION",`Command "${i}" has an invalid alias "${d}"`);let{sections:a,version:c,...l}=s,u={...l,...s.aliases?{aliases:[...s.aliases]}:{},...a?{sections:fe(i,a)}:{}},f={name:i,recipe:o,meta:u},g=(d)=>Object.freeze({name:d,as:(m)=>g(we(m,u.aliases)),[ye]:Object.freeze({...f,name:d})});return g(i)}function Dr(e){return e.filter((t,n)=>e.findLastIndex((r)=>r.id===t.id)===n)}var Y=class{_node;_ancestorOwnedFlags;constructor(e,...t){let n=t[0]??{},r=we(e);if(this._node=tt(r),n.description!==void 0)this._node.meta.description=n.description;if(n.version!==void 0)this._node.meta.version=n.version;if(n.usage!==void 0)this._node.meta.usage=n.usage;if(n.sections!==void 0)this._node.meta.sections=fe(r,n.sections);this._ancestorOwnedFlags={}}_clone(e){let t=Object.create(Object.getPrototypeOf(this));return t._node={...T({...this._node,subCommands:{}}),subCommands:{...this._node.subCommands},...e},t._ancestorOwnedFlags=this._ancestorOwnedFlags,t}flags(...e){let t=this._clone({});for(let n of e){let{name:r,...s}=n;A(t._node,r,s,"local")}return t}args(...e){let t=[...this._node.args,...e.map(Qe)],n=new Set;for(let[r,s]of t.entries()){if(n.has(s.name))throw new p("DEFINITION",`Argument name "${s.name}" is already defined`,{subject:"argument",name:s.name,reason:"duplicate-arg"});if(n.add(s.name),s.variadic===!0&&r!==t.length-1)throw new p("DEFINITION",`Only the last positional argument can be variadic; "${s.name}" is not last`,{subject:"argument",name:s.name,reason:"variadic-position"})}return this._clone({args:t})}use(...e){return this._clone({demands:[...this._node.demands,...e.map(q)]})}provide(...e){let t=e.map(q);K([...this._node.contexts.map(({instance:r})=>r),...t],t);let n=this._clone({contexts:[...this._node.contexts,...t.map((r)=>({instance:r}))]});for(let r of t)for(let[s,o]of Object.entries(r.ownedFlags))A(n._node,s,o,"owned");return n}action(e){return this._clone({run:e})}extend(...e){let t=e.map(q),n=Dr([...this._node.extensions,...t]),r=st(this._node,n,new Set(t.map((s)=>s.id)));return K(r.contexts.map(({instance:s})=>s),n.flatMap((s)=>[...s.uses,...s.provides??[]])),this._clone({...r,extensions:n})}add(...e){return this._addDefinitions(e)}command(e,t){let n=Pr(e,t);return this._addDefinitions([n])}_addDefinitions(e){let t={...this._node.subCommands};for(let n of e){let r=[n.name,...n[ye].meta.aliases??[]];for(let o of Object.values(t))if([o.meta.name,...o.meta.aliases??[]].some((i)=>r.includes(i)))throw new p("DEFINITION",`Command name "${n.name}" is already registered on this command`,{subject:"command",name:n.name,reason:"command-collision"});let s=P(n,this._node);t[n.name]=s}return this._clone({subCommands:t})}async snapshot(){return j(L(this._node,P).rootNode)}async run(e,...t){let n=t[0]??{},r=t[1];return await be(this._node,{path:e,input:n},r,P)}at(e){pe(L(this._node,P).rootNode,e);let t=this._node,n=Object.freeze([...e]);return{path:n,async run(...r){let s=r[0]??{},o=r[1];return await be(t,{path:n,input:s},o,P)}}}async execute(e){return await bt(this._node,e,P)}};import{accessSync as wt,constants as yt,existsSync as Oe,lstatSync as Ct,mkdirSync as vt,readFileSync as Rr,readdirSync as Et,realpathSync as xt,statSync as G,writeFileSync as St}from"node:fs";import{delimiter as Mr,dirname as It,extname as Br,isAbsolute as Lr,join as _,relative as zr,resolve as ve,sep as $e,win32 as Wr}from"node:path";import{fileURLToPath as Ur}from"node:url";import{spawn as jt,spawnSync as Vr}from"node:child_process";import{once as Nt}from"node:events";import{text as Ot}from"node:stream/consumers";function qr(e){return e instanceof Error&&"code"in e&&typeof e.code==="string"}function Kr(e,t){let n=zr(e,t);return n===""||!Lr(n)&&n!==".."&&!n.startsWith(`..${$e}`)}function Yr(e,t){return e.replace(/\{\{\s*(\w+)\s*\}\}/g,(n,r)=>Object.hasOwn(t,r)?t[r]??n:n)}function Gr(e){let t=It(e),n=e.slice(t==="."?0:t.length+1);if(n.startsWith("_")&&!n.startsWith("__")){let r=`.${n.slice(1)}`;return t==="."?r:_(t,r)}return e}function Hr(e){if(!Oe(e))return!1;if(!G(e).isDirectory())return!1;return Et(e).length>0}function Jr(e,t){let n=e;for(let r of t.split($e)){n=_(n,r);let s;try{s=Ct(n).isSymbolicLink()}catch(i){if(qr(i)&&i.code==="ENOENT")return;throw i}if(!s)continue;let o;try{o=xt(n)}catch{}if(o===void 0||!Kr(e,o))throw Error(`Destination path "${n}" is a symlink${o===void 0?" to a missing target":` to "${o}"`} outside the destination "${e}". Remove the link or choose another destination.`)}}async function Ce(e){let{template:t,dest:n,context:r,conflict:s="abort"}=e,o=t instanceof URL?Ur(t):ve(t),i=ve(n);if(!Oe(o))throw Error(`Template directory "${o}" does not exist (from template: "${String(t)}").`);if(!G(o).isDirectory())throw Error(`Template path "${o}" is not a directory (from template: "${String(t)}").`);if(s==="abort"&&Hr(i))throw Error(`Destination directory "${i}" already exists and is non-empty. Use conflict: "overwrite" to proceed.`);let a=Et(o,{recursive:!0,encoding:"utf8"}).filter((f)=>Ct(_(o,f)).isFile());vt(i,{recursive:!0});let c=xt(i),l=a.map((f)=>({relFromTemplate:f,destRelPath:Gr(f)}));for(let{destRelPath:f}of l)Jr(c,f);let u=[];for(let{relFromTemplate:f,destRelPath:g}of l){let d=_(o,f),m=_(c,g);vt(It(m),{recursive:!0});let h=Rr(d);if(h.subarray(0,8192).includes(0))St(m,h);else{let w=Yr(h.toString("utf-8"),r);St(m,w,"utf-8")}u.push(g)}return{files:u}}function Xr(e){if(e?.startsWith("bun"))return"bun";if(e?.startsWith("pnpm"))return"pnpm";if(e?.startsWith("yarn"))return"yarn";if(e?.startsWith("npm"))return"npm";return null}var Zr=/[\0\r\n"%!^`<>&|]/,Se=/([()\][%!^"`<>&|;, *?])/g;function Qr(e){let t=e.replace(/(?=(\\+?)?)\1"/g,"$1$1\\\"");return t=t.replace(/(?=(\\+?)?)\1$/g,"$1$1"),t=`"${t}"`.replace(Se,"^$1"),t.replace(Se,"^$1")}function es(e,t,n,r=process.platform){if(n||r!=="win32"||!/\.(cmd|bat)$/i.test(e))return null;let s=Wr.normalize(e);for(let[i,a]of[s,...t].entries())if(Zr.test(a)){let c=i===0?"command":`argument ${i}`;throw Error(`Windows command shim ${c} ${JSON.stringify(a)} contains unsafe shell characters`)}let o=[s.replace(Se,"^$1"),...t.map(Qr)].join(" ");return{command:process.env.ComSpec??"cmd.exe",args:["/d","/s","/c",`"${o}"`],windowsVerbatimArguments:!0}}async function H(e,t=[],n={}){let r=es(e,t,n.shell),s=(n.stdio??"collect")==="collect",o=s&&n.stdout!=="ignore",i=jt(r?.command??e,r?.args??t,{cwd:n.cwd,env:n.env,shell:n.shell,stdio:s?["ignore",o?"pipe":"ignore","pipe"]:"inherit",windowsVerbatimArguments:r?.windowsVerbatimArguments}),[a,c,[l]]=await Promise.all([o?Ot(i.stdout):"",s?Ot(i.stderr):"",Nt(i,"close")]);return{exitCode:l,stdout:a,stderr:c}}function kt(e){if(e.includes($e)||e.includes("/")){try{if(wt(e,yt.X_OK),G(e).isFile())return e}catch{}return null}let t=process.platform==="win32"&&!Br(e)?(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";"):[""];for(let n of process.env.PATH?.split(Mr)??[])for(let r of t){let s=ve(_(n,e+r));try{if(wt(s,yt.X_OK),G(s).isFile())return s}catch{}}return null}var ts=[["bun.lock","bun"],["bun.lockb","bun"],["pnpm-lock.yaml","pnpm"],["yarn.lock","yarn"],["package-lock.json","npm"]];function ns(e){let t=e??process.cwd();for(let[n,r]of ts)if(Oe(_(t,n)))return r;return Xr(process.env.npm_config_user_agent)??"npm"}function At(e){try{return Vr("git",["rev-parse","--is-inside-work-tree"],{cwd:e??process.cwd(),stdio:"ignore"}).status===0}catch{return!1}}async function Ee(e,t){for(let n of e)switch(n.type){case"install":await rs(t);break;case"git-init":await ss(t,n.commit);break;case"open-editor":await os(t);break;case"command":await is(n.cmd,n.cwd??t)}}async function rs(e){let t=ns(e),n=kt(t);if(!n)throw Error(`Package manager "${t}" was not found on PATH. Install ${t} and try again.`);let{exitCode:r}=await H(n,["install"],{cwd:e,stdio:"inherit"});if(r!==0)throw Error(`"${t} install" exited with code ${r}`)}async function ss(e,t){let n=kt("git");if(!n)throw Error('"git" was not found on PATH. Install Git and try again.');if(await z([n,"init"],e,"git init"),t)await as(e,n),await z([n,"add","."],e,"git add"),await z([n,"commit","-m",t],e,"git commit")}async function os(e){let t=process.env.EDITOR||"code";try{let n=jt(t,[e],{stdio:"ignore",shell:process.platform==="win32"});n.unref();let r=await Promise.race([Nt(n,"close").then(([s])=>({kind:"exited",code:s})),new Promise((s)=>setTimeout(()=>s({kind:"timeout"}),500))]);if(r.kind==="exited"&&r.code!==0)console.warn(`Warning: could not open editor "${t}" (exit code ${r.code})`)}catch{console.warn(`Warning: could not open editor "${t}"`)}}async function is(e,t){let{exitCode:n}=await H(e,[],{cwd:t,shell:!0,stdio:"inherit"});if(n!==0)throw Error(`Command "${e}" exited with code ${n}`)}async function as(e,t){let n=await $t(t,"user.name",e)===0,r=await $t(t,"user.email",e)===0;if(!n)await z([t,"config","user.name","Crust"],e,"git config user.name");if(!r)await z([t,"config","user.email","crust@scaffolded.project"],e,"git config user.email")}async function $t(e,t,n){let{exitCode:r}=await H(e,["config",t],{cwd:n,stdio:"collect",stdout:"ignore"});return r}async function z(e,t,n){let{exitCode:r,stderr:s}=await H(e[0],e.slice(1),{cwd:t,stdio:"collect",stdout:"ignore"});if(r!==0)throw Error(`"${n}" failed with exit code ${r}${s?`: ${s.trim()}`:""}`)}import{AsyncLocalStorage as Eo}from"node:async_hooks";import{stripVTControlCharacters as cs}from"node:util";var Tt=Object.defineProperty,ls=(e,t)=>{let n={};for(var r in e)Tt(n,r,{get:e[r],enumerable:!0});if(!t)Tt(n,Symbol.toStringTag,{value:"Module"});return n},us=new Intl.Segmenter(void 0,{granularity:"grapheme"}),fs=/[\p{Cc}\p{Cf}\p{Mn}\p{Me}]/u,ds=/\p{Emoji_Presentation}|\p{Emoji}\uFE0F/u;function ms(e){return e>=4352&&(e<=4447||e===9001||e===9002||e>=11904&&e<=42191&&e!==12351||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65135||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=94176&&e<=111355||e>=127488&&e<=127743||e>=131072&&e<=262141)}function gs(e){let t=0;for(let{segment:n}of us.segment(cs(e))){if(ds.test(n)){t+=2;continue}let r=n.codePointAt(0);if(!fs.test(String.fromCodePoint(r)))t+=ms(r)?2:1}return t}function Dt(e){return globalThis.Bun?.stringWidth(e,{countAnsiEscapeCodes:!1})??gs(e)}var hs=ls({bgBlack:()=>Bs,bgBlue:()=>Us,bgBrightBlack:()=>Ys,bgBrightBlue:()=>Xs,bgBrightCyan:()=>Qs,bgBrightGreen:()=>Hs,bgBrightMagenta:()=>Zs,bgBrightRed:()=>Gs,bgBrightWhite:()=>eo,bgBrightYellow:()=>Js,bgCyan:()=>qs,bgGreen:()=>zs,bgMagenta:()=>Vs,bgRed:()=>Ls,bgWhite:()=>Ks,bgYellow:()=>Ws,black:()=>$s,blue:()=>Is,bold:()=>ps,brightBlue:()=>Ps,brightCyan:()=>Rs,brightGreen:()=>_s,brightMagenta:()=>Ds,brightRed:()=>Ts,brightWhite:()=>Ms,brightYellow:()=>Fs,cyan:()=>Ns,dim:()=>bs,gray:()=>As,green:()=>Es,hidden:()=>Ss,inverse:()=>vs,isModifierName:()=>Rt,italic:()=>ws,magenta:()=>js,red:()=>Cs,strikethrough:()=>Os,styleMethodNames:()=>Ie,underline:()=>ys,white:()=>ks,yellow:()=>xs});function y(e,t){return{open:`\x1B[${e}m`,close:`\x1B[${t}m`}}var ps=y(1,22),bs=y(2,22),ws=y(3,23),ys=y(4,24),vs=y(7,27),Ss=y(8,28),Os=y(9,29),$s=y(30,39),Cs=y(31,39),Es=y(32,39),xs=y(33,39),Is=y(34,39),js=y(35,39),Ns=y(36,39),ks=y(37,39),As=y(90,39),Ts=y(91,39),_s=y(92,39),Fs=y(93,39),Ps=y(94,39),Ds=y(95,39),Rs=y(96,39),Ms=y(97,39),Bs=y(40,49),Ls=y(41,49),zs=y(42,49),Ws=y(43,49),Us=y(44,49),Vs=y(45,49),qs=y(46,49),Ks=y(47,49),Ys=y(100,49),Gs=y(101,49),Hs=y(102,49),Js=y(103,49),Xs=y(104,49),Zs=y(105,49),Qs=y(106,49),eo=y(107,49),Ie=Object.freeze(["bold","dim","italic","underline","inverse","hidden","strikethrough","black","red","green","yellow","blue","magenta","cyan","white","gray","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","bgBrightBlack","bgBrightRed","bgBrightGreen","bgBrightYellow","bgBrightBlue","bgBrightMagenta","bgBrightCyan","bgBrightWhite"]),to=new Set(["bold","dim","italic","underline","inverse","hidden","strikethrough"]);function Rt(e){return to.has(e)}function W(e,t,n){return e!==void 0&&t in e?e[t]:n}function Mt(e){return W(e,"isTTY",process.stdout?.isTTY)??!1}function Bt(e){return W(e,"forceColor",process.env.FORCE_COLOR)}function Lt(e){return e==="0"||e==="false"}function no(e){let t=e.toLowerCase();return t.includes("24bit")||t.includes("truecolor")||t.endsWith("-direct")}function zt(e,t){if(e!==void 0){let n=e.toLowerCase();if(n==="truecolor"||n==="24bit")return!0}return t!==void 0&&no(t)}function _t(e,t){if(zt(e,t))return"truecolor";if(t!==void 0&&t.toLowerCase().includes("256color"))return"256";return"16"}function ro(e,t){if(e==="never")return"none";if(e==="always")return"truecolor";let n=W(t,"colorTerm",process.env.COLORTERM),r=W(t,"term",process.env.TERM),s=Bt(t);if(s!==void 0){if(Lt(s))return"none";if(s==="1")return"16";if(s==="2")return"256";if(s==="3")return"truecolor";return _t(n,r)}if(!Mt(t))return"none";let o=W(t,"noColor",process.env.NO_COLOR);if(o!==void 0&&o!=="")return"none";if(r!==void 0&&r.toLowerCase()==="dumb"&&!zt(n,r))return"none";return _t(n,r)}function so(e,t){if(e==="always")return!0;if(e==="never")return!1;let n=Bt(t);if(n!==void 0)return!Lt(n);return Mt(t)}var Wt={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};function je(e,t){if(e==null)return"";let n=String(e);if(n==="")return"";let{open:r,close:s}=t;if(n.includes(s))n=n.replaceAll(s,s+r);return r+n+s}var oo="\x1B[39m",io="\x1B[49m",ao="\x1B[38;",co="\x1B[48;";function lo(e){try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function uo(e){return Object.hasOwn(Wt,e)}function Ne(e){if(Array.isArray(e)){if(e.length===3&&e.every((t)=>Number.isInteger(t)&&t>=0&&t<=255))return[e[0],e[1],e[2]]}else if(typeof e==="string"){let t=e.toLowerCase();if(uo(t))return Wt[t];let n=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(t)?.[1];if(n){let s=n.length===3?n.split("").map((o)=>o+o).join(""):n;return[Number.parseInt(s.slice(0,2),16),Number.parseInt(s.slice(2,4),16),Number.parseInt(s.slice(4,6),16)]}let r=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/.exec(t)??/^rgb\(\s*(\d{1,3})\s+(\d{1,3})\s+(\d{1,3})\s*\)$/.exec(t);if(r){let s=[Number(r[1]),Number(r[2]),Number(r[3])];if(s.every((o)=>o<=255))return s}}throw TypeError(`Invalid color input: ${lo(e)}`)}function fo(e,t,n){let r=[0,95,135,175,215,255],s=(f)=>r.reduce((g,d,m)=>Math.abs(d-f)<Math.abs(r[g]-f)?m:g,0),[o,i,a]=[s(e),s(t),s(n)],c=Math.min(23,Math.max(0,Math.round(((e+t+n)/3-8)/10))),l=8+c*10,u=(f,g,d)=>(e-f)**2+(t-g)**2+(n-d)**2;return u(l,l,l)<u(r[o],r[i],r[a])?232+c:16+36*o+6*i+a}function Ut(e,t,n){let r=Math.round(Math.max(e,t,n)/127.5);if(r===0)return 30;let s=30+((Math.round(n/255)<<2|Math.round(t/255)<<1|Math.round(e/255))&7);if(r===2)s+=60;return s}function Vt(e,t){let[n,r,s]=Ne(e);if(t==="16")return`\x1B[${Ut(n,r,s)}m`;if(t==="256")return`\x1B[38;5;${fo(n,r,s)}m`;return`\x1B[38;2;${n};${r};${s}m`}function mo(e,t){if(t==="16"){let[n,r,s]=Ne(e);return`\x1B[${Ut(n,r,s)+10}m`}return Vt(e,t).replace(ao,co)}function ke(e,t,n){if(n==="none")return Ne(t),{open:"",close:""};return{open:e==="fg"?Vt(t,n):mo(t,n),close:e==="fg"?oo:io}}function qt(e,t){return ke("fg",e,t)}function Kt(e,t){return ke("bg",e,t)}function Yt(e,t,n,r){let s=ke(e,n,r);return r==="none"?t:je(t,s)}function go(e,t,n="truecolor"){return Yt("fg",e,t,n)}function ho(e,t,n="truecolor"){return Yt("bg",e,t,n)}var Gt="\x1B]",Ht="\x1B\\",po=`${Gt}8;;${Ht}`;function Jt(e,t,n,r=""){if(!n.test(e))throw TypeError(`Invalid ${t}: ${JSON.stringify(e)} must contain only printable ASCII characters${r}.`)}function bo(e){let t=e?.id;if(t===void 0||t==="")return"";if(Jt(t,"hyperlink id",/^[\x20-\x7e]*$/),t.includes(":")||t.includes(";"))throw TypeError('Invalid hyperlink id: ":" and ";" are reserved by the OSC 8 format.');return`id=${t}`}function Xt(e,t){Jt(e,"hyperlink URL",/^[\x21-\x7e]*$/," without spaces");let n=bo(t);return{open:`${Gt}8;${n};${e}${Ht}`,close:po}}function wo(e,t,n){return je(e,Xt(t,n))}var Zt=[["fg",qt,go],["bg",Kt,ho]],yo=hs;function vo(e){return e.kind==="named"&&Rt(e.name)}function xe(e,t){if(e.kind==="named")return yo[e.name];return e.kind==="fg"?qt(e.input,t):Kt(e.input,t)}function Ft(e,t,n){if(e==null)return"";let r=String(e);if(r==="")return r;let s=n(),{modifiersEnabled:o,colorsEnabled:i}=s;for(let a=t.length-1;a>=0;a--){let c=t[a];if(c===void 0)continue;if(vo(c)?!o:!i)continue;r=je(r,xe(c,s.colorDepth))}return r}function So(e){return Array.isArray(e)&&"raw"in e&&Array.isArray(e.raw)}function Oo(e,t){let n=new Map,r=t?"truecolor":e().colorDepth;function s(o){let i=o.map((f)=>f.kind==="named"?f.name:`~${xe(f,"truecolor").open}`).join("|"),a=n.get(i);if(a)return a;let c=(f,...g)=>{if(So(f)){let d="";for(let m=0;m<f.length;m++)if(d+=f[m]??"",m<g.length)d+=String(g[m]);return Ft(d,o,e)}return Ft(f,o,e)};n.set(i,c);for(let f of Ie)Object.defineProperty(c,f,{configurable:!1,enumerable:!0,get(){return s([...o,{kind:"named",name:f}])}});for(let[f,g]of Zt)Object.defineProperty(c,f,{configurable:!1,enumerable:!0,value:(d)=>(g(d,"truecolor"),s([...o,{kind:f,input:d}])),writable:!1});let l="",u="";for(let f of o){let g=xe(f,r);l+=g.open,u=g.close+u}return Object.defineProperty(c,"open",{value:l,writable:!1,configurable:!1,enumerable:!0}),Object.defineProperty(c,"close",{value:u,writable:!1,configurable:!1,enumerable:!0}),Object.freeze(c)}return s}function $o(e){let t={};for(let n of Ie)t[n]=e([{kind:"named",name:n}]);return t}function Pt(e){let t=e?.mode??"auto",n=so(t,e?.overrides),r=ro(t,e?.overrides);return{modifiersEnabled:n,colorDepth:r,colorsEnabled:r!=="none",trueColorEnabled:r==="truecolor"}}function Co(e,t){let n=t?Pt:(()=>{let i=Pt(e);return()=>i})(),r=Oo(n,t),s=$o(r),o={get enabled(){let{modifiersEnabled:i,colorsEnabled:a}=n();return i||a},get colorsEnabled(){return n().colorsEnabled},get trueColorEnabled(){return n().trueColorEnabled},get colorDepth(){return n().colorDepth},link(i,a,c){if(n().modifiersEnabled)return wo(i,a,c);return Xt(a,c),i},...Object.fromEntries(Zt.map(([i,a,c])=>[i,(...l)=>{let u=n();if(l.length===1)return a(l[0],"truecolor"),r([{kind:i,input:l[0]}]);return c(l[0],l[1],u.colorDepth)}])),...s};return Object.freeze(o)}var b=Co(void 0,!0),{black:Hi,red:J,green:X,yellow:Ji,blue:Xi,magenta:Qt,cyan:U,white:Zi,gray:Qi,brightRed:ea,brightGreen:ta,brightYellow:na,brightBlue:ra,brightMagenta:sa,brightCyan:oa,brightWhite:ia,bgBlack:aa,bgRed:ca,bgGreen:la,bgYellow:ua,bgBlue:fa,bgMagenta:da,bgCyan:ma,bgWhite:ga,bgBrightBlack:ha,bgBrightRed:pa,bgBrightGreen:ba,bgBrightYellow:wa,bgBrightBlue:ya,bgBrightMagenta:va,bgBrightCyan:Sa,bgBrightWhite:Oa,bold:Z,dim:Q,italic:$a,underline:Ca,inverse:Ea,hidden:xa,strikethrough:Ia,link:ja,fg:Na,bg:ka}=b;var xo=Symbol.for("crustjs.terminal.io"),Io=Symbol.for("crustjs.terminal.ambient-callbacks"),jo=globalThis,No=globalThis,ko=jo[xo]??=new Eo;No[Io]??=new WeakMap;function Ao(){return ko.getStore()}var en={spinner:Qt,message:Z,success:X,error:J},_e="\x1B[",To=`${_e}?25l`,tn=`${_e}?25h`,rn=`${_e}2K`,sn="\r",nn={dots:{frames:["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],interval:80},line:{frames:["-","\\","|","/"],interval:130},arc:{frames:["◐","◓","◑","◒"],interval:100},bounce:{frames:["⠁","⠂","⠄","⡀","⢀","⠠","⠐","⠈"],interval:120}},_o="✓",Fo="✗";function Po(e){if(e===void 0)return nn.dots;if(typeof e==="string")return nn[e];if(e.frames.length===0)throw Error("A custom spinner requires at least one frame");return e}function Ae(e,t){let n=e[t];if(n===void 0)throw Error("Spinner frame index is out of bounds");return n}function Te(e,t,n){return`${rn}${sn}${n.spinner(e)} ${n.message(t)}`}function Do(e,t,n,r){let s=n==="success"?_o:Fo,o=`${(n==="success"?t.success:t.error)(s)} ${t.message(e)}
11
- `;return r?rn+sn+o:o}function Ro(e){let t=e.sink??Ao()?.output??process.stderr,n=e.theme?{...en,...e.theme}:en,r=t.isTTY??!1,{frames:s,interval:o}=Po(e.spinner),i=e.sigint??"exit",a=e.message,c=0,l=!1,u=!1,f,g;function d(){if(f!==void 0)clearInterval(f),f=void 0;if(g)process.removeListener("SIGINT",g),g=void 0}return{start(){if(l||u)return;if(l=!0,!r)return;if(t.write(To),t.write(Te(Ae(s,0),a,n)),f=setInterval(()=>{c=(c+1)%s.length,t.write(Te(Ae(s,c),a,n))},o),i==="exit")g=()=>{if(d(),u=!0,t.write(tn),process.listenerCount("SIGINT")===0)process.kill(process.pid,"SIGINT")},process.once("SIGINT",g)},updateMessage(m){if(u)return;if(a=m,l&&r)t.write(Te(Ae(s,c),a,n))},stop(m="success",h){if(u)return;if(u=!0,h!==void 0)a=h;if(d(),t.write(Do(a,n,m,l&&r)),l&&r)t.write(tn)}}}function Fe(e){let t=Ro(e),{task:n}=e;if(!n)return t;return t.start(),Promise.resolve().then(()=>n(t)).then((r)=>(t.stop("success"),r),(r)=>{throw t.stop("error"),r})}import*as k from"node:readline";import{AsyncLocalStorage as Mo}from"node:async_hooks";var on={prefix:U,message:Z,placeholder:Q,cursor:U,selected:U,unselected:Q,error:J,success:X,hint:Q,filterMatch:U},Bo=Symbol.for("crustjs.terminal.io"),Lo=Symbol.for("crustjs.terminal.ambient-callbacks"),zo=globalThis,Wo=globalThis,Uo=zo[Bo]??=new Mo;Wo[Lo]??=new WeakMap;function Vo(){return Uo.getStore()}function te(e){let t=Vo();return{input:e?.input??t?.input??process.stdin,output:e?.output??t?.output??process.stderr}}var Re=Symbol("submit");function Me(e){return{[Re]:e}}var Pe=new WeakSet,De=new WeakSet,cn="\x1B[",qo=`${cn}?25l`,Ko=`${cn}?25h`;function an(e,t){let n=e.split(`
12
- `),r=0;for(let s of n){let o=Dt(s);r+=o===0?1:Math.ceil(o/t)}return r}var Yo=class extends Error{constructor(e){super(e??"Prompts require an interactive terminal (TTY).");this.name="NonInteractiveError"}};function ln(e=te().input){return!!e.isTTY}function Go(e=te().input){if(!ln(e))throw new Yo}function Ho(e){return typeof e==="object"&&e!==null&&Re in e}function Be(e,t){let{render:n,handleKey:r,initialState:s,renderSubmitted:o}=e,i=e.theme?{...on,...e.theme}:on,{input:a,output:c}=te(t),l=c;return new Promise((u,f)=>{if(Pe.has(a)||De.has(c)){f(Error("Cannot run multiple prompts concurrently on the same input or output stream. Await each prompt before starting the next."));return}Go(a),Pe.add(a),De.add(c);let g=s,d=0,m=!1,h=!1;function w(){if(m)return;if(m=!0,Pe.delete(a),De.delete(c),a.removeListener("keypress",x),h)a.setRawMode?.(!1);a.pause(),c.write(Ko)}function S(E){let N=c.columns||80;if(d>0)k.cursorTo(l,0),k.moveCursor(l,0,-(d-1)),k.clearScreenDown(l);c.write(E),d=an(E,N)}let O=Promise.resolve(),v=null;function C(){if(v!==null)return;v=setTimeout(()=>{if(v=null,m)return;try{S(n(g,i))}catch(E){w(),f(E)}},0)}function I(){if(v!==null)clearTimeout(v),v=null}function x(E,N){if(N?.ctrl&&N.name==="c"){I(),c.write(`
13
- `),w(),f(new DOMException("Prompt was cancelled.","AbortError"));return}let Sn={char:E??"",name:N?.name??"",ctrl:N?.ctrl??!1,meta:N?.meta??!1,shift:N?.shift??!1};O=O.then(async()=>{if(m)return;try{let D=await r(Sn,g);if(m)return;if(Ho(D)){I();let We=D[Re];if(o)S(o(g,We,i));c.write(`
14
- `),w(),u(We)}else g=D,C()}catch(D){I(),w(),f(D)}})}try{if(k.emitKeypressEvents(a),a.setRawMode)a.setRawMode(!0),h=!0;a.resume(),c.write(qo);let E=n(g,i);c.write(E),d=an(E,c.columns||80),a.on("keypress",x)}catch(E){w(),f(E)}})}async function ee(e,t,n){if(e.initial!==void 0)return{shortCircuited:!0,value:n?await n(e.initial,"initial"):e.initial};let r=te(t);if(!ln(r.input)&&e.default!==void 0)return{shortCircuited:!0,value:n?await n(e.default,"default"):e.default};return{shortCircuited:!1,promptIO:r}}function Le(e,t,n){let r=[e];if(t)r.push(t);if(n)r.push(n);return r.join(" ")}function un(e,t,n,r){let s=t?`${e} ${t}`:e,o=r??"";if(t)return`${s}${o}
15
- ${n}`;return`${s}${o} ${n}`}function Jo(e,t,n,r,s){let o=Math.min(e.length,n),i=[];if(t>0)i.push(s("..."));for(let a=t;a<t+o;a++){let c=e[a];if(c===void 0)break;i.push(r(c,a))}if(t+o<e.length)i.push(s("..."));return i}function fn(e,t,n,r){let s=Math.min(n,r);if(e<t)return e;if(e>=t+s)return e-s+1;return t}function Xo(e,t,n,r,s){let o=n===-1?e<=0?t-1:e-1:e>=t-1?0:e+1;return{cursor:o,scrollOffset:fn(o,r,t,s)}}function Zo(e){return e.map((t)=>{if(typeof t==="string")return{label:t,value:t};return t})}function Qo(e,t){if(e.name==="return")return Me(t.value);if(e.name==="left"||e.name==="right"||e.name==="tab")return{value:!t.value};if(e.name==="h"||e.char==="y"||e.char==="Y")return{value:!0};if(e.name==="l"||e.char==="n"||e.char==="N")return{value:!1};return t}var ei=" · ";function ti(e,t,n,r,s){let o=t.prefix("┃"),i=t.message(n??"Are you sure?"),a=e.value?`${t.selected("●")} ${t.selected(r)}`:`${t.unselected("○")} ${t.unselected(r)}`,c=e.value?`${t.unselected("○")} ${t.unselected(s)}`:`${t.selected("●")} ${t.selected(s)}`;return un(o,i,`${a}${ei}${c}`)}function ni(e,t,n,r,s,o){let i=n.success("✓"),a=n.message(r??"Are you sure?"),c=t?s:o;return Le(i,a,n.success(c))}async function ne(e,t){let n=await ee(e,t);if(n.shortCircuited)return n.value;let{promptIO:r}=n,s=e.active??"Yes",o=e.inactive??"No";return Be({initialState:{value:e.default??!0},theme:e.theme,render:(i,a)=>ti(i,a,e.message,s,o),handleKey:Qo,renderSubmitted:(i,a,c)=>ni(i,a,c,e.message,s,o)},r)}async function ri(e,t,n){let r=await ee(e,n);if(r.shortCircuited)return r;let s=Zo(e.choices),o=e.maxVisible??10,i=e.default===void 0?[]:t==="multiple"?e.default:[e.default],a=new Set(i.flatMap((u)=>{let f=s.findIndex((g)=>g.value===u);return f===-1?[]:[f]})),c=i.length===0?-1:s.findIndex((u)=>u.value===i[0]),l=c===-1?0:c;return{shortCircuited:!1,choices:s,maxVisible:o,cursor:l,scrollOffset:fn(l,0,s.length,o),selected:a,promptIO:r.promptIO}}async function dn(e,t,n){if(t){let r=await t["~standard"].validate(e),s=r.issues?.[0];if(s)return{ok:!1,error:s.message||"Validation failed"};if("value"in r)return{ok:!0,value:r.value};return{ok:!1,error:"Validation failed"}}if(n)try{await n(e)}catch(r){return{ok:!1,error:r instanceof Error?r.message:"Validation failed"}}return{ok:!0,value:e}}async function si(e,t,n){let r=await dn(t,e,void 0);if(!r.ok)throw Error(`${n} value rejected by schema: ${r.error}`);return r.value}function oi(e,t,n,r){if(e==="")return r?n.placeholder(r):n.cursor("│");return`${e.slice(0,t)}${n.cursor("│")}${e.slice(t)}`}function ii(e,t,n){if(e.name==="backspace"){if(n===0)return{text:t,cursorPos:n};return{text:t.slice(0,n-1)+t.slice(n),cursorPos:n-1}}if(e.name==="delete"){if(n>=t.length)return{text:t,cursorPos:n};return{text:t.slice(0,n)+t.slice(n+1),cursorPos:n}}if(e.name==="left"){if(n===0)return{text:t,cursorPos:n};return{text:t,cursorPos:n-1}}if(e.name==="right"){if(n>=t.length)return{text:t,cursorPos:n};return{text:t,cursorPos:n+1}}if(e.name==="home")return{text:t,cursorPos:0};if(e.name==="end")return{text:t,cursorPos:t.length};if(e.char.length===1&&!e.ctrl&&!e.meta){let r=t.slice(0,n),s=t.slice(n);return{text:r+e.char+s,cursorPos:n+1}}return null}function ai(e,t,n){return async(r,s)=>{if(r.name==="return"){let i=await dn(s.value===""&&n!==void 0?n:s.value,e,t);return i.ok?Me(i.value):{...s,error:i.error}}let o=ii(r,s.value,s.cursorPos);return o?{value:o.text,cursorPos:o.cursorPos,error:null}:s}}function ci(e,t,n,r,s){let o=t.prefix("┃"),i=t.message(n??"Enter a value"),a=r??s,c=s!==void 0&&r!==void 0&&e.value===""?` ${t.hint(`(${s})`)}`:"",l=un(o,i,oi(e.value,e.cursorPos,t,a),c);if(e.error!==null)l+=`
16
- ${t.error(e.error)}`;return l}function li(e,t,n,r){return Le(n.success("✓"),n.message(r??"Enter a value"),n.success(String(t)))}async function mn(e={},t){if(e.schema!==void 0&&e.validate!==void 0)throw Error('input() cannot combine "schema" with "validate"');let n=e.schema,r=n?await ee(e,t,(o,i)=>si(n,o,i)):await ee(e,t);if(r.shortCircuited)return r.value;let{promptIO:s}=r;return Be({initialState:{value:"",cursorPos:0,error:null},theme:e.theme,render:(o,i)=>ci(o,i,e.message,e.placeholder,e.default),handleKey:ai(e.schema,e.validate,e.default),renderSubmitted:(o,i,a)=>li(o,i,a,e.message)},s)}function ui(e){return(t,n)=>{let r=n.choices.length;if(t.name==="return"){let s=n.choices[n.cursor];if(s)return Me(s.value);return n}if(["up","down","k","j"].includes(t.name)){let s=t.name==="up"||t.name==="k"?-1:1;return{...n,...Xo(n.cursor,r,s,n.scrollOffset,e)}}return n}}function fi(e,t,n,r){let s=[`${t.prefix("┃")} ${t.message(n??"Pick an option")}`];return s.push(...Jo(e.choices,e.scrollOffset,r,(o,i)=>{let a=o.hint?` ${t.hint(o.hint)}`:"";return i===e.cursor?`${t.cursor("›")} ${t.selected(o.label)}${a}`:` ${t.unselected(o.label)}${a}`},t.hint)),s.join(`
17
- `)}function di(e,t,n,r){let s=n.success("✓"),o=n.message(r??"Pick an option"),i=e.choices[e.cursor],a=i?i.label:"";return Le(s,o,n.success(a))}async function gn(e,t){let n=await ri(e,"single",t);if(n.shortCircuited)return n.value;let{choices:r,cursor:s,maxVisible:o,promptIO:i,scrollOffset:a}=n;return Be({initialState:{cursor:s,choices:r,scrollOffset:a},theme:e.theme,render:(c,l)=>fi(c,l,e.message,o),handleKey:ui(o),renderSubmitted:(c,l,u)=>di(c,l,u,e.message)},i)}var hn={name:"@crustjs/core",version:"0.3.0",description:"Core library for the Crust CLI framework",type:"module",sideEffects:!1,license:"MIT",author:"chenxin-yan",repository:{type:"git",url:"git+https://github.com/chenxin-yan/crust.git",directory:"packages/core"},homepage:"https://crustjs.com",bugs:{url:"https://github.com/chenxin-yan/crust/issues"},keywords:["cli","command","framework","parser","bun","typescript"],files:["dist"],types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./tooling":{types:"./dist/tooling.d.ts",import:"./dist/tooling.js"}},publishConfig:{access:"public"},scripts:{build:"tsdown",dev:"tsdown --watch","check:types":"tsc --noEmit",test:"bun test",prepack:"cp ../../LICENSE LICENSE",postpack:"rm -f LICENSE"},devDependencies:{"@crustjs/config":"workspace:*","@crustjs/utils":"workspace:*",tsdown:"catalog:"},peerDependencies:{typescript:"^7.0.0"},peerDependenciesMeta:{typescript:{optional:!0}},engines:{bun:">=1.4.0",node:">=22",deno:">=2.8"}};var pn={name:"@crustjs/crust",version:"0.3.0",description:"CLI tooling for the Crust framework",type:"module",license:"MIT",author:"chenxin-yan",repository:{type:"git",url:"git+https://github.com/chenxin-yan/crust.git",directory:"packages/crust"},homepage:"https://crustjs.com",bugs:{url:"https://github.com/chenxin-yan/crust/issues"},keywords:["cli","build","compile","standalone","bun","typescript"],publishConfig:{access:"public"},crust:{include:["schema"]},bin:{crust:"src/cli.ts"},scripts:{build:"bun src/cli.ts build",release:"bun src/cli.ts publish",dev:"bun src/cli.ts",start:"bun .crust/root/bin/crust.js","check:types":"tsc --noEmit",test:"bun test"},dependencies:{"@crustjs/core":"workspace:^","@crustjs/extensions":"workspace:^","@crustjs/style":"workspace:^"},devDependencies:{"@crustjs/config":"workspace:*","@crustjs/testing":"workspace:*","@crustjs/utils":"workspace:*"},engines:{bun:">=1.4.0"}};var bn={name:"@crustjs/extensions",version:"0.3.0",description:"Official Extensions for the Crust CLI framework",type:"module",sideEffects:!1,license:"MIT",author:"chenxin-yan",repository:{type:"git",url:"git+https://github.com/chenxin-yan/crust.git",directory:"packages/extensions"},homepage:"https://crustjs.com",bugs:{url:"https://github.com/chenxin-yan/crust/issues"},keywords:["cli","extension","help","version","completion","did-you-mean","bun","typescript"],files:["dist"],exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"}},publishConfig:{access:"public"},scripts:{build:"tsdown",dev:"tsdown --watch","check:types":"tsc --noEmit",test:"bun test",prepack:"cp ../../LICENSE LICENSE",postpack:"rm -f LICENSE"},dependencies:{"@crustjs/store":"workspace:^","@crustjs/style":"workspace:^"},devDependencies:{"@crustjs/config":"workspace:*","@crustjs/core":"workspace:*","@crustjs/utils":"workspace:*",tsdown:"catalog:"},peerDependencies:{"@crustjs/core":"workspace:^",typescript:"^7.0.0"},peerDependenciesMeta:{typescript:{optional:!0}},engines:{bun:">=1.4.0",node:">=22",deno:">=2.8"}};var wi={bun:{run:"bun run",shebang:"#!/usr/bin/env bun",tsLib:'"ESNext"',tsTypes:'"bun"'},node:{run:"npm run",shebang:"#!/usr/bin/env node",tsLib:'"ESNext"',tsTypes:'"node"'},deno:{run:"deno task",shebang:"#!/usr/bin/env -S deno run -A",tsLib:'"ESNext", "deno.window"',tsTypes:""}},yi={crustCoreVersion:hn.version,crustExtensionsVersion:bn.version,crustCliVersion:pn.version},vi=/^[A-Za-z0-9_~][A-Za-z0-9._~-]*$/;function vn(e){if(e==="__proto__"||!vi.test(e))throw Error(`Project name ${JSON.stringify(e)} is not safe for the generated project.
18
- The directory basename becomes the package and command name: use letters, digits, ".", "_", "~", and "-", not starting with "." or "-"; "__proto__" is reserved.`)}var Si=/[<>:"|?*\\]/;function Oi(e){if(!e)throw Error("Project directory cannot be empty");if(Si.test(e))throw Error(`Project directory contains invalid characters: ${e}`);vn(yn(ze(e)))}var $i=new Y("create-crust",{description:"Scaffold a new Crust CLI project"}).flags({name:"runtime",type:"string",choices:["bun","node","deno"],description:'Runtime to develop and build for ("bun", "node", or "deno")'},{name:"install",type:"boolean",description:"Install dependencies after scaffolding"},{name:"git",type:"boolean",description:"Initialize a git repository after scaffolding"},{name:"overwrite",type:"boolean",description:"Overwrite the destination directory if it already exists"}).args({name:"directory",type:"string",description:"Project directory to scaffold into"}).action(async({args:e,flags:t})=>{let n=e.directory??await mn({message:"Project directory",default:"my-cli",validate:Oi}),r=ze(process.cwd(),n),s=yn(r);vn(s);let o=t.runtime,i=n==="."?pi(r).length>0:wn(r),a=!1;if(i){if(a=await ne({message:n==="."?"Current directory is not empty. Overwrite conflicting files?":`Directory "${s}" already exists. Overwrite?`,default:!1,...t.overwrite!==void 0?{initial:t.overwrite}:{}}),!a){console.log("Aborted.");return}}let c=await gn({message:"Runtime",choices:[{label:"Bun (recommended)",value:"bun",hint:"standalone binaries per platform, published as npm packages"},{label:"Node.js",value:"node",hint:"one JavaScript bundle, published as a single npm package"},{label:"Deno",value:"deno",hint:"standalone binaries per platform, published as npm packages"}],default:"bun",...o!==void 0?{initial:o}:{}}),l=await ne({message:"Install dependencies?",default:!0,...t.install!==void 0?{initial:t.install}:{}}),u=wn(r)?r:ze(r,".."),g=At(u)?!1:await ne({message:"Initialize a git repository?",default:!0,...t.git!==void 0?{initial:t.git}:{}}),d=s,m=(w)=>bi(de("templates"),w),h={name:d,...wi[c],...yi};if(await Fe({message:"Scaffolding project...",task:async()=>{await Ce({template:m("base"),dest:r,context:h,...a?{conflict:"overwrite"}:{}}),await Ce({template:m(`runtime/${c}`),dest:r,context:h,conflict:"overwrite"})}}),l)await Ee([c==="deno"?{type:"command",cmd:"deno install"}:{type:"install"}],r);if(g)await Fe({message:"Initializing git repository...",task:()=>Ee([{type:"git-init",commit:"chore: initial commit"}],r)});if(console.log(`
10
+ `)}}}async function xt(e,t,n){let r=t?.argv??process.argv.slice(2),s={...Fr,...t?.io},o=process.env[Rr];if(o){try{let a=yt(e,n),c=()=>j(vt(T(a.rootNode),a.extensions)),l=c(),u=process.env[re];if(u){let f=[],g=new Map;for(let d of a.extensions){if(!d.build)continue;try{let m=(await d.build({snapshot:l})).map((h)=>{let w=Mr(h.path),S=w.toLowerCase();for(let[x,v]of g)if(x===S||x.startsWith(`${S}/`)||S.startsWith(`${x}/`))throw Error(`Artifact path "${w}" collides with "${v.path}" produced by Extension "${v.id}".`);return g.set(S,{id:d.id,path:w}),{path:w,content:h.content}});for(let h of m){let w=Xe(u,h.path);await Kn(Je(w),{recursive:!0}),await ae(w,h.content)}f.push({id:d.id,files:m.map((h)=>h.path)})}catch(m){let h=m instanceof Error?m.message:String(m);throw Error(`Extension "${d.id}" build failed: ${h}`,{cause:m})}l=c()}await ae(Xe(Je(o),"build-report.json"),JSON.stringify({extensions:f}))}await ae(o,JSON.stringify(l))}catch(a){let c=a instanceof Error?a.message:String(a);return console.error(c),process.exit(1)}return process.exit(0)}let i=async()=>{let a;try{a=M(e,n)}catch(u){if(le(u))return process.exitCode=R,R;let f=u instanceof Error?u.message:String(u);return s.stderr(`Error: ${f}`),process.exitCode=1,1}let c,l=!1;try{await St({argv:r},a,s,(u)=>{c=u},async(u,f)=>{l=!0;let g=le(u);return process.exitCode=g?R:1,ue(u,r,a,s,f,g)})}catch(u){if(le(u)){if(!l)await ue(u,r,a,s,c,!0);return process.exitCode=R,R}if(process.exitCode=1,!l)await ue(u,r,a,s,c);return 1}return 0};return await(zr(t?.io)?ie(s,i):i())}var ve=Symbol.for("crust.commandDefinition");function _(e,t,n){let r=e[ve],s=e.name,o=n?`Extension "${n}" command "${s}"`:`Command "${s}"`,i=(u)=>({subject:n?"extension":"command",name:n??s,reason:u}),a=new Y(s);for(let[u,f]of Object.entries(t.ownedFlags))A(a._node,u,f,"owned");a._node.contexts=t.contexts.map((u)=>({...u}));let c=r.recipe(a);if(!(c instanceof Y)||c._ancestorOwnedFlags!==a._ancestorOwnedFlags)throw new p("DEFINITION",`${o} definition must return the same command builder it received`,i("foreign-command-builder"));if(c._node.extensions.length>0)throw new p("DEFINITION",`${o} cannot register Extensions inside command definitions`,i("nested-command-extension"));let l=T(c._node);return G(l.contexts.map(({instance:u})=>u),l.demands),l.meta={name:s,...r.meta},l}function ye(e,t=[]){if(e.trim()==="")throw new p("DEFINITION","Command name must be a non-empty string",{subject:"command",name:e,reason:"empty-name"});if(e==="__proto__")throw new p("DEFINITION",'Command name "__proto__" is reserved',{subject:"command",name:e,reason:"reserved-name"});if(t.includes(e))throw new p("DEFINITION",`Command "${e}" must not list its own canonical name as an alias`,{subject:"command",name:e,reason:"alias-collision"});return e}function Wr(e){return typeof e==="function"}function Ur(e,t,n){let r=!Wr(t),s=r?t:{},o=r?n:t,i=ye(e,s.aliases);for(let d of s.aliases??[])if(d===""||/[ \t\n\r\v\f]/.test(d)||d.startsWith("-"))throw new p("DEFINITION",`Command "${i}" has an invalid alias "${d}"`);let{sections:a,version:c,...l}=s,u={...l,...s.aliases?{aliases:[...s.aliases]}:{},...a?{sections:me(i,a)}:{}},f={name:i,recipe:o,meta:u},g=(d)=>Object.freeze({name:d,as:(m)=>g(ye(m,u.aliases)),[ve]:Object.freeze({...f,name:d})});return g(i)}function Vr(e){return e.filter((t,n)=>e.findLastIndex((r)=>r.id===t.id)===n)}var Y=class{_node;_ancestorOwnedFlags;constructor(e,...t){let n=t[0]??{},r=ye(e);if(this._node=lt(r),n.description!==void 0)this._node.meta.description=n.description;if(n.version!==void 0)this._node.meta.version=n.version;if(n.usage!==void 0)this._node.meta.usage=n.usage;if(n.sections!==void 0)this._node.meta.sections=me(r,n.sections);this._ancestorOwnedFlags={}}_clone(e){let t=Object.create(Object.getPrototypeOf(this));return t._node={...T({...this._node,subCommands:{}}),subCommands:{...this._node.subCommands},...e},t._ancestorOwnedFlags=this._ancestorOwnedFlags,t}flags(...e){let t=this._clone({});for(let n of e){let{name:r,...s}=n;A(t._node,r,s,"local")}return t}args(...e){let t=[...this._node.args,...e.map(at)],n=new Set;for(let[r,s]of t.entries()){if(n.has(s.name))throw new p("DEFINITION",`Argument name "${s.name}" is already defined`,{subject:"argument",name:s.name,reason:"duplicate-arg"});if(n.add(s.name),s.variadic===!0&&r!==t.length-1)throw new p("DEFINITION",`Only the last positional argument can be variadic; "${s.name}" is not last`,{subject:"argument",name:s.name,reason:"variadic-position"})}return this._clone({args:t})}use(...e){return this._clone({demands:[...this._node.demands,...e.map(H)]})}provide(...e){let t=e.map(H);G([...this._node.contexts.map(({instance:r})=>r),...t],t);let n=this._clone({contexts:[...this._node.contexts,...t.map((r)=>({instance:r}))]});for(let r of t)for(let[s,o]of Object.entries(r.ownedFlags))A(n._node,s,o,"owned");return n}action(e){return this._clone({run:e})}extend(...e){let t=e.map(H),n=Vr([...this._node.extensions,...t]),r=dt(this._node,n,new Set(t.map((s)=>s.id)));return G(r.contexts.map(({instance:s})=>s),n.flatMap((s)=>[...s.uses,...s.provides??[]])),this._clone({...r,extensions:n})}add(...e){return this._addDefinitions(e)}command(e,t){let n=Ur(e,t);return this._addDefinitions([n])}_addDefinitions(e){let t={...this._node.subCommands};for(let n of e){let r=[n.name,...n[ve].meta.aliases??[]];for(let o of Object.values(t))if([o.meta.name,...o.meta.aliases??[]].some((i)=>r.includes(i)))throw new p("DEFINITION",`Command name "${n.name}" is already registered on this command`,{subject:"command",name:n.name,reason:"command-collision"});let s=_(n,this._node);t[n.name]=s}return this._clone({subCommands:t})}async snapshot(){return j(M(this._node,_).rootNode)}async run(e,...t){let n=t[0]??{},r=t[1];return await we(this._node,{path:e,input:n},r,_)}at(e){be(M(this._node,_).rootNode,e);let t=this._node,n=Object.freeze([...e]);return{path:n,async run(...r){let s=r[0]??{},o=r[1];return await we(t,{path:n,input:s},o,_)}}}async execute(e){return await xt(this._node,e,_)}};import{existsSync as Oe,lstatSync as Pt,mkdirSync as kt,readFileSync as os,readdirSync as Ft,realpathSync as Rt,statSync as Dt,writeFileSync as At}from"node:fs";import{dirname as Mt,join as P,resolve as Tt,sep as is}from"node:path";import{fileURLToPath as as}from"node:url";function Ot(e){return e instanceof Error&&"code"in e&&typeof e.code==="string"}import{isAbsolute as qr,relative as Hr,sep as Gr}from"node:path";function $t(e,t){let n=Hr(e,t);return n===""||!qr(n)&&n!==".."&&!n.startsWith(`..${Gr}`)}import{spawn as cs,spawnSync as ls}from"node:child_process";import{once as us}from"node:events";import{accessSync as Ct,constants as Et,statSync as It}from"node:fs";import{delimiter as Yr,extname as Kr,join as Jr,resolve as Xr,sep as Zr,win32 as Qr}from"node:path";import{spawn as es}from"node:child_process";import{once as ts}from"node:events";import{text as jt}from"node:stream/consumers";function Nt(e){if(e?.startsWith("bun"))return"bun";if(e?.startsWith("pnpm"))return"pnpm";if(e?.startsWith("yarn"))return"yarn";if(e?.startsWith("npm"))return"npm";return null}var ns=/[\0\r\n"%!^`<>&|]/,Se=/([()\][%!^"`<>&|;, *?])/g;function rs(e){let t=e.replace(/(?=(\\+?)?)\1"/g,"$1$1\\\"");return t=t.replace(/(?=(\\+?)?)\1$/g,"$1$1"),t=`"${t}"`.replace(Se,"^$1"),t.replace(Se,"^$1")}function ss(e,t,n,r=process.platform){if(n||r!=="win32"||!/\.(cmd|bat)$/i.test(e))return null;let s=Qr.normalize(e);for(let[i,a]of[s,...t].entries())if(ns.test(a)){let c=i===0?"command":`argument ${i}`;throw Error(`Windows command shim ${c} ${JSON.stringify(a)} contains unsafe shell characters`)}let o=[s.replace(Se,"^$1"),...t.map(rs)].join(" ");return{command:process.env.ComSpec??"cmd.exe",args:["/d","/s","/c",`"${o}"`],windowsVerbatimArguments:!0}}async function B(e,t=[],n={}){let r=ss(e,t,n.shell),s=(n.stdio??"collect")==="collect",o=s&&n.stdout!=="ignore",i=es(r?.command??e,r?.args??t,{cwd:n.cwd,env:n.env,shell:n.shell,stdio:s?["ignore",o?"pipe":"ignore","pipe"]:"inherit",windowsVerbatimArguments:r?.windowsVerbatimArguments}),[a,c,[l]]=await Promise.all([o?jt(i.stdout):"",s?jt(i.stderr):"",ts(i,"close")]);return{exitCode:l,stdout:a,stderr:c}}function xe(e){if(e.includes(Zr)||e.includes("/")){try{if(Ct(e,Et.X_OK),It(e).isFile())return e}catch{}return null}let t=process.platform==="win32"&&!Kr(e)?(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";"):[""];for(let n of process.env.PATH?.split(Yr)??[])for(let r of t){let s=Xr(Jr(n,e+r));try{if(Ct(s,Et.X_OK),It(s).isFile())return s}catch{}}return null}function fs(e,t){return e.replace(/\{\{\s*(\w+)\s*\}\}/g,(n,r)=>Object.hasOwn(t,r)?t[r]??n:n)}function ds(e){let t=Mt(e),n=e.slice(t==="."?0:t.length+1);if(n.startsWith("_")&&!n.startsWith("__")){let r=`.${n.slice(1)}`;return t==="."?r:P(t,r)}return e}function ms(e){if(!Oe(e))return!1;if(!Dt(e).isDirectory())return!1;return Ft(e).length>0}function gs(e,t){let n=e;for(let r of t.split(is)){n=P(n,r);let s;try{s=Pt(n).isSymbolicLink()}catch(i){if(Ot(i)&&i.code==="ENOENT")return;throw i}if(!s)continue;let o;try{o=Rt(n)}catch{}if(o===void 0||!$t(e,o))throw Error(`Destination path "${n}" is a symlink${o===void 0?" to a missing target":` to "${o}"`} outside the destination "${e}". Remove the link or choose another destination.`)}}async function $e(e){let{template:t,dest:n,context:r,conflict:s="abort"}=e,o=t instanceof URL?as(t):Tt(t),i=Tt(n);if(!Oe(o))throw Error(`Template directory "${o}" does not exist (from template: "${String(t)}").`);if(!Dt(o).isDirectory())throw Error(`Template path "${o}" is not a directory (from template: "${String(t)}").`);if(s==="abort"&&ms(i))throw Error(`Destination directory "${i}" already exists and is non-empty. Use conflict: "overwrite" to proceed.`);let a=Ft(o,{recursive:!0,encoding:"utf8"}).filter((f)=>Pt(P(o,f)).isFile());kt(i,{recursive:!0});let c=Rt(i),l=a.map((f)=>({relFromTemplate:f,destRelPath:ds(f)}));for(let{destRelPath:f}of l)gs(c,f);let u=[];for(let{relFromTemplate:f,destRelPath:g}of l){let d=P(o,f),m=P(c,g);kt(Mt(m),{recursive:!0});let h=os(d);if(h.subarray(0,8192).includes(0))At(m,h);else{let w=fs(h.toString("utf-8"),r);At(m,w,"utf-8")}u.push(g)}return{files:u}}var hs=[["bun.lock","bun"],["bun.lockb","bun"],["pnpm-lock.yaml","pnpm"],["yarn.lock","yarn"],["package-lock.json","npm"]];function ps(e){let t=e??process.cwd();for(let[n,r]of hs)if(Oe(P(t,n)))return r;return Nt(process.env.npm_config_user_agent)??"npm"}function Bt(e){try{return ls("git",["rev-parse","--is-inside-work-tree"],{cwd:e??process.cwd(),stdio:"ignore"}).status===0}catch{return!1}}async function Ce(e,t){for(let n of e)switch(n.type){case"install":await bs(t);break;case"git-init":await ws(t,n.commit);break;case"open-editor":await ys(t);break;case"command":await vs(n.cmd,n.cwd??t)}}async function bs(e){let t=ps(e),n=xe(t);if(!n)throw Error(`Package manager "${t}" was not found on PATH. Install ${t} and try again.`);let{exitCode:r}=await B(n,["install"],{cwd:e,stdio:"inherit"});if(r!==0)throw Error(`"${t} install" exited with code ${r}`)}async function ws(e,t){let n=xe("git");if(!n)throw Error('"git" was not found on PATH. Install Git and try again.');if(await L([n,"init"],e,"git init"),t)await Ss(e,n),await L([n,"add","."],e,"git add"),await L([n,"commit","-m",t],e,"git commit")}async function ys(e){let t=process.env.EDITOR||"code";try{let n=cs(t,[e],{stdio:"ignore",shell:process.platform==="win32"});n.unref();let r=await Promise.race([us(n,"close").then(([s])=>({kind:"exited",code:s})),new Promise((s)=>setTimeout(()=>s({kind:"timeout"}),500))]);if(r.kind==="exited"&&r.code!==0)console.warn(`Warning: could not open editor "${t}" (exit code ${r.code})`)}catch{console.warn(`Warning: could not open editor "${t}"`)}}async function vs(e,t){let{exitCode:n}=await B(e,[],{cwd:t,shell:!0,stdio:"inherit"});if(n!==0)throw Error(`Command "${e}" exited with code ${n}`)}async function Ss(e,t){let n=await _t(t,"user.name",e)===0,r=await _t(t,"user.email",e)===0;if(!n)await L([t,"config","user.name","Crust"],e,"git config user.name");if(!r)await L([t,"config","user.email","crust@scaffolded.project"],e,"git config user.email")}async function _t(e,t,n){let{exitCode:r}=await B(e,["config",t],{cwd:n,stdio:"collect",stdout:"ignore"});return r}async function L(e,t,n){let{exitCode:r,stderr:s}=await B(e[0],e.slice(1),{cwd:t,stdio:"collect",stdout:"ignore"});if(r!==0)throw Error(`"${n}" failed with exit code ${r}${s?`: ${s.trim()}`:""}`)}var Lt=Object.defineProperty,xs=(e,t)=>{let n={};for(var r in e)Lt(n,r,{get:e[r],enumerable:!0});if(!t)Lt(n,Symbol.toStringTag,{value:"Module"});return n},Os=new Intl.Segmenter(void 0,{granularity:"grapheme"}),$s=/[\p{Cc}\p{Cf}\p{Mn}\p{Me}]/u,Cs=/\p{Emoji_Presentation}|\p{Emoji}\uFE0F/u,Es=new RegExp([String.raw`(?:\x1b\[|\x9b)[^\x1b\x18\x1a\x9c\x40-\x7e]*[\x40-\x7e\x18\x1a\x9c]?`,String.raw`(?:\x1b\]|\x9d)[^\x07\x1b\x18\x1a\x9c]*(?:\x07|\x1b\\|[\x18\x1a\x9c])?`,String.raw`(?:\x1b[PX^_]|[\x90\x98\x9e\x9f])[^\x1b\x18\x1a\x9c]*(?:\x1b\\|[\x18\x1a\x9c])?`,String.raw`\x1b[\x20-\x2f][^\x1b]?`,String.raw`\x1b[\x18\x1a\x9c\x30-\x7e]?`].join("|"),"g");function Is(e){return e>=4352&&(e<=4447||e===9001||e===9002||e>=11904&&e<=42191&&e!==12351||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65135||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=94176&&e<=111355||e>=127488&&e<=127743||e>=131072&&e<=262141)}function js(e){return $s.test(String.fromCodePoint(e))||e>=4448&&e<=4607||e>=55216&&e<=55295}function Ns(e){if(!/[^\x20-\x7e]/.test(e))return e.length;let t=0;for(let{segment:n}of Os.segment(e.replace(Es,""))){if(Cs.test(n)){let r=n.codePointAt(0);t+=n.length===2&&r>=127462&&r<=127487?1:2;continue}for(let r of n){let s=r.codePointAt(0);if(js(s))continue;t+=Is(s)?2:1;break}}return t}function Vt(e){return globalThis.Bun?.stringWidth(e,{countAnsiEscapeCodes:!1})??Ns(e)}var ks=xs({bgBlack:()=>eo,bgBlue:()=>so,bgBrightBlack:()=>co,bgBrightBlue:()=>mo,bgBrightCyan:()=>ho,bgBrightGreen:()=>uo,bgBrightMagenta:()=>go,bgBrightRed:()=>lo,bgBrightWhite:()=>po,bgBrightYellow:()=>fo,bgCyan:()=>io,bgGreen:()=>no,bgMagenta:()=>oo,bgRed:()=>to,bgWhite:()=>ao,bgYellow:()=>ro,black:()=>Ms,blue:()=>Ws,bold:()=>As,brightBlue:()=>Js,brightCyan:()=>Zs,brightGreen:()=>Ys,brightMagenta:()=>Xs,brightRed:()=>Gs,brightWhite:()=>Qs,brightYellow:()=>Ks,cyan:()=>Vs,dim:()=>Ts,gray:()=>Hs,green:()=>Ls,hidden:()=>Rs,inverse:()=>Fs,isModifierName:()=>qt,italic:()=>_s,magenta:()=>Us,red:()=>Bs,strikethrough:()=>Ds,styleMethodNames:()=>Ie,underline:()=>Ps,white:()=>qs,yellow:()=>zs});function y(e,t){return{open:`\x1B[${e}m`,close:`\x1B[${t}m`}}var As=y(1,22),Ts=y(2,22),_s=y(3,23),Ps=y(4,24),Fs=y(7,27),Rs=y(8,28),Ds=y(9,29),Ms=y(30,39),Bs=y(31,39),Ls=y(32,39),zs=y(33,39),Ws=y(34,39),Us=y(35,39),Vs=y(36,39),qs=y(37,39),Hs=y(90,39),Gs=y(91,39),Ys=y(92,39),Ks=y(93,39),Js=y(94,39),Xs=y(95,39),Zs=y(96,39),Qs=y(97,39),eo=y(40,49),to=y(41,49),no=y(42,49),ro=y(43,49),so=y(44,49),oo=y(45,49),io=y(46,49),ao=y(47,49),co=y(100,49),lo=y(101,49),uo=y(102,49),fo=y(103,49),mo=y(104,49),go=y(105,49),ho=y(106,49),po=y(107,49),Ie=Object.freeze(["bold","dim","italic","underline","inverse","hidden","strikethrough","black","red","green","yellow","blue","magenta","cyan","white","gray","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","bgBrightBlack","bgBrightRed","bgBrightGreen","bgBrightYellow","bgBrightBlue","bgBrightMagenta","bgBrightCyan","bgBrightWhite"]),bo=new Set(["bold","dim","italic","underline","inverse","hidden","strikethrough"]);function qt(e){return bo.has(e)}function z(e,t,n){return e!==void 0&&t in e?e[t]:n}function Ht(e){return z(e,"isTTY",process.stdout?.isTTY)??!1}function Gt(e){return z(e,"forceColor",process.env.FORCE_COLOR)}function Yt(e){return e==="0"||e==="false"}function wo(e){let t=e.toLowerCase();return t.includes("24bit")||t.includes("truecolor")||t.endsWith("-direct")}function Kt(e,t){if(e!==void 0){let n=e.toLowerCase();if(n==="truecolor"||n==="24bit")return!0}return t!==void 0&&wo(t)}function zt(e,t){if(Kt(e,t))return"truecolor";if(t!==void 0&&t.toLowerCase().includes("256color"))return"256";return"16"}function yo(e,t){if(e==="never")return"none";if(e==="always")return"truecolor";let n=z(t,"colorTerm",process.env.COLORTERM),r=z(t,"term",process.env.TERM),s=Gt(t);if(s!==void 0){if(Yt(s))return"none";if(s==="1")return"16";if(s==="2")return"256";if(s==="3")return"truecolor";return zt(n,r)}if(!Ht(t))return"none";let o=z(t,"noColor",process.env.NO_COLOR);if(o!==void 0&&o!=="")return"none";if(r!==void 0&&r.toLowerCase()==="dumb"&&!Kt(n,r))return"none";return zt(n,r)}function vo(e,t){if(e==="always")return!0;if(e==="never")return!1;let n=Gt(t);if(n!==void 0)return!Yt(n);return Ht(t)}var Jt={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};function je(e,t){if(e==null)return"";let n=String(e);if(n==="")return"";let{open:r,close:s}=t;if(n.includes(s))n=n.replaceAll(s,s+r);return r+n+s}var So="\x1B[39m",xo="\x1B[49m",Oo="\x1B[38;",$o="\x1B[48;";function Co(e){try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Eo(e){return Object.hasOwn(Jt,e)}function Ne(e){if(Array.isArray(e)){if(e.length===3&&e.every((t)=>Number.isInteger(t)&&t>=0&&t<=255))return[e[0],e[1],e[2]]}else if(typeof e==="string"){let t=e.toLowerCase();if(Eo(t))return Jt[t];let n=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(t)?.[1];if(n){let s=n.length===3?n.split("").map((o)=>o+o).join(""):n;return[Number.parseInt(s.slice(0,2),16),Number.parseInt(s.slice(2,4),16),Number.parseInt(s.slice(4,6),16)]}let r=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/.exec(t)??/^rgb\(\s*(\d{1,3})\s+(\d{1,3})\s+(\d{1,3})\s*\)$/.exec(t);if(r){let s=[Number(r[1]),Number(r[2]),Number(r[3])];if(s.every((o)=>o<=255))return s}}throw TypeError(`Invalid color input: ${Co(e)}`)}function Io(e,t,n){let r=[0,95,135,175,215,255],s=(f)=>r.reduce((g,d,m)=>Math.abs(d-f)<Math.abs(r[g]-f)?m:g,0),[o,i,a]=[s(e),s(t),s(n)],c=Math.min(23,Math.max(0,Math.round(((e+t+n)/3-8)/10))),l=8+c*10,u=(f,g,d)=>(e-f)**2+(t-g)**2+(n-d)**2;return u(l,l,l)<u(r[o],r[i],r[a])?232+c:16+36*o+6*i+a}function Xt(e,t,n){let r=Math.round(Math.max(e,t,n)/127.5);if(r===0)return 30;let s=30+((Math.round(n/255)<<2|Math.round(t/255)<<1|Math.round(e/255))&7);if(r===2)s+=60;return s}function Zt(e,t){let[n,r,s]=Ne(e);if(t==="16")return`\x1B[${Xt(n,r,s)}m`;if(t==="256")return`\x1B[38;5;${Io(n,r,s)}m`;return`\x1B[38;2;${n};${r};${s}m`}function jo(e,t){if(t==="16"){let[n,r,s]=Ne(e);return`\x1B[${Xt(n,r,s)+10}m`}return Zt(e,t).replace(Oo,$o)}function ke(e,t,n){if(n==="none")return Ne(t),{open:"",close:""};return{open:e==="fg"?Zt(t,n):jo(t,n),close:e==="fg"?So:xo}}function Qt(e,t){return ke("fg",e,t)}function en(e,t){return ke("bg",e,t)}function tn(e,t,n,r){let s=ke(e,n,r);return r==="none"?t:je(t,s)}function No(e,t,n="truecolor"){return tn("fg",e,t,n)}function ko(e,t,n="truecolor"){return tn("bg",e,t,n)}var nn="\x1B]",rn="\x1B\\",Ao=`${nn}8;;${rn}`;function sn(e,t,n,r=""){if(!n.test(e))throw TypeError(`Invalid ${t}: ${JSON.stringify(e)} must contain only printable ASCII characters${r}.`)}function To(e){let t=e?.id;if(t===void 0||t==="")return"";if(sn(t,"hyperlink id",/^[\x20-\x7e]*$/),t.includes(":")||t.includes(";"))throw TypeError('Invalid hyperlink id: ":" and ";" are reserved by the OSC 8 format.');return`id=${t}`}function on(e,t){sn(e,"hyperlink URL",/^[\x21-\x7e]*$/," without spaces");let n=To(t);return{open:`${nn}8;${n};${e}${rn}`,close:Ao}}function _o(e,t,n){return je(e,on(t,n))}var an=[["fg",Qt,No],["bg",en,ko]],Po=ks;function Fo(e){return e.kind==="named"&&qt(e.name)}function Ee(e,t){if(e.kind==="named")return Po[e.name];return e.kind==="fg"?Qt(e.input,t):en(e.input,t)}function Wt(e,t,n){if(e==null)return"";let r=String(e);if(r==="")return r;let s=n(),{modifiersEnabled:o,colorsEnabled:i}=s;for(let a=t.length-1;a>=0;a--){let c=t[a];if(c===void 0)continue;if(Fo(c)?!o:!i)continue;r=je(r,Ee(c,s.colorDepth))}return r}function Ro(e){return Array.isArray(e)&&"raw"in e&&Array.isArray(e.raw)}function Do(e,t){let n=new Map,r=t?"truecolor":e().colorDepth;function s(o){let i=o.map((f)=>f.kind==="named"?f.name:`~${Ee(f,"truecolor").open}`).join("|"),a=n.get(i);if(a)return a;let c=(f,...g)=>{if(Ro(f)){let d="";for(let m=0;m<f.length;m++)if(d+=f[m]??"",m<g.length)d+=String(g[m]);return Wt(d,o,e)}return Wt(f,o,e)};if(n.size>=1024)n.delete(n.keys().next().value);n.set(i,c);for(let f of Ie)Object.defineProperty(c,f,{configurable:!1,enumerable:!0,get(){return s([...o,{kind:"named",name:f}])}});for(let[f,g]of an)Object.defineProperty(c,f,{configurable:!1,enumerable:!0,value:(d)=>(g(d,"truecolor"),s([...o,{kind:f,input:d}])),writable:!1});let l="",u="";for(let f of o){let g=Ee(f,r);l+=g.open,u=g.close+u}return Object.defineProperty(c,"open",{value:l,writable:!1,configurable:!1,enumerable:!0}),Object.defineProperty(c,"close",{value:u,writable:!1,configurable:!1,enumerable:!0}),Object.freeze(c)}return s}function Mo(e){let t={};for(let n of Ie)t[n]=e([{kind:"named",name:n}]);return t}function Ut(e){let t=e?.mode??"auto",n=vo(t,e?.overrides),r=yo(t,e?.overrides);return{modifiersEnabled:n,colorDepth:r,colorsEnabled:r!=="none",trueColorEnabled:r==="truecolor"}}function Bo(e,t){let n=t?Ut:(()=>{let i=Ut(e);return()=>i})(),r=Do(n,t),s=Mo(r),o={get enabled(){let{modifiersEnabled:i,colorsEnabled:a}=n();return i||a},get colorsEnabled(){return n().colorsEnabled},get trueColorEnabled(){return n().trueColorEnabled},get colorDepth(){return n().colorDepth},link(i,a,c){if(n().modifiersEnabled)return _o(i,a,c);return on(a,c),i},...Object.fromEntries(an.map(([i,a,c])=>[i,(...l)=>{let u=n();if(l.length===1)return a(l[0],"truecolor"),r([{kind:i,input:l[0]}]);return c(l[0],l[1],u.colorDepth)}])),...s};return Object.freeze(o)}var b=Bo(void 0,!0),{black:Sa,red:K,green:J,yellow:xa,blue:Oa,magenta:cn,cyan:W,white:$a,gray:Ca,brightRed:Ea,brightGreen:Ia,brightYellow:ja,brightBlue:Na,brightMagenta:ka,brightCyan:Aa,brightWhite:Ta,bgBlack:_a,bgRed:Pa,bgGreen:Fa,bgYellow:Ra,bgBlue:Da,bgMagenta:Ma,bgCyan:Ba,bgWhite:La,bgBrightBlack:za,bgBrightRed:Wa,bgBrightGreen:Ua,bgBrightYellow:Va,bgBrightBlue:qa,bgBrightMagenta:Ha,bgBrightCyan:Ga,bgBrightWhite:Ya,bold:X,dim:Z,italic:Ka,underline:Ja,inverse:Xa,hidden:Za,strikethrough:Qa,link:ec,fg:tc,bg:nc}=b;var ln={spinner:cn,message:X,success:J,error:K},_e="\x1B[",Lo=`${_e}?25l`,un=`${_e}?25h`,dn=`${_e}2K`,mn="\r",fn={dots:{frames:["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],interval:80},line:{frames:["-","\\","|","/"],interval:130},arc:{frames:["◐","◓","◑","◒"],interval:100},bounce:{frames:["⠁","⠂","⠄","⡀","⢀","⠠","⠐","⠈"],interval:120}},zo="✓",Wo="✗";function Uo(e){if(e===void 0)return fn.dots;if(typeof e==="string")return fn[e];if(e.frames.length===0)throw Error("A custom spinner requires at least one frame");return e}function Ae(e,t){let n=e[t];if(n===void 0)throw Error("Spinner frame index is out of bounds");return n}function Te(e,t,n){return`${dn}${mn}${n.spinner(e)} ${n.message(t)}`}function Vo(e,t,n,r){let s=n==="success"?zo:Wo,o=`${(n==="success"?t.success:t.error)(s)} ${t.message(e)}
11
+ `;return r?dn+mn+o:o}function qo(e){let t=e.sink??V()?.output??process.stderr,n=e.theme?{...ln,...e.theme}:ln,r=t.isTTY??!1,{frames:s,interval:o}=Uo(e.spinner),i=e.sigint??"exit",a=e.message,c=0,l=!1,u=!1,f,g;function d(){if(f!==void 0)clearInterval(f),f=void 0;if(g)process.removeListener("SIGINT",g),g=void 0}return{start(){if(l||u)return;if(l=!0,!r)return;if(t.write(Lo),t.write(Te(Ae(s,0),a,n)),f=setInterval(()=>{c=(c+1)%s.length,t.write(Te(Ae(s,c),a,n))},o),i==="exit")g=()=>{if(d(),u=!0,t.write(un),process.listenerCount("SIGINT")===0)process.kill(process.pid,"SIGINT")},process.once("SIGINT",g)},updateMessage(m){if(u)return;if(a=m,l&&r)t.write(Te(Ae(s,c),a,n))},stop(m="success",h){if(u)return;if(u=!0,h!==void 0)a=h;if(d(),t.write(Vo(a,n,m,l&&r)),l&&r)t.write(un)}}}function Pe(e){let t=qo(e),{task:n}=e;if(!n)return t;return t.start(),Promise.resolve().then(()=>n(t)).then((r)=>(t.stop("success"),r),(r)=>{throw t.stop("error"),r})}import*as k from"node:readline";var gn={prefix:W,message:X,placeholder:Z,cursor:W,selected:W,unselected:Z,error:K,success:J,hint:Z,filterMatch:W};function ee(e){let t=V();return{input:e?.input??t?.input??process.stdin,output:e?.output??t?.output??process.stderr}}var De=Symbol("submit");function Me(e){return{[De]:e}}var Fe=new WeakSet,Re=new WeakSet,pn="\x1B[",Ho=`${pn}?25l`,Go=`${pn}?25h`;function hn(e,t){let n=e.split(`
12
+ `),r=0;for(let s of n){let o=Vt(s);r+=o===0?1:Math.ceil(o/t)}return r}var Yo=class extends Error{constructor(e){super(e??"Prompts require an interactive terminal (TTY).");this.name="NonInteractiveError"}};function bn(e=ee().input){return!!e.isTTY}function Ko(e=ee().input){if(!bn(e))throw new Yo}function Jo(e){return typeof e==="object"&&e!==null&&De in e}function Be(e,t){let{render:n,handleKey:r,initialState:s,renderSubmitted:o}=e,i=e.theme?{...gn,...e.theme}:gn,{input:a,output:c}=ee(t),l=c;return new Promise((u,f)=>{if(Fe.has(a)||Re.has(c)){f(Error("Cannot run multiple prompts concurrently on the same input or output stream. Await each prompt before starting the next."));return}Ko(a),Fe.add(a),Re.add(c);let g=s,d=0,m=!1,h=!1;function w(){if(m)return;if(m=!0,Fe.delete(a),Re.delete(c),a.removeListener("keypress",E),h)a.setRawMode?.(!1);a.pause(),c.write(Go)}function S(C){let N=c.columns||80;if(d>0)k.cursorTo(l,0),k.moveCursor(l,0,-(d-1)),k.clearScreenDown(l);c.write(C),d=hn(C,N)}let x=Promise.resolve(),v=null;function O(){if(v!==null)return;v=setTimeout(()=>{if(v=null,m)return;try{S(n(g,i))}catch(C){w(),f(C)}},0)}function I(){if(v!==null)clearTimeout(v),v=null}function E(C,N){if(N?.ctrl&&N.name==="c"){I(),c.write(`
13
+ `),w(),f(new DOMException("Prompt was cancelled.","AbortError"));return}let Nn={char:C??"",name:N?.name??"",ctrl:N?.ctrl??!1,meta:N?.meta??!1,shift:N?.shift??!1};x=x.then(async()=>{if(m)return;try{let F=await r(Nn,g);if(m)return;if(Jo(F)){I();let We=F[De];if(o)S(o(g,We,i));c.write(`
14
+ `),w(),u(We)}else g=F,O()}catch(F){I(),w(),f(F)}})}try{if(k.emitKeypressEvents(a),a.setRawMode)a.setRawMode(!0),h=!0;a.resume(),c.write(Ho);let C=n(g,i);c.write(C),d=hn(C,c.columns||80),a.on("keypress",E)}catch(C){w(),f(C)}})}async function Q(e,t,n){if(e.initial!==void 0)return{shortCircuited:!0,value:n?await n(e.initial,"initial"):e.initial};let r=ee(t);if(!bn(r.input)&&e.default!==void 0)return{shortCircuited:!0,value:n?await n(e.default,"default"):e.default};return{shortCircuited:!1,promptIO:r}}function Le(e,t,n){let r=[e];if(t)r.push(t);if(n)r.push(n);return r.join(" ")}function wn(e,t,n,r){let s=t?`${e} ${t}`:e,o=r??"";if(t)return`${s}${o}
15
+ ${n}`;return`${s}${o} ${n}`}function Xo(e,t,n,r,s){let o=Math.min(e.length,n),i=[];if(t>0)i.push(s("..."));for(let a=t;a<t+o;a++){let c=e[a];if(c===void 0)break;i.push(r(c,a))}if(t+o<e.length)i.push(s("..."));return i}function yn(e,t,n,r){let s=Math.min(n,r);if(e<t)return e;if(e>=t+s)return e-s+1;return t}function Zo(e,t,n,r,s){let o=n===-1?e<=0?t-1:e-1:e>=t-1?0:e+1;return{cursor:o,scrollOffset:yn(o,r,t,s)}}function Qo(e){return e.map((t)=>{if(typeof t==="string")return{label:t,value:t};return t})}function ei(e,t){if(e.name==="return")return Me(t.value);if(e.name==="left"||e.name==="right"||e.name==="tab")return{value:!t.value};if(e.name==="h"||e.char==="y"||e.char==="Y")return{value:!0};if(e.name==="l"||e.char==="n"||e.char==="N")return{value:!1};return t}var ti=" · ";function ni(e,t,n,r,s){let o=t.prefix("┃"),i=t.message(n??"Are you sure?"),a=e.value?`${t.selected("●")} ${t.selected(r)}`:`${t.unselected("○")} ${t.unselected(r)}`,c=e.value?`${t.unselected("○")} ${t.unselected(s)}`:`${t.selected("●")} ${t.selected(s)}`;return wn(o,i,`${a}${ti}${c}`)}function ri(e,t,n,r,s,o){let i=n.success("✓"),a=n.message(r??"Are you sure?"),c=t?s:o;return Le(i,a,n.success(c))}async function te(e,t){let n=await Q(e,t);if(n.shortCircuited)return n.value;let{promptIO:r}=n,s=e.active??"Yes",o=e.inactive??"No";return Be({initialState:{value:e.default??!0},theme:e.theme,render:(i,a)=>ni(i,a,e.message,s,o),handleKey:ei,renderSubmitted:(i,a,c)=>ri(i,a,c,e.message,s,o)},r)}async function si(e,t,n){let r=await Q(e,n);if(r.shortCircuited)return r;let s=Qo(e.choices),o=e.maxVisible??10,i=e.default===void 0?[]:t==="multiple"?e.default:[e.default],a=new Set(i.flatMap((u)=>{let f=s.findIndex((g)=>g.value===u);return f===-1?[]:[f]})),c=i.length===0?-1:s.findIndex((u)=>u.value===i[0]),l=c===-1?0:c;return{shortCircuited:!1,choices:s,maxVisible:o,cursor:l,scrollOffset:yn(l,0,s.length,o),selected:a,promptIO:r.promptIO}}async function vn(e,t,n){if(t){let r=await t["~standard"].validate(e),s=r.issues?.[0];if(s)return{ok:!1,error:s.message||"Validation failed"};if("value"in r)return{ok:!0,value:r.value};return{ok:!1,error:"Validation failed"}}if(n)try{await n(e)}catch(r){return{ok:!1,error:r instanceof Error?r.message:"Validation failed"}}return{ok:!0,value:e}}async function oi(e,t,n){let r=await vn(t,e,void 0);if(!r.ok)throw Error(`${n} value rejected by schema: ${r.error}`);return r.value}function ii(e,t,n,r){if(e==="")return r?n.placeholder(r):n.cursor("│");return`${e.slice(0,t)}${n.cursor("│")}${e.slice(t)}`}function ai(e,t,n){if(e.name==="backspace"){if(n===0)return{text:t,cursorPos:n};return{text:t.slice(0,n-1)+t.slice(n),cursorPos:n-1}}if(e.name==="delete"){if(n>=t.length)return{text:t,cursorPos:n};return{text:t.slice(0,n)+t.slice(n+1),cursorPos:n}}if(e.name==="left"){if(n===0)return{text:t,cursorPos:n};return{text:t,cursorPos:n-1}}if(e.name==="right"){if(n>=t.length)return{text:t,cursorPos:n};return{text:t,cursorPos:n+1}}if(e.name==="home")return{text:t,cursorPos:0};if(e.name==="end")return{text:t,cursorPos:t.length};if(e.char.length===1&&!e.ctrl&&!e.meta){let r=t.slice(0,n),s=t.slice(n);return{text:r+e.char+s,cursorPos:n+1}}return null}function ci(e,t,n){return async(r,s)=>{if(r.name==="return"){let i=await vn(s.value===""&&n!==void 0?n:s.value,e,t);return i.ok?Me(i.value):{...s,error:i.error}}let o=ai(r,s.value,s.cursorPos);return o?{value:o.text,cursorPos:o.cursorPos,error:null}:s}}function li(e,t,n,r,s){let o=t.prefix("┃"),i=t.message(n??"Enter a value"),a=r??s,c=s!==void 0&&r!==void 0&&e.value===""?` ${t.hint(`(${s})`)}`:"",l=wn(o,i,ii(e.value,e.cursorPos,t,a),c);if(e.error!==null)l+=`
16
+ ${t.error(e.error)}`;return l}function ui(e,t,n,r){return Le(n.success("✓"),n.message(r??"Enter a value"),n.success(String(t)))}async function Sn(e={},t){if(e.schema!==void 0&&e.validate!==void 0)throw Error('input() cannot combine "schema" with "validate"');let n=e.schema,r=n?await Q(e,t,(o,i)=>oi(n,o,i)):await Q(e,t);if(r.shortCircuited)return r.value;let{promptIO:s}=r;return Be({initialState:{value:"",cursorPos:0,error:null},theme:e.theme,render:(o,i)=>li(o,i,e.message,e.placeholder,e.default),handleKey:ci(e.schema,e.validate,e.default),renderSubmitted:(o,i,a)=>ui(o,i,a,e.message)},s)}function fi(e){return(t,n)=>{let r=n.choices.length;if(t.name==="return"){let s=n.choices[n.cursor];if(s)return Me(s.value);return n}if(["up","down","k","j"].includes(t.name)){let s=t.name==="up"||t.name==="k"?-1:1;return{...n,...Zo(n.cursor,r,s,n.scrollOffset,e)}}return n}}function di(e,t,n,r){let s=[`${t.prefix("┃")} ${t.message(n??"Pick an option")}`];return s.push(...Xo(e.choices,e.scrollOffset,r,(o,i)=>{let a=o.hint?` ${t.hint(o.hint)}`:"";return i===e.cursor?`${t.cursor("›")} ${t.selected(o.label)}${a}`:` ${t.unselected(o.label)}${a}`},t.hint)),s.join(`
17
+ `)}function mi(e,t,n,r){let s=n.success("✓"),o=n.message(r??"Pick an option"),i=e.choices[e.cursor],a=i?i.label:"";return Le(s,o,n.success(a))}async function xn(e,t){let n=await si(e,"single",t);if(n.shortCircuited)return n.value;let{choices:r,cursor:s,maxVisible:o,promptIO:i,scrollOffset:a}=n;return Be({initialState:{cursor:s,choices:r,scrollOffset:a},theme:e.theme,render:(c,l)=>di(c,l,e.message,o),handleKey:fi(o),renderSubmitted:(c,l,u)=>mi(c,l,u,e.message)},i)}var On={name:"@crustjs/core",version:"0.3.2",description:"Core library for the Crust CLI framework",type:"module",sideEffects:!1,license:"MIT",author:"chenxin-yan",repository:{type:"git",url:"git+https://github.com/chenxin-yan/crust.git",directory:"packages/core"},homepage:"https://crustjs.com",bugs:{url:"https://github.com/chenxin-yan/crust/issues"},keywords:["cli","command","framework","parser","bun","typescript"],files:["dist"],types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./tooling":{types:"./dist/tooling.d.ts",import:"./dist/tooling.js"}},publishConfig:{access:"public"},scripts:{build:"tsdown",dev:"tsdown --watch","check:types":"tsc --noEmit",test:"bun test",prepack:"cp ../../LICENSE LICENSE",postpack:"rm -f LICENSE"},dependencies:{"@crustjs/utils":"workspace:^"},devDependencies:{"@crustjs/config":"workspace:*",tsdown:"catalog:"},peerDependencies:{typescript:"^7.0.0"},peerDependenciesMeta:{typescript:{optional:!0}},engines:{bun:">=1.4.0",node:">=22",deno:">=2.8"}};var $n={name:"@crustjs/crust",version:"0.3.2",description:"CLI tooling for the Crust framework",type:"module",license:"MIT",author:"chenxin-yan",repository:{type:"git",url:"git+https://github.com/chenxin-yan/crust.git",directory:"packages/crust"},homepage:"https://crustjs.com",bugs:{url:"https://github.com/chenxin-yan/crust/issues"},keywords:["cli","build","compile","standalone","bun","typescript"],publishConfig:{access:"public"},crust:{include:["schema"]},bin:{crust:"src/cli.ts"},scripts:{build:"bun src/cli.ts build",release:"bun src/cli.ts publish",dev:"bun src/cli.ts",start:"bun .crust/root/bin/crust.js","check:types":"tsc --noEmit",test:"bun test"},dependencies:{"@crustjs/core":"workspace:^","@crustjs/extensions":"workspace:^","@crustjs/style":"workspace:^"},devDependencies:{"@crustjs/config":"workspace:*","@crustjs/testing":"workspace:*","@crustjs/utils":"workspace:*"},engines:{bun:">=1.4.0"}};var Cn={name:"@crustjs/extensions",version:"0.3.2",description:"Official Extensions for the Crust CLI framework",type:"module",sideEffects:!1,license:"MIT",author:"chenxin-yan",repository:{type:"git",url:"git+https://github.com/chenxin-yan/crust.git",directory:"packages/extensions"},homepage:"https://crustjs.com",bugs:{url:"https://github.com/chenxin-yan/crust/issues"},keywords:["cli","extension","help","version","completion","did-you-mean","bun","typescript"],files:["dist"],exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"}},publishConfig:{access:"public"},scripts:{build:"tsdown",dev:"tsdown --watch","check:types":"tsc --noEmit",test:"bun test",prepack:"cp ../../LICENSE LICENSE",postpack:"rm -f LICENSE"},dependencies:{"@crustjs/store":"workspace:^","@crustjs/style":"workspace:^","@crustjs/utils":"workspace:^"},devDependencies:{"@crustjs/config":"workspace:*","@crustjs/core":"workspace:*",tsdown:"catalog:"},peerDependencies:{"@crustjs/core":"workspace:^",typescript:"^7.0.0"},peerDependenciesMeta:{typescript:{optional:!0}},engines:{bun:">=1.4.0",node:">=22",deno:">=2.8"}};var yi={bun:{run:"bun run",shebang:"#!/usr/bin/env bun",tsLib:'"ESNext"',tsTypes:'"bun"'},node:{run:"npm run",shebang:"#!/usr/bin/env node",tsLib:'"ESNext"',tsTypes:'"node"'},deno:{run:"deno task",shebang:"#!/usr/bin/env -S deno run -A",tsLib:'"ESNext", "deno.window"',tsTypes:""}},vi={crustCoreVersion:On.version,crustExtensionsVersion:Cn.version,crustCliVersion:$n.version},Si=/^[A-Za-z0-9_~][A-Za-z0-9._~-]*$/;function jn(e){if(e==="__proto__"||!Si.test(e))throw Error(`Project name ${JSON.stringify(e)} is not safe for the generated project.
18
+ The directory basename becomes the package and command name: use letters, digits, ".", "_", "~", and "-", not starting with "." or "-"; "__proto__" is reserved.`)}var xi=/[<>:"|?*\\]/;function Oi(e){if(!e)throw Error("Project directory cannot be empty");if(xi.test(e))throw Error(`Project directory contains invalid characters: ${e}`);jn(In(ze(e)))}var $i=new Y("create-crust",{description:"Scaffold a new Crust CLI project"}).flags({name:"runtime",type:"string",choices:["bun","node","deno"],description:'Runtime to develop and build for ("bun", "node", or "deno")'},{name:"install",type:"boolean",description:"Install dependencies after scaffolding"},{name:"git",type:"boolean",description:"Initialize a git repository after scaffolding"},{name:"overwrite",type:"boolean",description:"Overwrite the destination directory if it already exists"}).args({name:"directory",type:"string",description:"Project directory to scaffold into"}).action(async({args:e,flags:t})=>{let n=e.directory??await Sn({message:"Project directory",default:"my-cli",validate:Oi}),r=ze(process.cwd(),n),s=In(r);jn(s);let o=t.runtime,i=n==="."?bi(r).length>0:En(r),a=!1;if(i){if(a=await te({message:n==="."?"Current directory is not empty. Overwrite conflicting files?":`Directory "${s}" already exists. Overwrite?`,default:!1,...t.overwrite!==void 0?{initial:t.overwrite}:{}}),!a){console.log("Aborted.");return}}let c=await xn({message:"Runtime",choices:[{label:"Bun (recommended)",value:"bun",hint:"standalone binaries per platform, published as npm packages"},{label:"Node.js",value:"node",hint:"one JavaScript bundle, published as a single npm package"},{label:"Deno",value:"deno",hint:"standalone binaries per platform, published as npm packages"}],default:"bun",...o!==void 0?{initial:o}:{}}),l=await te({message:"Install dependencies?",default:!0,...t.install!==void 0?{initial:t.install}:{}}),u=En(r)?r:ze(r,".."),g=Bt(u)?!1:await te({message:"Initialize a git repository?",default:!0,...t.git!==void 0?{initial:t.git}:{}}),d=s,m=(w)=>wi(se("templates"),w),h={name:d,...yi[c],...vi};if(await Pe({message:"Scaffolding project...",task:async()=>{await $e({template:m("base"),dest:r,context:h,...a?{conflict:"overwrite"}:{}}),await $e({template:m(`runtime/${c}`),dest:r,context:h,conflict:"overwrite"})}}),l)await Ce([c==="deno"?{type:"command",cmd:"deno install"}:{type:"install"}],r);if(g)await Pe({message:"Initializing git repository...",task:()=>Ce([{type:"git-init",commit:"chore: initial commit"}],r)});if(console.log(`
19
19
  Created ${d}!
20
20
  `),console.log("Next steps:"),n!=="."){let w=n.startsWith("/")?n:`./${n}`;console.log(` cd ${w}`)}console.log(` ${h.run} dev`),console.log(` ${h.run} build`)});await $i.execute();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-crust",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Scaffold a new Crust CLI project.",
5
5
  "license": "MIT",
6
6
  "author": "chenxin-yan",
@@ -2,6 +2,7 @@
2
2
  "$schema": "./node_modules/@crustjs/crust/schema/package.json",
3
3
  "name": "{{name}}",
4
4
  "version": "0.0.0",
5
+ "private": true,
5
6
  "type": "module",
6
7
  "description": "A CLI built with Crust",
7
8
  "crust": {
@@ -2,6 +2,7 @@
2
2
  "$schema": "./node_modules/@crustjs/crust/schema/package.json",
3
3
  "name": "{{name}}",
4
4
  "version": "0.0.0",
5
+ "private": true,
5
6
  "type": "module",
6
7
  "description": "A CLI built with Crust",
7
8
  "crust": {
@@ -2,6 +2,7 @@
2
2
  "$schema": "./node_modules/@crustjs/crust/schema/package.json",
3
3
  "name": "{{name}}",
4
4
  "version": "0.0.0",
5
+ "private": true,
5
6
  "type": "module",
6
7
  "description": "A CLI built with Crust",
7
8
  "crust": {