@crossdelta/platform-sdk 0.18.1 → 0.18.3

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,29 +1,12 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Hi=Object.create;var Hr=Object.defineProperty;var Bi=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames;var Gi=Object.getPrototypeOf,Ui=Object.prototype.hasOwnProperty;var Ji=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Wi(t))!Ui.call(e,o)&&o!==n&&Hr(e,o,{get:()=>t[o],enumerable:!(r=Bi(t,o))||r.enumerable});return e};var u=(e,t,n)=>(n=e!=null?Hi(Gi(e)):{},Ji(t||!e||!e.__esModule?Hr(n,"default",{value:e,enumerable:!0}):n,e));var Ri=require("node:process"),Ce=u(require("chalk")),Mi=require("commander"),ji=u(require("terminal-link"));var ko=u(require("chalk")),vo=require("commander");var ue=require("node:fs"),$=require("node:path"),ge=require("fs-extra");var rd=process.env.npm_package_version||"0.0.0",Br=["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=Ki(c.barColor??t?.barColor),p=zi(c,a,o,l,s,t?.labelColor);i.push(p)}return r&&(i.push(""),i.push(r)),i.join(`
3
- `)}function Ki(e){return e?Ze.default[e]("\u2587"):"\u2587"}function zi(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 wn=u(require("chalk")),Gr=require("commander"),bn=require("listr2");var Ye=u(require("chalk")),m={logs:[],breakLine:()=>(console.log(),m),success:(e,...t)=>(console.log(Ye.default.green(`\u2714 ${e}`),...t),m),info:(e,...t)=>(console.log(Ye.default.cyan(`\u{1F6C8} ${e}`),...t),m),warn:(e,...t)=>(console.warn(Ye.default.yellow(`\u26A0\uFE0E ${e}`),...t),m),error:(e,...t)=>(console.error(Ye.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})};function ie(e){let t=new Gr.Command(e.name).description(e.description).showHelpAfterError();return e.arguments?.map(([n,r])=>t.argument(n,r)),e.options?.map(([n,r])=>t.option(n,r)),e.exampleUsage&&t.addHelpText("after",()=>`${wn.default.cyan.bold(`
4
- Example:`)}
5
- ${wn.default.bold(e.exampleUsage)}
6
- `),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??""),t.action(async(...n)=>{try{let r=n.at(-1),o=r.args,s=r.opts(),a=qi(e.arguments??[],o);if(e.shouldSkipWorkflow?.(a,s)){await e.onSkipWorkflow?.(a,s);return}let i=await e.buildContext(a,s);e.prompts?.length&&await new bn.Listr(Wr(e.prompts,i),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(i),await new bn.Listr(Wr(e.actions,i),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(i),await e.onComplete?.(i)}catch(r){let o=r;m.error(o.message)}}),t}function qi(e,t){let n={};return e.forEach(([r],o)=>{let s=r.replace(/[<>[\]]/g,"");n[s]=t[o]}),n}function Wr(e,t){return e.map(n=>typeof n=="function"?n(t):n)}function Tt(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 Ur=require("execa");function Xe(e){try{return(0,Ur.execaSync)(e,["--version"]),!0}catch{return!1}}var xe=require("node:path"),Jr=require("fs-extra"),Kr=require("package-up"),zr=require("rimraf"),g=e=>(0,xe.join)(process.cwd(),e),$t=e=>{try{return(0,Jr.readdirSync)(e).length===0}catch{return!0}};function qr(){let e=(0,Kr.packageUpSync)({cwd:(0,xe.dirname)(__filename)});if(!e)throw new Error("Could not find package.json");return(0,xe.dirname)(e)}var Vr=e=>(0,zr.rimraf)(e);var Zr=u(require("chalk"));async function S(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 Et(e,t,n){for(let r=0;r<t.length;r++){let o=t[r];e.output=Zr.default.dim(`[${r+1}/${t.length}] ${o.title}`),await o.fn(n??{},e)}}var Qe={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},Vi={docs:{base:["service.md"],frameworks:{}},serviceTypes:{hono:{commandType:"hono-micro",entryPoint:"src/index.ts",skipFiles:[]},nest:{commandType:"nest-micro",entryPoint:"src/main.ts",skipFiles:[]}}},Sn=e=>{if(!(0,ue.existsSync)(e))return null;try{return JSON.parse((0,ue.readFileSync)(e,"utf-8"))}catch{return null}},It=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,Zi=e=>e.split("/").pop()||"workspace",Yi=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},Yr=e=>e.split("."),Xi=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||(0,ue.existsSync)((0,$.join)(t,"turbo.json")))return!0;let n=Br.some(o=>(0,ue.existsSync)((0,$.join)(t,o))),r=(0,ue.existsSync)((0,$.join)(t,"infra"));return n&&r},Qi=e=>{let t=Sn((0,$.join)(e,"package.json"));return t?Xi(t,e):!1},Xr=e=>{let t=e;for(;t;){if(Qi(t))return t;t=Yi(t)}return null},Qr=()=>Xr(process.cwd())!==null,y=()=>{let e=Xr(process.cwd());if(!e)throw new Error(`
7
- \x1B[31m\u2716\x1B[0m Not in a workspace directory
8
-
9
- Current directory: ${process.cwd()}
10
-
11
- This command must be run from within a workspace created with \x1B[36mpf new workspace\x1B[0m
12
-
13
- To create a new workspace, run:
14
-
15
- \x1B[36mpf new workspace my-platform\x1B[0m
16
- `);return e},J=e=>{let t=e??y();return Sn((0,$.join)(t,"package.json"))},L=e=>{let t=J(e);if(!t?.pf?.paths)return Qe;let{paths:n}=t.pf;return{services:It(n.services,Qe.services),apps:It(n.apps,Qe.apps),packages:It(n.packages,Qe.packages),contracts:It(n.contracts,Qe.contracts)}},C=e=>{let t=e??y(),n=L(t),r=(0,$.join)(t,n.contracts);return{packagePath:r,eventsPath:(0,$.join)(r,"src","events"),indexPath:(0,$.join)(r,"src","index.ts"),relativePath:n.contracts}},we=()=>{let e=y(),t=Sn((0,$.join)(e,"package.json")),n=`@${Zi(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:n},ec=(e,t)=>{let n=Yr(t),r=e;for(let o of n){if(r===null||typeof r!="object"||!(o in r))return;r=r[o]}return r},tc=(e,t,n)=>{let r=Yr(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},eo=(e,t=process.cwd())=>{let n=(0,ge.readJsonSync)((0,$.join)(t,"package.json"));return ec(n,e)},te=(e,t,n=process.cwd())=>{let r=(0,$.join)(n,"package.json"),o=(0,ge.readJsonSync)(r);tc(o,e,t),(0,ge.writeJsonSync)(r,o,{spaces:2,EOL:`
17
- `,encoding:"utf-8"})},At=e=>{let t=qr();return(0,ge.readJSONSync)((0,$.resolve)(t,e),{encoding:"utf-8"})},N=At("package.json"),et=()=>N.generatorConfig??Vi;var lo=require("node:fs"),po=require("node:path"),En=require("node:process"),mo=require("execa");var $n=require("node:child_process"),so=require("node:path"),ao=require("execa");var to=require("node:fs"),no=require("node:path"),ro=require("dotenv"),Pn=(e,t)=>{let n=(0,no.resolve)(t,e);return(0,to.existsSync)(n)?(0,ro.config)({path:n,processEnv:{}}).parsed||{}:{}},oo=(e,t)=>{let n=Pn(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 Tn={...process.env,NODE_NO_WARNINGS:"1"},nc=(e,t,n)=>e?"pipe":t||n?["ignore","pipe","pipe"]:"inherit",rc=(e,t,n)=>e?{...Tn,...e}:t||n?{...Tn,CI:"true"}:{...Tn},oc=e=>e.includes("EEXIST")||e.includes("failed to link package");async function ce(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,ao.execa)(e,t,{cwd:n,stdio:nc(a,r,i),all:r||i?!0:void 0,shell:o??!0,env:rc(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(oc(p))return;throw new Error(sc(p))}}var sc=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function io(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?Pn(o,r):{},d=(0,so.resolve)(r,"node_modules",".bin"),k=process.env.PATH||"",A=`${d}:${k}`,Ve={...process.env,...p,PATH:A,FORCE_COLOR:"1"},O=(0,$n.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 Nt(e,t,n={}){let{cwd:r=process.cwd()}=n;(0,$n.spawn)(e,t,{cwd:r,stdio:"inherit",shell:!0}).on("exit",s=>process.exit(s||0))}async function co(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(`
18
- `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}var Rt=e=>Xe(e);function In(e=process.cwd()){let t=n=>(0,lo.existsSync)((0,po.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 In(e)??An()}function An(){return Rt("bun")?"bun":Rt("pnpm")?"pnpm":Rt("yarn")?"yarn":"npm"}function uo(){return["bun","pnpm","yarn","npm"].filter(Rt)}async function H(e,t){let n=ic(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(A=>A.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 ce(l,k,{cwd:s,task:i,quiet:c})}async function go(e){let t=["-g"],n=[...e.flags??[],...t];await H({...e,flags:n,packageManager:e.packageManager??x()})}function fo(e,t,n){let{args:r,mergedOptions:o}=yo(t??[],n),s=o.manager??x(),{command:a,args:i}=ho(s);console.log(`
19
- Running command: ${a} ${[...i,e,...r].join(" ")}
20
- `),(0,mo.execaSync)(a,[...i,e,...r],{cwd:o.cwd??(0,En.cwd)(),stdio:"inherit",preferLocal:!0})}async function ne(e,t,n){let{args:r,mergedOptions:o}=yo(t??[],n),s=o.manager??x(),{command:a,args:i}=ho(s);await ce(a,[...i,e,...r],o)}async function tt(e,t){let{script:n,mergedOptions:r}=cc(e,t),o=r.packageManager??x();await ce(o,["run",n,...r.args??[]],{cwd:r.cwd??(0,En.cwd)(),task:r.task})}function ho(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 ic(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function yo(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function cc(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var lc=e=>e==="yarn"?["npm","audit"]:["audit"],Co=new vo.Command("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{let n=y(),r=x(),o=lc(r),s=t.args||[];console.log(ko.default.dim(`Running ${r} ${[...o,...s].join(" ")}`)),Nt(r,[...o,...s],{cwd:n})});var me=require("@listr2/prompt-adapter-enquirer"),ae=u(require("chalk"));var Se=require("node:fs"),$o=require("node:os"),Eo=require("node:path");var le=require("node:crypto"),be=require("node:fs"),fe=require("node:os"),xo=require("node:path"),Nn=(0,xo.join)((0,fe.homedir)(),".platform-sdk-keys"),wo="aes-256-gcm",bo=()=>{let e=`${(0,fe.hostname)()}:${(0,fe.userInfo)().username}:${(0,fe.homedir)()}`;return(0,le.createHash)("sha256").update(e).digest()},So=()=>{if(!(0,be.existsSync)(Nn))return{};try{return JSON.parse((0,be.readFileSync)(Nn,"utf-8"))}catch{return{}}},pc=e=>{(0,be.writeFileSync)(Nn,JSON.stringify(e,null,2),{mode:384})},mc=e=>{let t=bo(),n=(0,le.randomBytes)(16),r=(0,le.createCipheriv)(wo,t,n),o=r.update(e,"utf8","hex");return o+=r.final("hex"),{iv:n.toString("hex"),tag:r.getAuthTag().toString("hex"),data:o}},dc=e=>{let t=bo(),n=Buffer.from(e.iv,"hex"),r=Buffer.from(e.tag,"hex"),o=(0,le.createDecipheriv)(wo,t,n);o.setAuthTag(r);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function Po(e,t){let n=So();n[e]=mc(t),pc(n)}async function Mt(e){let n=So()[e];if(!n)return null;try{return dc(n)}catch{return null}}var nt={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 To(){return Object.entries(nt).map(([e,t])=>({name:t.name,value:e}))}function rt(e){let t=nt[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var he=(0,Eo.join)((0,$o.homedir)(),".platform-sdk-ai.json"),uc=()=>{let e="anthropic",t=nt[e];return{provider:e,model:t.defaultModel}},Rn=uc();function ot(){return(0,Se.existsSync)(he)}function jt(){if(!ot())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=(0,Se.readFileSync)(he,"utf-8"),t=JSON.parse(e);return{...Rn,...t}}catch{throw new Error(`Failed to load AI configuration from ${he}. Please run 'pf setup --ai' again.`)}}function Io(e){let t=JSON.stringify(e,null,2);(0,Se.writeFileSync)(he,t,"utf-8")}async function Ao(e,t){await Po(e,t)}async function No(e){let t=await Mt(e.provider);if(t)return t;let n=nt[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 gc=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},fc=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 Ro(e,t,n={}){let{system:r,maxTokens:o=4096,temperature:s=.7,onToken:a}=n,i=await No(e);switch(e.provider){case"openai":return gc(t,e.model,i,{system:r,maxTokens:o,temperature:s,onToken:a});case"anthropic":return fc(t,e.model,i,{system:r,maxTokens:o,temperature:s,onToken:a});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}var re=require("node:fs"),Ne=require("node:path"),hs=require("@inquirer/prompts"),h=u(require("chalk")),ys=u(require("ora"));var Mn=require("node:fs"),Ot=require("node:path");var Pe=require("node:fs"),st=require("node:path"),Ft=u(require("chokidar"));var at=".pf-generating",hc=e=>(0,Pe.existsSync)((0,st.join)(e,at)),yc=e=>{let t=(0,st.join)(e,at);(0,Pe.existsSync)(t)&&(0,Pe.unlinkSync)(t)},kc=e=>e?Object.values(e).filter(t=>typeof t=="object"&&t!==null&&t.watch===!0&&typeof t.path=="string").map(t=>t.path):["services","apps"],Mo=(e,t)=>{yc(e);let n=J(e),r=kc(n?.pf?.paths),o=(0,st.join)(e,at),s=()=>{hc(e)||t()},a=[];a.push(Ft.default.watch(o,{ignoreInitial:!0}).on("unlink",()=>t()));for(let i of r){let c=(0,st.join)(e,i);(0,Pe.existsSync)(c)&&(a.push(Ft.default.watch(c,{ignoreInitial:!0,depth:0}).on("addDir",s).on("unlinkDir",s)),a.push(Ft.default.watch(`${c}/*/package.json`,{ignoreInitial:!0}).on("add",s).on("change",s).on("unlink",s)))}return async()=>{await Promise.all(a.map(i=>i.close()))}};var it=(e=__dirname)=>{let t=r=>(0,Mn.existsSync)((0,Ot.join)(r,"package.json")),n=(0,Ot.dirname)(e);if(t(e))return e;if(e==="/")throw new Error("Could not find package.json (package root)");return it(n)},jo=(e,t)=>{let n=e.find(Mn.existsSync);if(!n)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return n};var Ht=require("node:fs"),Uo=require("node:path"),Jo=require("ts-morph");var R=require("node:fs"),Te=require("node:path");var Oo=e=>e.replace(/\./g,"-").toLowerCase(),Fo=e=>e.split(/[-.]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),vc=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}()`,Cc=e=>!e||Object.keys(e).length===0?` id: z.string(),
21
- createdAt: z.string(),`:Object.entries(e).map(([t,n])=>` ${t}: ${vc(n)},`).join(`
22
- `),jn=e=>e.endsWith("s")?e:e.endsWith("y")?`${e.slice(0,-1)}ies`:e.endsWith("ch")||e.endsWith("sh")?`${e}es`:`${e}s`,B=e=>{let t=Oo(e),n=Fo(e),r=e.split(".")[0],o=e.split(".").slice(1).join("-"),s=jn(r).toUpperCase(),a=jn(r).toLowerCase(),i=Fo(`${jn(r)}.${o}`);return{eventName:t,contractName:`${i}Contract`,schemaName:`${n}Schema`,typeName:`${n}Data`,streamName:s,domain:a,event:o}},Fn=e=>{let t=ct(e);if((0,R.existsSync)(t))return!0;let{eventsPath:n}=C(),r=Oo(e),o=(0,Te.join)(n,`${r}.ts`);return(0,R.existsSync)(o)},On=(e,t)=>{let{eventsPath:n}=C(),{contractName:r,schemaName:o,typeName:s,streamName:a,domain:i,event:c}=B(e),l=`import { createContract } from '@crossdelta/cloudevents'
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'
23
6
  import { z } from 'zod'
24
7
 
25
8
  export const ${o} = z.object({
26
- ${Cc(t)}
9
+ ${ic(t)}
27
10
  })
28
11
 
29
12
  export const ${r} = createContract({
@@ -33,24 +16,24 @@ export const ${r} = createContract({
33
16
  })
34
17
 
35
18
  export type ${s} = z.infer<typeof ${r}.schema>
36
- `,p=(0,Te.join)(n,i),d=(0,Te.join)(p,`${c}.ts`);return(0,R.existsSync)(p)||(0,R.mkdirSync)(p,{recursive:!0}),(0,R.writeFileSync)(d,l,"utf-8"),d},ct=e=>{let{eventsPath:t}=C(),{domain:n,event:r}=B(e);return(0,Te.join)(t,n,`${r}.ts`)},_n=e=>{let t=ct(e);if(!(0,R.existsSync)(t))return null;let n=(0,R.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},Dn=()=>{let{packagePath:e}=C(),t=(0,Te.join)(e,"package.json");if(!(0,R.existsSync)(t))return"@my-platform";try{return JSON.parse((0,R.readFileSync)(t,"utf-8")).name?.split("/")[0]??"@my-platform"}catch{return"@my-platform"}};var Dt=require("node:fs"),Bn=require("node:path");var T=require("node:fs"),$e=require("node:path");var _t=e=>{let{streamName:t}=B(e);return t},_o=(e,t)=>{let n=(0,$e.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)},xc=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
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'
37
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)}
38
- ${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},wc=(e,t,n)=>`
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)=>`
39
22
 
40
23
  // Consume from ${e} stream
41
24
  consumeJetStreams({
42
25
  streams: ['${e}'],
43
26
  consumer: '${n}-service',
44
27
  discover: './src/events/**/*.handler.ts',
45
- })`,Ln=(e,t)=>{let n=_t(t),r=t.split(".")[0],o=(0,$e.join)(e,"src","index.ts"),s=(0,$e.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(_o(e,n))return{added:!1,streamName:n};let a=(0,T.readFileSync)(o,"utf-8"),i=e.split("/").pop()||"unknown";a.includes("consumeJetStreams")||(a=xc(a));let c=wc(n,r,i),l=`${a.trimEnd()+c}
46
- `;return(0,T.writeFileSync)(o,l,"utf-8"),{added:!0,streamName:n}},Hn=(e,t)=>{let{eventName:n,contractName:r,typeName:o}=B(e),s=Dn(),a=(0,$e.join)(t,"src","events"),i=(0,$e.join)(a,`${n}.handler.ts`);if((0,T.existsSync)(i))return null;let c=`import { handleEvent } from '@crossdelta/cloudevents'
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'
47
30
  import { ${r}, type ${o} } from '${s}/contracts'
48
31
 
49
32
  export default handleEvent(${r}, async (data: ${o}) => {
50
33
  // TODO: Implement event handling logic
51
34
  console.log('Received ${e}:', data)
52
35
  })
53
- `;return(0,T.existsSync)(a)||(0,T.mkdirSync)(a,{recursive:!0}),(0,T.writeFileSync)(i,c,"utf-8"),i};var Do=e=>{try{return(0,Dt.readdirSync)(e,{withFileTypes:!0}).flatMap(n=>{let r=(0,Bn.join)(e,n.name);return n.isDirectory()?Do(r):n.name.endsWith(".handler.ts")?[r]:[]})}catch{return[]}},Wn=e=>{let t=(0,Bn.join)(e,"src","events");return Do(t).flatMap(r=>{let o=(0,Dt.readFileSync)(r,"utf-8");return bc(r,o)})},bc=(e,t)=>{let n=Sc(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}]},Sc=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},Gn=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])=>Pc(n,r)).sort((n,r)=>n.stream.localeCompare(r.stream))},Pc=(e,t)=>{let n=_t(t[0]?.eventType??`${e}.event`),r=`${e}.>`;return{stream:n,subjects:[r],handlers:t}},Un=(e,t)=>e.length===0?"":` // Services NEVER create streams!
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!
54
37
  // - Development: pf dev auto-creates ephemeral streams from contracts
55
38
  // - Production: Pulumi materializes persistent streams
56
39
 
@@ -58,14 +41,14 @@ export default handleEvent(${r}, async (data: ${o}) => {
58
41
  streams: [${e.map(n=>`'${n.stream}'`).join(", ")}],
59
42
  consumer: '${t}',
60
43
  discover: './src/events/**/*.handler.ts',
61
- })`;var v=require("node:fs"),K=require("node:path");var Tc=(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=`/**
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=`/**
62
45
  * ${(0,K.dirname)(e).split("/").pop()} Domain Events
63
46
  */
64
47
 
65
48
  `;return(0,v.writeFileSync)(e,a+n+`
66
49
  `,"utf-8"),!0}let r=(0,v.readFileSync)(e,"utf-8");if(r.includes(`'./${t}'`))return!1;let o=r.trimEnd()+`
67
50
  `+n+`
68
- `;return(0,v.writeFileSync)(e,o,"utf-8"),!0},$c=(e,t)=>{let n=`export * from './${t}'`;if(!(0,v.existsSync)(e))return(0,v.writeFileSync)(e,`/**
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,`/**
69
52
  * Event Contracts Index
70
53
  *
71
54
  * Re-exports all event contracts for convenient importing.
@@ -74,14 +57,17 @@ export default handleEvent(${r}, async (data: ${o}) => {
74
57
  `+n+`
75
58
  `,"utf-8"),!0;let o=(0,v.readFileSync)(e,"utf-8").split(`
76
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(`
77
- `),"utf-8"),!0},Ec=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},Jn=e=>{let{packagePath:t}=C(),{domain:n,event:r}=B(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 Tc(a,r)&&(d=!0),$c(i,n)&&(d=!0),Ec(c)&&(d=!0),d},Kn=(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(`
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(`
78
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(`
79
- `),"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"}],Ho=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(),Bo=e=>{let t=e.toLowerCase(),n=Lo.find(r=>t.includes(r.pattern));return n?{value:n.generate(),hint:n.hint}:null},Ic=(e,t)=>{if(e.format)return Ho(e.format);let n=Bo(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?[zn(e.element)]:[];case"object":return zn(e);default:return null}},zn=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]=Ic(o,r);return t},Ac=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=zn(s);if(a&&typeof a=="object"&&Object.keys(a).length>0){let i={};return qn(a,i,""),{data:a,faker:i}}}}catch{}return null},qn=(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)?qn(o,t,s):Array.isArray(o)&&o.length>0&&typeof o[0]=="object"&&qn(o[0],t,`${s}[0]`)}},Nc=e=>({string:()=>f.faker.lorem.word(),number:()=>f.faker.number.int({min:1,max:100}),boolean:()=>f.faker.datatype.boolean()})[e]?.(),Rc=(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=Bo(s);if(i)t[s]=i.value,i.hint&&(n[s]=i.hint);else{let c=Nc(a);c!==void 0&&(t[s]=c)}}},Mc=(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]=Ho(a),n[s]=a==="datetime"?"date":a},Wo=e=>{let t={},n={};return Rc(e,t,n),Mc(e,t,n),{data:t,faker:n}},Lt=async e=>{let{eventsPath:t}=C(),n=ct(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 Ac(n);if(!a){let k=_n(e);k&&(a=Wo(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}=B(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},jc=(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=Wo(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},Vn=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}=B(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 A=(0,z.join)(t.outputDir,`${l}.ts`);jc(A,d,c)&&o.push(d);continue}let k=await Lt(c);k&&o.push(k)}return{mockPaths:o,skippedHandlers:s}};var Ko=e=>{let t=e.split("/").pop()||"service",n=(0,Uo.join)(e,"src","events","events.service.ts");if(!(0,Ht.existsSync)(n))return!1;let r=Wn(e);if(r.length===0||(0,Ht.readFileSync)(n,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let i=Gn(r),c=Un(i,t);if(!c)return!1;let l=new Jo.Project({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(n),d=!1;for(let k of p.getClasses()){let A=k.getMethod("startConsumers");if(!A)continue;let O=[...c.split(`
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(`
80
63
  `),""," this.logger.log('Event consumers started successfully')"].join(`
81
- `);A.setBodyText(O),d=!0;break}return d&&l.saveSync(),d};var Fc=e=>{let t=e.split(/\s+/),n=t[0],r=t.slice(1);return n==="pf"&&(n=process.argv[1]),{executable:n,args:r}},Oc=async(e,t)=>{try{let{executable:n,args:r}=Fc(e.command);return await ce(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)}}},Zn=async(e,t)=>{let n=[];for(let r of e){let o=await Oc(r,t);if(n.push(o),!o.success)break}return n},Yn=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)))},zo=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 lt=require("node:fs"),Wt=require("node:path"),q=u(require("chalk"));var ye=require("node:fs"),Bt=require("node:path"),_c=(e,t)=>{let r=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o=(0,Bt.join)(r,e.path);try{if((0,ye.existsSync)(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=(0,Bt.dirname)(o);return(0,ye.existsSync)(s)||(0,ye.mkdirSync)(s,{recursive:!0}),(0,ye.writeFileSync)(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},qo=(e,t)=>{let n=e.map(r=>_c(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 Dc=(e,t)=>{let n=L(t.workspaceRoot),r=(0,Wt.join)(t.workspaceRoot,n.contracts);if(!(0,lt.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()},Lc=e=>{let t=(0,Wt.join)(e,"packages/contracts/src/index.ts");if(!(0,lt.existsSync)(t))return new Set;try{let n=(0,lt.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}},Hc=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}`},Bc=(e,t,n)=>{let r=Lc(t),o=[],s=[],a=[];for(let i of e)if(r.has(i))o.push(i);else{s.push(i);let c=Hc(i),l=n.replace(`${t}/`,"");a.push(`pf event add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:a}},Wc=(e,t)=>{if(e.length!==0){console.log(q.default.cyan(`\u{1F4E6} Using existing contracts:
82
- `));for(let n of e)console.log(q.default.dim(` ${t}/contracts \u2192 ${n}`));console.log()}},Gc=(e,t)=>{let n=/^packages\/contracts\/src\/events\/([^/]+)\.ts$/,r=(0,Wt.join)(t,"packages/contracts/src/index.ts");for(let o of e){let s=o.match(n);s&&s[1]!=="index"&&Kn(r,s[1])}},Vo=async(e,t)=>{t.start("Applying code formatting...");try{await ne("biome",["check","--fix","--unsafe","."],{cwd:e,quiet:!0}),t.succeed("Code formatted!")}catch{t.warn("Code formatting completed with warnings")}},Uc=async(e,t)=>{t.start("Scanning for event handlers...");let{mockPaths:n,skippedHandlers:r}=await Vn(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()}},Zo=async(e,t,n,r)=>{r.start("Writing generated files...");let o=qo(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=Dc(e,n),{existing:a,missing:i,suggestedCommands:c}=Bc(s,n.workspaceRoot,t);if(a.length>0&&Wc(a,n.scope),i.length>0){console.log(q.default.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${n.scope}/contracts):
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):
83
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:
84
- `));for(let l of c)console.log(q.default.dim(` ${l}`));console.log()}return Gc(o.written,n.workspaceRoot),o.written.length>0&&await Uc(t,r),{missingContractCommands:c}};var Gt=require("node:fs"),Ie=require("node:path");var Ee=require("node:fs"),Yo=require("node:path");var Xo=e=>{let{eventsPath:t}=C(e);if(!(0,Ee.existsSync)(t))return[];let n=[];try{let r=(0,Ee.readdirSync)(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of r){let s=(0,Yo.join)(t,o),a=(0,Ee.readFileSync)(s,"utf-8"),i=Jc(a,s);i&&n.push(i)}}catch(r){return console.warn("Warning: Could not scan contracts package:",r),[]}return n},Jc=(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=zc(e);return{name:r,typeName:s,eventType:i,fields:c,filePath:t}}catch{return null}},Kc={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},zc=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=Kc[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]},Qo=(e,t)=>{if(e.length===0)return`
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
71
  **Available Contracts:**
86
72
 
87
73
  No contracts are currently defined. Use Basic Mode with inline schemas for all events.
@@ -102,15 +88,15 @@ The following event contracts are available in \`${t}/contracts\`:
102
88
  ${n}
103
89
 
104
90
  If the event type your service consumes matches one of these, **you MUST use Advanced Mode**.
105
- `.trim()};var qc=(e,t)=>{let n=(0,Ie.join)(__dirname,"docs","generators"),r=et(),o=[];for(let s of r.docs.base)o.push((0,Ie.join)(n,s));if(e&&r.docs.frameworks[e]){let s=r.docs.frameworks[e];if(typeof s=="string")o.push((0,Ie.join)(n,s));else{let a=t==="bun"?"bun":"node";s[a]&&o.push((0,Ie.join)(n,s[a]))}}return o},es={copilot:".github/copilot-instructions.md",projectGuidelines:"docs/ai-guidelines.md"},Vc=1500,ts=e=>{try{return(0,Gt.existsSync)(e)?(0,Gt.readFileSync)(e,"utf-8"):null}catch{return null}},Zc=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
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,`
106
92
 
107
- `).replace(/[ \t]+$/gm,"").trim(),Yc=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/```[\s\S]*?```/g,"").replace(/`[^`]{50,}`/g,"`...`").replace(/\n{3,}/g,`
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,`
108
94
 
109
- `).replace(/[ \t]+$/gm,"").trim(),Xc=e=>Math.ceil(e.length/4),Qc=(e,t)=>{let n=e.split(/(?=^## )/m),r="",o=0;for(let s of n){let a=Xc(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()},el=(e,t)=>{let{workspaceRoot:n,scope:r}=t,o=Xo(n),s=Qo(o,r);return e.replace(/\{\{scope\}\}/g,r).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},ns=e=>{let{workspaceRoot:t,scope:n}=e,r=[],o=qc(e.serviceType,e.packageManager);for(let i of o){let c=ts(i);if(c){let l=el(c,e),p=Zc(l);r.push(p)}}let s=[es.copilot,es.projectGuidelines],a=Math.floor(Vc/s.length);for(let i of s){let c=ts((0,Ie.join)(t,i));if(c){let l=Yc(c),p=Qc(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(`
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(`
110
96
 
111
97
  ---
112
98
 
113
- `)};var tl=`You are an expert code generator. Generate clean, production-ready code.
99
+ `)};var Vc=`You are an expert code generator. Generate clean, production-ready code.
114
100
 
115
101
  ## Output Format
116
102
 
@@ -124,13 +110,13 @@ Format your code blocks with the file path on the line before the code block:
124
110
  **IMPORTANT:** Always generate:
125
111
  - Source code files (src/**)
126
112
  - Test files (src/**/*.test.ts) for all business logic
127
- - README.md with service documentation`,nl=e=>e.replace(/-/g,"_").toUpperCase(),rl=e=>e.split("/").pop()||"my-service",rs=(e,t,n)=>{let r=ns({...e,serviceType:t,packageManager:n});return`${tl}
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}
128
114
 
129
115
  ## Project Guidelines & Patterns
130
116
 
131
117
  Follow these project-specific conventions and patterns when generating code:
132
118
 
133
- ${r}`},os=(e,t,n,r)=>{let o=rl(e),s=`${nl(o)}_PORT`,a=we();return`Generate source code for a microservice at path "${e}".
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}".
134
120
 
135
121
  Use the patterns and conventions from the Project Guidelines above.
136
122
 
@@ -145,60 +131,60 @@ Service purpose: ${t}
145
131
  - BUT you MUST keep the existing port configuration line unchanged!
146
132
 
147
133
  Do NOT include the service path in file headers (use \`src/...\`, NOT \`${e}/src/...\`).
148
- `};var ol=()=>!1,ss=(e,t)=>{ol()&&console.log(`[AI Parser] ${e}`,t??"")},Ut={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},Qn=(e,t)=>[...e.matchAll(t)].flatMap(r=>r[1].split(`
149
- `).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),as=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),sl=e=>Qn(e,Ut.commandsBlock).map(as),al=e=>Qn(e,Ut.postCommandsBlock).map(as),il=e=>Qn(e,Ut.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),cl=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},n=(e||"typescript").toLowerCase();return t[n]||n},ll=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"},pl=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),ml=e=>{let t=e.split(`
150
- `),n=[],r=0;for(let o of t){let s=Ut.fileHeader.exec(o);s&&n.push({path:s[1],index:r}),r+=o.length+1}return n},dl=(e,t)=>{let r=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return r?{language:r[1]?cl(r[1]):void 0,content:pl(r[2])}:null},ul=e=>ml(e).map(n=>{let r=dl(e,n.index);return!r||r.content.length===0?null:{path:n.path,language:r.language||ll(n.path),content:r.content,startIndex:n.index}}).filter(n=>n!==null),Xn=e=>e.includes("packages/contracts")||e.includes("contracts/src"),gl=e=>{let t=e.filter(r=>Xn(r.path)),n=e.filter(r=>!Xn(r.path));return[...t,...n]},fl=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(Xn(t))return t;let n=t.match(/^services\/[^/]+\/(.+)$/);return n?n[1]:t},is=(e,t)=>{ss("Parsing AI response",{length:e.length});let n=sl(e),r=al(e),o=il(e),s=ul(e),a=gl(s.map(i=>({path:fl(i.path),content:i.content,language:i.language})));return ss("Parsed response",{commands:n.length,postCommands:r.length,dependencies:o.length,files:a.length}),{commands:n,files:a,dependencies:o,postCommands:r}},cs=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 ls=require("node:fs"),W=u(require("chalk"));var ps=async(e,t,n)=>{if(e.length===0){(0,ls.mkdirSync)(t,{recursive:!0}),console.log(W.default.yellow(`\u26A0 No scaffolding command found - creating empty directory
151
- `));return}let o=(await Zn(e,n)).find(s=>!s.success);if(o)throw console.log(W.default.red(`
152
- \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}`:""}`)},ms=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)`)}},ds=async(e,t,n)=>{if(e.length===0)return;n.stop();let r=e.length===1?"package":"packages";console.log(W.default.cyan(`
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(`
153
139
  \u25B6 Installing ${e.length} additional ${r}...
154
140
  `));try{await H({packages:e,cwd:t,flags:["--silent"]}),console.log(W.default.green(`\u2713 Installed ${e.length} ${r}
155
141
  `))}catch(o){throw console.log(W.default.red(`\u2717 Package installation failed
156
- `)),o}},er=async(e,t)=>{if(e.length===0)return;console.log(W.default.cyan(`
142
+ `)),o}},Qn=async(e,t)=>{if(e.length===0)return;console.log(W.default.cyan(`
157
143
  \u25B6 Running post-generation commands...
158
- `));let r=(await Zn(e,t)).find(o=>!o.success);if(r){console.log(W.default.yellow(`
144
+ `));let r=(await Kn(e,t)).find(o=>!o.success);if(r){console.log(W.default.yellow(`
159
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
160
- `))};var pt=u(require("chalk")),hl=e=>`${pt.default.dim(" \u2022 ")+pt.default.cyan(e)}
161
- `,us=e=>pt.default.dim(` \u2728 Generated ${pt.default.white.bold(e)} tokens
162
- `),gs=()=>{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(hl(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 yl=()=>{let e=y(),t=(0,Ne.join)(e,"package.json"),n=(()=>{if(!(0,re.existsSync)(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse((0,re.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()}},kl=async(e,t,n,r,o,s)=>{let a=os(n,r,o,t.workspaceRoot),i=rs(t,o,s),c=gs(),l=await Ro(e,a,{system:i,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(us(p.tokenCount)),console.log(),l},vl=(e,t)=>{let{serviceTypes:n}=et(),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})},Cl=e=>e.length===0?"":`${[h.default.cyan(`
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(`
163
149
  \u{1F4C1} Files to create:`),...e.map(t=>` ${h.default.green("\u2022")} ${h.default.white(t.path)} ${h.default.dim(`(${t.language})`)}`)].join(`
164
150
  `)}
165
- `,fs=(e,t,n)=>e.length===0?"":`${[h.default.cyan(`
151
+ `,ns=(e,t,n)=>e.length===0?"":`${[h.default.cyan(`
166
152
  ${n} ${t}:`),...e.map(r=>` ${h.default.yellow("$")} ${h.default.white(r.command)}`)].join(`
167
153
  `)}
168
- `,xl=e=>e.length===0?"":`${[h.default.cyan(`
154
+ `,fl=e=>e.length===0?"":`${[h.default.cyan(`
169
155
  \u{1F4E6} Dependencies to install:`),...e.map(t=>` ${h.default.magenta("+")} ${h.default.white(t)}`)].join(`
170
156
  `)}
171
- `,wl=(e,t)=>`${[h.default.yellow(`
157
+ `,hl=(e,t)=>`${[h.default.yellow(`
172
158
  Validation errors:`),...e.map(n=>h.default.yellow(` \u26A0 ${n}`)),h.default.dim(`
173
159
  Response preview:`),h.default.dim(t)].join(`
174
160
  `)}
175
- `,Ae=e=>{e&&process.stdout.write(e)},bl=(e,t)=>{let n=is(e,t),r=Yn(n.commands),o=Yn(n.postCommands),s=cs(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(wl(s.errors,e.slice(0,500))),null)},Sl=e=>{console.log(`${h.default.green("\u2714")} Extracted ${e.files.length} files`),Ae(Cl(e.files)),Ae(fs(e.commands,"Commands to run","\u{1F527}")),Ae(fs(e.postCommands,"Post-generation commands","\u{1F4DD}")),Ae(xl(e.dependencies)),Ae(`
176
- `)},Pl=(e,t,n)=>{let r=zo(e);return r&&!r.includes("/")&&!r.startsWith(".")&&(r=`${L().services}/${r}`),r?(0,Ne.resolve)(n,r):(0,Ne.resolve)(n,t)},Tl=(e,t)=>{let{serviceTypes:n}=et(),r=n[t]?.skipFiles||["package.json","tsconfig.json","Dockerfile"];return e.filter(o=>!r.includes(o.path))},Re=()=>{if(!ot())return{valid:!1,error:h.default.red.bold(`\u274C AI configuration not found.
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.
177
163
  `)+h.default.yellow("Please run ")+h.default.cyan.bold("pf setup --ai")+h.default.yellow(` first to configure your AI provider.
178
- `)};try{return{valid:!0,config:jt()}}catch(e){return{valid:!1,error:h.default.red.bold(`\u274C ${e.message}
179
- `)}}},Jt=async e=>e||(0,hs.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"}),Kt=(e,t,n)=>{console.log(h.default.cyan.bold(`
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(`
180
166
  \u{1F916} AI-Powered Generation
181
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}
182
- `))},zt=async(e,t)=>{let{servicePath:n,description:r="",serviceType:o,packageManager:s}=e,a=n.split("/").pop()||n,i=yl(),c=(0,Ne.join)(i.workspaceRoot,at);(0,re.writeFileSync)(c,`generating:${n}`);let l=()=>{(0,re.existsSync)(c)&&(0,re.unlinkSync)(c)},p=()=>{l(),process.exit(130)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(h.default.cyan.bold(`
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(`
183
169
  \u{1F916} AI Generation
184
- `));let d=await kl(t,i,n,r,o,s),k=bl(d,a);if(!k)return!1;Sl(k);let A=(0,ys.default)({text:"Processing files...",color:"cyan"}).start(),Ve=vl(k.commands,o),O=Pl(Ve,n,i.cwd),_i=Tl(k.files,o);await ps(Ve,O,i.workspaceRoot);let{missingContractCommands:Lr}=await Zo(_i,O,i,A);if(k.postCommands.length>0)await er(k.postCommands,i.workspaceRoot);else if(Lr.length>0){console.log(h.default.cyan(`\u{1F527} Auto-creating missing contracts...
185
- `));let Di=Lr.map(Li=>({command:Li,isPfCommand:!0}));await er(Di,i.workspaceRoot)}return Ko(O),await ds(k.dependencies,O,A),await ms(i.workspaceRoot,A),await Vo(O,A),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};var vs=require("node:fs"),mt=require("ts-morph"),ks=new mt.Project({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),tr=e=>{if(!(0,vs.existsSync)(e))return null;let t=ks.getSourceFile(e);return t||ks.addSourceFileAtPath(e)},nr=e=>{e.saveSync()},rr=(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})},$l=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()===mt.SyntaxKind.ObjectLiteralExpression)return o}return null},or=(e,t)=>{let n=$l(e);if(!n)return!1;let r=n.getProperty("imports");if(r){let o=r.getFirstChildByKind(mt.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 qt=require("node:fs"),dt=u(require("node:path")),sr=u(require("chalk"));var Cs=async e=>{await ce("bash",["-c",`
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",`
186
172
  curl -fsSL https://bun.sh/install | bash && if [ -f "$HOME/.bun/bin/bun" ]; then export PATH="$HOME/.bun/bin:$PATH"; fi
187
- `],{task:e,shell:!0}),await El()},ar=()=>Xe("bun"),xs=()=>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"}),ws=()=>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:sr.default.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),El=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=[dt.default.join(t,".zshrc"),dt.default.join(t,".bashrc"),dt.default.join(t,".bash_profile")];for(let r of n)try{if(await qt.promises.stat(r).then(()=>!0).catch(()=>!1)){(await qt.promises.readFile(r,"utf8")).includes(e)||(await qt.promises.appendFile(r,`
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,`
188
174
  # Added by platform installer
189
175
  ${e}
190
- `),m.log(`Added Bun path to ${dt.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(sr.default.cyan(e))};var M=require("node:fs"),Me=require("node:path");var ut=require("node:fs"),Vt=require("node:path"),Il=e=>e.isDirectory()&&e.name!=="node_modules",Al=(e,t)=>{let n=t.replace(".ts",""),r=(0,Vt.join)(e,`${n}.mock.json`);return(0,ut.existsSync)(r)},Nl=(e,t)=>t.endsWith(".ts")&&t!=="index.ts"&&Al(e,t),Rl=(e,t)=>{let n=t.replace(".ts","");return`${e.replace(/s$/,"")}.${n}`},Ml=e=>(0,ut.readdirSync)(e,{withFileTypes:!0}).filter(Il).flatMap(r=>{let o=(0,Vt.join)(e,r.name);return(0,ut.readdirSync)(o).filter(a=>Nl(o,a)).map(a=>Rl(r.name,a))}),ir=()=>{try{let e=(0,Vt.join)(process.cwd(),"packages","contracts","src","events");return Ml(e).sort()}catch{return[]}},bs=()=>ir();var Ss=require("node:fs"),Ps=require("node:path"),gt=u(require("chalk"));var Zt=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` ${Zt.default.cyan(o.name)}${s}${o.description}`}),r=e.footer||'Run "<command> --help" for more information';return[Zt.default.cyan.bold(`
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(`
191
177
  ${e.title}
192
178
  `),`Available commands:
193
- `,...n,"",Zt.default.dim(`${r}
179
+ `,...n,"",Jt.default.dim(`${r}
194
180
  `)].join(`
195
- `)};var jl=(e,t)=>t.some(n=>n.name()===e),Fl=(e,t)=>t.pf?.commands?.[e]??null,Ol=(e,t)=>!!t.scripts?.[e],_l=(e,t)=>t.cwd?(0,Ps.join)(e,t.cwd):e,Dl=(e,t)=>t.command||e,Ll=(e,t,n,r)=>{let o=_l(r,n),s=Dl(e,n);if(n.cwd&&!(0,Ss.existsSync)(o))return console.error(gt.default.red(`
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(`
196
182
  \u2716 Directory not found: ${o}
197
- `)),!0;let a=n.cwd?gt.default.dim(` in ${n.cwd}/`):"";return console.log(gt.default.dim(`Running ${s}${a}`)),Nt(s,t,{cwd:o}),!0},Hl=(e,t,n)=>(console.log(gt.default.dim(`Running workspace script: ${e}`)),tt(e,{args:t,cwd:n}),!0);async function Bl(e,t,n){if(jl(e,n))return!1;let r;try{r=y()}catch{return!1}let o=J(r);if(!o)return!1;let s=Fl(e,o);return s?Ll(e,t,s,r):Ol(e,o)?Hl(e,t,r):!1}function Ts(){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 cr(){let{configured:e,scripts:t}=Ts();return[...e,...t]}function $s(){let{configured:e,scripts:t}=Ts(),n=[...e,...t];if(n.length===0)return"";let o=J()?.pf?.commands||{},s=n.map(a=>({name:a,description:o[a]?.description||Yt[a]||""}));return pe({title:"Workspace Commands",commands:s,footer:""})}function Es(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=cr();for(let i of a)console.log(i);return}Bl(o,s,n).then(a=>{a||e.parse(t)})}else e.parse(t)}var Is={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"},Yt={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"},As=(e,t)=>t?`${e}:${t}`:e,Wl=()=>Object.entries(Is).map(([e,t])=>As(e,t)),Gl=()=>{try{let e=cr(),n=J()?.pf?.commands||{},r=Object.keys(Is);return e.filter(o=>!r.includes(o)).map(o=>{let s=n[o]?.description||Yt[o]||"";return As(o,s)})}catch{return[]}},Ul=()=>{try{return bs()}catch{return[]}},lr=()=>({commands:[...Wl(),...Gl()],events:Ul()});var ft="node_modules/.cache/pf",ht="completion-cache";var Jl=e=>{let t=N.version||"0.0.0",n=e.commands.join("|"),r=e.events.join("|");return`${t} ${n} ${r}`},Kl=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("|"):[]}},zl=e=>{let t=(0,Me.join)(e,ft);return(0,Me.join)(t,ht)},ql=(e,t=!1)=>{if(t)return!0;let n=zl(e);if(!(0,M.existsSync)(n))return!0;let r=(0,M.readFileSync)(n,"utf-8").trim(),o=Kl(r),s=N.version||"0.0.0";if(o.version!==s)return!0;let a=(0,Me.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 Vl=(e,t)=>{let n=(0,Me.join)(e,ft),r=(0,Me.join)(n,ht);(0,M.existsSync)(n)||(0,M.mkdirSync)(n,{recursive:!0});let o=Jl(t);(0,M.writeFileSync)(r,o,"utf-8")},Xt=(e={})=>{let t;try{t=y()}catch{return!1}if(!t)return!1;if(!ql(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let n=lr();return Vl(t,n),e.verbose&&console.log(`[completion] Cache regenerated: ${n.commands.length} commands, ${n.events.length} events`),!0},ke=(e={})=>{Xt({...e,force:!0})};var V=require("node:fs"),pr=require("node:os"),Qt=require("node:path"),ve=u(require("chalk"));var Ns=`${ft}/${ht}`,Rs=e=>`# ${e} completion (workspace-local cache)
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)
198
184
  # Generated: ${new Date().toISOString()}
199
185
 
200
186
  # Cache file path (relative to workspace root)
201
- _${e}_cache_path="${Ns}"
187
+ _${e}_cache_path="${ks}"
202
188
 
203
189
  # Find workspace root (walk up to find monorepo package.json)
204
190
  _${e}_find_workspace() {
@@ -319,11 +305,11 @@ _${e}_completions() {
319
305
  esac
320
306
  }
321
307
 
322
- compdef _${e}_completions ${e}`,Ms=e=>`# ${e} completion (workspace-local cache)
308
+ compdef _${e}_completions ${e}`,Cs=e=>`# ${e} completion (workspace-local cache)
323
309
  # Generated: ${new Date().toISOString()}
324
310
 
325
311
  # Cache file path (relative to workspace root)
326
- _${e}_cache_path="${Ns}"
312
+ _${e}_cache_path="${ks}"
327
313
 
328
314
  # Find workspace root
329
315
  _${e}_find_workspace() {
@@ -411,11 +397,11 @@ _${e}_completions() {
411
397
  return 0
412
398
  }
413
399
 
414
- complete -F _${e}_completions ${e}`;var Zl=(e,t)=>(0,Qt.join)((0,pr.homedir)(),`.${t}-completion.${e}`),Fs=e=>{let t=(0,pr.homedir)();return e==="zsh"?(0,Qt.join)(t,".zshrc"):(0,Qt.join)(t,".bashrc")},Yl=e=>`[[ -f "${e}" ]] && source "${e}"`,Xl=(e,t)=>(0,V.existsSync)(e)?(0,V.readFileSync)(e,"utf-8").includes(t):!1,Ql=(e,t)=>{let n=(0,V.existsSync)(e)?(0,V.readFileSync)(e,"utf-8"):"",r=n.endsWith(`
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(`
415
401
  `)?`${n}${t}
416
402
  `:`${n}
417
403
  ${t}
418
- `;(0,V.writeFileSync)(e,r,"utf-8")},ep=(e,t)=>{let n=Zl(e,t),r=e==="zsh"?Rs(t):Ms(t);return(0,V.writeFileSync)(n,r,"utf-8"),n},js=(e,t,n)=>{let r=ep(e,t),o=Fs(e),s=Yl(r);return Xl(o,s)?(n&&console.log(ve.default.dim(`[${e}] Already configured in ${o}`)),!1):(Ql(o,s),n&&console.log(ve.default.green(`[${e}] Added source line to ${o}`)),!0)},tp=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",mr=(e,t=!1)=>{let n=tp();t&&console.log(ve.default.cyan(`Installing ${n} completion...`)),js(n,e,t);let r=n==="zsh"?"bash":"zsh",o=Fs(r);(0,V.existsSync)(o)&&js(r,e,t),t&&(console.log(ve.default.green("\u2713 Shell completion installed")),console.log(ve.default.dim(` Run: ${ve.default.cyan("exec $SHELL")} to reload`)))};var E=u(require("chalk")),Os=require("execa"),_s=require("jiti");var dr=async e=>{let{stdout:t}=await(0,Os.execa)("sh",["-c",e]);return t.trim()},np="pf-local-nats",rp="2.10-alpine",op=4222,sp=8222,ap=e=>({clientPort:e.clientPort??op,monitoringPort:e.monitoringPort??sp,containerName:e.containerName??np,version:e.version??rp}),ip=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"],cp=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),lp=async()=>{try{return await dr("docker info"),!0}catch{return!1}},pp=async e=>{try{return(await dr(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var mp=async e=>{let t=ip(e);try{return await dr(`docker ${t.join(" ")}`),{success:!0,value:cp(e)}}catch{return{success:!1}}},dp=e=>{console.log(E.default.green("\u2713 NATS started")),console.log(E.default.dim(` Client: ${e.clientUrl}`)),console.log(E.default.dim(` Monitoring: ${e.monitoringUrl}`)),console.log(E.default.dim(" Streams: ephemeral, auto-created by services")),console.log("")},Ds=async(e={})=>{let t=ap(e);if(!await lp())return console.log(E.default.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await pp(t.containerName))return console.log(E.default.dim("\u2713 NATS already running")),!0;console.log(E.default.cyan("\u{1F680} Starting development infrastructure...")),console.log(E.default.dim(" NATS with JetStream (ephemeral)"));let n=await mp(t);return n.success?(dp(n.value),!0):(console.error(E.default.red("\u2717 Failed to start NATS")),!1)},up=e=>e.map(t=>({stream:t,subjects:[`${t.toLowerCase()}.*`],config:{storage:"memory",retention:"limits",maxAge:36e5}})),gp=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))),Ls=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:n}=C(e),o=await(0,_s.createJiti)(e).import(n,{default:!0}),s=gp(o);if(s.length===0){console.log(E.default.dim(" No streams found in contracts"));return}let a=up(s);await t({streams:a}),console.log(E.default.dim(` Created ${s.length} ephemeral stream(s): ${s.join(", ")}`))}catch(t){console.log(E.default.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log(E.default.dim(" Stream auto-creation will happen on first publish"))}};function Hs(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
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'
419
405
  import { ports } from '@crossdelta/infrastructure'
420
406
 
421
407
  /**
@@ -436,7 +422,7 @@ const config: K8sServiceConfig = {
436
422
  }
437
423
 
438
424
  export default config
439
- `}function Bs(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
425
+ `}function Es(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
440
426
  import { ports } from '@crossdelta/infrastructure'
441
427
 
442
428
  /**
@@ -457,77 +443,91 @@ const config: K8sServiceConfig = {
457
443
  }
458
444
 
459
445
  export default config
460
- `}var Z=u(require("chalk")),Us=u(require("terminal-link"));var en="integrations-run";var P=require("zod"),fp=P.z.object({name:P.z.string(),description:P.z.string(),link:P.z.string().url().optional(),install:P.z.union([P.z.string(),P.z.array(P.z.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:P.z.array(P.z.string()).optional(),run:P.z.array(P.z.string()).optional(),initial:P.z.boolean().optional(),interactive:P.z.boolean().optional()}),Ws=P.z.array(fp);var Gs=e=>{try{return Ws.parse(e)}catch(t){throw new Error(t.issues.map(n=>` - Path ${n.path.join(". ")} : ${n.message}`).join(`
461
- `))}};var G=()=>{try{let e=At("bin/integration.collection.json");return Gs(e)}catch(e){throw new Error(`Failed to load integrations!
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!
462
448
  Check your integration.collection.json:
463
- ${e.message}`)}},je=()=>G().reduce((t,n)=>(n.initial&&t.push(n.name),t),[]),hp=e=>!!e?.name&&!!e?.link&&!!e?.description,tn=e=>{let t=G();if(!t?.length||!e?.length)return;let n=e.map(r=>t.find(o=>o.name===r)).filter(hp);n.length&&(m.breakLine().log("\u{1F50C} Installed Integrations:"),n.forEach(({name:r,link:o,description:s})=>{let a=m.getStoredLogs(`${en}:${r}`);o&&m.log(`${(0,Us.default)(Z.default.cyan(r),o)} - ${s}`),a.length&&m.log(a.map(i=>` \u203A ${Z.default.dim(i.message)}`).join(`
464
- `))}))},yp=e=>e.toUpperCase().replace(/-/g,"_"),Js=(e,t)=>{let n=yp(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 ur=u(require("chalk"));var kp=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},Ks=async e=>{let{selectedIntegrations:t,cwd:n,packageManager:r=x(),task:o}=e;if(!t?.length||!o)return;let s=vp(t,n,r,o);await Et(o,s)},vp=(e,t,n,r)=>{let s=G()?.filter(i=>e.includes(i.name))?.flatMap(i=>i.install.map(c=>{let{name:l,version:p}=kp(c);return{title:ur.default.cyanBright(`Adding ${c} (${i.name})`),fn:async()=>{te(`dependencies.${l}`,p,t)}}})),a={title:ur.default.cyanBright("Installing packages..."),fn:async()=>{await H({cwd:t,packageManager:n,task:r})}};return[...s??[],a]};var zs=u(require("chalk"));var qs=async e=>{let{selectedIntegrations:t,cwd:n,task:r}=e;if(!t?.length||!r)return;let o=Cp(t,n,r,e.packageManager);await Et(r,o)},Cp=(e,t,n,r)=>G().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(a=>({title:zs.default.cyanBright(`Running "${a}" for ${s.name}
465
- `),fn:()=>xp(s,a,t,n,r)}))),xp=async(e,t,n,r,o)=>{let s=`${en}:${e.name}`;try{if(e.interactive)return fo(t,[],{cwd:n,context:s,task:r,manager:o});await ne(t,[],{cwd:n,task:r,context:s})}catch(a){m.error(`Failed to run command "${t}" for ${e.name}: ${a.message}`)}};var nn=require("node:fs"),yt=require("node:path");var rn=(e,t)=>{try{let n=(0,nn.readFileSync)(e,"utf-8"),r=JSON.parse(n);t(r),(0,nn.writeFileSync)(e,JSON.stringify(r,null,2),"utf-8")}catch{}},wp=e=>{let t=(0,yt.join)(g(e),"tsconfig.json");rn(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"]})},bp=e=>{let t=(0,yt.join)(g(e),"tsconfig.build.json");rn(t,n=>{n.exclude=["node_modules","test","dist","**/*.spec.ts","**/*.test.ts"]})},Sp=e=>{let t=(0,yt.join)(g(e),"nest-cli.json");rn(t,n=>{n.compilerOptions=n.compilerOptions||{},n.compilerOptions.tsConfigPath="tsconfig.build.json"})},Pp=e=>{let t=(0,yt.join)(g(e),"package.json");rn(t,n=>{delete n.jest})},Vs=e=>{wp(e),bp(e),Sp(e),Pp(e)};var Zs=require("node:path");var Tp=(e,t)=>{let n=tr(e);if(n){for(let{className:r,importPath:o}of t)rr(n,o,[r]),or(n,r);nr(n)}},Ys=e=>{let t=(0,Zs.join)(g(e),"src","app.module.ts");Tp(t,[{className:"EventsModule",importPath:"./events/events.module"}])};var $p=require("fs-extra");var Ip=u(require("chalk")),Ap=u(require("cli-table3"));var Xs=require("node:fs"),Qs=require("node:path"),ea=u(require("handlebars"));var Fe=(e,t)=>jo(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),gr=(e,t={})=>{let n=(0,Xs.readFileSync)(e,"utf-8");return ea.default.compile(n)(t)},on=e=>(t,n={})=>{let r=(0,Qs.join)(e,t);return gr(r,n)};var kt=e=>e.toUpperCase().replace(/-/g,"_");var ta=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");function sn(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function na(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 ba=require("node:path"),oe=u(require("chalk"));var ra=require("@listr2/prompt-adapter-enquirer"),Oe={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{if(e.userConfirmed=await t.prompt(ra.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 Np=4001,Rp=4e3;function Mp(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 jp(e,t){let n=t?Np:Rp,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=Mp(c);for(let p of l)r.add(p)}catch{}}let s=n;for(;r.has(s);)s++;return s}function Fp(e){return(0,_e.basename)(e)}var an={title:"Creating infrastructure service config",task:async(e,t)=>{let n=Fp(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=jp(o,!0);e.assignedPort=a;let i=e.serviceType==="hono"?Hs(n,a):Bs(n,a);(0,Y.writeFileSync)(s,i),t.title=`Created infra/services/${n}.ts (port: ${a})`}};var vt=require("node:child_process"),oa=require("node:fs"),sa=require("node:path"),Op=()=>{try{return(0,vt.execSync)("git --version",{stdio:"ignore"}),!0}catch{return!1}},_p=e=>(0,oa.existsSync)((0,sa.join)(e,".git")),aa={title:"Initializing git repository",enabled:()=>Op(),skip:e=>_p(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{(0,vt.execSync)("git init",{cwd:e.cwd,stdio:"ignore"}),(0,vt.execSync)("git add -A",{cwd:e.cwd,stdio:"ignore"}),(0,vt.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 ia=require("@listr2/prompt-adapter-enquirer"),fr=u(require("chalk"));var De={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!ar(),task:async(e,t)=>S(t,async n=>{await Cs(t),e.elapsedTime+=n(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},Le={enabled:e=>!ar()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{e.shouldInstallBun=await t.prompt(ia.ListrEnquirerPromptAdapter).run({type:"Toggle",message:"Would you like to use Bun? (recommended)",initial:!0,footer:["",`${fr.default.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${fr.default.underline("https://bun.sh")}`,xs(),ws()].join(`
466
- `)}),e.shouldInstallBun&&(e.packageManager="bun")}};var ca=require("@listr2/prompt-adapter-enquirer"),hr=u(require("chalk"));var cn={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>S(t,async n=>{let{selectedIntegrations:r,cwd:o,packageManager:s}=e;await Ks({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(ca.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:je().map((n,r)=>r),choices:e.availableIntegrations.map(({name:n,description:r})=>({name:n,message:[hr.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=>hr.default.bold(`\u2022 ${n}`))].join(`
468
- `)}};var la={title:"Install Nest CLI",task:async(e,t)=>S(t,async n=>{await go({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=n()}),rendererOptions:{outputBar:1e3}};var pn={title:"Install dependencies",task:async(e,t)=>S(t,async n=>{await H({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=n()})};var pa=require("@listr2/prompt-adapter-enquirer"),ma=u(require("chalk"));var He={enabled:e=>!e.removeDir&&!$t(e.cwd),task:async(e,t)=>{if(e.removeDir=await t.prompt(pa.ListrEnquirerPromptAdapter).run({type:"Toggle",message:ma.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=>Vr(e.cwd)};var mn={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>S(t,async n=>{let{selectedIntegrations:r,cwd:o}=e;await qs({selectedIntegrations:r,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=n()}),rendererOptions:{outputBar:1}};var da=require("@listr2/prompt-adapter-enquirer");var Dp=["services/my-hono-service","services/my-nest-service","my-platform"],We={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?Dp.includes(e.projectName):!0,task:async(e,t)=>{e.projectName=await t.prompt(da.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 ua=require("@listr2/prompt-adapter-enquirer"),yr=u(require("chalk"));var Ge={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=In(),e.packageManager){t.title=`Using ${yr.default.bold(e.packageManager)} as package manager.`;return}e.packageManager=await t.prompt(ua.ListrEnquirerPromptAdapter).run({type:"Select",message:"Which package manager would you like to use?",initial:An(),choices:uo}),t.title=`Using ${yr.default.bold(e.packageManager)} as package manager.`}};var dn=require("@listr2/prompt-adapter-enquirer"),Ct=u(require("chalk")),ga={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${Ct.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: ${Ct.default.bold(e.githubOwner)}`}},fa={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 ha={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${Ct.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: ${Ct.default.bold(e.pulumiStackBase)}`}};var _=require("node:fs"),j=require("node:path");var un=require("node:path");var Lp=()=>{let e=it();return Fe([(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.")},xt=(e,t={})=>on(Lp())(e,t);function ya(){return xt("tsconfig.json.hbs")}function ka(e="1.2.23"){return xt("Dockerfile.hbs",{bunVersion:e})}function va(){return xt("biome.json.hbs")}function Ca(e){return xt("src/index.ts.hbs",{envKey:kt(e)})}function xa(e){return xt("src/config/env.ts.hbs",{envKey:kt(e)})}var Hp=async({projectName:e,packageManager:t},n)=>{let r=t==="bun"?"bun":"nodejs";try{await ne("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")},Bp=({projectName:e,packageManager:t})=>{let n=(0,j.basename)(e),r=we(),o=t==="npm"?"*":"workspace:*",s=g(e),a=eo("scripts.dev",s);a&&te("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})=>te(c,l,e))},Wp=({projectName:e})=>{let t=(0,j.basename)(e),n=(0,j.join)(g(e),"src","index.ts"),r=Ca(t);(0,_.writeFileSync)(n,r)},Gp=({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=xa(t);(0,_.writeFileSync)(o,s)},Up=({projectName:e})=>{let t=g(e),n=(0,j.join)(t,"tsconfig.json");(0,_.writeFileSync)(n,ya());let r=(0,j.join)(t,"Dockerfile");(0,_.writeFileSync)(r,ka());let o=(0,j.join)(t,"biome.json");(0,_.writeFileSync)(o,va())},wa={title:"Create Hono app structure",rendererOptions:{outputBar:1e3},task:async(e,t)=>S(t,async n=>{await Hp(e,t),Bp(e),Wp(e),Gp(e),Up(e),e.elapsedTime+=n()})};var Jp=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${L().services}/${t}`},Kp=async(e,t)=>{let{valid:n,config:r,error:o}=Re();if(!n||!r){console.log(o);return}let s=Jp(e.name),a=t.packageManager||x(),i=await Jt(t.description);if(Kt(s,r,i),await zt({servicePath:s,description:i,serviceType:"hono",packageManager:a},r))console.log(oe.default.green.bold(`
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(`
469
469
  \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")},Sa=ie({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:Kp,buildContext:async(e,t)=>{let n=(e.name??"my-hono-service").trim();!n.includes("/")&&!n.startsWith(".")&&(n=`${L().services}/${n}`);let r=g(n),o=t.packageManager??(t.yes&&x()),s=G(),a=t.yes?je():[],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,wa,an,cn,mn],onComplete:({projectName:e,packageManager:t,selectedIntegrations:n,assignedPort:r})=>{m.breakLine().log(oe.default.bold.green("Hono Microservice created successfully!")),tn(n),Js((0,ba.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 vr=require("node:path");var zp=()=>Fe([(0,vr.join)(__dirname,"templates","nest-microservice"),(0,vr.join)(__dirname,"..","nest-microservice","templates")],"NestJS templates directory not found."),Ue=(e,t={})=>on(zp())(e,t);function gn(e,t=3e3){return Ue("src/main.ts.hbs",{serviceName:e,envKey:kt(e),displayName:ta(e),defaultPort:t})}function Pa(){return Ue("src/app.context.ts.hbs",{})}function Ta(){return Ue("src/events/events.module.ts.hbs",{})}function $a(e){return Ue("src/events/events.service.ts.hbs",{serviceName:e})}function Ea(e="24",t="1.2.23"){return Ue("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function Ia(){return Ue("biome.json.hbs",{})}var qp=async(e,t)=>{await ne("@nestjs/cli",["new",e.projectName,"--skip-install","--skip-git","--package-manager",e.packageManager],{task:t})},Vp=({projectName:e,packageManager:t})=>{let n=(0,F.basename)(e),r=we(),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})=>te(i,c,e)),["jest","@types/jest","ts-jest","@nestjs/testing","supertest","@types/supertest","ts-node","tsconfig-paths","@nestjs/schematics","@nestjs/cli"].map(i=>te(`devDependencies.${i}`,void 0,e))},Zp=({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{}},Yp=({projectName:e})=>{let t=g(e),n=(0,F.join)(t,"Dockerfile");(0,U.writeFileSync)(n,Ea());let r=(0,F.join)(t,"biome.json");(0,U.writeFileSync)(r,Ia())},Xp=({projectName:e})=>{let t=(0,F.join)(g(e),"src","app.context.ts");(0,U.writeFileSync)(t,Pa())},Qp=({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"),Ta()),(0,U.writeFileSync)((0,F.join)(n,"events.service.ts"),$a(t)),Ys(e)},em=({projectName:e})=>{let t=(0,F.basename)(e),n=(0,F.join)(g(e),"src","main.ts");(0,U.writeFileSync)(n,gn(t))},Aa={title:"Create NestJS app structure",rendererOptions:{outputBar:1e3},task:async(e,t)=>S(t,async n=>{await qp(e,t),Vp(e),Vs(e.projectName),Zp(e),Yp(e),Xp(e),Qp(e),em(e),e.elapsedTime+=n()})};var Na=require("node:fs"),fn=require("node:path");var Ra={title:"Patch main.ts with PORT pattern",task:async(e,t)=>S(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,Na.writeFileSync)(s,gn(r,o)),t.title=`Patched main.ts with PORT || ${r.toUpperCase().replace(/-/g,"_")}_PORT`,e.elapsedTime+=n()})};var tm=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${L().services}/${t}`},nm=async(e,t)=>{let{valid:n,config:r,error:o}=Re();if(!n||!r){console.log(o);return}let s=tm(e.name),a=t.packageManager||x(),i=await Jt(t.description);if(Kt(s,r,i),await zt({servicePath:s,description:i,serviceType:"nest",packageManager:a},r))console.log(se.default.green.bold(`
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(`
472
472
  \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")},Ma=ie({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:nm,buildContext:async(e,t)=>{let n=(e.name??"my-nest-service").trim();!n.includes("/")&&!n.startsWith(".")&&(n=`${L().services}/${n}`);let r=g(n),o=t.packageManager??(t.yes&&x()),s=t.packageManager==="bun",a=G(),i=t.yes?je():[],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,Aa,an,Ra,pn,la,cn,mn],onComplete:({projectName:e,packageManager:t,selectedIntegrations:n})=>{m.breakLine().log(se.default.bold.green("NestJS Microservice created successfully!")),tn(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 Ga=require("@listr2/prompt-adapter-enquirer"),D=u(require("chalk"));var _a=require("node:child_process"),I=require("node:fs"),Je=require("node:path");var ja=require("node:fs"),wt=require("node:path");var Cr=()=>{let e=it();return Fe([(0,wt.join)(__dirname,"templates","workspace"),(0,wt.join)(__dirname,"..","..","..","..","templates","workspace"),(0,wt.join)(e,"bin","templates","workspace")],"Workspace templates directory not found.")},Fa=()=>{let e=Cr(),t=(0,wt.join)(e,"packages","contracts");if(!(0,ja.existsSync)(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},hn=(e,t)=>gr(e,t);var Oa=e=>{e.endsWith(".sh")&&(0,I.chmodSync)(e,493)},rm=[{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:"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}],Da={title:"Creating workspace structure",task:async(e,t)=>{if((0,I.existsSync)(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let n=Cr(),r=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let d=(0,_a.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=rm.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,I.existsSync)(p)||(0,I.mkdirSync)(p,{recursive:!0}),c.isStatic){let d=(0,Je.join)(n,c.template);(0,I.existsSync)(d)?(0,I.writeFileSync)(l,(0,I.readFileSync)(d)):(0,I.writeFileSync)(l,""),Oa(l)}else{let d=(0,Je.join)(n,c.template),k=hn(d,a);(0,I.writeFileSync)(l,k),Oa(l)}}t.title="Workspace structure created"}};var X=require("node:fs"),bt=require("node:path"),La=u(require("chalk"));var om=()=>{let e=(0,bt.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}`},sm=()=>{let e=om(),{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=Fa(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};(0,X.mkdirSync)(n,{recursive:!0}),(0,X.mkdirSync)((0,bt.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,bt.join)(r,a.template),c=(0,bt.join)(n,a.output),l=hn(i,o);(0,X.writeFileSync)(c,l,"utf-8")}},Ha={title:"Initializing contracts package",task:(e,t)=>{let n=process.cwd();try{process.chdir(e.cwd),sm(),t.title="Contracts package initialized"}catch(r){throw t.title=La.default.red(`Contracts package failed: ${r.message}`),r}finally{process.chdir(n)}}};var Ba=u(require("chalk"));var Wa={title:"Registering shell completion",task:(e,t)=>{let n=process.cwd();try{process.chdir(e.cwd),ke(),t.title="Shell completion registered"}catch{t.title=Ba.default.dim("Shell completion skipped")}finally{process.chdir(n)}}};var Ua=ie({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(Ga.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,ga,fa,ha,Le,Ge,Oe],actions:[Be,De,Da,Ha,pn,aa,Wa],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 St=[{name:"Hono Microservice",value:"hono-micro",command:Sa,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:Ma,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:Ua,supportsAi:!1}],Ja=()=>{let e=ie({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(me.ListrEnquirerPromptAdapter).run({type:"select",message:"Select Project type",choices:St});t.projectType=St.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(me.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(me.ListrEnquirerPromptAdapter).run({type:"input",message:s,initial:o});t.servicePath=a.trim(),n.title=`Path: ${ae.default.dim(a)}`}},{enabled:t=>!!St.find(r=>r.value===t.projectType)?.supportsAi&&Re().valid,task:async(t,n)=>{let r=await n.prompt(me.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(me.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!$t(n)},task:async(t,n)=>{if(!await n.prompt(me.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(me.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=>{St.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 na(n,t,r,o)}});for(let t of St)e.addCommand(t.command);return e};var Za=require("commander");var xr=u(require("chalk"));var wr=e=>new Promise(t=>setTimeout(t,e)),Ka=e=>process.stdout.write(`${e}
476
- `),am=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},za=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),qa=async(e,t)=>{let n=oo(".env.local",t);n.length>0&&(await co(n),await wr(50)),Ka(xr.default.cyan("\u{1F525} Starting services...")),Ka(xr.default.dim(` Command: turbo run ${Cn} --continue`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=io("turbo",["run",Cn,"--continue","--no-daemon"],{cwd:t,envFile:".env.local",onExit:r=>{e.isRestarting||e.isShuttingDown||r===1&&process.exit(0)}})},Va=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 wr(200);try{process.kill(-n,"SIGKILL")}catch{}await wr(30)}catch{}e.turboProcess=null,am()}};var Ya=new Za.Command("dev").description("Start development mode with auto-reload").action(async()=>{let e=y(),t=za(),n=i=>tt("generate-env",{cwd:i}),r=()=>H({cwd:e,quiet:!0}),o=async()=>{await r(),await n(e),await Ds()&&await Ls(e),await qa(t,e)},s=async()=>{t.isRestarting||t.isShuttingDown||(t.isRestarting=!0,console.log(`
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(`
477
477
  \u{1F504} Change detected, restarting...
478
- `),await Va(t),await o(),t.isRestarting=!1)},a=async()=>{if(t.isShuttingDown)return;t.isShuttingDown=!0,console.log(`
479
- \u{1F6D1} Shutting down...`);let i=t.turboProcess?.pid;if(i)try{process.kill(-i,"SIGKILL")}catch{try{t.turboProcess?.kill("SIGKILL")}catch{}}process.exit(0)};process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",a),process.on("SIGTERM",a),await o(),Mo(e,s),console.log(`
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(`
480
480
  \u{1F440} Watching for changes...`),console.log(` Press Ctrl+C twice to exit (first stops Turbo, second triggers cleanup)
481
- `)});var fi=require("commander");var Xa=require("node:fs"),Qa=require("node:path"),Q=u(require("chalk")),ei=require("commander");var im=e=>{if(e)try{return JSON.parse(e)}catch{return}},cm=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},lm=(e,t)=>{if(!t)return;let n=t.startsWith("/")?t:(0,Qa.resolve)(e,t);return(0,Xa.existsSync)(n)?n:void 0},pm=async(e,t)=>{let n=[],r=[],o=[];if(Fn(e)&&!t.force)r.push("Contract (already exists)");else{let a=On(e,t.schema);n.push(`Contract: ${a}`)}Jn(e)&&n.push("Export: packages/contracts/src/index.ts");let s=await Lt(e);if(s&&n.push(`Mock: ${s}`),t.servicePath){let a=Hn(e,t.servicePath);a?n.push(`Handler: ${a}`):r.push("Handler (already exists)");let i=Ln(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}},mm=(e,t,n=[])=>{if(e.length>0){console.log(Q.default.green(`\u2713 Created:
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
482
  `));for(let r of e)console.log(Q.default.dim(` ${r}`))}if(t.length>0){console.log(Q.default.yellow(`
483
483
  \u2139 Skipped:
484
484
  `));for(let r of t)console.log(Q.default.dim(` ${r}`))}if(n.length>0){console.log(Q.default.yellow(`
485
485
  \u26A0 Warning:
486
- `));for(let r of n)console.log(Q.default.dim(` ${r}`))}},br=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=cm(t.fields)||im(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=lm(n,t.service);if(t.service&&!o){m.error(`Service directory not found: ${t.service}`);return}console.log(Q.default.cyan(`
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
487
  \u{1F4E6} Adding event: ${e}
488
- `));let{created:s,skipped:a,warnings:i}=await pm(e,{schema:r,servicePath:o,force:t.force});mm(s,a,i),console.log(),s.length>0&&ke({force:!0}),t.service||(console.log(Q.default.yellow(`\u{1F4A1} Tip: Use --service to also create an event handler:
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
489
  `)),console.log(Q.default.dim(` pf event add ${e} --service services/my-service
490
- `)))},fk=new ei.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(br);var ri=require("commander");var ti=require("fs-extra"),ni=require("globby"),de=require("zod");var dm=["**/node_modules/**","**/.nats-data/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**"],um=de.z.record(de.z.string()),gm=de.z.object({description:de.z.string().optional(),eventName:de.z.string(),faker:um.optional(),data:de.z.record(de.z.any())}),Ke=(e=process.cwd())=>(0,ni.globbySync)("**/*.mock.json",{cwd:e,absolute:!0,gitignore:!0,ignore:dm}).map(n=>{try{let r=(0,ti.readJSONSync)(n,{encoding:"utf8"}),o=gm.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 Sr=null,oi=async()=>{if(!Sr){let{faker:e}=await import("@faker-js/faker");Sr=e}return Sr},Pr=async(e,t)=>{let n=await oi(),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 fm(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.")},xk=new ri.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(Pr),fm=async e=>{let t=structuredClone(e.data);return e.faker&&await Promise.all(Object.entries(e.faker).map(async([n,r])=>{let o=await hm(r);Tt(t,n,o)})),t},hm=async e=>{let t=await oi();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 mi=require("commander");var Tr=require("node:fs"),si=require("node:path"),$r=require("globby");var ym=["**/node_modules/**","**/.nats-data/**","**/dist/**","**/build/**","**/.git/**","**/coverage/**"],km=e=>{let t=e.split("/"),n=t.indexOf("services");return n!==-1&&n+1<t.length?t[n+1]:"unknown"},vm=(e,t)=>{try{let{eventsPath:n}=C(t),o=(0,$r.globbySync)("**/*.ts",{cwd:n,absolute:!0}).map(a=>({file:a,content:(0,Tr.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}},Cm=e=>e.replace(/Contract$/,"").replace(/([A-Z])/g,(t,n,r)=>(r>0?".":"")+n.toLowerCase()),xm=(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 vm(s,t)||Cm(s)},wm=(e,t)=>{try{let n=(0,Tr.readFileSync)(e,"utf-8"),r=xm(n,t);return r?{serviceName:km(e),handlerPath:(0,si.relative)(t,e),eventType:r}:null}catch{return null}},ai=(e=process.cwd())=>(0,$r.globbySync)("services/**/src/events/*.handler.ts",{cwd:e,absolute:!0,gitignore:!0,ignore:ym}).map(n=>wm(n,e)).filter(n=>n!==null),ii=e=>e.reduce((t,n)=>{let r=t.get(n.eventType)||[];return t.set(n.eventType,[...r,n]),t},new Map);var li=u(require("cli-table3"));var ci=(e,t)=>{let n=t.get(e)||[],r=[...new Set(n.map(o=>o.serviceName))];return r.length>0?r.join(", "):"-"};var pi=(e,t)=>{let n=new li.default({head:["name","description","consumers"],style:{head:["dim","bold"],compact:!0}});for(let{eventName:r,schema:o}of e)n.push([r,o.description||"-",ci(r,t)]);return n.toString()};var bm=e=>{for(let t of e)console.log(t)},Sm=()=>{let e=ir();bm(e)},Pm=()=>{let e=Ke();if(e.length===0){m.error("No event schemas found.");return}let t=ai(),n=ii(t),r=pi(e,n);console.log(r)},Er=e=>{if(!Qr()){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?Sm():Pm()},jk=new mi.Command("event:list").description("List all available event mocks").option("--names-only","Output only event names (for completion)").action(Er);var di=require("node:path"),ui=require("commander");var Im={},Ir=null,Ar=null,gi=async()=>{if(!Ir){let{faker:e}=await import("@faker-js/faker");Ir=e}return Ir},Tm=async()=>{if(!Ar)try{let{createJiti:e}=await import("jiti"),t=e(Im.url),n=y(),r=C(n),o=(0,di.join)(r.packagePath,"node_modules","@crossdelta","cloudevents");Ar=(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 Ar},Nr=async(e,t)=>{let n=await gi(),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 $m(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 Tm();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)}},Lk=new ui.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(Nr),$m=async e=>{let t=structuredClone(e.data);return e.faker&&await Promise.all(Object.entries(e.faker).map(async([n,r])=>{let o=await Em(r);Tt(t,n,o)})),t},Em=async e=>{let t=await gi();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 fi.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(br);ze.command("list").description("List all available event mocks").option("--names-only","Output only event names (for completion)").action(Er);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(Nr);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(Pr);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 hi=ze;var jr=u(require("chalk")),xi=require("commander");var qe=require("node:fs"),Mr=u(require("node:path")),yn=u(require("chalk")),yi=require("commander"),ki=u(require("os"));var{name:Am,publishConfig:Nm}=N,Rm=Nm?.registry,Mm=Am?.split("/")[0],Vk=new yi.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)",Mm).option("--registry <registry>","Registry URL",Rm).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)=>vi(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${yn.default.cyan(`
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(`
493
493
  Example:`)}
494
494
  ${yn.default.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
495
- `),jm=e=>e?Mr.default.join(process.cwd(),".npmrc"):Mr.default.join(ki.default.homedir(),".npmrc"),Fm=(e,t,n)=>{let r=new URL(n).host;return t?`${t}:registry=https://${r}
496
- //${r}/:_authToken=${e}`:`//${r}/:_authToken=${e}`},Om=e=>(0,qe.existsSync)(e)?(0,qe.readFileSync)(e,"utf8"):"",Rr=(e,t)=>(0,qe.writeFileSync)(e,t),vi=(e,t,n,r=!1,o=!1)=>{let s=jm(r),a=Fm(e,t,n),i=new URL(n).host,c=Om(s),l=new RegExp(`//${i}/:_authToken=\\S+`);if(!c){Rr(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),Rr(s,c),m.success(`Overwrote existing token for ${i} in ${s}`);return}c+=`
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+=`
498
498
  ${a}
499
- `,Rr(s,c),m.success(`Appended token for ${i} to ${s}`)},Ci=(e,t)=>vi(e,t.scope||"",t.registry||"",t.local,t.force);var{name:_m,publishConfig:Dm}=N,Lm=Dm?.registry,Hm=_m?.split("/")[0],Fr=new xi.Command("token").description("Token management commands");Fr.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)",Hm).option("--registry <registry>","Registry URL",Lm).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(Ci).addHelpText("after",()=>`${jr.default.cyan(`
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(`
500
500
  Example:`)}
501
- ${jr.default.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
502
- `);Fr.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 wi=Fr;var kn=u(require("chalk")),Ti=require("commander");var nv={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};var ee=require("@inquirer/prompts"),w=u(require("chalk"));var Bm=[/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],Wm=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)}},Gm=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(),Um=async(e,t)=>{let n=rt(e),r=await Wm(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=Bm.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:Gm(i.id),value:i.id}));if(a.length===0)throw new Error(`No chat models found from ${n.name} API`);return a};async function bi(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await Um(e,t),fromApi:!0}}function Jm(){if(!ot())return null;try{let e=jt();return console.log(w.default.dim(`Found existing configuration at ${he}
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
503
  `)),e}catch{return console.log(w.default.yellow(`Found corrupted configuration, starting fresh.
504
- `)),null}}async function Km(e,t){return console.log(w.default.dim(`
504
+ `)),null}}async function Vm(e,t){return console.log(w.default.dim(`
505
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 Si(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function qm(e,t){console.log(w.default.green.bold(`
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(`
507
507
  \u2705 AI configuration saved successfully!
508
- `)),console.log(w.default.dim(`Configuration file: ${he}`)),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: ${Si(t)}
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
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 Vm(e){let t=await Mt(e);if(t)return t;let n=rt(e);return process.env[n.defaultApiKeyEnvVar]??null}async function Pi(){console.log(w.default.cyan.bold(`
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(`
511
511
  \u{1F916} AI Configuration Setup
512
- `));let e=Jm();try{let t=await(0,ee.select)({message:"Select AI provider:",choices:To(),default:e?.provider??Rn.provider}),n=rt(t),r,o=await Vm(t);o&&(console.log(w.default.green(`
513
- \u2713 Found existing API key: ${Si(o)}`)),await(0,ee.confirm)({message:"Use this existing API key?",default:!0})&&(r=o)),r||(r=await Km(n.name,n.apiKeyUrl)),console.log(w.default.dim(`
514
- Fetching available models...`));let s;try{s=(await bi(t,r)).models,console.log(w.default.green(`\u2713 Loaded ${s.length} models from ${n.name} API
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
515
  `))}catch(c){console.error(w.default.red(`
516
516
  \u274C Failed to fetch models: ${c.message}`)),console.log(w.default.yellow(`
517
517
  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()};Io(i),await Ao(t,r),qm(i,r)}catch(t){throw t.name==="ExitPromptError"&&(console.log(w.default.yellow(`
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(`
519
519
  Setup cancelled.
520
- `)),process.exit(0)),t}}var Or=(e,t=!1)=>{try{return mr(e,t),ke({verbose:t}),!0}catch{return!1}};var vn=e=>{let t=new Ti.Command("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
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",`
521
521
  Examples:
522
522
  $ pf setup completion
523
523
  $ pf setup completion --verbose
524
- `).action(n=>{Or(e,n.verbose),n.verbose||(console.log(kn.default.green(`
524
+ `).action(n=>{Dr(e,n.verbose),n.verbose||(console.log(kn.default.green(`
525
525
  \u2714 Shell autocompletion installed!`)),console.log(kn.default.dim(` Restart your shell:
526
526
  `)),console.log(kn.default.cyan(` exec $SHELL
527
527
  `)))}),t.command("ai").description("Configure AI provider and API key for code generation").addHelpText("after",`
528
528
  Example:
529
529
  $ pf setup ai
530
- `).action(async()=>{await Pi()}),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},Ym=vn("pf");Xt();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(Ce.default.red(`
531
- \u2716 An unexpected error occurred:`)),console.error(e),process.exit(1)});var Pt=new Mi.Command,$i=Object.keys(N.bin||{}),[Dr="pf",_r]=$i.length>0?$i:["pf"],{description:Ei,version:Xm,repository:Ii,homepage:Qm}=N,Ai=Ei?.split(/ —|,|\./)[0]||Ei||"Platform CLI",Fi=Ii?.url?`https://${Ii.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,Ni=Fi||Qm,ed=Fi?"GitHub":"README",td=Ni?[Ce.default.bold(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),`
532
532
 
533
- `,Ce.default.cyan("See more at: "),Ce.default.bold((0,ji.default)(ed,String(Ni)))].join(""):Ce.default.bold(Ai),Oi=[vn(Dr),Ja(),Ya,hi,wi,Co];Pt.name(Dr).description(td).version(Xm||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:e=>Ce.default.cyan(e.name())}).addHelpText("after",$s);_r&&_r!==Dr&&Pt.alias(_r);Oi.forEach(e=>{Pt.addCommand(e)});Pt.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)});Es(Pt,Ri.argv,Oi);
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);
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossdelta/platform-sdk",
3
- "version": "0.18.1",
3
+ "version": "0.18.3",
4
4
  "description": "Platform toolkit for event-driven microservices — keeping code and infrastructure in lockstep.",
5
5
  "keywords": [
6
6
  "cli",