@crossdelta/platform-sdk 0.18.3 → 0.18.5

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.js CHANGED
@@ -1,83 +1,101 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Ui=Object.create;var Wr=Object.defineProperty;var Ji=Object.getOwnPropertyDescriptor;var Ki=Object.getOwnPropertyNames;var zi=Object.getPrototypeOf,qi=Object.prototype.hasOwnProperty;var Vi=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ki(t))!qi.call(e,o)&&o!==n&&Wr(e,o,{get:()=>t[o],enumerable:!(r=Ji(t,o))||r.enumerable});return e};var u=(e,t,n)=>(n=e!=null?Ui(zi(e)):{},Vi(t||!e||!e.__esModule?Wr(n,"default",{value:e,enumerable:!0}):n,e));var Oi=require("node:process"),xe=u(require("chalk")),_i=require("commander"),Di=u(require("terminal-link"));var ra=u(require("chalk")),oa=require("commander");var ve=require("node:fs"),E=require("node:path"),Ce=require("fs-extra");var ad=process.env.npm_package_version||"0.0.0",Gr=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"],Cn="start:dev";var Ze=u(require("chalk"));function xn(e,t){if(e.length===0)return"No entries to display.";let n=t?.title||"Benchmark Results",r=t?.footer||"",o=t?.maxBarWidth||50,s=t?.unit||"",a=Math.max(...e.map(c=>c.value)),i=[];i.push(""),i.push(n),i.push("");for(let c of e){let l=Zi(c.barColor??t?.barColor),p=Yi(c,a,o,l,s,t?.labelColor);i.push(p)}return r&&(i.push(""),i.push(r)),i.join(`
3
- `)}function Zi(e){return e?Ze.default[e]("\u2587"):"\u2587"}function Yi(e,t,n,r,o,s){let a=Math.round(e.value/t*n),i=e.barColor?Ze.default[e.barColor](r.repeat(a)):r.repeat(a),c=e.color??s;return`${Ze.default.bold(c?Ze.default[c](e.label.padEnd(12)):e.label.padEnd(12))} ${i} ${e.value.toLocaleString()}${o?` ${o}`:""}`}var gr=u(require("chalk")),Us=require("commander"),fr=require("listr2");var be=require("node:fs"),Zr=require("node:os"),Yr=require("node:path");var ie=require("node:crypto"),we=require("node:fs"),ge=require("node:os"),Ur=require("node:path"),wn=(0,Ur.join)((0,ge.homedir)(),".platform-sdk-keys"),Jr="aes-256-gcm",Kr=()=>{let e=`${(0,ge.hostname)()}:${(0,ge.userInfo)().username}:${(0,ge.homedir)()}`;return(0,ie.createHash)("sha256").update(e).digest()},zr=()=>{if(!(0,we.existsSync)(wn))return{};try{return JSON.parse((0,we.readFileSync)(wn,"utf-8"))}catch{return{}}},Xi=e=>{(0,we.writeFileSync)(wn,JSON.stringify(e,null,2),{mode:384})},Qi=e=>{let t=Kr(),n=(0,ie.randomBytes)(16),r=(0,ie.createCipheriv)(Jr,t,n),o=r.update(e,"utf8","hex");return o+=r.final("hex"),{iv:n.toString("hex"),tag:r.getAuthTag().toString("hex"),data:o}},ec=e=>{let t=Kr(),n=Buffer.from(e.iv,"hex"),r=Buffer.from(e.tag,"hex"),o=(0,ie.createDecipheriv)(Jr,t,n);o.setAuthTag(r);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function qr(e,t){let n=zr();n[e]=Qi(t),Xi(n)}async function St(e){let n=zr()[e];if(!n)return null;try{return ec(n)}catch{return null}}var Ye={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(n=>({id:n.id,created:new Date(n.created_at).getTime()})),modelFilters:[/^claude-/]}};function Vr(){return Object.entries(Ye).map(([e,t])=>({name:t.name,value:e}))}function Xe(e){let t=Ye[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var fe=(0,Yr.join)((0,Zr.homedir)(),".platform-sdk-ai.json"),tc=()=>{let e="anthropic",t=Ye[e];return{provider:e,model:t.defaultModel}},bn=tc();function Qe(){return(0,be.existsSync)(fe)}function Pt(){if(!Qe())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=(0,be.readFileSync)(fe,"utf-8"),t=JSON.parse(e);return{...bn,...t}}catch{throw new Error(`Failed to load AI configuration from ${fe}. Please run 'pf setup --ai' again.`)}}function Xr(e){let t=JSON.stringify(e,null,2);(0,be.writeFileSync)(fe,t,"utf-8")}async function Qr(e,t){await qr(e,t)}async function eo(e){let t=await St(e.provider);if(t)return t;let n=Ye[e.provider],r=process.env[n.defaultApiKeyEnvVar];if(r)return r;throw new Error("API key not found. Please run 'pf setup --ai' to configure your API key.")}var nc=async(e,t,n,r)=>{let{createOpenAI:o}=await import("@ai-sdk/openai"),s=o({apiKey:n});if(r.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:r.system,maxOutputTokens:r.maxTokens,temperature:r.temperature}),p="";for await(let d of(await l).textStream)p+=d,r.onToken(d);return p}let{generateText:a}=await import("ai"),{text:i}=await a({model:s(t),prompt:e,system:r.system,maxOutputTokens:r.maxTokens,temperature:r.temperature});return i},rc=async(e,t,n,r)=>{let{createAnthropic:o}=await import("@ai-sdk/anthropic"),s=o({apiKey:n});if(r.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:r.system,maxOutputTokens:r.maxTokens,temperature:r.temperature}),p="";for await(let d of(await l).textStream)p+=d,r.onToken(d);return p}let{generateText:a}=await import("ai"),{text:i}=await a({model:s(t),prompt:e,system:r.system,maxOutputTokens:r.maxTokens,temperature:r.temperature});return i};async function to(e,t,n={}){let{system:r,maxTokens:o=4096,temperature:s=.7,onToken:a}=n,i=await eo(e);switch(e.provider){case"openai":return nc(t,e.model,i,{system:r,maxTokens:o,temperature:s,onToken:a});case"anthropic":return rc(t,e.model,i,{system:r,maxTokens:o,temperature:s,onToken:a});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}var ne=require("node:fs"),Ie=require("node:path"),rs=require("@inquirer/prompts"),h=u(require("chalk")),os=u(require("ora"));var Tn=require("node:fs"),At=require("node:path");var ce=require("node:fs"),$t=require("node:path"),Tt=u(require("chokidar"));var Sn=".pf-generating",Et=e=>(0,$t.join)(e,Sn),oc=e=>(0,ce.existsSync)(Et(e)),no=e=>{(0,ce.writeFileSync)(Et(e),"","utf-8")},Pn=e=>{let t=Et(e);(0,ce.existsSync)(t)&&(0,ce.unlinkSync)(t)},sc=e=>e?Object.values(e).filter(t=>typeof t=="object"&&t!==null&&t.watch===!0&&typeof t.path=="string"):[{path:"services"},{path:"apps"}],ro=(e,t)=>{Pn(e);let n=J(e),r=sc(n?.pf?.paths),o=Et(e),s=()=>{oc(e)||t()},a=[];a.push(Tt.default.watch(o,{ignoreInitial:!0}).on("unlink",()=>t()));for(let i of r){let c=(0,$t.join)(e,i.path);if(!(0,ce.existsSync)(c))continue;let l=i.ignorePatterns?.map(p=>(0,$t.join)(c,p));a.push(Tt.default.watch(`${c}/*`,{ignoreInitial:!0,depth:0,ignored:l}).on("addDir",s).on("unlinkDir",s)),a.push(Tt.default.watch(`${c}/*/package.json`,{ignoreInitial:!0,ignored:l}).on("add",s).on("change",s).on("unlink",s))}return async()=>{await Promise.all(a.map(i=>i.close()))}};var et=(e=__dirname)=>{let t=r=>(0,Tn.existsSync)((0,At.join)(r,"package.json")),n=(0,At.dirname)(e);if(t(e))return e;if(e==="/")throw new Error("Could not find package.json (package root)");return et(n)},oo=(e,t)=>{let n=e.find(Tn.existsSync);if(!n)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return n};var Mt=require("node:fs"),fo=require("node:path"),ho=require("ts-morph");var N=require("node:fs"),Se=require("node:path");var ao=e=>e.replace(/\./g,"-").toLowerCase(),so=e=>e.split(/[-.]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),ac=e=>({string:"z.string()",number:"z.number()",boolean:"z.boolean()",date:"z.string().datetime()",array:"z.array(z.unknown())",object:"z.record(z.unknown())","string?":"z.string().optional()","number?":"z.number().optional()","boolean?":"z.boolean().optional()"})[e.toLowerCase()]||`z.${e}()`,ic=e=>!e||Object.keys(e).length===0?` id: z.string(),
4
- createdAt: z.string(),`:Object.entries(e).map(([t,n])=>` ${t}: ${ac(n)},`).join(`
5
- `),$n=e=>e.endsWith("s")?e:e.endsWith("y")?`${e.slice(0,-1)}ies`:e.endsWith("ch")||e.endsWith("sh")?`${e}es`:`${e}s`,L=e=>{let t=ao(e),n=so(e),r=e.split(".")[0],o=e.split(".").slice(1).join("-"),s=$n(r).toUpperCase(),a=$n(r).toLowerCase(),i=so(`${$n(r)}.${o}`);return{eventName:t,contractName:`${i}Contract`,schemaName:`${n}Schema`,typeName:`${n}Data`,streamName:s,domain:a,event:o}},En=e=>{let t=tt(e);if((0,N.existsSync)(t))return!0;let{eventsPath:n}=C(),r=ao(e),o=(0,Se.join)(n,`${r}.ts`);return(0,N.existsSync)(o)},An=(e,t)=>{let{eventsPath:n}=C(),{contractName:r,schemaName:o,typeName:s,streamName:a,domain:i,event:c}=L(e),l=`import { createContract } from '@crossdelta/cloudevents'
2
+ "use strict";var Ic=Object.create;var Lr=Object.defineProperty;var Rc=Object.getOwnPropertyDescriptor;var Nc=Object.getOwnPropertyNames;var Mc=Object.getPrototypeOf,Oc=Object.prototype.hasOwnProperty;var P=(e,t)=>()=>(e&&(t=e(e=0)),t);var jc=(e,t)=>{for(var r in t)Lr(e,r,{get:t[r],enumerable:!0})},Fc=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Nc(t))!Oc.call(e,o)&&o!==r&&Lr(e,o,{get:()=>t[o],enumerable:!(n=Rc(t,o))||n.enumerable});return e};var u=(e,t,r)=>(r=e!=null?Ic(Mc(e)):{},Fc(t||!e||!e.__esModule?Lr(r,"default",{value:e,enumerable:!0}):r,e));var tu,Co,Hr,Ft=P(()=>{"use strict";tu=process.env.npm_package_version||"0.0.0",Co=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"],Hr="start:dev"});function Br(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||"",a=Math.max(...e.map(c=>c.value)),i=[];i.push(""),i.push(r),i.push("");for(let c of e){let l=_c(c.barColor??t?.barColor),p=Dc(c,a,o,l,s,t?.labelColor);i.push(p)}return n&&(i.push(""),i.push(n)),i.join(`
3
+ `)}function _c(e){return e?it.default[e]("\u2587"):"\u2587"}function Dc(e,t,r,n,o,s){let a=Math.round(e.value/t*r),i=e.barColor?it.default[e.barColor](n.repeat(a)):n.repeat(a),c=e.color??s;return`${it.default.bold(c?it.default[c](e.label.padEnd(12)):e.label.padEnd(12))} ${i} ${e.value.toLocaleString()}${o?` ${o}`:""}`}var it,xo=P(()=>{"use strict";it=u(require("chalk"))});var C,_t=P(()=>{"use strict";C={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 Ce,Dt,Wr=P(()=>{"use strict";_t();Ce=class extends Error{exitCode;category;hint;cause;constructor(t,r=C.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(`
4
+ Hint: ${this.hint}`),t.join("")}},Dt=class extends Ce{constructor(t="Operation cancelled",r={}){super(t,C.CANCELLED,{...r,category:"user"}),this.name="CancelledError"}}});var Ae,Lc,Lt,Hc,Bc,Ht,wo=P(()=>{"use strict";Ae=u(require("chalk"));Wr();_t();Lc=["ExitPromptError","ERR_USE_AFTER_CLOSE","Cancelled prompt","User force closed"],Lt=e=>e instanceof Dt?!0:e instanceof Error?Lc.some(t=>e.name?.includes(t)||e.message?.includes(t)):!1,Hc=e=>e instanceof Ce?Ae.default.red(`\u2716 ${e.toUserMessage()}`):e instanceof Error?Ae.default.red(`\u2716 ${e.message}`):Ae.default.red(`\u2716 ${String(e)}`),Bc=e=>e instanceof Ce?e.exitCode:Lt(e)?C.CANCELLED:C.GENERAL_ERROR,Ht=(e,t={})=>{let{debug:r=!1,exit:n=!0,logger:o=console.error}=t;if(Lt(e)){n&&process.exit(C.CANCELLED);return}o(Hc(e)),r&&e instanceof Error&&e.stack&&o(Ae.default.dim(e.stack)),e instanceof Ce&&e.hint&&o(Ae.default.dim(`
5
+ Hint: ${e.hint}`)),n&&process.exit(Bc(e))}});var Ie=P(()=>{"use strict";Wr();wo();_t()});var ue,Wt,Bt,Gr,Gt,Wc,bo,Ur,Gc,So,Jr=P(()=>{"use strict";ue=require("node:fs"),Wt=require("node:path"),Bt=u(require("chokidar"));g();v();Gr=".pf-generating",Gt=e=>(0,Wt.join)(e,Gr),Wc=e=>(0,ue.existsSync)(Gt(e)),bo=e=>{(0,ue.writeFileSync)(Gt(e),"","utf-8")},Ur=e=>{let t=Gt(e);(0,ue.existsSync)(t)&&(0,ue.unlinkSync)(t)},Gc=e=>{let r=U(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"}]},So=(e,t)=>{Ur(e);let r=Gc(e),n=Gt(e),s=Ut(async()=>{Wc(e)||await t()},300),a=[];a.push(Bt.default.watch(n,{ignoreInitial:!0}).on("unlink",()=>t()));for(let i of r){let c=(0,Wt.join)(e,i.path);if(!(0,ue.existsSync)(c))continue;let l=i.ignorePatterns?.map(p=>(0,Wt.join)(c,p));a.push(Bt.default.watch(c,{ignoreInitial:!0,depth:0,ignored:l,usePolling:!0,interval:1e3}).on("addDir",p=>p!==c&&s()).on("unlinkDir",p=>p!==c&&s())),a.push(Bt.default.watch(`${c}/*/package.json`,{ignoreInitial:!0,ignored:l}).on("add",s).on("change",s))}return async()=>{await Promise.all(a.map(i=>i.close()))}}});var Kr,To,zr,q,Uc,Po,Eo=P(()=>{"use strict";Kr=u(require("chalk")),To=require("commander"),zr=require("listr2");Ie();Jr();v();q=e=>{let t=new To.Command(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",()=>`${Kr.default.cyan.bold(`
6
+ Example:`)}
7
+ ${Kr.default.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 zr.Listr(Po(e.prompts,o),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(o),await new zr.Listr(Po(e.actions,o),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(o),await e.onComplete?.(o)},n=()=>{try{let o=y();return bo(o),o}catch{return null}};return t.action(async(...o)=>{let s=null;try{let a=o.at(-1),i=a.args,c=a.opts(),l=Uc(e.arguments??[],i);if(e.shouldSkipWorkflow?.(l,c)){await e.onSkipWorkflow?.(l,c);return}let p=await e.buildContext(l,c);s=n(),await r(p)}catch(a){Ht(a,{exit:!1})}finally{s&&Ur(s)}}),t},Uc=(e,t)=>{let r=e.map(([n],o)=>[n.replace(/[<>[\]]/g,""),t[o]]);return Object.fromEntries(r)},Po=(e,t)=>e.map(r=>typeof r=="function"?r(t):r)});var Ut,$o=P(()=>{"use strict";Ut=(e,t)=>{let r=null;return(...n)=>(r&&clearTimeout(r),new Promise(o=>{r=setTimeout(async()=>{r=null,await e(...n),o()},t)}))}});function Jt(e,t,r){let n=t.split("."),o=e;for(;n.length>1;){let s=n.shift();s in o||(o[s]={}),o=o[s]}o[n[0]]=r}var Ao=P(()=>{"use strict"});function ct(e){try{return(0,Io.execaSync)(e,["--version"]),!0}catch{return!1}}var Io,Vr=P(()=>{"use strict";Io=require("execa")});var Ro=P(()=>{"use strict";Vr()});function jo(){let e=(0,Mo.packageUpSync)({cwd:(0,Re.dirname)(__filename)});if(!e)throw new Error("Could not find package.json");return(0,Re.dirname)(e)}var Re,No,Mo,Oo,f,Kt,Fo,_o=P(()=>{"use strict";Re=require("node:path"),No=require("fs-extra"),Mo=require("package-up"),Oo=require("rimraf"),f=e=>(0,Re.join)(process.cwd(),e),Kt=e=>{try{return(0,No.readdirSync)(e).length===0}catch{return!0}};Fo=e=>(0,Oo.rimraf)(e)});var Ne,Do,Jc,Kc,zt,m,Lo=P(()=>{"use strict";Ne=u(require("chalk")),Do={debug:0,info:1,warn:2,error:3,silent:4},Jc=e=>e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent",Kc=()=>{let e=process.env.LOG_LEVEL;return Jc(e)?e:process.env.VERBOSE==="true"?"debug":"info"},zt=e=>{let t=Kc();return Do[e]>=Do[t]},m={logs:[],breakLine:()=>(console.log(),m),success:(e,...t)=>(console.log(Ne.default.green(`\u2714 ${e}`),...t),m),info:(e,...t)=>(zt("info")&&console.log(Ne.default.cyan(`\u{1F6C8} ${e}`),...t),m),warn:(e,...t)=>(zt("warn")&&console.warn(Ne.default.yellow(`\u26A0\uFE0E ${e}`),...t),m),error:(e,...t)=>(zt("error")&&console.error(Ne.default.red(`\u2716 ${e}`),...t),m),debug:(e,...t)=>(zt("debug")&&console.log(Ne.default.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 Ho=P(()=>{"use strict"});async function $(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 Vt(e,t,r){for(let n=0;n<t.length;n++){let o=t[n];e.output=Bo.default.dim(`[${n+1}/${t.length}] ${o.title}`),await o.fn(r??{},e)}}var Bo,Wo=P(()=>{"use strict";Bo=u(require("chalk"))});var g=P(()=>{"use strict";xo();Eo();$o();Ao();Ro();_o();Lo();Ho();Vr();Wo()});var Jo={};jc(Jo,{findWorkspaceRoot:()=>y,getContractsConfig:()=>w,getGeneratorConfig:()=>Me,getPackageJsonField:()=>Xr,getPkgJson:()=>Qr,getRootPackageScope:()=>be,getWorkspacePackageJson:()=>U,getWorkspacePathsConfig:()=>A,isInWorkspace:()=>Yr,pkgJson:()=>_,readPackageConfig:()=>pt,updatePackageJsonField:()=>Z});var xe,M,we,lt,zc,Zr,qt,Vc,qc,Go,Zc,Yc,Uo,Yr,y,U,A,w,be,Xc,Qc,Xr,Z,pt,qr,Qr,_,Me,v=P(()=>{"use strict";xe=require("node:fs"),M=require("node:path"),we=require("fs-extra");Ft();g();lt={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},zc={docs:{base:["service.md"],frameworks:{}},serviceTypes:{hono:{commandType:"hono-micro",entryPoint:"src/index.ts",skipFiles:[]},nest:{commandType:"nest-micro",entryPoint:"src/main.ts",skipFiles:[]}}},Zr=e=>{if(!(0,xe.existsSync)(e))return null;try{return JSON.parse((0,xe.readFileSync)(e,"utf-8"))}catch{return null}},qt=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,Vc=e=>e.split("/").pop()||"workspace",qc=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},Go=e=>e.split("."),Zc=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||(0,xe.existsSync)((0,M.join)(t,"turbo.json")))return!0;let r=Co.some(o=>(0,xe.existsSync)((0,M.join)(t,o))),n=(0,xe.existsSync)((0,M.join)(t,"infra"));return r&&n},Yc=e=>{let t=Zr((0,M.join)(e,"package.json"));return t?Zc(t,e):!1},Uo=e=>{let t=e;for(;t;){if(Yc(t))return t;t=qc(t)}return null},Yr=()=>Uo(process.cwd())!==null,y=()=>{let e=Uo(process.cwd());if(!e)throw new Error(`
9
+ \x1B[31m\u2716\x1B[0m Not in a workspace directory
10
+
11
+ Current directory: ${process.cwd()}
12
+
13
+ This command must be run from within a workspace created with \x1B[36mpf new workspace\x1B[0m
14
+
15
+ To create a new workspace, run:
16
+
17
+ \x1B[36mpf new workspace my-platform\x1B[0m
18
+ `);return e},U=e=>{let t=e??y();return Zr((0,M.join)(t,"package.json"))},A=e=>{let t=U(e);if(!t?.pf?.paths)return lt;let{paths:r}=t.pf;return{services:qt(r.services,lt.services),apps:qt(r.apps,lt.apps),packages:qt(r.packages,lt.packages),contracts:qt(r.contracts,lt.contracts)}},w=e=>{let t=e??y(),r=A(t),n=(0,M.join)(t,r.contracts);return{packagePath:n,eventsPath:(0,M.join)(n,"src","events"),indexPath:(0,M.join)(n,"src","index.ts"),relativePath:r.contracts}},be=()=>{let e=y(),t=Zr((0,M.join)(e,"package.json")),r=`@${Vc(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:r},Xc=(e,t)=>{let r=Go(t),n=e;for(let o of r){if(n===null||typeof n!="object"||!(o in n))return;n=n[o]}return n},Qc=(e,t,r)=>{let n=Go(t),o=n[n.length-1],s=e;for(let a of n.slice(0,-1))(!(a in s)||typeof s[a]!="object"||s[a]===null)&&(s[a]={}),s=s[a];s[o]=r},Xr=(e,t=process.cwd())=>{let r=(0,we.readJsonSync)((0,M.join)(t,"package.json"));return Xc(r,e)},Z=(e,t,r=process.cwd())=>{let n=(0,M.join)(r,"package.json"),o=(0,we.readJsonSync)(n);Qc(o,e,t),(0,we.writeJsonSync)(n,o,{spaces:2,EOL:`
19
+ `,encoding:"utf-8"})},pt=e=>{let t=jo();return(0,we.readJSONSync)((0,M.resolve)(t,e),{encoding:"utf-8"})},qr=null,Qr=()=>(qr||(qr=pt("package.json")),qr),_=new Proxy({},{get:(e,t)=>Qr()[t]}),Me=()=>Qr().generatorConfig??zc});var wc=require("node:process"),st=u(require("chalk")),bc=require("commander"),Sc=u(require("terminal-link"));var cs=u(require("chalk")),ls=require("commander");v();var es=require("node:fs"),ts=require("node:path"),nn=require("node:process"),rs=require("execa");g();var rn=require("node:child_process"),Zo=require("node:path"),Yo=require("execa");g();var Ko=require("node:fs"),zo=require("node:path"),Vo=require("dotenv"),en=(e,t)=>{let r=(0,zo.resolve)(t,e);return(0,Ko.existsSync)(r)?(0,Vo.config)({path:r,processEnv:{}}).parsed||{}:{}},qo=(e,t)=>{let r=en(e,t),n=[];for(let[o,s]of Object.entries(r))if(o.endsWith("_PORT")&&s){let a=Number.parseInt(s,10);!Number.isNaN(a)&&a>0&&n.push(a)}return n};var tn={...process.env,NODE_NO_WARNINGS:"1"},el=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",tl=(e,t,r)=>e?{...tn,...e}:t||r?{...tn,CI:"true"}:{...tn},rl=e=>e.includes("EEXIST")||e.includes("failed to link package");async function ge(e,t,{cwd:r=process.cwd(),task:n,shell:o,context:s=e,quiet:a=!1,nonInteractive:i=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let l=(0,Yo.execa)(e,t,{cwd:r,stdio:el(a,n,i),all:n||i?!0:void 0,shell:o??!0,env:tl(c,n,i)});l.all&&l.all.on("data",p=>{let d=p.toString().trim();n?(n.output=d,d.length&&m.storeLog(d,s)):i&&d.length&&console.log(d)}),await l}catch(l){let p=l instanceof Error?l.message:String(l);if(rl(p))return;throw new Error(nl(p))}}var nl=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function Xo(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:a=!1,onStdout:i,onStderr:c,onExit:l}=r,p=o?en(o,n):{},d=(0,Zo.resolve)(n,"node_modules",".bin"),x=process.env.PATH||"",H=`${d}:${x}`,at={...process.env,...p,PATH:H,FORCE_COLOR:"1"},B=(0,rn.spawn)(e,t,{cwd:n,env:at,stdio:["inherit",a?"pipe":"inherit","pipe"],detached:s});return i&&a&&B.stdout?.on("data",i),c&&B.stderr?.on("data",c),l&&B.on("exit",l),B}function Zt(e,t,r={}){let{cwd:n=process.cwd()}=r;(0,rn.spawn)(e,t,{cwd:n,stdio:"inherit",shell:!0}).on("exit",s=>process.exit(s||0))}async function Qo(e){let{execSync:t}=await import("node:child_process");for(let r of e)try{let o=t(`lsof -ti:${r}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
20
+ `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}v();var Yt=e=>ct(e);function on(e=process.cwd()){let t=r=>(0,es.existsSync)((0,ts.join)(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 T(e){return on(e)??sn()}function sn(){return Yt("bun")?"bun":Yt("pnpm")?"pnpm":Yt("yarn")?"yarn":"npm"}function ns(){return["bun","pnpm","yarn","npm"].filter(Yt)}async function Y(e,t){let r=sl(e,t),{mergedOptions:n,packages:o}=r,{cwd:s=process.cwd(),flags:a=[],task:i,quiet:c}=n,l=n.packageManager??T(),p=[],d=Array.isArray(o)?o:[o];l==="bun"&&(d=d.map(H=>H.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 x=d.length?l==="npm"?["install",...a,...p,...d]:["add",...a,...p,...d]:["install",...a,...p];await ge(l,x,{cwd:s,task:i,quiet:c})}async function os(e){let t=["-g"],r=[...e.flags??[],...t];await Y({...e,flags:r,packageManager:e.packageManager??T()})}function ss(e,t,r){let{args:n,mergedOptions:o}=is(t??[],r),s=o.manager??T(),{command:a,args:i}=as(s);console.log(`
21
+ Running command: ${a} ${[...i,e,...n].join(" ")}
22
+ `),(0,rs.execaSync)(a,[...i,e,...n],{cwd:o.cwd??(0,nn.cwd)(),stdio:"inherit",preferLocal:!0})}async function ie(e,t,r){let{args:n,mergedOptions:o}=is(t??[],r),s=o.manager??T(),{command:a,args:i}=as(s);await ge(a,[...i,e,...n],o)}async function mt(e,t){let{script:r,mergedOptions:n}=al(e,t),o=n.packageManager??T();await ge(o,["run",r,...n.args??[]],{cwd:n.cwd??(0,nn.cwd)(),task:n.task})}function as(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 sl(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function is(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function al(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var il=e=>e==="yarn"?["npm","audit"]:["audit"],ps=new ls.Command("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{let r=y(),n=T(),o=il(n),s=t.args||[];console.log(cs.default.dim(`Running ${n} ${[...o,...s].join(" ")}`)),Zt(n,[...o,...s],{cwd:r})});var ke=require("@listr2/prompt-adapter-enquirer"),me=u(require("chalk"));var je=require("node:fs"),ys=require("node:os"),ks=require("node:path");var fe=require("node:crypto"),Oe=require("node:fs"),Se=require("node:os"),ms=require("node:path"),an=(0,ms.join)((0,Se.homedir)(),".platform-sdk-keys"),ds="aes-256-gcm",us=()=>{let e=`${(0,Se.hostname)()}:${(0,Se.userInfo)().username}:${(0,Se.homedir)()}`;return(0,fe.createHash)("sha256").update(e).digest()},gs=()=>{if(!(0,Oe.existsSync)(an))return{};try{return JSON.parse((0,Oe.readFileSync)(an,"utf-8"))}catch{return{}}},cl=e=>{(0,Oe.writeFileSync)(an,JSON.stringify(e,null,2),{mode:384})},ll=e=>{let t=us(),r=(0,fe.randomBytes)(16),n=(0,fe.createCipheriv)(ds,t,r),o=n.update(e,"utf8","hex");return o+=n.final("hex"),{iv:r.toString("hex"),tag:n.getAuthTag().toString("hex"),data:o}},pl=e=>{let t=us(),r=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),o=(0,fe.createDecipheriv)(ds,t,r);o.setAuthTag(n);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function fs(e,t){let r=gs();r[e]=ll(t),cl(r)}async function Xt(e){let r=gs()[e];if(!r)return null;try{return pl(r)}catch{return null}}var dt={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 hs(){return Object.entries(dt).map(([e,t])=>({name:t.name,value:e}))}function ut(e){let t=dt[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var Pe=(0,ks.join)((0,ys.homedir)(),".platform-sdk-ai.json"),ml=()=>{let e="anthropic",t=dt[e];return{provider:e,model:t.defaultModel}},cn=ml();function gt(){return(0,je.existsSync)(Pe)}function Qt(){if(!gt())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=(0,je.readFileSync)(Pe,"utf-8"),t=JSON.parse(e);return{...cn,...t}}catch{throw new Error(`Failed to load AI configuration from ${Pe}. Please run 'pf setup --ai' again.`)}}function vs(e){let t=JSON.stringify(e,null,2);(0,je.writeFileSync)(Pe,t,"utf-8")}async function Cs(e,t){await fs(e,t)}async function xs(e){let t=await Xt(e.provider);if(t)return t;let r=dt[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 dl=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 d of(await l).textStream)p+=d,n.onToken(d);return p}let{generateText:a}=await import("ai"),{text:i}=await a({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return i},ul=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 d of(await l).textStream)p+=d,n.onToken(d);return p}let{generateText:a}=await import("ai"),{text:i}=await a({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return i};async function ws(e,t,r={}){let{system:n,maxTokens:o=4096,temperature:s=.7,onToken:a}=r,i=await xs(e);switch(e.provider){case"openai":return dl(t,e.model,i,{system:n,maxTokens:o,temperature:s,onToken:a});case"anthropic":return ul(t,e.model,i,{system:n,maxTokens:o,temperature:s,onToken:a});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}var ce=require("node:fs"),Be=require("node:path"),aa=require("@inquirer/prompts"),k=u(require("chalk")),ia=u(require("ora"));Ie();var Fe=require("node:fs"),ft=require("node:path");Jr();var ht=(e=__dirname)=>{let t=n=>(0,Fe.existsSync)((0,ft.join)(n,"package.json")),r=(0,ft.dirname)(e);if(t(e))return e;if(e==="/")throw new Error("Could not find package.json (package root)");return ht(r)},bs=(e,t)=>{let r=e.find(Fe.existsSync);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},Ss=async e=>{let{getWorkspacePathsConfig:t}=await Promise.resolve().then(()=>(v(),Jo)),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=(0,ft.join)(e,o);if(!(0,Fe.existsSync)(s))return[];try{return(0,Fe.readdirSync)(s,{withFileTypes:!0}).filter(a=>a.isDirectory()&&a.name!==".gitkeep").map(a=>`${o}/${a.name}`)}catch{return[]}})};var sr=require("node:fs"),js=require("node:path"),Fs=require("ts-morph");var O=require("node:fs"),Te=require("node:path"),er=require("@crossdelta/cloudevents");v();var Ts=e=>e.replace(/\./g,"-").toLowerCase(),Ps=e=>e.split(/[-.]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),gl=e=>{let r={string:"z.string()",number:"z.number()",boolean:"z.boolean()",date:"z.string().datetime()",datetime:"z.string().datetime()",array:"z.array(z.unknown())",object:"z.record(z.unknown())","string?":"z.string().optional()","number?":"z.number().optional()","boolean?":"z.boolean().optional()","date?":"z.string().datetime().optional()","datetime?":"z.string().datetime().optional()"}[e.toLowerCase()];return r||(console.warn(`Unknown field type "${e}", using z.string()`),"z.string()")},fl=e=>!e||Object.keys(e).length===0?` id: z.string(),
23
+ createdAt: z.string(),`:Object.entries(e).map(([t,r])=>` ${t}: ${gl(r)},`).join(`
24
+ `),J=e=>{let t=Ts(e),r=Ps(e),n=e.split(".")[0],o=e.split(".").slice(1).join("-"),s=(0,er.pluralize)(n).toUpperCase(),a=(0,er.pluralize)(n).toLowerCase(),i=Ps(`${(0,er.pluralize)(n)}.${o}`);return{eventName:t,contractName:`${i}Contract`,schemaName:`${r}Schema`,typeName:`${r}Data`,streamName:s,domain:a,event:o}},tr=e=>{let t=yt(e);if((0,O.existsSync)(t))return!0;let{eventsPath:r}=w(),n=Ts(e),o=(0,Te.join)(r,`${n}.ts`);if((0,O.existsSync)(o))return!0;let s=e.split(".")[0],a=e.split(".").slice(1).join("-"),i=(0,Te.join)(r,s,`${a}.ts`);return(0,O.existsSync)(i)},ln=(e,t)=>{let{eventsPath:r}=w(),{contractName:n,schemaName:o,typeName:s,streamName:a,domain:i,event:c}=J(e),l=`import { createContract } from '@crossdelta/cloudevents'
6
25
  import { z } from 'zod'
7
26
 
8
27
  export const ${o} = z.object({
9
- ${ic(t)}
28
+ ${fl(t)}
10
29
  })
11
30
 
12
- export const ${r} = createContract({
31
+ export const ${n} = createContract({
13
32
  type: '${e}',
14
33
  channel: { stream: '${a}' },
15
34
  schema: ${o},
16
35
  })
17
36
 
18
- export type ${s} = z.infer<typeof ${r}.schema>
19
- `,p=(0,Se.join)(n,i),d=(0,Se.join)(p,`${c}.ts`);return(0,N.existsSync)(p)||(0,N.mkdirSync)(p,{recursive:!0}),(0,N.writeFileSync)(d,l,"utf-8"),d},tt=e=>{let{eventsPath:t}=C(),{domain:n,event:r}=L(e);return(0,Se.join)(t,n,`${r}.ts`)},In=e=>{let t=tt(e);if(!(0,N.existsSync)(t))return null;let n=(0,N.readFileSync)(t,"utf-8"),r=n.match(/export const \w+Schema\s*=\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);if(r)return r[1];let o=n.match(/schema:\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);return o?o[1]:null},Nn=()=>{let{packagePath:e}=C(),t=(0,Se.join)(e,"package.json");if(!(0,N.existsSync)(t))return"@my-platform";try{return JSON.parse((0,N.readFileSync)(t,"utf-8")).name?.split("/")[0]??"@my-platform"}catch{return"@my-platform"}};var Nt=require("node:fs"),jn=require("node:path");var T=require("node:fs"),Pe=require("node:path");var It=e=>{let{streamName:t}=L(e);return t},io=(e,t)=>{let n=(0,Pe.join)(e,"src","index.ts");if(!(0,T.existsSync)(n))return!1;let r=(0,T.readFileSync)(n,"utf-8"),o=t.toLowerCase();return new RegExp(`streams:\\s*\\[[^\\]]*['"]${t}['"]`).test(r)||r.includes(`stream: '${t}'`)?!0:new RegExp(`subjects:\\s*\\[.*['"]${o}\\.[*>]`).test(r)},cc=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
20
- `,n=e.match(/import\s+['"]@crossdelta\/telemetry['"]\s*\n/);if(n){let o=(n.index??0)+n[0].length;return`${e.slice(0,o)}
21
- ${t}${e.slice(o)}`}let r=e.match(/import\s+.*\n/);if(r){let o=(r.index??0)+r[0].length;return e.slice(0,o)+t+e.slice(o)}return e},lc=(e,t,n)=>`
37
+ export type ${s} = z.infer<typeof ${n}.schema>
38
+ `,p=(0,Te.join)(r,i),d=(0,Te.join)(p,`${c}.ts`);return(0,O.existsSync)(p)||(0,O.mkdirSync)(p,{recursive:!0}),(0,O.writeFileSync)(d,l,"utf-8"),d},yt=e=>{let{eventsPath:t}=w(),{domain:r,event:n}=J(e);return(0,Te.join)(t,r,`${n}.ts`)},pn=e=>{let t=yt(e);if(!(0,O.existsSync)(t))return null;let r=(0,O.readFileSync)(t,"utf-8"),n=r.match(/export const \w+Schema\s*=\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);if(n)return n[1];let o=r.match(/schema:\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);return o?o[1]:null},mn=()=>{let{packagePath:e}=w(),t=(0,Te.join)(e,"package.json");if(!(0,O.existsSync)(t))return"@my-platform";try{return JSON.parse((0,O.readFileSync)(t,"utf-8")).name?.split("/")[0]??"@my-platform"}catch{return"@my-platform"}};var nr=require("node:fs"),gn=require("node:path"),$s=require("@crossdelta/cloudevents");var R=require("node:fs"),_e=require("node:path");var rr=e=>{let{streamName:t}=J(e);return t},Es=(e,t)=>{let r=(0,_e.join)(e,"src","index.ts");if(!(0,R.existsSync)(r))return!1;let n=(0,R.readFileSync)(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)},hl=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
39
+ `,r=e.match(/import\s+['"]@crossdelta\/telemetry['"]\s*\n/);if(r){let o=(r.index??0)+r[0].length;return`${e.slice(0,o)}
40
+ ${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},yl=(e,t,r)=>`
22
41
 
23
42
  // Consume from ${e} stream
24
43
  consumeJetStreams({
25
44
  streams: ['${e}'],
26
- consumer: '${n}-service',
45
+ consumer: '${r}-service',
27
46
  discover: './src/events/**/*.handler.ts',
28
- })`,Rn=(e,t)=>{let n=It(t),r=t.split(".")[0],o=(0,Pe.join)(e,"src","index.ts"),s=(0,Pe.join)(e,"src","main.ts");if(!(0,T.existsSync)(o)&&(0,T.existsSync)(s))return{added:!1,streamName:n};if(!(0,T.existsSync)(o))return{added:!1,streamName:n,warning:"Entry point not found (index.ts or main.ts)"};if(io(e,n))return{added:!1,streamName:n};let a=(0,T.readFileSync)(o,"utf-8"),i=e.split("/").pop()||"unknown";a.includes("consumeJetStreams")||(a=cc(a));let c=lc(n,r,i),l=`${a.trimEnd()+c}
29
- `;return(0,T.writeFileSync)(o,l,"utf-8"),{added:!0,streamName:n}},Mn=(e,t)=>{let{eventName:n,contractName:r,typeName:o}=L(e),s=Nn(),a=(0,Pe.join)(t,"src","events"),i=(0,Pe.join)(a,`${n}.handler.ts`);if((0,T.existsSync)(i))return null;let c=`import { handleEvent } from '@crossdelta/cloudevents'
30
- import { ${r}, type ${o} } from '${s}/contracts'
47
+ })`,dn=(e,t)=>{let r=rr(t),n=t.split(".")[0],o=(0,_e.join)(e,"src","index.ts"),s=(0,_e.join)(e,"src","main.ts");if(!(0,R.existsSync)(o)&&(0,R.existsSync)(s))return{added:!1,streamName:r};if(!(0,R.existsSync)(o))return{added:!1,streamName:r,warning:"Entry point not found (index.ts or main.ts)"};if(Es(e,r))return{added:!1,streamName:r};let a=(0,R.readFileSync)(o,"utf-8"),i=e.split("/").pop()||"unknown";a.includes("consumeJetStreams")||(a=hl(a));let c=yl(r,n,i),l=`${a.trimEnd()+c}
48
+ `;return(0,R.writeFileSync)(o,l,"utf-8"),{added:!0,streamName:r}},un=(e,t)=>{let{eventName:r,contractName:n,typeName:o}=J(e),s=mn(),a=(0,_e.join)(t,"src","events"),i=(0,_e.join)(a,`${r}.handler.ts`);if((0,R.existsSync)(i))return null;let c=`import { handleEvent } from '@crossdelta/cloudevents'
49
+ import { ${n}, type ${o} } from '${s}/contracts'
31
50
 
32
- export default handleEvent(${r}, async (data: ${o}) => {
51
+ export default handleEvent(${n}, async (data: ${o}) => {
33
52
  // TODO: Implement event handling logic
34
53
  console.log('Received ${e}:', data)
35
54
  })
36
- `;return(0,T.existsSync)(a)||(0,T.mkdirSync)(a,{recursive:!0}),(0,T.writeFileSync)(i,c,"utf-8"),i};var co=e=>{try{return(0,Nt.readdirSync)(e,{withFileTypes:!0}).flatMap(n=>{let r=(0,jn.join)(e,n.name);return n.isDirectory()?co(r):n.name.endsWith(".handler.ts")?[r]:[]})}catch{return[]}},Fn=e=>{let t=(0,jn.join)(e,"src","events");return co(t).flatMap(r=>{let o=(0,Nt.readFileSync)(r,"utf-8");return pc(r,o)})},pc=(e,t)=>{let n=mc(t);if(!n)return[];let s=(n.replace(/Contract$/,"").match(/[A-Z][a-z]*/g)??[]).map(a=>a.toLowerCase()).join(".");return[{filePath:e,eventType:s,contractName:n}]},mc=e=>{let n=/import\s+{([^}]+)}\s+from\s+['"]@[\w-]+\/contracts['"]/.exec(e);return n?n[1].split(",").map(s=>s.trim()).filter(s=>s.endsWith("Contract")).map(s=>s.replace(/\s+as\s+.+$/,"").trim()).at(0)??null:null},On=e=>{let t=e.reduce((n,r)=>{let o=r.eventType.split(".")[0],s=n.get(o)??[];return n.set(o,[...s,r]),n},new Map);return Array.from(t.entries()).map(([n,r])=>dc(n,r)).sort((n,r)=>n.stream.localeCompare(r.stream))},dc=(e,t)=>{let n=It(t[0]?.eventType??`${e}.event`),r=`${e}.>`;return{stream:n,subjects:[r],handlers:t}},_n=(e,t)=>e.length===0?"":` // Services NEVER create streams!
55
+ `;return(0,R.existsSync)(a)||(0,R.mkdirSync)(a,{recursive:!0}),(0,R.writeFileSync)(i,c,"utf-8"),i};var As=e=>{try{return(0,nr.readdirSync)(e,{withFileTypes:!0}).flatMap(r=>{let n=(0,gn.join)(e,r.name);return r.isDirectory()?As(n):r.name.endsWith(".handler.ts")?[n]:[]})}catch{return[]}},fn=e=>{let t=(0,gn.join)(e,"src","events");return As(t).flatMap(n=>{let o=(0,nr.readFileSync)(n,"utf-8");return kl(n,o)})},kl=(e,t)=>{let r=vl(t);if(!r)return[];let s=(r.replace(/Contract$/,"").match(/[A-Z][a-z]*/g)??[]).map(a=>a.toLowerCase()).join(".");return[{filePath:e,eventType:s,contractName:r}]},vl=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},hn=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])=>Cl(r,n)).sort((r,n)=>r.stream.localeCompare(n.stream))},Cl=(e,t)=>{let r=rr(t[0]?.eventType??`${e}.event`),o=`${(0,$s.pluralize)(e)}.>`;return{stream:r,subjects:[o],handlers:t}},yn=(e,t)=>e.length===0?"":` // Services NEVER create streams!
37
56
  // - Development: pf dev auto-creates ephemeral streams from contracts
38
57
  // - Production: Pulumi materializes persistent streams
39
58
 
40
59
  consumeJetStreams({
41
- streams: [${e.map(n=>`'${n.stream}'`).join(", ")}],
60
+ streams: [${e.map(r=>`'${r.stream}'`).join(", ")}],
42
61
  consumer: '${t}',
43
62
  discover: './src/events/**/*.handler.ts',
44
- })`;var v=require("node:fs"),K=require("node:path");var uc=(e,t)=>{let n=`export * from './${t}'`;if(!(0,v.existsSync)(e)){let s=(0,K.dirname)(e);(0,v.existsSync)(s)||(0,v.mkdirSync)(s,{recursive:!0});let a=`/**
45
- * ${(0,K.dirname)(e).split("/").pop()} Domain Events
63
+ })`;var b=require("node:fs"),X=require("node:path");v();var xl=(e,t)=>{let r=`export * from './${t}'`;if(!(0,b.existsSync)(e)){let s=(0,X.dirname)(e);(0,b.existsSync)(s)||(0,b.mkdirSync)(s,{recursive:!0});let a=`/**
64
+ * ${(0,X.dirname)(e).split("/").pop()} Domain Events
46
65
  */
47
66
 
48
- `;return(0,v.writeFileSync)(e,a+n+`
49
- `,"utf-8"),!0}let r=(0,v.readFileSync)(e,"utf-8");if(r.includes(`'./${t}'`))return!1;let o=r.trimEnd()+`
50
- `+n+`
51
- `;return(0,v.writeFileSync)(e,o,"utf-8"),!0},gc=(e,t)=>{let n=`export * from './${t}'`;if(!(0,v.existsSync)(e))return(0,v.writeFileSync)(e,`/**
67
+ `;return(0,b.writeFileSync)(e,a+r+`
68
+ `,"utf-8"),!0}let n=(0,b.readFileSync)(e,"utf-8");if(n.includes(`'./${t}'`))return!1;let o=n.trimEnd()+`
69
+ `+r+`
70
+ `;return(0,b.writeFileSync)(e,o,"utf-8"),!0},wl=(e,t)=>{let r=`export * from './${t}'`;if(!(0,b.existsSync)(e))return(0,b.writeFileSync)(e,`/**
52
71
  * Event Contracts Index
53
72
  *
54
73
  * Re-exports all event contracts for convenient importing.
55
74
  */
56
75
 
57
- `+n+`
58
- `,"utf-8"),!0;let o=(0,v.readFileSync)(e,"utf-8").split(`
59
- `);if(o.some(a=>a.trim()===n))return!1;let s=o.findLastIndex(a=>a.startsWith("export"));return s>=0?o.splice(s+1,0,n):o.push(n),(0,v.writeFileSync)(e,o.join(`
60
- `),"utf-8"),!0},fc=e=>{if(!(0,v.existsSync)(e))return!1;let t=(0,v.readFileSync)(e,"utf-8"),n=t;return n=n.replace(/\/\/ export \* from '\.\/events'/,"export * from './events'"),n=n.replace(/\/\/ export \* from '\.\/stream-policies'/,"export * from './stream-policies'"),n!==t?((0,v.writeFileSync)(e,n,"utf-8"),!0):!1},Dn=e=>{let{packagePath:t}=C(),{domain:n,event:r}=L(e),o=(0,K.join)(t,"src","events"),s=(0,K.join)(o,n),a=(0,K.join)(s,"index.ts"),i=(0,K.join)(o,"index.ts"),c=(0,K.join)(t,"src","index.ts"),l=e.split(".")[0],p=(0,K.join)(o,l);l!==n&&(0,v.existsSync)(p)&&(console.warn(`\u26A0\uFE0F Warning: Legacy folder '${l}/' found. Please migrate to '${n}/' to avoid conflicts.`),console.warn(` Run: mv ${p} ${s}`));let d=!1;return uc(a,r)&&(d=!0),gc(i,n)&&(d=!0),fc(c)&&(d=!0),d},Ln=(e,t)=>{if(!(0,v.existsSync)(e))return!1;let n=`export * from './events/${t}'`,r=(0,v.readFileSync)(e,"utf-8");if(r.includes(`'./events/${t}'`))return!1;let o=r.split(`
61
- `),s=o.findLastIndex(a=>a.startsWith("export"));return s>=0?o.splice(s+1,0,n):o.push("",n),(0,v.writeFileSync)(e,o.join(`
62
- `),"utf-8"),!0};var b=require("node:fs"),z=require("node:path"),f=require("@faker-js/faker");var lo=[{pattern:"email",generate:()=>f.faker.internet.email(),hint:"email"},{pattern:"id",generate:()=>f.faker.string.uuid(),hint:"uuid"},{pattern:"firstname",generate:()=>f.faker.person.firstName(),hint:"firstName"},{pattern:"lastname",generate:()=>f.faker.person.lastName(),hint:"lastName"},{pattern:"name",generate:()=>f.faker.person.fullName(),hint:"fullName"},{pattern:"phone",generate:()=>f.faker.phone.number(),hint:"phoneNumber"},{pattern:"address",generate:()=>f.faker.location.streetAddress(),hint:"streetAddress"},{pattern:"street",generate:()=>f.faker.location.streetAddress(),hint:"streetAddress"},{pattern:"city",generate:()=>f.faker.location.city(),hint:"city"},{pattern:"country",generate:()=>f.faker.location.country(),hint:"country"},{pattern:"price",generate:()=>f.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"amount",generate:()=>f.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"total",generate:()=>f.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"quantity",generate:()=>f.faker.number.int({min:1,max:10}),hint:"quantity"},{pattern:"date",generate:()=>f.faker.date.recent().toISOString(),hint:"date"},{pattern:"createdat",generate:()=>f.faker.date.recent().toISOString(),hint:"date"},{pattern:"updatedat",generate:()=>f.faker.date.recent().toISOString(),hint:"date"}],po=e=>({email:()=>f.faker.internet.email(),datetime:()=>f.faker.date.recent().toISOString(),url:()=>f.faker.internet.url(),uuid:()=>f.faker.string.uuid(),date:()=>f.faker.date.recent().toISOString().split("T")[0],time:()=>f.faker.date.recent().toISOString().split("T")[1]?.split(".")[0]})[e]?.()??f.faker.lorem.word(),mo=e=>{let t=e.toLowerCase(),n=lo.find(r=>t.includes(r.pattern));return n?{value:n.generate(),hint:n.hint}:null},hc=(e,t)=>{if(e.format)return po(e.format);let n=mo(t);if(n)return n.value;switch(e.type){case"string":return f.faker.lorem.word();case"number":return f.faker.number.int({min:1,max:100});case"boolean":return f.faker.datatype.boolean();case"array":return e.element?[Hn(e.element)]:[];case"object":return Hn(e);default:return null}},Hn=e=>{let t={},n=e.shape??(typeof e.def?.shape=="function"?e.def.shape():void 0);if(!n)return t;for(let[r,o]of Object.entries(n))t[r]=hc(o,r);return t},yc=async e=>{try{let{createJiti:t}=await import("jiti"),r=t(process.cwd(),{interopDefault:!0})(e),o=Object.entries(r).find(([s])=>s.endsWith("Schema")||s==="schema");if(o?.[1]){let s=o[1],a=Hn(s);if(a&&typeof a=="object"&&Object.keys(a).length>0){let i={};return Bn(a,i,""),{data:a,faker:i}}}}catch{}return null},Bn=(e,t,n)=>{if(!(!e||typeof e!="object"))for(let[r,o]of Object.entries(e)){let s=n?`${n}.${r}`:r,a=r.toLowerCase(),i=lo.find(c=>a.includes(c.pattern));i&&(i.hint!=="uuid"||typeof o=="string")&&(t[s]=i.hint),typeof o=="object"&&o!==null&&!Array.isArray(o)?Bn(o,t,s):Array.isArray(o)&&o.length>0&&typeof o[0]=="object"&&Bn(o[0],t,`${s}[0]`)}},kc=e=>({string:()=>f.faker.lorem.word(),number:()=>f.faker.number.int({min:1,max:100}),boolean:()=>f.faker.datatype.boolean()})[e]?.(),vc=(e,t,n)=>{let r=/(\w+):\s*z\.(\w+)\(/g,o=Array.from(e.matchAll(r));for(let[,s,a]of o){if(a==="array"||a==="object")continue;let i=mo(s);if(i)t[s]=i.value,i.hint&&(n[s]=i.hint);else{let c=kc(a);c!==void 0&&(t[s]=c)}}},Cc=(e,t,n)=>{let r=/(\w+):\s*z\.string\(\)\.(datetime|email|url|uuid)\(\)/g,o=Array.from(e.matchAll(r));for(let[,s,a]of o)t[s]=po(a),n[s]=a==="datetime"?"date":a},uo=e=>{let t={},n={};return vc(e,t,n),Cc(e,t,n),{data:t,faker:n}},Rt=async e=>{let{eventsPath:t}=C(),n=tt(e);if(!(0,b.existsSync)(n))return null;let o=(0,b.readFileSync)(n,"utf-8").match(/type:\s*['"]([^'"]+)['"]/),s=o?o[1]:e,a=await yc(n);if(!a){let k=In(e);k&&(a=uo(k))}if(!a)return null;let i={eventName:s,description:`Mock data for ${s} event`,data:a.data};Object.keys(a.faker).length>0&&(i.faker=a.faker);let{domain:c,event:l}=L(e),p=(0,z.join)(t,c,`${l}.mock.json`),d=(0,z.join)(t,c);return(0,b.existsSync)(d)||(0,b.mkdirSync)(d,{recursive:!0}),(0,b.writeFileSync)(p,JSON.stringify(i,null,2),"utf-8"),p};var go=e=>{let t=e.match(/import\s+\{[^}]*?(\w+Contract)[^}]*?\}\s+from\s+['"][^'"]+\/contracts['"]/);return t?t[1].replace("Contract","").replace(/([A-Z])/g,(r,o,s)=>(s>0?".":"")+o.toLowerCase()):null},xc=(e,t,n)=>{if(!(0,b.existsSync)(e))return!1;let r=(0,b.readFileSync)(e,"utf-8"),o=r.match(/export const \w+(?:Schema|Data)\s*=\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m)??r.match(/schema:\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);if(!o)return!1;let s=uo(o[1]),a={eventName:n,description:`Mock data for ${n} event`,data:s.data};return Object.keys(s.faker).length>0&&(a.faker=s.faker),(0,b.writeFileSync)(t,JSON.stringify(a,null,2)),!0},Wn=async(e,t={})=>{let n=(0,z.join)(e,"src","events");if(!(0,b.existsSync)(n))return{mockPaths:[],skippedHandlers:[]};let r=(0,b.readdirSync)(n).filter(a=>a.endsWith(".event.ts")).map(a=>(0,z.join)(n,a)),o=[],s=[];for(let a of r){let i=(0,b.readFileSync)(a,"utf-8"),c=go(i);if(!c){s.push(`${(0,z.basename)(a)} (Handler does not use contracts)`);continue}let{eventName:l}=L(c),p=t.outputDir??C().eventsPath,d=(0,z.join)(p,`${l}.mock.json`);if((0,b.existsSync)(d)&&!t.overwrite){s.push(`${(0,z.basename)(a)} (Mock already exists)`);continue}if(t.outputDir){let I=(0,z.join)(t.outputDir,`${l}.ts`);xc(I,d,c)&&o.push(d);continue}let k=await Rt(c);k&&o.push(k)}return{mockPaths:o,skippedHandlers:s}};var yo=e=>{let t=e.split("/").pop()||"service",n=(0,fo.join)(e,"src","events","events.service.ts");if(!(0,Mt.existsSync)(n))return!1;let r=Fn(e);if(r.length===0||(0,Mt.readFileSync)(n,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let i=On(r),c=_n(i,t);if(!c)return!1;let l=new ho.Project({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(n),d=!1;for(let k of p.getClasses()){let I=k.getMethod("startConsumers");if(!I)continue;let O=[...c.split(`
76
+ `+r+`
77
+ `,"utf-8"),!0;let o=(0,b.readFileSync)(e,"utf-8").split(`
78
+ `);if(o.some(a=>a.trim()===r))return!1;let s=o.findLastIndex(a=>a.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push(r),(0,b.writeFileSync)(e,o.join(`
79
+ `),"utf-8"),!0},bl=e=>{if(!(0,b.existsSync)(e))return!1;let t=(0,b.readFileSync)(e,"utf-8"),r="export * from './events'";if(t.includes(r))return!1;let n=t;return n=n.replace(/\/\/\s*export \* from '\.\/events'/,r),n=n.replace(/\/\/\s*export \* from '\.\/stream-policies'/,"export * from './stream-policies'"),/export \* from '\.\/events\/\w+\/\w+'/.test(n)&&(n=n.replace(/export \* from '\.\/events\/\w+\/\w+'\n?/g,"")),n.includes(r)||(n=n.trimEnd()+`
80
+ ${r}
81
+ `),n!==t?((0,b.writeFileSync)(e,n,"utf-8"),!0):!1},kn=e=>{let{packagePath:t}=w(),{domain:r,event:n}=J(e),o=(0,X.join)(t,"src","events"),s=(0,X.join)(o,r),a=(0,X.join)(s,"index.ts"),i=(0,X.join)(o,"index.ts"),c=(0,X.join)(t,"src","index.ts"),l=e.split(".")[0],p=(0,X.join)(o,l);l!==r&&(0,b.existsSync)(p)&&(console.warn(`\u26A0\uFE0F Warning: Legacy folder '${l}/' found. Please migrate to '${r}/' to avoid conflicts.`),console.warn(` Run: mv ${p} ${s}`));let d=!1;return xl(a,n)&&(d=!0),wl(i,r)&&(d=!0),bl(c)&&(d=!0),d},vn=(e,t)=>{if(!(0,b.existsSync)(e))return!1;let r=`export * from './events/${t}'`,n=(0,b.readFileSync)(e,"utf-8");if(n.includes(`'./events/${t}'`))return!1;let o=n.split(`
82
+ `),s=o.findLastIndex(a=>a.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push("",r),(0,b.writeFileSync)(e,o.join(`
83
+ `),"utf-8"),!0};var E=require("node:fs"),Q=require("node:path"),h=require("@faker-js/faker");v();var Is=[{pattern:"email",generate:()=>h.faker.internet.email(),hint:"email"},{pattern:"id",generate:()=>h.faker.string.uuid(),hint:"uuid"},{pattern:"firstname",generate:()=>h.faker.person.firstName(),hint:"firstName"},{pattern:"lastname",generate:()=>h.faker.person.lastName(),hint:"lastName"},{pattern:"name",generate:()=>h.faker.person.fullName(),hint:"fullName"},{pattern:"phone",generate:()=>h.faker.phone.number(),hint:"phoneNumber"},{pattern:"address",generate:()=>h.faker.location.streetAddress(),hint:"streetAddress"},{pattern:"street",generate:()=>h.faker.location.streetAddress(),hint:"streetAddress"},{pattern:"city",generate:()=>h.faker.location.city(),hint:"city"},{pattern:"country",generate:()=>h.faker.location.country(),hint:"country"},{pattern:"price",generate:()=>h.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"amount",generate:()=>h.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"total",generate:()=>h.faker.number.float({min:10,max:1e3,fractionDigits:2}),hint:"price"},{pattern:"quantity",generate:()=>h.faker.number.int({min:1,max:10}),hint:"quantity"},{pattern:"date",generate:()=>h.faker.date.recent().toISOString(),hint:"date"},{pattern:"createdat",generate:()=>h.faker.date.recent().toISOString(),hint:"date"},{pattern:"updatedat",generate:()=>h.faker.date.recent().toISOString(),hint:"date"}],Rs=e=>({email:()=>h.faker.internet.email(),datetime:()=>h.faker.date.recent().toISOString(),url:()=>h.faker.internet.url(),uuid:()=>h.faker.string.uuid(),date:()=>h.faker.date.recent().toISOString().split("T")[0],time:()=>h.faker.date.recent().toISOString().split("T")[1]?.split(".")[0]})[e]?.()??h.faker.lorem.word(),Ns=e=>{let t=e.toLowerCase(),r=Is.find(n=>t.includes(n.pattern));return r?{value:r.generate(),hint:r.hint}:null},Sl=(e,t)=>{if(e.format)return Rs(e.format);let r=Ns(t);if(r)return r.value;switch(e.type){case"string":return h.faker.lorem.word();case"number":return h.faker.number.int({min:1,max:100});case"boolean":return h.faker.datatype.boolean();case"array":return e.element?[Cn(e.element)]:[];case"object":return Cn(e);default:return null}},Cn=e=>{let t={},r=e.shape??(typeof e.def?.shape=="function"?e.def.shape():void 0);if(!r)return t;for(let[n,o]of Object.entries(r))t[n]=Sl(o,n);return t},Pl=async e=>{try{let{createJiti:t}=await import("jiti"),n=t(process.cwd(),{interopDefault:!0})(e),o=Object.entries(n).find(([s])=>s.endsWith("Schema")||s==="schema");if(o?.[1]){let s=o[1],a=Cn(s);if(a&&typeof a=="object"&&Object.keys(a).length>0){let i={};return xn(a,i,""),{data:a,faker:i}}}}catch{}return null},xn=(e,t,r)=>{if(!(!e||typeof e!="object"))for(let[n,o]of Object.entries(e)){let s=r?`${r}.${n}`:n,a=n.toLowerCase(),i=Is.find(c=>a.includes(c.pattern));i&&(i.hint!=="uuid"||typeof o=="string")&&(t[s]=i.hint),typeof o=="object"&&o!==null&&!Array.isArray(o)?xn(o,t,s):Array.isArray(o)&&o.length>0&&typeof o[0]=="object"&&xn(o[0],t,`${s}[0]`)}},Tl=e=>({string:()=>h.faker.lorem.word(),number:()=>h.faker.number.int({min:1,max:100}),boolean:()=>h.faker.datatype.boolean()})[e]?.(),El=(e,t,r)=>{let n=/(\w+):\s*z\.(\w+)\(/g,o=Array.from(e.matchAll(n));for(let[,s,a]of o){if(a==="array"||a==="object")continue;let i=Ns(s);if(i)t[s]=i.value,i.hint&&(r[s]=i.hint);else{let c=Tl(a);c!==void 0&&(t[s]=c)}}},$l=(e,t,r)=>{let n=/(\w+):\s*z\.string\(\)\.(datetime|email|url|uuid)\(\)/g,o=Array.from(e.matchAll(n));for(let[,s,a]of o)t[s]=Rs(a),r[s]=a==="datetime"?"date":a},Ms=e=>{let t={},r={};return El(e,t,r),$l(e,t,r),{data:t,faker:r}},or=async e=>{let{eventsPath:t}=w(),r=yt(e);if(!(0,E.existsSync)(r))return null;let o=(0,E.readFileSync)(r,"utf-8").match(/type:\s*['"]([^'"]+)['"]/),s=o?o[1]:e,a=await Pl(r);if(!a){let x=pn(e);x&&(a=Ms(x))}if(!a)return null;let i={eventName:s,description:`Mock data for ${s} event`,data:a.data};Object.keys(a.faker).length>0&&(i.faker=a.faker);let{domain:c,event:l}=J(e),p=(0,Q.join)(t,c,`${l}.mock.json`),d=(0,Q.join)(t,c);return(0,E.existsSync)(d)||(0,E.mkdirSync)(d,{recursive:!0}),(0,E.writeFileSync)(p,JSON.stringify(i,null,2),"utf-8"),p};var Os=e=>{let t=e.match(/import\s+\{[^}]*?(\w+Contract)[^}]*?\}\s+from\s+['"][^'"]+\/contracts['"]/);return t?t[1].replace("Contract","").replace(/([A-Z])/g,(n,o,s)=>(s>0?".":"")+o.toLowerCase()):null},Al=(e,t,r)=>{if(!(0,E.existsSync)(e))return!1;let n=(0,E.readFileSync)(e,"utf-8"),o=n.match(/export const \w+(?:Schema|Data)\s*=\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m)??n.match(/schema:\s*z\.object\(\s*\{([\s\S]*?)\}\s*\)/m);if(!o)return!1;let s=Ms(o[1]),a={eventName:r,description:`Mock data for ${r} event`,data:s.data};return Object.keys(s.faker).length>0&&(a.faker=s.faker),(0,E.writeFileSync)(t,JSON.stringify(a,null,2)),!0},wn=async(e,t={})=>{let r=(0,Q.join)(e,"src","events");if(!(0,E.existsSync)(r))return{mockPaths:[],skippedHandlers:[]};let n=(0,E.readdirSync)(r).filter(a=>a.endsWith(".event.ts")).map(a=>(0,Q.join)(r,a)),o=[],s=[];for(let a of n){let i=(0,E.readFileSync)(a,"utf-8"),c=Os(i);if(!c){s.push(`${(0,Q.basename)(a)} (Handler does not use contracts)`);continue}let{eventName:l}=J(c),p=t.outputDir??w().eventsPath,d=(0,Q.join)(p,`${l}.mock.json`);if((0,E.existsSync)(d)&&!t.overwrite){s.push(`${(0,Q.basename)(a)} (Mock already exists)`);continue}if(t.outputDir){let H=(0,Q.join)(t.outputDir,`${l}.ts`);Al(H,d,c)&&o.push(d);continue}let x=await or(c);x&&o.push(x)}return{mockPaths:o,skippedHandlers:s}};var _s=e=>{let t=e.split("/").pop()||"service",r=(0,js.join)(e,"src","events","events.service.ts");if(!(0,sr.existsSync)(r))return!1;let n=fn(e);if(n.length===0||(0,sr.readFileSync)(r,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let i=hn(n),c=yn(i,t);if(!c)return!1;let l=new Fs.Project({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(r),d=!1;for(let x of p.getClasses()){let H=x.getMethod("startConsumers");if(!H)continue;let B=[...c.split(`
63
84
  `),""," this.logger.log('Event consumers started successfully')"].join(`
64
- `);I.setBodyText(O),d=!0;break}return d&&l.saveSync(),d};var Jn=require("node:child_process"),wo=require("node:path"),bo=require("execa");var ko=require("node:fs"),vo=require("node:path"),Co=require("dotenv"),Gn=(e,t)=>{let n=(0,vo.resolve)(t,e);return(0,ko.existsSync)(n)?(0,Co.config)({path:n,processEnv:{}}).parsed||{}:{}},xo=(e,t)=>{let n=Gn(e,t),r=[];for(let[o,s]of Object.entries(n))if(o.endsWith("_PORT")&&s){let a=Number.parseInt(s,10);!Number.isNaN(a)&&a>0&&r.push(a)}return r};var Un={...process.env,NODE_NO_WARNINGS:"1"},wc=(e,t,n)=>e?"pipe":t||n?["ignore","pipe","pipe"]:"inherit",bc=(e,t,n)=>e?{...Un,...e}:t||n?{...Un,CI:"true"}:{...Un},Sc=e=>e.includes("EEXIST")||e.includes("failed to link package");async function le(e,t,{cwd:n=process.cwd(),task:r,shell:o,context:s=e,quiet:a=!1,nonInteractive:i=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let l=(0,bo.execa)(e,t,{cwd:n,stdio:wc(a,r,i),all:r||i?!0:void 0,shell:o??!0,env:bc(c,r,i)});l.all&&l.all.on("data",p=>{let d=p.toString().trim();r?(r.output=d,d.length&&m.storeLog(d,s)):i&&d.length&&console.log(d)}),await l}catch(l){let p=l instanceof Error?l.message:String(l);if(Sc(p))return;throw new Error(Pc(p))}}var Pc=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function So(e,t,n={}){let{cwd:r=process.cwd(),envFile:o,detached:s=!0,pipeStdout:a=!1,onStdout:i,onStderr:c,onExit:l}=n,p=o?Gn(o,r):{},d=(0,wo.resolve)(r,"node_modules",".bin"),k=process.env.PATH||"",I=`${d}:${k}`,Ve={...process.env,...p,PATH:I,FORCE_COLOR:"1"},O=(0,Jn.spawn)(e,t,{cwd:r,env:Ve,stdio:["inherit",a?"pipe":"inherit","pipe"],detached:s});return i&&a&&O.stdout?.on("data",i),c&&O.stderr?.on("data",c),l&&O.on("exit",l),O}function jt(e,t,n={}){let{cwd:r=process.cwd()}=n;(0,Jn.spawn)(e,t,{cwd:r,stdio:"inherit",shell:!0}).on("exit",s=>process.exit(s||0))}async function Po(e){let{execSync:t}=await import("node:child_process");for(let n of e)try{let o=t(`lsof -ti:${n}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
65
- `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}var Tc=e=>{let t=e.split(/\s+/),n=t[0],r=t.slice(1);return n==="pf"&&(n=process.argv[1]),{executable:n,args:r}},$c=async(e,t)=>{try{let{executable:n,args:r}=Tc(e.command);return await le(n,r,{cwd:t,shell:!1}),{command:e.command,success:!0}}catch(n){return{command:e.command,success:!1,error:n instanceof Error?n.message:String(n)}}},Kn=async(e,t)=>{let n=[];for(let r of e){let o=await $c(r,t);if(n.push(o),!o.success)break}return n},zn=e=>{let t=[/^pf\s+/,/^bun\s+pf\s+/,/^npx\s+pf\s+/,/^bunx\s+pf\s+/];return e.filter(n=>t.some(r=>r.test(n.command)))},To=e=>{for(let t of e){let n=t.command.match(/(?:bun\s+)?pf\s+new\s+\S+\s+(\S+)/);if(n)return n[1]}return null};var ot=require("node:fs"),_t=require("node:path"),q=u(require("chalk"));var $o=require("node:fs"),Eo=require("node:path"),qn=require("node:process"),Ao=require("execa");var Ft=e=>rt(e);function Vn(e=process.cwd()){let t=n=>(0,$o.existsSync)((0,Eo.join)(e,n));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 x(e){return Vn(e)??Zn()}function Zn(){return Ft("bun")?"bun":Ft("pnpm")?"pnpm":Ft("yarn")?"yarn":"npm"}function Io(){return["bun","pnpm","yarn","npm"].filter(Ft)}async function H(e,t){let n=Ec(e,t),{mergedOptions:r,packages:o}=n,{cwd:s=process.cwd(),flags:a=[],task:i,quiet:c}=r,l=r.packageManager??x(),p=[],d=Array.isArray(o)?o:[o];l==="bun"&&(d=d.map(I=>I.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 k=d.length?l==="npm"?["install",...a,...p,...d]:["add",...a,...p,...d]:["install",...a,...p];await le(l,k,{cwd:s,task:i,quiet:c})}async function No(e){let t=["-g"],n=[...e.flags??[],...t];await H({...e,flags:n,packageManager:e.packageManager??x()})}function Ro(e,t,n){let{args:r,mergedOptions:o}=jo(t??[],n),s=o.manager??x(),{command:a,args:i}=Mo(s);console.log(`
66
- Running command: ${a} ${[...i,e,...r].join(" ")}
67
- `),(0,Ao.execaSync)(a,[...i,e,...r],{cwd:o.cwd??(0,qn.cwd)(),stdio:"inherit",preferLocal:!0})}async function te(e,t,n){let{args:r,mergedOptions:o}=jo(t??[],n),s=o.manager??x(),{command:a,args:i}=Mo(s);await le(a,[...i,e,...r],o)}async function nt(e,t){let{script:n,mergedOptions:r}=Ac(e,t),o=r.packageManager??x();await le(o,["run",n,...r.args??[]],{cwd:r.cwd??(0,qn.cwd)(),task:r.task})}function Mo(e){let n={bun:"bunx",pnpm:"npx",yarn:"npx",npm:"npx"}[e];if(!n)throw new Error(`No executor found for the detected package manager: ${e}`);let[r,...o]=n.split(" ");return{command:r,args:o}}function Ec(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function jo(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function Ac(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var he=require("node:fs"),Ot=require("node:path"),Nc=(e,t)=>{let r=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o=(0,Ot.join)(r,e.path);try{if((0,he.existsSync)(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=(0,Ot.dirname)(o);return(0,he.existsSync)(s)||(0,he.mkdirSync)(s,{recursive:!0}),(0,he.writeFileSync)(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},Fo=(e,t)=>{let n=e.map(r=>Nc(r,t));return{written:n.filter(r=>r.status==="written").map(r=>r.path),skipped:n.filter(r=>r.status==="skipped").map(r=>r.path),failed:n.filter(r=>r.status==="failed").map(r=>({path:r.path,error:r.error}))}};var Rc=(e,t)=>{let n=B(t.workspaceRoot),r=(0,_t.join)(t.workspaceRoot,n.contracts);if(!(0,ot.existsSync)(r))return[];let o=/import\s+(?:type\s+)?{([^}]+)}\s+from\s+['"]@\w+\/contracts['"]/g,s=new Set;for(let a of e){let i=a.content.matchAll(o);for(let c of i){let p=c[1].split(",").map(d=>d.trim()).map(d=>d.replace(/^type\s+/,"").replace(/\s+as\s+.+$/,"").trim()).filter(d=>d.endsWith("Contract"));for(let d of p)s.add(d)}}return Array.from(s).sort()},Mc=e=>{let t=(0,_t.join)(e,"packages/contracts/src/index.ts");if(!(0,ot.existsSync)(t))return new Set;try{let n=(0,ot.readFileSync)(t,"utf-8"),r=new Set,o=/export\s+(?:\*|{[^}]*Contract[^}]*})\s+from\s+['"]\.\/events\/([^'"]+)['"]/g,s=n.matchAll(o);for(let a of s){let i=a[0],c=/(\w+Contract)/g,l=i.matchAll(c);for(let p of l)r.add(p[1])}return r}catch{return new Set}},jc=e=>{let t=e.replace(/Contract$/,""),n=t.split(/(?=[A-Z])/).filter(Boolean);if(n.length<2)return t.toLowerCase();let r=n[0].toLowerCase(),o=n.slice(1).join("").toLowerCase();return`${r}.${o}`},Fc=(e,t,n)=>{let r=Mc(t),o=[],s=[],a=[];for(let i of e)if(r.has(i))o.push(i);else{s.push(i);let c=jc(i),l=n.replace(`${t}/`,"");a.push(`pf event add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:a}},Oc=(e,t)=>{if(e.length!==0){console.log(q.default.cyan(`\u{1F4E6} Using existing contracts:
68
- `));for(let n of e)console.log(q.default.dim(` ${t}/contracts \u2192 ${n}`));console.log()}},_c=(e,t)=>{let n=/^packages\/contracts\/src\/events\/([^/]+)\.ts$/,r=(0,_t.join)(t,"packages/contracts/src/index.ts");for(let o of e){let s=o.match(n);s&&s[1]!=="index"&&Ln(r,s[1])}},Oo=async(e,t)=>{t.start("Applying code formatting...");try{await te("biome",["check","--fix","--unsafe","."],{cwd:e,quiet:!0}),t.succeed("Code formatted!")}catch{t.warn("Code formatting completed with warnings")}},Dc=async(e,t)=>{t.start("Scanning for event handlers...");let{mockPaths:n,skippedHandlers:r}=await Wn(e);if(n.length+r.length===0){t.info("No event handlers found");return}if(n.length>0){t.succeed(`Generated ${n.length} event ${n.length===1?"mock":"mocks"}`),console.log();for(let s of n){let a=s.replace(`${e}/`,"");console.log(q.default.dim(` ${a}`))}console.log()}else t.succeed("Event handlers found");if(r.length>0){for(let s of r)console.log(q.default.dim(` \u2139 Skipped: ${s}`));console.log()}},_o=async(e,t,n,r)=>{r.start("Writing generated files...");let o=Fo(e,{baseDir:t,workspaceRoot:n.workspaceRoot,overwrite:!0});if(o.written.length>0){r.succeed(`Created ${o.written.length} files`),console.log();for(let l of o.written)console.log(q.default.dim(` ${l}`));console.log()}else r.succeed("No files to write");let s=Rc(e,n),{existing:a,missing:i,suggestedCommands:c}=Fc(s,n.workspaceRoot,t);if(a.length>0&&Oc(a,n.scope),i.length>0){console.log(q.default.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${n.scope}/contracts):
69
- `));for(let l of i)console.log(q.default.yellow(` ${l}`));console.log(),console.log(q.default.cyan(`\u{1F4A1} Run these commands to create the missing contracts:
70
- `));for(let l of c)console.log(q.default.dim(` ${l}`));console.log()}return _c(o.written,n.workspaceRoot),o.written.length>0&&await Dc(t,r),{missingContractCommands:c}};var Dt=require("node:fs"),$e=require("node:path");var Te=require("node:fs"),Do=require("node:path");var Lo=e=>{let{eventsPath:t}=C(e);if(!(0,Te.existsSync)(t))return[];let n=[];try{let r=(0,Te.readdirSync)(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of r){let s=(0,Do.join)(t,o),a=(0,Te.readFileSync)(s,"utf-8"),i=Lc(a,s);i&&n.push(i)}}catch(r){return console.warn("Warning: Could not scan contracts package:",r),[]}return n},Lc=(e,t)=>{try{let n=e.match(/export const (\w+Contract) = createContract/);if(!n)return null;let r=n[1],o=e.match(/export type (\w+(?:Data|Event)) = z\.infer/);if(!o)return null;let s=o[1],a=e.match(/type:\s*['"]([^'"]+)['"]/);if(!a)return null;let i=a[1],c=Bc(e);return{name:r,typeName:s,eventType:i,fields:c,filePath:t}}catch{return null}},Hc={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},Bc=e=>{let t=e.match(/z\.object\({([^}]+)\}/);if(!t)return[];let n=t[1],r=/(\w+):\s*z\.(\w+)\([^)]*\)/g,o=[...n.matchAll(r)].map(([,i,c])=>{let l=Hc[c]||c;return`${i}: ${l}`});if(!e.includes("z.array("))return o;let s=/(\w+):\s*z\.array\(/g,a=[...e.matchAll(s)].map(([,i])=>i).filter(i=>!o.some(c=>c.startsWith(i))).map(i=>`${i}: array`);return[...o,...a]},Ho=(e,t)=>{if(e.length===0)return`
85
+ `);H.setBodyText(B),d=!0;break}return d&&l.saveSync(),d};v();var Il=e=>{let t=e.split(/\s+/),r=t[0],n=t.slice(1);return r==="pf"&&(r=process.argv[1]),{executable:r,args:n}},Rl=async(e,t)=>{try{let{executable:r,args:n}=Il(e.command);return await ge(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)}}},bn=async(e,t)=>{let r=[];for(let n of e){let o=await Rl(n,t);if(r.push(o),!o.success)break}return r},Sn=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)))},Ds=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};var kt=require("node:fs"),ir=require("node:path"),ee=u(require("chalk"));v();var Ee=require("node:fs"),ar=require("node:path"),Nl=(e,t)=>{let n=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o=(0,ar.join)(n,e.path);try{if((0,Ee.existsSync)(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=(0,ar.dirname)(o);return(0,Ee.existsSync)(s)||(0,Ee.mkdirSync)(s,{recursive:!0}),(0,Ee.writeFileSync)(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},Ls=(e,t)=>{let r=e.map(n=>Nl(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 Ml=(e,t)=>{let r=A(t.workspaceRoot),n=(0,ir.join)(t.workspaceRoot,r.contracts);if(!(0,kt.existsSync)(n))return[];let o=/import\s+(?:type\s+)?{([^}]+)}\s+from\s+['"]@\w+\/contracts['"]/g,s=new Set;for(let a of e){let i=a.content.matchAll(o);for(let c of i){let p=c[1].split(",").map(d=>d.trim()).map(d=>d.replace(/^type\s+/,"").replace(/\s+as\s+.+$/,"").trim()).filter(d=>d.endsWith("Contract"));for(let d of p)s.add(d)}}return Array.from(s).sort()},Ol=e=>{let t=(0,ir.join)(e,"packages/contracts/src/index.ts");if(!(0,kt.existsSync)(t))return new Set;try{let r=(0,kt.readFileSync)(t,"utf-8"),n=new Set,o=/export\s+(?:\*|{[^}]*Contract[^}]*})\s+from\s+['"]\.\/events\/([^'"]+)['"]/g,s=r.matchAll(o);for(let a of s){let i=a[0],c=/(\w+Contract)/g,l=i.matchAll(c);for(let p of l)n.add(p[1])}return n}catch{return new Set}},jl=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}`},Fl=(e,t,r)=>{let n=Ol(t),o=[],s=[],a=[];for(let i of e)if(n.has(i))o.push(i);else{s.push(i);let c=jl(i),l=r.replace(`${t}/`,"");a.push(`pf event add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:a}},_l=(e,t)=>{if(e.length!==0){console.log(ee.default.cyan(`\u{1F4E6} Using existing contracts:
86
+ `));for(let r of e)console.log(ee.default.dim(` ${t}/contracts \u2192 ${r}`));console.log()}},Dl=(e,t)=>{let r=/^packages\/contracts\/src\/events\/([^/]+)\.ts$/,n=(0,ir.join)(t,"packages/contracts/src/index.ts");for(let o of e){let s=o.match(r);s&&s[1]!=="index"&&vn(n,s[1])}},Hs=async(e,t)=>{t.start("Applying code formatting...");try{await ie("biome",["check","--fix","--unsafe","."],{cwd:e,quiet:!0}),t.succeed("Code formatted!")}catch{t.warn("Code formatting completed with warnings")}},Ll=async(e,t)=>{t.start("Scanning for event handlers...");let{mockPaths:r,skippedHandlers:n}=await wn(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 a=s.replace(`${e}/`,"");console.log(ee.default.dim(` ${a}`))}console.log()}else t.succeed("Event handlers found");if(n.length>0){for(let s of n)console.log(ee.default.dim(` \u2139 Skipped: ${s}`));console.log()}},Bs=async(e,t,r,n)=>{n.start("Writing generated files...");let o=Ls(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(ee.default.dim(` ${l}`));console.log()}else n.succeed("No files to write");let s=Ml(e,r),{existing:a,missing:i,suggestedCommands:c}=Fl(s,r.workspaceRoot,t);if(a.length>0&&_l(a,r.scope),i.length>0){console.log(ee.default.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${r.scope}/contracts):
87
+ `));for(let l of i)console.log(ee.default.yellow(` ${l}`));console.log(),console.log(ee.default.cyan(`\u{1F4A1} Run these commands to create the missing contracts:
88
+ `));for(let l of c)console.log(ee.default.dim(` ${l}`));console.log()}return Dl(o.written,r.workspaceRoot),o.written.length>0&&await Ll(t,n),{missingContractCommands:c}};v();var cr=require("node:fs"),Le=require("node:path");v();var De=require("node:fs"),Ws=require("node:path");v();var Gs=e=>{let{eventsPath:t}=w(e);if(!(0,De.existsSync)(t))return[];let r=[];try{let n=(0,De.readdirSync)(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of n){let s=(0,Ws.join)(t,o),a=(0,De.readFileSync)(s,"utf-8"),i=Hl(a,s);i&&r.push(i)}}catch(n){return console.warn("Warning: Could not scan contracts package:",n),[]}return r},Hl=(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],a=e.match(/type:\s*['"]([^'"]+)['"]/);if(!a)return null;let i=a[1],c=Wl(e);return{name:n,typeName:s,eventType:i,fields:c,filePath:t}}catch{return null}},Bl={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},Wl=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(([,i,c])=>{let l=Bl[c]||c;return`${i}: ${l}`});if(!e.includes("z.array("))return o;let s=/(\w+):\s*z\.array\(/g,a=[...e.matchAll(s)].map(([,i])=>i).filter(i=>!o.some(c=>c.startsWith(i))).map(i=>`${i}: array`);return[...o,...a]},Us=(e,t)=>{if(e.length===0)return`
71
89
  **Available Contracts:**
72
90
 
73
91
  No contracts are currently defined. Use Basic Mode with inline schemas for all events.
74
- `.trim();let n=e.map((r,o)=>{let s=r.fields.length>0?r.fields.map(a=>` - ${a}`).join(`
92
+ `.trim();let r=e.map((n,o)=>{let s=n.fields.length>0?n.fields.map(a=>` - ${a}`).join(`
75
93
  `):" - (no fields detected)";return`
76
- ${o+1}. **${r.name}** (\`${r.eventType}\`)
77
- - Type: \`${r.typeName}\`
94
+ ${o+1}. **${n.name}** (\`${n.eventType}\`)
95
+ - Type: \`${n.typeName}\`
78
96
  - Fields:
79
97
  ${s}
80
- - **USE THIS** when consuming ${r.eventType} or similar event names
98
+ - **USE THIS** when consuming ${n.eventType} or similar event names
81
99
  `.trim()}).join(`
82
100
 
83
101
  `);return`
@@ -85,18 +103,18 @@ ${s}
85
103
 
86
104
  The following event contracts are available in \`${t}/contracts\`:
87
105
 
88
- ${n}
106
+ ${r}
89
107
 
90
108
  If the event type your service consumes matches one of these, **you MUST use Advanced Mode**.
91
- `.trim()};var Wc=(e,t)=>{let n=(0,$e.join)(__dirname,"docs","generators"),r=st(),o=[];for(let s of r.docs.base)o.push((0,$e.join)(n,s));if(e&&r.docs.frameworks[e]){let s=r.docs.frameworks[e];if(typeof s=="string")o.push((0,$e.join)(n,s));else{let a=t==="bun"?"bun":"node";s[a]&&o.push((0,$e.join)(n,s[a]))}}return o},Bo={copilot:".github/copilot-instructions.md",projectGuidelines:"docs/ai-guidelines.md"},Gc=1500,Wo=e=>{try{return(0,Dt.existsSync)(e)?(0,Dt.readFileSync)(e,"utf-8"):null}catch{return null}},Uc=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
109
+ `.trim()};var Gl=(e,t)=>{let r=(0,Le.join)(__dirname,"docs","generators"),n=Me(),o=[];for(let s of n.docs.base)o.push((0,Le.join)(r,s));if(e&&n.docs.frameworks[e]){let s=n.docs.frameworks[e];if(typeof s=="string")o.push((0,Le.join)(r,s));else{let a=t==="bun"?"bun":"node";s[a]&&o.push((0,Le.join)(r,s[a]))}}return o},Js={copilot:".github/copilot-instructions.md",projectGuidelines:"docs/ai-guidelines.md"},Ul=1500,Ks=e=>{try{return(0,cr.existsSync)(e)?(0,cr.readFileSync)(e,"utf-8"):null}catch{return null}},Jl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
92
110
 
93
- `).replace(/[ \t]+$/gm,"").trim(),Jc=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/```[\s\S]*?```/g,"").replace(/`[^`]{50,}`/g,"`...`").replace(/\n{3,}/g,`
111
+ `).replace(/[ \t]+$/gm,"").trim(),Kl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/```[\s\S]*?```/g,"").replace(/`[^`]{50,}`/g,"`...`").replace(/\n{3,}/g,`
94
112
 
95
- `).replace(/[ \t]+$/gm,"").trim(),Kc=e=>Math.ceil(e.length/4),zc=(e,t)=>{let n=e.split(/(?=^## )/m),r="",o=0;for(let s of n){let a=Kc(s);if(o+a<=t)r+=s,o+=a;else if(o===0){r=s.slice(0,t*4);break}else break}return r.trim()},qc=(e,t)=>{let{workspaceRoot:n,scope:r}=t,o=Lo(n),s=Ho(o,r);return e.replace(/\{\{scope\}\}/g,r).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},Go=e=>{let{workspaceRoot:t,scope:n}=e,r=[],o=Wc(e.serviceType,e.packageManager);for(let i of o){let c=Wo(i);if(c){let l=qc(c,e),p=Uc(l);r.push(p)}}let s=[Bo.copilot,Bo.projectGuidelines],a=Math.floor(Gc/s.length);for(let i of s){let c=Wo((0,$e.join)(t,i));if(c){let l=Jc(c),p=zc(l,a);p.length>50&&r.push(p)}}return r.length===0?(console.warn("\u26A0\uFE0F No instruction files found."),`Use ${n}/contracts for shared types.`):r.join(`
113
+ `).replace(/[ \t]+$/gm,"").trim(),zl=e=>Math.ceil(e.length/4),Vl=(e,t)=>{let r=e.split(/(?=^## )/m),n="",o=0;for(let s of r){let a=zl(s);if(o+a<=t)n+=s,o+=a;else if(o===0){n=s.slice(0,t*4);break}else break}return n.trim()},ql=(e,t)=>{let{workspaceRoot:r,scope:n}=t,o=Gs(r),s=Us(o,n);return e.replace(/\{\{scope\}\}/g,n).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},zs=e=>{let{workspaceRoot:t,scope:r}=e,n=[],o=Gl(e.serviceType,e.packageManager);for(let i of o){let c=Ks(i);if(c){let l=ql(c,e),p=Jl(l);n.push(p)}}let s=[Js.copilot,Js.projectGuidelines],a=Math.floor(Ul/s.length);for(let i of s){let c=Ks((0,Le.join)(t,i));if(c){let l=Kl(c),p=Vl(l,a);p.length>50&&n.push(p)}}return n.length===0?(console.warn("\u26A0\uFE0F No instruction files found."),`Use ${r}/contracts for shared types.`):n.join(`
96
114
 
97
115
  ---
98
116
 
99
- `)};var Vc=`You are an expert code generator. Generate clean, production-ready code.
117
+ `)};var Zl=`You are an expert code generator. Generate clean, production-ready code.
100
118
 
101
119
  ## Output Format
102
120
 
@@ -110,13 +128,13 @@ Format your code blocks with the file path on the line before the code block:
110
128
  **IMPORTANT:** Always generate:
111
129
  - Source code files (src/**)
112
130
  - Test files (src/**/*.test.ts) for all business logic
113
- - README.md with service documentation`,Zc=e=>e.replace(/-/g,"_").toUpperCase(),Yc=e=>e.split("/").pop()||"my-service",Uo=(e,t,n)=>{let r=Go({...e,serviceType:t,packageManager:n});return`${Vc}
131
+ - README.md with service documentation`,Yl=e=>e.replace(/-/g,"_").toUpperCase(),Xl=e=>e.split("/").pop()||"my-service",Vs=(e,t,r)=>{let n=zs({...e,serviceType:t,packageManager:r});return`${Zl}
114
132
 
115
133
  ## Project Guidelines & Patterns
116
134
 
117
135
  Follow these project-specific conventions and patterns when generating code:
118
136
 
119
- ${r}`},Jo=(e,t,n,r)=>{let o=Yc(e),s=`${Zc(o)}_PORT`,a=Ee();return`Generate source code for a microservice at path "${e}".
137
+ ${n}`},qs=(e,t,r,n)=>{let o=Xl(e),s=`${Yl(o)}_PORT`,a=be();return`Generate source code for a microservice at path "${e}".
120
138
 
121
139
  Use the patterns and conventions from the Project Guidelines above.
122
140
 
@@ -131,60 +149,60 @@ Service purpose: ${t}
131
149
  - BUT you MUST keep the existing port configuration line unchanged!
132
150
 
133
151
  Do NOT include the service path in file headers (use \`src/...\`, NOT \`${e}/src/...\`).
134
- `};var Xc=()=>!1,Ko=(e,t)=>{Xc()&&console.log(`[AI Parser] ${e}`,t??"")},Lt={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},Xn=(e,t)=>[...e.matchAll(t)].flatMap(r=>r[1].split(`
135
- `).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),zo=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),Qc=e=>Xn(e,Lt.commandsBlock).map(zo),el=e=>Xn(e,Lt.postCommandsBlock).map(zo),tl=e=>Xn(e,Lt.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),nl=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},n=(e||"typescript").toLowerCase();return t[n]||n},rl=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"},ol=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),sl=e=>{let t=e.split(`
136
- `),n=[],r=0;for(let o of t){let s=Lt.fileHeader.exec(o);s&&n.push({path:s[1],index:r}),r+=o.length+1}return n},al=(e,t)=>{let r=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return r?{language:r[1]?nl(r[1]):void 0,content:ol(r[2])}:null},il=e=>sl(e).map(n=>{let r=al(e,n.index);return!r||r.content.length===0?null:{path:n.path,language:r.language||rl(n.path),content:r.content,startIndex:n.index}}).filter(n=>n!==null),Yn=e=>e.includes("packages/contracts")||e.includes("contracts/src"),cl=e=>{let t=e.filter(r=>Yn(r.path)),n=e.filter(r=>!Yn(r.path));return[...t,...n]},ll=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(Yn(t))return t;let n=t.match(/^services\/[^/]+\/(.+)$/);return n?n[1]:t},qo=(e,t)=>{Ko("Parsing AI response",{length:e.length});let n=Qc(e),r=el(e),o=tl(e),s=il(e),a=cl(s.map(i=>({path:ll(i.path),content:i.content,language:i.language})));return Ko("Parsed response",{commands:n.length,postCommands:r.length,dependencies:o.length,files:a.length}),{commands:n,files:a,dependencies:o,postCommands:r}},Vo=e=>{let t=e.filter(s=>!s.content||s.content.trim().length===0),n=e.length===0?["No files could be extracted from the AI response"]:t.map(s=>`File ${s.path} is empty`),r=e.some(s=>["src/index.ts","src/main.ts","index.ts"].includes(s.path)),o=e.length>0&&!r?["No entry point file (src/index.ts or src/main.ts) found - assuming it exists from scaffolding"]:[];return{valid:n.length===0,errors:n,warnings:o}};var Zo=require("node:fs"),W=u(require("chalk"));var Yo=async(e,t,n)=>{if(e.length===0){(0,Zo.mkdirSync)(t,{recursive:!0}),console.log(W.default.yellow(`\u26A0 No scaffolding command found - creating empty directory
137
- `));return}let o=(await Kn(e,n)).find(s=>!s.success);if(o)throw console.log(W.default.red(`
138
- \u2717 Scaffolding failed: ${o.command}`)),o.error&&console.log(W.default.red(` Error: ${o.error}`)),new Error(`Command failed: ${o.command}${o.error?` - ${o.error}`:""}`)},Xo=async(e,t)=>{t.start("Linking workspace dependencies...");try{await H({cwd:e,quiet:!0}),t.succeed("Workspace dependencies linked")}catch{let n=x();t.warn(`Workspace sync skipped (run ${n} install manually)`)}},Qo=async(e,t,n)=>{if(e.length===0)return;n.stop();let r=e.length===1?"package":"packages";console.log(W.default.cyan(`
139
- \u25B6 Installing ${e.length} additional ${r}...
140
- `));try{await H({packages:e,cwd:t,flags:["--silent"]}),console.log(W.default.green(`\u2713 Installed ${e.length} ${r}
141
- `))}catch(o){throw console.log(W.default.red(`\u2717 Package installation failed
142
- `)),o}},Qn=async(e,t)=>{if(e.length===0)return;console.log(W.default.cyan(`
152
+ `};var Ql=()=>!1,Zs=(e,t)=>{Ql()&&console.log(`[AI Parser] ${e}`,t??"")},lr={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},Tn=(e,t)=>[...e.matchAll(t)].flatMap(n=>n[1].split(`
153
+ `).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),Ys=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),ep=e=>Tn(e,lr.commandsBlock).map(Ys),tp=e=>Tn(e,lr.postCommandsBlock).map(Ys),rp=e=>Tn(e,lr.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),np=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},r=(e||"typescript").toLowerCase();return t[r]||r},op=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"},sp=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),ap=e=>{let t=e.split(`
154
+ `),r=[],n=0;for(let o of t){let s=lr.fileHeader.exec(o);s&&r.push({path:s[1],index:n}),n+=o.length+1}return r},ip=(e,t)=>{let n=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return n?{language:n[1]?np(n[1]):void 0,content:sp(n[2])}:null},cp=e=>ap(e).map(r=>{let n=ip(e,r.index);return!n||n.content.length===0?null:{path:r.path,language:n.language||op(r.path),content:n.content,startIndex:r.index}}).filter(r=>r!==null),Pn=e=>e.includes("packages/contracts")||e.includes("contracts/src"),lp=e=>{let t=e.filter(n=>Pn(n.path)),r=e.filter(n=>!Pn(n.path));return[...t,...r]},pp=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(Pn(t))return t;let r=t.match(/^services\/[^/]+\/(.+)$/);return r?r[1]:t},Xs=(e,t)=>{Zs("Parsing AI response",{length:e.length});let r=ep(e),n=tp(e),o=rp(e),s=cp(e),a=lp(s.map(i=>({path:pp(i.path),content:i.content,language:i.language})));return Zs("Parsed response",{commands:r.length,postCommands:n.length,dependencies:o.length,files:a.length}),{commands:r,files:a,dependencies:o,postCommands:n}},Qs=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}};var ea=require("node:fs"),K=u(require("chalk"));var ta=async(e,t,r)=>{if(e.length===0){(0,ea.mkdirSync)(t,{recursive:!0}),console.log(K.default.yellow(`\u26A0 No scaffolding command found - creating empty directory
155
+ `));return}let o=(await bn(e,r)).find(s=>!s.success);if(o)throw console.log(K.default.red(`
156
+ \u2717 Scaffolding failed: ${o.command}`)),o.error&&console.log(K.default.red(` Error: ${o.error}`)),new Error(`Command failed: ${o.command}${o.error?` - ${o.error}`:""}`)},ra=async(e,t,r)=>{if(e.length===0)return;r.stop();let n=e.length===1?"package":"packages";console.log(K.default.cyan(`
157
+ \u25B6 Installing ${e.length} additional ${n}...
158
+ `));try{await Y({packages:e,cwd:t,flags:["--silent"]}),console.log(K.default.green(`\u2713 Installed ${e.length} ${n}
159
+ `))}catch(o){throw console.log(K.default.red(`\u2717 Package installation failed
160
+ `)),o}},En=async(e,t)=>{if(e.length===0)return;console.log(K.default.cyan(`
143
161
  \u25B6 Running post-generation commands...
144
- `));let r=(await Kn(e,t)).find(o=>!o.success);if(r){console.log(W.default.yellow(`
145
- \u26A0 Post-command failed: ${r.command}`)),r.error&&console.log(W.default.yellow(` Error: ${r.error}`));return}console.log(W.default.green(`\u2713 Post-generation commands complete
146
- `))};var at=u(require("chalk")),pl=e=>`${at.default.dim(" \u2022 ")+at.default.cyan(e)}
147
- `,es=e=>at.default.dim(` \u2728 Generated ${at.default.white.bold(e)} tokens
148
- `),ts=()=>{let e="",t=0,n=Date.now(),r=[],o=()=>{let a=e.match(/####\s+`([^`]+)`/);if(!a)return!1;r.push(a[1]),process.stdout.write(pl(a[1]));let i=e.indexOf(a[0])+a[0].length;return e=e.slice(i),!0},s=a=>{e+=a,t++,o(),e.length>500&&(e=e.slice(-200))};return s.getStats=()=>{let a=((Date.now()-n)/1e3).toFixed(2),i=(t/Number.parseFloat(a)).toFixed(0);return{tokenCount:t,duration:a,tokensPerSec:i}},s.getFiles=()=>r,s};var ml=()=>{let e=y(),t=(0,Ie.join)(e,"package.json"),n=(()=>{if(!(0,ne.existsSync)(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse((0,ne.readFileSync)(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(r){throw r instanceof SyntaxError?new Error("Invalid JSON in package.json"):r}})();return{workspaceRoot:e,scope:n,cwd:process.cwd()}},dl=async(e,t,n,r,o,s)=>{let a=Jo(n,r,o,t.workspaceRoot),i=Uo(t,o,s),c=ts(),l=await to(e,a,{system:i,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(es(p.tokenCount)),console.log(),l},ul=(e,t)=>{let{serviceTypes:n}=st(),r=n[t]?.commandType;if(!r)return e;let o=Object.values(n).map(s=>s.commandType);return e.map(s=>{for(let a of o)if(a!==r&&s.command.includes(`pf new ${a}`))return{...s,command:s.command.replace(`pf new ${a}`,`pf new ${r}`)};return s})},gl=e=>e.length===0?"":`${[h.default.cyan(`
149
- \u{1F4C1} Files to create:`),...e.map(t=>` ${h.default.green("\u2022")} ${h.default.white(t.path)} ${h.default.dim(`(${t.language})`)}`)].join(`
162
+ `));let n=(await bn(e,t)).find(o=>!o.success);if(n){console.log(K.default.yellow(`
163
+ \u26A0 Post-command failed: ${n.command}`)),n.error&&console.log(K.default.yellow(` Error: ${n.error}`));return}console.log(K.default.green(`\u2713 Post-generation commands complete
164
+ `))};var vt=u(require("chalk")),mp=e=>`${vt.default.dim(" \u2022 ")+vt.default.cyan(e)}
165
+ `,na=e=>vt.default.dim(` \u2728 Generated ${vt.default.white.bold(e)} tokens
166
+ `),oa=()=>{let e="",t=0,r=Date.now(),n=[],o=()=>{let a=e.match(/####\s+`([^`]+)`/);if(!a)return!1;n.push(a[1]),process.stdout.write(mp(a[1]));let i=e.indexOf(a[0])+a[0].length;return e=e.slice(i),!0},s=a=>{e+=a,t++,o(),e.length>500&&(e=e.slice(-200))};return s.getStats=()=>{let a=((Date.now()-r)/1e3).toFixed(2),i=(t/Number.parseFloat(a)).toFixed(0);return{tokenCount:t,duration:a,tokensPerSec:i}},s.getFiles=()=>n,s};var dp=()=>{let e=y(),t=(0,Be.join)(e,"package.json"),r=(()=>{if(!(0,ce.existsSync)(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse((0,ce.readFileSync)(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()}},up=async(e,t,r,n,o,s)=>{let a=qs(r,n,o,t.workspaceRoot),i=Vs(t,o,s),c=oa(),l=await ws(e,a,{system:i,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(na(p.tokenCount)),console.log(),l},gp=(e,t)=>{let{serviceTypes:r}=Me(),n=r[t]?.commandType;if(!n)return e;let o=Object.values(r).map(s=>s.commandType);return e.map(s=>{for(let a of o)if(a!==n&&s.command.includes(`pf new ${a}`))return{...s,command:s.command.replace(`pf new ${a}`,`pf new ${n}`)};return s})},fp=e=>e.length===0?"":`${[k.default.cyan(`
167
+ \u{1F4C1} Files to create:`),...e.map(t=>` ${k.default.green("\u2022")} ${k.default.white(t.path)} ${k.default.dim(`(${t.language})`)}`)].join(`
150
168
  `)}
151
- `,ns=(e,t,n)=>e.length===0?"":`${[h.default.cyan(`
152
- ${n} ${t}:`),...e.map(r=>` ${h.default.yellow("$")} ${h.default.white(r.command)}`)].join(`
169
+ `,sa=(e,t,r)=>e.length===0?"":`${[k.default.cyan(`
170
+ ${r} ${t}:`),...e.map(n=>` ${k.default.yellow("$")} ${k.default.white(n.command)}`)].join(`
153
171
  `)}
154
- `,fl=e=>e.length===0?"":`${[h.default.cyan(`
155
- \u{1F4E6} Dependencies to install:`),...e.map(t=>` ${h.default.magenta("+")} ${h.default.white(t)}`)].join(`
172
+ `,hp=e=>e.length===0?"":`${[k.default.cyan(`
173
+ \u{1F4E6} Dependencies to install:`),...e.map(t=>` ${k.default.magenta("+")} ${k.default.white(t)}`)].join(`
156
174
  `)}
157
- `,hl=(e,t)=>`${[h.default.yellow(`
158
- Validation errors:`),...e.map(n=>h.default.yellow(` \u26A0 ${n}`)),h.default.dim(`
159
- Response preview:`),h.default.dim(t)].join(`
175
+ `,yp=(e,t)=>`${[k.default.yellow(`
176
+ Validation errors:`),...e.map(r=>k.default.yellow(` \u26A0 ${r}`)),k.default.dim(`
177
+ Response preview:`),k.default.dim(t)].join(`
160
178
  `)}
161
- `,Ae=e=>{e&&process.stdout.write(e)},yl=(e,t)=>{let n=qo(e,t),r=zn(n.commands),o=zn(n.postCommands),s=Vo(n.files);return s.valid?{files:n.files,commands:r,dependencies:n.dependencies,postCommands:o}:(console.log(`${h.default.yellow("\u26A0")} Could not extract structured files from AI response`),Ae(hl(s.errors,e.slice(0,500))),null)},kl=e=>{console.log(`${h.default.green("\u2714")} Extracted ${e.files.length} files`),Ae(gl(e.files)),Ae(ns(e.commands,"Commands to run","\u{1F527}")),Ae(ns(e.postCommands,"Post-generation commands","\u{1F4DD}")),Ae(fl(e.dependencies)),Ae(`
162
- `)},vl=(e,t,n)=>{let r=To(e);return r&&!r.includes("/")&&!r.startsWith(".")&&(r=`${B().services}/${r}`),r?(0,Ie.resolve)(n,r):(0,Ie.resolve)(n,t)},Cl=(e,t)=>{let{serviceTypes:n}=st(),r=n[t]?.skipFiles||["package.json","tsconfig.json","Dockerfile"];return e.filter(o=>!r.includes(o.path))},Ne=()=>{if(!Qe())return{valid:!1,error:h.default.red.bold(`\u274C AI configuration not found.
163
- `)+h.default.yellow("Please run ")+h.default.cyan.bold("pf setup --ai")+h.default.yellow(` first to configure your AI provider.
164
- `)};try{return{valid:!0,config:Pt()}}catch(e){return{valid:!1,error:h.default.red.bold(`\u274C ${e.message}
165
- `)}}},Ht=async e=>e||(0,rs.input)({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"}),Bt=(e,t,n)=>{console.log(h.default.cyan.bold(`
179
+ `,He=e=>{e&&process.stdout.write(e)},kp=(e,t)=>{let r=Xs(e,t),n=Sn(r.commands),o=Sn(r.postCommands),s=Qs(r.files);return s.valid?{files:r.files,commands:n,dependencies:r.dependencies,postCommands:o}:(console.log(`${k.default.yellow("\u26A0")} Could not extract structured files from AI response`),He(yp(s.errors,e.slice(0,500))),null)},vp=e=>{console.log(`${k.default.green("\u2714")} Extracted ${e.files.length} files`),He(fp(e.files)),He(sa(e.commands,"Commands to run","\u{1F527}")),He(sa(e.postCommands,"Post-generation commands","\u{1F4DD}")),He(hp(e.dependencies)),He(`
180
+ `)},Cp=(e,t,r)=>{let n=Ds(e);return n&&!n.includes("/")&&!n.startsWith(".")&&(n=`${A().services}/${n}`),n?(0,Be.resolve)(r,n):(0,Be.resolve)(r,t)},xp=(e,t)=>{let{serviceTypes:r}=Me(),n=r[t]?.skipFiles||["package.json","tsconfig.json","Dockerfile"];return e.filter(o=>!n.includes(o.path))},We=()=>{if(!gt())return{valid:!1,error:k.default.red.bold(`\u274C AI configuration not found.
181
+ `)+k.default.yellow("Please run ")+k.default.cyan.bold("pf setup --ai")+k.default.yellow(` first to configure your AI provider.
182
+ `)};try{return{valid:!0,config:Qt()}}catch(e){return{valid:!1,error:k.default.red.bold(`\u274C ${e.message}
183
+ `)}}},pr=async e=>e||(0,aa.input)({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"}),mr=(e,t,r)=>{console.log(k.default.cyan.bold(`
166
184
  \u{1F916} AI-Powered Generation
167
- `)),console.log(h.default.dim(`Service: ${e.split("/").pop()}`)),console.log(h.default.dim(`Path: ${e}`)),console.log(h.default.dim(`Model: ${t.model}`)),console.log(h.default.dim(`Description: ${n}
168
- `))},Wt=async(e,t)=>{let{servicePath:n,description:r="",serviceType:o,packageManager:s}=e,a=n.split("/").pop()||n,i=ml(),c=(0,Ie.join)(i.workspaceRoot,Sn);(0,ne.writeFileSync)(c,`generating:${n}`);let l=()=>{(0,ne.existsSync)(c)&&(0,ne.unlinkSync)(c)},p=()=>{l(),process.exit(130)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(h.default.cyan.bold(`
185
+ `)),console.log(k.default.dim(`Service: ${e.split("/").pop()}`)),console.log(k.default.dim(`Path: ${e}`)),console.log(k.default.dim(`Model: ${t.model}`)),console.log(k.default.dim(`Description: ${r}
186
+ `))},dr=async(e,t)=>{let{servicePath:r,description:n="",serviceType:o,packageManager:s}=e,a=r.split("/").pop()||r,i=dp(),c=(0,Be.join)(i.workspaceRoot,Gr);(0,ce.writeFileSync)(c,`generating:${r}`);let l=()=>{(0,ce.existsSync)(c)&&(0,ce.unlinkSync)(c)},p=()=>{l(),process.exit(C.CANCELLED)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(k.default.cyan.bold(`
169
187
  \u{1F916} AI Generation
170
- `));let d=await dl(t,i,n,r,o,s),k=yl(d,a);if(!k)return!1;kl(k);let I=(0,os.default)({text:"Processing files...",color:"cyan"}).start(),Ve=ul(k.commands,o),O=vl(Ve,n,i.cwd),Bi=Cl(k.files,o);await Yo(Ve,O,i.workspaceRoot);let{missingContractCommands:Br}=await _o(Bi,O,i,I);if(k.postCommands.length>0)await Qn(k.postCommands,i.workspaceRoot);else if(Br.length>0){console.log(h.default.cyan(`\u{1F527} Auto-creating missing contracts...
171
- `));let Wi=Br.map(Gi=>({command:Gi,isPfCommand:!0}));await Qn(Wi,i.workspaceRoot)}return yo(O),await Qo(k.dependencies,O,I),await Xo(i.workspaceRoot,I),await Oo(O,I),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};var as=require("node:fs"),it=require("ts-morph"),ss=new it.Project({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),er=e=>{if(!(0,as.existsSync)(e))return null;let t=ss.getSourceFile(e);return t||ss.addSourceFileAtPath(e)},tr=e=>{e.saveSync()},nr=(e,t,n)=>{let r=e.getImportDeclaration(t);if(r){let o=r.getNamedImports().map(a=>a.getName()),s=n.filter(a=>!o.includes(a));for(let a of s)r.addNamedImport(a);return}e.addImportDeclaration({moduleSpecifier:t,namedImports:n})},xl=e=>{for(let t of e.getClasses()){let n=t.getDecorator("Module");if(!n)continue;let r=n.getArguments();if(r.length===0)continue;let o=r[0];if(o.getKind()===it.SyntaxKind.ObjectLiteralExpression)return o}return null},rr=(e,t)=>{let n=xl(e);if(!n)return!1;let r=n.getProperty("imports");if(r){let o=r.getFirstChildByKind(it.SyntaxKind.ArrayLiteralExpression);return o?(o.getElements().map(a=>a.getText()).includes(t)||o.addElement(t),!0):!1}return n.addPropertyAssignment({name:"imports",initializer:`[${t}]`}),!0};var Gt=require("node:fs"),ct=u(require("node:path")),or=u(require("chalk"));var is=async e=>{await le("bash",["-c",`
188
+ `));let d=await up(t,i,r,n,o,s),x=kp(d,a);if(!x)return!1;vp(x);let H=(0,ia.default)({text:"Processing files...",color:"cyan"}).start(),at=gp(x.commands,o),B=Cp(at,r,i.cwd),Ec=xp(x.files,o);await ta(at,B,i.workspaceRoot);let{missingContractCommands:vo}=await Bs(Ec,B,i,H);if(x.postCommands.length>0)await En(x.postCommands,i.workspaceRoot);else if(vo.length>0){console.log(k.default.cyan(`\u{1F527} Auto-creating missing contracts...
189
+ `));let $c=vo.map(Ac=>({command:Ac,isPfCommand:!0}));await En($c,i.workspaceRoot)}return _s(B),await ra(x.dependencies,B,H),await Hs(B,H),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};var la=require("node:fs"),Ct=require("ts-morph"),ca=new Ct.Project({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),$n=e=>{if(!(0,la.existsSync)(e))return null;let t=ca.getSourceFile(e);return t||ca.addSourceFileAtPath(e)},An=e=>{e.saveSync()},In=(e,t,r)=>{let n=e.getImportDeclaration(t);if(n){let o=n.getNamedImports().map(a=>a.getName()),s=r.filter(a=>!o.includes(a));for(let a of s)n.addNamedImport(a);return}e.addImportDeclaration({moduleSpecifier:t,namedImports:r})},wp=e=>{for(let t of e.getClasses()){let r=t.getDecorator("Module");if(!r)continue;let n=r.getArguments();if(n.length===0)continue;let o=n[0];if(o.getKind()===Ct.SyntaxKind.ObjectLiteralExpression)return o}return null},Rn=(e,t)=>{let r=wp(e);if(!r)return!1;let n=r.getProperty("imports");if(n){let o=n.getFirstChildByKind(Ct.SyntaxKind.ArrayLiteralExpression);return o?(o.getElements().map(a=>a.getText()).includes(t)||o.addElement(t),!0):!1}return r.addPropertyAssignment({name:"imports",initializer:`[${t}]`}),!0};var ur=require("node:fs"),xt=u(require("node:path")),Nn=u(require("chalk"));g();var pa=async e=>{await ge("bash",["-c",`
172
190
  curl -fsSL https://bun.sh/install | bash && if [ -f "$HOME/.bun/bin/bun" ]; then export PATH="$HOME/.bun/bin:$PATH"; fi
173
- `],{task:e,shell:!0}),await wl()},sr=()=>rt("bun"),cs=()=>xn([{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"}),ls=()=>xn([{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:or.default.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),wl=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 n=[ct.default.join(t,".zshrc"),ct.default.join(t,".bashrc"),ct.default.join(t,".bash_profile")];for(let r of n)try{if(await Gt.promises.stat(r).then(()=>!0).catch(()=>!1)){(await Gt.promises.readFile(r,"utf8")).includes(e)||(await Gt.promises.appendFile(r,`
191
+ `],{task:e,shell:!0}),await bp()},Mn=()=>ct("bun"),ma=()=>Br([{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"}),da=()=>Br([{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:Nn.default.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),bp=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=[xt.default.join(t,".zshrc"),xt.default.join(t,".bashrc"),xt.default.join(t,".bash_profile")];for(let n of r)try{if(await ur.promises.stat(n).then(()=>!0).catch(()=>!1)){(await ur.promises.readFile(n,"utf8")).includes(e)||(await ur.promises.appendFile(n,`
174
192
  # Added by platform installer
175
193
  ${e}
176
- `),m.log(`Added Bun path to ${ct.default.basename(r)}`));return}}catch(o){m.error(`Failed to update ${r}: ${o.message}`)}m.warn("No shell config file (.zshrc, .bashrc, .bash_profile) found. Please add the following manually:"),m.log(or.default.cyan(e))};var M=require("node:fs"),Re=require("node:path");var lt=require("node:fs"),Ut=require("node:path"),bl=e=>e.isDirectory()&&e.name!=="node_modules",Sl=(e,t)=>{let n=t.replace(".ts",""),r=(0,Ut.join)(e,`${n}.mock.json`);return(0,lt.existsSync)(r)},Pl=(e,t)=>t.endsWith(".ts")&&t!=="index.ts"&&Sl(e,t),Tl=(e,t)=>{let n=t.replace(".ts","");return`${e.replace(/s$/,"")}.${n}`},$l=e=>(0,lt.readdirSync)(e,{withFileTypes:!0}).filter(bl).flatMap(r=>{let o=(0,Ut.join)(e,r.name);return(0,lt.readdirSync)(o).filter(a=>Pl(o,a)).map(a=>Tl(r.name,a))}),ar=()=>{try{let e=(0,Ut.join)(process.cwd(),"packages","contracts","src","events");return $l(e).sort()}catch{return[]}},ps=()=>ar();var ms=require("node:fs"),ds=require("node:path"),pt=u(require("chalk"));var Jt=u(require("chalk")),pe=e=>{let t=Math.max(...e.commands.map(o=>o.name.length)),n=e.commands.map(o=>{let s=" ".repeat(t-o.name.length+3);return` ${Jt.default.cyan(o.name)}${s}${o.description}`}),r=e.footer||'Run "<command> --help" for more information';return[Jt.default.cyan.bold(`
194
+ `),m.log(`Added Bun path to ${xt.default.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(Nn.default.cyan(e))};var N=require("node:fs"),Ge=require("node:path");v();var wt=require("node:fs"),gr=require("node:path"),ua=require("@crossdelta/cloudevents"),Sp=e=>e.isDirectory()&&e.name!=="node_modules",Pp=(e,t)=>{let r=t.replace(".ts",""),n=(0,gr.join)(e,`${r}.mock.json`);return(0,wt.existsSync)(n)},Tp=(e,t)=>t.endsWith(".ts")&&t!=="index.ts"&&Pp(e,t),Ep=(e,t)=>{let r=t.replace(".ts","");return`${(0,ua.singularize)(e)}.${r}`},$p=e=>(0,wt.readdirSync)(e,{withFileTypes:!0}).filter(Sp).flatMap(n=>{let o=(0,gr.join)(e,n.name);return(0,wt.readdirSync)(o).filter(a=>Tp(o,a)).map(a=>Ep(n.name,a))}),On=()=>{try{let e=(0,gr.join)(process.cwd(),"packages","contracts","src","events");return $p(e).sort()}catch{return[]}},ga=()=>On();var fa=require("node:fs"),ha=require("node:path"),bt=u(require("chalk"));v();var fr=u(require("chalk")),he=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` ${fr.default.cyan(o.name)}${s}${o.description}`}),n=e.footer||'Run "<command> --help" for more information';return[fr.default.cyan.bold(`
177
195
  ${e.title}
178
196
  `),`Available commands:
179
- `,...n,"",Jt.default.dim(`${r}
197
+ `,...r,"",fr.default.dim(`${n}
180
198
  `)].join(`
181
- `)};var El=(e,t)=>t.some(n=>n.name()===e),Al=(e,t)=>t.pf?.commands?.[e]??null,Il=(e,t)=>!!t.scripts?.[e],Nl=(e,t)=>t.cwd?(0,ds.join)(e,t.cwd):e,Rl=(e,t)=>t.command||e,Ml=(e,t,n,r)=>{let o=Nl(r,n),s=Rl(e,n);if(n.cwd&&!(0,ms.existsSync)(o))return console.error(pt.default.red(`
199
+ `)};var Ap=(e,t)=>t.some(r=>r.name()===e),Ip=(e,t)=>t.pf?.commands?.[e]??null,Rp=(e,t)=>!!t.scripts?.[e],Np=(e,t)=>t.cwd?(0,ha.join)(e,t.cwd):e,Mp=(e,t)=>t.command||e,Op=(e,t,r,n)=>{let o=Np(n,r),s=Mp(e,r);if(r.cwd&&!(0,fa.existsSync)(o))return console.error(bt.default.red(`
182
200
  \u2716 Directory not found: ${o}
183
- `)),!0;let a=n.cwd?pt.default.dim(` in ${n.cwd}/`):"";return console.log(pt.default.dim(`Running ${s}${a}`)),jt(s,t,{cwd:o}),!0},jl=(e,t,n)=>(console.log(pt.default.dim(`Running workspace script: ${e}`)),nt(e,{args:t,cwd:n}),!0);async function Fl(e,t,n){if(El(e,n))return!1;let r;try{r=y()}catch{return!1}let o=J(r);if(!o)return!1;let s=Al(e,o);return s?Ml(e,t,s,r):Il(e,o)?jl(e,t,r):!1}function us(){let e;try{e=J()}catch{return{configured:[],scripts:[]}}if(!e)return{configured:[],scripts:[]};let t=Object.keys(e.pf?.commands??{}),r=Object.keys(e.scripts??{}).filter(o=>!t.includes(o));return{configured:t,scripts:r}}function ir(){let{configured:e,scripts:t}=us();return[...e,...t]}function gs(){let{configured:e,scripts:t}=us(),n=[...e,...t];if(n.length===0)return"";let o=J()?.pf?.commands||{},s=n.map(a=>({name:a,description:o[a]?.description||Kt[a]||""}));return pe({title:"Workspace Commands",commands:s,footer:""})}function fs(e,t,n){let r=t.slice(2);if(r.length>0&&!r[0].startsWith("-")){let o=r[0],s=r.slice(1);if(o==="__workspace-commands"&&s.includes("--names-only")){let a=ir();for(let i of a)console.log(i);return}Fl(o,s,n).then(a=>{a||e.parse(t)})}else e.parse(t)}var hs={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"},ys=(e,t)=>t?`${e}:${t}`:e,Ol=()=>Object.entries(hs).map(([e,t])=>ys(e,t)),_l=()=>{try{let e=ir(),n=J()?.pf?.commands||{},r=Object.keys(hs);return e.filter(o=>!r.includes(o)).map(o=>{let s=n[o]?.description||Kt[o]||"";return ys(o,s)})}catch{return[]}},Dl=()=>{try{return ps()}catch{return[]}},cr=()=>({commands:[...Ol(),..._l()],events:Dl()});var mt="node_modules/.cache/pf",dt="completion-cache";var Ll=e=>{let t=R.version||"0.0.0",n=e.commands.join("|"),r=e.events.join("|");return`${t} ${n} ${r}`},Hl=e=>{let t=e.split(" ");if(t.length===3){let[o,s,a]=t;return{version:o,commands:s?s.split("|"):[],events:a?a.split("|"):[]}}let[n,r]=t;return{commands:n?n.split("|"):[],events:r?r.split("|"):[]}},Bl=e=>{let t=(0,Re.join)(e,mt);return(0,Re.join)(t,dt)},Wl=(e,t=!1)=>{if(t)return!0;let n=Bl(e);if(!(0,M.existsSync)(n))return!0;let r=(0,M.readFileSync)(n,"utf-8").trim(),o=Hl(r),s=R.version||"0.0.0";if(o.version!==s)return!0;let a=(0,Re.join)(e,"package.json");if(!(0,M.existsSync)(a))return!1;let i=(0,M.statSync)(n).mtimeMs;return(0,M.statSync)(a).mtimeMs>i};var Gl=(e,t)=>{let n=(0,Re.join)(e,mt),r=(0,Re.join)(n,dt);(0,M.existsSync)(n)||(0,M.mkdirSync)(n,{recursive:!0});let o=Ll(t);(0,M.writeFileSync)(r,o,"utf-8")},zt=(e={})=>{let t;try{t=y()}catch{return!1}if(!t)return!1;if(!Wl(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let n=cr();return Gl(t,n),e.verbose&&console.log(`[completion] Cache regenerated: ${n.commands.length} commands, ${n.events.length} events`),!0},ye=(e={})=>{zt({...e,force:!0})};var V=require("node:fs"),lr=require("node:os"),qt=require("node:path"),ke=u(require("chalk"));var ks=`${mt}/${dt}`,vs=e=>`# ${e} completion (workspace-local cache)
201
+ `)),!0;let a=r.cwd?bt.default.dim(` in ${r.cwd}/`):"";return console.log(bt.default.dim(`Running ${s}${a}`)),Zt(s,t,{cwd:o}),!0},jp=(e,t,r)=>(console.log(bt.default.dim(`Running workspace script: ${e}`)),mt(e,{args:t,cwd:r}),!0);async function Fp(e,t,r){if(Ap(e,r))return!1;let n;try{n=y()}catch{return!1}let o=U(n);if(!o)return!1;let s=Ip(e,o);return s?Op(e,t,s,n):Rp(e,o)?jp(e,t,n):!1}function ya(){let e;try{e=U()}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 jn(){let{configured:e,scripts:t}=ya();return[...e,...t]}function ka(){let{configured:e,scripts:t}=ya(),r=[...e,...t];if(r.length===0)return"";let o=U()?.pf?.commands||{},s=r.map(a=>({name:a,description:o[a]?.description||hr[a]||""}));return he({title:"Workspace Commands",commands:s,footer:""})}function va(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 a=jn();for(let i of a)console.log(i);return}Fp(o,s,r).then(a=>{a||e.parse(t)})}else e.parse(t)}v();var Ca={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"},hr={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"},xa=(e,t)=>t?`${e}:${t}`:e,_p=()=>Object.entries(Ca).map(([e,t])=>xa(e,t)),Dp=()=>{try{let e=jn(),r=U()?.pf?.commands||{},n=Object.keys(Ca);return e.filter(o=>!n.includes(o)).map(o=>{let s=r[o]?.description||hr[o]||"";return xa(o,s)})}catch{return[]}},Lp=()=>{try{return ga()}catch{return[]}},Hp=async()=>{try{let e=y();return await Ss(e)}catch{return[]}},Fn=async()=>({commands:[..._p(),...Dp()],events:Lp(),services:await Hp()});var St="node_modules/.cache/pf",Pt="completion-cache";var Bp=e=>{let t=_.version||"0.0.0",r=e.commands.join("|"),n=e.events.join("|"),o=e.services.join("|");return`${t} ${r} ${n} ${o}`},wa=e=>{let t=e.split(" ");if(t.length===4){let[o,s,a,i]=t;return{version:o,commands:s?s.split("|"):[],events:a?a.split("|"):[],services:i?i.split("|"):[]}}if(t.length===3){let[o,s,a]=t;return{version:o,commands:s?s.split("|"):[],events:a?a.split("|"):[],services:[]}}let[r,n]=t;return{commands:r?r.split("|"):[],events:n?n.split("|"):[],services:[]}},ba=e=>{let t=(0,Ge.join)(e,St);return(0,Ge.join)(t,Pt)},Wp=(e,t=!1)=>{if(t)return!0;let r=ba(e);if(!(0,N.existsSync)(r))return!0;let n=(0,N.readFileSync)(r,"utf-8").trim(),o=wa(n),s=_.version||"0.0.0";if(o.version!==s)return!0;let a=(0,Ge.join)(e,"package.json");if(!(0,N.existsSync)(a))return!1;let i=(0,N.statSync)(r).mtimeMs;return(0,N.statSync)(a).mtimeMs>i},_n=e=>{let t=ba(e);if(!(0,N.existsSync)(t))return null;try{let r=(0,N.readFileSync)(t,"utf-8").trim();return wa(r)}catch{return null}},Gp=(e,t)=>{let r=(0,Ge.join)(e,St),n=(0,Ge.join)(r,Pt);(0,N.existsSync)(r)||(0,N.mkdirSync)(r,{recursive:!0});let o=Bp(t);(0,N.writeFileSync)(n,o,"utf-8")},yr=async(e={})=>{let t;try{t=y()}catch{return!1}if(!t)return!1;if(!Wp(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let r=await Fn();return Gp(t,r),e.verbose&&console.log(`[completion] Cache regenerated: ${r.commands.length} commands, ${r.events.length} events`),!0},ye=async(e={})=>{await yr({...e,force:!0})};var te=require("node:fs"),Dn=require("node:os"),kr=require("node:path"),$e=u(require("chalk"));var Sa=`${St}/${Pt}`,Pa=e=>`# ${e} completion (workspace-local cache)
184
202
  # Generated: ${new Date().toISOString()}
185
203
 
186
204
  # Cache file path (relative to workspace root)
187
- _${e}_cache_path="${ks}"
205
+ _${e}_cache_path="${Sa}"
188
206
 
189
207
  # Find workspace root (walk up to find monorepo package.json)
190
208
  _${e}_find_workspace() {
@@ -223,16 +241,22 @@ _${e}_completions() {
223
241
  cache_data=$(_${e}_read_cache "$ws_root")
224
242
  fi
225
243
 
226
- # Parse data: "version cmd1:desc1|cmd2:desc2 events"
244
+ # Parse data: "version cmd1:desc1|cmd2:desc2 events services"
227
245
  # Split by tabs, skip first field (version)
228
246
  local -a parts
229
247
  parts=("\${(@s: :)cache_data}")
230
248
 
231
249
  local commands_str=""
232
250
  local events_str=""
251
+ local services_str=""
233
252
 
234
- if [[ \${#parts[@]} -eq 3 ]]; then
235
- # New format: version commands events
253
+ if [[ \${#parts[@]} -eq 4 ]]; then
254
+ # New format with services: version commands events services
255
+ commands_str="\${parts[2]}"
256
+ events_str="\${parts[3]}"
257
+ services_str="\${parts[4]}"
258
+ elif [[ \${#parts[@]} -eq 3 ]]; then
259
+ # Format without services: version commands events
236
260
  commands_str="\${parts[2]}"
237
261
  events_str="\${parts[3]}"
238
262
  elif [[ \${#parts[@]} -eq 2 ]]; then
@@ -305,11 +329,11 @@ _${e}_completions() {
305
329
  esac
306
330
  }
307
331
 
308
- compdef _${e}_completions ${e}`,Cs=e=>`# ${e} completion (workspace-local cache)
332
+ compdef _${e}_completions ${e}`,Ta=e=>`# ${e} completion (workspace-local cache)
309
333
  # Generated: ${new Date().toISOString()}
310
334
 
311
335
  # Cache file path (relative to workspace root)
312
- _${e}_cache_path="${ks}"
336
+ _${e}_cache_path="${Sa}"
313
337
 
314
338
  # Find workspace root
315
339
  _${e}_find_workspace() {
@@ -342,17 +366,23 @@ _${e}_completions() {
342
366
  local cache_data=""
343
367
  local commands_str=""
344
368
  local events_str=""
369
+ local services_str=""
345
370
  local in_workspace=0
346
371
 
347
372
  if [[ -n "$ws_root" ]]; then
348
373
  in_workspace=1
349
374
  cache_data=$(_${e}_read_cache "$ws_root")
350
375
 
351
- # Parse data: "version cmd1:desc1|cmd2:desc2 events"
376
+ # Parse data: "version cmd1:desc1|cmd2:desc2 events services"
352
377
  IFS=$'\\t' read -ra parts <<< "$cache_data"
353
378
 
354
- if [[ \${#parts[@]} -eq 3 ]]; then
355
- # New format: version commands events
379
+ if [[ \${#parts[@]} -eq 4 ]]; then
380
+ # New format with services: version commands events services
381
+ commands_str="\${parts[1]}"
382
+ events_str="\${parts[2]}"
383
+ services_str="\${parts[3]}"
384
+ elif [[ \${#parts[@]} -eq 3 ]]; then
385
+ # Format without services: version commands events
356
386
  commands_str="\${parts[1]}"
357
387
  events_str="\${parts[2]}"
358
388
  elif [[ \${#parts[@]} -eq 2 ]]; then
@@ -397,11 +427,11 @@ _${e}_completions() {
397
427
  return 0
398
428
  }
399
429
 
400
- complete -F _${e}_completions ${e}`;var Ul=(e,t)=>(0,qt.join)((0,lr.homedir)(),`.${t}-completion.${e}`),ws=e=>{let t=(0,lr.homedir)();return e==="zsh"?(0,qt.join)(t,".zshrc"):(0,qt.join)(t,".bashrc")},Jl=e=>`[[ -f "${e}" ]] && source "${e}"`,Kl=(e,t)=>(0,V.existsSync)(e)?(0,V.readFileSync)(e,"utf-8").includes(t):!1,zl=(e,t)=>{let n=(0,V.existsSync)(e)?(0,V.readFileSync)(e,"utf-8"):"",r=n.endsWith(`
401
- `)?`${n}${t}
402
- `:`${n}
430
+ complete -F _${e}_completions ${e}`;var Up=(e,t)=>(0,kr.join)((0,Dn.homedir)(),`.${t}-completion.${e}`),$a=e=>{let t=(0,Dn.homedir)();return e==="zsh"?(0,kr.join)(t,".zshrc"):(0,kr.join)(t,".bashrc")},Jp=e=>`[[ -f "${e}" ]] && source "${e}"`,Kp=(e,t)=>(0,te.existsSync)(e)?(0,te.readFileSync)(e,"utf-8").includes(t):!1,zp=(e,t)=>{let r=(0,te.existsSync)(e)?(0,te.readFileSync)(e,"utf-8"):"",n=r.endsWith(`
431
+ `)?`${r}${t}
432
+ `:`${r}
403
433
  ${t}
404
- `;(0,V.writeFileSync)(e,r,"utf-8")},ql=(e,t)=>{let n=Ul(e,t),r=e==="zsh"?vs(t):Cs(t);return(0,V.writeFileSync)(n,r,"utf-8"),n},xs=(e,t,n)=>{let r=ql(e,t),o=ws(e),s=Jl(r);return Kl(o,s)?(n&&console.log(ke.default.dim(`[${e}] Already configured in ${o}`)),!1):(zl(o,s),n&&console.log(ke.default.green(`[${e}] Added source line to ${o}`)),!0)},Vl=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",pr=(e,t=!1)=>{let n=Vl();t&&console.log(ke.default.cyan(`Installing ${n} completion...`)),xs(n,e,t);let r=n==="zsh"?"bash":"zsh",o=ws(r);(0,V.existsSync)(o)&&xs(r,e,t),t&&(console.log(ke.default.green("\u2713 Shell completion installed")),console.log(ke.default.dim(` Run: ${ke.default.cyan("exec $SHELL")} to reload`)))};var $=u(require("chalk")),bs=require("execa"),Ss=require("jiti");var mr=async e=>{let{stdout:t}=await(0,bs.execa)("sh",["-c",e]);return t.trim()},Zl="pf-local-nats",Yl="2.10-alpine",Xl=4222,Ql=8222,ep=e=>({clientPort:e.clientPort??Xl,monitoringPort:e.monitoringPort??Ql,containerName:e.containerName??Zl,version:e.version??Yl}),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"],np=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),rp=async()=>{try{return await mr("docker info"),!0}catch{return!1}},op=async e=>{try{return(await mr(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var sp=async e=>{let t=tp(e);try{return await mr(`docker ${t.join(" ")}`),{success:!0,value:np(e)}}catch{return{success:!1}}},ap=e=>{console.log($.default.green("\u2713 NATS started")),console.log($.default.dim(` Client: ${e.clientUrl}`)),console.log($.default.dim(` Monitoring: ${e.monitoringUrl}`)),console.log($.default.dim(" Streams: ephemeral, auto-created by services")),console.log("")},Ps=async(e={})=>{let t=ep(e);if(!await rp())return console.log($.default.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await op(t.containerName))return console.log($.default.dim("\u2713 NATS already running")),!0;console.log($.default.cyan("\u{1F680} Starting development infrastructure...")),console.log($.default.dim(" NATS with JetStream (ephemeral)"));let n=await sp(t);return n.success?(ap(n.value),!0):(console.error($.default.red("\u2717 Failed to start NATS")),!1)},ip=e=>e.map(t=>({stream:t,subjects:[`${t.toLowerCase()}.*`],config:{storage:"memory",retention:"limits",maxAge:36e5}})),cp=e=>Array.from(new Set(Object.values(e).filter(t=>t!==null&&typeof t=="object"&&"channel"in t).map(t=>t.channel?.stream).filter(t=>!!t))),Ts=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:n}=C(e),o=await(0,Ss.createJiti)(e).import(n,{default:!0}),s=cp(o);if(s.length===0){console.log($.default.dim(" No streams found in contracts"));return}let a=ip(s);await t({streams:a}),console.log($.default.dim(` Created ${s.length} ephemeral stream(s): ${s.join(", ")}`))}catch(t){console.log($.default.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log($.default.dim(" Stream auto-creation will happen on first publish"))}};function $s(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
434
+ `;(0,te.writeFileSync)(e,n,"utf-8")},Vp=(e,t)=>{let r=Up(e,t),n=e==="zsh"?Pa(t):Ta(t);return(0,te.writeFileSync)(r,n,"utf-8"),r},Ea=(e,t,r)=>{let n=Vp(e,t),o=$a(e),s=Jp(n);return Kp(o,s)?(r&&console.log($e.default.dim(`[${e}] Already configured in ${o}`)),!1):(zp(o,s),r&&console.log($e.default.green(`[${e}] Added source line to ${o}`)),!0)},qp=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",Ln=(e,t=!1)=>{let r=qp();t&&console.log($e.default.cyan(`Installing ${r} completion...`)),Ea(r,e,t);let n=r==="zsh"?"bash":"zsh",o=$a(n);(0,te.existsSync)(o)&&Ea(n,e,t),t&&(console.log($e.default.green("\u2713 Shell completion installed")),console.log($e.default.dim(` Run: ${$e.default.cyan("exec $SHELL")} to reload`)))};Ie();var j=u(require("chalk")),Aa=require("execa"),Ia=require("jiti");v();var Hn=async e=>{let{stdout:t}=await(0,Aa.execa)("sh",["-c",e]);return t.trim()},Zp="pf-local-nats",Yp="2.10-alpine",Xp=4222,Qp=8222,em=e=>({clientPort:e.clientPort??Xp,monitoringPort:e.monitoringPort??Qp,containerName:e.containerName??Zp,version:e.version??Yp}),tm=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"],rm=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),nm=async()=>{try{return await Hn("docker info"),!0}catch{return!1}},om=async e=>{try{return(await Hn(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var sm=async e=>{let t=tm(e);try{return await Hn(`docker ${t.join(" ")}`),{success:!0,value:rm(e)}}catch{return{success:!1}}},am=e=>{console.log(j.default.green("\u2713 NATS started")),console.log(j.default.dim(` Client: ${e.clientUrl}`)),console.log(j.default.dim(` Monitoring: ${e.monitoringUrl}`)),console.log(j.default.dim(" Streams: ephemeral, auto-created by services")),console.log("")},Ra=async(e={})=>{let t=em(e);if(!await nm())return console.log(j.default.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await om(t.containerName))return console.log(j.default.dim("\u2713 NATS already running")),!0;console.log(j.default.cyan("\u{1F680} Starting development infrastructure...")),console.log(j.default.dim(" NATS with JetStream (ephemeral)"));let r=await sm(t);return r.success?(am(r.value),!0):(console.error(j.default.red("\u2717 Failed to start NATS")),!1)},im=e=>e.map(t=>({stream:t,subjects:[`${t.toLowerCase()}.*`],config:{storage:"memory",retention:"limits",maxAge:36e5}})),cm=e=>Array.from(new Set(Object.values(e).filter(t=>t!==null&&typeof t=="object"&&"channel"in t).map(t=>t.channel?.stream).filter(t=>!!t))),Na=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:r}=w(e),o=await(0,Ia.createJiti)(e,{moduleCache:!1}).import(r,{default:!0}),s=cm(o);if(s.length===0){console.log(j.default.dim(" No streams found in contracts"));return}let a=im(s);await t({streams:a}),console.log(j.default.dim(` Created ${s.length} ephemeral stream(s): ${s.join(", ")}`))}catch(t){console.log(j.default.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log(j.default.dim(" Stream auto-creation will happen on first publish"))}};function Ma(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
405
435
  import { ports } from '@crossdelta/infrastructure'
406
436
 
407
437
  /**
@@ -422,7 +452,7 @@ const config: K8sServiceConfig = {
422
452
  }
423
453
 
424
454
  export default config
425
- `}function Es(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
455
+ `}function Oa(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
426
456
  import { ports } from '@crossdelta/infrastructure'
427
457
 
428
458
  /**
@@ -443,91 +473,71 @@ const config: K8sServiceConfig = {
443
473
  }
444
474
 
445
475
  export default config
446
- `}var Z=u(require("chalk")),Ns=u(require("terminal-link"));var Vt="integrations-run";var S=require("zod"),lp=S.z.object({name:S.z.string(),description:S.z.string(),link:S.z.string().url().optional(),install:S.z.union([S.z.string(),S.z.array(S.z.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:S.z.array(S.z.string()).optional(),run:S.z.array(S.z.string()).optional(),initial:S.z.boolean().optional(),interactive:S.z.boolean().optional()}),As=S.z.array(lp);var Is=e=>{try{return As.parse(e)}catch(t){throw new Error(t.issues.map(n=>` - Path ${n.path.join(". ")} : ${n.message}`).join(`
447
- `))}};var G=()=>{try{let e=Yt("bin/integration.collection.json");return Is(e)}catch(e){throw new Error(`Failed to load integrations!
476
+ `}var re=u(require("chalk")),_a=u(require("terminal-link"));g();var vr="integrations-run";var I=require("zod"),lm=I.z.object({name:I.z.string(),description:I.z.string(),link:I.z.string().url().optional(),install:I.z.union([I.z.string(),I.z.array(I.z.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:I.z.array(I.z.string()).optional(),run:I.z.array(I.z.string()).optional(),initial:I.z.boolean().optional(),interactive:I.z.boolean().optional()}),ja=I.z.array(lm);var Fa=e=>{try{return ja.parse(e)}catch(t){throw new Error(t.issues.map(r=>` - Path ${r.path.join(". ")} : ${r.message}`).join(`
477
+ `))}};var z=()=>{try{let e=pt("bin/integration.collection.json");return Fa(e)}catch(e){throw new Error(`Failed to load integrations!
448
478
  Check your integration.collection.json:
449
- ${e.message}`)}},Me=()=>G().reduce((t,n)=>(n.initial&&t.push(n.name),t),[]),pp=e=>!!e?.name&&!!e?.link&&!!e?.description,Zt=e=>{let t=G();if(!t?.length||!e?.length)return;let n=e.map(r=>t.find(o=>o.name===r)).filter(pp);n.length&&(m.breakLine().log("\u{1F50C} Installed Integrations:"),n.forEach(({name:r,link:o,description:s})=>{let a=m.getStoredLogs(`${Vt}:${r}`);o&&m.log(`${(0,Ns.default)(Z.default.cyan(r),o)} - ${s}`),a.length&&m.log(a.map(i=>` \u203A ${Z.default.dim(i.message)}`).join(`
450
- `))}))},mp=e=>e.toUpperCase().replace(/-/g,"_"),Rs=(e,t)=>{let n=mp(e);m.breakLine().log(Z.default.bold("Environment variables:")).log(Z.default.dim(" Local:")).log(Z.default.cyan(` ${n}_PORT=${t}`)).log(Z.default.cyan(` ${n}_URL=http://localhost:${t}`)).breakLine().log(Z.default.dim(" Production (auto-configured):")).log(Z.default.cyan(` ${n}_PORT=${t}`)).log(Z.default.cyan(` ${n}_URL=http://${e}:${t}`))};var dr=u(require("chalk"));var dp=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},Ms=async e=>{let{selectedIntegrations:t,cwd:n,packageManager:r=x(),task:o}=e;if(!t?.length||!o)return;let s=up(t,n,r,o);await Xt(o,s)},up=(e,t,n,r)=>{let s=G()?.filter(i=>e.includes(i.name))?.flatMap(i=>i.install.map(c=>{let{name:l,version:p}=dp(c);return{title:dr.default.cyanBright(`Adding ${c} (${i.name})`),fn:async()=>{re(`dependencies.${l}`,p,t)}}})),a={title:dr.default.cyanBright("Installing packages..."),fn:async()=>{await H({cwd:t,packageManager:n,task:r})}};return[...s??[],a]};var js=u(require("chalk"));var Fs=async e=>{let{selectedIntegrations:t,cwd:n,task:r}=e;if(!t?.length||!r)return;let o=gp(t,n,r,e.packageManager);await Xt(r,o)},gp=(e,t,n,r)=>G().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(a=>({title:js.default.cyanBright(`Running "${a}" for ${s.name}
451
- `),fn:()=>fp(s,a,t,n,r)}))),fp=async(e,t,n,r,o)=>{let s=`${Vt}:${e.name}`;try{if(e.interactive)return Ro(t,[],{cwd:n,context:s,task:r,manager:o});await te(t,[],{cwd:n,task:r,context:s})}catch(a){m.error(`Failed to run command "${t}" for ${e.name}: ${a.message}`)}};var Qt=require("node:fs"),ut=require("node:path");var en=(e,t)=>{try{let n=(0,Qt.readFileSync)(e,"utf-8"),r=JSON.parse(n);t(r),(0,Qt.writeFileSync)(e,JSON.stringify(r,null,2),"utf-8")}catch{}},hp=e=>{let t=(0,ut.join)(g(e),"tsconfig.json");en(t,n=>{n.compilerOptions.module="ESNext",n.compilerOptions.moduleResolution="bundler",n.compilerOptions.resolvePackageJsonExports=!0,n.compilerOptions.types=n.compilerOptions.types||[],n.compilerOptions.types.includes("bun-types")||n.compilerOptions.types.push("bun-types"),n.exclude=["node_modules","dist"]})},yp=e=>{let t=(0,ut.join)(g(e),"tsconfig.build.json");en(t,n=>{n.exclude=["node_modules","test","dist","**/*.spec.ts","**/*.test.ts"]})},kp=e=>{let t=(0,ut.join)(g(e),"nest-cli.json");en(t,n=>{n.compilerOptions=n.compilerOptions||{},n.compilerOptions.tsConfigPath="tsconfig.build.json"})},vp=e=>{let t=(0,ut.join)(g(e),"package.json");en(t,n=>{delete n.jest})},Os=e=>{hp(e),yp(e),kp(e),vp(e)};var _s=require("node:path");var Cp=(e,t)=>{let n=er(e);if(n){for(let{className:r,importPath:o}of t)nr(n,o,[r]),rr(n,r);tr(n)}},Ds=e=>{let t=(0,_s.join)(g(e),"src","app.module.ts");Cp(t,[{className:"EventsModule",importPath:"./events/events.module"}])};var xp=require("fs-extra");var bp=u(require("chalk")),Sp=u(require("cli-table3"));var Ls=require("node:fs"),Hs=require("node:path"),Bs=u(require("handlebars"));var je=(e,t)=>oo(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),ur=(e,t={})=>{let n=(0,Ls.readFileSync)(e,"utf-8");return Bs.default.compile(n)(t)},tn=e=>(t,n={})=>{let r=(0,Hs.join)(e,t);return ur(r,n)};var gt=e=>e.toUpperCase().replace(/-/g,"_");var Ws=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");var ft=u(require("chalk")),m={logs:[],breakLine:()=>(console.log(),m),success:(e,...t)=>(console.log(ft.default.green(`\u2714 ${e}`),...t),m),info:(e,...t)=>(console.log(ft.default.cyan(`\u{1F6C8} ${e}`),...t),m),warn:(e,...t)=>(console.warn(ft.default.yellow(`\u26A0\uFE0E ${e}`),...t),m),error:(e,...t)=>(console.error(ft.default.red(`\u2716 ${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 me=e=>{let t=new Us.Command(e.name).description(e.description).showHelpAfterError();e.arguments?.forEach(([s,a])=>{t.argument(s,a)}),e.options?.forEach(([s,a])=>{t.option(s,a)}),e.exampleUsage&&t.addHelpText("after",()=>`${gr.default.cyan.bold(`
452
- Example:`)}
453
- ${gr.default.bold(e.exampleUsage)}
454
- `),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??"");let n=async s=>{e.prompts?.length&&await new fr.Listr(Gs(e.prompts,s),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(s),await new fr.Listr(Gs(e.actions,s),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(s),await e.onComplete?.(s)},r=()=>{try{let s=y();return no(s),s}catch{return null}},o=s=>{m.error(s.message)};return t.action(async(...s)=>{let a=null;try{let i=s.at(-1),c=i.args,l=i.opts(),p=Pp(e.arguments??[],c);if(e.shouldSkipWorkflow?.(p,l)){await e.onSkipWorkflow?.(p,l);return}let d=await e.buildContext(p,l);a=r(),await n(d)}catch(i){o(i)}finally{a&&Pn(a)}}),t},Pp=(e,t)=>{let n=e.map(([r],o)=>[r.replace(/[<>[\]]/g,""),t[o]]);return Object.fromEntries(n)},Gs=(e,t)=>e.map(n=>typeof n=="function"?n(t):n);var Js=(e,t)=>{let n=null;return(...r)=>(n&&clearTimeout(n),new Promise(o=>{n=setTimeout(async()=>{n=null,await e(...r),o()},t)}))};function nn(e,t,n){let r=t.split("."),o=e;for(;r.length>1;){let s=r.shift();s in o||(o[s]={}),o=o[s]}o[r[0]]=n}var Ks=require("execa");function rt(e){try{return(0,Ks.execaSync)(e,["--version"]),!0}catch{return!1}}var Fe=require("node:path"),zs=require("fs-extra"),qs=require("package-up"),Vs=require("rimraf"),g=e=>(0,Fe.join)(process.cwd(),e),rn=e=>{try{return(0,zs.readdirSync)(e).length===0}catch{return!0}};function Zs(){let e=(0,qs.packageUpSync)({cwd:(0,Fe.dirname)(__filename)});if(!e)throw new Error("Could not find package.json");return(0,Fe.dirname)(e)}var Ys=e=>(0,Vs.rimraf)(e);var Xs=u(require("chalk"));async function P(e,t){let n=Date.now(),r=e.title,o=()=>Math.floor((Date.now()-n)/1e3),s=setInterval(()=>{o()>1&&(e.title=`${r} (${o()}s)`)},1e3);try{return await t(o)}finally{clearInterval(s)}}async function Xt(e,t,n){for(let r=0;r<t.length;r++){let o=t[r];e.output=Xs.default.dim(`[${r+1}/${t.length}] ${o.title}`),await o.fn(n??{},e)}}var ht={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},Tp={docs:{base:["service.md"],frameworks:{}},serviceTypes:{hono:{commandType:"hono-micro",entryPoint:"src/index.ts",skipFiles:[]},nest:{commandType:"nest-micro",entryPoint:"src/main.ts",skipFiles:[]}}},hr=e=>{if(!(0,ve.existsSync)(e))return null;try{return JSON.parse((0,ve.readFileSync)(e,"utf-8"))}catch{return null}},on=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,$p=e=>e.split("/").pop()||"workspace",Ep=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},Qs=e=>e.split("."),Ap=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||(0,ve.existsSync)((0,E.join)(t,"turbo.json")))return!0;let n=Gr.some(o=>(0,ve.existsSync)((0,E.join)(t,o))),r=(0,ve.existsSync)((0,E.join)(t,"infra"));return n&&r},Ip=e=>{let t=hr((0,E.join)(e,"package.json"));return t?Ap(t,e):!1},ea=e=>{let t=e;for(;t;){if(Ip(t))return t;t=Ep(t)}return null},ta=()=>ea(process.cwd())!==null,y=()=>{let e=ea(process.cwd());if(!e)throw new Error(`
455
- \x1B[31m\u2716\x1B[0m Not in a workspace directory
456
-
457
- Current directory: ${process.cwd()}
458
-
459
- This command must be run from within a workspace created with \x1B[36mpf new workspace\x1B[0m
460
-
461
- To create a new workspace, run:
462
-
463
- \x1B[36mpf new workspace my-platform\x1B[0m
464
- `);return e},J=e=>{let t=e??y();return hr((0,E.join)(t,"package.json"))},B=e=>{let t=J(e);if(!t?.pf?.paths)return ht;let{paths:n}=t.pf;return{services:on(n.services,ht.services),apps:on(n.apps,ht.apps),packages:on(n.packages,ht.packages),contracts:on(n.contracts,ht.contracts)}},C=e=>{let t=e??y(),n=B(t),r=(0,E.join)(t,n.contracts);return{packagePath:r,eventsPath:(0,E.join)(r,"src","events"),indexPath:(0,E.join)(r,"src","index.ts"),relativePath:n.contracts}},Ee=()=>{let e=y(),t=hr((0,E.join)(e,"package.json")),n=`@${$p(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:n},Np=(e,t)=>{let n=Qs(t),r=e;for(let o of n){if(r===null||typeof r!="object"||!(o in r))return;r=r[o]}return r},Rp=(e,t,n)=>{let r=Qs(t),o=r[r.length-1],s=e;for(let a of r.slice(0,-1))(!(a in s)||typeof s[a]!="object"||s[a]===null)&&(s[a]={}),s=s[a];s[o]=n},na=(e,t=process.cwd())=>{let n=(0,Ce.readJsonSync)((0,E.join)(t,"package.json"));return Np(n,e)},re=(e,t,n=process.cwd())=>{let r=(0,E.join)(n,"package.json"),o=(0,Ce.readJsonSync)(r);Rp(o,e,t),(0,Ce.writeJsonSync)(r,o,{spaces:2,EOL:`
465
- `,encoding:"utf-8"})},Yt=e=>{let t=Zs();return(0,Ce.readJSONSync)((0,E.resolve)(t,e),{encoding:"utf-8"})},R=Yt("package.json"),st=()=>R.generatorConfig??Tp;var Mp=e=>e==="yarn"?["npm","audit"]:["audit"],sa=new oa.Command("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{let n=y(),r=x(),o=Mp(r),s=t.args||[];console.log(ra.default.dim(`Running ${r} ${[...o,...s].join(" ")}`)),jt(r,[...o,...s],{cwd:n})});var de=require("@listr2/prompt-adapter-enquirer"),ae=u(require("chalk"));function sn(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function aa(e,t,n={},r=[],o=[]){if(!e){console.error("Subcommand is not defined.");return}let s=r.map(l=>t[l]).filter(l=>l!==void 0),a=o.map(l=>{let p=t[l];if(!(p===!1||p===void 0))return p===!0?`--${sn(String(l))}`:`--${sn(String(l))}=${String(p)}`}).filter(l=>l!==void 0),i=Object.entries(n).map(([l,p])=>{if(!(p===!1||p===void 0))return p===!0?`--${sn(l)}`:`--${sn(l)}=${String(p)}`}).filter(l=>l!==void 0),c=[...s,...a,...i].map(String);await e.parseAsync(c,{from:"user"})}var $a=require("node:path"),oe=u(require("chalk"));var ia=require("@listr2/prompt-adapter-enquirer"),Oe={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{if(e.userConfirmed=await t.prompt(ia.ListrEnquirerPromptAdapter).run({type:"Toggle",initial:!0,message:"\u{1F680} Ready to launch your project?"}),!e.userConfirmed)throw new Error("Project creation was canceled by the user.")}};var Y=require("node:fs"),_e=require("node:path");var jp=4001,Fp=4e3;function Op(e){let t=[],n=e.matchAll(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/g);for(let c of n)t.push(Number(c[1]));let r=e.matchAll(/\.add(?:Http|Grpc)?\((\d+)/g);for(let c of r)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 a=e.match(/httpPort\s*:\s*(\d+)/);a&&t.push(Number(a[1]));let i=e.matchAll(/const\s+\w*[pP]ort\w*\s*=\s*(\d+)/g);for(let c of i)t.push(Number(c[1]));return t}function _p(e,t){let n=t?jp:Fp,r=new Set;if(!(0,Y.existsSync)(e))return n;let o=(0,Y.readdirSync)(e).filter(a=>a.endsWith(".ts"));for(let a of o){let i=(0,_e.join)(e,a);try{let c=(0,Y.readFileSync)(i,"utf-8"),l=Op(c);for(let p of l)r.add(p)}catch{}}let s=n;for(;r.has(s);)s++;return s}function Dp(e){return(0,_e.basename)(e)}var an={title:"Creating infrastructure service config",task:async(e,t)=>{let n=Dp(e.projectName),r=y(),o=(0,_e.join)(r,"infra","services");if(!(0,Y.existsSync)(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=(0,_e.join)(o,`${n}.ts`);if((0,Y.existsSync)(s)){t.title=`Service config already exists: infra/services/${n}.ts`;return}let a=_p(o,!0);e.assignedPort=a;let i=e.serviceType==="hono"?$s(n,a):Es(n,a);(0,Y.writeFileSync)(s,i),t.title=`Created infra/services/${n}.ts (port: ${a})`}};var yt=require("node:child_process"),ca=require("node:fs"),la=require("node:path"),Lp=()=>{try{return(0,yt.execSync)("git --version",{stdio:"ignore"}),!0}catch{return!1}},Hp=e=>(0,ca.existsSync)((0,la.join)(e,".git")),pa={title:"Initializing git repository",enabled:()=>Lp(),skip:e=>Hp(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{(0,yt.execSync)("git init",{cwd:e.cwd,stdio:"ignore"}),(0,yt.execSync)("git add -A",{cwd:e.cwd,stdio:"ignore"}),(0,yt.execSync)('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)"}}};var ma=require("@listr2/prompt-adapter-enquirer"),yr=u(require("chalk"));var De={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!sr(),task:async(e,t)=>P(t,async n=>{await is(t),e.elapsedTime+=n(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},Le={enabled:e=>!sr()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{e.shouldInstallBun=await t.prompt(ma.ListrEnquirerPromptAdapter).run({type:"Toggle",message:"Would you like to use Bun? (recommended)",initial:!0,footer:["",`${yr.default.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${yr.default.underline("https://bun.sh")}`,cs(),ls()].join(`
466
- `)}),e.shouldInstallBun&&(e.packageManager="bun")}};var da=require("@listr2/prompt-adapter-enquirer"),kr=u(require("chalk"));var cn={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>P(t,async n=>{let{selectedIntegrations:r,cwd:o,packageManager:s}=e;await Ms({selectedIntegrations:r,packageManager:s,cwd:o,task:t}),e.elapsedTime+=n()}),rendererOptions:{outputBar:1e3}},ln={title:"Select integrations",enabled:e=>e.selectedIntegrations.length===0,task:async(e,t)=>{e.selectedIntegrations=await t.prompt(da.ListrEnquirerPromptAdapter).run({type:"MultiSelect",hint:`
467
- Press <space> to select/deselect, <enter> to confirm, <i> to invert selection`,message:"Which integrations would you like to include?",initial:Me().map((n,r)=>r),choices:e.availableIntegrations.map(({name:n,description:r})=>({name:n,message:[kr.default.bold(n),r].join(" - "),value:n}))}),!e.selectedIntegrations||e.selectedIntegrations.length===0?t.title="No integrations selected.":t.title=["Selected integrations:",...e.selectedIntegrations.map(n=>kr.default.bold(`\u2022 ${n}`))].join(`
468
- `)}};var ua={title:"Install Nest CLI",task:async(e,t)=>P(t,async n=>{await No({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=n()}),rendererOptions:{outputBar:1e3}};var pn={title:"Install dependencies",task:async(e,t)=>P(t,async n=>{await H({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=n()})};var ga=require("@listr2/prompt-adapter-enquirer"),fa=u(require("chalk"));var He={enabled:e=>!e.removeDir&&!rn(e.cwd),task:async(e,t)=>{if(e.removeDir=await t.prompt(ga.ListrEnquirerPromptAdapter).run({type:"Toggle",message:fa.default.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!e.removeDir)throw new Error("Project creation was canceled by the user.")}},Be={enabled:e=>!!e.removeDir,task:async e=>Ys(e.cwd)};var mn={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>P(t,async n=>{let{selectedIntegrations:r,cwd:o}=e;await Fs({selectedIntegrations:r,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=n()}),rendererOptions:{outputBar:1}};var ha=require("@listr2/prompt-adapter-enquirer");var Bp=["services/my-hono-service","services/my-nest-service","my-platform"],We={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?Bp.includes(e.projectName):!0,task:async(e,t)=>{e.projectName=await t.prompt(ha.ListrEnquirerPromptAdapter).run({type:"Input",initial:e.projectName,message:"Enter project name",validate:n=>n?!0:"Project name is required."}),e.cwd&&(e.cwd=g(e.projectName))}};var ya=require("@listr2/prompt-adapter-enquirer"),vr=u(require("chalk"));var Ge={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=Vn(),e.packageManager){t.title=`Using ${vr.default.bold(e.packageManager)} as package manager.`;return}e.packageManager=await t.prompt(ya.ListrEnquirerPromptAdapter).run({type:"Select",message:"Which package manager would you like to use?",initial:Zn(),choices:Io}),t.title=`Using ${vr.default.bold(e.packageManager)} as package manager.`}};var dn=require("@listr2/prompt-adapter-enquirer"),kt=u(require("chalk")),ka={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${kt.default.bold(e.githubOwner)}`;return}e.githubOwner=await t.prompt(dn.ListrEnquirerPromptAdapter).run({type:"Input",message:"Enter GitHub organization or username",initial:"my-org",validate:n=>n?.trim()?!0:"GitHub owner is required."}),t.title=`GitHub owner: ${kt.default.bold(e.githubOwner)}`}},va={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}e.includeGitHubCI=await t.prompt(dn.ListrEnquirerPromptAdapter).run({type:"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 Ca={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${kt.default.bold(e.pulumiStackBase)}`;return}let n=e.githubOwner||"myorg",r=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${n}/${r}`;e.pulumiStackBase=await t.prompt(dn.ListrEnquirerPromptAdapter).run({type:"Input",message:"Enter Pulumi stack base name (org/project)",initial:o,validate:s=>s?.trim()?s.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),t.title=`Pulumi stack: ${kt.default.bold(e.pulumiStackBase)}`}};var _=require("node:fs"),j=require("node:path");var un=require("node:path");var Wp=()=>{let e=et();return je([(0,un.join)(__dirname,"templates","hono-microservice"),(0,un.join)(__dirname,"..","hono-microservice","templates"),(0,un.join)(e,"bin","templates","hono-microservice")],"Hono templates directory not found.")},vt=(e,t={})=>tn(Wp())(e,t);function xa(){return vt("tsconfig.json.hbs")}function wa(e="1.2.23"){return vt("Dockerfile.hbs",{bunVersion:e})}function ba(){return vt("biome.json.hbs")}function Sa(e){return vt("src/index.ts.hbs",{envKey:gt(e)})}function Pa(e){return vt("src/config/env.ts.hbs",{envKey:gt(e)})}var Gp=async({projectName:e,packageManager:t},n)=>{let r=t==="bun"?"bun":"nodejs";try{await te("create-hono@latest",[e,"--pm",t,"--template",r,"--install"],{task:n})}catch(s){let a=(0,j.join)(g(e),"package.json");if(!(0,_.existsSync)(a))throw new Error(`Failed to scaffold: ${s instanceof Error?s.message:String(s)}`)}let o=(0,j.join)(g(e),"package.json");if(!(0,_.existsSync)(o))throw new Error("Failed to scaffold Hono app structure - package.json not created")},Up=({projectName:e,packageManager:t})=>{let n=(0,j.basename)(e),r=Ee(),o=t==="npm"?"*":"workspace:*",s=g(e),a=na("scripts.dev",s);a&&re("scripts.start:dev",a,e),[{field:"name",value:`${r}/${n}`},{field:"scripts.test",value:"bun test"},{field:"scripts.lint",value:"biome lint --write ./src"},{field:`dependencies.${r}/contracts`,value:o},{field:"dependencies.@crossdelta/telemetry",value:"*"},{field:"dependencies.zod",value:"^4.0.0"},{field:"devDependencies.bun-types",value:"latest",condition:t!=="bun"},{field:"devDependencies.@biomejs/biome",value:"latest"}].filter(({condition:c})=>c??!0).map(({field:c,value:l})=>re(c,l,e))},Jp=({projectName:e})=>{let t=(0,j.basename)(e),n=(0,j.join)(g(e),"src","index.ts"),r=Sa(t);(0,_.writeFileSync)(n,r)},Kp=({projectName:e})=>{let t=(0,j.basename)(e),n=g(e),r=(0,j.join)(n,"src","config");(0,_.existsSync)(r)||(0,_.mkdirSync)(r,{recursive:!0});let o=(0,j.join)(r,"env.ts"),s=Pa(t);(0,_.writeFileSync)(o,s)},zp=({projectName:e})=>{let t=g(e),n=(0,j.join)(t,"tsconfig.json");(0,_.writeFileSync)(n,xa());let r=(0,j.join)(t,"Dockerfile");(0,_.writeFileSync)(r,wa());let o=(0,j.join)(t,"biome.json");(0,_.writeFileSync)(o,ba())},Ta={title:"Create Hono app structure",rendererOptions:{outputBar:1e3},task:async(e,t)=>P(t,async n=>{await Gp(e,t),Up(e),Jp(e),Kp(e),zp(e),e.elapsedTime+=n()})};var qp=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${B().services}/${t}`},Vp=async(e,t)=>{let{valid:n,config:r,error:o}=Ne();if(!n||!r){console.log(o);return}let s=qp(e.name),a=t.packageManager||x(),i=await Ht(t.description);if(Bt(s,r,i),await Wt({servicePath:s,description:i,serviceType:"hono",packageManager:a},r))console.log(oe.default.green.bold(`
479
+ ${e.message}`)}},Ue=()=>z().reduce((t,r)=>(r.initial&&t.push(r.name),t),[]),pm=e=>!!e?.name&&!!e?.link&&!!e?.description,Cr=e=>{let t=z();if(!t?.length||!e?.length)return;let r=e.map(n=>t.find(o=>o.name===n)).filter(pm);r.length&&(m.breakLine().log("\u{1F50C} Installed Integrations:"),r.forEach(({name:n,link:o,description:s})=>{let a=m.getStoredLogs(`${vr}:${n}`);o&&m.log(`${(0,_a.default)(re.default.cyan(n),o)} - ${s}`),a.length&&m.log(a.map(i=>` \u203A ${re.default.dim(i.message)}`).join(`
480
+ `))}))},mm=e=>e.toUpperCase().replace(/-/g,"_"),Da=(e,t)=>{let r=mm(e);m.breakLine().log(re.default.bold("Environment variables:")).log(re.default.dim(" Local:")).log(re.default.cyan(` ${r}_PORT=${t}`)).log(re.default.cyan(` ${r}_URL=http://localhost:${t}`)).breakLine().log(re.default.dim(" Production (auto-configured):")).log(re.default.cyan(` ${r}_PORT=${t}`)).log(re.default.cyan(` ${r}_URL=http://${e}:${t}`))};var Bn=u(require("chalk"));g();var dm=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},La=async e=>{let{selectedIntegrations:t,cwd:r,packageManager:n=T(),task:o}=e;if(!t?.length||!o)return;let s=um(t,r,n,o);await Vt(o,s)},um=(e,t,r,n)=>{let s=z()?.filter(i=>e.includes(i.name))?.flatMap(i=>i.install.map(c=>{let{name:l,version:p}=dm(c);return{title:Bn.default.cyanBright(`Adding ${c} (${i.name})`),fn:async()=>{Z(`dependencies.${l}`,p,t)}}})),a={title:Bn.default.cyanBright("Installing packages..."),fn:async()=>{await Y({cwd:t,packageManager:r,task:n})}};return[...s??[],a]};var Ha=u(require("chalk"));g();var Ba=async e=>{let{selectedIntegrations:t,cwd:r,task:n}=e;if(!t?.length||!n)return;let o=gm(t,r,n,e.packageManager);await Vt(n,o)},gm=(e,t,r,n)=>z().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(a=>({title:Ha.default.cyanBright(`Running "${a}" for ${s.name}
481
+ `),fn:()=>fm(s,a,t,r,n)}))),fm=async(e,t,r,n,o)=>{let s=`${vr}:${e.name}`;try{if(e.interactive)return ss(t,[],{cwd:r,context:s,task:n,manager:o});await ie(t,[],{cwd:r,task:n,context:s})}catch(a){m.error(`Failed to run command "${t}" for ${e.name}: ${a.message}`)}};var xr=require("node:fs"),Tt=require("node:path");g();var wr=(e,t)=>{try{let r=(0,xr.readFileSync)(e,"utf-8"),n=JSON.parse(r);t(n),(0,xr.writeFileSync)(e,JSON.stringify(n,null,2),"utf-8")}catch{}},hm=e=>{let t=(0,Tt.join)(f(e),"tsconfig.json");wr(t,r=>{r.compilerOptions.module="ESNext",r.compilerOptions.moduleResolution="bundler",r.compilerOptions.resolvePackageJsonExports=!0,r.compilerOptions.types=r.compilerOptions.types||[],r.compilerOptions.types.includes("bun-types")||r.compilerOptions.types.push("bun-types"),r.exclude=["node_modules","dist"]})},ym=e=>{let t=(0,Tt.join)(f(e),"tsconfig.build.json");wr(t,r=>{r.exclude=["node_modules","test","dist","**/*.spec.ts","**/*.test.ts"]})},km=e=>{let t=(0,Tt.join)(f(e),"nest-cli.json");wr(t,r=>{r.compilerOptions=r.compilerOptions||{},r.compilerOptions.tsConfigPath="tsconfig.build.json"})},vm=e=>{let t=(0,Tt.join)(f(e),"package.json");wr(t,r=>{delete r.jest})},Wa=e=>{hm(e),ym(e),km(e),vm(e)};var Ga=require("node:path");g();var Cm=(e,t)=>{let r=$n(e);if(r){for(let{className:n,importPath:o}of t)In(r,o,[n]),Rn(r,n);An(r)}},Ua=e=>{let t=(0,Ga.join)(f(e),"src","app.module.ts");Cm(t,[{className:"EventsModule",importPath:"./events/events.module"}])};var xm=require("fs-extra");g();var bm=u(require("chalk")),Sm=u(require("cli-table3"));var Ja=require("node:fs"),Ka=require("node:path"),za=u(require("handlebars"));var Je=(e,t)=>bs(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),Wn=(e,t={})=>{let r=(0,Ja.readFileSync)(e,"utf-8");return za.default.compile(r)(t)},br=e=>(t,r={})=>{let n=(0,Ka.join)(e,t);return Wn(n,r)};var Et=e=>e.toUpperCase().replace(/-/g,"_");var Va=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");g();function Sr(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function qa(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),a=o.map(l=>{let p=t[l];if(!(p===!1||p===void 0))return p===!0?`--${Sr(String(l))}`:`--${Sr(String(l))}=${String(p)}`}).filter(l=>l!==void 0),i=Object.entries(r).map(([l,p])=>{if(!(p===!1||p===void 0))return p===!0?`--${Sr(l)}`:`--${Sr(l)}=${String(p)}`}).filter(l=>l!==void 0),c=[...s,...a,...i].map(String);await e.parseAsync(c,{from:"user"})}var hi=require("node:path"),le=u(require("chalk"));v();var Za=require("@listr2/prompt-adapter-enquirer"),Ke={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{if(e.userConfirmed=await t.prompt(Za.ListrEnquirerPromptAdapter).run({type:"Toggle",initial:!0,message:"\u{1F680} Ready to launch your project?"}),!e.userConfirmed)throw new Error("Project creation was canceled by the user.")}};var ne=require("node:fs"),ze=require("node:path");var Pm=4001,Tm=4e3;function Em(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 a=e.match(/httpPort\s*:\s*(\d+)/);a&&t.push(Number(a[1]));let i=e.matchAll(/const\s+\w*[pP]ort\w*\s*=\s*(\d+)/g);for(let c of i)t.push(Number(c[1]));return t}function $m(e,t){let r=t?Pm:Tm,n=new Set;if(!(0,ne.existsSync)(e))return r;let o=(0,ne.readdirSync)(e).filter(a=>a.endsWith(".ts"));for(let a of o){let i=(0,ze.join)(e,a);try{let c=(0,ne.readFileSync)(i,"utf-8"),l=Em(c);for(let p of l)n.add(p)}catch{}}let s=r;for(;n.has(s);)s++;return s}function Am(e){return(0,ze.basename)(e)}var Pr={title:"Creating infrastructure service config",task:async(e,t)=>{let r=Am(e.projectName),n=y(),o=(0,ze.join)(n,"infra","services");if(!(0,ne.existsSync)(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=(0,ze.join)(o,`${r}.ts`);if((0,ne.existsSync)(s)){t.title=`Service config already exists: infra/services/${r}.ts`;return}let a=$m(o,!0);e.assignedPort=a;let i=e.serviceType==="hono"?Ma(r,a):Oa(r,a);(0,ne.writeFileSync)(s,i),t.title=`Created infra/services/${r}.ts (port: ${a})`}};var $t=require("node:child_process"),Ya=require("node:fs"),Xa=require("node:path"),Im=()=>{try{return(0,$t.execSync)("git --version",{stdio:"ignore"}),!0}catch{return!1}},Rm=e=>(0,Ya.existsSync)((0,Xa.join)(e,".git")),Qa={title:"Initializing git repository",enabled:()=>Im(),skip:e=>Rm(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{(0,$t.execSync)("git init",{cwd:e.cwd,stdio:"ignore"}),(0,$t.execSync)("git add -A",{cwd:e.cwd,stdio:"ignore"}),(0,$t.execSync)('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)"}}};var ei=require("@listr2/prompt-adapter-enquirer"),Gn=u(require("chalk"));g();var Ve={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!Mn(),task:async(e,t)=>$(t,async r=>{await pa(t),e.elapsedTime+=r(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},qe={enabled:e=>!Mn()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{e.shouldInstallBun=await t.prompt(ei.ListrEnquirerPromptAdapter).run({type:"Toggle",message:"Would you like to use Bun? (recommended)",initial:!0,footer:["",`${Gn.default.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${Gn.default.underline("https://bun.sh")}`,ma(),da()].join(`
482
+ `)}),e.shouldInstallBun&&(e.packageManager="bun")}};var ti=require("@listr2/prompt-adapter-enquirer"),Un=u(require("chalk"));g();var Tr={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>$(t,async r=>{let{selectedIntegrations:n,cwd:o,packageManager:s}=e;await La({selectedIntegrations:n,packageManager:s,cwd:o,task:t}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}},Er={title:"Select integrations",enabled:e=>e.selectedIntegrations.length===0,task:async(e,t)=>{e.selectedIntegrations=await t.prompt(ti.ListrEnquirerPromptAdapter).run({type:"MultiSelect",hint:`
483
+ Press <space> to select/deselect, <enter> to confirm, <i> to invert selection`,message:"Which integrations would you like to include?",initial:Ue().map((r,n)=>n),choices:e.availableIntegrations.map(({name:r,description:n})=>({name:r,message:[Un.default.bold(r),n].join(" - "),value:r}))}),!e.selectedIntegrations||e.selectedIntegrations.length===0?t.title="No integrations selected.":t.title=["Selected integrations:",...e.selectedIntegrations.map(r=>Un.default.bold(`\u2022 ${r}`))].join(`
484
+ `)}};g();var ri={title:"Install Nest CLI",task:async(e,t)=>$(t,async r=>{await os({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}};g();var $r={title:"Install dependencies",task:async(e,t)=>$(t,async r=>{await Y({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()})};var ni=require("@listr2/prompt-adapter-enquirer"),oi=u(require("chalk"));g();var Ze={enabled:e=>!e.removeDir&&!Kt(e.cwd),task:async(e,t)=>{if(e.removeDir=await t.prompt(ni.ListrEnquirerPromptAdapter).run({type:"Toggle",message:oi.default.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!e.removeDir)throw new Error("Project creation was canceled by the user.")}},Ye={enabled:e=>!!e.removeDir,task:async e=>Fo(e.cwd)};g();var Ar={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>$(t,async r=>{let{selectedIntegrations:n,cwd:o}=e;await Ba({selectedIntegrations:n,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1}};var si=require("@listr2/prompt-adapter-enquirer");g();var Nm=["services/my-hono-service","services/my-nest-service","my-platform"],Xe={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?Nm.includes(e.projectName):!0,task:async(e,t)=>{e.projectName=await t.prompt(si.ListrEnquirerPromptAdapter).run({type:"Input",initial:e.projectName,message:"Enter project name",validate:r=>r?!0:"Project name is required."}),e.cwd&&(e.cwd=f(e.projectName))}};var ai=require("@listr2/prompt-adapter-enquirer"),Jn=u(require("chalk"));var Qe={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=on(),e.packageManager){t.title=`Using ${Jn.default.bold(e.packageManager)} as package manager.`;return}e.packageManager=await t.prompt(ai.ListrEnquirerPromptAdapter).run({type:"Select",message:"Which package manager would you like to use?",initial:sn(),choices:ns}),t.title=`Using ${Jn.default.bold(e.packageManager)} as package manager.`}};var Ir=require("@listr2/prompt-adapter-enquirer"),At=u(require("chalk")),ii={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${At.default.bold(e.githubOwner)}`;return}e.githubOwner=await t.prompt(Ir.ListrEnquirerPromptAdapter).run({type:"Input",message:"Enter GitHub organization or username",initial:"my-org",validate:r=>r?.trim()?!0:"GitHub owner is required."}),t.title=`GitHub owner: ${At.default.bold(e.githubOwner)}`}},ci={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}e.includeGitHubCI=await t.prompt(Ir.ListrEnquirerPromptAdapter).run({type:"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 li={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${At.default.bold(e.pulumiStackBase)}`;return}let r=e.githubOwner||"myorg",n=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${r}/${n}`;e.pulumiStackBase=await t.prompt(Ir.ListrEnquirerPromptAdapter).run({type:"Input",message:"Enter Pulumi stack base name (org/project)",initial:o,validate:s=>s?.trim()?s.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),t.title=`Pulumi stack: ${At.default.bold(e.pulumiStackBase)}`}};g();var W=require("node:fs"),D=require("node:path");g();var Rr=require("node:path");var Mm=()=>{let e=ht();return Je([(0,Rr.join)(__dirname,"templates","hono-microservice"),(0,Rr.join)(__dirname,"..","hono-microservice","templates"),(0,Rr.join)(e,"bin","templates","hono-microservice")],"Hono templates directory not found.")},It=(e,t={})=>br(Mm())(e,t);function pi(){return It("tsconfig.json.hbs")}function mi(e="1.2.23"){return It("Dockerfile.hbs",{bunVersion:e})}function di(){return It("biome.json.hbs")}function ui(e){return It("src/index.ts.hbs",{envKey:Et(e)})}function gi(e){return It("src/config/env.ts.hbs",{envKey:Et(e)})}var Om=async({projectName:e,packageManager:t},r)=>{let n=t==="bun"?"bun":"nodejs";try{await ie("create-hono@latest",[e,"--pm",t,"--template",n,"--install"],{task:r})}catch(s){let a=(0,D.join)(f(e),"package.json");if(!(0,W.existsSync)(a))throw new Error(`Failed to scaffold: ${s instanceof Error?s.message:String(s)}`)}let o=(0,D.join)(f(e),"package.json");if(!(0,W.existsSync)(o))throw new Error("Failed to scaffold Hono app structure - package.json not created")},jm=({projectName:e,packageManager:t})=>{let r=(0,D.basename)(e),n=be(),o=t==="npm"?"*":"workspace:*",s=f(e),a=Xr("scripts.dev",s);a&&Z("scripts.start:dev",a,e),[{field:"name",value:`${n}/${r}`},{field:"scripts.test",value:"bun test"},{field:"scripts.lint",value:"biome lint --write ./src"},{field:`dependencies.${n}/contracts`,value:o},{field:"dependencies.@crossdelta/telemetry",value:"*"},{field:"dependencies.zod",value:"^4.0.0"},{field:"devDependencies.bun-types",value:"latest",condition:t!=="bun"},{field:"devDependencies.@biomejs/biome",value:"latest"}].filter(({condition:c})=>c??!0).map(({field:c,value:l})=>Z(c,l,e))},Fm=({projectName:e})=>{let t=(0,D.basename)(e),r=(0,D.join)(f(e),"src","index.ts"),n=ui(t);(0,W.writeFileSync)(r,n)},_m=({projectName:e})=>{let t=(0,D.basename)(e),r=f(e),n=(0,D.join)(r,"src","config");(0,W.existsSync)(n)||(0,W.mkdirSync)(n,{recursive:!0});let o=(0,D.join)(n,"env.ts"),s=gi(t);(0,W.writeFileSync)(o,s)},Dm=({projectName:e})=>{let t=f(e),r=(0,D.join)(t,"tsconfig.json");(0,W.writeFileSync)(r,pi());let n=(0,D.join)(t,"Dockerfile");(0,W.writeFileSync)(n,mi());let o=(0,D.join)(t,"biome.json");(0,W.writeFileSync)(o,di())},fi={title:"Create Hono app structure",rendererOptions:{outputBar:1e3},task:async(e,t)=>$(t,async r=>{await Om(e,t),jm(e),Fm(e),_m(e),Dm(e),e.elapsedTime+=r()})};var Lm=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${A().services}/${t}`},Hm=async(e,t)=>{let{valid:r,config:n,error:o}=We();if(!r||!n){console.log(o);return}let s=Lm(e.name),a=t.packageManager||T(),i=await pr(t.description);if(mr(s,n,i),await dr({servicePath:s,description:i,serviceType:"hono",packageManager:a},n))console.log(le.default.green.bold(`
469
485
  \u2705 Service generated successfully!
470
- `)),console.log(oe.default.dim("Next steps:")),console.log(oe.default.dim(` ${oe.default.cyan("pf dev")} - Start all services`)),console.log(oe.default.dim(` ${oe.default.cyan(`cd ${s} && bun dev`)} - Start this service only`)),console.log();else throw new Error("Service generation failed")},Ea=me({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:Vp,buildContext:async(e,t)=>{let n=(e.name??"my-hono-service").trim();!n.includes("/")&&!n.startsWith(".")&&(n=`${B().services}/${n}`);let r=g(n),o=t.packageManager??(t.yes&&x()),s=G(),a=t.yes?Me():[],i=t.packageManager==="bun",c=!!t.yes||!!e.name&&e.name!=="my-hono-service";return{cwd:r,projectName:n,packageManager:o,shouldInstallBun:i,availableIntegrations:s,selectedIntegrations:a,serviceType:"hono",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[We,He,Le,Ge,ln,Oe],actions:[Be,De,Ta,an,cn,mn],onComplete:({projectName:e,packageManager:t,selectedIntegrations:n,assignedPort:r})=>{m.breakLine().log(oe.default.bold.green("Hono Microservice created successfully!")),Zt(n),Rs((0,$a.basename)(e),r??8080);let o=t??x();m.breakLine().log(`To start the project, run:
471
- ${oe.default.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});var se=u(require("chalk"));var U=require("node:fs"),F=require("node:path");var xr=require("node:path");var Zp=()=>je([(0,xr.join)(__dirname,"templates","nest-microservice"),(0,xr.join)(__dirname,"..","nest-microservice","templates")],"NestJS templates directory not found."),Ue=(e,t={})=>tn(Zp())(e,t);function gn(e,t=3e3){return Ue("src/main.ts.hbs",{serviceName:e,envKey:gt(e),displayName:Ws(e),defaultPort:t})}function Aa(){return Ue("src/app.context.ts.hbs",{})}function Ia(){return Ue("src/events/events.module.ts.hbs",{})}function Na(e){return Ue("src/events/events.service.ts.hbs",{serviceName:e})}function Ra(e="24",t="1.2.23"){return Ue("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function Ma(){return Ue("biome.json.hbs",{})}var Yp=async(e,t)=>{await te("@nestjs/cli",["new",e.projectName,"--skip-install","--skip-git","--package-manager",e.packageManager],{task:t})},Xp=({projectName:e,packageManager:t})=>{let n=(0,F.basename)(e),r=Ee(),o=t==="npm"?"*":"workspace:*";[{field:"name",value:`${r}/${n}`},{field:"type",value:"module"},{field:"scripts.start",value:"bun src/main.ts"},{field:"scripts.start:dev",value:"bun --hot src/main.ts"},{field:"scripts.start:prod",value:"node dist/main.js"},{field:"scripts.test",value:"bun test"},{field:"scripts.lint",value:"biome lint --write ./src"},{field:`dependencies.${r}/contracts`,value:o},{field:"dependencies.@crossdelta/telemetry",value:"*"},{field:"dependencies.@nestjs/config",value:"^4"},{field:"devDependencies.bun-types",value:"latest"},{field:"devDependencies.@biomejs/biome",value:"latest"}].map(({field:i,value:c})=>re(i,c,e)),["jest","@types/jest","ts-jest","@nestjs/testing","supertest","@types/supertest","ts-node","tsconfig-paths","@nestjs/schematics","@nestjs/cli"].map(i=>re(`devDependencies.${i}`,void 0,e))},Qp=({projectName:e})=>{let t=["eslint.config.mjs","src/app.controller.spec.ts"];for(let n of t)try{(0,U.unlinkSync)((0,F.join)(g(e),n))}catch{}},em=({projectName:e})=>{let t=g(e),n=(0,F.join)(t,"Dockerfile");(0,U.writeFileSync)(n,Ra());let r=(0,F.join)(t,"biome.json");(0,U.writeFileSync)(r,Ma())},tm=({projectName:e})=>{let t=(0,F.join)(g(e),"src","app.context.ts");(0,U.writeFileSync)(t,Aa())},nm=({projectName:e})=>{let t=(0,F.basename)(e),n=(0,F.join)(g(e),"src","events");(0,U.mkdirSync)(n,{recursive:!0}),(0,U.writeFileSync)((0,F.join)(n,"events.module.ts"),Ia()),(0,U.writeFileSync)((0,F.join)(n,"events.service.ts"),Na(t)),Ds(e)},rm=({projectName:e})=>{let t=(0,F.basename)(e),n=(0,F.join)(g(e),"src","main.ts");(0,U.writeFileSync)(n,gn(t))},ja={title:"Create NestJS app structure",rendererOptions:{outputBar:1e3},task:async(e,t)=>P(t,async n=>{await Yp(e,t),Xp(e),Os(e.projectName),Qp(e),em(e),tm(e),nm(e),rm(e),e.elapsedTime+=n()})};var Fa=require("node:fs"),fn=require("node:path");var Oa={title:"Patch main.ts with PORT pattern",task:async(e,t)=>P(t,async n=>{let r=(0,fn.basename)(e.projectName),o=e.assignedPort??3e3,s=(0,fn.join)(g(e.projectName),"src","main.ts");(0,Fa.writeFileSync)(s,gn(r,o)),t.title=`Patched main.ts with PORT || ${r.toUpperCase().replace(/-/g,"_")}_PORT`,e.elapsedTime+=n()})};var om=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${B().services}/${t}`},sm=async(e,t)=>{let{valid:n,config:r,error:o}=Ne();if(!n||!r){console.log(o);return}let s=om(e.name),a=t.packageManager||x(),i=await Ht(t.description);if(Bt(s,r,i),await Wt({servicePath:s,description:i,serviceType:"nest",packageManager:a},r))console.log(se.default.green.bold(`
486
+ `)),console.log(le.default.dim("Next steps:")),console.log(le.default.dim(` ${le.default.cyan("pf dev")} - Start all services`)),console.log(le.default.dim(` ${le.default.cyan(`cd ${s} && bun dev`)} - Start this service only`)),console.log();else throw new Error("Service generation failed")},yi=q({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:Hm,buildContext:async(e,t)=>{let r=(e.name??"my-hono-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${A().services}/${r}`);let n=f(r),o=t.packageManager??(t.yes&&T()),s=z(),a=t.yes?Ue():[],i=t.packageManager==="bun",c=!!t.yes||!!e.name&&e.name!=="my-hono-service";return{cwd:n,projectName:r,packageManager:o,shouldInstallBun:i,availableIntegrations:s,selectedIntegrations:a,serviceType:"hono",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Xe,Ze,qe,Qe,Er,Ke],actions:[Ye,Ve,fi,Pr,Tr,Ar],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{m.breakLine().log(le.default.bold.green("Hono Microservice created successfully!")),Cr(r),Da((0,hi.basename)(e),n??8080);let o=t??T();m.breakLine().log(`To start the project, run:
487
+ ${le.default.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});var pe=u(require("chalk"));v();g();var V=require("node:fs"),L=require("node:path");g();var zn=require("node:path");var Bm=()=>Je([(0,zn.join)(__dirname,"templates","nest-microservice"),(0,zn.join)(__dirname,"..","nest-microservice","templates")],"NestJS templates directory not found."),et=(e,t={})=>br(Bm())(e,t);function Nr(e,t=3e3){return et("src/main.ts.hbs",{serviceName:e,envKey:Et(e),displayName:Va(e),defaultPort:t})}function ki(){return et("src/app.context.ts.hbs",{})}function vi(){return et("src/events/events.module.ts.hbs",{})}function Ci(e){return et("src/events/events.service.ts.hbs",{serviceName:e})}function xi(e="24",t="1.2.23"){return et("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function wi(){return et("biome.json.hbs",{})}var Wm=async(e,t)=>{await ie("@nestjs/cli",["new",e.projectName,"--skip-install","--skip-git","--package-manager",e.packageManager],{task:t})},Gm=({projectName:e,packageManager:t})=>{let r=(0,L.basename)(e),n=be(),o=t==="npm"?"*":"workspace:*";[{field:"name",value:`${n}/${r}`},{field:"type",value:"module"},{field:"scripts.start",value:"bun src/main.ts"},{field:"scripts.start:dev",value:"bun --hot src/main.ts"},{field:"scripts.start:prod",value:"node dist/main.js"},{field:"scripts.test",value:"bun test"},{field:"scripts.lint",value:"biome lint --write ./src"},{field:`dependencies.${n}/contracts`,value:o},{field:"dependencies.@crossdelta/telemetry",value:"*"},{field:"dependencies.@nestjs/config",value:"^4"},{field:"devDependencies.bun-types",value:"latest"},{field:"devDependencies.@biomejs/biome",value:"latest"}].map(({field:i,value:c})=>Z(i,c,e)),["jest","@types/jest","ts-jest","@nestjs/testing","supertest","@types/supertest","ts-node","tsconfig-paths","@nestjs/schematics","@nestjs/cli"].map(i=>Z(`devDependencies.${i}`,void 0,e))},Um=({projectName:e})=>{let t=["eslint.config.mjs","src/app.controller.spec.ts"];for(let r of t)try{(0,V.unlinkSync)((0,L.join)(f(e),r))}catch{}},Jm=({projectName:e})=>{let t=f(e),r=(0,L.join)(t,"Dockerfile");(0,V.writeFileSync)(r,xi());let n=(0,L.join)(t,"biome.json");(0,V.writeFileSync)(n,wi())},Km=({projectName:e})=>{let t=(0,L.join)(f(e),"src","app.context.ts");(0,V.writeFileSync)(t,ki())},zm=({projectName:e})=>{let t=(0,L.basename)(e),r=(0,L.join)(f(e),"src","events");(0,V.mkdirSync)(r,{recursive:!0}),(0,V.writeFileSync)((0,L.join)(r,"events.module.ts"),vi()),(0,V.writeFileSync)((0,L.join)(r,"events.service.ts"),Ci(t)),Ua(e)},Vm=({projectName:e})=>{let t=(0,L.basename)(e),r=(0,L.join)(f(e),"src","main.ts");(0,V.writeFileSync)(r,Nr(t))},bi={title:"Create NestJS app structure",rendererOptions:{outputBar:1e3},task:async(e,t)=>$(t,async r=>{await Wm(e,t),Gm(e),Wa(e.projectName),Um(e),Jm(e),Km(e),zm(e),Vm(e),e.elapsedTime+=r()})};var Si=require("node:fs"),Mr=require("node:path");g();var Pi={title:"Patch main.ts with PORT pattern",task:async(e,t)=>$(t,async r=>{let n=(0,Mr.basename)(e.projectName),o=e.assignedPort??3e3,s=(0,Mr.join)(f(e.projectName),"src","main.ts");(0,Si.writeFileSync)(s,Nr(n,o)),t.title=`Patched main.ts with PORT || ${n.toUpperCase().replace(/-/g,"_")}_PORT`,e.elapsedTime+=r()})};var qm=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${A().services}/${t}`},Zm=async(e,t)=>{let{valid:r,config:n,error:o}=We();if(!r||!n){console.log(o);return}let s=qm(e.name),a=t.packageManager||T(),i=await pr(t.description);if(mr(s,n,i),await dr({servicePath:s,description:i,serviceType:"nest",packageManager:a},n))console.log(pe.default.green.bold(`
472
488
  \u2705 Service generated successfully!
473
- `)),console.log(se.default.dim("Next steps:")),console.log(se.default.dim(` ${se.default.cyan("pf dev")} - Start all services`)),console.log(se.default.dim(` ${se.default.cyan(`cd ${s} && bun run start:dev`)} - Start this service only`)),console.log();else throw new Error("Service generation failed")},_a=me({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:sm,buildContext:async(e,t)=>{let n=(e.name??"my-nest-service").trim();!n.includes("/")&&!n.startsWith(".")&&(n=`${B().services}/${n}`);let r=g(n),o=t.packageManager??(t.yes&&x()),s=t.packageManager==="bun",a=G(),i=t.yes?Me():[],c=!!t.yes||!!e.name;return{cwd:r,projectName:n,shouldInstallBun:s,packageManager:o,availableIntegrations:a,selectedIntegrations:i,serviceType:"nest",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[We,He,Le,Ge,ln,Oe],actions:[Be,De,ja,an,Oa,pn,ua,cn,mn],onComplete:({projectName:e,packageManager:t,selectedIntegrations:n})=>{m.breakLine().log(se.default.bold.green("NestJS Microservice created successfully!")),Zt(n),m.breakLine().log(`To start the project, run:
474
- ${se.default.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});var za=require("@listr2/prompt-adapter-enquirer"),D=u(require("chalk"));var Ba=require("node:child_process"),A=require("node:fs"),Je=require("node:path");var Da=require("node:fs"),Ct=require("node:path");var wr=()=>{let e=et();return je([(0,Ct.join)(__dirname,"templates","workspace"),(0,Ct.join)(__dirname,"..","..","..","..","templates","workspace"),(0,Ct.join)(e,"bin","templates","workspace")],"Workspace templates directory not found.")},La=()=>{let e=wr(),t=(0,Ct.join)(e,"packages","contracts");if(!(0,Da.existsSync)(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},hn=(e,t)=>ur(e,t);var Ha=e=>{e.endsWith(".sh")&&(0,A.chmodSync)(e,493)},am=[{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/check-path-changes/action.yml",output:".github/actions/check-path-changes/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-path-changes/index.js",output:".github/actions/check-path-changes/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/detect-skipped-services/action.yml",output:".github/actions/detect-skipped-services/action.yml",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:".github/actions/resolve-scope-tags/action.yml",output:".github/actions/resolve-scope-tags/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/resolve-scope-tags/index.js",output:".github/actions/resolve-scope-tags/index.js",isStatic:!0,isGitHubCI:!0}],Wa={title:"Creating workspace structure",task:async(e,t)=>{if((0,A.existsSync)(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let n=wr(),r=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let d=(0,Ba.spawnSync)(c,["--version"],{encoding:"utf-8",timeout:5e3}).stdout?.trim();if(d&&/^\d+\.\d+/.test(d))return`${c}@${d}`}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`},a={projectName:e.projectName,scope:`@${e.projectName}`,githubOwner:e.githubOwner||"",pulumiStackBase:e.pulumiStackBase||e.projectName,packageManager:o,packageManagerVersion:s(o)},i=am.filter(c=>!(c.isGitHubCI&&!r||c.forPackageManager&&c.forPackageManager!==o));for(let c of i){let l=(0,Je.join)(e.cwd,c.output),p=(0,Je.dirname)(l);if((0,A.existsSync)(p)||(0,A.mkdirSync)(p,{recursive:!0}),c.isStatic){let d=(0,Je.join)(n,c.template);(0,A.existsSync)(d)?(0,A.writeFileSync)(l,(0,A.readFileSync)(d)):(0,A.writeFileSync)(l,""),Ha(l)}else{let d=(0,Je.join)(n,c.template),k=hn(d,a);(0,A.writeFileSync)(l,k),Ha(l)}}t.title="Workspace structure created"}};var X=require("node:fs"),xt=require("node:path"),Ga=u(require("chalk"));var im=()=>{let e=(0,xt.join)(process.cwd(),"package.json");if(!(0,X.existsSync)(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let n=JSON.parse((0,X.readFileSync)(e,"utf-8")).name;if(!n)throw new Error('package.json must have a "name" field');return n.startsWith("@")?n:`@${n}`},cm=()=>{let e=im(),{relativePath:t,packagePath:n}=C();if((0,X.existsSync)(n))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let r=La(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};(0,X.mkdirSync)(n,{recursive:!0}),(0,X.mkdirSync)((0,xt.join)(n,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{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 a of s){let i=(0,xt.join)(r,a.template),c=(0,xt.join)(n,a.output),l=hn(i,o);(0,X.writeFileSync)(c,l,"utf-8")}},Ua={title:"Initializing contracts package",task:(e,t)=>{let n=process.cwd();try{process.chdir(e.cwd),cm(),t.title="Contracts package initialized"}catch(r){throw t.title=Ga.default.red(`Contracts package failed: ${r.message}`),r}finally{process.chdir(n)}}};var Ja=u(require("chalk"));var Ka={title:"Registering shell completion",task:(e,t)=>{let n=process.cwd();try{process.chdir(e.cwd),ye(),t.title="Shell completion registered"}catch{t.title=Ja.default.dim("Shell completion skipped")}finally{process.chdir(n)}}};var qa=me({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 n=(e.name??"my-platform").trim(),r=g(n),o=!!t.yes,s=t.packageManager??(o?x():void 0),a=t.packageManager==="bun",i=t.githubOwner??(o?"my-org":void 0),c=t.pulumiStack??(o?`${i}/${n}`:void 0),l=t.github===!1?!1:o?!0:void 0,p=!!e.name,d=t.removeDir||o;return{cwd:r,projectName:n,shouldInstallBun:a,packageManager:s,elapsedTime:0,userConfirmed:o,skipInputPrompts:p&&!o,removeDir:d,githubOwner:i,pulumiStackBase:c,includeGitHubCI:l}},prompts:[{enabled:e=>!e.userConfirmed,task:async(e,t)=>{try{let n=y();if(!await t.prompt(za.ListrEnquirerPromptAdapter).run({type:"toggle",message:`\u26A0\uFE0F You are inside an existing workspace (${n}). Create a nested workspace anyway?`,enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");t.title=D.default.yellow("Warning: Creating nested workspace")}catch(n){if(n.message?.includes("cancelled"))throw n;t.title="No existing workspace detected"}}},We,He,ka,va,Ca,Le,Ge,Oe],actions:[Be,De,Wa,Ua,pn,pa,Ka],onComplete:({projectName:e,includeGitHubCI:t})=>{m.breakLine().log(D.default.bold.green("Workspace created successfully!")),m.breakLine().log(D.default.bold("Next steps:")).log(` 1. ${D.default.cyan(`cd ${e}`)}`).log(` 2. ${D.default.cyan("exec $SHELL")} ${D.default.dim("(enable tab completion)")}`),t&&m.breakLine().log(D.default.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${D.default.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${D.default.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${D.default.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),m.breakLine().log(D.default.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 wt=[{name:"Hono Microservice",value:"hono-micro",command:Ea,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:_a,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:qa,supportsAi:!1}],Va=()=>{let e=me({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,n)=>{let r=await n.prompt(de.ListrEnquirerPromptAdapter).run({type:"select",message:"Select Project type",choices:wt});t.projectType=wt.find(o=>o.name===r)?.value||"",n.title=`Using ${ae.default.bold(r)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,n)=>{try{y(),n.title="Workspace detected"}catch{let r=["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(`
475
- `);throw new Error(r)}}},{enabled:t=>t.projectType==="workspace",task:async(t,n)=>{try{let r=y();if(!await n.prompt(de.ListrEnquirerPromptAdapter).run({type:"toggle",message:`\u26A0\uFE0F You are inside an existing workspace (${r}). Create a nested workspace anyway?`,enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");n.title=ae.default.yellow("Warning: Creating nested workspace")}catch(r){if(r.message?.includes("cancelled"))throw r;n.title="No existing workspace detected"}}},{enabled:t=>!!t.projectType,task:async(t,n)=>{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 n.prompt(de.ListrEnquirerPromptAdapter).run({type:"input",message:s,initial:o});t.servicePath=a.trim(),n.title=`Path: ${ae.default.dim(a)}`}},{enabled:t=>!!wt.find(r=>r.value===t.projectType)?.supportsAi&&Ne().valid,task:async(t,n)=>{let r=await n.prompt(de.ListrEnquirerPromptAdapter).run({type:"toggle",message:"Use AI to generate service code?",enabled:"Yes",disabled:"No",initial:!1});t.useAi=r,n.title=r?ae.default.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:t=>t.useAi,task:async(t,n)=>{let r=await n.prompt(de.ListrEnquirerPromptAdapter).run({type:"input",message:"Describe what this service should do:"});t.aiDescription=r,n.title=`Description: ${ae.default.dim(r.slice(0,50))}${r.length>50?"...":""}`}},{enabled:t=>{if(!t.servicePath)return!1;let n=g(t.servicePath);return!rn(n)},task:async(t,n)=>{if(!await n.prompt(de.ListrEnquirerPromptAdapter).run({type:"toggle",message:ae.default.bold("\u26A0\uFE0F Overwrite existing directory?"),enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,n.title=ae.default.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,n)=>{if(!await n.prompt(de.ListrEnquirerPromptAdapter).run({type:"Toggle",initial:!0,message:"\u{1F680} Ready to launch your project?"}))throw new Error("Project creation was canceled by the user.")}}],actions:[],onComplete:async t=>{wt.find(s=>s.value===t.projectType)||e.error(ae.default.red(`Project type ${t.projectType} is not supported.`));let n=e.commands.find(s=>s.name()===t.projectType),r={};t.projectType!=="workspace"&&(r.yes=!0);let o=[];t.servicePath&&o.push("servicePath"),t.shouldRemoveDir&&(r.removeDir=!0),t.useAi&&(r.ai=!0,r.description=t.aiDescription),await aa(n,t,r,o)}});for(let t of wt)e.addCommand(t.command);return e};var ei=require("commander");var br=u(require("chalk"));var Sr=e=>new Promise(t=>setTimeout(t,e)),Za=e=>process.stdout.write(`${e}
476
- `),lm=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},Ya=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),Xa=async(e,t)=>{let n=xo(".env.local",t);n.length>0&&(await Po(n),await Sr(50)),Za(br.default.cyan("\u{1F525} Starting services...")),Za(br.default.dim(` Command: turbo run ${Cn} --continue`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=So("turbo",["run",Cn,"--continue","--no-daemon"],{cwd:t,envFile:".env.local",onExit:r=>{e.isRestarting||e.isShuttingDown||r===1&&process.exit(0)}})},Qa=async(e,t=!1)=>{let n=e.turboProcess?.pid;if(n){t?e.isRestarting=!0:e.isShuttingDown=!0;try{try{process.kill(-n,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await Sr(200);try{process.kill(-n,"SIGKILL")}catch{}await Sr(30)}catch{}e.turboProcess=null,lm()}};var ti=new ei.Command("dev").description("Start development mode with auto-reload").action(async()=>{let e=y(),t=Ya(),n=c=>nt("generate-env",{cwd:c}),r=()=>H({cwd:e,quiet:!0}),o=async()=>{await r(),await n(e),await Ps()&&await Ts(e),await Xa(t,e)},a=Js(async()=>{t.isRestarting||t.isShuttingDown||(t.isRestarting=!0,console.log(`
489
+ `)),console.log(pe.default.dim("Next steps:")),console.log(pe.default.dim(` ${pe.default.cyan("pf dev")} - Start all services`)),console.log(pe.default.dim(` ${pe.default.cyan(`cd ${s} && bun run start:dev`)} - Start this service only`)),console.log();else throw new Error("Service generation failed")},Ti=q({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:Zm,buildContext:async(e,t)=>{let r=(e.name??"my-nest-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${A().services}/${r}`);let n=f(r),o=t.packageManager??(t.yes&&T()),s=t.packageManager==="bun",a=z(),i=t.yes?Ue():[],c=!!t.yes||!!e.name;return{cwd:n,projectName:r,shouldInstallBun:s,packageManager:o,availableIntegrations:a,selectedIntegrations:i,serviceType:"nest",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Xe,Ze,qe,Qe,Er,Ke],actions:[Ye,Ve,bi,Pr,Pi,$r,ri,Tr,Ar],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{m.breakLine().log(pe.default.bold.green("NestJS Microservice created successfully!")),Cr(r),m.breakLine().log(`To start the project, run:
490
+ ${pe.default.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});var Fi=require("@listr2/prompt-adapter-enquirer"),G=u(require("chalk"));g();var Ii=require("node:child_process"),F=require("node:fs"),tt=require("node:path");var Ei=require("node:fs"),Rt=require("node:path");var Vn=()=>{let e=ht();return Je([(0,Rt.join)(__dirname,"templates","workspace"),(0,Rt.join)(__dirname,"..","..","..","..","templates","workspace"),(0,Rt.join)(e,"bin","templates","workspace")],"Workspace templates directory not found.")},$i=()=>{let e=Vn(),t=(0,Rt.join)(e,"packages","contracts");if(!(0,Ei.existsSync)(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},Or=(e,t)=>Wn(e,t);var Ai=e=>{e.endsWith(".sh")&&(0,F.chmodSync)(e,493)},Ym=[{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/check-path-changes/action.yml",output:".github/actions/check-path-changes/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-path-changes/index.js",output:".github/actions/check-path-changes/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/detect-skipped-services/action.yml",output:".github/actions/detect-skipped-services/action.yml",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:".github/actions/resolve-scope-tags/action.yml",output:".github/actions/resolve-scope-tags/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/resolve-scope-tags/index.js",output:".github/actions/resolve-scope-tags/index.js",isStatic:!0,isGitHubCI:!0}],Ri={title:"Creating workspace structure",task:async(e,t)=>{if((0,F.existsSync)(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=Vn(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let d=(0,Ii.spawnSync)(c,["--version"],{encoding:"utf-8",timeout:5e3}).stdout?.trim();if(d&&/^\d+\.\d+/.test(d))return`${c}@${d}`}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`},a={projectName:e.projectName,scope:`@${e.projectName}`,githubOwner:e.githubOwner||"",pulumiStackBase:e.pulumiStackBase||e.projectName,packageManager:o,packageManagerVersion:s(o)},i=Ym.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of i){let l=(0,tt.join)(e.cwd,c.output),p=(0,tt.dirname)(l);if((0,F.existsSync)(p)||(0,F.mkdirSync)(p,{recursive:!0}),c.isStatic){let d=(0,tt.join)(r,c.template);(0,F.existsSync)(d)?(0,F.writeFileSync)(l,(0,F.readFileSync)(d)):(0,F.writeFileSync)(l,""),Ai(l)}else{let d=(0,tt.join)(r,c.template),x=Or(d,a);(0,F.writeFileSync)(l,x),Ai(l)}}t.title="Workspace structure created"}};var oe=require("node:fs"),Nt=require("node:path"),Ni=u(require("chalk"));v();var Xm=()=>{let e=(0,Nt.join)(process.cwd(),"package.json");if(!(0,oe.existsSync)(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse((0,oe.readFileSync)(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},Qm=()=>{let e=Xm(),{relativePath:t,packagePath:r}=w();if((0,oe.existsSync)(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=$i(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};(0,oe.mkdirSync)(r,{recursive:!0}),(0,oe.mkdirSync)((0,Nt.join)(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{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 a of s){let i=(0,Nt.join)(n,a.template),c=(0,Nt.join)(r,a.output),l=Or(i,o);(0,oe.writeFileSync)(c,l,"utf-8")}},Mi={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),Qm(),t.title="Contracts package initialized"}catch(n){throw t.title=Ni.default.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};var Oi=u(require("chalk"));var ji={title:"Registering shell completion",task:async(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),await ye(),t.title="Shell completion registered"}catch{t.title=Oi.default.dim("Shell completion skipped")}finally{process.chdir(r)}}};var _i=q({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=f(r),o=!!t.yes,s=t.packageManager??(o?T():void 0),a=t.packageManager==="bun",i=t.githubOwner??(o?"my-org":void 0),c=t.pulumiStack??(o?`${i}/${r}`:void 0),l=t.github===!1?!1:o?!0:void 0,p=!!e.name,d=t.removeDir||o;return{cwd:n,projectName:r,shouldInstallBun:a,packageManager:s,elapsedTime:0,userConfirmed:o,skipInputPrompts:p&&!o,removeDir:d,githubOwner:i,pulumiStackBase:c,includeGitHubCI:l}},prompts:[{enabled:e=>!e.userConfirmed,task:async(e,t)=>{try{let r=y();if(!await t.prompt(Fi.ListrEnquirerPromptAdapter).run({type:"toggle",message:`\u26A0\uFE0F You are inside an existing workspace (${r}). Create a nested workspace anyway?`,enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");t.title=G.default.yellow("Warning: Creating nested workspace")}catch(r){if(r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},Xe,Ze,ii,ci,li,qe,Qe,Ke],actions:[Ye,Ve,Ri,Mi,$r,Qa,ji],onComplete:({projectName:e,includeGitHubCI:t})=>{m.breakLine().log(G.default.bold.green("Workspace created successfully!")),m.breakLine().log(G.default.bold("Next steps:")).log(` 1. ${G.default.cyan(`cd ${e}`)}`).log(` 2. ${G.default.cyan("exec $SHELL")} ${G.default.dim("(enable tab completion)")}`),t&&m.breakLine().log(G.default.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${G.default.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${G.default.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${G.default.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),m.breakLine().log(G.default.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 Mt=[{name:"Hono Microservice",value:"hono-micro",command:yi,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:Ti,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:_i,supportsAi:!1}],Di=()=>{let e=q({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 n=await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"select",message:"Select Project type",choices:Mt});t.projectType=Mt.find(o=>o.name===n)?.value||"",r.title=`Using ${me.default.bold(n)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,r)=>{try{y(),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(`
491
+ `);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=y();if(!await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"toggle",message:`\u26A0\uFE0F You are inside an existing workspace (${n}). Create a nested workspace anyway?`,enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");r.title=me.default.yellow("Warning: Creating nested workspace")}catch(n){if(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 r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"input",message:s,initial:o});t.servicePath=a.trim(),r.title=`Path: ${me.default.dim(a)}`}},{enabled:t=>!!Mt.find(n=>n.value===t.projectType)?.supportsAi&&We().valid,task:async(t,r)=>{let n=await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"toggle",message:"Use AI to generate service code?",enabled:"Yes",disabled:"No",initial:!1});t.useAi=n,r.title=n?me.default.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:t=>t.useAi,task:async(t,r)=>{let n=await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"input",message:"Describe what this service should do:"});t.aiDescription=n,r.title=`Description: ${me.default.dim(n.slice(0,50))}${n.length>50?"...":""}`}},{enabled:t=>{if(!t.servicePath)return!1;let r=f(t.servicePath);return!Kt(r)},task:async(t,r)=>{if(!await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"toggle",message:me.default.bold("\u26A0\uFE0F Overwrite existing directory?"),enabled:"Yes",disabled:"No",initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,r.title=me.default.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,r)=>{if(!await r.prompt(ke.ListrEnquirerPromptAdapter).run({type:"Toggle",initial:!0,message:"\u{1F680} Ready to launch your project?"}))throw new Error("Project creation was canceled by the user.")}}],actions:[],onComplete:async t=>{Mt.find(s=>s.value===t.projectType)||e.error(me.default.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 qa(r,t,n,o)}});for(let t of Mt)e.addCommand(t.command);return e};var Bi=require("commander");g();var de=require("node:fs"),Ot=require("node:path");v();var ed=e=>{let t=(0,Ot.join)(e,"infra","services");if(!(0,de.existsSync)(t))return[];let r=(0,de.readdirSync)(t).filter(i=>i.endsWith(".ts")&&i!=="index.ts").map(i=>i.replace(".ts","")),n=A(e),o=i=>{let c=(0,Ot.join)(e,i);return(0,de.existsSync)(c)?(0,de.readdirSync)(c).filter(l=>(0,de.existsSync)((0,Ot.join)(c,l,"package.json"))):[]},s=[...o(n.services),...o(n.apps)],a=r.filter(i=>!s.includes(i));for(let i of a)(0,de.unlinkSync)((0,Ot.join)(t,`${i}.ts`));return a},qn=async e=>{let t=ed(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),await Y({cwd:e,quiet:!0}),await mt("generate-env",{cwd:e})},Zn=async e=>{await Ra()&&await Na(e)};var Yn=u(require("chalk"));Ft();var Xn=e=>new Promise(t=>setTimeout(t,e)),Li=e=>process.stdout.write(`${e}
492
+ `),td=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},Hi=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),Qn=async(e,t)=>{let r=qo(".env.local",t);r.length>0&&(await Qo(r),await Xn(50)),Li(Yn.default.cyan("\u{1F525} Starting services...")),Li(Yn.default.dim(` Command: turbo run ${Hr} --continue`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=Xo("turbo",["run",Hr,"--continue","--no-daemon"],{cwd:t,envFile:".env.local",onExit:n=>{e.isRestarting||e.isShuttingDown||n===1&&process.exit(C.SUCCESS)}})},eo=async e=>{let t=e.turboProcess?.pid;if(t){e.isShuttingDown=!0;try{try{process.kill(-t,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await Xn(200);try{process.kill(-t,"SIGKILL")}catch{}await Xn(30)}catch{}e.turboProcess=null,td()}};var Wi=new Bi.Command("dev").description("Start development mode with auto-reload").action(async()=>{let e=y(),t=Hi(),r=async()=>{await qn(e),await Zn(e),await Qn(t,e)},o=Ut(async()=>{t.isRestarting||t.isShuttingDown||(t.isRestarting=!0,console.log(`
477
493
  \u{1F504} Change detected, restarting...
478
- `),await Qa(t),await o(),t.isRestarting=!1)},300),i=async()=>{if(t.isShuttingDown)return;t.isShuttingDown=!0,console.log(`
479
- \u{1F6D1} Shutting down...`);let c=t.turboProcess?.pid;if(c)try{process.kill(-c,"SIGKILL")}catch{try{t.turboProcess?.kill("SIGKILL")}catch{}}process.exit(0)};process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",i),process.on("SIGTERM",i),await o(),ro(e,a),console.log(`
494
+ `),await eo(t),await qn(e),await Zn(e),await Qn(t,e),t.isRestarting=!1)},300),s=async()=>{t.isShuttingDown||(console.log(`
495
+ \u{1F6D1} Shutting down...`),await eo(t),process.exit(C.SUCCESS))};process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",s),process.on("SIGTERM",s),await r(),So(e,o),console.log(`
480
496
  \u{1F440} Watching for changes...`),console.log(` Press Ctrl+C twice to exit (first stops Turbo, second triggers cleanup)
481
- `)});var vi=require("commander");var ni=require("node:fs"),ri=require("node:path"),Q=u(require("chalk")),oi=require("commander");var pm=e=>{if(e)try{return JSON.parse(e)}catch{return}},mm=e=>{if(!e)return;let t={},n=e.split(",").map(r=>r.trim()).filter(Boolean);for(let r of n){let[o,s]=r.split(":").map(a=>a.trim());o&&s&&(t[o]=s)}return Object.keys(t).length>0?t:void 0},dm=(e,t)=>{if(!t)return;let n=t.startsWith("/")?t:(0,ri.resolve)(e,t);return(0,ni.existsSync)(n)?n:void 0},um=async(e,t)=>{let n=[],r=[],o=[];if(En(e)&&!t.force)r.push("Contract (already exists)");else{let a=An(e,t.schema);n.push(`Contract: ${a}`)}Dn(e)&&n.push("Export: packages/contracts/src/index.ts");let s=await Rt(e);if(s&&n.push(`Mock: ${s}`),t.servicePath){let a=Mn(e,t.servicePath);a?n.push(`Handler: ${a}`):r.push("Handler (already exists)");let i=Rn(t.servicePath,e);i.added?n.push(`Stream: ${i.streamName} added to index.ts`):i.warning&&o.push(i.warning)}return{created:n,skipped:r,warnings:o}},gm=(e,t,n=[])=>{if(e.length>0){console.log(Q.default.green(`\u2713 Created:
482
- `));for(let r of e)console.log(Q.default.dim(` ${r}`))}if(t.length>0){console.log(Q.default.yellow(`
483
- \u2139 Skipped:
484
- `));for(let r of t)console.log(Q.default.dim(` ${r}`))}if(n.length>0){console.log(Q.default.yellow(`
485
- \u26A0 Warning:
486
- `));for(let r of n)console.log(Q.default.dim(` ${r}`))}},Pr=async(e,t)=>{let n=y();if(!n){m.error("Not in a pf workspace. Run this command from your workspace root.");return}if(!e.includes(".")){m.error("Event type must include a namespace (e.g., orders.created)");return}let r=mm(t.fields)||pm(t.schema);if(t.schema&&!r&&!t.fields){m.error(`Invalid schema JSON. Example: '{"orderId":"string","total":"number"}'`);return}if(t.fields&&!r){m.error("Invalid fields format. Example: orderId:string,total:number");return}let o=dm(n,t.service);if(t.service&&!o){m.error(`Service directory not found: ${t.service}`);return}console.log(Q.default.cyan(`
487
- \u{1F4E6} Adding event: ${e}
488
- `));let{created:s,skipped:a,warnings:i}=await um(e,{schema:r,servicePath:o,force:t.force});gm(s,a,i),console.log(),s.length>0&&ye({force:!0}),t.service||(console.log(Q.default.yellow(`\u{1F4A1} Tip: Use --service to also create an event handler:
489
- `)),console.log(Q.default.dim(` pf event add ${e} --service services/my-service
490
- `)))},wk=new oi.Command("event:add").description("Add event contract, handler, and mock").argument("<event-type>","Event type (e.g., orders.created)").option("-s, --service <path>","Service path to create handler in (e.g., services/orders)").option("-f, --fields <fields>","Schema fields (e.g., orderId:string,total:number,customerId:string)").option("--schema <json>",`Schema fields as JSON (e.g., '{"orderId":"string","total":"number"}')`).option("--force","Overwrite existing files",!1).action(Pr);var ii=require("commander");var si=require("fs-extra"),ai=require("globby"),ue=require("zod");var fm=["**/node_modules/**","**/.nats-data/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**"],hm=ue.z.record(ue.z.string()),ym=ue.z.object({description:ue.z.string().optional(),eventName:ue.z.string(),faker:hm.optional(),data:ue.z.record(ue.z.any())}),Ke=(e=process.cwd())=>(0,ai.globbySync)("**/*.mock.json",{cwd:e,absolute:!0,gitignore:!0,ignore:fm}).map(n=>{try{let r=(0,si.readJSONSync)(n,{encoding:"utf8"}),o=ym.safeParse(r);return o.success?{eventName:o.data.eventName,path:n,schema:o.data}:(m.warn(`\u26A0\uFE0F Invalid schema in ${n}`),console.log(o.error.format()),null)}catch{return m.warn(`\u26A0\uFE0F Failed to read or parse ${n}`),null}}).filter(n=>n!==null);var Tr=null,ci=async()=>{if(!Tr){let{faker:e}=await import("@faker-js/faker");Tr=e}return Tr},$r=async(e,t)=>{let n=await ci(),o=Ke().find(p=>p.eventName===e);if(!o){m.error(`Event "${e}" not found. Use "pf event list" to see available events.`);return}let s=o.schema,a=t.fake?await km(s):s.data,c={message:{data:Buffer.from(JSON.stringify({...a,type:s.eventName})).toString("base64"),messageId:n.string.uuid(),attributes:{source:"platform-sdk"}}};if(t.print){console.dir(c,{colors:!0});return}let l=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!l.ok){let p=await l.text();throw new Error(`Request failed: ${l.status} \u2013 ${p}`)}m.success("Event sent successfully.")},Ek=new ii.Command("event:http").description("Send via HTTP Pub/Sub endpoint").argument("<eventName>","The name of the event").option("--endpoint <url>","Target HTTP endpoint","http://localhost:3000").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated Pub/Sub event without sending").action($r),km=async e=>{let t=structuredClone(e.data);return e.faker&&await Promise.all(Object.entries(e.faker).map(async([n,r])=>{let o=await vm(r);nn(t,n,o)})),t},vm=async e=>{let t=await ci();switch(e){case"uuid":return t.string.uuid();case"email":return t.internet.email();case"string":return t.lorem.word();case"number":return t.number.int();case"boolean":return t.datatype.boolean();case"date":return new Date().toISOString();case"productName":return t.commerce.productName();case"productDescription":return t.commerce.productDescription();case"firstName":return t.person.firstName();case"lastName":return t.person.lastName();case"url":return t.internet.url();case"phoneNumber":return t.phone.number();case"streetAddress":return t.location.streetAddress();case"city":return t.location.city();case"state":return t.location.state();case"country":return t.location.country();case"companyName":return t.company.name();case"zipCode":return t.location.zipCode();case"password":return t.internet.password();default:return null}};var fi=require("commander");var Er=require("node:fs"),li=require("node:path"),Ar=require("globby");var Cm=["**/node_modules/**","**/.nats-data/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**"],xm=e=>{let t=e.split("/"),n=t.indexOf("services");return n!==-1&&n+1<t.length?t[n+1]:"unknown"},wm=(e,t)=>{try{let{eventsPath:n}=C(t),o=(0,Ar.globbySync)("**/*.ts",{cwd:n,absolute:!0}).map(a=>({file:a,content:(0,Er.readFileSync)(a,"utf-8")})).find(({content:a})=>a.includes(`export const ${e}`));if(!o)return null;let s=o.content.match(/type:\s*['"]([^'"]+)['"]/);return s?s[1]:null}catch{return null}},bm=e=>e.replace(/Contract$/,"").replace(/([A-Z])/g,(t,n,r)=>(r>0?".":"")+n.toLowerCase()),Sm=(e,t)=>{let n=e.match(/handleEvent\s*\(\s*\{\s*[^}]*type:\s*['"]([^'"]+)['"]/s);if(n)return n[1];let r=e.match(/handleEvent\s*\(\s*['"]([^'"]+)['"]/s);if(r)return r[1];let o=e.match(/import\s+(?:type\s+)?{[^}]*?(\w+Contract)[^}]*?}\s+from/);if(!o)return null;let s=o[1];return wm(s,t)||bm(s)},Pm=(e,t)=>{try{let n=(0,Er.readFileSync)(e,"utf-8"),r=Sm(n,t);return r?{serviceName:xm(e),handlerPath:(0,li.relative)(t,e),eventType:r}:null}catch{return null}},pi=(e=process.cwd())=>(0,Ar.globbySync)("services/**/src/events/*.handler.ts",{cwd:e,absolute:!0,gitignore:!0,ignore:Cm}).map(n=>Pm(n,e)).filter(n=>n!==null),mi=e=>e.reduce((t,n)=>{let r=t.get(n.eventType)||[];return t.set(n.eventType,[...r,n]),t},new Map);var ui=u(require("cli-table3"));var di=(e,t)=>{let n=t.get(e)||[],r=[...new Set(n.map(o=>o.serviceName))];return r.length>0?r.join(", "):"-"};var gi=(e,t)=>{let n=new ui.default({head:["name","description","consumers"],style:{head:["dim","bold"],compact:!0}});for(let{eventName:r,schema:o}of e)n.push([r,o.description||"-",di(r,t)]);return n.toString()};var Tm=e=>{for(let t of e)console.log(t)},$m=()=>{let e=ar();Tm(e)},Em=()=>{let e=Ke();if(e.length===0){m.error("No event schemas found.");return}let t=pi(),n=mi(t),r=gi(e,n);console.log(r)},Ir=e=>{if(!ta()){if(e.namesOnly)return;m.error("This command must be run from within a workspace."),m.info("To create a new workspace, run: pf new workspace my-platform"),process.exit(1)}e.namesOnly?$m():Em()},Bk=new fi.Command("event:list").description("List all available event mocks").option("--names-only","Output only event names (for completion)").action(Ir);var hi=require("node:path"),yi=require("commander");var Rm={},Nr=null,Rr=null,ki=async()=>{if(!Nr){let{faker:e}=await import("@faker-js/faker");Nr=e}return Nr},Am=async()=>{if(!Rr)try{let{createJiti:e}=await import("jiti"),t=e(Rm.url),n=y(),r=C(n),o=(0,hi.join)(r.packagePath,"node_modules","@crossdelta","cloudevents");Rr=(await t.import(o)).publish}catch{throw new Error(`@crossdelta/cloudevents is required for event:publish.
491
- Install it in your contracts package with: cd packages/contracts && bun add @crossdelta/cloudevents`)}return Rr},Mr=async(e,t)=>{let n=await ki(),o=Ke().find(i=>i.eventName===e||i.path.includes(`${e}.mock.json`));if(!o){m.error(`Event "${e}" not found. Use "pf event list" to see available events.`);return}let s=o.schema,a=t.fake?await Im(s):s.data;if(t.print){console.log(`
492
- \u{1F4E6} Event Type:`,s.eventName),console.log("\u{1F4C4} Payload:"),console.dir(a,{colors:!0,depth:null});return}try{let i=await Am();if(!i)throw new Error("Failed to load publish function from cloudevents");await i(s.eventName,a,{source:"platform-sdk-cli",subject:n.string.uuid()}),m.success(`Event "${s.eventName}" published successfully to NATS JetStream.`),await new Promise(c=>setTimeout(c,100)),process.exit(0)}catch(i){m.error(`Failed to publish event: ${i instanceof Error?i.message:String(i)}`),m.info("Make sure NATS is running and NATS_URL is configured."),process.exit(1)}},Kk=new yi.Command("event:publish").description("Publish to NATS JetStream").argument("<eventName>","The name of the event (e.g., order-created)").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated event data without publishing").action(Mr),Im=async e=>{let t=structuredClone(e.data);return e.faker&&await Promise.all(Object.entries(e.faker).map(async([n,r])=>{let o=await Nm(r);nn(t,n,o)})),t},Nm=async e=>{let t=await ki();switch(e.toLowerCase()){case"uuid":return t.string.uuid();case"email":return t.internet.email();case"firstname":return t.person.firstName();case"lastname":return t.person.lastName();case"name":return t.person.fullName();case"url":return t.internet.url();case"phone":return t.phone.number();case"date":return t.date.recent().toISOString();case"boolean":return t.datatype.boolean();case"number":return t.number.int({min:1,max:1e3});case"string":return t.lorem.word();case"text":return t.lorem.sentence();default:return e}};var ze=new vi.Command("event").description("Event management commands");ze.command("add").description("Add event contract, handler, and mock").argument("<event-type>","Event type (e.g., orders.created)").option("-s, --service <path>","Service path to create handler in (e.g., services/orders)").option("--schema <fields>",`Schema fields as JSON (e.g., '{"orderId":"string","total":"number"}')`).option("--force","Overwrite existing files",!1).action(Pr);ze.command("list").description("List all available event mocks").option("--names-only","Output only event names (for completion)").action(Ir);ze.command("publish").description("Publish to NATS JetStream").argument("<eventName>","Event name to publish").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated event data without publishing").action(Mr);ze.command("http").description("Send via HTTP Pub/Sub endpoint").argument("<eventName>","Event name to send").option("--endpoint <url>","Target HTTP endpoint","http://localhost:3000").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated Pub/Sub event without sending").action($r);ze.action(()=>{let e=pe({title:"\u{1F4EC} Event Management",commands:[{name:"add",description:"Add event contract, handler, and mock"},{name:"list",description:"List all available event mocks"},{name:"publish",description:"Publish to NATS JetStream"},{name:"http",description:"Send via HTTP Pub/Sub endpoint"}],footer:'Run "pf event <command> --help" for more information'});console.log(e)});var Ci=ze;var Or=u(require("chalk")),Pi=require("commander");var qe=require("node:fs"),Fr=u(require("node:path")),yn=u(require("chalk")),xi=require("commander"),wi=u(require("os"));var{name:Mm,publishConfig:jm}=R,Fm=jm?.registry,Om=Mm?.split("/")[0],nv=new xi.Command("token:set").description(yn.default.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)",Om).option("--registry <registry>","Registry URL",Fm).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)=>bi(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${yn.default.cyan(`
497
+ `)});var sc=require("commander");var to=require("node:fs"),ro=require("node:path"),jr=require("@listr2/prompt-adapter-enquirer"),ve=u(require("chalk"));v();g();var rd=e=>{if(e)try{return JSON.parse(e)}catch{return}},Gi=e=>{if(!e)return;let t={},r=e.split(",").map(n=>n.trim()).filter(Boolean);for(let n of r){let[o,s]=n.split(":").map(a=>a.trim());o&&s&&(t[o]=s)}return Object.keys(t).length>0?t:void 0},nd=(e,t)=>{if(!t)return;let r=t.startsWith("/")?t:(0,ro.resolve)(e,t);return(0,to.existsSync)(r)?r:void 0},od=async e=>{let{eventType:t,schema:r,servicePath:n,force:o}=e,s=[],a=[],i=[];if(tr(t)&&!o)a.push("Contract (already exists)");else{let l=ln(t,r);s.push(`Contract: ${l}`)}kn(t)&&s.push("Export: packages/contracts/src/index.ts");let c=await or(t);if(c&&s.push(`Mock: ${c}`),n){let l=un(t,n);l?s.push(`Handler: ${l}`):a.push("Handler (already exists)");let p=dn(n,t);p.added?s.push(`Stream: ${p.streamName} added to index.ts`):p.warning&&i.push(p.warning)}return{created:s,skipped:a,warnings:i}},sd=()=>{try{let e=y();return _n(e)?.services??[]}catch{return[]}},ad={title:"Event configuration",enabled:e=>!e.eventType,task:async(e,t)=>{e.eventType=await t.prompt(jr.ListrEnquirerPromptAdapter).run({type:"Input",message:"Event type (e.g., order.created):",validate:r=>r?r.includes(".")?!0:"Event type must include a namespace (e.g., order.created)":"Event type is required"})}},id={title:"Service selection",enabled:e=>!e.servicePath,task:async(e,t)=>{let r=sd();if(r.length===0){t.skip("No services found in workspace");return}let n=await t.prompt(jr.ListrEnquirerPromptAdapter).run({type:"Select",message:"Select service to create handler in (or skip):",choices:[{name:"skip",message:ve.default.dim("Skip handler creation"),value:""},...r.map(o=>({name:o,message:o,value:o}))]});if(n){let o=(0,ro.resolve)(e.workspaceRoot,n);(0,to.existsSync)(o)&&(e.servicePath=o)}}},cd={title:"Schema fields",enabled:e=>!e.schema&&!tr(e.eventType),task:async(e,t)=>{let r=await t.prompt(jr.ListrEnquirerPromptAdapter).run({type:"Input",message:"Schema fields (e.g., orderId:string,total:number) or leave empty:",initial:""});r.trim()&&(e.schema=Gi(r)),t.skip(r?`Fields: ${r}`:"No schema defined")}},ld={title:"Creating event files",task:async(e,t)=>{let r=await od(e);return t.title=[ve.default.green("Event created successfully"),...r.created.map(n=>ve.default.dim(` ${n}`)),...r.skipped.map(n=>ve.default.yellow(` \u2139 ${n}`)),...r.warnings.map(n=>ve.default.yellow(` \u26A0 ${n}`))].join(`
498
+ `),r}},Ui=q({name:"add",description:"Add event contract, handler, and mock (interactive)",arguments:[["[event-type]","Event type (e.g., order.created)"]],options:[["-s, --service <path>","Service path to create handler in (e.g., services/orders)"],["-f, --fields <fields>","Schema fields (e.g., orderId:string,total:number,customerId:string)"],["--schema <json>",`Schema fields as JSON (e.g., '{"orderId":"string","total":"number"}')`],["--force","Overwrite existing files"],["-i, --interactive","Run in interactive mode with prompts"]],exampleUsage:"pf event add order.created --interactive",buildContext:async(e,t)=>{let r=y();await ye({force:!1});let n=Gi(t.fields)||rd(t.schema),o;return t.service&&(o=nd(r,t.service)),{eventType:e["event-type"]||"",schema:n,servicePath:o,force:t.force??!1,workspaceRoot:r}},prompts:[ad,id,cd],actions:[ld],onComplete:async e=>{await ye({force:!0}),e.servicePath||(console.log(ve.default.yellow(`
499
+ \u{1F4A1} Tip: Use --service to also create an event handler:
500
+ `)),console.log(ve.default.dim(` pf event add ${e.eventType} --service services/my-service
501
+ `)))}});var zi=require("commander");g();var Ji=require("fs-extra"),Ki=require("globby"),se=require("zod");g();var pd=["**/node_modules/**","**/.nats-data/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**"],md=se.z.record(se.z.string(),se.z.string()),dd=se.z.object({description:se.z.string().optional(),eventName:se.z.string(),faker:md.optional(),data:se.z.record(se.z.string(),se.z.any())}),rt=(e=process.cwd())=>(0,Ki.globbySync)("**/*.mock.json",{cwd:e,absolute:!0,gitignore:!0,ignore:pd}).map(r=>{try{let n=(0,Ji.readJSONSync)(r,{encoding:"utf8"}),o=dd.safeParse(n);return o.success?{eventName:o.data.eventName,path:r,schema:o.data}:(m.warn(`\u26A0\uFE0F Invalid schema in ${r}`),console.log(o.error.format()),null)}catch{return m.warn(`\u26A0\uFE0F Failed to read or parse ${r}`),null}}).filter(r=>r!==null);var no=null,Vi=async()=>{if(!no){let{faker:e}=await import("@faker-js/faker");no=e}return no},oo=async(e,t)=>{let r=await Vi(),o=rt().find(p=>p.eventName===e);if(!o){m.error(`Event "${e}" not found. Use "pf event list" to see available events.`);return}let s=o.schema,a=t.fake?await ud(s):s.data,c={message:{data:Buffer.from(JSON.stringify({...a,type:s.eventName})).toString("base64"),messageId:r.string.uuid(),attributes:{source:"platform-sdk"}}};if(t.print){console.dir(c,{colors:!0});return}let l=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!l.ok){let p=await l.text();throw new Error(`Request failed: ${l.status} \u2013 ${p}`)}m.success("Event sent successfully.")},Lv=new zi.Command("event:http").description("Send via HTTP Pub/Sub endpoint").argument("<eventName>","The name of the event").option("--endpoint <url>","Target HTTP endpoint","http://localhost:3000").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated Pub/Sub event without sending").action(oo),ud=async e=>{let t=structuredClone(e.data);return e.faker&&await Promise.all(Object.entries(e.faker).map(async([r,n])=>{let o=await gd(n);Jt(t,r,o)})),t},gd=async e=>{let t=await Vi();switch(e){case"uuid":return t.string.uuid();case"email":return t.internet.email();case"string":return t.lorem.word();case"number":return t.number.int();case"boolean":return t.datatype.boolean();case"date":return new Date().toISOString();case"productName":return t.commerce.productName();case"productDescription":return t.commerce.productDescription();case"firstName":return t.person.firstName();case"lastName":return t.person.lastName();case"url":return t.internet.url();case"phoneNumber":return t.phone.number();case"streetAddress":return t.location.streetAddress();case"city":return t.location.city();case"state":return t.location.state();case"country":return t.location.country();case"companyName":return t.company.name();case"zipCode":return t.location.zipCode();case"password":return t.internet.password();default:return null}};var tc=require("commander");g();var so=require("node:fs"),qi=require("node:path"),ao=require("globby");v();var fd=["**/node_modules/**","**/.nats-data/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**"],hd=e=>{let t=e.split("/"),r=t.indexOf("services");return r!==-1&&r+1<t.length?t[r+1]:"unknown"},yd=(e,t)=>{try{let{eventsPath:r}=w(t),o=(0,ao.globbySync)("**/*.ts",{cwd:r,absolute:!0}).map(a=>({file:a,content:(0,so.readFileSync)(a,"utf-8")})).find(({content:a})=>a.includes(`export const ${e}`));if(!o)return null;let s=o.content.match(/type:\s*['"]([^'"]+)['"]/);return s?s[1]:null}catch{return null}},kd=e=>e.replace(/Contract$/,"").replace(/([A-Z])/g,(t,r,n)=>(n>0?".":"")+r.toLowerCase()),vd=(e,t)=>{let r=e.match(/handleEvent\s*\(\s*\{\s*[^}]*type:\s*['"]([^'"]+)['"]/s);if(r)return r[1];let n=e.match(/handleEvent\s*\(\s*['"]([^'"]+)['"]/s);if(n)return n[1];let o=e.match(/import\s+(?:type\s+)?{[^}]*?(\w+Contract)[^}]*?}\s+from/);if(!o)return null;let s=o[1];return yd(s,t)||kd(s)},Cd=(e,t)=>{try{let r=(0,so.readFileSync)(e,"utf-8"),n=vd(r,t);return n?{serviceName:hd(e),handlerPath:(0,qi.relative)(t,e),eventType:n}:null}catch{return null}},Zi=(e=process.cwd())=>{let t=A(e),r=[`${t.services}/**/src/events/*.handler.ts`,`${t.apps}/**/src/events/*.handler.ts`];return(0,ao.globbySync)(r,{cwd:e,absolute:!0,gitignore:!0,ignore:fd}).map(o=>Cd(o,e)).filter(o=>o!==null)},Yi=e=>e.reduce((t,r)=>{let n=t.get(r.eventType)||[];return t.set(r.eventType,[...n,r]),t},new Map);var Qi=u(require("cli-table3"));var Xi=(e,t)=>{let r=t.get(e)||[],n=[...new Set(r.map(o=>o.serviceName))];return n.length>0?n.join(", "):"-"};var ec=(e,t)=>{let r=new Qi.default({head:["name","description","consumers"],style:{head:["dim","bold"],compact:!0}});for(let{eventName:n,schema:o}of e)r.push([n,o.description||"-",Xi(n,t)]);return r.toString()};var xd=e=>{for(let t of e)console.log(t)},wd=()=>{let e=On();xd(e)},bd=()=>{let e=rt();if(e.length===0){m.error("No event schemas found.");return}let t=Zi(),r=Yi(t),n=ec(e,r);console.log(n)},io=e=>{if(!Yr()){if(e.namesOnly)return;m.error("This command must be run from within a workspace."),m.info("To create a new workspace, run: pf new workspace my-platform"),process.exit(C.WORKSPACE_ERROR)}e.namesOnly?wd():bd()},Xv=new tc.Command("event:list").description("List all available event mocks").option("--names-only","Output only event names (for completion)").action(io);var rc=require("node:path"),nc=require("commander");g();var Ed={},co=null,lo=null,oc=async()=>{if(!co){let{faker:e}=await import("@faker-js/faker");co=e}return co},Sd=async()=>{if(!lo)try{let{createJiti:e}=await import("jiti"),t=e(Ed.url),r=y(),n=w(r),o=(0,rc.join)(n.packagePath,"node_modules","@crossdelta","cloudevents");lo=(await t.import(o)).publish}catch{throw new Error(`@crossdelta/cloudevents is required for event:publish.
502
+ Install it in your contracts package with: cd packages/contracts && bun add @crossdelta/cloudevents`)}return lo},po=async(e,t)=>{let r=await oc(),o=rt().find(i=>i.eventName===e||i.path.includes(`${e}.mock.json`));if(!o){m.error(`Event "${e}" not found. Use "pf event list" to see available events.`);return}let s=o.schema,a=t.fake?await Pd(s):s.data;if(t.print){console.log(`
503
+ \u{1F4E6} Event Type:`,s.eventName),console.log("\u{1F4C4} Payload:"),console.dir(a,{colors:!0,depth:null});return}try{let i=await Sd();if(!i)throw new Error("Failed to load publish function from cloudevents");await i(s.eventName,a,{source:"platform-sdk-cli",subject:r.string.uuid()}),m.success(`Event "${s.eventName}" published successfully to NATS JetStream.`),await new Promise(c=>setTimeout(c,100)),process.exit(C.SUCCESS)}catch(i){m.error(`Failed to publish event: ${i instanceof Error?i.message:String(i)}`),m.info("Make sure NATS is running and NATS_URL is configured."),process.exit(C.GENERAL_ERROR)}},nC=new nc.Command("event:publish").description("Publish to NATS JetStream").argument("<eventName>","The name of the event (e.g., order-created)").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated event data without publishing").action(po),Pd=async e=>{let t=structuredClone(e.data);return e.faker&&await Promise.all(Object.entries(e.faker).map(async([r,n])=>{let o=await Td(n);Jt(t,r,o)})),t},Td=async e=>{let t=await oc();switch(e.toLowerCase()){case"uuid":return t.string.uuid();case"email":return t.internet.email();case"firstname":return t.person.firstName();case"lastname":return t.person.lastName();case"name":return t.person.fullName();case"url":return t.internet.url();case"phone":return t.phone.number();case"date":return t.date.recent().toISOString();case"boolean":return t.datatype.boolean();case"number":return t.number.int({min:1,max:1e3});case"string":return t.lorem.word();case"text":return t.lorem.sentence();default:return e}};var nt=new sc.Command("event").description("Event management commands");nt.addCommand(Ui);nt.command("list").description("List all available event mocks").option("--names-only","Output only event names (for completion)").action(io);nt.command("publish").description("Publish to NATS JetStream").argument("<eventName>","Event name to publish").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated event data without publishing").action(po);nt.command("http").description("Send via HTTP Pub/Sub endpoint").argument("<eventName>","Event name to send").option("--endpoint <url>","Target HTTP endpoint","http://localhost:3000").option("--fake","Apply fake values to fakeable fields").option("--print","Print the generated Pub/Sub event without sending").action(oo);nt.action(()=>{let e=he({title:"\u{1F4EC} Event Management",commands:[{name:"add",description:"Add event contract, handler, and mock"},{name:"list",description:"List all available event mocks"},{name:"publish",description:"Publish to NATS JetStream"},{name:"http",description:"Send via HTTP Pub/Sub endpoint"}],footer:'Run "pf event <command> --help" for more information'});console.log(e)});var ac=nt;var go=u(require("chalk")),mc=require("commander");var ot=require("node:fs"),uo=u(require("node:path")),Fr=u(require("chalk")),ic=require("commander"),cc=u(require("os"));g();var{name:$d,publishConfig:Ad}=_,Id=Ad?.registry,Rd=$d?.split("/")[0],uC=new ic.Command("token:set").description(Fr.default.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)",Rd).option("--registry <registry>","Registry URL",Id).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)=>lc(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${Fr.default.cyan(`
493
504
  Example:`)}
494
- ${yn.default.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
495
- `),_m=e=>e?Fr.default.join(process.cwd(),".npmrc"):Fr.default.join(wi.default.homedir(),".npmrc"),Dm=(e,t,n)=>{let r=new URL(n).host;return t?`${t}:registry=https://${r}
496
- //${r}/:_authToken=${e}`:`//${r}/:_authToken=${e}`},Lm=e=>(0,qe.existsSync)(e)?(0,qe.readFileSync)(e,"utf8"):"",jr=(e,t)=>(0,qe.writeFileSync)(e,t),bi=(e,t,n,r=!1,o=!1)=>{let s=_m(r),a=Dm(e,t,n),i=new URL(n).host,c=Lm(s),l=new RegExp(`//${i}/:_authToken=\\S+`);if(!c){jr(s,`${a}
497
- `),m.success(`Created new .npmrc and set token for ${i}`);return}if(l.test(c)){if(!o){m.warn(`Token for ${i} already exists in ${s}. Use --force to overwrite.`);return}c=c.replace(l,a),jr(s,c),m.success(`Overwrote existing token for ${i} in ${s}`);return}c+=`
505
+ ${Fr.default.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
506
+ `),Nd=e=>e?uo.default.join(process.cwd(),".npmrc"):uo.default.join(cc.default.homedir(),".npmrc"),Md=(e,t,r)=>{let n=new URL(r).host;return t?`${t}:registry=https://${n}
507
+ //${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},Od=e=>(0,ot.existsSync)(e)?(0,ot.readFileSync)(e,"utf8"):"",mo=(e,t)=>(0,ot.writeFileSync)(e,t),lc=(e,t,r,n=!1,o=!1)=>{let s=Nd(n),a=Md(e,t,r),i=new URL(r).host,c=Od(s),l=new RegExp(`//${i}/:_authToken=\\S+`);if(!c){mo(s,`${a}
508
+ `),m.success(`Created new .npmrc and set token for ${i}`);return}if(l.test(c)){if(!o){m.warn(`Token for ${i} already exists in ${s}. Use --force to overwrite.`);return}c=c.replace(l,a),mo(s,c),m.success(`Overwrote existing token for ${i} in ${s}`);return}c+=`
498
509
  ${a}
499
- `,jr(s,c),m.success(`Appended token for ${i} to ${s}`)},Si=(e,t)=>bi(e,t.scope||"",t.registry||"",t.local,t.force);var{name:Hm,publishConfig:Bm}=R,Wm=Bm?.registry,Gm=Hm?.split("/")[0],_r=new Pi.Command("token").description("Token management commands");_r.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)",Gm).option("--registry <registry>","Registry URL",Wm).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(Si).addHelpText("after",()=>`${Or.default.cyan(`
510
+ `,mo(s,c),m.success(`Appended token for ${i} to ${s}`)},pc=(e,t)=>lc(e,t.scope||"",t.registry||"",t.local,t.force);var{name:jd,publishConfig:Fd}=_,_d=Fd?.registry,Dd=jd?.split("/")[0],fo=new mc.Command("token").description("Token management commands");fo.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)",Dd).option("--registry <registry>","Registry URL",_d).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(pc).addHelpText("after",()=>`${go.default.cyan(`
500
511
  Example:`)}
501
- ${Or.default.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
502
- `);_r.action(()=>{let e=pe({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 Ti=_r;var kn=u(require("chalk")),Ii=require("commander");var lv={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};var ee=require("@inquirer/prompts"),w=u(require("chalk"));var Um=[/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],Jm=async(e,t,n=1e4)=>{let r=new AbortController,o=setTimeout(()=>r.abort(),n);try{return await fetch(e,{...t,signal:r.signal})}finally{clearTimeout(o)}},Km=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(),zm=async(e,t)=>{let n=Xe(e),r=await Jm(n.modelsApiUrl,{headers:n.buildHeaders(t)});if(!r.ok)throw new Error(`${n.name} API error: ${r.status}`);let o=await r.json(),s=n.parseModelsResponse(o);if(!Array.isArray(s)||s.length===0)throw new Error(`No models returned from ${n.name} API`);let a=s.filter(i=>{let c=n.modelFilters.some(p=>p.test(i.id)),l=Um.some(p=>p.test(i.id));return c&&!l}).sort((i,c)=>{let l=typeof i.created=="number"?i.created:new Date(i.created).getTime();return(typeof c.created=="number"?c.created:new Date(c.created).getTime())-l}).map(i=>({name:Km(i.id),value:i.id}));if(a.length===0)throw new Error(`No chat models found from ${n.name} API`);return a};async function $i(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await zm(e,t),fromApi:!0}}function qm(){if(!Qe())return null;try{let e=Pt();return console.log(w.default.dim(`Found existing configuration at ${fe}
503
- `)),e}catch{return console.log(w.default.yellow(`Found corrupted configuration, starting fresh.
504
- `)),null}}async function Vm(e,t){return console.log(w.default.dim(`
505
- \u{1F4CB} Get your ${e} API key here:`)),console.log(w.default.cyan(` ${t}
506
- `)),(0,ee.password)({message:`Enter your ${e} API key:`,mask:"*",validate:n=>n.trim()?n.length<10?"API key seems too short":!0:"API key cannot be empty"})}async function Zm(e,t,n){let r=await(0,ee.select)({message:"Select model:",choices:e,default:t?.provider===n?t.model:void 0});return await(0,ee.confirm)({message:"Enter a custom model ID instead?",default:!1})?(0,ee.input)({message:"Enter custom model ID:",default:r,validate:s=>s.trim()?!0:"Model ID cannot be empty"}):r}function Ei(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function Ym(e,t){console.log(w.default.green.bold(`
512
+ ${go.default.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
513
+ `);fo.action(()=>{let e=he({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 dc=fo;var _r=u(require("chalk")),hc=require("commander");v();Ft();var CC={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};var ae=require("@inquirer/prompts"),S=u(require("chalk"));var Ld=[/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],Hd=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)}},Bd=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(),Wd=async(e,t)=>{let r=ut(e),n=await Hd(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 a=s.filter(i=>{let c=r.modelFilters.some(p=>p.test(i.id)),l=Ld.some(p=>p.test(i.id));return c&&!l}).sort((i,c)=>{let l=typeof i.created=="number"?i.created:new Date(i.created).getTime();return(typeof c.created=="number"?c.created:new Date(c.created).getTime())-l}).map(i=>({name:Bd(i.id),value:i.id}));if(a.length===0)throw new Error(`No chat models found from ${r.name} API`);return a};async function uc(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await Wd(e,t),fromApi:!0}}Ie();function Gd(){if(!gt())return null;try{let e=Qt();return console.log(S.default.dim(`Found existing configuration at ${Pe}
514
+ `)),e}catch{return console.log(S.default.yellow(`Found corrupted configuration, starting fresh.
515
+ `)),null}}async function Ud(e,t){return console.log(S.default.dim(`
516
+ \u{1F4CB} Get your ${e} API key here:`)),console.log(S.default.cyan(` ${t}
517
+ `)),(0,ae.password)({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 Jd(e,t,r){let n=await(0,ae.select)({message:"Select model:",choices:e,default:t?.provider===r?t.model:void 0});return await(0,ae.confirm)({message:"Enter a custom model ID instead?",default:!1})?(0,ae.input)({message:"Enter custom model ID:",default:n,validate:s=>s.trim()?!0:"Model ID cannot be empty"}):n}function gc(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function Kd(e,t){console.log(S.default.green.bold(`
507
518
  \u2705 AI configuration saved successfully!
508
- `)),console.log(w.default.dim(`Configuration file: ${fe}`)),console.log(w.default.dim("API Key: Stored securely in system keychain")),console.log(w.default.dim(`Provider: ${e.provider}`)),console.log(w.default.dim(`Model: ${e.model}`)),console.log(w.default.dim(`API Key: ${Ei(t)}
509
- `)),console.log(w.default.cyan("You can now use AI-powered service generation:")),console.log(w.default.dim(` pf new hono-micro services/my-service --ai
510
- `))}async function Xm(e){let t=await St(e);if(t)return t;let n=Xe(e);return process.env[n.defaultApiKeyEnvVar]??null}async function Ai(){console.log(w.default.cyan.bold(`
519
+ `)),console.log(S.default.dim(`Configuration file: ${Pe}`)),console.log(S.default.dim("API Key: Stored securely in system keychain")),console.log(S.default.dim(`Provider: ${e.provider}`)),console.log(S.default.dim(`Model: ${e.model}`)),console.log(S.default.dim(`API Key: ${gc(t)}
520
+ `)),console.log(S.default.cyan("You can now use AI-powered service generation:")),console.log(S.default.dim(` pf new hono-micro services/my-service --ai
521
+ `))}async function zd(e){let t=await Xt(e);if(t)return t;let r=ut(e);return process.env[r.defaultApiKeyEnvVar]??null}async function fc(){console.log(S.default.cyan.bold(`
511
522
  \u{1F916} AI Configuration Setup
512
- `));let e=qm();try{let t=await(0,ee.select)({message:"Select AI provider:",choices:Vr(),default:e?.provider??bn.provider}),n=Xe(t),r,o=await Xm(t);o&&(console.log(w.default.green(`
513
- \u2713 Found existing API key: ${Ei(o)}`)),await(0,ee.confirm)({message:"Use this existing API key?",default:!0})&&(r=o)),r||(r=await Vm(n.name,n.apiKeyUrl)),console.log(w.default.dim(`
514
- Fetching available models...`));let s;try{s=(await $i(t,r)).models,console.log(w.default.green(`\u2713 Loaded ${s.length} models from ${n.name} API
515
- `))}catch(c){console.error(w.default.red(`
516
- \u274C Failed to fetch models: ${c.message}`)),console.log(w.default.yellow(`
523
+ `));let e=Gd();try{let t=await(0,ae.select)({message:"Select AI provider:",choices:hs(),default:e?.provider??cn.provider}),r=ut(t),n,o=await zd(t);o&&(console.log(S.default.green(`
524
+ \u2713 Found existing API key: ${gc(o)}`)),await(0,ae.confirm)({message:"Use this existing API key?",default:!0})&&(n=o)),n||(n=await Ud(r.name,r.apiKeyUrl)),console.log(S.default.dim(`
525
+ Fetching available models...`));let s;try{s=(await uc(t,n)).models,console.log(S.default.green(`\u2713 Loaded ${s.length} models from ${r.name} API
526
+ `))}catch(c){console.error(S.default.red(`
527
+ \u274C Failed to fetch models: ${c.message}`)),console.log(S.default.yellow(`
517
528
  Please check your API key and try again.
518
- `)),process.exit(1)}let a=await Zm(s,e,t),i={provider:t,model:a.trim()};Xr(i),await Qr(t,r),Ym(i,r)}catch(t){throw t.name==="ExitPromptError"&&(console.log(w.default.yellow(`
529
+ `)),process.exit(C.CONFIG_ERROR)}let a=await Jd(s,e,t),i={provider:t,model:a.trim()};vs(i),await Cs(t,n),Kd(i,n)}catch(t){throw t.name==="ExitPromptError"&&(console.log(S.default.yellow(`
519
530
  Setup cancelled.
520
- `)),process.exit(0)),t}}var Dr=(e,t=!1)=>{try{return pr(e,t),ye({verbose:t}),!0}catch{return!1}};var vn=e=>{let t=new Ii.Command("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
531
+ `)),process.exit(C.CANCELLED)),t}}var ho=async(e,t=!1)=>{try{return Ln(e,t),await ye({verbose:t}),!0}catch{return!1}};var Dr=e=>{let t=new hc.Command("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
521
532
  Examples:
522
533
  $ pf setup completion
523
534
  $ pf setup completion --verbose
524
- `).action(n=>{Dr(e,n.verbose),n.verbose||(console.log(kn.default.green(`
525
- \u2714 Shell autocompletion installed!`)),console.log(kn.default.dim(` Restart your shell:
526
- `)),console.log(kn.default.cyan(` exec $SHELL
535
+ `).action(async r=>{await ho(e,r.verbose),r.verbose||(console.log(_r.default.green(`
536
+ \u2714 Shell autocompletion installed!`)),console.log(_r.default.dim(` Restart your shell:
537
+ `)),console.log(_r.default.cyan(` exec $SHELL
527
538
  `)))}),t.command("ai").description("Configure AI provider and API key for code generation").addHelpText("after",`
528
539
  Example:
529
540
  $ pf setup ai
530
- `).action(async()=>{await Ai()}),t.action(()=>{let n=pe({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(n)}),t},ed=vn("pf");zt();process.on("SIGINT",()=>{process.exit(0)});process.on("unhandledRejection",e=>{throw(e.name==="ExitPromptError"||e.message?.includes("ERR_USE_AFTER_CLOSE")||e.message?.includes("Cancelled prompt"))&&process.exit(0),e});process.on("uncaughtException",e=>{(e.name==="ExitPromptError"||e.message?.includes("ERR_USE_AFTER_CLOSE")||e.message?.includes("Cancelled prompt"))&&process.exit(0),(e.message?.includes("Not in a workspace directory")||e.message?.includes("Could not locate workspace root"))&&(console.error(e.message),process.exit(1)),console.error(xe.default.red(`
531
- \u2716 An unexpected error occurred:`)),console.error(e),process.exit(1)});var bt=new _i.Command,Ni=Object.keys(R.bin||{}),[Hr="pf",Lr]=Ni.length>0?Ni:["pf"],{description:Ri,version:td,repository:Mi,homepage:nd}=R,ji=Ri?.split(/ —|,|\./)[0]||Ri||"Platform CLI",Li=Mi?.url?`https://${Mi.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,Fi=Li||nd,rd=Li?"GitHub":"README",od=Fi?[xe.default.bold(ji),`
541
+ `).action(async()=>{await fc()}),t.action(()=>{let r=he({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},qd=Dr("pf");Ie();yr();process.on("SIGINT",()=>{process.exit(C.CANCELLED)});process.on("unhandledRejection",e=>{throw Lt(e)&&process.exit(C.CANCELLED),e});process.on("uncaughtException",e=>{Ht(e)});var jt=new bc.Command,yc=Object.keys(_.bin||{}),[ko="pf",yo]=yc.length>0?yc:["pf"],{description:kc,version:Zd,repository:vc,homepage:Yd}=_,Cc=kc?.split(/ —|,|\./)[0]||kc||"Platform CLI",Pc=vc?.url?`https://${vc.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,xc=Pc||Yd,Xd=Pc?"GitHub":"README",Qd=xc?[st.default.bold(Cc),`
532
542
 
533
- `,xe.default.cyan("See more at: "),xe.default.bold((0,Di.default)(rd,String(Fi)))].join(""):xe.default.bold(ji),Hi=[vn(Hr),Va(),ti,Ci,Ti,sa];bt.name(Hr).description(od).version(td||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:e=>xe.default.cyan(e.name())}).addHelpText("after",gs);Lr&&Lr!==Hr&&bt.alias(Lr);Hi.forEach(e=>{bt.addCommand(e)});bt.command("__workspace-hash",{hidden:!0}).action(()=>{let e=process.cwd(),t=Math.abs(e.split("").reduce((n,r)=>(n<<5)-n+r.charCodeAt(0)|0,0));console.log(t)});fs(bt,Oi.argv,Hi);
543
+ `,st.default.cyan("See more at: "),st.default.bold((0,Sc.default)(Xd,String(xc)))].join(""):st.default.bold(Cc),Tc=[Dr(ko),Di(),Wi,ac,dc,ps];jt.name(ko).description(Qd).version(Zd||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:e=>st.default.cyan(e.name())}).addHelpText("after",ka);yo&&yo!==ko&&jt.alias(yo);Tc.forEach(e=>{jt.addCommand(e)});jt.command("__workspace-hash",{hidden:!0}).action(()=>{let e=process.cwd(),t=Math.abs(e.split("").reduce((r,n)=>(r<<5)-r+n.charCodeAt(0)|0,0));console.log(t)});va(jt,wc.argv,Tc);