@crossdelta/platform-sdk 0.25.7 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.mjs CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- var ca=Object.defineProperty;var Jt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var S=(e,t)=>()=>(e&&(t=e(e=0)),t);var la=(e,t)=>{for(var r in t)ca(e,r,{get:t[r],enumerable:!0})};var x,Ee=S(()=>{"use strict";x={SUCCESS:0,GENERAL_ERROR:1,USAGE_ERROR:2,WORKSPACE_ERROR:64,VALIDATION_ERROR:65,CONFIG_ERROR:66,IO_ERROR:74,PERMISSION_ERROR:77,CANCELLED:130}});var U,V,qe,Kt=S(()=>{"use strict";Ee();U=class extends Error{exitCode;category;hint;cause;constructor(t,r=x.GENERAL_ERROR,n={}){super(t),this.name="CliError",this.exitCode=r,this.category=n.category??"process",this.hint=n.hint,this.cause=n.cause}toUserMessage(){let t=[this.message];return this.hint&&t.push(`
3
- Hint: ${this.hint}`),t.join("")}},V=class extends U{path;constructor(t,r,n={}){super(t,x.IO_ERROR,{...n,category:"io"}),this.name="IoError",this.path=r}},qe=class extends U{constructor(t="Operation cancelled",r={}){super(t,x.CANCELLED,{...r,category:"user"}),this.name="CancelledError"}}});import Z from"chalk";var X,Cn,kn,xn,pa,ma,Ye,da,ua,$,wn=S(()=>{"use strict";Kt();Ee();X=e=>e instanceof Error,Cn=e=>X(e)?e.message:typeof e=="string"?e:String(e),kn=["ExitPromptError"],xn=["Cancelled prompt","User force closed"],pa=["ERR_USE_AFTER_CLOSE"],ma=e=>kn.some(t=>e.name?.includes(t))||xn.some(t=>e.message?.includes(t)),Ye=e=>{if(e instanceof qe)return!0;if(!(e instanceof Error))return!1;if(kn.some(r=>e.name?.includes(r))||xn.some(r=>e.message?.includes(r)))return!0;let t=e.code;return t&&pa.includes(t)?ma(e):!1},da=e=>{if(e instanceof U){let r=e.toUserMessage();return Z.red(`\u2716 ${r||"Unexpected error (re-run with DEBUG=true for details)"}`)}if(e instanceof Error){let r=e.message?.trim();return r?Z.red(`\u2716 ${r}`):Z.red("\u2716 Unexpected error (re-run with DEBUG=true for details)")}let t=String(e);return!t||t==="undefined"||t==="null"?Z.red("\u2716 Unexpected error (re-run with DEBUG=true for details)"):Z.red(`\u2716 ${t}`)},ua=e=>e instanceof U?e.exitCode:Ye(e)?x.CANCELLED:x.GENERAL_ERROR,$=(e,t={})=>{let{debug:r=process.env.DEBUG==="true",exit:n=!0,logger:o=console.error}=t;if(Ye(e)){n&&process.exit(x.CANCELLED);return}o(da(e)),r&&e instanceof Error&&e.stack&&o(Z.dim(e.stack)),e instanceof U&&e.hint&&o(Z.dim(`
4
- Hint: ${e.hint}`)),n&&process.exit(ua(e))}});var z=S(()=>{"use strict";Kt();wn();Ee()});var af,Pn,qt,Ze=S(()=>{"use strict";af=process.env.npm_package_version||"0.0.0",Pn=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"],qt="start:dev"});import Xe from"chalk";function Yt(e,t){if(e.length===0)return"No entries to display.";let r=t?.title||"Benchmark Results",n=t?.footer||"",o=t?.maxBarWidth||50,s=t?.unit||"",i=Math.max(...e.map(c=>c.value)),a=[];a.push(""),a.push(r),a.push("");for(let c of e){let l=ga(c.barColor??t?.barColor),p=fa(c,i,o,l,s,t?.labelColor);a.push(p)}return n&&(a.push(""),a.push(n)),a.join(`
5
- `)}function ga(e){return e?Xe[e]("\u2587"):"\u2587"}function fa(e,t,r,n,o,s){let i=Math.round(e.value/t*r),a=e.barColor?Xe[e.barColor](n.repeat(i)):n.repeat(i),c=e.color??s;return`${Xe.bold(c?Xe[c](e.label.padEnd(12)):e.label.padEnd(12))} ${a} ${e.value.toLocaleString()}${o?` ${o}`:""}`}var Sn=S(()=>{"use strict"});import{existsSync as Qt,unlinkSync as ha,writeFileSync as ya}from"fs";import{join as Xt}from"path";import Zt from"chokidar";var er,Qe,va,bn,tr,Ca,En,rr=S(()=>{"use strict";v();f();er=".pf-generating",Qe=e=>Xt(e,er),va=e=>Qt(Qe(e)),bn=e=>{ya(Qe(e),"","utf-8")},tr=e=>{let t=Qe(e);Qt(t)&&ha(t)},Ca=e=>{let r=F(e)?.pf?.paths;return r?Object.values(r).filter(n=>typeof n=="object"&&n!==null&&n.watch===!0&&typeof n.path=="string"):[{path:"services"},{path:"apps"}]},En=(e,t)=>{tr(e);let r=Ca(e),n=Qe(e),s=ae(async()=>{va(e)||await t()},300),i=[];i.push(Zt.watch(n,{ignoreInitial:!0}).on("unlink",()=>t()));for(let a of r){let c=Xt(e,a.path);if(!Qt(c))continue;let l=a.ignorePatterns?.map(p=>Xt(c,p));i.push(Zt.watch(c,{ignoreInitial:!0,depth:0,ignored:l,usePolling:!0,interval:1e3}).on("addDir",p=>p!==c&&s()).on("unlinkDir",p=>p!==c&&s())),i.push(Zt.watch(`${c}/*/package.json`,{ignoreInitial:!0,ignored:l}).on("add",s).on("change",s))}return async()=>{await Promise.all(i.map(a=>a.close()))}}});import Tn from"chalk";import{Command as ka}from"commander";import{Listr as $n}from"listr2";var J,xa,An,In=S(()=>{"use strict";z();rr();f();J=e=>{let t=new ka(e.name).description(e.description).showHelpAfterError();e.arguments?.forEach(([o,s])=>{t.argument(o,s)}),e.options?.forEach(([o,s])=>{t.option(o,s)}),e.exampleUsage&&t.addHelpText("after",()=>`${Tn.cyan.bold(`
2
+ var $s=Object.defineProperty;var xt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var Rs=(e,t)=>{for(var r in t)$s(e,r,{get:t[r],enumerable:!0})};var k,le=C(()=>{"use strict";k={SUCCESS:0,GENERAL_ERROR:1,USAGE_ERROR:2,WORKSPACE_ERROR:64,VALIDATION_ERROR:65,CONFIG_ERROR:66,IO_ERROR:74,PERMISSION_ERROR:77,CANCELLED:130}});var W,Re,wt=C(()=>{"use strict";le();W=class extends Error{exitCode;category;hint;cause;constructor(t,r=k.GENERAL_ERROR,n={}){super(t),this.name="CliError",this.exitCode=r,this.category=n.category??"process",this.hint=n.hint,this.cause=n.cause}toUserMessage(){let t=[this.message];return this.hint&&t.push(`
3
+ Hint: ${this.hint}`),t.join("")}},Re=class extends W{constructor(t="Operation cancelled",r={}){super(t,k.CANCELLED,{...r,category:"user"}),this.name="CancelledError"}}});import H from"chalk";var Ie,Rr,Ir,Is,Ns,Ne,Os,As,A,Nr=C(()=>{"use strict";wt();le();Ie=e=>e instanceof Error,Rr=["ExitPromptError"],Ir=["Cancelled prompt","User force closed"],Is=["ERR_USE_AFTER_CLOSE"],Ns=e=>Rr.some(t=>e.name?.includes(t))||Ir.some(t=>e.message?.includes(t)),Ne=e=>{if(e instanceof Re)return!0;if(!(e instanceof Error))return!1;if(Rr.some(r=>e.name?.includes(r))||Ir.some(r=>e.message?.includes(r)))return!0;let t=e.code;return t&&Is.includes(t)?Ns(e):!1},Os=e=>{if(e instanceof W){let r=e.toUserMessage();return H.red(`\u2716 ${r||"Unexpected error (re-run with DEBUG=true for details)"}`)}if(e instanceof Error){let r=e.message?.trim();return r?H.red(`\u2716 ${r}`):H.red("\u2716 Unexpected error (re-run with DEBUG=true for details)")}let t=String(e);return!t||t==="undefined"||t==="null"?H.red("\u2716 Unexpected error (re-run with DEBUG=true for details)"):H.red(`\u2716 ${t}`)},As=e=>e instanceof W?e.exitCode:Ne(e)?k.CANCELLED:k.GENERAL_ERROR,A=(e,t={})=>{let{debug:r=process.env.DEBUG==="true",exit:n=!0,logger:o=console.error}=t;if(Ne(e)){n&&process.exit(k.CANCELLED);return}o(Os(e)),r&&e instanceof Error&&e.stack&&o(H.dim(e.stack)),e instanceof W&&e.hint&&o(H.dim(`
4
+ Hint: ${e.hint}`)),n&&process.exit(As(e))}});var J=C(()=>{"use strict";wt();Nr();le()});var hm,Or,Pt,Oe=C(()=>{"use strict";hm=process.env.npm_package_version||"0.0.0",Or=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"],Pt="start:dev"});import Ae from"chalk";function bt(e,t){if(e.length===0)return"No entries to display.";let r=t?.title||"Benchmark Results",n=t?.footer||"",o=t?.maxBarWidth||50,s=t?.unit||"",i=Math.max(...e.map(c=>c.value)),a=[];a.push(""),a.push(r),a.push("");for(let c of e){let p=_s(c.barColor??t?.barColor),l=Ds(c,i,o,p,s,t?.labelColor);a.push(l)}return n&&(a.push(""),a.push(n)),a.join(`
5
+ `)}function _s(e){return e?Ae[e]("\u2587"):"\u2587"}function Ds(e,t,r,n,o,s){let i=Math.round(e.value/t*r),a=e.barColor?Ae[e.barColor](n.repeat(i)):n.repeat(i),c=e.color??s;return`${Ae.bold(c?Ae[c](e.label.padEnd(12)):e.label.padEnd(12))} ${a} ${e.value.toLocaleString()}${o?` ${o}`:""}`}var Ar=C(()=>{"use strict"});import{existsSync as Tt,unlinkSync as Ls,writeFileSync as Ms}from"fs";import{join as Et}from"path";import St from"chokidar";var js,_e,Fs,_r,$t,Ws,Dr,Rt=C(()=>{"use strict";h();v();js=".pf-generating",_e=e=>Et(e,js),Fs=e=>Tt(_e(e)),_r=e=>{Ms(_e(e),"","utf-8")},$t=e=>{let t=_e(e);Tt(t)&&Ls(t)},Ws=e=>{let r=$(e)?.pf?.paths;return r?Object.values(r).filter(n=>typeof n=="object"&&n!==null&&n.watch===!0&&typeof n.path=="string"):[{path:"services"},{path:"apps"}]},Dr=(e,t)=>{$t(e);let r=Ws(e),n=_e(e),s=z(async()=>{Fs(e)||await t()},300),i=[];i.push(St.watch(n,{ignoreInitial:!0}).on("unlink",()=>t()));for(let a of r){let c=Et(e,a.path);if(!Tt(c))continue;let p=a.ignorePatterns?.map(l=>Et(c,l));i.push(St.watch(c,{ignoreInitial:!0,depth:0,ignored:p,usePolling:!0,interval:1e3}).on("addDir",l=>l!==c&&s()).on("unlinkDir",l=>l!==c&&s())),i.push(St.watch(`${c}/*/package.json`,{ignoreInitial:!0,ignored:p}).on("add",s).on("change",s))}return async()=>{await Promise.all(i.map(a=>a.close()))}}});import Lr from"chalk";import{Command as Hs}from"commander";import{Listr as Mr}from"listr2";var L,Bs,jr,Fr=C(()=>{"use strict";J();Rt();v();L=e=>{let t=new Hs(e.name).description(e.description).showHelpAfterError();e.arguments?.forEach(([o,s])=>{t.argument(o,s)}),e.options?.forEach(([o,s])=>{t.option(o,s)}),e.exampleUsage&&t.addHelpText("after",()=>`${Lr.cyan.bold(`
6
6
  Example:`)}
7
- ${Tn.bold(e.exampleUsage)}
8
- `),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??"");let r=async o=>{e.prompts?.length&&await new $n(An(e.prompts,o),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(o),await new $n(An(e.actions,o),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(o),await e.onComplete?.(o)},n=()=>{try{let o=u();return bn(o),o}catch{return null}};return t.action(async(...o)=>{let s=null;try{let i=o.at(-1),a=i.args,c=i.opts(),l=xa(e.arguments??[],a);if(e.shouldSkipWorkflow?.(l,c)){await e.onSkipWorkflow?.(l,c);return}let p=await e.buildContext(l,c);s=n(),await r(p)}catch(i){$(i,{exit:!1})}finally{s&&tr(s)}}),t},xa=(e,t)=>{let r=e.map(([n],o)=>[n.replace(/[<>[\]]/g,""),t[o]]);return Object.fromEntries(r)},An=(e,t)=>e.map(r=>typeof r=="function"?r(t):r)});var ae,Rn=S(()=>{"use strict";ae=(e,t)=>{let r=null;return(...n)=>(r&&clearTimeout(r),new Promise(o=>{r=setTimeout(async()=>{r=null,await e(...n),o()},t)}))}});var Nn=S(()=>{"use strict"});import{execaSync as wa}from"execa";function Te(e){try{return wa(e,["--version"]),!0}catch{return!1}}var nr=S(()=>{"use strict"});var Fn=S(()=>{"use strict";nr()});import{readdirSync as Pa}from"fs";import{dirname as On,isAbsolute as Sa,join as ba,normalize as Ea,resolve as Mn,sep as Ta}from"path";import{fileURLToPath as $a}from"url";import{packageUpSync as Aa}from"package-up";import{rimraf as Ia}from"rimraf";function _n(){let e=Aa({cwd:On(Ra())});if(!e)throw new Error("Could not find package.json");return On(e)}var Ra,O,Dn,et,jn,or=S(()=>{"use strict";z();f();Ra=()=>typeof import.meta?.url=="string"?$a(import.meta.url):process.cwd(),O=e=>{let t=sr()?u():process.cwd();return ba(t,e)},Dn=(e,t)=>{if(!e?.trim())throw new V("Path cannot be empty",e,{hint:"Provide a valid relative path"});if(Sa(e))throw new V(`Absolute paths are not allowed: ${e}`,e,{hint:"Use a relative path within the target directory"});if(/^[a-zA-Z]:/.test(e))throw new V(`Windows drive paths are not allowed: ${e}`,e,{hint:"Use a relative path within the target directory"});if(e.replace(/\\/g,"/").split("/").some(a=>a===".."))throw new V(`Path traversal not allowed: ${e}`,e,{hint:"The path must stay within the target directory"});let o=Ea(e),s=Mn(t),i=Mn(t,o);if(!i.startsWith(s+Ta)&&i!==s)throw new V(`Path escapes target directory: ${e}`,e,{hint:"The path must stay within the target directory"});return i},et=e=>{try{return Pa(e).length===0}catch{return!0}};jn=e=>Ia(e)});import $e from"chalk";var Ln,Na,Fa,tt,d,Wn=S(()=>{"use strict";Ln={debug:0,info:1,warn:2,error:3,silent:4},Na=e=>e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent",Fa=()=>{let e=process.env.LOG_LEVEL;return Na(e)?e:process.env.DEBUG==="true"||process.env.VERBOSE==="true"?"debug":"info"},tt=e=>{let t=Fa();return Ln[e]>=Ln[t]},d={logs:[],breakLine:()=>(console.log(),d),success:(e,...t)=>(console.log($e.green(`\u2714 ${e}`),...t),d),info:(e,...t)=>(tt("info")&&console.log($e.cyan(`\u{1F6C8} ${e}`),...t),d),warn:(e,...t)=>(tt("warn")&&console.warn($e.yellow(`\u26A0\uFE0E ${e}`),...t),d),error:(e,...t)=>(tt("error")&&console.error($e.red(`\u2716 ${e}`),...t),d),debug:(e,...t)=>(tt("debug")&&console.log($e.dim(`[debug] ${e}`),...t),d),log:(e,...t)=>(console.log(e,...t),d.logs.push({message:e,context:t.join()}),d),getStoredLogs:e=>e?d.logs.filter(t=>t.context?.includes(e)):d.logs,storeLog:(e,t)=>d.logs.push({message:e,context:t})}});var Hn=S(()=>{"use strict"});import Oa from"chalk";async function M(e,t){let r=Date.now(),n=e.title,o=()=>Math.floor((Date.now()-r)/1e3),s=setInterval(()=>{o()>1&&(e.title=`${n} (${o()}s)`)},1e3);try{return await t(o)}finally{clearInterval(s)}}async function rt(e,t,r){for(let n=0;n<t.length;n++){let o=t[n];e.output=Oa.dim(`[${n+1}/${t.length}] ${o.title}`),await o.fn(r??{},e)}}var Gn=S(()=>{"use strict"});var v=S(()=>{"use strict";Sn();In();Rn();Nn();Fn();or();Wn();Hn();nr();Gn()});var zn={};la(zn,{discoverAvailableServices:()=>at,findWorkspaceRoot:()=>u,getContractsConfig:()=>w,getGeneratorConfig:()=>ce,getPackageJsonField:()=>Ka,getPfConfig:()=>Re,getPkgJson:()=>cr,getRootPackageScope:()=>st,getWorkspacePackageJson:()=>F,getWorkspacePathsConfig:()=>E,isInWorkspace:()=>sr,pkgJson:()=>R,readPackageConfig:()=>Ne,updatePackageJsonField:()=>it});import{existsSync as Ie,readdirSync as Ma,readFileSync as Bn,writeFileSync as Da}from"fs";import{join as I,resolve as _a}from"path";var ar,ja,La,Wa,Ae,Ha,ot,nt,Ga,Ba,Un,Ua,Va,Vn,sr,u,F,E,Re,w,st,za,Ja,Ka,it,Ne,ir,cr,R,ce,at,f=S(()=>{"use strict";Ze();v();ar=e=>JSON.parse(Bn(e,"utf-8")),ja=ar,La=(e,t,r)=>Da(e,`${JSON.stringify(t,null,2)}
9
- `,"utf-8"),Wa=["@crossdelta/cloudevents"],Ae={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},Ha={docs:{base:["service.md"],frameworks:{}},serviceTypes:{hono:{commandType:"hono-micro",entryPoint:"src/index.ts",skipFiles:[]},nest:{commandType:"nest-micro",entryPoint:"src/main.ts",skipFiles:[]}}},ot=e=>{if(!Ie(e))return null;try{return JSON.parse(Bn(e,"utf-8"))}catch{return null}},nt=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,Ga=e=>e.split("/").pop()||"workspace",Ba=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},Un=e=>e.split("."),Ua=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||Ie(I(t,"turbo.json")))return!0;let r=Pn.some(o=>Ie(I(t,o))),n=Ie(I(t,"infra"));return r&&n},Va=e=>{let t=ot(I(e,"package.json"));return t?Ua(t,e):!1},Vn=e=>{let t=e;for(;t;){if(Va(t))return t;t=Ba(t)}return null},sr=()=>Vn(process.cwd())!==null,u=()=>{let e=Vn(process.cwd());if(!e)throw new Error(`
7
+ ${Lr.bold(e.exampleUsage)}
8
+ `),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??"");let r=async o=>{e.prompts?.length&&await new Mr(jr(e.prompts,o),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(o),await new Mr(jr(e.actions,o),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(o),await e.onComplete?.(o)},n=()=>{try{let o=d();return _r(o),o}catch{return null}};return t.action(async(...o)=>{let s=null;try{let i=o.at(-1),a=i.args,c=i.opts(),p=Bs(e.arguments??[],a),l=await e.buildContext(p,c);s=n(),await r(l)}catch(i){A(i,{exit:!1})}finally{s&&$t(s)}}),t},Bs=(e,t)=>{let r=e.map(([n],o)=>[n.replace(/[<>[\]]/g,""),t[o]]);return Object.fromEntries(r)},jr=(e,t)=>e.map(r=>typeof r=="function"?r(t):r)});var z,Wr=C(()=>{"use strict";z=(e,t)=>{let r=null;return(...n)=>(r&&clearTimeout(r),new Promise(o=>{r=setTimeout(async()=>{r=null,await e(...n),o()},t)}))}});var Hr=C(()=>{"use strict"});import{execaSync as Gs}from"execa";function me(e){try{return Gs(e,["--version"]),!0}catch{return!1}}var It=C(()=>{"use strict"});var Br=C(()=>{"use strict";It()});import{readdirSync as Us}from"fs";import{dirname as Gr,isAbsolute as Bm,join as Vs,normalize as Gm,resolve as Um,sep as Vm}from"path";import{fileURLToPath as Js}from"url";import{packageUpSync as zs}from"package-up";import{rimraf as Ks}from"rimraf";function Ur(){let e=zs({cwd:Gr(qs())});if(!e)throw new Error("Could not find package.json");return Gr(e)}var qs,_,De,Vr,Jr=C(()=>{"use strict";J();v();qs=()=>typeof import.meta?.url=="string"?Js(import.meta.url):process.cwd(),_=e=>{let t=Nt()?d():process.cwd();return Vs(t,e)},De=e=>{try{return Us(e).length===0}catch{return!0}};Vr=e=>Ks(e)});import ue from"chalk";var zr,Ys,Zs,Le,m,Kr=C(()=>{"use strict";zr={debug:0,info:1,warn:2,error:3,silent:4},Ys=e=>e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent",Zs=()=>{let e=process.env.LOG_LEVEL;return Ys(e)?e:process.env.DEBUG==="true"||process.env.VERBOSE==="true"?"debug":"info"},Le=e=>{let t=Zs();return zr[e]>=zr[t]},m={logs:[],breakLine:()=>(console.log(),m),success:(e,...t)=>(console.log(ue.green(`\u2714 ${e}`),...t),m),info:(e,...t)=>(Le("info")&&console.log(ue.cyan(`\u{1F6C8} ${e}`),...t),m),warn:(e,...t)=>(Le("warn")&&console.warn(ue.yellow(`\u26A0\uFE0E ${e}`),...t),m),error:(e,...t)=>(Le("error")&&console.error(ue.red(`\u2716 ${e}`),...t),m),debug:(e,...t)=>(Le("debug")&&console.log(ue.dim(`[debug] ${e}`),...t),m),log:(e,...t)=>(console.log(e,...t),m.logs.push({message:e,context:t.join()}),m),getStoredLogs:e=>e?m.logs.filter(t=>t.context?.includes(e)):m.logs,storeLog:(e,t)=>m.logs.push({message:e,context:t})}});var qr=C(()=>{"use strict"});import Xs from"chalk";async function R(e,t){let r=Date.now(),n=e.title,o=()=>Math.floor((Date.now()-r)/1e3),s=setInterval(()=>{o()>1&&(e.title=`${n} (${o()}s)`)},1e3);try{return await t(o)}finally{clearInterval(s)}}async function Me(e,t,r){for(let n=0;n<t.length;n++){let o=t[n];e.output=Xs.dim(`[${n+1}/${t.length}] ${o.title}`),await o.fn(r??{},e)}}var Yr=C(()=>{"use strict"});var h=C(()=>{"use strict";Ar();Fr();Wr();Hr();Br();Jr();Kr();qr();It();Yr()});var rn={};Rs(rn,{discoverAvailableServices:()=>He,findWorkspaceRoot:()=>d,getContractsConfig:()=>x,getPackageJsonField:()=>mi,getPfConfig:()=>fe,getPkgJson:()=>tn,getRootPackageScope:()=>en,getWorkspacePackageJson:()=>$,getWorkspacePathsConfig:()=>I,isInWorkspace:()=>Nt,pkgJson:()=>E,readPackageConfig:()=>he,updatePackageJsonField:()=>We});import{existsSync as ge,readdirSync as Qs,readFileSync as Zr,writeFileSync as ei}from"fs";import{join as S,resolve as ti}from"path";var At,ri,ni,oi,de,Fe,je,si,ii,Xr,ai,ci,Qr,Nt,d,$,I,fe,x,en,pi,li,mi,We,he,Ot,tn,E,He,v=C(()=>{"use strict";Oe();h();At=e=>JSON.parse(Zr(e,"utf-8")),ri=At,ni=(e,t,r)=>ei(e,`${JSON.stringify(t,null,2)}
9
+ `,"utf-8"),oi=["@crossdelta/cloudevents"],de={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},Fe=e=>{if(!ge(e))return null;try{return JSON.parse(Zr(e,"utf-8"))}catch{return null}},je=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,si=e=>e.split("/").pop()||"workspace",ii=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},Xr=e=>e.split("."),ai=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||ge(S(t,"turbo.json")))return!0;let r=Or.some(o=>ge(S(t,o))),n=ge(S(t,"infra"));return r&&n},ci=e=>{let t=Fe(S(e,"package.json"));return t?ai(t,e):!1},Qr=e=>{let t=e;for(;t;){if(ci(t))return t;t=ii(t)}return null},Nt=()=>Qr(process.cwd())!==null,d=()=>{let e=Qr(process.cwd());if(!e)throw new Error(`
10
10
  \x1B[31m\u2716\x1B[0m Not in a workspace directory
11
11
 
12
12
  Current directory: ${process.cwd()}
@@ -16,171 +16,27 @@ This command must be run from within a workspace created with \x1B[36mpf new wor
16
16
  To create a new workspace, run:
17
17
 
18
18
  \x1B[36mpf new workspace my-platform\x1B[0m
19
- `);return e},F=e=>{let t=e??u();return ot(I(t,"package.json"))},E=e=>{let t=F(e);if(!t?.pf?.paths)return Ae;let{paths:r}=t.pf;return{services:nt(r.services,Ae.services),apps:nt(r.apps,Ae.apps),packages:nt(r.packages,Ae.packages),contracts:nt(r.contracts,Ae.contracts)}},Re=e=>{let t=F(e);return{plugins:t?.pf?.plugins??Wa,dev:{filter:t?.pf?.dev?.filter??[]}}},w=e=>{let t=e??u(),r=E(t),n=I(t,r.contracts),s=ot(I(n,"package.json"))?.name??`${st()}/contracts`;return{packagePath:n,eventsPath:I(n,"src","events"),indexPath:I(n,"src","index.ts"),relativePath:r.contracts,packageName:s}},st=()=>{let e=u(),t=ot(I(e,"package.json")),r=`@${Ga(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:r},za=(e,t)=>{let r=Un(t),n=e;for(let o of r){if(n===null||typeof n!="object"||!(o in n))return;n=n[o]}return n},Ja=(e,t,r)=>{let n=Un(t),o=n[n.length-1],s=e;for(let i of n.slice(0,-1))(!(i in s)||typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];s[o]=r},Ka=(e,t=process.cwd())=>{let r=ar(I(t,"package.json"));return za(r,e)},it=(e,t,r=process.cwd())=>{let n=I(r,"package.json"),o=ar(n);Ja(o,e,t),La(n,o,{spaces:2,EOL:`
20
- `,encoding:"utf-8"})},Ne=e=>{let t=_n();return ja(_a(t,e))},ir=null,cr=()=>(ir||(ir=Ne("package.json")),ir),R=new Proxy({},{get:(e,t)=>cr()[t]}),ce=()=>cr().generatorConfig??Ha,at=e=>{let t=e??u(),r=E(t),n=I(t,r.services);if(!Ie(n))return[];try{return Ma(n,{withFileTypes:!0}).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>`${r.services}/${s.name}`).sort()}catch{return[]}}});import{argv as jg}from"process";import Ke from"chalk";import{Command as Lg}from"commander";import Wg from"terminal-link";z();f();import gc from"chalk";import{Command as fc}from"commander";v();import{existsSync as cc}from"fs";import{join as lc}from"path";import{cwd as Qn}from"process";import{execaSync as pc}from"execa";v();import{spawn as mr}from"child_process";import{resolve as tc}from"path";import{execa as rc}from"execa";import{existsSync as qa}from"fs";import{resolve as Ya}from"path";import{config as Za}from"dotenv";var lr=(e,t)=>{let r=Ya(t,e);return qa(r)?Za({path:r,processEnv:{}}).parsed||{}:{}},Xa=e=>`${(e.includes("/")?e.split("/").pop()??e:e).toUpperCase().replace(/-/g,"_")}_PORT`,Jn=(e,t)=>{let r=lr(e,t),n=[];for(let[o,s]of Object.entries(r))if(o.endsWith("_PORT")&&s){let i=Number.parseInt(s,10);!Number.isNaN(i)&&i>0&&n.push({key:o,port:i})}return n},Qa=65535,ec=e=>{if(!e||!/^\d+$/.test(e))return;let t=Number.parseInt(e,10);return t>0&&t<=Qa?t:void 0},Kn=(e,t,r)=>{let n=t.filter(i=>!i.startsWith("!"));if(n.length===0)return e.map(i=>i.port);let o=ec(r);if(o!==void 0&&n.length===1)return[o];let s=new Set(n.map(Xa));return[...new Set(e.filter(i=>s.has(i.key)).map(i=>i.port))]};var pr={...process.env,NODE_NO_WARNINGS:"1"},nc=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",oc=(e,t,r)=>e?{...pr,...e}:t||r?{...pr,CI:"true"}:{...pr},sc=e=>e.includes("EEXIST")||e.includes("failed to link package");async function K(e,t,{cwd:r=process.cwd(),task:n,shell:o,context:s=e,quiet:i=!1,nonInteractive:a=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let l=rc(e,t,{cwd:r,stdio:nc(i,n,a),all:n||a?!0:void 0,shell:o??!0,env:oc(c,n,a)});l.all&&l.all.on("data",p=>{let m=p.toString().trim();n?(n.output=m,m.length&&d.storeLog(m,s)):a&&m.length&&console.log(m)}),await l}catch(l){let p=l instanceof Error?l.message:String(l);if(sc(p))return;throw new Error(ic(p))}}var ic=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function qn(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:i=!1,onStdout:a,onStderr:c,onExit:l}=r,p=o?lr(o,n):{},m=tc(n,"node_modules",".bin"),y=process.env.PATH||"",j=`${m}:${y}`,be={...process.env,...p,PATH:j,FORCE_COLOR:"1"},N=mr(e,t,{cwd:n,env:be,stdio:["inherit",i?"pipe":"inherit","pipe"],detached:s});return a&&i&&N.stdout?.on("data",a),c&&N.stderr?.on("data",c),l&&N.on("exit",l),N}function Yn(e,t,r={}){let{cwd:n=process.cwd()}=r;mr(e,t,{cwd:n,stdio:"inherit"}).on("exit",s=>process.exit(s||0))}function Zn(e,t,r={}){let{cwd:n=process.cwd()}=r,o=t.length>0?`${e} ${t.join(" ")}`:e;mr(o,[],{cwd:n,env:process.env,stdio:"inherit",shell:!0}).on("exit",i=>process.exit(i||0))}async function Xn(e){let{execSync:t}=await import("child_process");for(let r of e)try{let o=t(`lsof -ti:${r}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
21
- `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}f();var ct=e=>Te(e);function dr(e=process.cwd()){let t=r=>cc(lc(e,r));if(t("bun.lock")||t("bun.lockb"))return"bun";if(t("pnpm-lock.yaml"))return"pnpm";if(t("yarn.lock"))return"yarn";if(t("package-lock.json"))return"npm"}function b(e){return dr(e)??mc()}function mc(){return ct("bun")?"bun":ct("pnpm")?"pnpm":ct("yarn")?"yarn":"npm"}function eo(){return["bun","pnpm","yarn","npm"].filter(ct)}async function L(e,t){let r=dc(e,t),{mergedOptions:n,packages:o}=r,{cwd:s=process.cwd(),flags:i=[],task:a,quiet:c}=n,l=n.packageManager??b(),p=[],m=Array.isArray(o)?o:[o];l==="bun"&&(m=m.map(j=>j.replace("git+ssh://",""))),l==="pnpm"&&(p.push("--config.engine-strict=false"),p.push("--no-frozen-lockfile")),["yarn","npm"].includes(l)&&p.push("--ignore-engines");let y=m.length?l==="npm"?["install",...i,...p,...m]:["add",...i,...p,...m]:["install",...i,...p];await K(l,y,{cwd:s,task:a,quiet:c})}async function to(e){let t=["-g"],r=[...e.flags??[],...t];await L({...e,flags:r,packageManager:e.packageManager??b()})}function ro(e,t,r){let{args:n,mergedOptions:o}=oo(t??[],r),s=o.manager??b(),{command:i,args:a}=no(s);console.log(`
19
+ `);return e},$=e=>{let t=e??d();return Fe(S(t,"package.json"))},I=e=>{let t=$(e);if(!t?.pf?.paths)return de;let{paths:r}=t.pf;return{services:je(r.services,de.services),apps:je(r.apps,de.apps),packages:je(r.packages,de.packages),contracts:je(r.contracts,de.contracts)}},fe=e=>{let t=$(e);return{plugins:t?.pf?.plugins??oi,dev:{filter:t?.pf?.dev?.filter??[]}}},x=e=>{let t=e??d(),r=I(t),n=S(t,r.contracts),s=Fe(S(n,"package.json"))?.name??`${en()}/contracts`;return{packagePath:n,eventsPath:S(n,"src","events"),indexPath:S(n,"src","index.ts"),relativePath:r.contracts,packageName:s}},en=()=>{let e=d(),t=Fe(S(e,"package.json")),r=`@${si(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:r},pi=(e,t)=>{let r=Xr(t),n=e;for(let o of r){if(n===null||typeof n!="object"||!(o in n))return;n=n[o]}return n},li=(e,t,r)=>{let n=Xr(t),o=n[n.length-1],s=e;for(let i of n.slice(0,-1))(!(i in s)||typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];s[o]=r},mi=(e,t=process.cwd())=>{let r=At(S(t,"package.json"));return pi(r,e)},We=(e,t,r=process.cwd())=>{let n=S(r,"package.json"),o=At(n);li(o,e,t),ni(n,o,{spaces:2,EOL:`
20
+ `,encoding:"utf-8"})},he=e=>{let t=Ur();return ri(ti(t,e))},Ot=null,tn=()=>(Ot||(Ot=he("package.json")),Ot),E=new Proxy({},{get:(e,t)=>tn()[t]}),He=e=>{let t=e??d(),r=I(t),n=S(t,r.services);if(!ge(n))return[];try{return Qs(n,{withFileTypes:!0}).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>`${r.services}/${s.name}`).sort()}catch{return[]}}});import{argv as Kl}from"process";import Te from"chalk";import{Command as ql}from"commander";import Yl from"terminal-link";J();v();import Oi from"chalk";import{Command as Ai}from"commander";h();import{existsSync as Ei}from"fs";import{join as Ti}from"path";import{cwd as ln}from"process";import{execaSync as $i}from"execa";h();import{spawn as Lt}from"child_process";import{resolve as ki}from"path";import{execa as Ci}from"execa";import{existsSync as ui,readFileSync as di}from"fs";import{resolve as gi}from"path";import{parseEnvContent as fi}from"@crossdelta/infrastructure/env-file";var _t=(e,t)=>{let r=gi(t,e);return ui(r)?fi(di(r,"utf8")):{}},hi=e=>`${(e.includes("/")?e.split("/").pop()??e:e).toUpperCase().replace(/-/g,"_")}_PORT`,nn=(e,t)=>{let r=_t(e,t),n=[];for(let[o,s]of Object.entries(r))if(o.endsWith("_PORT")&&s){let i=Number.parseInt(s,10);!Number.isNaN(i)&&i>0&&n.push({key:o,port:i})}return n},yi=65535,vi=e=>{if(!e||!/^\d+$/.test(e))return;let t=Number.parseInt(e,10);return t>0&&t<=yi?t:void 0},on=(e,t,r)=>{let n=t.filter(i=>!i.startsWith("!"));if(n.length===0)return e.map(i=>i.port);let o=vi(r);if(o!==void 0&&n.length===1)return[o];let s=new Set(n.map(hi));return[...new Set(e.filter(i=>s.has(i.key)).map(i=>i.port))]};var Dt={...process.env,NODE_NO_WARNINGS:"1"},xi=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",wi=(e,t,r)=>e?{...Dt,...e}:t||r?{...Dt,CI:"true"}:{...Dt},Pi=e=>e.includes("EEXIST")||e.includes("failed to link package");async function K(e,t,{cwd:r=process.cwd(),task:n,shell:o,context:s=e,quiet:i=!1,nonInteractive:a=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let p=Ci(e,t,{cwd:r,stdio:xi(i,n,a),all:n||a?!0:void 0,shell:o??!0,env:wi(c,n,a)});p.all&&p.all.on("data",l=>{let u=l.toString().trim();n?(n.output=u,u.length&&m.storeLog(u,s)):a&&u.length&&console.log(u)}),await p}catch(p){let l=p instanceof Error?p.message:String(p);if(Pi(l))return;throw new Error(bi(l))}}var bi=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function sn(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:i=!1,onStdout:a,onStderr:c,onExit:p}=r,l=o?_t(o,n):{},u=ki(n,"node_modules",".bin"),T=process.env.PATH||"",Ct=`${u}:${T}`,Ts={...process.env,...l,PATH:Ct,FORCE_COLOR:"1"},$e=Lt(e,t,{cwd:n,env:Ts,stdio:["inherit",i?"pipe":"inherit","pipe"],detached:s});return a&&i&&$e.stdout?.on("data",a),c&&$e.stderr?.on("data",c),p&&$e.on("exit",p),$e}function an(e,t,r={}){let{cwd:n=process.cwd()}=r;Lt(e,t,{cwd:n,stdio:"inherit"}).on("exit",s=>process.exit(s||0))}function cn(e,t,r={}){let{cwd:n=process.cwd()}=r,o=t.length>0?`${e} ${t.join(" ")}`:e;Lt(o,[],{cwd:n,env:process.env,stdio:"inherit",shell:!0}).on("exit",i=>process.exit(i||0))}async function pn(e){let{execSync:t}=await import("child_process");for(let r of e)try{let o=t(`lsof -ti:${r}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
21
+ `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}v();var Be=e=>me(e);function Mt(e=process.cwd()){let t=r=>Ei(Ti(e,r));if(t("bun.lock")||t("bun.lockb"))return"bun";if(t("pnpm-lock.yaml"))return"pnpm";if(t("yarn.lock"))return"yarn";if(t("package-lock.json"))return"npm"}function w(e){return Mt(e)??Ri()}function Ri(){return Be("bun")?"bun":Be("pnpm")?"pnpm":Be("yarn")?"yarn":"npm"}function mn(){return["bun","pnpm","yarn","npm"].filter(Be)}async function M(e,t){let r=Ii(e,t),{mergedOptions:n,packages:o}=r,{cwd:s=process.cwd(),flags:i=[],task:a,quiet:c}=n,p=n.packageManager??w(),l=[],u=Array.isArray(o)?o:[o];p==="bun"&&(u=u.map(Ct=>Ct.replace("git+ssh://",""))),p==="pnpm"&&(l.push("--config.engine-strict=false"),l.push("--no-frozen-lockfile")),["yarn","npm"].includes(p)&&l.push("--ignore-engines");let T=u.length?p==="npm"?["install",...i,...l,...u]:["add",...i,...l,...u]:["install",...i,...l];await K(p,T,{cwd:s,task:a,quiet:c})}async function un(e){let t=["-g"],r=[...e.flags??[],...t];await M({...e,flags:r,packageManager:e.packageManager??w()})}function dn(e,t,r){let{args:n,mergedOptions:o}=fn(t??[],r),s=o.manager??w(),{command:i,args:a}=gn(s);console.log(`
22
22
  Running command: ${i} ${[...a,e,...n].join(" ")}
23
- `),pc(i,[...a,e,...n],{cwd:o.cwd??Qn(),stdio:"inherit",preferLocal:!0})}async function Fe(e,t,r){let{args:n,mergedOptions:o}=oo(t??[],r),s=o.manager??b(),{command:i,args:a}=no(s);await K(i,[...a,e,...n],o)}async function Oe(e,t){let{script:r,mergedOptions:n}=uc(e,t),o=n.packageManager??b();await K(o,["run",r,...n.args??[]],{cwd:n.cwd??Qn(),task:n.task})}function no(e){let r={bun:"bunx",pnpm:"npx",yarn:"npx",npm:"npx"}[e];if(!r)throw new Error(`No executor found for the detected package manager: ${e}`);let[n,...o]=r.split(" ");return{command:n,args:o}}function dc(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function oo(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function uc(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var hc=e=>e==="yarn"?["npm","audit"]:["audit"],so=new fc("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{try{let r=u(),n=b(),o=hc(n),s=t.args||[];console.log(gc.dim(`Running ${n} ${[...o,...s].join(" ")}`)),Yn(n,[...o,...s],{cwd:r})}catch(r){$(r)}});import q from"chalk";import{existsSync as Ic,readFileSync as Rc,writeFileSync as Nc}from"fs";import{homedir as Fc}from"os";import{join as Oc}from"path";import{createCipheriv as yc,createDecipheriv as vc,createHash as Cc,randomBytes as kc}from"crypto";import{existsSync as xc,readFileSync as wc,writeFileSync as Pc}from"fs";import{homedir as io,hostname as Sc,userInfo as bc}from"os";import{join as Ec}from"path";var ur=Ec(io(),".platform-sdk-keys"),ao="aes-256-gcm",co=()=>{let e=`${Sc()}:${bc().username}:${io()}`;return Cc("sha256").update(e).digest()},lo=()=>{if(!xc(ur))return{};try{return JSON.parse(wc(ur,"utf-8"))}catch{return{}}},Tc=e=>{Pc(ur,JSON.stringify(e,null,2),{mode:384})},$c=e=>{let t=co(),r=kc(16),n=yc(ao,t,r),o=n.update(e,"utf8","hex");return o+=n.final("hex"),{iv:r.toString("hex"),tag:n.getAuthTag().toString("hex"),data:o}},Ac=e=>{let t=co(),r=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),o=vc(ao,t,r);o.setAuthTag(n);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function po(e,t){let r=lo();r[e]=$c(t),Tc(r)}async function lt(e){let r=lo()[e];if(!r)return null;try{return Ac(r)}catch{return null}}var Me={openai:{id:"openai",name:"OpenAI",defaultApiKeyEnvVar:"OPENAI_API_KEY",defaultModel:"gpt-4o-mini",modelsApiUrl:"https://api.openai.com/v1/models",apiKeyUrl:"https://platform.openai.com/api-keys",buildHeaders:e=>({Authorization:`Bearer ${e}`}),parseModelsResponse:e=>e.data??[],modelFilters:[/^gpt-4/,/^gpt-3\.5/,/^o1/,/^o3/]},anthropic:{id:"anthropic",name:"Anthropic (Claude)",defaultApiKeyEnvVar:"ANTHROPIC_API_KEY",defaultModel:"claude-sonnet-4-20250514",modelsApiUrl:"https://api.anthropic.com/v1/models",apiKeyUrl:"https://console.anthropic.com/settings/keys",buildHeaders:e=>({"x-api-key":e,"anthropic-version":"2023-06-01"}),parseModelsResponse:e=>(e.data??[]).map(r=>({id:r.id,created:new Date(r.created_at).getTime()})),modelFilters:[/^claude-/]}};function mo(){return Object.entries(Me).map(([e,t])=>({name:t.name,value:e}))}function De(e){let t=Me[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var Q=Oc(Fc(),".platform-sdk-ai.json"),Mc=()=>{let e="anthropic",t=Me[e];return{provider:e,model:t.defaultModel}},gr=Mc();function _e(){return Ic(Q)}function pt(){if(!_e())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=Rc(Q,"utf-8"),t=JSON.parse(e);return{...gr,...t}}catch{throw new Error(`Failed to load AI configuration from ${Q}. Please run 'pf setup --ai' again.`)}}function uo(e){let t=JSON.stringify(e,null,2);Nc(Q,t,"utf-8")}async function go(e,t){await po(e,t)}async function fo(e){let t=await lt(e.provider);if(t)return t;let r=Me[e.provider],n=process.env[r.defaultApiKeyEnvVar];if(n)return n;throw new Error("API key not found. Please run 'pf setup --ai' to configure your API key.")}var Dc=async(e,t,r,n)=>{let{createOpenAI:o}=await import("@ai-sdk/openai"),s=o({apiKey:r});if(n.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature}),p="";for await(let m of(await l).textStream)p+=m,n.onToken(m);return p}let{generateText:i}=await import("ai"),{text:a}=await i({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return a},_c=async(e,t,r,n)=>{let{createAnthropic:o}=await import("@ai-sdk/anthropic"),s=o({apiKey:r});if(n.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature}),p="";for await(let m of(await l).textStream)p+=m,n.onToken(m);return p}let{generateText:i}=await import("ai"),{text:a}=await i({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return a};async function ho(e,t,r={}){let{system:n,maxTokens:o=4096,temperature:s=.7,onToken:i}=r,a=await fo(e);switch(e.provider){case"openai":return Dc(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});case"anthropic":return _c(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}z();import{existsSync as Qo,readFileSync as pp,unlinkSync as mp,writeFileSync as dp}from"fs";import{join as es,resolve as Zo}from"path";import{input as up}from"@inquirer/prompts";import h from"chalk";import gp from"ora";import{existsSync as fr,readdirSync as Wc}from"fs";import{dirname as Hc,join as yo}from"path";import{dirname as jc}from"path";import{fileURLToPath as Lc}from"url";var W=e=>jc(Lc(e));rr();var Gc=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),ee=e=>{let t=e??Gc(),r=o=>fr(yo(o,"package.json")),n=Hc(t);if(r(t))return t;if(t==="/")throw new Error("Could not find package.json (package root)");return ee(n)},vo=(e,t)=>{let r=e.find(fr);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},Co=async e=>{let{getWorkspacePathsConfig:t}=await Promise.resolve().then(()=>(f(),zn)),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=yo(e,o);if(!fr(s))return[];try{return Wc(s,{withFileTypes:!0}).filter(i=>i.isDirectory()&&i.name!==".gitkeep").map(i=>`${o}/${i.name}`)}catch{return[]}})};import{existsSync as dl,readFileSync as ul}from"fs";import{join as gl}from"path";import{Project as fl}from"ts-morph";import{deriveEventNames as Jy,getContractPaths as Ky,getStreamName as qy}from"@crossdelta/cloudevents";import{existsSync as mt,readFileSync as ko,writeFileSync as Bc}from"fs";import{join as hr}from"path";import{getStreamName as Uc}from"@crossdelta/cloudevents";var xo=(e,t)=>{let r=hr(e,"src","index.ts");if(!mt(r))return!1;let n=ko(r,"utf-8"),o=t.toLowerCase();return new RegExp(`streams:\\s*\\[[^\\]]*['"]${t}['"]`).test(n)||n.includes(`stream: '${t}'`)?!0:new RegExp(`subjects:\\s*\\[.*['"]${o}\\.[*>]`).test(n)},Vc=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
24
- `,r=e.match(/import\s+['"]@crossdelta\/telemetry['"]\s*\n/);if(r){let o=(r.index??0)+r[0].length;return`${e.slice(0,o)}
25
- ${t}${e.slice(o)}`}let n=e.match(/import\s+.*\n/);if(n){let o=(n.index??0)+n[0].length;return e.slice(0,o)+t+e.slice(o)}return e},zc=(e,t)=>`
26
-
27
- // Consume from ${e} stream
28
- consumeJetStreams({
29
- streams: ['${e}'],
30
- consumer: '${t}-service',
31
- discover: './src/events/**/*.handler.ts',
32
- })`,yr=(e,t)=>{let r=Uc(t),n=hr(e,"src","index.ts"),o=hr(e,"src","main.ts");if(!mt(n)&&mt(o))return{added:!1,streamName:r};if(!mt(n))return{added:!1,streamName:r,warning:"Entry point not found (index.ts or main.ts)"};if(xo(e,r))return{added:!1,streamName:r};let s=ko(n,"utf-8"),i=e.split("/").pop()||"unknown";s.includes("consumeJetStreams")||(s=Vc(s));let a=zc(r,i),c=`${s.trimEnd()+a}
33
- `;return Bc(n,c,"utf-8"),{added:!0,streamName:r}};f();import{existsSync as cy,readFileSync as ly}from"fs";import{join as my}from"path";import{contractCreated as uy,deriveEventNames as gy,generateContract as fy,getContractFilePath as hy}from"@crossdelta/cloudevents";import{readdirSync as Jc,readFileSync as Kc}from"fs";import{join as wo}from"path";import{getStreamName as qc,singularize as Yc}from"@crossdelta/cloudevents";var Po=e=>{try{return Jc(e,{withFileTypes:!0}).flatMap(r=>{let n=wo(e,r.name);return r.isDirectory()?Po(n):r.name.endsWith(".handler.ts")?[n]:[]})}catch{return[]}},vr=e=>{let t=wo(e,"src","events");return Po(t).flatMap(n=>{let o=Kc(n,"utf-8");return Zc(n,o)})},Zc=(e,t)=>{let r=Qc(t);if(!r)return[];let n=Xc(r);return n?[{filePath:e,eventType:n,contractName:r}]:[]},Xc=e=>{let r=e.replace(/Contract$/,"").match(/[A-Z][a-z]*/g);if(!r||r.length<2)return null;let n=r[0].toLowerCase(),o=Yc(n),i=r.slice(1).map(a=>a.toLowerCase()).join("-");return`${o}.${i}`},Qc=e=>{let r=/import\s+{([^}]+)}\s+from\s+['"]@[\w-]+\/contracts['"]/.exec(e);return r?r[1].split(",").map(s=>s.trim()).filter(s=>s.endsWith("Contract")).map(s=>s.replace(/\s+as\s+.+$/,"").trim()).at(0)??null:null},Cr=e=>{let t=e.reduce((r,n)=>{let o=n.eventType.split(".")[0],s=r.get(o)??[];return r.set(o,[...s,n]),r},new Map);return Array.from(t.entries()).map(([r,n])=>el(r,n)).sort((r,n)=>r.stream.localeCompare(n.stream))},el=(e,t)=>{let r=qc(t[0]?.eventType??`${e}.event`),n=`${e}.>`;return{stream:r,subjects:[n],handlers:t}},kr=(e,t)=>e.length===0?"":` // Development: pf dev auto-creates ephemeral streams from contracts
34
- // Production: Pulumi materializes persistent streams
35
-
36
- consumeJetStreams({
37
- streams: [${e.map(r=>`'${r.stream}'`).join(", ")}],
38
- consumer: '${t}',
39
- discover: './src/events/**/*.handler.ts',
40
- })`;f();import{existsSync as te,mkdirSync as tl,readFileSync as dt,writeFileSync as pe}from"fs";import{dirname as So,join as le}from"path";import{deriveEventNames as rl}from"@crossdelta/cloudevents";var nl=(e,t)=>{let r=`export * from './${t}'`;if(!te(e)){let s=So(e);te(s)||tl(s,{recursive:!0});let i=`/**
41
- * ${So(e).split("/").pop()} Domain Events
42
- */
43
-
44
- `;return pe(e,`${i+r}
45
- `,"utf-8"),!0}let n=dt(e,"utf-8");if(n.includes(`'./${t}'`))return!1;let o=`${n.trimEnd()}
46
- ${r}
47
- `;return pe(e,o,"utf-8"),!0},ol=(e,t)=>{let r=`export * from './${t}'`;if(!te(e))return pe(e,`/**
48
- * Event Contracts Index
49
- *
50
- * Re-exports all event contracts for convenient importing.
51
- */
52
-
53
- ${r}
54
- `,"utf-8"),!0;let o=dt(e,"utf-8").split(`
55
- `);if(o.some(i=>i.trim()===r))return!1;let s=o.findLastIndex(i=>i.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push(r),pe(e,o.join(`
56
- `),"utf-8"),!0},sl=e=>{if(!te(e))return!1;let t=dt(e,"utf-8"),r="export * from './events'";if(t.split(`
57
- `).some(s=>s.trim()===r||s.trim().startsWith(r)))return!1;let o=t;return o=o.replace(/\/\/\s*export \* from '\.\/events'/,r),o=o.replace(/\/\/\s*export \* from '\.\/stream-policies'/,"export * from './stream-policies'"),/export \* from '\.\/events\/\w+\/\w+'/.test(o)&&(o=o.replace(/export \* from '\.\/events\/\w+\/\w+'\n?/g,"")),o.includes(r)||(o=`${o.trimEnd()}
58
- ${r}
59
- `),o!==t?(pe(e,o,"utf-8"),!0):!1},xr=(e,t)=>{let{packagePath:r}=w(t),{domain:n,action:o}=rl(e),s=le(r,"src","events");if(!te(s))return!1;let i=le(s,n),a=le(i,"index.ts"),c=le(s,"index.ts"),l=le(r,"src","index.ts"),p=e.split(".")[0],m=le(s,p);p!==n&&te(m)&&(console.warn(`\u26A0\uFE0F Warning: Legacy folder '${p}/' found. Please migrate to '${n}/' to avoid conflicts.`),console.warn(` Run: mv ${m} ${i}`));let y=!1;return nl(a,o)&&(y=!0),ol(c,n)&&(y=!0),sl(l)&&(y=!0),y},wr=(e,t)=>{if(!te(e))return!1;let r=`export * from './events/${t}'`,n=dt(e,"utf-8");if(n.includes(`'./events/${t}'`))return!1;let o=n.split(`
60
- `),s=o.findLastIndex(i=>i.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push("",r),pe(e,o.join(`
61
- `),"utf-8"),!0};f();import{existsSync as bo,readdirSync as al,readFileSync as cl}from"fs";import{join as Eo}from"path";import{generateJsonMockFromContract as ll,getJsonMockPath as pl,initFaker as ml}from"@crossdelta/cloudevents";var To=e=>{let t=e.match(/handleEvent\s*\(\s*(\w+Contract)/m);if(t){let n=e.match(/type:\s*['"]([^'"]+)['"]/m);if(n)return n[1]}let r=e.match(/handleEvent\s*\(\s*\{[^}]*type:\s*['"]([^'"]+)['"]/m);if(r)return r[1];if(t){let s=t[1].replace(/Contract$/,"").split(/(?=[A-Z])/).filter(Boolean);if(s.length>=2){let i=s[0].toLowerCase(),a=s.slice(1).join("").toLowerCase();return`${i}.${a}`}}return null};var Pr=async(e,t={})=>{let r=Eo(e,"src","events");if(!bo(r))return{mockPaths:[],skippedHandlers:[]};await ml();let n=al(r).filter(i=>i.endsWith(".handler.ts")||i.endsWith(".event.ts")),o=[],s=[];for(let i of n){let a=Eo(r,i),c=cl(a,"utf-8"),l=To(c);if(!l){s.push(`${i} (Could not extract event type)`);continue}let p=t.outputDir??w().packagePath,m=pl(l,p);if(bo(m)&&!t.overwrite){s.push(`${i} (Mock already exists)`);continue}let y=ll(l,p,{useFaker:!0});y&&y.status!=="skipped"&&"ref"in y?o.push(y.ref):s.push(`${i} (Contract not found or generation failed)`)}return{mockPaths:o,skippedHandlers:s}};var $o=e=>{let t=e.split("/").pop()||"service",r=gl(e,"src","events","events.service.ts");if(!dl(r))return!1;let n=vr(e);if(n.length===0||ul(r,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let a=Cr(n),c=kr(a,t);if(!c)return!1;let l=new fl({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(r),m=!1;for(let y of p.getClasses()){let j=y.getMethod("startConsumers");if(!j)continue;let N=[...c.split(`
62
- `),""," this.logger.log('Event consumers started successfully')"].join(`
63
- `);j.setBodyText(N),m=!0;break}return m&&l.saveSync(),m};f();var hl=e=>{let t=e.split(/\s+/),r=t[0],n=t.slice(1);return r==="pf"&&(r=process.argv[1]),{executable:r,args:n}},yl=async(e,t)=>{try{let{executable:r,args:n}=hl(e.command);return await K(r,n,{cwd:t,shell:!1}),{command:e.command,success:!0}}catch(r){return{command:e.command,success:!1,error:r instanceof Error?r.message:String(r)}}},Sr=async(e,t)=>{let r=[];for(let n of e){let o=await yl(n,t);if(r.push(o),!o.success)break}return r},br=e=>{let t=[/^pf\s+/,/^bun\s+pf\s+/,/^npx\s+pf\s+/,/^bunx\s+pf\s+/];return e.filter(r=>t.some(n=>n.test(r.command)))},Ao=e=>{for(let t of e){let r=t.command.match(/(?:bun\s+)?pf\s+new\s+\S+\s+(\S+)/);if(r)return r[1]}return null};import{existsSync as No,readFileSync as wl}from"fs";import{join as Er}from"path";import G from"chalk";f();or();import{existsSync as Io,mkdirSync as vl,writeFileSync as Cl}from"fs";import{dirname as kl}from"path";var xl=(e,t)=>{let n=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o;try{o=Dn(e.path,n)}catch(s){return{status:"failed",path:e.path,error:s.message}}try{if(Io(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=kl(o);return Io(s)||vl(s,{recursive:!0}),Cl(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},Ro=(e,t)=>{let r=e.map(n=>xl(n,t));return{written:r.filter(n=>n.status==="written").map(n=>n.path),skipped:r.filter(n=>n.status==="skipped").map(n=>n.path),failed:r.filter(n=>n.status==="failed").map(n=>({path:n.path,error:n.error}))}};var Pl=(e,t)=>{let r=E(t.workspaceRoot),n=Er(t.workspaceRoot,r.contracts);if(!No(n))return[];let o=/import\s+(?:type\s+)?{([^}]+)}\s+from\s+['"]@\w+\/contracts['"]/g,s=new Set;for(let i of e){let a=i.content.matchAll(o);for(let c of a){let p=c[1].split(",").map(m=>m.trim()).map(m=>m.replace(/^type\s+/,"").replace(/\s+as\s+.+$/,"").trim()).filter(m=>m.endsWith("Contract"));for(let m of p)s.add(m)}}return Array.from(s).sort()},Sl=e=>{let t=Er(e,"packages/contracts/src/index.ts");if(!No(t))return new Set;try{let r=wl(t,"utf-8"),n=new Set,o=/export\s+(?:\*|{[^}]*Contract[^}]*})\s+from\s+['"]\.\/events\/([^'"]+)['"]/g,s=r.matchAll(o);for(let i of s){let a=i[0],c=/(\w+Contract)/g,l=a.matchAll(c);for(let p of l)n.add(p[1])}return n}catch{return new Set}},bl=e=>{let t=e.replace(/Contract$/,""),r=t.split(/(?=[A-Z])/).filter(Boolean);if(r.length<2)return t.toLowerCase();let n=r[0].toLowerCase(),o=r.slice(1).join("").toLowerCase();return`${n}.${o}`},El=(e,t,r)=>{let n=Sl(t),o=[],s=[],i=[];for(let a of e)if(n.has(a))o.push(a);else{s.push(a);let c=bl(a),l=r.replace(`${t}/`,"");i.push(`pf cloudevents add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:i}},Tl=(e,t)=>{if(e.length!==0){console.log(G.cyan(`\u{1F4E6} Using existing contracts:
64
- `));for(let r of e)console.log(G.dim(` ${t}/contracts \u2192 ${r}`));console.log()}},$l=(e,t)=>{let r=/^packages\/contracts\/src\/events\/([^/]+)\.ts$/,n=Er(t,"packages/contracts/src/index.ts");for(let o of e){let s=o.match(r);s&&s[1]!=="index"&&wr(n,s[1])}},Fo=async(e,t)=>{t.start("Applying code formatting...");try{await Fe("biome",["check","--fix","--unsafe","."],{cwd:e,quiet:!0}),t.succeed("Code formatted!")}catch{t.warn("Code formatting completed with warnings")}},Al=async(e,t)=>{t.start("Scanning for event handlers...");let{mockPaths:r,skippedHandlers:n}=await Pr(e);if(r.length+n.length===0){t.info("No event handlers found");return}if(r.length>0){t.succeed(`Generated ${r.length} event ${r.length===1?"mock":"mocks"}`),console.log();for(let s of r){let i=s.replace(`${e}/`,"");console.log(G.dim(` ${i}`))}console.log()}else t.succeed("Event handlers found");if(n.length>0){for(let s of n)console.log(G.dim(` \u2139 Skipped: ${s}`));console.log()}},Oo=async(e,t,r,n)=>{n.start("Writing generated files...");let o=Ro(e,{baseDir:t,workspaceRoot:r.workspaceRoot,overwrite:!0});if(o.written.length>0){n.succeed(`Created ${o.written.length} files`),console.log();for(let l of o.written)console.log(G.dim(` ${l}`));console.log()}else n.succeed("No files to write");let s=Pl(e,r),{existing:i,missing:a,suggestedCommands:c}=El(s,r.workspaceRoot,t);if(i.length>0&&Tl(i,r.scope),a.length>0){console.log(G.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${r.scope}/contracts):
65
- `));for(let l of a)console.log(G.yellow(` ${l}`));console.log(),console.log(G.cyan(`\u{1F4A1} Run these commands to create the missing contracts:
66
- `));for(let l of c)console.log(G.dim(` ${l}`));console.log()}return $l(o.written,r.workspaceRoot),o.written.length>0&&await Al(t,n),{missingContractCommands:c}};f();import{existsSync as _l,readFileSync as jl}from"fs";import{join as je}from"path";f();f();import{existsSync as Il,readdirSync as Rl,readFileSync as Nl}from"fs";import{join as Fl}from"path";var Mo=e=>{let{eventsPath:t}=w(e);if(!Il(t))return[];let r=[];try{let n=Rl(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of n){let s=Fl(t,o),i=Nl(s,"utf-8"),a=Ol(i,s);a&&r.push(a)}}catch(n){return console.warn("Warning: Could not scan contracts package:",n),[]}return r},Ol=(e,t)=>{try{let r=e.match(/export const (\w+Contract) = createContract/);if(!r)return null;let n=r[1],o=e.match(/export type (\w+(?:Data|Event)) = z\.infer/);if(!o)return null;let s=o[1],i=e.match(/type:\s*['"]([^'"]+)['"]/);if(!i)return null;let a=i[1],c=Dl(e);return{name:n,typeName:s,eventType:a,fields:c,filePath:t}}catch{return null}},Ml={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},Dl=e=>{let t=e.match(/z\.object\({([^}]+)\}/);if(!t)return[];let r=t[1],n=/(\w+):\s*z\.(\w+)\([^)]*\)/g,o=[...r.matchAll(n)].map(([,a,c])=>{let l=Ml[c]||c;return`${a}: ${l}`});if(!e.includes("z.array("))return o;let s=/(\w+):\s*z\.array\(/g,i=[...e.matchAll(s)].map(([,a])=>a).filter(a=>!o.some(c=>c.startsWith(a))).map(a=>`${a}: array`);return[...o,...i]},Do=(e,t)=>{if(e.length===0)return`
67
- **Available Contracts:**
68
-
69
- No contracts are currently defined. Use Basic Mode with inline schemas for all events.
70
- `.trim();let r=e.map((n,o)=>{let s=n.fields.length>0?n.fields.map(i=>` - ${i}`).join(`
71
- `):" - (no fields detected)";return`
72
- ${o+1}. **${n.name}** (\`${n.eventType}\`)
73
- - Type: \`${n.typeName}\`
74
- - Fields:
75
- ${s}
76
- - **USE THIS** when consuming ${n.eventType} or similar event names
77
- `.trim()}).join(`
78
-
79
- `);return`
80
- **Available Contracts** (ALWAYS check this list first!):
81
-
82
- The following event contracts are available in \`${t}/contracts\`:
83
-
84
- ${r}
85
-
86
- If the event type your service consumes matches one of these, **you MUST use Advanced Mode**.
87
- `.trim()};var Ll=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Wl=(e,t)=>{let r=je(Ll(),"docs","generators"),n=ce(),o=[];for(let s of n.docs.base)o.push(je(r,s));if(e&&n.docs.frameworks[e]){let s=n.docs.frameworks[e];if(typeof s=="string")o.push(je(r,s));else{let i=t==="bun"?"bun":"node";s[i]&&o.push(je(r,s[i]))}}return o},Hl=["CLAUDE.md","AGENTS.md",".github/copilot-instructions.md","docs/ai-guidelines.md"],_o=1500,jo=50,Lo=e=>{try{return _l(e)?jl(e,"utf-8"):null}catch{return null}},Gl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
88
-
89
- `).replace(/[ \t]+$/gm,"").trim(),Bl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/```[\s\S]*?```/g,"").replace(/`[^`]{50,}`/g,"`...`").replace(/\n{3,}/g,`
90
-
91
- `).replace(/[ \t]+$/gm,"").trim(),Ul=e=>Math.ceil(e.length/4),Vl=(e,t)=>{let r=e.split(/(?=^## )/m),n="",o=0;for(let s of r){let i=Ul(s);if(o+i<=t)n+=s,o+=i;else if(o===0){n=s.slice(0,t*4);break}else break}return n.trim()},zl=(e,t)=>{let{workspaceRoot:r,scope:n}=t,o=Mo(r),s=Do(o,n);return e.replace(/\{\{scope\}\}/g,n).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},Wo=e=>{let{workspaceRoot:t,scope:r}=e,n=[],o=Wl(e.serviceType,e.packageManager);for(let a of o){let c=Lo(a);if(c){let l=zl(c,e),p=Gl(l);n.push(p)}}let s=[...new Set(Hl.map(a=>Lo(je(t,a))).filter(a=>a!==null).map(Bl).filter(a=>a.length>jo))],i=s.length?Math.floor(_o/s.length):_o;for(let a of s){let c=Vl(a,i);c.length>jo&&n.push(c)}return n.length===0?(console.warn("\u26A0\uFE0F No instruction files found."),`Use ${r}/contracts for shared types.`):n.join(`
92
-
93
- ---
94
-
95
- `)};var Jl=`You are an expert code generator. Generate clean, production-ready code.
96
-
97
- ## Output Format
98
-
99
- Format your code blocks with the file path on the line before the code block:
100
-
101
- #### \`src/index.ts\`
102
- \`\`\`typescript
103
- // code here
104
- \`\`\`
105
-
106
- **IMPORTANT:** Always generate:
107
- - Source code files (src/**)
108
- - Test files (src/**/*.test.ts) for all business logic
109
- - README.md with service documentation`,Kl=e=>e.replace(/-/g,"_").toUpperCase(),ql=e=>e.split("/").pop()||"my-service",Ho=(e,t,r)=>{let n=Wo({...e,serviceType:t,packageManager:r});return`${Jl}
110
-
111
- ## Project Guidelines & Patterns
112
-
113
- Follow these project-specific conventions and patterns when generating code:
114
-
115
- ${n}`},Go=(e,t,r,n)=>{let o=ql(e),s=`${Kl(o)}_PORT`,i=st();return`Generate source code for a microservice at path "${e}".
116
-
117
- Use the patterns and conventions from the Project Guidelines above.
118
-
119
- Service purpose: ${t}
120
-
121
- **CRITICAL:**
122
- - Service name: "${o}"
123
- - Workspace scope: "${i}" (use this for imports like \`${i}/contracts\`)
124
- - Port env var: Use \`process.env.${s}\` (NOT SERVICE_NAME_PORT)
125
- - Consumer name: Use "${o}" as the consumer name in consumeJetStreams
126
- - You MAY modify \`src/index.ts\` or \`src/main.ts\` to add consumeJetStreams, env validation, or middleware
127
- - BUT you MUST keep the existing port configuration line unchanged!
128
-
129
- Do NOT include the service path in file headers (use \`src/...\`, NOT \`${e}/src/...\`).
130
- `};var Yl=()=>!!process.env.DEBUG,Bo=(e,t)=>{Yl()&&console.log(`[AI Parser] ${e}`,t??"")},ut={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},$r=(e,t)=>[...e.matchAll(t)].flatMap(n=>n[1].split(`
131
- `).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),Uo=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),Zl=e=>$r(e,ut.commandsBlock).map(Uo),Xl=e=>$r(e,ut.postCommandsBlock).map(Uo),Ql=e=>$r(e,ut.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),ep=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},r=(e||"typescript").toLowerCase();return t[r]||r},tp=e=>{let t=e.split(".").pop()?.toLowerCase();return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",json:"json",yaml:"yaml",yml:"yaml",md:"markdown"}[t||""]||"plaintext"},rp=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),np=e=>{let t=e.split(`
132
- `),r=[],n=0;for(let o of t){let s=ut.fileHeader.exec(o);s&&r.push({path:s[1],index:n}),n+=o.length+1}return r},op=(e,t)=>{let n=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return n?{language:n[1]?ep(n[1]):void 0,content:rp(n[2])}:null},sp=e=>np(e).map(r=>{let n=op(e,r.index);return!n||n.content.length===0?null:{path:r.path,language:n.language||tp(r.path),content:n.content,startIndex:r.index}}).filter(r=>r!==null),Tr=e=>e.includes("packages/contracts")||e.includes("contracts/src"),ip=e=>{let t=e.filter(n=>Tr(n.path)),r=e.filter(n=>!Tr(n.path));return[...t,...r]},ap=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(Tr(t))return t;let r=t.match(/^services\/[^/]+\/(.+)$/);return r?r[1]:t},Vo=(e,t)=>{Bo("Parsing AI response",{length:e.length});let r=Zl(e),n=Xl(e),o=Ql(e),s=sp(e),i=ip(s.map(a=>({path:ap(a.path),content:a.content,language:a.language})));return Bo("Parsed response",{commands:r.length,postCommands:n.length,dependencies:o.length,files:i.length}),{commands:r,files:i,dependencies:o,postCommands:n}},zo=e=>{let t=e.filter(s=>!s.content||s.content.trim().length===0),r=e.length===0?["No files could be extracted from the AI response"]:t.map(s=>`File ${s.path} is empty`),n=e.some(s=>["src/index.ts","src/main.ts","index.ts"].includes(s.path)),o=e.length>0&&!n?["No entry point file (src/index.ts or src/main.ts) found - assuming it exists from scaffolding"]:[];return{valid:r.length===0,errors:r,warnings:o}};import{mkdirSync as cp}from"fs";import H from"chalk";var Jo=async(e,t,r)=>{if(e.length===0){cp(t,{recursive:!0}),console.log(H.yellow(`\u26A0 No scaffolding command found - creating empty directory
133
- `));return}let o=(await Sr(e,r)).find(s=>!s.success);if(o)throw console.log(H.red(`
134
- \u2717 Scaffolding failed: ${o.command}`)),o.error&&console.log(H.red(` Error: ${o.error}`)),new Error(`Command failed: ${o.command}${o.error?` - ${o.error}`:""}`)},Ko=async(e,t,r)=>{if(e.length===0)return;r.stop();let n=e.length===1?"package":"packages";console.log(H.cyan(`
135
- \u25B6 Installing ${e.length} additional ${n}...
136
- `));try{await L({packages:e,cwd:t,flags:["--silent"]}),console.log(H.green(`\u2713 Installed ${e.length} ${n}
137
- `))}catch(o){throw console.log(H.red(`\u2717 Package installation failed
138
- `)),o}},Ar=async(e,t)=>{if(e.length===0)return;console.log(H.cyan(`
139
- \u25B6 Running post-generation commands...
140
- `));let n=(await Sr(e,t)).find(o=>!o.success);if(n){console.log(H.yellow(`
141
- \u26A0 Post-command failed: ${n.command}`)),n.error&&console.log(H.yellow(` Error: ${n.error}`));return}console.log(H.green(`\u2713 Post-generation commands complete
142
- `))};import gt from"chalk";var lp=e=>`${gt.dim(" \u2022 ")+gt.cyan(e)}
143
- `,qo=e=>gt.dim(` \u2728 Generated ${gt.white.bold(e)} tokens
144
- `),Yo=()=>{let e="",t=0,r=Date.now(),n=[],o=()=>{let i=e.match(/####\s+`([^`]+)`/);if(!i)return!1;n.push(i[1]),process.stdout.write(lp(i[1]));let a=e.indexOf(i[0])+i[0].length;return e=e.slice(a),!0},s=i=>{e+=i,t++,o(),e.length>500&&(e=e.slice(-200))};return s.getStats=()=>{let i=((Date.now()-r)/1e3).toFixed(2),a=(t/Number.parseFloat(i)).toFixed(0);return{tokenCount:t,duration:i,tokensPerSec:a}},s.getFiles=()=>n,s};var fp=()=>{let e=u(),t=es(e,"package.json"),r=(()=>{if(!Qo(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse(pp(t,"utf-8")).name;if(!o)throw new Error('package.json has no "name" field. Please add a name to your root package.json.');return o.startsWith("@")?o:`@${o}`}catch(n){throw n instanceof SyntaxError?new Error("Invalid JSON in package.json"):n}})();return{workspaceRoot:e,scope:r,cwd:process.cwd()}},hp=async(e,t,r,n,o,s)=>{let i=Go(r,n,o,t.workspaceRoot),a=Ho(t,o,s),c=Yo(),l=await ho(e,i,{system:a,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(qo(p.tokenCount)),console.log(),l},yp=(e,t)=>{let{serviceTypes:r}=ce(),n=r[t]?.commandType;if(!n)return e;let o=Object.values(r).map(s=>s.commandType);return e.map(s=>{for(let i of o)if(i!==n&&s.command.includes(`pf new ${i}`))return{...s,command:s.command.replace(`pf new ${i}`,`pf new ${n}`)};return s})},vp=e=>e.length===0?"":`${[h.cyan(`
145
- \u{1F4C1} Files to create:`),...e.map(t=>` ${h.green("\u2022")} ${h.white(t.path)} ${h.dim(`(${t.language})`)}`)].join(`
146
- `)}
147
- `,Xo=(e,t,r)=>e.length===0?"":`${[h.cyan(`
148
- ${r} ${t}:`),...e.map(n=>` ${h.yellow("$")} ${h.white(n.command)}`)].join(`
149
- `)}
150
- `,Cp=e=>e.length===0?"":`${[h.cyan(`
151
- \u{1F4E6} Dependencies to install:`),...e.map(t=>` ${h.magenta("+")} ${h.white(t)}`)].join(`
152
- `)}
153
- `,kp=(e,t)=>`${[h.yellow(`
154
- Validation errors:`),...e.map(r=>h.yellow(` \u26A0 ${r}`)),h.dim(`
155
- Response preview:`),h.dim(t)].join(`
156
- `)}
157
- `,me=e=>{e&&process.stdout.write(e)},xp=(e,t)=>{let r=Vo(e,t),n=br(r.commands),o=br(r.postCommands),s=zo(r.files);return s.valid?{files:r.files,commands:n,dependencies:r.dependencies,postCommands:o}:(console.log(`${h.yellow("\u26A0")} Could not extract structured files from AI response`),me(kp(s.errors,e.slice(0,500))),null)},wp=e=>{console.log(`${h.green("\u2714")} Extracted ${e.files.length} files`),me(vp(e.files)),me(Xo(e.commands,"Commands to run","\u{1F527}")),me(Xo(e.postCommands,"Post-generation commands","\u{1F4DD}")),me(Cp(e.dependencies)),me(`
158
- `)},Pp=(e,t,r)=>{let n=Ao(e);return n&&!n.includes("/")&&!n.startsWith(".")&&(n=`${E().services}/${n}`),n?Zo(r,n):Zo(r,t)},Sp=(e,t)=>{let{serviceTypes:r}=ce(),n=r[t]?.skipFiles||["package.json","tsconfig.json","Dockerfile"];return e.filter(o=>!n.includes(o.path))},de=()=>{if(!_e())return{valid:!1,error:h.red.bold(`\u274C AI configuration not found.
159
- `)+h.yellow("Please run ")+h.cyan.bold("pf setup --ai")+h.yellow(` first to configure your AI provider.
160
- `)};try{return{valid:!0,config:pt()}}catch(e){return{valid:!1,error:h.red.bold(`\u274C ${e.message}
161
- `)}}},ft=async e=>e||up({message:"\u{1F4DD} Describe what this service should do:",validate:t=>t.trim().length>0||"Please provide a description for the AI to generate code"}),ht=(e,t,r)=>{console.log(h.cyan.bold(`
162
- \u{1F916} AI-Powered Generation
163
- `)),console.log(h.dim(`Service: ${e.split("/").pop()}`)),console.log(h.dim(`Path: ${e}`)),console.log(h.dim(`Model: ${t.model}`)),console.log(h.dim(`Description: ${r}
164
- `))},yt=async(e,t)=>{let{servicePath:r,description:n="",serviceType:o,packageManager:s}=e,i=r.split("/").pop()||r,a=fp(),c=es(a.workspaceRoot,er);dp(c,`generating:${r}`);let l=()=>{Qo(c)&&mp(c)},p=()=>{l(),process.exit(x.CANCELLED)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(h.cyan.bold(`
165
- \u{1F916} AI Generation
166
- `));let m=await hp(t,a,r,n,o,s),y=xp(m,i);if(!y)return!1;wp(y);let j=gp({text:"Processing files...",color:"cyan"}).start(),be=yp(y.commands,o),N=Pp(be,r,a.cwd),sa=Sp(y.files,o);await Jo(be,N,a.workspaceRoot);let{missingContractCommands:vn}=await Oo(sa,N,a,j);if(y.postCommands.length>0)await Ar(y.postCommands,a.workspaceRoot);else if(vn.length>0){console.log(h.cyan(`\u{1F527} Auto-creating missing contracts...
167
- `));let ia=vn.map(aa=>({command:aa,isPfCommand:!0}));await Ar(ia,a.workspaceRoot)}return $o(N),await Ko(y.dependencies,N,j),await Fo(N,j),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};import{existsSync as mC}from"fs";import{Project as bp,SyntaxKind as uC}from"ts-morph";var gC=new bp({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0});v();import{promises as Ir}from"fs";import vt from"path";import ts from"chalk";var rs=async e=>{await K("bash",["-c",`
23
+ `),$i(i,[...a,e,...n],{cwd:o.cwd??ln(),stdio:"inherit",preferLocal:!0})}async function jt(e,t,r){let{args:n,mergedOptions:o}=fn(t??[],r),s=o.manager??w(),{command:i,args:a}=gn(s);await K(i,[...a,e,...n],o)}async function ye(e,t){let{script:r,mergedOptions:n}=Ni(e,t),o=n.packageManager??w();await K(o,["run",r,...n.args??[]],{cwd:n.cwd??ln(),task:n.task})}function gn(e){let r={bun:"bunx",pnpm:"npx",yarn:"npx",npm:"npx"}[e];if(!r)throw new Error(`No executor found for the detected package manager: ${e}`);let[n,...o]=r.split(" ");return{command:n,args:o}}function Ii(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function fn(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function Ni(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var _i=e=>e==="yarn"?["npm","audit"]:["audit"],hn=new Ai("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{try{let r=d(),n=w(),o=_i(n),s=t.args||[];console.log(Oi.dim(`Running ${n} ${[...o,...s].join(" ")}`)),an(n,[...o,...s],{cwd:r})}catch(r){A(r)}});import pe from"chalk";h();import{promises as Ft}from"fs";import Ge from"path";import yn from"chalk";var vn=async e=>{await K("bash",["-c",`
168
24
  curl -fsSL https://bun.sh/install | bash && if [ -f "$HOME/.bun/bin/bun" ]; then export PATH="$HOME/.bun/bin:$PATH"; fi
169
- `],{task:e,shell:!0}),await Ip()},Rr=()=>Te("bun"),ns=()=>Yt([{label:"Bun",value:59026,color:"magenta",barColor:"magenta"},{label:"Deno",value:25335},{label:"Node.js",value:19039}],{title:'Express.js "hello world" HTTP requests per second (Linux x64)',barColor:"blackBright"}),os=()=>Yt([{label:"Bun",value:.36,color:"magenta",barColor:"magenta"},{label:"pnpm",value:6.44},{label:"npm",value:10.58},{label:"yarn",value:12.08}],{title:"Bun is an npm-compatible package manager.",unit:"s",footer:ts.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),Ip=async()=>{let e='export PATH="$HOME/.bun/bin:$PATH"',t=process.env.HOME;if(!t){d.error("Could not detect $HOME environment variable. Cannot update shell config.");return}let r=[vt.join(t,".zshrc"),vt.join(t,".bashrc"),vt.join(t,".bash_profile")];for(let n of r)try{if(await Ir.stat(n).then(()=>!0).catch(()=>!1)){(await Ir.readFile(n,"utf8")).includes(e)||(await Ir.appendFile(n,`
25
+ `],{task:e,shell:!0}),await Di()},Wt=()=>me("bun"),kn=()=>bt([{label:"Bun",value:59026,color:"magenta",barColor:"magenta"},{label:"Deno",value:25335},{label:"Node.js",value:19039}],{title:'Express.js "hello world" HTTP requests per second (Linux x64)',barColor:"blackBright"}),Cn=()=>bt([{label:"Bun",value:.36,color:"magenta",barColor:"magenta"},{label:"pnpm",value:6.44},{label:"npm",value:10.58},{label:"yarn",value:12.08}],{title:"Bun is an npm-compatible package manager.",unit:"s",footer:yn.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),Di=async()=>{let e='export PATH="$HOME/.bun/bin:$PATH"',t=process.env.HOME;if(!t){m.error("Could not detect $HOME environment variable. Cannot update shell config.");return}let r=[Ge.join(t,".zshrc"),Ge.join(t,".bashrc"),Ge.join(t,".bash_profile")];for(let n of r)try{if(await Ft.stat(n).then(()=>!0).catch(()=>!1)){(await Ft.readFile(n,"utf8")).includes(e)||(await Ft.appendFile(n,`
170
26
  # Added by platform installer
171
27
  ${e}
172
- `),d.log(`Added Bun path to ${vt.basename(n)}`));return}}catch(o){d.error(`Failed to update ${n}: ${o.message}`)}d.warn("No shell config file (.zshrc, .bashrc, .bash_profile) found. Please add the following manually:"),d.log(ts.cyan(e))};f();import{existsSync as xt,mkdirSync as Vp,readFileSync as zp,renameSync as Jp,statSync as ps,unlinkSync as Kp,writeFileSync as qp}from"fs";import{join as He}from"path";import{existsSync as Rp}from"fs";import{join as Np}from"path";import Ct from"chalk";f();import Nr from"chalk";var ue=e=>{let t=Math.max(...e.commands.map(o=>o.name.length)),r=e.commands.map(o=>{let s=" ".repeat(t-o.name.length+3);return` ${Nr.cyan(o.name)}${s}${o.description}`}),n=e.footer||'Run "<command> --help" for more information';return[Nr.cyan.bold(`
28
+ `),m.log(`Added Bun path to ${Ge.basename(n)}`));return}}catch(o){m.error(`Failed to update ${n}: ${o.message}`)}m.warn("No shell config file (.zshrc, .bashrc, .bash_profile) found. Please add the following manually:"),m.log(yn.cyan(e))};v();import{existsSync as Je,mkdirSync as ta,readFileSync as ra,renameSync as na,statSync as Rn,unlinkSync as oa,writeFileSync as sa}from"fs";import{join as Ce}from"path";import{existsSync as Li}from"fs";import{join as Mi}from"path";import Ue from"chalk";v();import Ht from"chalk";var q=e=>{let t=Math.max(...e.commands.map(o=>o.name.length)),r=e.commands.map(o=>{let s=" ".repeat(t-o.name.length+3);return` ${Ht.cyan(o.name)}${s}${o.description}`}),n=e.footer||'Run "<command> --help" for more information';return[Ht.cyan.bold(`
173
29
  ${e.title}
174
30
  `),`Available commands:
175
- `,...r,"",Nr.dim(`${n}
31
+ `,...r,"",Ht.dim(`${n}
176
32
  `)].join(`
177
- `)};var Fp=(e,t)=>t.some(r=>r.name()===e),Op=(e,t)=>t.pf?.commands?.[e]??null,Mp=(e,t)=>!!t.scripts?.[e],Dp=(e,t)=>t.cwd?Np(e,t.cwd):e,_p=(e,t)=>t.command||e,jp=(e,t,r,n)=>{let o=Dp(n,r),s=_p(e,r);if(r.cwd&&!Rp(o))return console.error(Ct.red(`
33
+ `)};var ji=(e,t)=>t.some(r=>r.name()===e),Fi=(e,t)=>t.pf?.commands?.[e]??null,Wi=(e,t)=>!!t.scripts?.[e],Hi=(e,t)=>t.cwd?Mi(e,t.cwd):e,Bi=(e,t)=>t.command||e,Gi=(e,t,r,n)=>{let o=Hi(n,r),s=Bi(e,r);if(r.cwd&&!Li(o))return console.error(Ue.red(`
178
34
  \u2716 Directory not found: ${o}
179
- `)),!0;let i=r.cwd?Ct.dim(` in ${r.cwd}/`):"";return console.log(Ct.dim(`Running ${s}${i}`)),Zn(s,t,{cwd:o}),!0},Lp=(e,t,r)=>(console.log(Ct.dim(`Running workspace script: ${e}`)),Oe(e,{args:t,cwd:r}),!0);async function Wp(e,t,r){if(Fp(e,r))return!1;let n;try{n=u()}catch{return!1}let o=F(n);if(!o)return!1;let s=Op(e,o);return s?jp(e,t,s,n):Mp(e,o)?Lp(e,t,n):!1}function ss(){let e;try{e=F()}catch{return{configured:[],scripts:[]}}if(!e)return{configured:[],scripts:[]};let t=Object.keys(e.pf?.commands??{}),n=Object.keys(e.scripts??{}).filter(o=>!t.includes(o));return{configured:t,scripts:n}}function Fr(){let{configured:e,scripts:t}=ss();return[...e,...t]}function is(){let{configured:e,scripts:t}=ss(),r=[...e,...t];if(r.length===0)return"";let o=F()?.pf?.commands||{},s=r.map(i=>({name:i,description:o[i]?.description||kt[i]||""}));return ue({title:"Workspace Commands",commands:s,footer:""})}function as(e,t,r){let n=t.slice(2);if(n.length>0&&!n[0].startsWith("-")){let o=n[0],s=n.slice(1);if(o==="__workspace-commands"&&s.includes("--names-only")){let i=Fr();for(let a of i)console.log(a);return}Wp(o,s,r).then(i=>{i||e.parse(t)})}else e.parse(t)}f();var cs={setup:"Configure platform settings",new:"Create a new project",dev:"Start development mode",event:"Event management commands",token:"Token management commands",audit:"Run security audit"},kt={build:"Build all packages",test:"Run tests",lint:"Lint codebase",format:"Format code",preview:"Preview application",prepare:"Prepare workspace",pulumi:"Run Pulumi commands","pub-sdk":"Publish platform SDK","pub-cloudevents":"Publish cloudevents package","check-versions":"Check internal version consistency","sync-versions":"Sync internal package versions","sync-templates":"Sync service templates","generate-env":"Generate environment files",dev:"Start development environment"},ls=(e,t)=>t?`${e}:${t}`:e,Hp=()=>Object.entries(cs).map(([e,t])=>ls(e,t)),Gp=()=>{try{let e=Fr(),r=F()?.pf?.commands||{},n=Object.keys(cs);return e.filter(o=>!n.includes(o)).map(o=>{let s=r[o]?.description||kt[o]||"";return ls(o,s)})}catch{return[]}},Bp=()=>{try{let e=u(),t=w(e),r=`${e}/${t.relativePath}/src`,{discoverEventTypes:n}=Jt("@crossdelta/cloudevents");return n(r)}catch{return[]}},Up=async()=>{try{let e=u();return await Co(e)}catch{return[]}},Or=async()=>({commands:[...Hp(),...Gp()],events:Bp(),services:await Up()});var Le="node_modules/.cache/pf",We="completion-cache";var Yp=e=>{let t=R.version||"0.0.0",r=e.commands.join("|"),n=e.events.join("|"),o=e.services.join("|");return`${t} ${r} ${n} ${o}`},Zp=e=>{let t=e.split(" ");if(t.length===4){let[o,s,i,a]=t;return{version:o,commands:s?s.split("|"):[],events:i?i.split("|"):[],services:a?a.split("|"):[]}}if(t.length===3){let[o,s,i]=t;return{version:o,commands:s?s.split("|"):[],events:i?i.split("|"):[],services:[]}}let[r,n]=t;return{commands:r?r.split("|"):[],events:n?n.split("|"):[],services:[]}},Xp=e=>{let t=He(e,Le);return He(t,We)},Qp=(e,t=!1)=>{if(t)return!0;let r=Xp(e);if(!xt(r))return!0;let n=zp(r,"utf-8").trim(),o=Zp(n),s=R.version||"0.0.0";if(o.version!==s)return!0;let i=He(e,"package.json");if(!xt(i))return!1;let a=ps(r).mtimeMs;return ps(i).mtimeMs>a};var em=(e,t)=>{let r=He(e,Le),n=He(r,We),o=`${n}.tmp.${process.pid}`;xt(r)||Vp(r,{recursive:!0});let s=Yp(t);try{qp(o,s,"utf-8"),Jp(o,n)}catch(i){try{xt(o)&&Kp(o)}catch{}throw i}},wt=async(e={})=>{let t;try{t=u()}catch{return!1}if(!t)return!1;if(!Qp(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let r=await Or();return em(t,r),e.verbose&&console.log(`[completion] Cache regenerated: ${r.commands.length} commands, ${r.events.length} events`),!0},Ge=async(e={})=>{await wt({...e,force:!0})};import{existsSync as Dr,readFileSync as fs,writeFileSync as hs}from"fs";import{homedir as ys}from"os";import{join as Mr}from"path";import ge from"chalk";var ms=`${Le}/${We}`,ds=e=>`# ${e} completion (workspace-local cache)
35
+ `)),!0;let i=r.cwd?Ue.dim(` in ${r.cwd}/`):"";return console.log(Ue.dim(`Running ${s}${i}`)),cn(s,t,{cwd:o}),!0},Ui=(e,t,r)=>(console.log(Ue.dim(`Running workspace script: ${e}`)),ye(e,{args:t,cwd:r}),!0);async function Vi(e,t,r){if(ji(e,r))return!1;let n;try{n=d()}catch{return!1}let o=$(n);if(!o)return!1;let s=Fi(e,o);return s?Gi(e,t,s,n):Wi(e,o)?Ui(e,t,n):!1}function xn(){let e;try{e=$()}catch{return{configured:[],scripts:[]}}if(!e)return{configured:[],scripts:[]};let t=Object.keys(e.pf?.commands??{}),n=Object.keys(e.scripts??{}).filter(o=>!t.includes(o));return{configured:t,scripts:n}}function Bt(){let{configured:e,scripts:t}=xn();return[...e,...t]}function wn(){let{configured:e,scripts:t}=xn(),r=[...e,...t];if(r.length===0)return"";let o=$()?.pf?.commands||{},s=r.map(i=>({name:i,description:o[i]?.description||Ve[i]||""}));return q({title:"Workspace Commands",commands:s,footer:""})}function Pn(e,t,r){let n=t.slice(2);if(n.length>0&&!n[0].startsWith("-")){let o=n[0],s=n.slice(1);if(o==="__workspace-commands"&&s.includes("--names-only")){let i=Bt();for(let a of i)console.log(a);return}Vi(o,s,r).then(i=>{i||e.parse(t)})}else e.parse(t)}import{existsSync as Gt,readdirSync as Ki}from"fs";import{dirname as qi,join as bn}from"path";import{dirname as Ji}from"path";import{fileURLToPath as zi}from"url";var j=e=>Ji(zi(e));Rt();var Yi=()=>typeof import.meta?.url=="string"?j(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),B=e=>{let t=e??Yi(),r=o=>Gt(bn(o,"package.json")),n=qi(t);if(r(t))return t;if(t==="/")throw new Error("Could not find package.json (package root)");return B(n)},Sn=(e,t)=>{let r=e.find(Gt);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},En=async e=>{let{getWorkspacePathsConfig:t}=await Promise.resolve().then(()=>(v(),rn)),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=bn(e,o);if(!Gt(s))return[];try{return Ki(s,{withFileTypes:!0}).filter(i=>i.isDirectory()&&i.name!==".gitkeep").map(i=>`${o}/${i.name}`)}catch{return[]}})};v();var Tn={setup:"Configure platform settings",new:"Create a new project",dev:"Start development mode",event:"Event management commands",token:"Token management commands",audit:"Run security audit"},Ve={build:"Build all packages",test:"Run tests",lint:"Lint codebase",format:"Format code",preview:"Preview application",prepare:"Prepare workspace",pulumi:"Run Pulumi commands","pub-sdk":"Publish platform SDK","pub-cloudevents":"Publish cloudevents package","check-versions":"Check internal version consistency","sync-versions":"Sync internal package versions","sync-templates":"Sync service templates","generate-env":"Generate environment files",dev:"Start development environment"},$n=(e,t)=>t?`${e}:${t}`:e,Zi=()=>Object.entries(Tn).map(([e,t])=>$n(e,t)),Xi=()=>{try{let e=Bt(),r=$()?.pf?.commands||{},n=Object.keys(Tn);return e.filter(o=>!n.includes(o)).map(o=>{let s=r[o]?.description||Ve[o]||"";return $n(o,s)})}catch{return[]}},Qi=()=>{try{let e=d(),t=x(e),r=`${e}/${t.relativePath}/src`,{discoverEventTypes:n}=xt("@crossdelta/cloudevents");return n(r)}catch{return[]}},ea=async()=>{try{let e=d();return await En(e)}catch{return[]}},Ut=async()=>({commands:[...Zi(),...Xi()],events:Qi(),services:await ea()});var ve="node_modules/.cache/pf",ke="completion-cache";var ia=e=>{let t=E.version||"0.0.0",r=e.commands.join("|"),n=e.events.join("|"),o=e.services.join("|");return`${t} ${r} ${n} ${o}`},aa=e=>{let t=e.split(" ");if(t.length===4){let[o,s,i,a]=t;return{version:o,commands:s?s.split("|"):[],events:i?i.split("|"):[],services:a?a.split("|"):[]}}if(t.length===3){let[o,s,i]=t;return{version:o,commands:s?s.split("|"):[],events:i?i.split("|"):[],services:[]}}let[r,n]=t;return{commands:r?r.split("|"):[],events:n?n.split("|"):[],services:[]}},ca=e=>{let t=Ce(e,ve);return Ce(t,ke)},pa=(e,t=!1)=>{if(t)return!0;let r=ca(e);if(!Je(r))return!0;let n=ra(r,"utf-8").trim(),o=aa(n),s=E.version||"0.0.0";if(o.version!==s)return!0;let i=Ce(e,"package.json");if(!Je(i))return!1;let a=Rn(r).mtimeMs;return Rn(i).mtimeMs>a};var la=(e,t)=>{let r=Ce(e,ve),n=Ce(r,ke),o=`${n}.tmp.${process.pid}`;Je(r)||ta(r,{recursive:!0});let s=ia(t);try{sa(o,s,"utf-8"),na(o,n)}catch(i){try{Je(o)&&oa(o)}catch{}throw i}},ze=async(e={})=>{let t;try{t=d()}catch{return!1}if(!t)return!1;if(!pa(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let r=await Ut();return la(t,r),e.verbose&&console.log(`[completion] Cache regenerated: ${r.commands.length} commands, ${r.events.length} events`),!0},xe=async(e={})=>{await ze({...e,force:!0})};import{existsSync as Jt,readFileSync as _n,writeFileSync as Dn}from"fs";import{homedir as Ln}from"os";import{join as Vt}from"path";import Y from"chalk";var In=`${ve}/${ke}`,Nn=e=>`# ${e} completion (workspace-local cache)
180
36
  # Generated: ${new Date().toISOString()}
181
37
 
182
38
  # Cache file path (relative to workspace root)
183
- _${e}_cache_path="${ms}"
39
+ _${e}_cache_path="${In}"
184
40
 
185
41
  # Find workspace root (walk up to find monorepo package.json)
186
42
  _${e}_find_workspace() {
@@ -307,11 +163,11 @@ _${e}_completions() {
307
163
  esac
308
164
  }
309
165
 
310
- compdef _${e}_completions ${e}`,us=e=>`# ${e} completion (workspace-local cache)
166
+ compdef _${e}_completions ${e}`,On=e=>`# ${e} completion (workspace-local cache)
311
167
  # Generated: ${new Date().toISOString()}
312
168
 
313
169
  # Cache file path (relative to workspace root)
314
- _${e}_cache_path="${ms}"
170
+ _${e}_cache_path="${In}"
315
171
 
316
172
  # Find workspace root
317
173
  _${e}_find_workspace() {
@@ -405,31 +261,60 @@ _${e}_completions() {
405
261
  return 0
406
262
  }
407
263
 
408
- complete -F _${e}_completions ${e}`;var tm=(e,t)=>Mr(ys(),`.${t}-completion.${e}`),vs=e=>{let t=ys();return e==="zsh"?Mr(t,".zshrc"):Mr(t,".bashrc")},rm=e=>`[[ -f "${e}" ]] && source "${e}"`,nm=(e,t)=>Dr(e)?fs(e,"utf-8").includes(t):!1,om=(e,t)=>{let r=Dr(e)?fs(e,"utf-8"):"",n=r.endsWith(`
264
+ complete -F _${e}_completions ${e}`;var ma=(e,t)=>Vt(Ln(),`.${t}-completion.${e}`),Mn=e=>{let t=Ln();return e==="zsh"?Vt(t,".zshrc"):Vt(t,".bashrc")},ua=e=>`[[ -f "${e}" ]] && source "${e}"`,da=(e,t)=>Jt(e)?_n(e,"utf-8").includes(t):!1,ga=(e,t)=>{let r=Jt(e)?_n(e,"utf-8"):"",n=r.endsWith(`
409
265
  `)?`${r}${t}
410
266
  `:`${r}
411
267
  ${t}
412
- `;hs(e,n,"utf-8")},sm=(e,t)=>{let r=tm(e,t),n=e==="zsh"?ds(t):us(t);return hs(r,n,"utf-8"),r},gs=(e,t,r)=>{let n=sm(e,t),o=vs(e),s=rm(n);return nm(o,s)?(r&&console.log(ge.dim(`[${e}] Already configured in ${o}`)),!1):(om(o,s),r&&console.log(ge.green(`[${e}] Added source line to ${o}`)),!0)},im=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",_r=(e,t=!1)=>{let r=im();t&&console.log(ge.cyan(`Installing ${r} completion...`)),gs(r,e,t);let n=r==="zsh"?"bash":"zsh",o=vs(n);Dr(o)&&gs(n,e,t),t&&(console.log(ge.green("\u2713 Shell completion installed")),console.log(ge.dim(` Run: ${ge.cyan("exec $SHELL")} to reload`)))};z();import{readdir as tw}from"fs/promises";import{dirname as nw,join as ow}from"path";import{fileURLToPath as iw}from"url";import{runFlow as cw}from"@crossdelta/flowcore";var am={debug:()=>{},info:console.log,warn:console.warn,error:console.error},Cs=e=>e!==null&&typeof e=="object",ks=e=>typeof e=="string"&&e.length>0,xs=e=>typeof e=="string",jr=e=>typeof e=="function",cm=(e,t)=>Cs(e)?[!ks(e.name)&&`commands[${t}]: missing or invalid 'name'`,!xs(e.description)&&`commands[${t}]: missing or invalid 'description'`,!Array.isArray(e.args)&&`commands[${t}]: missing 'args' array`,!Array.isArray(e.options)&&`commands[${t}]: missing 'options' array`,!jr(e.run)&&`commands[${t}]: missing 'run' function`].filter(r=>r!==!1):[`commands[${t}]: must be an object`];var ws=e=>{if(!Cs(e))return["Plugin must be an object"];let t=[!ks(e.name)&&"Missing or invalid 'name'",!xs(e.version)&&"Missing or invalid 'version'",!Array.isArray(e.commands)&&"Missing 'commands' array",!Array.isArray(e.flows)&&"Missing 'flows' array",!jr(e.setup)&&"Missing 'setup' function"].filter(n=>n!==!1),r=Array.isArray(e.commands)?e.commands.flatMap((n,o)=>cm(n,o)):[];return[...t,...r]},Pt=(e,t=am)=>({workspace:e,logger:t}),St=async(e,t)=>{let{logger:r}=t;r.debug(`Loading plugin from module: ${e}`);let n=await import(e),o=n.createPfPlugin||n.default?.createPfPlugin;if(!jr(o))throw new Error(`Module ${e} does not export createPfPlugin`);let s=o({contractsPath:t.workspace.contracts.path,contractsPackage:t.workspace.contracts.packageName,availableServices:t.workspace.availableServices}),i=ws(s);if(i.length>0)throw new Error(`Plugin from ${e} does not conform to PfPlugin interface:
268
+ `;Dn(e,n,"utf-8")},fa=(e,t)=>{let r=ma(e,t),n=e==="zsh"?Nn(t):On(t);return Dn(r,n,"utf-8"),r},An=(e,t,r)=>{let n=fa(e,t),o=Mn(e),s=ua(n);return da(o,s)?(r&&console.log(Y.dim(`[${e}] Already configured in ${o}`)),!1):(ga(o,s),r&&console.log(Y.green(`[${e}] Added source line to ${o}`)),!0)},ha=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",zt=(e,t=!1)=>{let r=ha();t&&console.log(Y.cyan(`Installing ${r} completion...`)),An(r,e,t);let n=r==="zsh"?"bash":"zsh",o=Mn(n);Jt(o)&&An(n,e,t),t&&(console.log(Y.green("\u2713 Shell completion installed")),console.log(Y.dim(` Run: ${Y.cyan("exec $SHELL")} to reload`)))};J();import{readdir as Kf}from"fs/promises";import{dirname as Yf,join as Zf}from"path";import{fileURLToPath as Qf}from"url";import{runFlow as th}from"@crossdelta/flowcore";var ya={debug:()=>{},info:console.log,warn:console.warn,error:console.error},jn=e=>e!==null&&typeof e=="object",Fn=e=>typeof e=="string"&&e.length>0,Wn=e=>typeof e=="string",Kt=e=>typeof e=="function",va=(e,t)=>jn(e)?[!Fn(e.name)&&`commands[${t}]: missing or invalid 'name'`,!Wn(e.description)&&`commands[${t}]: missing or invalid 'description'`,!Array.isArray(e.args)&&`commands[${t}]: missing 'args' array`,!Array.isArray(e.options)&&`commands[${t}]: missing 'options' array`,!Kt(e.run)&&`commands[${t}]: missing 'run' function`].filter(r=>r!==!1):[`commands[${t}]: must be an object`];var Hn=e=>{if(!jn(e))return["Plugin must be an object"];let t=[!Fn(e.name)&&"Missing or invalid 'name'",!Wn(e.version)&&"Missing or invalid 'version'",!Array.isArray(e.commands)&&"Missing 'commands' array",!Array.isArray(e.flows)&&"Missing 'flows' array",!Kt(e.setup)&&"Missing 'setup' function"].filter(n=>n!==!1),r=Array.isArray(e.commands)?e.commands.flatMap((n,o)=>va(n,o)):[];return[...t,...r]},Ke=(e,t=ya)=>({workspace:e,logger:t}),qe=async(e,t)=>{let{logger:r}=t;r.debug(`Loading plugin from module: ${e}`);let n=await import(e),o=n.createPfPlugin||n.default?.createPfPlugin;if(!Kt(o))throw new Error(`Module ${e} does not export createPfPlugin`);let s=o({contractsPath:t.workspace.contracts.path,contractsPackage:t.workspace.contracts.packageName,availableServices:t.workspace.availableServices}),i=Hn(s);if(i.length>0)throw new Error(`Plugin from ${e} does not conform to PfPlugin interface:
413
269
  - ${i.join(`
414
- - `)}`);let a=s;return r.debug(`Loaded plugin: ${a.name} v${a.version}`),await a.setup(t),{plugin:a,source:e}};import{deriveEventNames as dw}from"@crossdelta/cloudevents";import{z as C}from"zod";var bt=C.object({dependencies:C.record(C.string(),C.string()).default({}),envVars:C.array(C.object({key:C.string(),description:C.string(),required:C.boolean().default(!0)})).default([]),adapterFile:C.string().optional()}),lm=C.object({push:C.string().optional(),email:C.string().optional(),slack:C.string().optional(),sms:C.string().optional()}).optional(),pm=C.object({defaults:lm,providers:C.object({push:C.record(C.string(),bt).optional(),email:C.record(C.string(),bt).optional(),slack:C.record(C.string(),bt).optional(),sms:C.record(C.string(),bt).optional()}).optional()}),uk=C.object({notifier:pm.optional()});import{z as g}from"zod";var mm=g.object({type:g.literal("event"),eventType:g.string(),stream:g.string().optional()}),dm=g.object({type:g.literal("http"),method:g.enum(["GET","POST","PUT","DELETE","PATCH"]).optional(),path:g.string().optional()}),Ps=g.discriminatedUnion("type",[mm,dm]),um=g.object({type:g.literal("emit.event"),eventType:g.string()}),gm=g.object({type:g.literal("notify"),channel:g.enum(["push","email","slack","sms"]),provider:g.string().optional()}),fm=g.object({type:g.literal("call.http"),name:g.string().optional(),baseUrl:g.string().optional()}),hm=g.object({type:g.literal("persist"),store:g.enum(["db","kv","cache"]),entity:g.string().optional()}),Ss=g.discriminatedUnion("type",[um,gm,fm,hm]),bs=g.object({serviceName:g.string().regex(/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/),framework:g.enum(["hono","nest"]).default("hono"),triggers:g.array(Ps).min(1),actions:g.array(Ss).default([])});var Em=(e,t,r)=>{let{stream:n,servicePath:o}=e,s=o.startsWith("/")?o:`${t.workspace.workspaceRoot}/${o}`;if(r?.dryRun)return{success:!0,message:`Would wire stream ${n} to ${o}`,changes:[{type:"update",path:s,description:`Wire ${n} stream to service`,preview:`consumeJetStreams({ streams: ['${n.toUpperCase()}'], ... })`}]};let i=yr(s,`${n.toLowerCase()}.event`);return i.warning?(t.logger.warn(i.warning),{success:!1,message:i.warning}):i.added?(t.logger.info(`Wired stream ${i.streamName} to service`),{success:!0,message:`Wired stream ${i.streamName}`}):(t.logger.debug(`Stream ${i.streamName} already wired`),{success:!0,message:`Stream ${i.streamName} already configured`})},Tm=(e,t,r)=>{let{path:n,eventType:o}=e;if(r?.dryRun){let i=`
270
+ - `)}`);let a=s;return r.debug(`Loaded plugin: ${a.name} v${a.version}`),await a.setup(t),{plugin:a,source:e}};import{deriveEventNames as sh}from"@crossdelta/cloudevents";import{z as f}from"zod";var Ye=f.object({dependencies:f.record(f.string(),f.string()).default({}),envVars:f.array(f.object({key:f.string(),description:f.string(),required:f.boolean().default(!0)})).default([]),adapterFile:f.string().optional()}),ka=f.object({push:f.string().optional(),email:f.string().optional(),slack:f.string().optional(),sms:f.string().optional()}).optional(),Ca=f.object({defaults:ka,providers:f.object({push:f.record(f.string(),Ye).optional(),email:f.record(f.string(),Ye).optional(),slack:f.record(f.string(),Ye).optional(),sms:f.record(f.string(),Ye).optional()}).optional()}),Yd=f.object({notifier:Ca.optional()});import{z as g}from"zod";var xa=g.object({type:g.literal("event"),eventType:g.string(),stream:g.string().optional()}),wa=g.object({type:g.literal("http"),method:g.enum(["GET","POST","PUT","DELETE","PATCH"]).optional(),path:g.string().optional()}),Bn=g.discriminatedUnion("type",[xa,wa]),Pa=g.object({type:g.literal("emit.event"),eventType:g.string()}),ba=g.object({type:g.literal("notify"),channel:g.enum(["push","email","slack","sms"]),provider:g.string().optional()}),Sa=g.object({type:g.literal("call.http"),name:g.string().optional(),baseUrl:g.string().optional()}),Ea=g.object({type:g.literal("persist"),store:g.enum(["db","kv","cache"]),entity:g.string().optional()}),Gn=g.discriminatedUnion("type",[Pa,ba,Sa,Ea]),Un=g.object({serviceName:g.string().regex(/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/),framework:g.enum(["hono","nest"]).default("hono"),triggers:g.array(Bn).min(1),actions:g.array(Gn).default([])});v();import{existsSync as X,mkdirSync as La,readFileSync as qt,writeFileSync as we}from"fs";import{dirname as Jn,join as Z}from"path";import{deriveEventNames as Ma}from"@crossdelta/cloudevents";var ja=(e,t)=>{let r=`export * from './${t}'`;if(!X(e)){let s=Jn(e);X(s)||La(s,{recursive:!0});let i=`/**
271
+ * ${Jn(e).split("/").pop()} Domain Events
272
+ */
273
+
274
+ `;return we(e,`${i+r}
275
+ `,"utf-8"),!0}let n=qt(e,"utf-8");if(n.includes(`'./${t}'`))return!1;let o=`${n.trimEnd()}
276
+ ${r}
277
+ `;return we(e,o,"utf-8"),!0},Fa=(e,t)=>{let r=`export * from './${t}'`;if(!X(e))return we(e,`/**
278
+ * Event Contracts Index
279
+ *
280
+ * Re-exports all event contracts for convenient importing.
281
+ */
282
+
283
+ ${r}
284
+ `,"utf-8"),!0;let o=qt(e,"utf-8").split(`
285
+ `);if(o.some(i=>i.trim()===r))return!1;let s=o.findLastIndex(i=>i.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push(r),we(e,o.join(`
286
+ `),"utf-8"),!0},Wa=e=>{if(!X(e))return!1;let t=qt(e,"utf-8"),r="export * from './events'";if(t.split(`
287
+ `).some(s=>s.trim()===r||s.trim().startsWith(r)))return!1;let o=t;return o=o.replace(/\/\/\s*export \* from '\.\/events'/,r),o=o.replace(/\/\/\s*export \* from '\.\/stream-policies'/,"export * from './stream-policies'"),/export \* from '\.\/events\/\w+\/\w+'/.test(o)&&(o=o.replace(/export \* from '\.\/events\/\w+\/\w+'\n?/g,"")),o.includes(r)||(o=`${o.trimEnd()}
288
+ ${r}
289
+ `),o!==t?(we(e,o,"utf-8"),!0):!1},zn=(e,t)=>{let{packagePath:r}=x(t),{domain:n,action:o}=Ma(e),s=Z(r,"src","events");if(!X(s))return!1;let i=Z(s,n),a=Z(i,"index.ts"),c=Z(s,"index.ts"),p=Z(r,"src","index.ts"),l=e.split(".")[0],u=Z(s,l);l!==n&&X(u)&&(console.warn(`\u26A0\uFE0F Warning: Legacy folder '${l}/' found. Please migrate to '${n}/' to avoid conflicts.`),console.warn(` Run: mv ${u} ${i}`));let T=!1;return ja(a,o)&&(T=!0),Fa(c,n)&&(T=!0),Wa(p)&&(T=!0),T};import{existsSync as Ze,readFileSync as Kn,writeFileSync as Ha}from"fs";import{join as Yt}from"path";import{getStreamName as Ba}from"@crossdelta/cloudevents";var Ga=(e,t)=>{let r=Yt(e,"src","index.ts");if(!Ze(r))return!1;let n=Kn(r,"utf-8"),o=t.toLowerCase();return new RegExp(`streams:\\s*\\[[^\\]]*['"]${t}['"]`).test(n)||n.includes(`stream: '${t}'`)?!0:new RegExp(`subjects:\\s*\\[.*['"]${o}\\.[*>]`).test(n)},Ua=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
290
+ `,r=e.match(/import\s+['"]@crossdelta\/telemetry['"]\s*\n/);if(r){let o=(r.index??0)+r[0].length;return`${e.slice(0,o)}
291
+ ${t}${e.slice(o)}`}let n=e.match(/import\s+.*\n/);if(n){let o=(n.index??0)+n[0].length;return e.slice(0,o)+t+e.slice(o)}return e},Va=(e,t)=>`
292
+
293
+ // Consume from ${e} stream
294
+ consumeJetStreams({
295
+ streams: ['${e}'],
296
+ consumer: '${t}-service',
297
+ discover: './src/events/**/*.handler.ts',
298
+ })`,qn=(e,t)=>{let r=Ba(t),n=Yt(e,"src","index.ts"),o=Yt(e,"src","main.ts");if(!Ze(n)&&Ze(o))return{added:!1,streamName:r};if(!Ze(n))return{added:!1,streamName:r,warning:"Entry point not found (index.ts or main.ts)"};if(Ga(e,r))return{added:!1,streamName:r};let s=Kn(n,"utf-8"),i=e.split("/").pop()||"unknown";s.includes("consumeJetStreams")||(s=Ua(s));let a=Va(r,i),c=`${s.trimEnd()+a}
299
+ `;return Ha(n,c,"utf-8"),{added:!0,streamName:r}};var Ja=(e,t,r)=>{let{stream:n,servicePath:o}=e,s=o.startsWith("/")?o:`${t.workspace.workspaceRoot}/${o}`;if(r?.dryRun)return{success:!0,message:`Would wire stream ${n} to ${o}`,changes:[{type:"update",path:s,description:`Wire ${n} stream to service`,preview:`consumeJetStreams({ streams: ['${n.toUpperCase()}'], ... })`}]};let i=qn(s,`${n.toLowerCase()}.event`);return i.warning?(t.logger.warn(i.warning),{success:!1,message:i.warning}):i.added?(t.logger.info(`Wired stream ${i.streamName} to service`),{success:!0,message:`Wired stream ${i.streamName}`}):(t.logger.debug(`Stream ${i.streamName} already wired`),{success:!0,message:`Stream ${i.streamName} already configured`})},za=(e,t,r)=>{let{path:n,eventType:o}=e;if(r?.dryRun){let i=`
415
300
  import { createContract } from '@crossdelta/cloudevents'
416
301
  import { z } from 'zod'
417
302
 
418
- export const ${Lr(o)}Contract = createContract({
303
+ export const ${Zt(o)}Contract = createContract({
419
304
  type: '${o}',
420
305
  schema: z.object({ ... }),
421
306
  })
422
- `.trim();return{success:!0,message:`Would create contract ${o}`,changes:[{type:"create",path:n,description:`Create event contract for ${o}`,preview:i.slice(0,500)}]}}let s=xr(o,t.workspace.workspaceRoot);return s&&t.logger.debug(`Added export for ${o} to contracts index`),t.logger.debug(`Contract created: ${o} at ${n}`),{success:!0,message:s?`Contract ${o} created with exports`:`Contract ${o} created`}},Lr=e=>e.split(".").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),$m=(e,t,r)=>{let{path:n,eventType:o,servicePath:s}=e;if(r?.dryRun){let i=`
307
+ `.trim();return{success:!0,message:`Would create contract ${o}`,changes:[{type:"create",path:n,description:`Create event contract for ${o}`,preview:i.slice(0,500)}]}}let s=zn(o,t.workspace.workspaceRoot);return s&&t.logger.debug(`Added export for ${o} to contracts index`),t.logger.debug(`Contract created: ${o} at ${n}`),{success:!0,message:s?`Contract ${o} created with exports`:`Contract ${o} created`}},Zt=e=>e.split(".").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),Ka=(e,t,r)=>{let{path:n,eventType:o,servicePath:s}=e;if(r?.dryRun){let i=`
423
308
  import { handleEvent } from '@crossdelta/cloudevents'
424
- import { ${Lr(o)}Contract } from '@your-scope/contracts'
309
+ import { ${Zt(o)}Contract } from '@your-scope/contracts'
425
310
 
426
- export default handleEvent(${Lr(o)}Contract, async (data) => {
311
+ export default handleEvent(${Zt(o)}Contract, async (data) => {
427
312
  console.log('Processing ${o}:', data)
428
313
  // TODO: Implement handler logic
429
314
  })
430
- `.trim();return{success:!0,message:`Would create handler for ${o}`,changes:[{type:"create",path:n,description:`Create event handler for ${o}`,preview:i.slice(0,500)}]}}return t.logger.debug(`Handler created: ${o} at ${n} (service: ${s})`),{success:!0}},Am={"stream.wired":Em,"contract.created":Tm,"handler.created":$m},Wr=(e,t,r)=>e.map(n=>{let o=Am[n.kind];return o?o(n,t,r):(t.logger.warn(`Unknown effect kind: ${n.kind}`),{success:!1,message:`Unknown effect kind: ${n.kind}`})});import{join as It}from"path";import{deriveEventNames as vd}from"@crossdelta/cloudevents";var Hr=(e,t,r={})=>({ok:!0,operation:e,summary:t,artifacts:r.artifacts??[],changes:r.changes??[],diagnostics:r.diagnostics??[],next:r.next,data:r.data});f();import{join as Br}from"path";import{readFileSync as Im}from"fs";import{join as Rm}from"path";import Nm from"handlebars";var fe=(e,t)=>vo(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),Gr=(e,t={})=>{let r=Im(e,"utf-8");return Nm.compile(r)(t)},Et=e=>(t,r={})=>{let n=Rm(e,t);return Gr(n,r)};var B=e=>e.toUpperCase().replace(/-/g,"_");var Ts=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");var Fm=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Om=()=>{let e=Fm(),t=ee();return fe([Br(e,"templates","hono-microservice"),Br(e,"..","hono-microservice","templates"),Br(t,"bin","templates","hono-microservice")],"Hono templates directory not found.")},Tt=(e,t={})=>Et(Om())(e,t);function $s(){return Tt("tsconfig.json.hbs")}function As(e="1.2.23"){return Tt("Dockerfile.hbs",{bunVersion:e})}function Is(){return Tt("biome.json.hbs")}function Rs(e,t=[]){return Tt("src/config/env.ts.hbs",{envKey:B(e),envVars:t})}var Mm=e=>{let t=["import './config/env'","import '@crossdelta/telemetry'",""];return e&&t.push("import { consumeJetStreams, isConsumerConnected } from '@crossdelta/cloudevents'"),t.push("import { Hono } from 'hono'"),t},Dm=(e,t)=>{let r=[`const port = Number(process.env.${e}_PORT) || 8080`,"const app = new Hono()","","app.get('/health', (c) => {"," return c.json({ status: 'ok' })","})"];return t&&r.push("","app.get('/health/ready', (c) => {"," const ready = isConsumerConnected()"," return c.json({ status: ready ? 'ok' : 'not-ready' }, ready ? 200 : 503)","})"),r},_m=(e,t)=>["","// Start NATS JetStream consumer","consumeJetStreams({",` streams: [${t.map(r=>`'${r}'`).join(", ")}],`,` consumer: '${e}',`," discover: './src/events/**/*.handler.ts',","})"],jm=()=>["","Bun.serve({"," port,"," fetch: app.fetch,","})","","console.log(`\u{1F680} Service ready at http://localhost:${port}`)"],Lm=e=>{let t=B(e.serviceName);return`${[...Mm(e.hasEvents),"",...Dm(t,e.hasEvents),...e.hasEvents?_m(e.serviceName,e.streams):[],...jm()].join(`
315
+ `.trim();return{success:!0,message:`Would create handler for ${o}`,changes:[{type:"create",path:n,description:`Create event handler for ${o}`,preview:i.slice(0,500)}]}}return t.logger.debug(`Handler created: ${o} at ${n} (service: ${s})`),{success:!0}},qa={"stream.wired":Ja,"contract.created":za,"handler.created":Ka},Xt=(e,t,r)=>e.map(n=>{let o=qa[n.kind];return o?o(n,t,r):(t.logger.warn(`Unknown effect kind: ${n.kind}`),{success:!1,message:`Unknown effect kind: ${n.kind}`})});import{join as rt}from"path";import{deriveEventNames as jc}from"@crossdelta/cloudevents";var Qt=(e,t,r={})=>({ok:!0,operation:e,summary:t,artifacts:r.artifacts??[],changes:r.changes??[],diagnostics:r.diagnostics??[],next:r.next,data:r.data});v();import{join as tr}from"path";import{readFileSync as Ya}from"fs";import{join as Za}from"path";import Xa from"handlebars";var Q=(e,t)=>Sn(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),er=(e,t={})=>{let r=Ya(e,"utf-8");return Xa.compile(r)(t)},Xe=e=>(t,r={})=>{let n=Za(e,t);return er(n,r)};var D=e=>e.toUpperCase().replace(/-/g,"_");var Yn=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");var Qa=()=>typeof import.meta?.url=="string"?j(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),ec=()=>{let e=Qa(),t=B();return Q([tr(e,"templates","hono-microservice"),tr(e,"..","hono-microservice","templates"),tr(t,"bin","templates","hono-microservice")],"Hono templates directory not found.")},Qe=(e,t={})=>Xe(ec())(e,t);function Zn(){return Qe("tsconfig.json.hbs")}function Xn(e="1.2.23"){return Qe("Dockerfile.hbs",{bunVersion:e})}function Qn(){return Qe("biome.json.hbs")}function eo(e,t=[]){return Qe("src/config/env.ts.hbs",{envKey:D(e),envVars:t})}var tc=e=>{let t=["import './config/env'","import '@crossdelta/telemetry'",""];return e&&t.push("import { consumeJetStreams, isConsumerConnected } from '@crossdelta/cloudevents'"),t.push("import { Hono } from 'hono'"),t},rc=(e,t)=>{let r=[`const port = Number(process.env.${e}_PORT) || 8080`,"const app = new Hono()","","app.get('/health', (c) => {"," return c.json({ status: 'ok' })","})"];return t&&r.push("","app.get('/health/ready', (c) => {"," const ready = isConsumerConnected()"," return c.json({ status: ready ? 'ok' : 'not-ready' }, ready ? 200 : 503)","})"),r},nc=(e,t)=>["","// Start NATS JetStream consumer","consumeJetStreams({",` streams: [${t.map(r=>`'${r}'`).join(", ")}],`,` consumer: '${e}',`," discover: './src/events/**/*.handler.ts',","})"],oc=()=>["","Bun.serve({"," port,"," fetch: app.fetch,","})","","console.log(`\u{1F680} Service ready at http://localhost:${port}`)"],sc=e=>{let t=D(e.serviceName);return`${[...tc(e.hasEvents),"",...rc(t,e.hasEvents),...e.hasEvents?nc(e.serviceName,e.streams):[],...oc()].join(`
431
316
  `)}
432
- `},Wm=e=>{let t={hono:"^4.6.14","@crossdelta/telemetry":"workspace:*",zod:"^4.1.0",[`${e.workspaceScope}/contracts`]:"workspace:*"};e.hasEvents&&(t["@crossdelta/cloudevents"]="workspace:*");let r={name:e.packageName,version:"0.0.1",type:"module",scripts:{"start:dev":"bun --watch src/index.ts",start:"bun src/index.ts",test:"bun test"},dependencies:t,devDependencies:{"@types/bun":"^1.2.23"}};return JSON.stringify(r,null,2)},Hm=e=>`# ${e.serviceName}
317
+ `},ic=e=>{let t={hono:"^4.6.14","@crossdelta/telemetry":"workspace:*",zod:"^4.1.0",[`${e.workspaceScope}/contracts`]:"workspace:*"};e.hasEvents&&(t["@crossdelta/cloudevents"]="workspace:*");let r={name:e.packageName,version:"0.0.1",type:"module",scripts:{"start:dev":"bun --watch src/index.ts",start:"bun src/index.ts",test:"bun test"},dependencies:t,devDependencies:{"@types/bun":"^1.2.23"}};return JSON.stringify(r,null,2)},ac=e=>`# ${e.serviceName}
433
318
 
434
319
  ## Development
435
320
 
@@ -449,7 +334,7 @@ ${e.hasEvents?`
449
334
  This service consumes from:
450
335
  ${e.streams.map(t=>`- ${t}`).join(`
451
336
  `)}`:""}
452
- `,Gm=()=>"",Ns={name:"hono-bun",runtime:"bun",framework:"hono",files:[{path:"src/index.ts",content:Lm},{path:"src/config/env.ts",content:e=>Rs(e.serviceName,e.envVars)},{path:"package.json",content:Wm},{path:"tsconfig.json",content:()=>$s()},{path:"Dockerfile",content:()=>As()},{path:"biome.json",content:()=>Is()},{path:"README.md",content:Hm},{path:"src/events/.gitkeep",content:Gm,skip:e=>!e.hasEvents}]};import{join as Ur}from"path";var Bm=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Um=()=>{let e=Bm(),t=ee();return fe([Ur(e,"templates","nest-microservice"),Ur(e,"..","nest-microservice","templates"),Ur(t,"bin","templates","nest-microservice")],"NestJS templates directory not found.")},re=(e,t={})=>Et(Um())(e,t);function Fs(e,t=3e3){return re("src/main.ts.hbs",{serviceName:e,envKey:B(e),displayName:Ts(e),defaultPort:t})}function Os(){return re("src/app.context.ts.hbs",{})}function Ms(){return re("src/events/events.module.ts.hbs",{})}function Ds(e){return re("src/events/events.service.ts.hbs",{serviceName:e})}function _s(e="24",t="1.2.23"){return re("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function js(){return re("biome.json.hbs",{})}function Ls(e,t=[]){return re("src/config/env.ts.hbs",{envKey:B(e),envVars:t})}var Vm=e=>{let t={"@nestjs/common":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/platform-express":"^11.0.0","@crossdelta/telemetry":"workspace:*","reflect-metadata":"^0.2.0",rxjs:"^7.8.0",zod:"^4.1.0",[`${e.workspaceScope}/contracts`]:"workspace:*"};e.hasEvents&&(t["@crossdelta/cloudevents"]="workspace:*");let r={name:e.packageName,version:"0.0.1",scripts:{"start:dev":"bun --watch src/main.ts",start:"node dist/main.js",build:"tsc",test:"bun test"},dependencies:t,devDependencies:{"@nestjs/cli":"^11.0.0","@types/node":"^24.0.0",typescript:"^5.7.0"}};return JSON.stringify(r,null,2)},zm=()=>JSON.stringify({extends:"../../../../tsconfig.json",compilerOptions:{outDir:"./dist",rootDir:"./src",experimentalDecorators:!0,emitDecoratorMetadata:!0},include:["src/**/*"],exclude:["node_modules","dist","**/*.test.ts"]},null,2),Jm=e=>{let t=["Module","HttpModule"],r=["HttpModule"];return e.hasEvents&&(t.push("OnModuleInit"),r.push("EventsModule")),`import { ${t.join(", ")} } from '@nestjs/common'
337
+ `,cc=()=>"",to={name:"hono-bun",runtime:"bun",framework:"hono",files:[{path:"src/index.ts",content:sc},{path:"src/config/env.ts",content:e=>eo(e.serviceName,e.envVars)},{path:"package.json",content:ic},{path:"tsconfig.json",content:()=>Zn()},{path:"Dockerfile",content:()=>Xn()},{path:"biome.json",content:()=>Qn()},{path:"README.md",content:ac},{path:"src/events/.gitkeep",content:cc,skip:e=>!e.hasEvents}]};import{join as rr}from"path";var pc=()=>typeof import.meta?.url=="string"?j(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),lc=()=>{let e=pc(),t=B();return Q([rr(e,"templates","nest-microservice"),rr(e,"..","nest-microservice","templates"),rr(t,"bin","templates","nest-microservice")],"NestJS templates directory not found.")},G=(e,t={})=>Xe(lc())(e,t);function ro(e,t=3e3){return G("src/main.ts.hbs",{serviceName:e,envKey:D(e),displayName:Yn(e),defaultPort:t})}function no(){return G("src/app.context.ts.hbs",{})}function oo(){return G("src/events/events.module.ts.hbs",{})}function so(e){return G("src/events/events.service.ts.hbs",{serviceName:e})}function io(e="24",t="1.2.23"){return G("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function ao(){return G("biome.json.hbs",{})}function co(e,t=[]){return G("src/config/env.ts.hbs",{envKey:D(e),envVars:t})}var mc=e=>{let t={"@nestjs/common":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/platform-express":"^11.0.0","@crossdelta/telemetry":"workspace:*","reflect-metadata":"^0.2.0",rxjs:"^7.8.0",zod:"^4.1.0",[`${e.workspaceScope}/contracts`]:"workspace:*"};e.hasEvents&&(t["@crossdelta/cloudevents"]="workspace:*");let r={name:e.packageName,version:"0.0.1",scripts:{"start:dev":"bun --watch src/main.ts",start:"node dist/main.js",build:"tsc",test:"bun test"},dependencies:t,devDependencies:{"@nestjs/cli":"^11.0.0","@types/node":"^24.0.0",typescript:"^5.7.0"}};return JSON.stringify(r,null,2)},uc=()=>JSON.stringify({extends:"../../../../tsconfig.json",compilerOptions:{outDir:"./dist",rootDir:"./src",experimentalDecorators:!0,emitDecoratorMetadata:!0},include:["src/**/*"],exclude:["node_modules","dist","**/*.test.ts"]},null,2),dc=e=>{let t=["Module","HttpModule"],r=["HttpModule"];return e.hasEvents&&(t.push("OnModuleInit"),r.push("EventsModule")),`import { ${t.join(", ")} } from '@nestjs/common'
453
338
  ${e.hasEvents?"import { EventsModule } from './events/events.module'":""}
454
339
 
455
340
  @Module({
@@ -462,7 +347,7 @@ export class AppModule${e.hasEvents?" implements OnModuleInit":""} {
462
347
  // Events module initializes NATS consumer
463
348
  }`:""}
464
349
  }
465
- `},Km=()=>`import { Controller, Get } from '@nestjs/common'
350
+ `},gc=()=>`import { Controller, Get } from '@nestjs/common'
466
351
 
467
352
  @Controller()
468
353
  export class AppController {
@@ -471,7 +356,7 @@ export class AppController {
471
356
  return { status: 'ok' }
472
357
  }
473
358
  }
474
- `,qm=e=>`# ${e.serviceName}
359
+ `,fc=e=>`# ${e.serviceName}
475
360
 
476
361
  ## Development
477
362
 
@@ -491,8 +376,8 @@ ${e.hasEvents?`
491
376
  This service consumes from:
492
377
  ${e.streams.map(t=>`- ${t}`).join(`
493
378
  `)}`:""}
494
- `,Ym=()=>"",Ws={name:"nest",runtime:"node",framework:"nest",files:[{path:"src/config/env.ts",content:e=>Ls(e.serviceName,e.envVars)},{path:"src/main.ts",content:e=>Fs(e.serviceName,e.port)},{path:"src/app.module.ts",content:Jm},{path:"src/app.controller.ts",content:()=>Km()},{path:"src/app.context.ts",content:()=>Os()},{path:"package.json",content:Vm},{path:"tsconfig.json",content:()=>zm()},{path:"Dockerfile",content:()=>_s()},{path:"biome.json",content:()=>js()},{path:"README.md",content:qm},{path:"src/events/events.module.ts",content:()=>Ms(),skip:e=>!e.hasEvents},{path:"src/events/events.service.ts",content:e=>Ds(e.serviceName),skip:e=>!e.hasEvents},{path:"src/events/handlers/.gitkeep",content:Ym,skip:e=>!e.hasEvents}]};var Hs=[Ns,Ws],Gs=e=>{let t=Zm(e),r=Hs.find(n=>n.name===t);if(!r)throw new Error(`Template '${e}' not found. Available: ${Hs.map(n=>n.name).join(", ")}`);return r},Zm=e=>({"hono-micro":"hono-bun","nest-micro":"nest"})[e]||e;import{join as zr}from"path";import{deriveEventNames as Jr}from"@crossdelta/cloudevents";var Bs={appliesTo:["src/domain","src/use-cases"],forbiddenPatterns:[{pattern:"console\\.(log|error|warn|info|debug)\\s*\\(",description:"console.* is forbidden in business logic (use structured logging)",code:"CONSOLE_IN_DOMAIN"},{pattern:"process\\.env\\b",description:"process.env is forbidden in business logic (use dependency injection)",code:"PROCESS_ENV_IN_DOMAIN"},{pattern:"\\bfetch\\s*\\(",description:"fetch() is forbidden in business logic (use adapters/services)",code:"FETCH_IN_DOMAIN"}]},Be={hono:{businessLogicDir:"use-cases",eventsDir:"events",filePattern:"{name}.use-case.ts",suffix:"use-case",handlerDelegatesToBusinessLogic:!0,pathGuards:{forbidDirs:["src/services"]},codingConstraints:Bs},nestjs:{businessLogicDir:"",eventsDir:"events",filePattern:"{name}.service.ts",suffix:"service",handlerDelegatesToBusinessLogic:!1,pathGuards:{forbidDirs:[]},codingConstraints:{appliesTo:["src/domain"],forbiddenPatterns:Bs.forbiddenPatterns}}},Xm=e=>e.replace(/-([a-z])/g,(t,r)=>r.toUpperCase()),Qm=(e,t)=>`../${e}/${t}`,he=(e,t)=>{let r=Be[e],n=r.filePattern.replace("{name}",t),o=n.replace(/\.ts$/,""),s=r.businessLogicDir?`src/${r.businessLogicDir}`:"src";return{filePath:s?`${s}/${n}`:`src/${n}`,dirPath:s,fileName:n,functionName:Xm(t),delegateFromHandler:r.handlerDelegatesToBusinessLogic,importFromEvents:r.businessLogicDir?Qm(r.businessLogicDir,o):`./${o}`}},Vr=(e,t)=>{let n=`src/${Be[e].eventsDir}`,o=`${t}.handler.ts`;return{filePath:`${n}/${o}`,dirPath:n,fileName:o}},Ue=e=>`handle-${e.replace(/\./g,"-")}`,$t=e=>{let t=e.replace(/\\/g,"/");t=t.replace(/^\.\//,"").replace(/^\//,"");let r=t.split("/"),n=[];for(let o of r)o===".."?n.pop():o!=="."&&o!==""&&n.push(o);return n.join("/")},ed=(e,t)=>{let r=$t(e);for(let n of t){let o=$t(n);if(r.startsWith(`${o}/`)||r===o)return n}return null},td=(e,t)=>{let r=$t(e);return t.some(n=>{let o=$t(n);return r.startsWith(`${o}/`)||r===o})},rd=(e,t,r)=>{let n=[],o=e.split(`
495
- `);for(let{pattern:s,description:i,code:a}of t){let c=new RegExp(s,"g");for(let l=0;l<o.length;l++)c.test(o[l])&&n.push({code:a,message:i,path:r,line:l+1}),c.lastIndex=0}return n},nd=(e,t)=>{let r=[],n=ed(e.path,t.pathGuards.forbidDirs);if(n&&r.push({code:"FORBIDDEN_DIR",message:`Path '${e.path}' is in forbidden directory '${n}'`,path:e.path}),td(e.path,t.codingConstraints.appliesTo)){let o=rd(e.content,t.codingConstraints.forbiddenPatterns,e.path);r.push(...o)}return r},At=(e,t)=>{let r=Be[e],n=[];for(let o of t)n.push(...nd(o,r));return{valid:n.length===0,violations:n}};var id=(e,t)=>t.map(r=>({kind:"file:write",path:zr(e,r.path),content:r.content})),ad=(e,t,r)=>({kind:"infra:add",serviceName:e,port:t,framework:r.framework,runtime:r.runtime}),cd=(e,t)=>({kind:"env:add",key:`${e}_PORT`,value:t.toString()}),ld=(e,t)=>{let{typeName:r}=Jr(e),n=Ue(e),o=he("hono",n);return`import type { ${r} } from '${t}/contracts'
379
+ `,hc=()=>"",po={name:"nest",runtime:"node",framework:"nest",files:[{path:"src/config/env.ts",content:e=>co(e.serviceName,e.envVars)},{path:"src/main.ts",content:e=>ro(e.serviceName,e.port)},{path:"src/app.module.ts",content:dc},{path:"src/app.controller.ts",content:()=>gc()},{path:"src/app.context.ts",content:()=>no()},{path:"package.json",content:mc},{path:"tsconfig.json",content:()=>uc()},{path:"Dockerfile",content:()=>io()},{path:"biome.json",content:()=>ao()},{path:"README.md",content:fc},{path:"src/events/events.module.ts",content:()=>oo(),skip:e=>!e.hasEvents},{path:"src/events/events.service.ts",content:e=>so(e.serviceName),skip:e=>!e.hasEvents},{path:"src/events/handlers/.gitkeep",content:hc,skip:e=>!e.hasEvents}]};var lo=[to,po],mo=e=>{let t=yc(e),r=lo.find(n=>n.name===t);if(!r)throw new Error(`Template '${e}' not found. Available: ${lo.map(n=>n.name).join(", ")}`);return r},yc=e=>({"hono-micro":"hono-bun","nest-micro":"nest"})[e]||e;import{join as or}from"path";import{deriveEventNames as sr}from"@crossdelta/cloudevents";var uo={appliesTo:["src/domain","src/use-cases"],forbiddenPatterns:[{pattern:"console\\.(log|error|warn|info|debug)\\s*\\(",description:"console.* is forbidden in business logic (use structured logging)",code:"CONSOLE_IN_DOMAIN"},{pattern:"process\\.env\\b",description:"process.env is forbidden in business logic (use dependency injection)",code:"PROCESS_ENV_IN_DOMAIN"},{pattern:"\\bfetch\\s*\\(",description:"fetch() is forbidden in business logic (use adapters/services)",code:"FETCH_IN_DOMAIN"}]},Pe={hono:{businessLogicDir:"use-cases",eventsDir:"events",filePattern:"{name}.use-case.ts",suffix:"use-case",handlerDelegatesToBusinessLogic:!0,pathGuards:{forbidDirs:["src/services"]},codingConstraints:uo},nestjs:{businessLogicDir:"",eventsDir:"events",filePattern:"{name}.service.ts",suffix:"service",handlerDelegatesToBusinessLogic:!1,pathGuards:{forbidDirs:[]},codingConstraints:{appliesTo:["src/domain"],forbiddenPatterns:uo.forbiddenPatterns}}},vc=e=>e.replace(/-([a-z])/g,(t,r)=>r.toUpperCase()),kc=(e,t)=>`../${e}/${t}`,ee=(e,t)=>{let r=Pe[e],n=r.filePattern.replace("{name}",t),o=n.replace(/\.ts$/,""),s=r.businessLogicDir?`src/${r.businessLogicDir}`:"src";return{filePath:s?`${s}/${n}`:`src/${n}`,dirPath:s,fileName:n,functionName:vc(t),delegateFromHandler:r.handlerDelegatesToBusinessLogic,importFromEvents:r.businessLogicDir?kc(r.businessLogicDir,o):`./${o}`}},nr=(e,t)=>{let n=`src/${Pe[e].eventsDir}`,o=`${t}.handler.ts`;return{filePath:`${n}/${o}`,dirPath:n,fileName:o}},be=e=>`handle-${e.replace(/\./g,"-")}`,et=e=>{let t=e.replace(/\\/g,"/");t=t.replace(/^\.\//,"").replace(/^\//,"");let r=t.split("/"),n=[];for(let o of r)o===".."?n.pop():o!=="."&&o!==""&&n.push(o);return n.join("/")},Cc=(e,t)=>{let r=et(e);for(let n of t){let o=et(n);if(r.startsWith(`${o}/`)||r===o)return n}return null},xc=(e,t)=>{let r=et(e);return t.some(n=>{let o=et(n);return r.startsWith(`${o}/`)||r===o})},wc=(e,t,r)=>{let n=[],o=e.split(`
380
+ `);for(let{pattern:s,description:i,code:a}of t){let c=new RegExp(s,"g");for(let p=0;p<o.length;p++)c.test(o[p])&&n.push({code:a,message:i,path:r,line:p+1}),c.lastIndex=0}return n},Pc=(e,t)=>{let r=[],n=Cc(e.path,t.pathGuards.forbidDirs);if(n&&r.push({code:"FORBIDDEN_DIR",message:`Path '${e.path}' is in forbidden directory '${n}'`,path:e.path}),xc(e.path,t.codingConstraints.appliesTo)){let o=wc(e.content,t.codingConstraints.forbiddenPatterns,e.path);r.push(...o)}return r},tt=(e,t)=>{let r=Pe[e],n=[];for(let o of t)n.push(...Pc(o,r));return{valid:n.length===0,violations:n}};var Ec=(e,t)=>t.map(r=>({kind:"file:write",path:or(e,r.path),content:r.content})),Tc=(e,t,r)=>({kind:"infra:add",serviceName:e,port:t,framework:r.framework,runtime:r.runtime}),$c=(e,t)=>({kind:"env:add",key:`${e}_PORT`,value:t.toString()}),Rc=(e,t)=>{let{typeName:r}=sr(e),n=be(e),o=ee("hono",n);return`import type { ${r} } from '${t}/contracts'
496
381
 
497
382
  /**
498
383
  * Handle ${e} event
@@ -504,7 +389,7 @@ export const ${o.functionName} = async (data: ${r}): Promise<void> => {
504
389
  // TODO: Implement business logic
505
390
  // Example: validate data, transform, call external services
506
391
  }
507
- `},pd=(e,t,r)=>{let{contractName:n,typeName:o}=Jr(e),s=Ue(e),i=he(r,s);return i.delegateFromHandler?`import { handleEvent } from '@crossdelta/cloudevents'
392
+ `},Ic=(e,t,r)=>{let{contractName:n,typeName:o}=sr(e),s=be(e),i=ee(r,s);return i.delegateFromHandler?`import { handleEvent } from '@crossdelta/cloudevents'
508
393
  import { ${n}, type ${o} } from '${t}/contracts'
509
394
  import { ${i.functionName} } from '${i.importFromEvents}'
510
395
 
@@ -519,13 +404,13 @@ export default handleEvent(${n}, async (data: ${o}) => {
519
404
  console.log('\u{1F4E6} [${e}] Event received:', data)
520
405
  // TODO: Inject and call service
521
406
  })
522
- `},md=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:he(r,"stub").delegateFromHandler?t.events.map(o=>{let s=Ue(o),i=he(r,s);return{kind:"file:write",path:zr(e,i.filePath),content:ld(o,t.workspaceScope)}}):[],dd=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:t.events.map(n=>{let{kebab:o}=Jr(n),s=Vr(r,o);return{kind:"file:write",path:zr(e,s.filePath),content:pd(n,t.workspaceScope,r)}}),ud=e=>e==="hono"?"hono":e==="nest"?"nestjs":"hono",Us=(e,t,r,n)=>{let o=ud(n.framework),s=id(e,t),i=md(e,r,o),a=dd(e,r,o),c=ad(r.serviceName,r.port,n),l=cd(r.envVarName,r.port);return[...s,...i,...a,c,l]};import{existsSync as gd,readdirSync as fd,readFileSync as hd}from"fs";import{join as Vs}from"path";var zs=4001,yd=e=>{let t=e.match(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/);if(t)return Number.parseInt(t[1],10);let r=e.match(/containerPort:\s*(\d+)/);return r?Number.parseInt(r[1],10):null},Js=e=>{try{let t=Vs(e,"infra","services");return gd(t)?fd(t).filter(n=>n.endsWith(".ts")).reduce((n,o)=>{let s=hd(Vs(t,o),"utf-8"),i=yd(s);return i!==null&&n.add(i),n},new Set):new Set}catch(t){return console.warn("Failed to scan ports:",t),new Set}},Kr=(e,t)=>e.has(t)?Kr(e,t+1):t;var Cd=e=>{if(!e||e.trim().length===0)throw new Error("Service name cannot be empty");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(e))throw new Error(`Service name '${e}' must be kebab-case (lowercase, alphanumeric, hyphens only)`)},kd=(e,t,r)=>{if(t){if(t.startsWith("/"))return t;if(t.startsWith("."))return It(r,t);if(t.includes("/"))return It(r,t)}let n=E(r);return It(r,n.services,e)},xd=e=>[...new Set(e.map(t=>vd(t).streamName))],wd=(e,t,r,n)=>{let s=w(t).packageName.split("/")[0],i=e.events??[],a=i.length>0||e.hasEvents||!1,c=i.length>0?xd(i):e.streams??[];return{serviceName:e.name,packageName:`${s}/${e.name}`,servicePath:r.replace(`${t}/`,""),port:n,envVarName:B(e.name),hasEvents:a,streams:c,events:i,workspaceScope:s,envVars:e.envVars}},Pd=(e,t)=>e.files.filter(r=>!r.skip?.(t)).map(r=>({path:r.path,content:r.content(t)})),Sd=(e,t,r)=>[...e.map(o=>({type:"file",path:It(r,o.path),description:`Service file: ${o.path}`})),{type:"config",path:`infra/services/${t}.ts`,description:"Infrastructure configuration"},{type:"env",path:".env.local",description:"Environment variables"}],bd=e=>[{command:`cd ${e} && bun dev`,description:"Start this service"},{command:"pf dev",description:"Start all services"}],Ks=e=>{Cd(e.name);let t=e.workspaceRoot??u(),r=kd(e.name,e.path,t),n=e.port??Kr(Js(t),zs),o=wd(e,t,r,n),s=Gs(e.type),i=Pd(s,o),a=Us(r,i,o,s),c=Sd(i,e.name,r),l=bd(r);return Hr("service.generate",`Generated ${e.name} service (port ${n})`,{artifacts:c,changes:a,next:l,data:{serviceName:e.name,servicePath:r,port:n,vars:o}})},qs=e=>{let t=Ks(e);if(!t.ok||!t.data)throw new Error(t.summary);return{serviceName:t.data.serviceName,servicePath:t.data.servicePath,port:t.data.port,effects:t.changes,vars:t.data.vars}};f();f();f();import A from"chalk";import{execa as Td}from"execa";import{createJiti as $d}from"jiti";var Yr=async e=>{let{stdout:t}=await Td("sh",["-c",e]);return t.trim()},Ys="pf-local-nats",Ad="2.10-alpine",Id=4222,Rd=8222,Nd=64*1024*1024,Fd={storage:"memory",retention:"limits",maxAge:36e5,maxBytes:Nd},Od=e=>({clientPort:e.clientPort??Id,monitoringPort:e.monitoringPort??Rd,containerName:e.containerName??Ys,version:e.version??Ad}),Md=e=>["run","--rm","--detach",`--name=${e.containerName}`,`-p=${e.clientPort}:4222`,`-p=${e.monitoringPort}:8222`,`nats:${e.version}`,"--jetstream","--store_dir=/data","--http_port=8222"],Dd=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),_d=async()=>{try{return await Yr("docker info"),!0}catch{return!1}},jd=async e=>{try{return(await Yr(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var Ld=async e=>{let t=Md(e);try{return await Yr(`docker ${t.join(" ")}`),{success:!0,value:Dd(e)}}catch{return{success:!1}}},Wd=e=>{console.log(A.green("\u2713 NATS started")),console.log(A.dim(` Client: ${e.clientUrl}`)),console.log(A.dim(` Monitoring: ${e.monitoringUrl}`)),console.log(A.dim(" Streams: ephemeral, auto-created by services")),console.log("")},Zs=async(e={})=>{let t=Od(e);if(!await _d())return console.log(A.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await jd(t.containerName))return console.log(A.dim("\u2713 NATS already running")),!0;console.log(A.cyan("\u{1F680} Starting development infrastructure...")),console.log(A.dim(" NATS with JetStream (ephemeral)"));let r=await Ld(t);return r.success?(Wd(r.value),!0):(console.error(A.red("\u2717 Failed to start NATS")),!1)},Hd=e=>e.map(({stream:t,subjects:r})=>({stream:t,subjects:r,config:Fd})),qr="@crossdelta/infrastructure",Xs=e=>e.includes(qr)&&(e.includes("is not defined by")||e.includes("Cannot find module")||e.includes("Cannot find package")),Qs=e=>{if(typeof e!="object"||e===null)return null;let{message:t}=e;return typeof t=="string"?t:null},Gd=e=>{let t=Qs(e);if(t===null)return!0;if(Xs(t))return!1;let r=t.toLowerCase();return!r.includes("insufficient storage")&&!r.includes("connection refused")},Bd=e=>{let t=Qs(e);if(t===null)return"Unknown error";let r=t.toLowerCase();return r.includes("insufficient storage")?["NATS has insufficient storage to create streams."," JetStream fixes its storage limit when the server starts, at 75% of the free space it"," sees then, and never recomputes it. So a disk that was full when the container started"," keeps the old limit even after you free space. Restart the container first:","",` docker restart ${Ys}`," pf dev",""," If it still fails, the disk is full now as well:",""," docker system prune -af"].join(`
523
- `):r.includes("connection refused")?"Cannot connect to NATS \u2014 is the container running?":Xs(t)?[`${qr} is missing or too old to provide its /streams entry point.`,""," It is a peer dependency of this CLI, so neither `bun add -g` nor `npm i -g` installs it"," alongside pf, and bun reports nothing when it is absent. Install it explicitly:","",` bun add -g ${qr}`,""," Not continuing without it: letting the services create the streams instead leaves them in"," whatever shape they already had, so a corrected contract subject never takes effect and"," its events are dropped without an error."].join(`
524
- `):t},Zr=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:r}=w(e),o=await $d(e,{moduleCache:!1}).import(r,{default:!0}),{collectStreamDefinitions:s}=await import("@crossdelta/infrastructure/streams"),i=s(o);if(i.length===0){console.log(A.dim(" No streams found in contracts"));return}let a=Hd(i);await t({streams:a});let c=i.map(l=>l.stream);console.log(A.dim(` Ensured ${i.length} ephemeral stream(s): ${c.join(", ")}`))}catch(t){if(!Gd(t))throw console.error(A.red(`
525
- \u2717 ${Bd(t)}
526
- `)),t;console.log(A.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log(A.dim(" Streams will be created when services connect"))}};var ei=`// env: string literals \u2192 written to .env.local by generate-env (use for values meaningful locally)
407
+ `},Nc=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:ee(r,"stub").delegateFromHandler?t.events.map(o=>{let s=be(o),i=ee(r,s);return{kind:"file:write",path:or(e,i.filePath),content:Rc(o,t.workspaceScope)}}):[],Oc=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:t.events.map(n=>{let{kebab:o}=sr(n),s=nr(r,o);return{kind:"file:write",path:or(e,s.filePath),content:Ic(n,t.workspaceScope,r)}}),Ac=e=>e==="hono"?"hono":e==="nest"?"nestjs":"hono",go=(e,t,r,n)=>{let o=Ac(n.framework),s=Ec(e,t),i=Nc(e,r,o),a=Oc(e,r,o),c=Tc(r.serviceName,r.port,n),p=$c(r.envVarName,r.port);return[...s,...i,...a,c,p]};import{existsSync as _c,readdirSync as Dc,readFileSync as Lc}from"fs";import{join as fo}from"path";var ho=4001,Mc=e=>{let t=e.match(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/);if(t)return Number.parseInt(t[1],10);let r=e.match(/containerPort:\s*(\d+)/);return r?Number.parseInt(r[1],10):null},yo=e=>{try{let t=fo(e,"infra","services");return _c(t)?Dc(t).filter(n=>n.endsWith(".ts")).reduce((n,o)=>{let s=Lc(fo(t,o),"utf-8"),i=Mc(s);return i!==null&&n.add(i),n},new Set):new Set}catch(t){return console.warn("Failed to scan ports:",t),new Set}},ir=(e,t)=>e.has(t)?ir(e,t+1):t;var Fc=e=>{if(!e||e.trim().length===0)throw new Error("Service name cannot be empty");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(e))throw new Error(`Service name '${e}' must be kebab-case (lowercase, alphanumeric, hyphens only)`)},Wc=(e,t,r)=>{if(t){if(t.startsWith("/"))return t;if(t.startsWith("."))return rt(r,t);if(t.includes("/"))return rt(r,t)}let n=I(r);return rt(r,n.services,e)},Hc=e=>[...new Set(e.map(t=>jc(t).streamName))],Bc=(e,t,r,n)=>{let s=x(t).packageName.split("/")[0],i=e.events??[],a=i.length>0||e.hasEvents||!1,c=i.length>0?Hc(i):e.streams??[];return{serviceName:e.name,packageName:`${s}/${e.name}`,servicePath:r.replace(`${t}/`,""),port:n,envVarName:D(e.name),hasEvents:a,streams:c,events:i,workspaceScope:s,envVars:e.envVars}},Gc=(e,t)=>e.files.filter(r=>!r.skip?.(t)).map(r=>({path:r.path,content:r.content(t)})),Uc=(e,t,r)=>[...e.map(o=>({type:"file",path:rt(r,o.path),description:`Service file: ${o.path}`})),{type:"config",path:`infra/services/${t}.ts`,description:"Infrastructure configuration"},{type:"env",path:".env.local",description:"Environment variables"}],Vc=e=>[{command:`cd ${e} && bun dev`,description:"Start this service"},{command:"pf dev",description:"Start all services"}],vo=e=>{Fc(e.name);let t=e.workspaceRoot??d(),r=Wc(e.name,e.path,t),n=e.port??ir(yo(t),ho),o=Bc(e,t,r,n),s=mo(e.type),i=Gc(s,o),a=go(r,i,o,s),c=Uc(i,e.name,r),p=Vc(r);return Qt("service.generate",`Generated ${e.name} service (port ${n})`,{artifacts:c,changes:a,next:p,data:{serviceName:e.name,servicePath:r,port:n,vars:o}})},ko=e=>{let t=vo(e);if(!t.ok||!t.data)throw new Error(t.summary);return{serviceName:t.data.serviceName,servicePath:t.data.servicePath,port:t.data.port,effects:t.changes,vars:t.data.vars}};v();v();v();import b from"chalk";import{execa as zc}from"execa";import{createJiti as Kc}from"jiti";var cr=async e=>{let{stdout:t}=await zc("sh",["-c",e]);return t.trim()},Co="pf-local-nats",qc="2.10-alpine",Yc=4222,Zc=8222,Xc=64*1024*1024,Qc={storage:"memory",retention:"limits",maxAge:36e5,maxBytes:Xc},ep=e=>({clientPort:e.clientPort??Yc,monitoringPort:e.monitoringPort??Zc,containerName:e.containerName??Co,version:e.version??qc}),tp=e=>["run","--rm","--detach",`--name=${e.containerName}`,`-p=${e.clientPort}:4222`,`-p=${e.monitoringPort}:8222`,`nats:${e.version}`,"--jetstream","--store_dir=/data","--http_port=8222"],rp=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),np=async()=>{try{return await cr("docker info"),!0}catch{return!1}},op=async e=>{try{return(await cr(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var sp=async e=>{let t=tp(e);try{return await cr(`docker ${t.join(" ")}`),{success:!0,value:rp(e)}}catch{return{success:!1}}},ip=e=>{console.log(b.green("\u2713 NATS started")),console.log(b.dim(` Client: ${e.clientUrl}`)),console.log(b.dim(` Monitoring: ${e.monitoringUrl}`)),console.log(b.dim(" Streams: ephemeral, auto-created by services")),console.log("")},xo=async(e={})=>{let t=ep(e);if(!await np())return console.log(b.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await op(t.containerName))return console.log(b.dim("\u2713 NATS already running")),!0;console.log(b.cyan("\u{1F680} Starting development infrastructure...")),console.log(b.dim(" NATS with JetStream (ephemeral)"));let r=await sp(t);return r.success?(ip(r.value),!0):(console.error(b.red("\u2717 Failed to start NATS")),!1)},ap=e=>e.map(({stream:t,subjects:r})=>({stream:t,subjects:r,config:Qc})),ar="@crossdelta/infrastructure",wo=e=>e.includes(ar)&&(e.includes("is not defined by")||e.includes("Cannot find module")||e.includes("Cannot find package")),Po=e=>{if(typeof e!="object"||e===null)return null;let{message:t}=e;return typeof t=="string"?t:null},cp=e=>{let t=Po(e);if(t===null)return!0;if(wo(t))return!1;let r=t.toLowerCase();return!r.includes("insufficient storage")&&!r.includes("connection refused")},pp=e=>{let t=Po(e);if(t===null)return"Unknown error";let r=t.toLowerCase();return r.includes("insufficient storage")?["NATS has insufficient storage to create streams."," JetStream fixes its storage limit when the server starts, at 75% of the free space it"," sees then, and never recomputes it. So a disk that was full when the container started"," keeps the old limit even after you free space. Restart the container first:","",` docker restart ${Co}`," pf dev",""," If it still fails, the disk is full now as well:",""," docker system prune -af"].join(`
408
+ `):r.includes("connection refused")?"Cannot connect to NATS \u2014 is the container running?":wo(t)?[`${ar} is missing or too old to provide its /streams entry point.`,""," It is a peer dependency of this CLI, so neither `bun add -g` nor `npm i -g` installs it"," alongside pf, and bun reports nothing when it is absent. Install it explicitly:","",` bun add -g ${ar}`,""," Not continuing without it: letting the services create the streams instead leaves them in"," whatever shape they already had, so a corrected contract subject never takes effect and"," its events are dropped without an error."].join(`
409
+ `):t},pr=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:r}=x(e),o=await Kc(e,{moduleCache:!1}).import(r,{default:!0}),{collectStreamDefinitions:s}=await import("@crossdelta/infrastructure/streams"),i=s(o);if(i.length===0){console.log(b.dim(" No streams found in contracts"));return}let a=ap(i);await t({streams:a});let c=i.map(p=>p.stream);console.log(b.dim(` Ensured ${i.length} ephemeral stream(s): ${c.join(", ")}`))}catch(t){if(!cp(t))throw console.error(b.red(`
410
+ \u2717 ${pp(t)}
411
+ `)),t;console.log(b.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log(b.dim(" Streams will be created when services connect"))}};var bo=`// env: string literals \u2192 written to .env.local by generate-env (use for values meaningful locally)
527
412
  // containerEnv: \u2192 only applied in the K8s container, never in .env.local
528
- // (use for deployment-specific values like ORIGIN or NODE_OPTIONS)`;function ti(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
413
+ // (use for deployment-specific values like ORIGIN or NODE_OPTIONS)`;function So(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
529
414
  import { ports } from '@crossdelta/infrastructure'
530
415
 
531
416
  /**
@@ -534,7 +419,7 @@ import { ports } from '@crossdelta/infrastructure'
534
419
  * Internal-only service - accessed via cluster DNS:
535
420
  * http://${e}.{namespace}.svc.cluster.local:${t}
536
421
  */
537
- ${ei}
422
+ ${bo}
538
423
  const config: K8sServiceConfig = {
539
424
  name: '${e}',
540
425
  ports: ports().http(${t}).build(),
@@ -547,7 +432,7 @@ const config: K8sServiceConfig = {
547
432
  }
548
433
 
549
434
  export default config
550
- `}function ri(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
435
+ `}function Eo(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
551
436
  import { ports } from '@crossdelta/infrastructure'
552
437
 
553
438
  /**
@@ -556,7 +441,7 @@ import { ports } from '@crossdelta/infrastructure'
556
441
  * Internal-only service - accessed via cluster DNS:
557
442
  * http://${e}.{namespace}.svc.cluster.local:${t}
558
443
  */
559
- ${ei}
444
+ ${bo}
560
445
  const config: K8sServiceConfig = {
561
446
  name: '${e}',
562
447
  ports: ports().http(${t}).build(),
@@ -569,62 +454,41 @@ const config: K8sServiceConfig = {
569
454
  }
570
455
 
571
456
  export default config
572
- `}v();import ne from"chalk";import Vd from"terminal-link";var Rt="integrations-run";import{z as T}from"zod";var Ud=T.object({name:T.string(),description:T.string(),link:T.url().optional(),install:T.union([T.string(),T.array(T.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:T.array(T.string()).optional(),run:T.array(T.string()).optional(),initial:T.boolean().optional(),interactive:T.boolean().optional()}),ni=T.array(Ud);var oi=e=>{try{return ni.parse(e)}catch(t){throw new Error(t.issues.map(r=>` - Path ${r.path.join(". ")} : ${r.message}`).join(`
573
- `))}};var D=()=>{try{let e=Ne("bin/integration.collection.json");return oi(e)}catch(e){throw new Error(`Failed to load integrations!
457
+ `}h();import U from"chalk";import mp from"terminal-link";var nt="integrations-run";import{z as P}from"zod";var lp=P.object({name:P.string(),description:P.string(),link:P.url().optional(),install:P.union([P.string(),P.array(P.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:P.array(P.string()).optional(),run:P.array(P.string()).optional(),initial:P.boolean().optional(),interactive:P.boolean().optional()}),To=P.array(lp);var $o=e=>{try{return To.parse(e)}catch(t){throw new Error(t.issues.map(r=>` - Path ${r.path.join(". ")} : ${r.message}`).join(`
458
+ `))}};var N=()=>{try{let e=he("bin/integration.collection.json");return $o(e)}catch(e){throw new Error(`Failed to load integrations!
574
459
  Check your integration.collection.json:
575
- ${e.message}`)}},ye=()=>D().reduce((t,r)=>(r.initial&&t.push(r.name),t),[]),zd=e=>!!e?.name&&!!e?.link&&!!e?.description,Nt=e=>{let t=D();if(!t?.length||!e?.length)return;let r=e.map(n=>t.find(o=>o.name===n)).filter(zd);r.length&&(d.breakLine().log("\u{1F50C} Installed Integrations:"),r.forEach(({name:n,link:o,description:s})=>{let i=d.getStoredLogs(`${Rt}:${n}`);o&&d.log(`${Vd(ne.cyan(n),o)} - ${s}`),i.length&&d.log(i.map(a=>` \u203A ${ne.dim(a.message)}`).join(`
576
- `))}))},Jd=e=>e.toUpperCase().replace(/-/g,"_"),si=(e,t)=>{let r=Jd(e);d.breakLine().log(ne.bold("Environment variables:")).log(ne.dim(" Local (.env.local):")).log(ne.cyan(` ${r}_PORT=${t}`)).breakLine().log(ne.dim(" Production (auto-injected by infra):")).log(ne.cyan(` PORT=${t}`))};v();import ii from"chalk";var Kd=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},ai=async e=>{let{selectedIntegrations:t,cwd:r,packageManager:n=b(),task:o}=e;if(!t?.length||!o)return;let s=qd(t,r,n,o);await rt(o,s)},qd=(e,t,r,n)=>{let s=D()?.filter(a=>e.includes(a.name))?.flatMap(a=>a.install.map(c=>{let{name:l,version:p}=Kd(c);return{title:ii.cyanBright(`Adding ${c} (${a.name})`),fn:async()=>{it(`dependencies.${l}`,p,t)}}})),i={title:ii.cyanBright("Installing packages..."),fn:async()=>{await L({cwd:t,packageManager:r,task:n})}};return[...s??[],i]};v();import Yd from"chalk";var ci=async e=>{let{selectedIntegrations:t,cwd:r,task:n}=e;if(!t?.length||!n)return;let o=Zd(t,r,n,e.packageManager);await rt(n,o)},Zd=(e,t,r,n)=>D().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(i=>({title:Yd.cyanBright(`Running "${i}" for ${s.name}
577
- `),fn:()=>Xd(s,i,t,r,n)}))),Xd=async(e,t,r,n,o)=>{let s=`${Rt}:${e.name}`;try{if(e.interactive)return ro(t,[],{cwd:r,context:s,task:n,manager:o});await Fe(t,[],{cwd:r,task:n,context:s})}catch(i){d.error(`Failed to run command "${t}" for ${e.name}: ${i.message}`)}};v();import{readFileSync as aP,writeFileSync as cP}from"fs";import{join as pP}from"path";v();import{join as gP}from"path";import{ListrEnquirerPromptAdapter as Ve}from"@listr2/prompt-adapter-enquirer";var k=e=>({select:async t=>e.prompt(Ve).run({type:"select",message:t.message,choices:t.choices}),confirm:async t=>e.prompt(Ve).run({type:"confirm",message:t.message,initial:t.initial??!1}),toggle:async t=>e.prompt(Ve).run({type:"toggle",message:t.message,enabled:t.enabled??"Yes",disabled:t.disabled??"No",initial:t.initial??!1}),input:async t=>e.prompt(Ve).run({type:"input",message:t.message,initial:t.initial,validate:t.validate}),multiSelect:async t=>e.prompt(Ve).run({type:"MultiSelect",message:t.message,hint:t.hint,initial:t.initial,choices:t.choices})});v();import{readFileSync as $P}from"fs";import{join as IP}from"path";import WP from"chalk";import GP from"cli-table3";v();function Ft(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function li(e,t,r={},n=[],o=[]){if(!e){console.error("Subcommand is not defined.");return}let s=n.map(l=>t[l]).filter(l=>l!==void 0),i=o.map(l=>{let p=t[l];if(!(p===!1||p===void 0))return p===!0?`--${Ft(String(l))}`:`--${Ft(String(l))}=${String(p)}`}).filter(l=>l!==void 0),a=Object.entries(r).map(([l,p])=>{if(!(p===!1||p===void 0))return p===!0?`--${Ft(l)}`:`--${Ft(l)}=${String(p)}`}).filter(l=>l!==void 0),c=[...s,...i,...a].map(String);await e.parseAsync(c,{from:"user"})}import{basename as wu}from"path";import oe from"chalk";f();var ve={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{let r=k(t);if(e.userConfirmed=await r.toggle({initial:!0,message:"\u{1F680} Ready to launch your project?"}),!e.userConfirmed)throw new Error("Project creation was canceled by the user.")}};import{existsSync as Xr,readdirSync as eu,readFileSync as tu,writeFileSync as ru}from"fs";import{basename as nu,join as Qr}from"path";var ou=4001,su=4e3;function iu(e){let t=[],r=e.matchAll(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/g);for(let c of r)t.push(Number(c[1]));let n=e.matchAll(/\.add(?:Http|Grpc)?\((\d+)/g);for(let c of n)t.push(Number(c[1]));let o=e.match(/containerPort\s*:\s*(\d+)/);o&&t.push(Number(o[1]));let s=e.match(/internalPorts\s*:\s*\[([^\]]+)\]/);if(s){let c=s[1].match(/\d+/g);c&&t.push(...c.map(Number))}let i=e.match(/httpPort\s*:\s*(\d+)/);i&&t.push(Number(i[1]));let a=e.matchAll(/const\s+\w*[pP]ort\w*\s*=\s*(\d+)/g);for(let c of a)t.push(Number(c[1]));return t}function au(e,t){let r=t?ou:su,n=new Set;if(!Xr(e))return r;let o=eu(e).filter(i=>i.endsWith(".ts"));for(let i of o){let a=Qr(e,i);try{let c=tu(a,"utf-8"),l=iu(c);for(let p of l)n.add(p)}catch{}}let s=r;for(;n.has(s);)s++;return s}function cu(e){return nu(e)}var Ot={title:"Creating infrastructure service config",task:async(e,t)=>{let r=cu(e.projectName),n=u(),o=Qr(n,"infra","services");if(!Xr(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=Qr(o,`${r}.ts`);if(Xr(s)){t.title=`Service config already exists: infra/services/${r}.ts`;return}let i=au(o,!0);e.assignedPort=i;let a=e.serviceType==="hono"?ti(r,i):ri(r,i);ru(s,a),t.title=`Created infra/services/${r}.ts (port: ${i})`}};import{execSync as Mt}from"child_process";import{existsSync as lu}from"fs";import{join as pu}from"path";var mu=()=>{try{return Mt("git --version",{stdio:"ignore"}),!0}catch{return!1}},du=e=>lu(pu(e,".git")),pi={title:"Initializing git repository",enabled:()=>mu(),skip:e=>du(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{Mt("git init",{cwd:e.cwd,stdio:"ignore"}),Mt("git add -A",{cwd:e.cwd,stdio:"ignore"}),Mt('git commit -m "chore: initial commit"',{cwd:e.cwd,stdio:"ignore",env:{...process.env,GIT_AUTHOR_NAME:process.env.GIT_AUTHOR_NAME||"Platform SDK",GIT_AUTHOR_EMAIL:process.env.GIT_AUTHOR_EMAIL||"platform-sdk@localhost",GIT_COMMITTER_NAME:process.env.GIT_COMMITTER_NAME||"Platform SDK",GIT_COMMITTER_EMAIL:process.env.GIT_COMMITTER_EMAIL||"platform-sdk@localhost"}}),t.title="Git repository initialized with initial commit"}catch{t.title="Git initialization skipped (git error)"}}};import mi from"chalk";v();var Ce={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!Rr(),task:async(e,t)=>M(t,async r=>{await rs(t),e.elapsedTime+=r(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},ke={enabled:e=>!Rr()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{let r=k(t);console.log(["",`${mi.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${mi.underline("https://bun.sh")}`,ns(),os()].join(`
578
- `)),e.shouldInstallBun=await r.toggle({message:"Would you like to use Bun? (recommended)",initial:!0}),e.shouldInstallBun&&(e.packageManager="bun")}};import di from"chalk";v();var Dt={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>M(t,async r=>{let{selectedIntegrations:n,cwd:o,packageManager:s}=e;await ai({selectedIntegrations:n,packageManager:s,cwd:o,task:t}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}},_t={title:"Select integrations",enabled:e=>e.selectedIntegrations.length===0,task:async(e,t)=>{let r=k(t);e.selectedIntegrations=await r.multiSelect({hint:"\\nPress <space> to select/deselect, <enter> to confirm, <i> to invert selection",message:"Which integrations would you like to include?",initial:ye().map((n,o)=>o),choices:e.availableIntegrations.map(({name:n,description:o})=>({name:n,message:[di.bold(n),o].join(" - "),value:n}))}),!e.selectedIntegrations||e.selectedIntegrations.length===0?t.title="No integrations selected.":t.title=["Selected integrations:",...e.selectedIntegrations.map(n=>di.bold(`\u2022 ${n}`))].join("\\n")}};v();var ui={title:"Install Nest CLI",task:async(e,t)=>M(t,async r=>{await to({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}};v();var jt={title:"Install dependencies",task:async(e,t)=>M(t,async r=>{await L({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()})};import uu from"chalk";v();var xe={enabled:e=>!e.removeDir&&!et(e.cwd),task:async(e,t)=>{let r=k(t);if(e.removeDir=await r.toggle({message:uu.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!e.removeDir)throw new Error("Project creation was canceled by the user.")}},we={enabled:e=>!!e.removeDir,task:async e=>jn(e.cwd)};v();var Lt={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>M(t,async r=>{let{selectedIntegrations:n,cwd:o}=e;await ci({selectedIntegrations:n,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1}};v();var gu=["services/my-hono-service","services/my-nest-service","my-platform"],Pe={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?gu.includes(e.projectName):!0,task:async(e,t)=>{let r=k(t);e.projectName=await r.input({initial:e.projectName,message:"Enter project name",validate:n=>n?!0:"Project name is required."}),e.cwd&&(e.cwd=O(e.projectName))}};import gi from"chalk";var Se={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=dr(),e.packageManager){t.title=`Using ${gi.bold(e.packageManager)} as package manager.`;return}let r=k(t);e.packageManager=await r.select({message:"Which package manager would you like to use?",choices:eo().map(n=>({name:n,value:n}))}),t.title=`Using ${gi.bold(e.packageManager)} as package manager.`}};import Wt from"chalk";var fi={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${Wt.bold(e.githubOwner)}`;return}let r=k(t);e.githubOwner=await r.input({message:"Enter GitHub organization or username",initial:"my-org",validate:n=>n?.trim()?!0:"GitHub owner is required."}),t.title=`GitHub owner: ${Wt.bold(e.githubOwner)}`}},hi={title:"Include GitHub CI/CD",task:async(e,t)=>{if(e.includeGitHubCI!==void 0){t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD";return}let r=k(t);e.includeGitHubCI=await r.toggle({message:"Include GitHub Actions workflows and CI/CD?",initial:!0,enabled:"Yes",disabled:"No"}),t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD"}};var yi={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${Wt.bold(e.pulumiStackBase)}`;return}let r=e.githubOwner||"myorg",n=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${r}/${n}`,s=k(t);e.pulumiStackBase=await s.input({message:"Enter Pulumi stack base name (org/project)",initial:o,validate:i=>i?.trim()?i.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),t.title=`Pulumi stack: ${Wt.bold(e.pulumiStackBase)}`}};v();import{mkdirSync as fu,writeFileSync as hu}from"fs";import{dirname as yu}from"path";v();var vu=e=>e==="hono"?"hono":"nestjs",Cu=e=>{let t=yu(e.path);fu(t,{recursive:!0}),hu(e.path,e.content,"utf-8")},ku=(e,t)=>{let r=e.map(o=>{let s=o.path.match(/services\/[^/]+\/(.+)$/);return{path:s?s[1]:o.path,content:o.content}}),n=At(t,r);if(!n.valid){let o=n.violations.map(s=>` - ${s.code}: ${s.message} (${s.path})`).join(`
460
+ ${e.message}`)}},te=()=>N().reduce((t,r)=>(r.initial&&t.push(r.name),t),[]),up=e=>!!e?.name&&!!e?.link&&!!e?.description,ot=e=>{let t=N();if(!t?.length||!e?.length)return;let r=e.map(n=>t.find(o=>o.name===n)).filter(up);r.length&&(m.breakLine().log("\u{1F50C} Installed Integrations:"),r.forEach(({name:n,link:o,description:s})=>{let i=m.getStoredLogs(`${nt}:${n}`);o&&m.log(`${mp(U.cyan(n),o)} - ${s}`),i.length&&m.log(i.map(a=>` \u203A ${U.dim(a.message)}`).join(`
461
+ `))}))},dp=e=>e.toUpperCase().replace(/-/g,"_"),Ro=(e,t)=>{let r=dp(e);m.breakLine().log(U.bold("Environment variables:")).log(U.dim(" Local (.env.local):")).log(U.cyan(` ${r}_PORT=${t}`)).breakLine().log(U.dim(" Production (auto-injected by infra):")).log(U.cyan(` PORT=${t}`))};h();import Io from"chalk";var gp=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},No=async e=>{let{selectedIntegrations:t,cwd:r,packageManager:n=w(),task:o}=e;if(!t?.length||!o)return;let s=fp(t,r,n,o);await Me(o,s)},fp=(e,t,r,n)=>{let s=N()?.filter(a=>e.includes(a.name))?.flatMap(a=>a.install.map(c=>{let{name:p,version:l}=gp(c);return{title:Io.cyanBright(`Adding ${c} (${a.name})`),fn:async()=>{We(`dependencies.${p}`,l,t)}}})),i={title:Io.cyanBright("Installing packages..."),fn:async()=>{await M({cwd:t,packageManager:r,task:n})}};return[...s??[],i]};h();import hp from"chalk";var Oo=async e=>{let{selectedIntegrations:t,cwd:r,task:n}=e;if(!t?.length||!n)return;let o=yp(t,r,n,e.packageManager);await Me(n,o)},yp=(e,t,r,n)=>N().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(i=>({title:hp.cyanBright(`Running "${i}" for ${s.name}
462
+ `),fn:()=>vp(s,i,t,r,n)}))),vp=async(e,t,r,n,o)=>{let s=`${nt}:${e.name}`;try{if(e.interactive)return dn(t,[],{cwd:r,context:s,task:n,manager:o});await jt(t,[],{cwd:r,task:n,context:s})}catch(i){m.error(`Failed to run command "${t}" for ${e.name}: ${i.message}`)}};import{ListrEnquirerPromptAdapter as Se}from"@listr2/prompt-adapter-enquirer";var y=e=>({select:async t=>e.prompt(Se).run({type:"select",message:t.message,choices:t.choices}),confirm:async t=>e.prompt(Se).run({type:"confirm",message:t.message,initial:t.initial??!1}),toggle:async t=>e.prompt(Se).run({type:"toggle",message:t.message,enabled:t.enabled??"Yes",disabled:t.disabled??"No",initial:t.initial??!1}),input:async t=>e.prompt(Se).run({type:"input",message:t.message,initial:t.initial,validate:t.validate}),multiSelect:async t=>e.prompt(Se).run({type:"MultiSelect",message:t.message,hint:t.hint,initial:t.initial,choices:t.choices})});h();import{readFileSync as sy}from"fs";import{join as ay}from"path";import yy from"chalk";import ky from"cli-table3";h();function st(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function Ao(e,t,r={},n=[],o=[]){if(!e){console.error("Subcommand is not defined.");return}let s=n.map(p=>t[p]).filter(p=>p!==void 0),i=o.map(p=>{let l=t[p];if(!(l===!1||l===void 0))return l===!0?`--${st(String(p))}`:`--${st(String(p))}=${String(l)}`}).filter(p=>p!==void 0),a=Object.entries(r).map(([p,l])=>{if(!(l===!1||l===void 0))return l===!0?`--${st(p)}`:`--${st(p)}=${String(l)}`}).filter(p=>p!==void 0),c=[...s,...i,...a].map(String);await e.parseAsync(c,{from:"user"})}import{basename as Bp}from"path";import Bo from"chalk";v();var re={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{let r=y(t);if(e.userConfirmed=await r.toggle({initial:!0,message:"\u{1F680} Ready to launch your project?"}),!e.userConfirmed)throw new Error("Project creation was canceled by the user.")}};import{existsSync as lr,readdirSync as Cp,readFileSync as xp,writeFileSync as wp}from"fs";import{basename as Pp,join as mr}from"path";var bp=4001,Sp=4e3;function Ep(e){let t=[],r=e.matchAll(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/g);for(let c of r)t.push(Number(c[1]));let n=e.matchAll(/\.add(?:Http|Grpc)?\((\d+)/g);for(let c of n)t.push(Number(c[1]));let o=e.match(/containerPort\s*:\s*(\d+)/);o&&t.push(Number(o[1]));let s=e.match(/internalPorts\s*:\s*\[([^\]]+)\]/);if(s){let c=s[1].match(/\d+/g);c&&t.push(...c.map(Number))}let i=e.match(/httpPort\s*:\s*(\d+)/);i&&t.push(Number(i[1]));let a=e.matchAll(/const\s+\w*[pP]ort\w*\s*=\s*(\d+)/g);for(let c of a)t.push(Number(c[1]));return t}function Tp(e,t){let r=t?bp:Sp,n=new Set;if(!lr(e))return r;let o=Cp(e).filter(i=>i.endsWith(".ts"));for(let i of o){let a=mr(e,i);try{let c=xp(a,"utf-8"),p=Ep(c);for(let l of p)n.add(l)}catch{}}let s=r;for(;n.has(s);)s++;return s}function $p(e){return Pp(e)}var it={title:"Creating infrastructure service config",task:async(e,t)=>{let r=$p(e.projectName),n=d(),o=mr(n,"infra","services");if(!lr(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=mr(o,`${r}.ts`);if(lr(s)){t.title=`Service config already exists: infra/services/${r}.ts`;return}let i=Tp(o,!0);e.assignedPort=i;let a=e.serviceType==="hono"?So(r,i):Eo(r,i);wp(s,a),t.title=`Created infra/services/${r}.ts (port: ${i})`}};import{execSync as at}from"child_process";import{existsSync as Rp}from"fs";import{join as Ip}from"path";var Np=()=>{try{return at("git --version",{stdio:"ignore"}),!0}catch{return!1}},Op=e=>Rp(Ip(e,".git")),_o={title:"Initializing git repository",enabled:()=>Np(),skip:e=>Op(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{at("git init",{cwd:e.cwd,stdio:"ignore"}),at("git add -A",{cwd:e.cwd,stdio:"ignore"}),at('git commit -m "chore: initial commit"',{cwd:e.cwd,stdio:"ignore",env:{...process.env,GIT_AUTHOR_NAME:process.env.GIT_AUTHOR_NAME||"Platform SDK",GIT_AUTHOR_EMAIL:process.env.GIT_AUTHOR_EMAIL||"platform-sdk@localhost",GIT_COMMITTER_NAME:process.env.GIT_COMMITTER_NAME||"Platform SDK",GIT_COMMITTER_EMAIL:process.env.GIT_COMMITTER_EMAIL||"platform-sdk@localhost"}}),t.title="Git repository initialized with initial commit"}catch{t.title="Git initialization skipped (git error)"}}};import Do from"chalk";h();var ne={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!Wt(),task:async(e,t)=>R(t,async r=>{await vn(t),e.elapsedTime+=r(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},oe={enabled:e=>!Wt()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{let r=y(t);console.log(["",`${Do.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${Do.underline("https://bun.sh")}`,kn(),Cn()].join(`
463
+ `)),e.shouldInstallBun=await r.toggle({message:"Would you like to use Bun? (recommended)",initial:!0}),e.shouldInstallBun&&(e.packageManager="bun")}};import Lo from"chalk";h();var ct={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>R(t,async r=>{let{selectedIntegrations:n,cwd:o,packageManager:s}=e;await No({selectedIntegrations:n,packageManager:s,cwd:o,task:t}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}},pt={title:"Select integrations",enabled:e=>e.selectedIntegrations.length===0,task:async(e,t)=>{let r=y(t);e.selectedIntegrations=await r.multiSelect({hint:"\\nPress <space> to select/deselect, <enter> to confirm, <i> to invert selection",message:"Which integrations would you like to include?",initial:te().map((n,o)=>o),choices:e.availableIntegrations.map(({name:n,description:o})=>({name:n,message:[Lo.bold(n),o].join(" - "),value:n}))}),!e.selectedIntegrations||e.selectedIntegrations.length===0?t.title="No integrations selected.":t.title=["Selected integrations:",...e.selectedIntegrations.map(n=>Lo.bold(`\u2022 ${n}`))].join("\\n")}};h();var Mo={title:"Install Nest CLI",task:async(e,t)=>R(t,async r=>{await un({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}};h();var lt={title:"Install dependencies",task:async(e,t)=>R(t,async r=>{await M({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()})};import Ap from"chalk";h();var se={enabled:e=>!e.removeDir&&!De(e.cwd),task:async(e,t)=>{let r=y(t);if(e.removeDir=await r.toggle({message:Ap.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!e.removeDir)throw new Error("Project creation was canceled by the user.")}},ie={enabled:e=>!!e.removeDir,task:async e=>Vr(e.cwd)};h();var mt={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>R(t,async r=>{let{selectedIntegrations:n,cwd:o}=e;await Oo({selectedIntegrations:n,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1}};h();var _p=["services/my-hono-service","services/my-nest-service","my-platform"],ae={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?_p.includes(e.projectName):!0,task:async(e,t)=>{let r=y(t);e.projectName=await r.input({initial:e.projectName,message:"Enter project name",validate:n=>n?!0:"Project name is required."}),e.cwd&&(e.cwd=_(e.projectName))}};import jo from"chalk";var ce={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=Mt(),e.packageManager){t.title=`Using ${jo.bold(e.packageManager)} as package manager.`;return}let r=y(t);e.packageManager=await r.select({message:"Which package manager would you like to use?",choices:mn().map(n=>({name:n,value:n}))}),t.title=`Using ${jo.bold(e.packageManager)} as package manager.`}};import ut from"chalk";var Fo={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${ut.bold(e.githubOwner)}`;return}let r=y(t);e.githubOwner=await r.input({message:"Enter GitHub organization or username",initial:"my-org",validate:n=>n?.trim()?!0:"GitHub owner is required."}),t.title=`GitHub owner: ${ut.bold(e.githubOwner)}`}},Wo={title:"Include GitHub CI/CD",task:async(e,t)=>{if(e.includeGitHubCI!==void 0){t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD";return}let r=y(t);e.includeGitHubCI=await r.toggle({message:"Include GitHub Actions workflows and CI/CD?",initial:!0,enabled:"Yes",disabled:"No"}),t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD"}};var Ho={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${ut.bold(e.pulumiStackBase)}`;return}let r=e.githubOwner||"myorg",n=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${r}/${n}`,s=y(t);e.pulumiStackBase=await s.input({message:"Enter Pulumi stack base name (org/project)",initial:o,validate:i=>i?.trim()?i.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),t.title=`Pulumi stack: ${ut.bold(e.pulumiStackBase)}`}};h();import{mkdirSync as Dp,writeFileSync as Lp}from"fs";import{dirname as Mp}from"path";h();var jp=e=>e==="hono"?"hono":"nestjs",Fp=e=>{let t=Mp(e.path);Dp(t,{recursive:!0}),Lp(e.path,e.content,"utf-8")},Wp=(e,t)=>{let r=e.map(o=>{let s=o.path.match(/services\/[^/]+\/(.+)$/);return{path:s?s[1]:o.path,content:o.content}}),n=tt(t,r);if(!n.valid){let o=n.violations.map(s=>` - ${s.code}: ${s.message} (${s.path})`).join(`
579
464
  `);throw new Error(`Policy violation(s) detected:
580
- ${o}`)}e.forEach(Cu)},xu=async(e,t,r)=>{let{projectName:n,serviceType:o,hasEvents:s,streams:i}=e,a=n.split("/").pop()||n,l=qs({type:o==="hono"?"hono-micro":"nest",name:a,path:n,hasEvents:s,streams:i}),p=l.effects.filter(y=>y.kind==="file:write"),m=vu(o);ku(p,m),e.assignedPort=l.port,e.elapsedTime+=r(),t.title=`Generated ${a} (port ${l.port}, ${e.elapsedTime}s)`},Ht={title:"Generating service",task:async(e,t)=>M(t,async r=>{await xu(e,t,r)})};var Pu=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${E().services}/${t}`},Su=async(e,t)=>{let{valid:r,config:n,error:o}=de();if(!r||!n){$(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=Pu(e.name),i=t.packageManager||b(),a=await ft(t.description);if(ht(s,n,a),await yt({servicePath:s,description:a,serviceType:"hono",packageManager:i},n))d.breakLine().success("Service generated successfully!").breakLine().log(oe.dim("Next steps:")).log(oe.dim(` ${oe.cyan("pf dev")} - Start all services`)).log(oe.dim(` ${oe.cyan(`cd ${s} && bun dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},vi=J({name:"hono-micro",description:"Create a new Hono microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new hono-micro my-service --ai -d "Payment processing service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:Su,buildContext:async(e,t)=>{let r=(e.name??"my-hono-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${E().services}/${r}`);let n=O(r),o=t.packageManager??(t.yes&&b()),s=D(),i=t.yes?ye():[],a=t.packageManager==="bun",c=!!t.yes||!!e.name&&e.name!=="my-hono-service";return{cwd:n,projectName:r,packageManager:o,shouldInstallBun:a,availableIntegrations:s,selectedIntegrations:i,serviceType:"hono",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Pe,xe,ke,Se,_t,ve],actions:[we,Ce,Ht,Ot,Dt,Lt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{d.breakLine().log(oe.bold.green("Hono Microservice created successfully!")),Nt(r),si(wu(e),n??8080);let o=t??b();d.breakLine().log(`To start the project, run:
581
- ${oe.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});import se from"chalk";f();v();var bu=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${E().services}/${t}`},Eu=async(e,t)=>{let{valid:r,config:n,error:o}=de();if(!r||!n){$(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=bu(e.name),i=t.packageManager||b(),a=await ft(t.description);if(ht(s,n,a),await yt({servicePath:s,description:a,serviceType:"nest",packageManager:i},n))d.breakLine().success("Service generated successfully!").breakLine().log(se.dim("Next steps:")).log(se.dim(` ${se.cyan("pf dev")} - Start all services`)).log(se.dim(` ${se.cyan(`cd ${s} && bun run start:dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},Ci=J({name:"nest-micro",description:"Create a new NestJS microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new nest-micro my-service --ai -d "User authentication service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:Eu,buildContext:async(e,t)=>{let r=(e.name??"my-nest-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${E().services}/${r}`);let n=O(r),o=t.packageManager??(t.yes&&b()),s=t.packageManager==="bun",i=D(),a=t.yes?ye():[],c=!!t.yes||!!e.name;return{cwd:n,projectName:r,shouldInstallBun:s,packageManager:o,availableIntegrations:i,selectedIntegrations:a,serviceType:"nest",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Pe,xe,ke,Se,_t,ve],actions:[we,Ce,Ht,Ot,jt,ui,Dt,Lt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{d.breakLine().log(se.bold.green("NestJS Microservice created successfully!")),Nt(r),d.breakLine().log(`To start the project, run:
582
- ${se.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});import _ from"chalk";v();import{spawnSync as Au}from"child_process";import{chmodSync as Iu,existsSync as rn,mkdirSync as Ru,readFileSync as Nu,writeFileSync as nn}from"fs";import{dirname as Fu,join as on}from"path";import{existsSync as Tu}from"fs";import{join as Gt}from"path";var $u=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),tn=()=>{let e=$u(),t=ee();return fe([Gt(e,"templates","workspace"),Gt(e,"..","..","..","..","templates","workspace"),Gt(t,"bin","templates","workspace")],"Workspace templates directory not found.")},ki=()=>{let e=tn(),t=Gt(e,"packages","contracts");if(!Tu(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},Bt=(e,t)=>Gr(e,t);var xi=e=>{e.endsWith(".sh")&&Iu(e,493)},Ou=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"pnpm-workspace.yaml.hbs",output:"pnpm-workspace.yaml",forPackageManager:"pnpm"},{template:"biome.json.hbs",output:"biome.json"},{template:"turbo.json.hbs",output:"turbo.json"},{template:"bunfig.toml.hbs",output:"bunfig.toml"},{template:"gitignore.hbs",output:".gitignore"},{template:"editorconfig.hbs",output:".editorconfig"},{template:"npmrc.hbs",output:".npmrc"},{template:".vscode/settings.json",output:".vscode/settings.json",isStatic:!0},{template:".vscode/extensions.json",output:".vscode/extensions.json",isStatic:!0},{template:"infra/package.json.hbs",output:"infra/package.json"},{template:"infra/index.ts.hbs",output:"infra/index.ts"},{template:"infra/tsconfig.json.hbs",output:"infra/tsconfig.json"},{template:"infra/Pulumi.yaml.hbs",output:"infra/Pulumi.yaml"},{template:"infra/Pulumi.dev.yaml.hbs",output:"infra/Pulumi.dev.yaml"},{template:"apps/.gitkeep",output:"apps/.gitkeep",isStatic:!0},{template:"services/.gitkeep",output:"services/.gitkeep",isStatic:!0},{template:"packages/.gitkeep",output:"packages/.gitkeep",isStatic:!0},{template:"docs/.gitkeep",output:"docs/.gitkeep",isStatic:!0},{template:"infra/services/.gitkeep",output:"infra/services/.gitkeep",isStatic:!0},{template:".github/README.md",output:".github/README.md",isStatic:!0,isGitHubCI:!0},{template:".github/dependabot.yml",output:".github/dependabot.yml",isStatic:!0,isGitHubCI:!0},{template:".github/workflows/lint-and-tests.yml.hbs",output:".github/workflows/lint-and-tests.yml",isGitHubCI:!0},{template:".github/workflows/build-and-deploy.yml.hbs",output:".github/workflows/build-and-deploy.yml",isGitHubCI:!0},{template:".github/workflows/publish-packages.yml",output:".github/workflows/publish-packages.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/setup-bun-install/action.yml.hbs",output:".github/actions/setup-bun-install/action.yml",isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/action.yml",output:".github/actions/check-image-tag-exists/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/index.js",output:".github/actions/check-image-tag-exists/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/action.yml",output:".github/actions/generate-scope-matrix/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/index.js",output:".github/actions/generate-scope-matrix/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/prepare-build-context/action.yml",output:".github/actions/prepare-build-context/action.yml",isStatic:!0,isGitHubCI:!0},{template:"CLAUDE.md",output:"CLAUDE.md",isStatic:!0},{template:".claude/rules/cloudevents.md",output:".claude/rules/cloudevents.md",isStatic:!0}],wi={title:"Creating workspace structure",task:async(e,t)=>{if(rn(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=tn(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let m=Au(c,["--version"],{encoding:"utf-8",timeout:5e3}).stdout?.trim();if(m&&/^\d+\.\d+/.test(m))return`${c}@${m}`}catch{}return{bun:"bun@1.2.7",npm:"npm@10.9.2",yarn:"yarn@4.6.0",pnpm:"pnpm@9.15.2"}[c]||`${c}@latest`},i={projectName:e.projectName,scope:`@${e.projectName}`,githubOwner:e.githubOwner||"",pulumiStackBase:e.pulumiStackBase||e.projectName,packageManager:o,packageManagerVersion:s(o)},a=Ou.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of a){let l=on(e.cwd,c.output),p=Fu(l);if(rn(p)||Ru(p,{recursive:!0}),c.isStatic){let m=on(r,c.template);rn(m)?nn(l,Nu(m)):nn(l,""),xi(l)}else{let m=on(r,c.template),y=Bt(m,i);nn(l,y),xi(l)}}t.title="Workspace structure created"}};f();import{existsSync as Si,mkdirSync as Pi,readFileSync as Mu,writeFileSync as Du}from"fs";import{join as Ut}from"path";import _u from"chalk";var ju=()=>{let e=Ut(process.cwd(),"package.json");if(!Si(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse(Mu(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},Lu=()=>{let e=ju(),{relativePath:t,packagePath:r}=w();if(Si(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=ki(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};Pi(r,{recursive:!0}),Pi(Ut(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"tsup.config.ts",output:"tsup.config.ts"},{template:"README.md.hbs",output:"README.md"},{template:"src/index.ts",output:"src/index.ts"},{template:"src/stream-policies.ts.hbs",output:"src/stream-policies.ts"},{template:"src/events/index.ts",output:"src/events/index.ts"}];for(let i of s){let a=Ut(n,i.template),c=Ut(r,i.output),l=Bt(a,o);Du(c,l,"utf-8")}},bi={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),Lu(),t.title="Contracts package initialized"}catch(n){throw t.title=_u.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};import Wu from"chalk";var Ei={title:"Registering shell completion",task:async(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),await Ge(),t.title="Shell completion registered"}catch{t.title=Wu.dim("Shell completion skipped")}finally{process.chdir(r)}}};var Ti=J({name:"workspace",description:"Create a new workspace with infrastructure setup",arguments:[["[name]","Name or path of the workspace"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["-o, --github-owner <owner>","GitHub organization or username"],["-s, --pulumi-stack <name>","Pulumi stack base name (org/project)"],["--no-github","Skip GitHub CI/CD workflows"],["--remove-dir","Remove existing directory before creating (internal use)"]],exampleUsage:"pf new workspace my-platform -o my-org",buildContext:(e,t)=>{let r=(e.name??"my-platform").trim(),n=O(r),o=!!t.yes,s=t.packageManager??(o?b():void 0),i=t.packageManager==="bun",a=t.githubOwner??(o?"my-org":void 0),c=t.pulumiStack??(o?`${a}/${r}`:void 0),l=t.github===!1?!1:o?!0:void 0,p=!!e.name,m=t.removeDir||o;return{cwd:n,projectName:r,shouldInstallBun:i,packageManager:s,elapsedTime:0,userConfirmed:o,skipInputPrompts:p&&!o,removeDir:m,githubOwner:a,pulumiStackBase:c,includeGitHubCI:l}},prompts:[{enabled:e=>!e.userConfirmed,task:async(e,t)=>{try{let r=u();if(!await k(t).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${r}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");t.title=_.yellow("Warning: Creating nested workspace")}catch(r){if(X(r)&&r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},Pe,xe,fi,hi,yi,ke,Se,ve],actions:[we,Ce,wi,bi,jt,pi,Ei],onComplete:({projectName:e,includeGitHubCI:t})=>{d.breakLine().log(_.bold.green("Workspace created successfully!")),d.breakLine().log(_.bold("Next steps:")).log(` 1. ${_.cyan(`cd ${e}`)}`).log(` 2. ${_.cyan("exec $SHELL")} ${_.dim("(enable tab completion)")}`),t&&d.breakLine().log(_.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${_.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${_.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${_.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),d.breakLine().log(_.bold("Structure created:")).log(" apps/ # Frontend applications").log(" services/ # Backend microservices").log(" packages/").log(" \u2514\u2500\u2500 contracts/ # Shared event contracts").log(" infra/").log(" \u251C\u2500\u2500 index.ts # Pulumi entry point").log(" \u251C\u2500\u2500 services/ # Service configs").log(" \u251C\u2500\u2500 Pulumi.yaml # Pulumi project config").log(" \u2514\u2500\u2500 Pulumi.dev.yaml # Dev stack config"),t&&d.log(" .github/").log(" \u251C\u2500\u2500 workflows/ # CI/CD workflows").log(" \u2514\u2500\u2500 actions/ # Custom actions"),d.breakLine().log("Happy coding! \u{1F389}").breakLine()}});var ze=[{name:"Hono Microservice",value:"hono-micro",command:vi,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:Ci,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:Ti,supportsAi:!1}],$i=()=>{let e=J({name:"new",description:"Create a new project",arguments:[["[type]","Type of the project (e.g., nest-micro, hono-micro, workspace)"]],exampleUsage:"platform new hono-micro test-service",buildContext:t=>({projectType:t.type??"",useAi:!1,aiDescription:"",elapsedTime:0,cwd:process.cwd()}),prompts:[{enabled:t=>!t.projectType,task:async(t,r)=>{let o=await k(r).select({message:"Select Project type",choices:ze});t.projectType=ze.find(s=>s.name===o)?.value||"",r.title=`Using ${q.bold(o)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,r)=>{try{u(),r.title="Workspace detected"}catch{let n=["Not in a workspace directory","",`Current directory: ${process.cwd()}`,"","This command must be run from within a workspace created with pf new workspace","","To create a new workspace, run:",""," pf new workspace my-platform"].join(`
583
- `);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=u();if(!await k(r).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${n}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");r.title=q.yellow("Warning: Creating nested workspace")}catch(n){if(X(n)&&n.message?.includes("cancelled"))throw n;r.title="No existing workspace detected"}}},{enabled:t=>!!t.projectType,task:async(t,r)=>{let o={"hono-micro":"services/my-hono-service","nest-micro":"services/my-nest-service",workspace:"my-platform"}[t.projectType]||"my-project",s=t.projectType==="workspace"?"\u{1F4E6} Workspace name:":"\u{1F4E6} Service path (e.g., services/my-service):",a=await k(r).input({message:s,initial:o});t.servicePath=a.trim(),r.title=`Path: ${q.dim(a)}`}},{enabled:t=>!!ze.find(n=>n.value===t.projectType)?.supportsAi&&de().valid,task:async(t,r)=>{let o=await k(r).toggle({message:"Use AI to generate service code?",initial:!1});t.useAi=o,r.title=o?q.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:t=>t.useAi,task:async(t,r)=>{let o=await k(r).input({message:"Describe what this service should do:"});t.aiDescription=o,r.title=`Description: ${q.dim(o.slice(0,50))}${o.length>50?"...":""}`}},{enabled:t=>{if(!t.servicePath)return!1;let r=O(t.servicePath);return!et(r)},task:async(t,r)=>{if(!await k(r).toggle({message:q.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,r.title=q.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,r)=>{if(!await k(r).toggle({message:"\u{1F680} Ready to launch your project?",initial:!0}))throw new Error("Project creation was canceled by the user.")}}],actions:[],onComplete:async t=>{ze.find(s=>s.value===t.projectType)||e.error(q.red(`Project type ${t.projectType} is not supported.`));let r=e.commands.find(s=>s.name()===t.projectType),n={};t.projectType!=="workspace"&&(n.yes=!0);let o=[];t.servicePath&&o.push("servicePath"),t.shouldRemoveDir&&(n.removeDir=!0),t.useAi&&(n.ai=!0,n.description=t.aiDescription),await li(r,t,n,o)}});for(let t of ze)e.addCommand(t.command);return e};import{Command as Xu}from"commander";v();import{createHash as Hu}from"crypto";import{existsSync as ie,readdirSync as Ai,readFileSync as Ii,unlinkSync as Gu,writeFileSync as Bu}from"fs";import{join as Y}from"path";import Uu from"chokidar";f();v();var Vu=e=>{let t=Y(e,"infra","services");if(!ie(t))return[];let r=Ai(t).filter(a=>a.endsWith(".ts")&&a!=="index.ts").map(a=>a.replace(".ts","")),n=E(e),o=a=>{let c=Y(e,a);return ie(c)?Ai(c).filter(l=>ie(Y(c,l,"package.json"))):[]},s=[...o(n.services),...o(n.apps)],i=r.filter(a=>!s.includes(a));for(let a of i)Gu(Y(t,`${a}.ts`));return i},Ri=".install-hash",Ni=e=>{let t=Ii(e);return Hu("sha256").update(t).digest("hex")},zu=e=>{let t=Y(e,"node_modules",Ri),r=Y(e,"bun.lock");return!ie(r)||!ie(t)?!0:Ii(t,"utf-8")!==Ni(r)},Ju=e=>{let t=Y(e,"bun.lock"),r=Y(e,"node_modules",Ri);ie(t)&&Bu(r,Ni(t),"utf-8")},sn=async e=>{let t=Vu(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),zu(e)&&(await L({cwd:e,quiet:!0}),Ju(e)),await Oe("generate-env",{cwd:e})},an=async e=>{await Zs()&&await Zr(e)},Fi=e=>{let{eventsPath:t}=w(e);if(!ie(t))return async()=>{};let r=ae(async()=>{console.log(`
584
- \u{1F4E6} Contracts changed, updating streams...`),await Zr(e)},500),n=Uu.watch(`${t}/**/*.ts`,{ignoreInitial:!0,ignored:["**/index.ts","**/*.test.ts","**/*.spec.ts"]});return n.on("add",r).on("change",r),async()=>{await n.close()}};Ze();import Mi from"chalk";f();Ee();var Ku=["SIGINT","SIGTERM"],qu=[x.SUCCESS,x.GENERAL_ERROR,x.CANCELLED],Yu=({code:e,signal:t})=>t?Ku.includes(t)?x.SUCCESS:x.GENERAL_ERROR:e===null||qu.includes(e)?x.SUCCESS:e,Oi=e=>!e.isCurrentProcess||e.isRestarting||e.isShuttingDown?{action:"continue"}:{action:"shutdown",exitCode:Yu(e)};var cn=e=>new Promise(t=>setTimeout(t,e)),Di=e=>process.stdout.write(`${e}
585
- `),Zu=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},_i=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),ji=async(e,t,r,n)=>{let{dev:o}=Re(t),s=r.length>0?[...r]:o.filter,i=Kn(Jn(".env.local",t),s,process.env.PORT);i.length>0&&(await Xn(i),await cn(50));let a=s.flatMap(l=>["--filter",l]);Di(Mi.cyan("\u{1F525} Starting services...")),Di(Mi.dim(` Command: turbo run ${qt} --continue${a.length?` ${a.join(" ")}`:""}`)),e.isShuttingDown=!1,e.isRestarting=!1;let c=qn("turbo",["run",qt,"--continue","--no-daemon",...a],{cwd:t,envFile:".env.local",onExit:(l,p)=>{let m=Oi({code:l,signal:p,isRestarting:e.isRestarting,isShuttingDown:e.isShuttingDown,isCurrentProcess:e.turboProcess===c});m.action==="shutdown"&&n(m.exitCode)}});e.turboProcess=c},Vt=async e=>{let t=e.turboProcess?.pid;if(t){e.isShuttingDown=!0;try{try{process.kill(-t,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await cn(200);try{process.kill(-t,"SIGKILL")}catch{}await cn(30)}catch{}e.turboProcess=null,Zu()}};var Li=new Xu("dev").description("Start development mode with auto-reload").option("-f, --filter <packages...>","Only start these workspace packages (e.g. @orderboss/website). Overrides pf.dev.filter, and narrows the ports freed on start so a second worktree does not kill the first one.").action(async e=>{let t=e.filter??[],r;try{r=u()}catch(m){$(m);return}let n=_i(),o,s,i=async(m=x.SUCCESS)=>{n.isShuttingDown||(console.log(`
586
- \u{1F6D1} Shutting down...`),await Vt(n),await Promise.all([o?.(),s?.()]),process.exit(m))},a=()=>ji(n,r,t,i),c=async()=>{await sn(r),await an(r),await a()},p=ae(async()=>{if(!(n.isRestarting||n.isShuttingDown)){n.isRestarting=!0,console.log(`
465
+ ${o}`)}e.forEach(Fp)},Hp=async(e,t,r)=>{let{projectName:n,serviceType:o,hasEvents:s,streams:i}=e,a=n.split("/").pop()||n,p=ko({type:o==="hono"?"hono-micro":"nest",name:a,path:n,hasEvents:s,streams:i}),l=p.effects.filter(T=>T.kind==="file:write"),u=jp(o);Wp(l,u),e.assignedPort=p.port,e.elapsedTime+=r(),t.title=`Generated ${a} (port ${p.port}, ${e.elapsedTime}s)`},dt={title:"Generating service",task:async(e,t)=>R(t,async r=>{await Hp(e,t,r)})};var Go=L({name:"hono-micro",description:"Create a new Hono microservice with the Crossdelta setup.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:"platform new hono-micro my-service",buildContext:async(e,t)=>{let r=(e.name??"my-hono-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${I().services}/${r}`);let n=_(r),o=t.packageManager??(t.yes&&w()),s=N(),i=t.yes?te():[],a=t.packageManager==="bun",c=!!t.yes||!!e.name&&e.name!=="my-hono-service";return{cwd:n,projectName:r,packageManager:o,shouldInstallBun:a,availableIntegrations:s,selectedIntegrations:i,serviceType:"hono",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[ae,se,oe,ce,pt,re],actions:[ie,ne,dt,it,ct,mt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{m.breakLine().log(Bo.bold.green("Hono Microservice created successfully!")),ot(r),Ro(Bp(e),n??8080);let o=t??w();m.breakLine().log(`To start the project, run:
466
+ ${Bo.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});import Uo from"chalk";v();h();var Vo=L({name:"nest-micro",description:"Create a new NestJS microservice with the Crossdelta setup.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:"platform new nest-micro my-service",buildContext:async(e,t)=>{let r=(e.name??"my-nest-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${I().services}/${r}`);let n=_(r),o=t.packageManager??(t.yes&&w()),s=t.packageManager==="bun",i=N(),a=t.yes?te():[],c=!!t.yes||!!e.name;return{cwd:n,projectName:r,shouldInstallBun:s,packageManager:o,availableIntegrations:i,selectedIntegrations:a,serviceType:"nest",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[ae,se,oe,ce,pt,re],actions:[ie,ne,dt,it,lt,Mo,ct,mt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{m.breakLine().log(Uo.bold.green("NestJS Microservice created successfully!")),ot(r),m.breakLine().log(`To start the project, run:
467
+ ${Uo.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});import O from"chalk";h();import{spawnSync as Vp}from"child_process";import{chmodSync as Jp,existsSync as gr,mkdirSync as zp,readFileSync as Kp,writeFileSync as fr}from"fs";import{dirname as qp,join as hr}from"path";import{existsSync as Gp}from"fs";import{join as gt}from"path";var Up=()=>typeof import.meta?.url=="string"?j(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),dr=()=>{let e=Up(),t=B();return Q([gt(e,"templates","workspace"),gt(e,"..","..","..","..","templates","workspace"),gt(t,"bin","templates","workspace")],"Workspace templates directory not found.")},Jo=()=>{let e=dr(),t=gt(e,"packages","contracts");if(!Gp(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},ft=(e,t)=>er(e,t);var zo=e=>{e.endsWith(".sh")&&Jp(e,493)},Yp=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"pnpm-workspace.yaml.hbs",output:"pnpm-workspace.yaml",forPackageManager:"pnpm"},{template:"biome.json.hbs",output:"biome.json"},{template:"turbo.json.hbs",output:"turbo.json"},{template:"bunfig.toml.hbs",output:"bunfig.toml"},{template:"gitignore.hbs",output:".gitignore"},{template:"editorconfig.hbs",output:".editorconfig"},{template:"npmrc.hbs",output:".npmrc"},{template:".vscode/settings.json",output:".vscode/settings.json",isStatic:!0},{template:".vscode/extensions.json",output:".vscode/extensions.json",isStatic:!0},{template:"infra/package.json.hbs",output:"infra/package.json"},{template:"infra/index.ts.hbs",output:"infra/index.ts"},{template:"infra/tsconfig.json.hbs",output:"infra/tsconfig.json"},{template:"infra/Pulumi.yaml.hbs",output:"infra/Pulumi.yaml"},{template:"infra/Pulumi.dev.yaml.hbs",output:"infra/Pulumi.dev.yaml"},{template:"apps/.gitkeep",output:"apps/.gitkeep",isStatic:!0},{template:"services/.gitkeep",output:"services/.gitkeep",isStatic:!0},{template:"packages/.gitkeep",output:"packages/.gitkeep",isStatic:!0},{template:"docs/.gitkeep",output:"docs/.gitkeep",isStatic:!0},{template:"infra/services/.gitkeep",output:"infra/services/.gitkeep",isStatic:!0},{template:".github/README.md",output:".github/README.md",isStatic:!0,isGitHubCI:!0},{template:".github/dependabot.yml",output:".github/dependabot.yml",isStatic:!0,isGitHubCI:!0},{template:".github/workflows/lint-and-tests.yml.hbs",output:".github/workflows/lint-and-tests.yml",isGitHubCI:!0},{template:".github/workflows/build-and-deploy.yml.hbs",output:".github/workflows/build-and-deploy.yml",isGitHubCI:!0},{template:".github/workflows/publish-packages.yml",output:".github/workflows/publish-packages.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/setup-bun-install/action.yml.hbs",output:".github/actions/setup-bun-install/action.yml",isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/action.yml",output:".github/actions/check-image-tag-exists/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/index.js",output:".github/actions/check-image-tag-exists/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/action.yml",output:".github/actions/generate-scope-matrix/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/index.js",output:".github/actions/generate-scope-matrix/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/prepare-build-context/action.yml",output:".github/actions/prepare-build-context/action.yml",isStatic:!0,isGitHubCI:!0},{template:"CLAUDE.md",output:"CLAUDE.md",isStatic:!0},{template:".claude/rules/cloudevents.md",output:".claude/rules/cloudevents.md",isStatic:!0}],Ko={title:"Creating workspace structure",task:async(e,t)=>{if(gr(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=dr(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let u=Vp(c,["--version"],{encoding:"utf-8",timeout:5e3}).stdout?.trim();if(u&&/^\d+\.\d+/.test(u))return`${c}@${u}`}catch{}return{bun:"bun@1.2.7",npm:"npm@10.9.2",yarn:"yarn@4.6.0",pnpm:"pnpm@9.15.2"}[c]||`${c}@latest`},i={projectName:e.projectName,scope:`@${e.projectName}`,githubOwner:e.githubOwner||"",pulumiStackBase:e.pulumiStackBase||e.projectName,packageManager:o,packageManagerVersion:s(o)},a=Yp.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of a){let p=hr(e.cwd,c.output),l=qp(p);if(gr(l)||zp(l,{recursive:!0}),c.isStatic){let u=hr(r,c.template);gr(u)?fr(p,Kp(u)):fr(p,""),zo(p)}else{let u=hr(r,c.template),T=ft(u,i);fr(p,T),zo(p)}}t.title="Workspace structure created"}};v();import{existsSync as Yo,mkdirSync as qo,readFileSync as Zp,writeFileSync as Xp}from"fs";import{join as ht}from"path";import Qp from"chalk";var el=()=>{let e=ht(process.cwd(),"package.json");if(!Yo(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse(Zp(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},tl=()=>{let e=el(),{relativePath:t,packagePath:r}=x();if(Yo(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=Jo(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};qo(r,{recursive:!0}),qo(ht(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"tsup.config.ts",output:"tsup.config.ts"},{template:"README.md.hbs",output:"README.md"},{template:"src/index.ts",output:"src/index.ts"},{template:"src/stream-policies.ts.hbs",output:"src/stream-policies.ts"},{template:"src/events/index.ts",output:"src/events/index.ts"}];for(let i of s){let a=ht(n,i.template),c=ht(r,i.output),p=ft(a,o);Xp(c,p,"utf-8")}},Zo={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),tl(),t.title="Contracts package initialized"}catch(n){throw t.title=Qp.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};import{spawnSync as rl}from"child_process";import nl from"chalk";var ol=["bunx","jackherd","init"],sl=([e,...t],r)=>{let n=rl(e,t,{cwd:r,encoding:"utf-8"}),o=`${n.error?.message??""} ${n.stdout??""}${n.stderr??""}`.trim();return{exitCode:n.status??1,output:o}},il=(e,t=sl)=>{let{exitCode:r,output:n}=t(ol,e);if(r!==0)throw new Error(`jackherd init failed (exit ${r}): ${n}`)},Xo={title:"Installing agent skills and rules",task:(e,t)=>{try{il(e.cwd),t.title="Agent skills and rules installed"}catch(r){throw t.title=nl.red(r.message),r}}};import al from"chalk";var Qo={title:"Registering shell completion",task:async(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),await xe(),t.title="Shell completion registered"}catch{t.title=al.dim("Shell completion skipped")}finally{process.chdir(r)}}};var es=L({name:"workspace",description:"Create a new workspace with infrastructure setup",arguments:[["[name]","Name or path of the workspace"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["-o, --github-owner <owner>","GitHub organization or username"],["-s, --pulumi-stack <name>","Pulumi stack base name (org/project)"],["--no-github","Skip GitHub CI/CD workflows"],["--remove-dir","Remove existing directory before creating (internal use)"]],exampleUsage:"pf new workspace my-platform -o my-org",buildContext:(e,t)=>{let r=(e.name??"my-platform").trim(),n=_(r),o=!!t.yes,s=t.packageManager??(o?w():void 0),i=t.packageManager==="bun",a=t.githubOwner??(o?"my-org":void 0),c=t.pulumiStack??(o?`${a}/${r}`:void 0),p=t.github===!1?!1:o?!0:void 0,l=!!e.name,u=t.removeDir||o;return{cwd:n,projectName:r,shouldInstallBun:i,packageManager:s,elapsedTime:0,userConfirmed:o,skipInputPrompts:l&&!o,removeDir:u,githubOwner:a,pulumiStackBase:c,includeGitHubCI:p}},prompts:[{enabled:e=>!e.userConfirmed,task:async(e,t)=>{try{let r=d();if(!await y(t).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${r}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");t.title=O.yellow("Warning: Creating nested workspace")}catch(r){if(Ie(r)&&r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},ae,se,Fo,Wo,Ho,oe,ce,re],actions:[ie,ne,Ko,Zo,lt,Xo,_o,Qo],onComplete:({projectName:e,includeGitHubCI:t})=>{m.breakLine().log(O.bold.green("Workspace created successfully!")),m.breakLine().log(O.bold("Next steps:")).log(` 1. ${O.cyan(`cd ${e}`)}`).log(` 2. ${O.cyan("exec $SHELL")} ${O.dim("(enable tab completion)")}`),t&&m.breakLine().log(O.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${O.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${O.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${O.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),m.breakLine().log(O.bold("Structure created:")).log(" apps/ # Frontend applications").log(" services/ # Backend microservices").log(" packages/").log(" \u2514\u2500\u2500 contracts/ # Shared event contracts").log(" infra/").log(" \u251C\u2500\u2500 index.ts # Pulumi entry point").log(" \u251C\u2500\u2500 services/ # Service configs").log(" \u251C\u2500\u2500 Pulumi.yaml # Pulumi project config").log(" \u2514\u2500\u2500 Pulumi.dev.yaml # Dev stack config"),t&&m.log(" .github/").log(" \u251C\u2500\u2500 workflows/ # CI/CD workflows").log(" \u2514\u2500\u2500 actions/ # Custom actions"),m.breakLine().log("Happy coding! \u{1F389}").breakLine()}});var yt=[{name:"Hono Microservice",value:"hono-micro",command:Go},{name:"Nest Microservice",value:"nest-micro",command:Vo},{name:"Workspace (Infrastructure)",value:"workspace",command:es}],ts=()=>{let e=L({name:"new",description:"Create a new project",arguments:[["[type]","Type of the project (e.g., nest-micro, hono-micro, workspace)"]],exampleUsage:"platform new hono-micro test-service",buildContext:t=>({projectType:t.type??"",elapsedTime:0,cwd:process.cwd()}),prompts:[{enabled:t=>!t.projectType,task:async(t,r)=>{let o=await y(r).select({message:"Select Project type",choices:yt});t.projectType=yt.find(s=>s.name===o)?.value||"",r.title=`Using ${pe.bold(o)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,r)=>{try{d(),r.title="Workspace detected"}catch{let n=["Not in a workspace directory","",`Current directory: ${process.cwd()}`,"","This command must be run from within a workspace created with pf new workspace","","To create a new workspace, run:",""," pf new workspace my-platform"].join(`
468
+ `);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=d();if(!await y(r).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${n}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");r.title=pe.yellow("Warning: Creating nested workspace")}catch(n){if(Ie(n)&&n.message?.includes("cancelled"))throw n;r.title="No existing workspace detected"}}},{enabled:t=>!!t.projectType,task:async(t,r)=>{let o={"hono-micro":"services/my-hono-service","nest-micro":"services/my-nest-service",workspace:"my-platform"}[t.projectType]||"my-project",s=t.projectType==="workspace"?"\u{1F4E6} Workspace name:":"\u{1F4E6} Service path (e.g., services/my-service):",a=await y(r).input({message:s,initial:o});t.servicePath=a.trim(),r.title=`Path: ${pe.dim(a)}`}},{enabled:t=>{if(!t.servicePath)return!1;let r=_(t.servicePath);return!De(r)},task:async(t,r)=>{if(!await y(r).toggle({message:pe.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,r.title=pe.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,r)=>{if(!await y(r).toggle({message:"\u{1F680} Ready to launch your project?",initial:!0}))throw new Error("Project creation was canceled by the user.")}}],actions:[],onComplete:async t=>{yt.find(s=>s.value===t.projectType)||e.error(pe.red(`Project type ${t.projectType} is not supported.`));let r=e.commands.find(s=>s.name()===t.projectType),n={};t.projectType!=="workspace"&&(n.yes=!0);let o=[];t.servicePath&&o.push("servicePath"),t.shouldRemoveDir&&(n.removeDir=!0),await Ao(r,t,n,o)}});for(let t of yt)e.addCommand(t.command);return e};import{Command as kl}from"commander";h();import{createHash as cl}from"crypto";import{existsSync as V,readdirSync as rs,readFileSync as ns,unlinkSync as pl,writeFileSync as ll}from"fs";import{join as F}from"path";import ml from"chokidar";v();h();var ul=e=>{let t=F(e,"infra","services");if(!V(t))return[];let r=rs(t).filter(a=>a.endsWith(".ts")&&a!=="index.ts").map(a=>a.replace(".ts","")),n=I(e),o=a=>{let c=F(e,a);return V(c)?rs(c).filter(p=>V(F(c,p,"package.json"))):[]},s=[...o(n.services),...o(n.apps)],i=r.filter(a=>!s.includes(a));for(let a of i)pl(F(t,`${a}.ts`));return i},os=".install-hash",ss=e=>{let t=ns(e);return cl("sha256").update(t).digest("hex")},dl=e=>{let t=F(e,"node_modules",os),r=F(e,"bun.lock");return!V(r)||!V(t)?!0:ns(t,"utf-8")!==ss(r)},gl=e=>{let t=F(e,"bun.lock"),r=F(e,"node_modules",os);V(t)&&ll(r,ss(t),"utf-8")},yr=async e=>{let t=ul(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),dl(e)&&(await M({cwd:e,quiet:!0}),gl(e)),await ye("generate-env",{cwd:e})},vr=async e=>{await xo()&&await pr(e)},is=e=>{let{eventsPath:t}=x(e);if(!V(t))return async()=>{};let r=z(async()=>{console.log(`
469
+ \u{1F4E6} Contracts changed, updating streams...`),await pr(e)},500),n=ml.watch(`${t}/**/*.ts`,{ignoreInitial:!0,ignored:["**/index.ts","**/*.test.ts","**/*.spec.ts"]});return n.on("add",r).on("change",r),async()=>{await n.close()}};Oe();import cs from"chalk";v();le();var fl=["SIGINT","SIGTERM"],hl=[k.SUCCESS,k.GENERAL_ERROR,k.CANCELLED],yl=({code:e,signal:t})=>t?fl.includes(t)?k.SUCCESS:k.GENERAL_ERROR:e===null||hl.includes(e)?k.SUCCESS:e,as=e=>!e.isCurrentProcess||e.isRestarting||e.isShuttingDown?{action:"continue"}:{action:"shutdown",exitCode:yl(e)};var kr=e=>new Promise(t=>setTimeout(t,e)),ps=e=>process.stdout.write(`${e}
470
+ `),vl=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},ls=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),ms=async(e,t,r,n)=>{let{dev:o}=fe(t),s=r.length>0?[...r]:o.filter,i=on(nn(".env.local",t),s,process.env.PORT);i.length>0&&(await pn(i),await kr(50));let a=s.flatMap(p=>["--filter",p]);ps(cs.cyan("\u{1F525} Starting services...")),ps(cs.dim(` Command: turbo run ${Pt} --continue${a.length?` ${a.join(" ")}`:""}`)),e.isShuttingDown=!1,e.isRestarting=!1;let c=sn("turbo",["run",Pt,"--continue","--no-daemon",...a],{cwd:t,envFile:".env.local",onExit:(p,l)=>{let u=as({code:p,signal:l,isRestarting:e.isRestarting,isShuttingDown:e.isShuttingDown,isCurrentProcess:e.turboProcess===c});u.action==="shutdown"&&n(u.exitCode)}});e.turboProcess=c},vt=async e=>{let t=e.turboProcess?.pid;if(t){e.isShuttingDown=!0;try{try{process.kill(-t,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await kr(200);try{process.kill(-t,"SIGKILL")}catch{}await kr(30)}catch{}e.turboProcess=null,vl()}};var us=new kl("dev").description("Start development mode with auto-reload").option("-f, --filter <packages...>","Only start these workspace packages (e.g. @orderboss/website). Overrides pf.dev.filter, and narrows the ports freed on start so a second worktree does not kill the first one.").action(async e=>{let t=e.filter??[],r;try{r=d()}catch(u){A(u);return}let n=ls(),o,s,i=async(u=k.SUCCESS)=>{n.isShuttingDown||(console.log(`
471
+ \u{1F6D1} Shutting down...`),await vt(n),await Promise.all([o?.(),s?.()]),process.exit(u))},a=()=>ms(n,r,t,i),c=async()=>{await yr(r),await vr(r),await a()},l=z(async()=>{if(!(n.isRestarting||n.isShuttingDown)){n.isRestarting=!0,console.log(`
587
472
  \u{1F504} Change detected, restarting...
588
- `);try{await Vt(n),await sn(r),await an(r),await a()}catch(m){$(m)}finally{n.isRestarting=!1}}},300);process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",()=>i()),process.on("SIGTERM",()=>i());try{await c(),o=En(r,p),s=Fi(r),console.log(`
473
+ `);try{await vt(n),await yr(r),await vr(r),await a()}catch(u){A(u)}finally{n.isRestarting=!1}}},300);process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",()=>i()),process.on("SIGTERM",()=>i());try{await c(),o=Dr(r,l),s=is(r),console.log(`
589
474
  \u{1F440} Watching for changes...`),console.log(` Press Ctrl+C to exit
590
- `)}catch(m){await Promise.all([o?.(),s?.()]),await Vt(n),$(m)}});import Bi from"chalk";import{Command as mg}from"commander";import{existsSync as Qu,readFileSync as eg,writeFileSync as tg}from"fs";import rg from"os";import Wi from"path";import ln from"chalk";import{Command as ng}from"commander";v();var{name:og,publishConfig:sg}=R,ig=sg?.registry,ag=og?.split("/")[0],qE=new ng("token:set").description(ln.bold("Set a registry auth token in a .npmrc file")).argument("<token>","Authentication token (e.g. GitHub or npm token)").option("--scope <scope>","Package scope (e.g. @my-workspace)",ag).option("--registry <registry>","Registry URL",ig).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action((e,t)=>Hi(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${ln.cyan(`
475
+ `)}catch(u){await Promise.all([o?.(),s?.()]),await vt(n),A(u)}});import hs from"chalk";import{Command as Ol}from"commander";import{existsSync as Cl,readFileSync as xl,writeFileSync as wl}from"fs";import Pl from"os";import ds from"path";import Cr from"chalk";import{Command as bl}from"commander";h();var{name:Sl,publishConfig:El}=E,Tl=El?.registry,$l=Sl?.split("/")[0],TC=new bl("token:set").description(Cr.bold("Set a registry auth token in a .npmrc file")).argument("<token>","Authentication token (e.g. GitHub or npm token)").option("--scope <scope>","Package scope (e.g. @my-workspace)",$l).option("--registry <registry>","Registry URL",Tl).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action((e,t)=>gs(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${Cr.cyan(`
591
476
  Example:`)}
592
- ${ln.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
593
- `),cg=e=>e?Wi.join(process.cwd(),".npmrc"):Wi.join(rg.homedir(),".npmrc"),lg=(e,t,r)=>{let n=new URL(r).host;return t?`${t}:registry=https://${n}
594
- //${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},pg=e=>Qu(e)?eg(e,"utf8"):"",pn=(e,t)=>tg(e,t),Hi=(e,t,r,n=!1,o=!1)=>{let s=cg(n),i=lg(e,t,r),a=new URL(r).host,c=pg(s),l=new RegExp(`//${a}/:_authToken=\\S+`);if(!c){pn(s,`${i}
595
- `),d.success(`Created new .npmrc and set token for ${a}`);return}if(l.test(c)){if(!o){d.warn(`Token for ${a} already exists in ${s}. Use --force to overwrite.`);return}c=c.replace(l,i),pn(s,c),d.success(`Overwrote existing token for ${a} in ${s}`);return}c+=`
477
+ ${Cr.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
478
+ `),Rl=e=>e?ds.join(process.cwd(),".npmrc"):ds.join(Pl.homedir(),".npmrc"),Il=(e,t,r)=>{let n=new URL(r).host;return t?`${t}:registry=https://${n}
479
+ //${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},Nl=e=>Cl(e)?xl(e,"utf8"):"",xr=(e,t)=>wl(e,t),gs=(e,t,r,n=!1,o=!1)=>{let s=Rl(n),i=Il(e,t,r),a=new URL(r).host,c=Nl(s),p=new RegExp(`//${a}/:_authToken=\\S+`);if(!c){xr(s,`${i}
480
+ `),m.success(`Created new .npmrc and set token for ${a}`);return}if(p.test(c)){if(!o){m.warn(`Token for ${a} already exists in ${s}. Use --force to overwrite.`);return}c=c.replace(p,i),xr(s,c),m.success(`Overwrote existing token for ${a} in ${s}`);return}c+=`
596
481
  ${i}
597
- `,pn(s,c),d.success(`Appended token for ${a} to ${s}`)},Gi=(e,t)=>Hi(e,t.scope||"",t.registry||"",t.local,t.force);var{name:dg,publishConfig:ug}=R,gg=ug?.registry,fg=dg?.split("/")[0],mn=new mg("token").description("Token management commands");mn.command("set").description("Set a registry auth token in a .npmrc file").argument("<token>","Authentication token (e.g. GitHub or npm token)").option("--scope <scope>","Package scope (e.g. @my-workspace)",fg).option("--registry <registry>","Registry URL",gg).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(Gi).addHelpText("after",()=>`${Bi.cyan(`
482
+ `,xr(s,c),m.success(`Appended token for ${a} to ${s}`)},fs=(e,t)=>gs(e,t.scope||"",t.registry||"",t.local,t.force);var{name:Al,publishConfig:_l}=E,Dl=_l?.registry,Ll=Al?.split("/")[0],wr=new Ol("token").description("Token management commands");wr.command("set").description("Set a registry auth token in a .npmrc file").argument("<token>","Authentication token (e.g. GitHub or npm token)").option("--scope <scope>","Package scope (e.g. @my-workspace)",Ll).option("--registry <registry>","Registry URL",Dl).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(fs).addHelpText("after",()=>`${hs.cyan(`
598
483
  Example:`)}
599
- ${Bi.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
600
- `);mn.action(()=>{let e=ue({title:"\u{1F511} Token Management",commands:[{name:"set",description:"Set a registry auth token in a .npmrc file"}],footer:'Run "pf token <command> --help" for more information'});console.log(e)});var Ui=mn;import un from"chalk";import{Command as $g}from"commander";f();Ze();var oT={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};import{confirm as zi,input as kg,password as xg,select as Ji}from"@inquirer/prompts";import P from"chalk";var hg=[/embed/i,/whisper/i,/tts/i,/dall-e/i,/davinci/i,/babbage/i,/curie/i,/ada(?!-)/i,/moderation/i,/realtime/i,/audio/i,/transcription/i,/search/i],yg=async(e,t,r=1e4)=>{let n=new AbortController,o=setTimeout(()=>n.abort(),r);try{return await fetch(e,{...t,signal:n.signal})}finally{clearTimeout(o)}},vg=e=>e.replace(/-(\d{8})$/," ($1)").replace(/^claude-/,"Claude ").replace(/^gpt-/,"GPT-").replace(/-/g," ").replace(/(\d)\.(\d)/g,"$1.$2").replace(/\s+/g," ").split(" ").map(t=>/^\d/.test(t)||/^\(\d+\)$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join(" ").trim(),Cg=async(e,t)=>{let r=De(e),n=await yg(r.modelsApiUrl,{headers:r.buildHeaders(t)});if(!n.ok)throw new Error(`${r.name} API error: ${n.status}`);let o=await n.json(),s=r.parseModelsResponse(o);if(!Array.isArray(s)||s.length===0)throw new Error(`No models returned from ${r.name} API`);let i=s.filter(a=>{let c=r.modelFilters.some(p=>p.test(a.id)),l=hg.some(p=>p.test(a.id));return c&&!l}).sort((a,c)=>{let l=typeof a.created=="number"?a.created:new Date(a.created).getTime();return(typeof c.created=="number"?c.created:new Date(c.created).getTime())-l}).map(a=>({name:vg(a.id),value:a.id}));if(i.length===0)throw new Error(`No chat models found from ${r.name} API`);return i};async function Vi(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await Cg(e,t),fromApi:!0}}z();function wg(){if(!_e())return null;try{let e=pt();return console.log(P.dim(`Found existing configuration at ${Q}
601
- `)),e}catch{return console.log(P.yellow(`Found corrupted configuration, starting fresh.
602
- `)),null}}async function Pg(e,t){return console.log(P.dim(`
603
- \u{1F4CB} Get your ${e} API key here:`)),console.log(P.cyan(` ${t}
604
- `)),xg({message:`Enter your ${e} API key:`,mask:"*",validate:r=>r.trim()?r.length<10?"API key seems too short":!0:"API key cannot be empty"})}async function Sg(e,t,r){let n=await Ji({message:"Select model:",choices:e,default:t?.provider===r?t.model:void 0});return await zi({message:"Enter a custom model ID instead?",default:!1})?kg({message:"Enter custom model ID:",default:n,validate:s=>s.trim()?!0:"Model ID cannot be empty"}):n}function Ki(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function bg(e,t){console.log(P.green.bold(`
605
- \u2705 AI configuration saved successfully!
606
- `)),console.log(P.dim(`Configuration file: ${Q}`)),console.log(P.dim("API Key: Stored securely in system keychain")),console.log(P.dim(`Provider: ${e.provider}`)),console.log(P.dim(`Model: ${e.model}`)),console.log(P.dim(`API Key: ${Ki(t)}
607
- `)),console.log(P.cyan("You can now use AI-powered service generation:")),console.log(P.dim(` pf new hono-micro services/my-service --ai
608
- `))}async function Eg(e){let t=await lt(e);if(t)return t;let r=De(e);return process.env[r.defaultApiKeyEnvVar]??null}async function qi(){console.log(P.cyan.bold(`
609
- \u{1F916} AI Configuration Setup
610
- `));let e=wg();try{let t=await Ji({message:"Select AI provider:",choices:mo(),default:e?.provider??gr.provider}),r=De(t),n,o=await Eg(t);o&&(console.log(P.green(`
611
- \u2713 Found existing API key: ${Ki(o)}`)),await zi({message:"Use this existing API key?",default:!0})&&(n=o)),n||(n=await Pg(r.name,r.apiKeyUrl)),console.log(P.dim(`
612
- Fetching available models...`));let s;try{s=(await Vi(t,n)).models,console.log(P.green(`\u2713 Loaded ${s.length} models from ${r.name} API
613
- `))}catch(c){console.error(P.red(`
614
- \u274C Failed to fetch models: ${Cn(c)}`)),console.log(P.yellow(`
615
- Please check your API key and try again.
616
- `)),process.exit(x.CONFIG_ERROR)}let i=await Sg(s,e,t),a={provider:t,model:i.trim()};uo(a),await go(t,n),bg(a,n)}catch(t){throw X(t)&&t.name==="ExitPromptError"&&(console.log(P.yellow(`
617
- Setup cancelled.
618
- `)),process.exit(x.CANCELLED)),t}}import{existsSync as vT,readFileSync as CT}from"fs";import{homedir as xT}from"os";import{join as PT}from"path";var dn=async(e,t=!1)=>{try{return _r(e,t),await Ge({verbose:t}),!0}catch{return!1}};var zt=e=>{let t=new $g("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
484
+ ${hs.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
485
+ `);wr.action(()=>{let e=q({title:"\u{1F511} Token Management",commands:[{name:"set",description:"Set a registry auth token in a .npmrc file"}],footer:'Run "pf token <command> --help" for more information'});console.log(e)});var ys=wr;import br from"chalk";import{Command as jl}from"commander";v();Oe();var LC={DEBUG:process.env.PF_DEBUG==="true"};import{existsSync as WC,readFileSync as HC}from"fs";import{homedir as GC}from"os";import{join as VC}from"path";var Pr=async(e,t=!1)=>{try{return zt(e,t),await xe({verbose:t}),!0}catch{return!1}};var kt=e=>{let t=new jl("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
619
486
  Examples:
620
487
  $ pf setup completion
621
488
  $ pf setup completion --verbose
622
- `).action(async r=>{await dn(e,r.verbose),r.verbose||(console.log(un.green(`
623
- \u2714 Shell autocompletion installed!`)),console.log(un.dim(` Restart your shell:
624
- `)),console.log(un.cyan(` exec $SHELL
625
- `)))}),t.command("ai").description("Configure AI provider and API key for code generation").addHelpText("after",`
626
- Example:
627
- $ pf setup ai
628
- `).action(async()=>{await qi()}),t.action(()=>{let r=ue({title:"\u2699\uFE0F Platform Setup",commands:[{name:"completion",description:"Install shell autocompletion"},{name:"ai",description:"Configure AI provider"}],footer:'Run "pf setup <command> --help" for more information'});console.log(r)}),t},Ag=zt("pf");z();f();import Rg from"chalk";import{Command as Zi}from"commander";import Yi from"chalk";var Ig=e=>({debug:()=>{},info:e?()=>{}:t=>console.log(` ${t}`),warn:e?()=>{}:t=>console.log(Yi.yellow(` ${t}`)),error:e?()=>{}:t=>console.error(Yi.red(` ${t}`))}),gn=async e=>{let{command:t,args:r,options:n,context:o,silent:s=!1}=e,i=await t.run(r,n),a=i?.effects??[];if(a.length>0){let c={workspace:o.workspace,logger:Ig(s)};Wr(a,c)}if(!s&&i?.output){let c=Array.isArray(i.output)?i.output:[i.output];for(let l of c)console.log(l)}return{effects:a,output:i?.output}};var Ng=e=>e.required?`<${e.name}>`:`[${e.name}]`,Fg=(e,t)=>{e.argument(Ng(t),t.description)},Og=(e,t)=>{t.default!==void 0?e.option(t.flags,t.description,t.default):e.option(t.flags,t.description)},Mg=(e,t)=>Object.fromEntries(e.args.map((r,n)=>[r.name,t[n]])),Dg=e=>e[e.length-2],_g=(e,t)=>async(...r)=>{try{await gn({command:e,args:Mg(e,r),options:Dg(r),context:t})}catch(n){console.error(Rg.red(`Error executing ${e.name}:`),n instanceof Error?n.message:n),process.exit(1)}},Xi=(e,t)=>{let r=new Zi(e.name).description(e.description);return e.args.forEach(n=>{Fg(r,n)}),e.options.forEach(n=>{Og(r,n)}),r.action(_g(e,t)),r},fn=(e,t,r,n)=>{let o=new Zi(e).description(t);return r.forEach(s=>{o.addCommand(Xi(s,n))}),o};wt();process.on("SIGINT",()=>{process.exit(x.CANCELLED)});process.on("unhandledRejection",e=>{throw Ye(e)&&process.exit(x.CANCELLED),e});process.on("uncaughtException",e=>{$(e)});var Je=new Lg,Qi=Object.keys(R.bin||{}),[yn="pf",hn]=Qi.length>0?Qi:["pf"],{description:ea,version:Hg,repository:ta,homepage:Gg}=R,ra=ea?.split(/ —|,|\./)[0]||ea||"Platform CLI",oa=ta?.url?`https://${ta.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,na=oa||Gg,Bg=oa?"GitHub":"README",Ug=na?[Ke.bold(ra),`
629
-
630
- `,Ke.cyan("See more at: "),Ke.bold(Wg(Bg,String(na)))].join(""):Ke.bold(ra),Vg=[zt(yn),$i(),Li,Ui,so],zg=async()=>{try{let e=u(),t=Re(e);if(!t.plugins?.length)return[];let r=w(e),n=Pt({workspaceRoot:e,availableServices:at(e),contracts:{path:`${r.relativePath}/src`,packageName:r.packageName}}),o=[];for(let s of t.plugins)try{let{plugin:i}=await St(s,n),a=fn(i.name,i.description??`Commands from ${i.name}`,i.commands,n);o.push(a)}catch(i){console.warn(`\u26A0\uFE0F Failed to load plugin '${s}':`,i.message)}return o}catch{return[]}},Jg=async()=>{let e=await zg(),t=[...Vg,...e];Je.name(yn).description(Ug).version(Hg||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:r=>Ke.cyan(r.name())}).addHelpText("after",is),hn&&hn!==yn&&Je.alias(hn);for(let r of t)Je.addCommand(r);Je.command("__workspace-hash",{hidden:!0}).action(()=>{let r=process.cwd(),n=Math.abs(r.split("").reduce((o,s)=>(o<<5)-o+s.charCodeAt(0)|0,0));console.log(n)}),as(Je,jg,t)};Jg();
489
+ `).action(async r=>{await Pr(e,r.verbose),r.verbose||(console.log(br.green(`
490
+ \u2714 Shell autocompletion installed!`)),console.log(br.dim(` Restart your shell:
491
+ `)),console.log(br.cyan(` exec $SHELL
492
+ `)))}),t.action(()=>{let r=q({title:"\u2699\uFE0F Platform Setup",commands:[{name:"completion",description:"Install shell autocompletion"}],footer:'Run "pf setup <command> --help" for more information'});console.log(r)}),t},Fl=kt("pf");J();v();import Hl from"chalk";import{Command as ks}from"commander";import vs from"chalk";var Wl=e=>({debug:()=>{},info:e?()=>{}:t=>console.log(` ${t}`),warn:e?()=>{}:t=>console.log(vs.yellow(` ${t}`)),error:e?()=>{}:t=>console.error(vs.red(` ${t}`))}),Sr=async e=>{let{command:t,args:r,options:n,context:o,silent:s=!1}=e,i=await t.run(r,n),a=i?.effects??[];if(a.length>0){let c={workspace:o.workspace,logger:Wl(s)};Xt(a,c)}if(!s&&i?.output){let c=Array.isArray(i.output)?i.output:[i.output];for(let p of c)console.log(p)}return{effects:a,output:i?.output}};var Bl=e=>e.required?`<${e.name}>`:`[${e.name}]`,Gl=(e,t)=>{e.argument(Bl(t),t.description)},Ul=(e,t)=>{t.default!==void 0?e.option(t.flags,t.description,t.default):e.option(t.flags,t.description)},Vl=(e,t)=>Object.fromEntries(e.args.map((r,n)=>[r.name,t[n]])),Jl=e=>e[e.length-2],zl=(e,t)=>async(...r)=>{try{await Sr({command:e,args:Vl(e,r),options:Jl(r),context:t})}catch(n){console.error(Hl.red(`Error executing ${e.name}:`),n instanceof Error?n.message:n),process.exit(1)}},Cs=(e,t)=>{let r=new ks(e.name).description(e.description);return e.args.forEach(n=>{Gl(r,n)}),e.options.forEach(n=>{Ul(r,n)}),r.action(zl(e,t)),r},Er=(e,t,r,n)=>{let o=new ks(e).description(t);return r.forEach(s=>{o.addCommand(Cs(s,n))}),o};ze();process.on("SIGINT",()=>{process.exit(k.CANCELLED)});process.on("unhandledRejection",e=>{throw Ne(e)&&process.exit(k.CANCELLED),e});process.on("uncaughtException",e=>{A(e)});var Ee=new ql,xs=Object.keys(E.bin||{}),[$r="pf",Tr]=xs.length>0?xs:["pf"],{description:ws,version:Zl,repository:Ps,homepage:Xl}=E,bs=ws?.split(/ —|,|\./)[0]||ws||"Platform CLI",Es=Ps?.url?`https://${Ps.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,Ss=Es||Xl,Ql=Es?"GitHub":"README",em=Ss?[Te.bold(bs),`
493
+
494
+ `,Te.cyan("See more at: "),Te.bold(Yl(Ql,String(Ss)))].join(""):Te.bold(bs),tm=[kt($r),ts(),us,ys,hn],rm=async()=>{try{let e=d(),t=fe(e);if(!t.plugins?.length)return[];let r=x(e),n=Ke({workspaceRoot:e,availableServices:He(e),contracts:{path:`${r.relativePath}/src`,packageName:r.packageName}}),o=[];for(let s of t.plugins)try{let{plugin:i}=await qe(s,n),a=Er(i.name,i.description??`Commands from ${i.name}`,i.commands,n);o.push(a)}catch(i){console.warn(`\u26A0\uFE0F Failed to load plugin '${s}':`,i.message)}return o}catch{return[]}},nm=async()=>{let e=await rm(),t=[...tm,...e];Ee.name($r).description(em).version(Zl||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:r=>Te.cyan(r.name())}).addHelpText("after",wn),Tr&&Tr!==$r&&Ee.alias(Tr);for(let r of t)Ee.addCommand(r);Ee.command("__workspace-hash",{hidden:!0}).action(()=>{let r=process.cwd(),n=Math.abs(r.split("").reduce((o,s)=>(o<<5)-o+s.charCodeAt(0)|0,0));console.log(n)}),Pn(Ee,Kl,t)};nm();