@crossdelta/platform-sdk 0.24.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,21 @@ All notable changes to `@crossdelta/platform-sdk` will be documented in this fil
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.24.1] - 2026-09-08
9
+
10
+ ### Fixed
11
+ - **The `insufficient storage` message named the wrong remedy.** It sent the reader to
12
+ `docker system prune -af`, which cannot help: JetStream pins its storage limit when the server
13
+ starts, at 75% of the free space it sees then, and never recomputes it. Freeing disk afterwards
14
+ leaves the old limit in place. The message now puts `docker restart pf-local-nats` first and keeps
15
+ the prune hint as the second step, for when the disk really is full.
16
+ - **`pf dev` no longer claims to have created streams it only checked.** The line counted the
17
+ contract definitions, not the streams actually added, so an existing stream was reported as
18
+ created. It now says "Ensured".
19
+ - **Development streams reserve 64 MiB each instead of 1 GiB.** `max_bytes` is reserved against the
20
+ server budget the moment a stream is created, not consumed as messages arrive, so a workspace with
21
+ a dozen contracts claimed a dozen GiB while every stream held zero bytes.
22
+
8
23
  ## [0.24.0] - 2026-09-06
9
24
 
10
25
  ### Added
package/bin/cli.mjs CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- var ia=Object.defineProperty;var Jt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var S=(e,t)=>()=>(e&&(t=e(e=0)),t);var aa=(e,t)=>{for(var r in t)ia(e,r,{get:t[r],enumerable:!0})};var w,Ke=S(()=>{"use strict";w={SUCCESS:0,GENERAL_ERROR:1,USAGE_ERROR:2,WORKSPACE_ERROR:64,VALIDATION_ERROR:65,CONFIG_ERROR:66,IO_ERROR:74,PERMISSION_ERROR:77,CANCELLED:130}});var U,z,qe,Kt=S(()=>{"use strict";Ke();U=class extends Error{exitCode;category;hint;cause;constructor(t,r=w.GENERAL_ERROR,n={}){super(t),this.name="CliError",this.exitCode=r,this.category=n.category??"process",this.hint=n.hint,this.cause=n.cause}toUserMessage(){let t=[this.message];return this.hint&&t.push(`
3
- Hint: ${this.hint}`),t.join("")}},z=class extends U{path;constructor(t,r,n={}){super(t,w.IO_ERROR,{...n,category:"io"}),this.name="IoError",this.path=r}},qe=class extends U{constructor(t="Operation cancelled",r={}){super(t,w.CANCELLED,{...r,category:"user"}),this.name="CancelledError"}}});import Z from"chalk";var X,kn,xn,wn,ca,la,Ye,pa,ma,$,Pn=S(()=>{"use strict";Kt();Ke();X=e=>e instanceof Error,kn=e=>X(e)?e.message:typeof e=="string"?e:String(e),xn=["ExitPromptError"],wn=["Cancelled prompt","User force closed"],ca=["ERR_USE_AFTER_CLOSE"],la=e=>xn.some(t=>e.name?.includes(t))||wn.some(t=>e.message?.includes(t)),Ye=e=>{if(e instanceof qe)return!0;if(!(e instanceof Error))return!1;if(xn.some(r=>e.name?.includes(r))||wn.some(r=>e.message?.includes(r)))return!0;let t=e.code;return t&&ca.includes(t)?la(e):!1},pa=e=>{if(e instanceof U){let r=e.toUserMessage();return Z.red(`\u2716 ${r||"Unexpected error (re-run with DEBUG=true for details)"}`)}if(e instanceof Error){let r=e.message?.trim();return r?Z.red(`\u2716 ${r}`):Z.red("\u2716 Unexpected error (re-run with DEBUG=true for details)")}let t=String(e);return!t||t==="undefined"||t==="null"?Z.red("\u2716 Unexpected error (re-run with DEBUG=true for details)"):Z.red(`\u2716 ${t}`)},ma=e=>e instanceof U?e.exitCode:Ye(e)?w.CANCELLED:w.GENERAL_ERROR,$=(e,t={})=>{let{debug:r=process.env.DEBUG==="true",exit:n=!0,logger:o=console.error}=t;if(Ye(e)){n&&process.exit(w.CANCELLED);return}o(pa(e)),r&&e instanceof Error&&e.stack&&o(Z.dim(e.stack)),e instanceof U&&e.hint&&o(Z.dim(`
4
- Hint: ${e.hint}`)),n&&process.exit(ma(e))}});var V=S(()=>{"use strict";Kt();Pn();Ke()});var Xu,Sn,qt,Ze=S(()=>{"use strict";Xu=process.env.npm_package_version||"0.0.0",Sn=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"],qt="start:dev"});import Xe from"chalk";function Yt(e,t){if(e.length===0)return"No entries to display.";let r=t?.title||"Benchmark Results",n=t?.footer||"",o=t?.maxBarWidth||50,s=t?.unit||"",i=Math.max(...e.map(c=>c.value)),a=[];a.push(""),a.push(r),a.push("");for(let c of e){let l=da(c.barColor??t?.barColor),p=ga(c,i,o,l,s,t?.labelColor);a.push(p)}return n&&(a.push(""),a.push(n)),a.join(`
5
- `)}function da(e){return e?Xe[e]("\u2587"):"\u2587"}function ga(e,t,r,n,o,s){let i=Math.round(e.value/t*r),a=e.barColor?Xe[e.barColor](n.repeat(i)):n.repeat(i),c=e.color??s;return`${Xe.bold(c?Xe[c](e.label.padEnd(12)):e.label.padEnd(12))} ${a} ${e.value.toLocaleString()}${o?` ${o}`:""}`}var bn=S(()=>{"use strict"});import{existsSync as Qt,unlinkSync as ua,writeFileSync as fa}from"fs";import{join as Xt}from"path";import Zt from"chokidar";var er,Qe,ha,En,tr,ya,Tn,rr=S(()=>{"use strict";v();f();er=".pf-generating",Qe=e=>Xt(e,er),ha=e=>Qt(Qe(e)),En=e=>{fa(Qe(e),"","utf-8")},tr=e=>{let t=Qe(e);Qt(t)&&ua(t)},ya=e=>{let r=F(e)?.pf?.paths;return r?Object.values(r).filter(n=>typeof n=="object"&&n!==null&&n.watch===!0&&typeof n.path=="string"):[{path:"services"},{path:"apps"}]},Tn=(e,t)=>{tr(e);let r=ya(e),n=Qe(e),s=ae(async()=>{ha(e)||await t()},300),i=[];i.push(Zt.watch(n,{ignoreInitial:!0}).on("unlink",()=>t()));for(let a of r){let c=Xt(e,a.path);if(!Qt(c))continue;let l=a.ignorePatterns?.map(p=>Xt(c,p));i.push(Zt.watch(c,{ignoreInitial:!0,depth:0,ignored:l,usePolling:!0,interval:1e3}).on("addDir",p=>p!==c&&s()).on("unlinkDir",p=>p!==c&&s())),i.push(Zt.watch(`${c}/*/package.json`,{ignoreInitial:!0,ignored:l}).on("add",s).on("change",s))}return async()=>{await Promise.all(i.map(a=>a.close()))}}});import $n from"chalk";import{Command as va}from"commander";import{Listr as An}from"listr2";var J,Ca,In,Rn=S(()=>{"use strict";V();rr();f();J=e=>{let t=new va(e.name).description(e.description).showHelpAfterError();e.arguments?.forEach(([o,s])=>{t.argument(o,s)}),e.options?.forEach(([o,s])=>{t.option(o,s)}),e.exampleUsage&&t.addHelpText("after",()=>`${$n.cyan.bold(`
2
+ var aa=Object.defineProperty;var Jt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var S=(e,t)=>()=>(e&&(t=e(e=0)),t);var ca=(e,t)=>{for(var r in t)aa(e,r,{get:t[r],enumerable:!0})};var w,Ke=S(()=>{"use strict";w={SUCCESS:0,GENERAL_ERROR:1,USAGE_ERROR:2,WORKSPACE_ERROR:64,VALIDATION_ERROR:65,CONFIG_ERROR:66,IO_ERROR:74,PERMISSION_ERROR:77,CANCELLED:130}});var U,V,qe,Kt=S(()=>{"use strict";Ke();U=class extends Error{exitCode;category;hint;cause;constructor(t,r=w.GENERAL_ERROR,n={}){super(t),this.name="CliError",this.exitCode=r,this.category=n.category??"process",this.hint=n.hint,this.cause=n.cause}toUserMessage(){let t=[this.message];return this.hint&&t.push(`
3
+ Hint: ${this.hint}`),t.join("")}},V=class extends U{path;constructor(t,r,n={}){super(t,w.IO_ERROR,{...n,category:"io"}),this.name="IoError",this.path=r}},qe=class extends U{constructor(t="Operation cancelled",r={}){super(t,w.CANCELLED,{...r,category:"user"}),this.name="CancelledError"}}});import Z from"chalk";var X,kn,xn,wn,la,pa,Ye,ma,da,$,Pn=S(()=>{"use strict";Kt();Ke();X=e=>e instanceof Error,kn=e=>X(e)?e.message:typeof e=="string"?e:String(e),xn=["ExitPromptError"],wn=["Cancelled prompt","User force closed"],la=["ERR_USE_AFTER_CLOSE"],pa=e=>xn.some(t=>e.name?.includes(t))||wn.some(t=>e.message?.includes(t)),Ye=e=>{if(e instanceof qe)return!0;if(!(e instanceof Error))return!1;if(xn.some(r=>e.name?.includes(r))||wn.some(r=>e.message?.includes(r)))return!0;let t=e.code;return t&&la.includes(t)?pa(e):!1},ma=e=>{if(e instanceof U){let r=e.toUserMessage();return Z.red(`\u2716 ${r||"Unexpected error (re-run with DEBUG=true for details)"}`)}if(e instanceof Error){let r=e.message?.trim();return r?Z.red(`\u2716 ${r}`):Z.red("\u2716 Unexpected error (re-run with DEBUG=true for details)")}let t=String(e);return!t||t==="undefined"||t==="null"?Z.red("\u2716 Unexpected error (re-run with DEBUG=true for details)"):Z.red(`\u2716 ${t}`)},da=e=>e instanceof U?e.exitCode:Ye(e)?w.CANCELLED:w.GENERAL_ERROR,$=(e,t={})=>{let{debug:r=process.env.DEBUG==="true",exit:n=!0,logger:o=console.error}=t;if(Ye(e)){n&&process.exit(w.CANCELLED);return}o(ma(e)),r&&e instanceof Error&&e.stack&&o(Z.dim(e.stack)),e instanceof U&&e.hint&&o(Z.dim(`
4
+ Hint: ${e.hint}`)),n&&process.exit(da(e))}});var z=S(()=>{"use strict";Kt();Pn();Ke()});var ef,Sn,qt,Ze=S(()=>{"use strict";ef=process.env.npm_package_version||"0.0.0",Sn=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"],qt="start:dev"});import Xe from"chalk";function Yt(e,t){if(e.length===0)return"No entries to display.";let r=t?.title||"Benchmark Results",n=t?.footer||"",o=t?.maxBarWidth||50,s=t?.unit||"",i=Math.max(...e.map(c=>c.value)),a=[];a.push(""),a.push(r),a.push("");for(let c of e){let l=ga(c.barColor??t?.barColor),p=ua(c,i,o,l,s,t?.labelColor);a.push(p)}return n&&(a.push(""),a.push(n)),a.join(`
5
+ `)}function ga(e){return e?Xe[e]("\u2587"):"\u2587"}function ua(e,t,r,n,o,s){let i=Math.round(e.value/t*r),a=e.barColor?Xe[e.barColor](n.repeat(i)):n.repeat(i),c=e.color??s;return`${Xe.bold(c?Xe[c](e.label.padEnd(12)):e.label.padEnd(12))} ${a} ${e.value.toLocaleString()}${o?` ${o}`:""}`}var bn=S(()=>{"use strict"});import{existsSync as Qt,unlinkSync as fa,writeFileSync as ha}from"fs";import{join as Xt}from"path";import Zt from"chokidar";var er,Qe,ya,En,tr,va,Tn,rr=S(()=>{"use strict";v();f();er=".pf-generating",Qe=e=>Xt(e,er),ya=e=>Qt(Qe(e)),En=e=>{ha(Qe(e),"","utf-8")},tr=e=>{let t=Qe(e);Qt(t)&&fa(t)},va=e=>{let r=F(e)?.pf?.paths;return r?Object.values(r).filter(n=>typeof n=="object"&&n!==null&&n.watch===!0&&typeof n.path=="string"):[{path:"services"},{path:"apps"}]},Tn=(e,t)=>{tr(e);let r=va(e),n=Qe(e),s=ae(async()=>{ya(e)||await t()},300),i=[];i.push(Zt.watch(n,{ignoreInitial:!0}).on("unlink",()=>t()));for(let a of r){let c=Xt(e,a.path);if(!Qt(c))continue;let l=a.ignorePatterns?.map(p=>Xt(c,p));i.push(Zt.watch(c,{ignoreInitial:!0,depth:0,ignored:l,usePolling:!0,interval:1e3}).on("addDir",p=>p!==c&&s()).on("unlinkDir",p=>p!==c&&s())),i.push(Zt.watch(`${c}/*/package.json`,{ignoreInitial:!0,ignored:l}).on("add",s).on("change",s))}return async()=>{await Promise.all(i.map(a=>a.close()))}}});import $n from"chalk";import{Command as Ca}from"commander";import{Listr as An}from"listr2";var J,ka,In,Rn=S(()=>{"use strict";z();rr();f();J=e=>{let t=new Ca(e.name).description(e.description).showHelpAfterError();e.arguments?.forEach(([o,s])=>{t.argument(o,s)}),e.options?.forEach(([o,s])=>{t.option(o,s)}),e.exampleUsage&&t.addHelpText("after",()=>`${$n.cyan.bold(`
6
6
  Example:`)}
7
7
  ${$n.bold(e.exampleUsage)}
8
- `),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??"");let r=async o=>{e.prompts?.length&&await new An(In(e.prompts,o),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(o),await new An(In(e.actions,o),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(o),await e.onComplete?.(o)},n=()=>{try{let o=g();return En(o),o}catch{return null}};return t.action(async(...o)=>{let s=null;try{let i=o.at(-1),a=i.args,c=i.opts(),l=Ca(e.arguments??[],a);if(e.shouldSkipWorkflow?.(l,c)){await e.onSkipWorkflow?.(l,c);return}let p=await e.buildContext(l,c);s=n(),await r(p)}catch(i){$(i,{exit:!1})}finally{s&&tr(s)}}),t},Ca=(e,t)=>{let r=e.map(([n],o)=>[n.replace(/[<>[\]]/g,""),t[o]]);return Object.fromEntries(r)},In=(e,t)=>e.map(r=>typeof r=="function"?r(t):r)});var ae,Nn=S(()=>{"use strict";ae=(e,t)=>{let r=null;return(...n)=>(r&&clearTimeout(r),new Promise(o=>{r=setTimeout(async()=>{r=null,await e(...n),o()},t)}))}});var Fn=S(()=>{"use strict"});import{execaSync as ka}from"execa";function Ee(e){try{return ka(e,["--version"]),!0}catch{return!1}}var nr=S(()=>{"use strict"});var On=S(()=>{"use strict";nr()});import{readdirSync as xa}from"fs";import{dirname as Mn,isAbsolute as wa,join as Pa,normalize as Sa,resolve as Dn,sep as ba}from"path";import{fileURLToPath as Ea}from"url";import{packageUpSync as Ta}from"package-up";import{rimraf as $a}from"rimraf";function jn(){let e=Ta({cwd:Mn(Aa())});if(!e)throw new Error("Could not find package.json");return Mn(e)}var Aa,O,_n,et,Ln,or=S(()=>{"use strict";V();f();Aa=()=>typeof import.meta?.url=="string"?Ea(import.meta.url):process.cwd(),O=e=>{let t=sr()?g():process.cwd();return Pa(t,e)},_n=(e,t)=>{if(!e?.trim())throw new z("Path cannot be empty",e,{hint:"Provide a valid relative path"});if(wa(e))throw new z(`Absolute paths are not allowed: ${e}`,e,{hint:"Use a relative path within the target directory"});if(/^[a-zA-Z]:/.test(e))throw new z(`Windows drive paths are not allowed: ${e}`,e,{hint:"Use a relative path within the target directory"});if(e.replace(/\\/g,"/").split("/").some(a=>a===".."))throw new z(`Path traversal not allowed: ${e}`,e,{hint:"The path must stay within the target directory"});let o=Sa(e),s=Dn(t),i=Dn(t,o);if(!i.startsWith(s+ba)&&i!==s)throw new z(`Path escapes target directory: ${e}`,e,{hint:"The path must stay within the target directory"});return i},et=e=>{try{return xa(e).length===0}catch{return!0}};Ln=e=>$a(e)});import Te from"chalk";var Wn,Ia,Ra,tt,d,Hn=S(()=>{"use strict";Wn={debug:0,info:1,warn:2,error:3,silent:4},Ia=e=>e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent",Ra=()=>{let e=process.env.LOG_LEVEL;return Ia(e)?e:process.env.DEBUG==="true"||process.env.VERBOSE==="true"?"debug":"info"},tt=e=>{let t=Ra();return Wn[e]>=Wn[t]},d={logs:[],breakLine:()=>(console.log(),d),success:(e,...t)=>(console.log(Te.green(`\u2714 ${e}`),...t),d),info:(e,...t)=>(tt("info")&&console.log(Te.cyan(`\u{1F6C8} ${e}`),...t),d),warn:(e,...t)=>(tt("warn")&&console.warn(Te.yellow(`\u26A0\uFE0E ${e}`),...t),d),error:(e,...t)=>(tt("error")&&console.error(Te.red(`\u2716 ${e}`),...t),d),debug:(e,...t)=>(tt("debug")&&console.log(Te.dim(`[debug] ${e}`),...t),d),log:(e,...t)=>(console.log(e,...t),d.logs.push({message:e,context:t.join()}),d),getStoredLogs:e=>e?d.logs.filter(t=>t.context?.includes(e)):d.logs,storeLog:(e,t)=>d.logs.push({message:e,context:t})}});var Gn=S(()=>{"use strict"});import Na from"chalk";async function M(e,t){let r=Date.now(),n=e.title,o=()=>Math.floor((Date.now()-r)/1e3),s=setInterval(()=>{o()>1&&(e.title=`${n} (${o()}s)`)},1e3);try{return await t(o)}finally{clearInterval(s)}}async function rt(e,t,r){for(let n=0;n<t.length;n++){let o=t[n];e.output=Na.dim(`[${n+1}/${t.length}] ${o.title}`),await o.fn(r??{},e)}}var Bn=S(()=>{"use strict"});var v=S(()=>{"use strict";bn();Rn();Nn();Fn();On();or();Hn();Gn();nr();Bn()});var Jn={};aa(Jn,{discoverAvailableServices:()=>at,findWorkspaceRoot:()=>g,getContractsConfig:()=>x,getGeneratorConfig:()=>ce,getPackageJsonField:()=>Va,getPfConfig:()=>Ie,getPkgJson:()=>cr,getRootPackageScope:()=>st,getWorkspacePackageJson:()=>F,getWorkspacePathsConfig:()=>E,isInWorkspace:()=>sr,pkgJson:()=>R,readPackageConfig:()=>Re,updatePackageJsonField:()=>it});import{existsSync as Ae,readdirSync as Fa,readFileSync as Un,writeFileSync as Oa}from"fs";import{join as I,resolve as Ma}from"path";var ar,Da,_a,ja,$e,La,ot,nt,Wa,Ha,zn,Ga,Ba,Vn,sr,g,F,E,Ie,x,st,Ua,za,Va,it,Re,ir,cr,R,ce,at,f=S(()=>{"use strict";Ze();v();ar=e=>JSON.parse(Un(e,"utf-8")),Da=ar,_a=(e,t,r)=>Oa(e,`${JSON.stringify(t,null,2)}
9
- `,"utf-8"),ja=["@crossdelta/cloudevents"],$e={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},La={docs:{base:["service.md"],frameworks:{}},serviceTypes:{hono:{commandType:"hono-micro",entryPoint:"src/index.ts",skipFiles:[]},nest:{commandType:"nest-micro",entryPoint:"src/main.ts",skipFiles:[]}}},ot=e=>{if(!Ae(e))return null;try{return JSON.parse(Un(e,"utf-8"))}catch{return null}},nt=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,Wa=e=>e.split("/").pop()||"workspace",Ha=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},zn=e=>e.split("."),Ga=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||Ae(I(t,"turbo.json")))return!0;let r=Sn.some(o=>Ae(I(t,o))),n=Ae(I(t,"infra"));return r&&n},Ba=e=>{let t=ot(I(e,"package.json"));return t?Ga(t,e):!1},Vn=e=>{let t=e;for(;t;){if(Ba(t))return t;t=Ha(t)}return null},sr=()=>Vn(process.cwd())!==null,g=()=>{let e=Vn(process.cwd());if(!e)throw new Error(`
8
+ `),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??"");let r=async o=>{e.prompts?.length&&await new An(In(e.prompts,o),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(o),await new An(In(e.actions,o),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(o),await e.onComplete?.(o)},n=()=>{try{let o=g();return En(o),o}catch{return null}};return t.action(async(...o)=>{let s=null;try{let i=o.at(-1),a=i.args,c=i.opts(),l=ka(e.arguments??[],a);if(e.shouldSkipWorkflow?.(l,c)){await e.onSkipWorkflow?.(l,c);return}let p=await e.buildContext(l,c);s=n(),await r(p)}catch(i){$(i,{exit:!1})}finally{s&&tr(s)}}),t},ka=(e,t)=>{let r=e.map(([n],o)=>[n.replace(/[<>[\]]/g,""),t[o]]);return Object.fromEntries(r)},In=(e,t)=>e.map(r=>typeof r=="function"?r(t):r)});var ae,Nn=S(()=>{"use strict";ae=(e,t)=>{let r=null;return(...n)=>(r&&clearTimeout(r),new Promise(o=>{r=setTimeout(async()=>{r=null,await e(...n),o()},t)}))}});var Fn=S(()=>{"use strict"});import{execaSync as xa}from"execa";function Ee(e){try{return xa(e,["--version"]),!0}catch{return!1}}var nr=S(()=>{"use strict"});var On=S(()=>{"use strict";nr()});import{readdirSync as wa}from"fs";import{dirname as Mn,isAbsolute as Pa,join as Sa,normalize as ba,resolve as Dn,sep as Ea}from"path";import{fileURLToPath as Ta}from"url";import{packageUpSync as $a}from"package-up";import{rimraf as Aa}from"rimraf";function jn(){let e=$a({cwd:Mn(Ia())});if(!e)throw new Error("Could not find package.json");return Mn(e)}var Ia,O,_n,et,Ln,or=S(()=>{"use strict";z();f();Ia=()=>typeof import.meta?.url=="string"?Ta(import.meta.url):process.cwd(),O=e=>{let t=sr()?g():process.cwd();return Sa(t,e)},_n=(e,t)=>{if(!e?.trim())throw new V("Path cannot be empty",e,{hint:"Provide a valid relative path"});if(Pa(e))throw new V(`Absolute paths are not allowed: ${e}`,e,{hint:"Use a relative path within the target directory"});if(/^[a-zA-Z]:/.test(e))throw new V(`Windows drive paths are not allowed: ${e}`,e,{hint:"Use a relative path within the target directory"});if(e.replace(/\\/g,"/").split("/").some(a=>a===".."))throw new V(`Path traversal not allowed: ${e}`,e,{hint:"The path must stay within the target directory"});let o=ba(e),s=Dn(t),i=Dn(t,o);if(!i.startsWith(s+Ea)&&i!==s)throw new V(`Path escapes target directory: ${e}`,e,{hint:"The path must stay within the target directory"});return i},et=e=>{try{return wa(e).length===0}catch{return!0}};Ln=e=>Aa(e)});import Te from"chalk";var Wn,Ra,Na,tt,d,Hn=S(()=>{"use strict";Wn={debug:0,info:1,warn:2,error:3,silent:4},Ra=e=>e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent",Na=()=>{let e=process.env.LOG_LEVEL;return Ra(e)?e:process.env.DEBUG==="true"||process.env.VERBOSE==="true"?"debug":"info"},tt=e=>{let t=Na();return Wn[e]>=Wn[t]},d={logs:[],breakLine:()=>(console.log(),d),success:(e,...t)=>(console.log(Te.green(`\u2714 ${e}`),...t),d),info:(e,...t)=>(tt("info")&&console.log(Te.cyan(`\u{1F6C8} ${e}`),...t),d),warn:(e,...t)=>(tt("warn")&&console.warn(Te.yellow(`\u26A0\uFE0E ${e}`),...t),d),error:(e,...t)=>(tt("error")&&console.error(Te.red(`\u2716 ${e}`),...t),d),debug:(e,...t)=>(tt("debug")&&console.log(Te.dim(`[debug] ${e}`),...t),d),log:(e,...t)=>(console.log(e,...t),d.logs.push({message:e,context:t.join()}),d),getStoredLogs:e=>e?d.logs.filter(t=>t.context?.includes(e)):d.logs,storeLog:(e,t)=>d.logs.push({message:e,context:t})}});var Gn=S(()=>{"use strict"});import Fa from"chalk";async function M(e,t){let r=Date.now(),n=e.title,o=()=>Math.floor((Date.now()-r)/1e3),s=setInterval(()=>{o()>1&&(e.title=`${n} (${o()}s)`)},1e3);try{return await t(o)}finally{clearInterval(s)}}async function rt(e,t,r){for(let n=0;n<t.length;n++){let o=t[n];e.output=Fa.dim(`[${n+1}/${t.length}] ${o.title}`),await o.fn(r??{},e)}}var Bn=S(()=>{"use strict"});var v=S(()=>{"use strict";bn();Rn();Nn();Fn();On();or();Hn();Gn();nr();Bn()});var Jn={};ca(Jn,{discoverAvailableServices:()=>at,findWorkspaceRoot:()=>g,getContractsConfig:()=>x,getGeneratorConfig:()=>ce,getPackageJsonField:()=>Ja,getPfConfig:()=>Ie,getPkgJson:()=>cr,getRootPackageScope:()=>st,getWorkspacePackageJson:()=>F,getWorkspacePathsConfig:()=>E,isInWorkspace:()=>sr,pkgJson:()=>R,readPackageConfig:()=>Re,updatePackageJsonField:()=>it});import{existsSync as Ae,readdirSync as Oa,readFileSync as Un,writeFileSync as Ma}from"fs";import{join as I,resolve as Da}from"path";var ar,_a,ja,La,$e,Wa,ot,nt,Ha,Ga,Vn,Ba,Ua,zn,sr,g,F,E,Ie,x,st,Va,za,Ja,it,Re,ir,cr,R,ce,at,f=S(()=>{"use strict";Ze();v();ar=e=>JSON.parse(Un(e,"utf-8")),_a=ar,ja=(e,t,r)=>Ma(e,`${JSON.stringify(t,null,2)}
9
+ `,"utf-8"),La=["@crossdelta/cloudevents"],$e={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},Wa={docs:{base:["service.md"],frameworks:{}},serviceTypes:{hono:{commandType:"hono-micro",entryPoint:"src/index.ts",skipFiles:[]},nest:{commandType:"nest-micro",entryPoint:"src/main.ts",skipFiles:[]}}},ot=e=>{if(!Ae(e))return null;try{return JSON.parse(Un(e,"utf-8"))}catch{return null}},nt=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,Ha=e=>e.split("/").pop()||"workspace",Ga=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},Vn=e=>e.split("."),Ba=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||Ae(I(t,"turbo.json")))return!0;let r=Sn.some(o=>Ae(I(t,o))),n=Ae(I(t,"infra"));return r&&n},Ua=e=>{let t=ot(I(e,"package.json"));return t?Ba(t,e):!1},zn=e=>{let t=e;for(;t;){if(Ua(t))return t;t=Ga(t)}return null},sr=()=>zn(process.cwd())!==null,g=()=>{let e=zn(process.cwd());if(!e)throw new Error(`
10
10
  \x1B[31m\u2716\x1B[0m Not in a workspace directory
11
11
 
12
12
  Current directory: ${process.cwd()}
@@ -16,35 +16,35 @@ This command must be run from within a workspace created with \x1B[36mpf new wor
16
16
  To create a new workspace, run:
17
17
 
18
18
  \x1B[36mpf new workspace my-platform\x1B[0m
19
- `);return e},F=e=>{let t=e??g();return ot(I(t,"package.json"))},E=e=>{let t=F(e);if(!t?.pf?.paths)return $e;let{paths:r}=t.pf;return{services:nt(r.services,$e.services),apps:nt(r.apps,$e.apps),packages:nt(r.packages,$e.packages),contracts:nt(r.contracts,$e.contracts)}},Ie=e=>{let t=F(e);return{plugins:t?.pf?.plugins??ja,dev:{filter:t?.pf?.dev?.filter??[]}}},x=e=>{let t=e??g(),r=E(t),n=I(t,r.contracts),s=ot(I(n,"package.json"))?.name??`${st()}/contracts`;return{packagePath:n,eventsPath:I(n,"src","events"),indexPath:I(n,"src","index.ts"),relativePath:r.contracts,packageName:s}},st=()=>{let e=g(),t=ot(I(e,"package.json")),r=`@${Wa(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:r},Ua=(e,t)=>{let r=zn(t),n=e;for(let o of r){if(n===null||typeof n!="object"||!(o in n))return;n=n[o]}return n},za=(e,t,r)=>{let n=zn(t),o=n[n.length-1],s=e;for(let i of n.slice(0,-1))(!(i in s)||typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];s[o]=r},Va=(e,t=process.cwd())=>{let r=ar(I(t,"package.json"));return Ua(r,e)},it=(e,t,r=process.cwd())=>{let n=I(r,"package.json"),o=ar(n);za(o,e,t),_a(n,o,{spaces:2,EOL:`
20
- `,encoding:"utf-8"})},Re=e=>{let t=jn();return Da(Ma(t,e))},ir=null,cr=()=>(ir||(ir=Re("package.json")),ir),R=new Proxy({},{get:(e,t)=>cr()[t]}),ce=()=>cr().generatorConfig??La,at=e=>{let t=e??g(),r=E(t),n=I(t,r.services);if(!Ae(n))return[];try{return Fa(n,{withFileTypes:!0}).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>`${r.services}/${s.name}`).sort()}catch{return[]}}});import{argv as Iu}from"process";import Je from"chalk";import{Command as Ru}from"commander";import Nu from"terminal-link";V();f();import pc from"chalk";import{Command as mc}from"commander";v();import{existsSync as oc}from"fs";import{join as sc}from"path";import{cwd as eo}from"process";import{execaSync as ic}from"execa";v();import{spawn as mr}from"child_process";import{resolve as Za}from"path";import{execa as Xa}from"execa";import{existsSync as Ja}from"fs";import{resolve as Ka}from"path";import{config as qa}from"dotenv";var lr=(e,t)=>{let r=Ka(t,e);return Ja(r)?qa({path:r,processEnv:{}}).parsed||{}:{}},Ya=e=>`${(e.includes("/")?e.split("/").pop()??e:e).toUpperCase().replace(/-/g,"_")}_PORT`,Kn=(e,t)=>{let r=lr(e,t),n=[];for(let[o,s]of Object.entries(r))if(o.endsWith("_PORT")&&s){let i=Number.parseInt(s,10);!Number.isNaN(i)&&i>0&&n.push({key:o,port:i})}return n},qn=(e,t)=>{let r=t.filter(o=>!o.startsWith("!"));if(r.length===0)return e.map(o=>o.port);let n=new Set(r.map(Ya));return[...new Set(e.filter(o=>n.has(o.key)).map(o=>o.port))]};var pr={...process.env,NODE_NO_WARNINGS:"1"},Qa=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",ec=(e,t,r)=>e?{...pr,...e}:t||r?{...pr,CI:"true"}:{...pr},tc=e=>e.includes("EEXIST")||e.includes("failed to link package");async function K(e,t,{cwd:r=process.cwd(),task:n,shell:o,context:s=e,quiet:i=!1,nonInteractive:a=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let l=Xa(e,t,{cwd:r,stdio:Qa(i,n,a),all:n||a?!0:void 0,shell:o??!0,env:ec(c,n,a)});l.all&&l.all.on("data",p=>{let m=p.toString().trim();n?(n.output=m,m.length&&d.storeLog(m,s)):a&&m.length&&console.log(m)}),await l}catch(l){let p=l instanceof Error?l.message:String(l);if(tc(p))return;throw new Error(rc(p))}}var rc=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function Yn(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:i=!1,onStdout:a,onStderr:c,onExit:l}=r,p=o?lr(o,n):{},m=Za(n,"node_modules",".bin"),y=process.env.PATH||"",j=`${m}:${y}`,be={...process.env,...p,PATH:j,FORCE_COLOR:"1"},N=mr(e,t,{cwd:n,env:be,stdio:["inherit",i?"pipe":"inherit","pipe"],detached:s});return a&&i&&N.stdout?.on("data",a),c&&N.stderr?.on("data",c),l&&N.on("exit",l),N}function Zn(e,t,r={}){let{cwd:n=process.cwd()}=r;mr(e,t,{cwd:n,stdio:"inherit"}).on("exit",s=>process.exit(s||0))}function Xn(e,t,r={}){let{cwd:n=process.cwd()}=r,o=t.length>0?`${e} ${t.join(" ")}`:e;mr(o,[],{cwd:n,env:process.env,stdio:"inherit",shell:!0}).on("exit",i=>process.exit(i||0))}async function Qn(e){let{execSync:t}=await import("child_process");for(let r of e)try{let o=t(`lsof -ti:${r}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
21
- `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}f();var ct=e=>Ee(e);function dr(e=process.cwd()){let t=r=>oc(sc(e,r));if(t("bun.lock")||t("bun.lockb"))return"bun";if(t("pnpm-lock.yaml"))return"pnpm";if(t("yarn.lock"))return"yarn";if(t("package-lock.json"))return"npm"}function b(e){return dr(e)??ac()}function ac(){return ct("bun")?"bun":ct("pnpm")?"pnpm":ct("yarn")?"yarn":"npm"}function to(){return["bun","pnpm","yarn","npm"].filter(ct)}async function L(e,t){let r=cc(e,t),{mergedOptions:n,packages:o}=r,{cwd:s=process.cwd(),flags:i=[],task:a,quiet:c}=n,l=n.packageManager??b(),p=[],m=Array.isArray(o)?o:[o];l==="bun"&&(m=m.map(j=>j.replace("git+ssh://",""))),l==="pnpm"&&(p.push("--config.engine-strict=false"),p.push("--no-frozen-lockfile")),["yarn","npm"].includes(l)&&p.push("--ignore-engines");let y=m.length?l==="npm"?["install",...i,...p,...m]:["add",...i,...p,...m]:["install",...i,...p];await K(l,y,{cwd:s,task:a,quiet:c})}async function ro(e){let t=["-g"],r=[...e.flags??[],...t];await L({...e,flags:r,packageManager:e.packageManager??b()})}function no(e,t,r){let{args:n,mergedOptions:o}=so(t??[],r),s=o.manager??b(),{command:i,args:a}=oo(s);console.log(`
19
+ `);return e},F=e=>{let t=e??g();return ot(I(t,"package.json"))},E=e=>{let t=F(e);if(!t?.pf?.paths)return $e;let{paths:r}=t.pf;return{services:nt(r.services,$e.services),apps:nt(r.apps,$e.apps),packages:nt(r.packages,$e.packages),contracts:nt(r.contracts,$e.contracts)}},Ie=e=>{let t=F(e);return{plugins:t?.pf?.plugins??La,dev:{filter:t?.pf?.dev?.filter??[]}}},x=e=>{let t=e??g(),r=E(t),n=I(t,r.contracts),s=ot(I(n,"package.json"))?.name??`${st()}/contracts`;return{packagePath:n,eventsPath:I(n,"src","events"),indexPath:I(n,"src","index.ts"),relativePath:r.contracts,packageName:s}},st=()=>{let e=g(),t=ot(I(e,"package.json")),r=`@${Ha(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:r},Va=(e,t)=>{let r=Vn(t),n=e;for(let o of r){if(n===null||typeof n!="object"||!(o in n))return;n=n[o]}return n},za=(e,t,r)=>{let n=Vn(t),o=n[n.length-1],s=e;for(let i of n.slice(0,-1))(!(i in s)||typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];s[o]=r},Ja=(e,t=process.cwd())=>{let r=ar(I(t,"package.json"));return Va(r,e)},it=(e,t,r=process.cwd())=>{let n=I(r,"package.json"),o=ar(n);za(o,e,t),ja(n,o,{spaces:2,EOL:`
20
+ `,encoding:"utf-8"})},Re=e=>{let t=jn();return _a(Da(t,e))},ir=null,cr=()=>(ir||(ir=Re("package.json")),ir),R=new Proxy({},{get:(e,t)=>cr()[t]}),ce=()=>cr().generatorConfig??Wa,at=e=>{let t=e??g(),r=E(t),n=I(t,r.services);if(!Ae(n))return[];try{return Oa(n,{withFileTypes:!0}).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>`${r.services}/${s.name}`).sort()}catch{return[]}}});import{argv as Nu}from"process";import Je from"chalk";import{Command as Fu}from"commander";import Ou from"terminal-link";z();f();import mc from"chalk";import{Command as dc}from"commander";v();import{existsSync as sc}from"fs";import{join as ic}from"path";import{cwd as eo}from"process";import{execaSync as ac}from"execa";v();import{spawn as mr}from"child_process";import{resolve as Xa}from"path";import{execa as Qa}from"execa";import{existsSync as Ka}from"fs";import{resolve as qa}from"path";import{config as Ya}from"dotenv";var lr=(e,t)=>{let r=qa(t,e);return Ka(r)?Ya({path:r,processEnv:{}}).parsed||{}:{}},Za=e=>`${(e.includes("/")?e.split("/").pop()??e:e).toUpperCase().replace(/-/g,"_")}_PORT`,Kn=(e,t)=>{let r=lr(e,t),n=[];for(let[o,s]of Object.entries(r))if(o.endsWith("_PORT")&&s){let i=Number.parseInt(s,10);!Number.isNaN(i)&&i>0&&n.push({key:o,port:i})}return n},qn=(e,t)=>{let r=t.filter(o=>!o.startsWith("!"));if(r.length===0)return e.map(o=>o.port);let n=new Set(r.map(Za));return[...new Set(e.filter(o=>n.has(o.key)).map(o=>o.port))]};var pr={...process.env,NODE_NO_WARNINGS:"1"},ec=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",tc=(e,t,r)=>e?{...pr,...e}:t||r?{...pr,CI:"true"}:{...pr},rc=e=>e.includes("EEXIST")||e.includes("failed to link package");async function K(e,t,{cwd:r=process.cwd(),task:n,shell:o,context:s=e,quiet:i=!1,nonInteractive:a=!1,env:c}={}){try{t.length===0&&(t=e.split(" ").slice(1));let l=Qa(e,t,{cwd:r,stdio:ec(i,n,a),all:n||a?!0:void 0,shell:o??!0,env:tc(c,n,a)});l.all&&l.all.on("data",p=>{let m=p.toString().trim();n?(n.output=m,m.length&&d.storeLog(m,s)):a&&m.length&&console.log(m)}),await l}catch(l){let p=l instanceof Error?l.message:String(l);if(rc(p))return;throw new Error(nc(p))}}var nc=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function Yn(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:i=!1,onStdout:a,onStderr:c,onExit:l}=r,p=o?lr(o,n):{},m=Xa(n,"node_modules",".bin"),y=process.env.PATH||"",j=`${m}:${y}`,be={...process.env,...p,PATH:j,FORCE_COLOR:"1"},N=mr(e,t,{cwd:n,env:be,stdio:["inherit",i?"pipe":"inherit","pipe"],detached:s});return a&&i&&N.stdout?.on("data",a),c&&N.stderr?.on("data",c),l&&N.on("exit",l),N}function Zn(e,t,r={}){let{cwd:n=process.cwd()}=r;mr(e,t,{cwd:n,stdio:"inherit"}).on("exit",s=>process.exit(s||0))}function Xn(e,t,r={}){let{cwd:n=process.cwd()}=r,o=t.length>0?`${e} ${t.join(" ")}`:e;mr(o,[],{cwd:n,env:process.env,stdio:"inherit",shell:!0}).on("exit",i=>process.exit(i||0))}async function Qn(e){let{execSync:t}=await import("child_process");for(let r of e)try{let o=t(`lsof -ti:${r}`,{encoding:"utf8",stdio:"pipe"}).trim().split(`
21
+ `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}f();var ct=e=>Ee(e);function dr(e=process.cwd()){let t=r=>sc(ic(e,r));if(t("bun.lock")||t("bun.lockb"))return"bun";if(t("pnpm-lock.yaml"))return"pnpm";if(t("yarn.lock"))return"yarn";if(t("package-lock.json"))return"npm"}function b(e){return dr(e)??cc()}function cc(){return ct("bun")?"bun":ct("pnpm")?"pnpm":ct("yarn")?"yarn":"npm"}function to(){return["bun","pnpm","yarn","npm"].filter(ct)}async function L(e,t){let r=lc(e,t),{mergedOptions:n,packages:o}=r,{cwd:s=process.cwd(),flags:i=[],task:a,quiet:c}=n,l=n.packageManager??b(),p=[],m=Array.isArray(o)?o:[o];l==="bun"&&(m=m.map(j=>j.replace("git+ssh://",""))),l==="pnpm"&&(p.push("--config.engine-strict=false"),p.push("--no-frozen-lockfile")),["yarn","npm"].includes(l)&&p.push("--ignore-engines");let y=m.length?l==="npm"?["install",...i,...p,...m]:["add",...i,...p,...m]:["install",...i,...p];await K(l,y,{cwd:s,task:a,quiet:c})}async function ro(e){let t=["-g"],r=[...e.flags??[],...t];await L({...e,flags:r,packageManager:e.packageManager??b()})}function no(e,t,r){let{args:n,mergedOptions:o}=so(t??[],r),s=o.manager??b(),{command:i,args:a}=oo(s);console.log(`
22
22
  Running command: ${i} ${[...a,e,...n].join(" ")}
23
- `),ic(i,[...a,e,...n],{cwd:o.cwd??eo(),stdio:"inherit",preferLocal:!0})}async function Ne(e,t,r){let{args:n,mergedOptions:o}=so(t??[],r),s=o.manager??b(),{command:i,args:a}=oo(s);await K(i,[...a,e,...n],o)}async function Fe(e,t){let{script:r,mergedOptions:n}=lc(e,t),o=n.packageManager??b();await K(o,["run",r,...n.args??[]],{cwd:n.cwd??eo(),task:n.task})}function oo(e){let r={bun:"bunx",pnpm:"npx",yarn:"npx",npm:"npx"}[e];if(!r)throw new Error(`No executor found for the detected package manager: ${e}`);let[n,...o]=r.split(" ");return{command:n,args:o}}function cc(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function so(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function lc(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var dc=e=>e==="yarn"?["npm","audit"]:["audit"],io=new mc("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{try{let r=g(),n=b(),o=dc(n),s=t.args||[];console.log(pc.dim(`Running ${n} ${[...o,...s].join(" ")}`)),Zn(n,[...o,...s],{cwd:r})}catch(r){$(r)}});import q from"chalk";import{existsSync as Ec,readFileSync as Tc,writeFileSync as $c}from"fs";import{homedir as Ac}from"os";import{join as Ic}from"path";import{createCipheriv as gc,createDecipheriv as uc,createHash as fc,randomBytes as hc}from"crypto";import{existsSync as yc,readFileSync as vc,writeFileSync as Cc}from"fs";import{homedir as ao,hostname as kc,userInfo as xc}from"os";import{join as wc}from"path";var gr=wc(ao(),".platform-sdk-keys"),co="aes-256-gcm",lo=()=>{let e=`${kc()}:${xc().username}:${ao()}`;return fc("sha256").update(e).digest()},po=()=>{if(!yc(gr))return{};try{return JSON.parse(vc(gr,"utf-8"))}catch{return{}}},Pc=e=>{Cc(gr,JSON.stringify(e,null,2),{mode:384})},Sc=e=>{let t=lo(),r=hc(16),n=gc(co,t,r),o=n.update(e,"utf8","hex");return o+=n.final("hex"),{iv:r.toString("hex"),tag:n.getAuthTag().toString("hex"),data:o}},bc=e=>{let t=lo(),r=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),o=uc(co,t,r);o.setAuthTag(n);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function mo(e,t){let r=po();r[e]=Sc(t),Pc(r)}async function lt(e){let r=po()[e];if(!r)return null;try{return bc(r)}catch{return null}}var Oe={openai:{id:"openai",name:"OpenAI",defaultApiKeyEnvVar:"OPENAI_API_KEY",defaultModel:"gpt-4o-mini",modelsApiUrl:"https://api.openai.com/v1/models",apiKeyUrl:"https://platform.openai.com/api-keys",buildHeaders:e=>({Authorization:`Bearer ${e}`}),parseModelsResponse:e=>e.data??[],modelFilters:[/^gpt-4/,/^gpt-3\.5/,/^o1/,/^o3/]},anthropic:{id:"anthropic",name:"Anthropic (Claude)",defaultApiKeyEnvVar:"ANTHROPIC_API_KEY",defaultModel:"claude-sonnet-4-20250514",modelsApiUrl:"https://api.anthropic.com/v1/models",apiKeyUrl:"https://console.anthropic.com/settings/keys",buildHeaders:e=>({"x-api-key":e,"anthropic-version":"2023-06-01"}),parseModelsResponse:e=>(e.data??[]).map(r=>({id:r.id,created:new Date(r.created_at).getTime()})),modelFilters:[/^claude-/]}};function go(){return Object.entries(Oe).map(([e,t])=>({name:t.name,value:e}))}function Me(e){let t=Oe[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var Q=Ic(Ac(),".platform-sdk-ai.json"),Rc=()=>{let e="anthropic",t=Oe[e];return{provider:e,model:t.defaultModel}},ur=Rc();function De(){return Ec(Q)}function pt(){if(!De())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=Tc(Q,"utf-8"),t=JSON.parse(e);return{...ur,...t}}catch{throw new Error(`Failed to load AI configuration from ${Q}. Please run 'pf setup --ai' again.`)}}function uo(e){let t=JSON.stringify(e,null,2);$c(Q,t,"utf-8")}async function fo(e,t){await mo(e,t)}async function ho(e){let t=await lt(e.provider);if(t)return t;let r=Oe[e.provider],n=process.env[r.defaultApiKeyEnvVar];if(n)return n;throw new Error("API key not found. Please run 'pf setup --ai' to configure your API key.")}var Nc=async(e,t,r,n)=>{let{createOpenAI:o}=await import("@ai-sdk/openai"),s=o({apiKey:r});if(n.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature}),p="";for await(let m of(await l).textStream)p+=m,n.onToken(m);return p}let{generateText:i}=await import("ai"),{text:a}=await i({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return a},Fc=async(e,t,r,n)=>{let{createAnthropic:o}=await import("@ai-sdk/anthropic"),s=o({apiKey:r});if(n.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature}),p="";for await(let m of(await l).textStream)p+=m,n.onToken(m);return p}let{generateText:i}=await import("ai"),{text:a}=await i({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return a};async function yo(e,t,r={}){let{system:n,maxTokens:o=4096,temperature:s=.7,onToken:i}=r,a=await ho(e);switch(e.provider){case"openai":return Nc(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});case"anthropic":return Fc(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}V();import{existsSync as es,readFileSync as ip,unlinkSync as ap,writeFileSync as cp}from"fs";import{join as ts,resolve as Xo}from"path";import{input as lp}from"@inquirer/prompts";import h from"chalk";import pp from"ora";import{existsSync as fr,readdirSync as Dc}from"fs";import{dirname as _c,join as vo}from"path";import{dirname as Oc}from"path";import{fileURLToPath as Mc}from"url";var W=e=>Oc(Mc(e));rr();var jc=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),ee=e=>{let t=e??jc(),r=o=>fr(vo(o,"package.json")),n=_c(t);if(r(t))return t;if(t==="/")throw new Error("Could not find package.json (package root)");return ee(n)},Co=(e,t)=>{let r=e.find(fr);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},ko=async e=>{let{getWorkspacePathsConfig:t}=await Promise.resolve().then(()=>(f(),Jn)),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=vo(e,o);if(!fr(s))return[];try{return Dc(s,{withFileTypes:!0}).filter(i=>i.isDirectory()&&i.name!==".gitkeep").map(i=>`${o}/${i.name}`)}catch{return[]}})};import{existsSync as cl,readFileSync as ll}from"fs";import{join as pl}from"path";import{Project as ml}from"ts-morph";import{deriveEventNames as Ly,getContractPaths as Wy,getStreamName as Hy}from"@crossdelta/cloudevents";import{existsSync as mt,readFileSync as xo,writeFileSync as Lc}from"fs";import{join as hr}from"path";import{getStreamName as Wc}from"@crossdelta/cloudevents";var wo=(e,t)=>{let r=hr(e,"src","index.ts");if(!mt(r))return!1;let n=xo(r,"utf-8"),o=t.toLowerCase();return new RegExp(`streams:\\s*\\[[^\\]]*['"]${t}['"]`).test(n)||n.includes(`stream: '${t}'`)?!0:new RegExp(`subjects:\\s*\\[.*['"]${o}\\.[*>]`).test(n)},Hc=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
23
+ `),ac(i,[...a,e,...n],{cwd:o.cwd??eo(),stdio:"inherit",preferLocal:!0})}async function Ne(e,t,r){let{args:n,mergedOptions:o}=so(t??[],r),s=o.manager??b(),{command:i,args:a}=oo(s);await K(i,[...a,e,...n],o)}async function Fe(e,t){let{script:r,mergedOptions:n}=pc(e,t),o=n.packageManager??b();await K(o,["run",r,...n.args??[]],{cwd:n.cwd??eo(),task:n.task})}function oo(e){let r={bun:"bunx",pnpm:"npx",yarn:"npx",npm:"npx"}[e];if(!r)throw new Error(`No executor found for the detected package manager: ${e}`);let[n,...o]=r.split(" ");return{command:n,args:o}}function lc(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function so(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function pc(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var gc=e=>e==="yarn"?["npm","audit"]:["audit"],io=new dc("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{try{let r=g(),n=b(),o=gc(n),s=t.args||[];console.log(mc.dim(`Running ${n} ${[...o,...s].join(" ")}`)),Zn(n,[...o,...s],{cwd:r})}catch(r){$(r)}});import q from"chalk";import{existsSync as Tc,readFileSync as $c,writeFileSync as Ac}from"fs";import{homedir as Ic}from"os";import{join as Rc}from"path";import{createCipheriv as uc,createDecipheriv as fc,createHash as hc,randomBytes as yc}from"crypto";import{existsSync as vc,readFileSync as Cc,writeFileSync as kc}from"fs";import{homedir as ao,hostname as xc,userInfo as wc}from"os";import{join as Pc}from"path";var gr=Pc(ao(),".platform-sdk-keys"),co="aes-256-gcm",lo=()=>{let e=`${xc()}:${wc().username}:${ao()}`;return hc("sha256").update(e).digest()},po=()=>{if(!vc(gr))return{};try{return JSON.parse(Cc(gr,"utf-8"))}catch{return{}}},Sc=e=>{kc(gr,JSON.stringify(e,null,2),{mode:384})},bc=e=>{let t=lo(),r=yc(16),n=uc(co,t,r),o=n.update(e,"utf8","hex");return o+=n.final("hex"),{iv:r.toString("hex"),tag:n.getAuthTag().toString("hex"),data:o}},Ec=e=>{let t=lo(),r=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),o=fc(co,t,r);o.setAuthTag(n);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function mo(e,t){let r=po();r[e]=bc(t),Sc(r)}async function lt(e){let r=po()[e];if(!r)return null;try{return Ec(r)}catch{return null}}var Oe={openai:{id:"openai",name:"OpenAI",defaultApiKeyEnvVar:"OPENAI_API_KEY",defaultModel:"gpt-4o-mini",modelsApiUrl:"https://api.openai.com/v1/models",apiKeyUrl:"https://platform.openai.com/api-keys",buildHeaders:e=>({Authorization:`Bearer ${e}`}),parseModelsResponse:e=>e.data??[],modelFilters:[/^gpt-4/,/^gpt-3\.5/,/^o1/,/^o3/]},anthropic:{id:"anthropic",name:"Anthropic (Claude)",defaultApiKeyEnvVar:"ANTHROPIC_API_KEY",defaultModel:"claude-sonnet-4-20250514",modelsApiUrl:"https://api.anthropic.com/v1/models",apiKeyUrl:"https://console.anthropic.com/settings/keys",buildHeaders:e=>({"x-api-key":e,"anthropic-version":"2023-06-01"}),parseModelsResponse:e=>(e.data??[]).map(r=>({id:r.id,created:new Date(r.created_at).getTime()})),modelFilters:[/^claude-/]}};function go(){return Object.entries(Oe).map(([e,t])=>({name:t.name,value:e}))}function Me(e){let t=Oe[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var Q=Rc(Ic(),".platform-sdk-ai.json"),Nc=()=>{let e="anthropic",t=Oe[e];return{provider:e,model:t.defaultModel}},ur=Nc();function De(){return Tc(Q)}function pt(){if(!De())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=$c(Q,"utf-8"),t=JSON.parse(e);return{...ur,...t}}catch{throw new Error(`Failed to load AI configuration from ${Q}. Please run 'pf setup --ai' again.`)}}function uo(e){let t=JSON.stringify(e,null,2);Ac(Q,t,"utf-8")}async function fo(e,t){await mo(e,t)}async function ho(e){let t=await lt(e.provider);if(t)return t;let r=Oe[e.provider],n=process.env[r.defaultApiKeyEnvVar];if(n)return n;throw new Error("API key not found. Please run 'pf setup --ai' to configure your API key.")}var Fc=async(e,t,r,n)=>{let{createOpenAI:o}=await import("@ai-sdk/openai"),s=o({apiKey:r});if(n.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature}),p="";for await(let m of(await l).textStream)p+=m,n.onToken(m);return p}let{generateText:i}=await import("ai"),{text:a}=await i({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return a},Oc=async(e,t,r,n)=>{let{createAnthropic:o}=await import("@ai-sdk/anthropic"),s=o({apiKey:r});if(n.onToken){let{streamText:c}=await import("ai"),l=c({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature}),p="";for await(let m of(await l).textStream)p+=m,n.onToken(m);return p}let{generateText:i}=await import("ai"),{text:a}=await i({model:s(t),prompt:e,system:n.system,maxOutputTokens:n.maxTokens,temperature:n.temperature});return a};async function yo(e,t,r={}){let{system:n,maxTokens:o=4096,temperature:s=.7,onToken:i}=r,a=await ho(e);switch(e.provider){case"openai":return Fc(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});case"anthropic":return Oc(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}z();import{existsSync as es,readFileSync as ap,unlinkSync as cp,writeFileSync as lp}from"fs";import{join as ts,resolve as Xo}from"path";import{input as pp}from"@inquirer/prompts";import h from"chalk";import mp from"ora";import{existsSync as fr,readdirSync as _c}from"fs";import{dirname as jc,join as vo}from"path";import{dirname as Mc}from"path";import{fileURLToPath as Dc}from"url";var W=e=>Mc(Dc(e));rr();var Lc=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),ee=e=>{let t=e??Lc(),r=o=>fr(vo(o,"package.json")),n=jc(t);if(r(t))return t;if(t==="/")throw new Error("Could not find package.json (package root)");return ee(n)},Co=(e,t)=>{let r=e.find(fr);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},ko=async e=>{let{getWorkspacePathsConfig:t}=await Promise.resolve().then(()=>(f(),Jn)),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=vo(e,o);if(!fr(s))return[];try{return _c(s,{withFileTypes:!0}).filter(i=>i.isDirectory()&&i.name!==".gitkeep").map(i=>`${o}/${i.name}`)}catch{return[]}})};import{existsSync as ll,readFileSync as pl}from"fs";import{join as ml}from"path";import{Project as dl}from"ts-morph";import{deriveEventNames as Hy,getContractPaths as Gy,getStreamName as By}from"@crossdelta/cloudevents";import{existsSync as mt,readFileSync as xo,writeFileSync as Wc}from"fs";import{join as hr}from"path";import{getStreamName as Hc}from"@crossdelta/cloudevents";var wo=(e,t)=>{let r=hr(e,"src","index.ts");if(!mt(r))return!1;let n=xo(r,"utf-8"),o=t.toLowerCase();return new RegExp(`streams:\\s*\\[[^\\]]*['"]${t}['"]`).test(n)||n.includes(`stream: '${t}'`)?!0:new RegExp(`subjects:\\s*\\[.*['"]${o}\\.[*>]`).test(n)},Gc=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
24
24
  `,r=e.match(/import\s+['"]@crossdelta\/telemetry['"]\s*\n/);if(r){let o=(r.index??0)+r[0].length;return`${e.slice(0,o)}
25
- ${t}${e.slice(o)}`}let n=e.match(/import\s+.*\n/);if(n){let o=(n.index??0)+n[0].length;return e.slice(0,o)+t+e.slice(o)}return e},Gc=(e,t)=>`
25
+ ${t}${e.slice(o)}`}let n=e.match(/import\s+.*\n/);if(n){let o=(n.index??0)+n[0].length;return e.slice(0,o)+t+e.slice(o)}return e},Bc=(e,t)=>`
26
26
 
27
27
  // Consume from ${e} stream
28
28
  consumeJetStreams({
29
29
  streams: ['${e}'],
30
30
  consumer: '${t}-service',
31
31
  discover: './src/events/**/*.handler.ts',
32
- })`,yr=(e,t)=>{let r=Wc(t),n=hr(e,"src","index.ts"),o=hr(e,"src","main.ts");if(!mt(n)&&mt(o))return{added:!1,streamName:r};if(!mt(n))return{added:!1,streamName:r,warning:"Entry point not found (index.ts or main.ts)"};if(wo(e,r))return{added:!1,streamName:r};let s=xo(n,"utf-8"),i=e.split("/").pop()||"unknown";s.includes("consumeJetStreams")||(s=Hc(s));let a=Gc(r,i),c=`${s.trimEnd()+a}
33
- `;return Lc(n,c,"utf-8"),{added:!0,streamName:r}};f();import{existsSync as ey,readFileSync as ty}from"fs";import{join as ny}from"path";import{contractCreated as sy,deriveEventNames as iy,generateContract as ay,getContractFilePath as cy}from"@crossdelta/cloudevents";import{readdirSync as Bc,readFileSync as Uc}from"fs";import{join as Po}from"path";import{getStreamName as zc,singularize as Vc}from"@crossdelta/cloudevents";var So=e=>{try{return Bc(e,{withFileTypes:!0}).flatMap(r=>{let n=Po(e,r.name);return r.isDirectory()?So(n):r.name.endsWith(".handler.ts")?[n]:[]})}catch{return[]}},vr=e=>{let t=Po(e,"src","events");return So(t).flatMap(n=>{let o=Uc(n,"utf-8");return Jc(n,o)})},Jc=(e,t)=>{let r=qc(t);if(!r)return[];let n=Kc(r);return n?[{filePath:e,eventType:n,contractName:r}]:[]},Kc=e=>{let r=e.replace(/Contract$/,"").match(/[A-Z][a-z]*/g);if(!r||r.length<2)return null;let n=r[0].toLowerCase(),o=Vc(n),i=r.slice(1).map(a=>a.toLowerCase()).join("-");return`${o}.${i}`},qc=e=>{let r=/import\s+{([^}]+)}\s+from\s+['"]@[\w-]+\/contracts['"]/.exec(e);return r?r[1].split(",").map(s=>s.trim()).filter(s=>s.endsWith("Contract")).map(s=>s.replace(/\s+as\s+.+$/,"").trim()).at(0)??null:null},Cr=e=>{let t=e.reduce((r,n)=>{let o=n.eventType.split(".")[0],s=r.get(o)??[];return r.set(o,[...s,n]),r},new Map);return Array.from(t.entries()).map(([r,n])=>Yc(r,n)).sort((r,n)=>r.stream.localeCompare(n.stream))},Yc=(e,t)=>{let r=zc(t[0]?.eventType??`${e}.event`),n=`${e}.>`;return{stream:r,subjects:[n],handlers:t}},kr=(e,t)=>e.length===0?"":` // Development: pf dev auto-creates ephemeral streams from contracts
32
+ })`,yr=(e,t)=>{let r=Hc(t),n=hr(e,"src","index.ts"),o=hr(e,"src","main.ts");if(!mt(n)&&mt(o))return{added:!1,streamName:r};if(!mt(n))return{added:!1,streamName:r,warning:"Entry point not found (index.ts or main.ts)"};if(wo(e,r))return{added:!1,streamName:r};let s=xo(n,"utf-8"),i=e.split("/").pop()||"unknown";s.includes("consumeJetStreams")||(s=Gc(s));let a=Bc(r,i),c=`${s.trimEnd()+a}
33
+ `;return Wc(n,c,"utf-8"),{added:!0,streamName:r}};f();import{existsSync as ry,readFileSync as ny}from"fs";import{join as sy}from"path";import{contractCreated as ay,deriveEventNames as cy,generateContract as ly,getContractFilePath as py}from"@crossdelta/cloudevents";import{readdirSync as Uc,readFileSync as Vc}from"fs";import{join as Po}from"path";import{getStreamName as zc,singularize as Jc}from"@crossdelta/cloudevents";var So=e=>{try{return Uc(e,{withFileTypes:!0}).flatMap(r=>{let n=Po(e,r.name);return r.isDirectory()?So(n):r.name.endsWith(".handler.ts")?[n]:[]})}catch{return[]}},vr=e=>{let t=Po(e,"src","events");return So(t).flatMap(n=>{let o=Vc(n,"utf-8");return Kc(n,o)})},Kc=(e,t)=>{let r=Yc(t);if(!r)return[];let n=qc(r);return n?[{filePath:e,eventType:n,contractName:r}]:[]},qc=e=>{let r=e.replace(/Contract$/,"").match(/[A-Z][a-z]*/g);if(!r||r.length<2)return null;let n=r[0].toLowerCase(),o=Jc(n),i=r.slice(1).map(a=>a.toLowerCase()).join("-");return`${o}.${i}`},Yc=e=>{let r=/import\s+{([^}]+)}\s+from\s+['"]@[\w-]+\/contracts['"]/.exec(e);return r?r[1].split(",").map(s=>s.trim()).filter(s=>s.endsWith("Contract")).map(s=>s.replace(/\s+as\s+.+$/,"").trim()).at(0)??null:null},Cr=e=>{let t=e.reduce((r,n)=>{let o=n.eventType.split(".")[0],s=r.get(o)??[];return r.set(o,[...s,n]),r},new Map);return Array.from(t.entries()).map(([r,n])=>Zc(r,n)).sort((r,n)=>r.stream.localeCompare(n.stream))},Zc=(e,t)=>{let r=zc(t[0]?.eventType??`${e}.event`),n=`${e}.>`;return{stream:r,subjects:[n],handlers:t}},kr=(e,t)=>e.length===0?"":` // Development: pf dev auto-creates ephemeral streams from contracts
34
34
  // Production: Pulumi materializes persistent streams
35
35
 
36
36
  consumeJetStreams({
37
37
  streams: [${e.map(r=>`'${r.stream}'`).join(", ")}],
38
38
  consumer: '${t}',
39
39
  discover: './src/events/**/*.handler.ts',
40
- })`;f();import{existsSync as te,mkdirSync as Zc,readFileSync as dt,writeFileSync as pe}from"fs";import{dirname as bo,join as le}from"path";import{deriveEventNames as Xc}from"@crossdelta/cloudevents";var Qc=(e,t)=>{let r=`export * from './${t}'`;if(!te(e)){let s=bo(e);te(s)||Zc(s,{recursive:!0});let i=`/**
40
+ })`;f();import{existsSync as te,mkdirSync as Xc,readFileSync as dt,writeFileSync as pe}from"fs";import{dirname as bo,join as le}from"path";import{deriveEventNames as Qc}from"@crossdelta/cloudevents";var el=(e,t)=>{let r=`export * from './${t}'`;if(!te(e)){let s=bo(e);te(s)||Xc(s,{recursive:!0});let i=`/**
41
41
  * ${bo(e).split("/").pop()} Domain Events
42
42
  */
43
43
 
44
44
  `;return pe(e,`${i+r}
45
45
  `,"utf-8"),!0}let n=dt(e,"utf-8");if(n.includes(`'./${t}'`))return!1;let o=`${n.trimEnd()}
46
46
  ${r}
47
- `;return pe(e,o,"utf-8"),!0},el=(e,t)=>{let r=`export * from './${t}'`;if(!te(e))return pe(e,`/**
47
+ `;return pe(e,o,"utf-8"),!0},tl=(e,t)=>{let r=`export * from './${t}'`;if(!te(e))return pe(e,`/**
48
48
  * Event Contracts Index
49
49
  *
50
50
  * Re-exports all event contracts for convenient importing.
@@ -53,17 +53,17 @@ ${r}
53
53
  ${r}
54
54
  `,"utf-8"),!0;let o=dt(e,"utf-8").split(`
55
55
  `);if(o.some(i=>i.trim()===r))return!1;let s=o.findLastIndex(i=>i.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push(r),pe(e,o.join(`
56
- `),"utf-8"),!0},tl=e=>{if(!te(e))return!1;let t=dt(e,"utf-8"),r="export * from './events'";if(t.split(`
56
+ `),"utf-8"),!0},rl=e=>{if(!te(e))return!1;let t=dt(e,"utf-8"),r="export * from './events'";if(t.split(`
57
57
  `).some(s=>s.trim()===r||s.trim().startsWith(r)))return!1;let o=t;return o=o.replace(/\/\/\s*export \* from '\.\/events'/,r),o=o.replace(/\/\/\s*export \* from '\.\/stream-policies'/,"export * from './stream-policies'"),/export \* from '\.\/events\/\w+\/\w+'/.test(o)&&(o=o.replace(/export \* from '\.\/events\/\w+\/\w+'\n?/g,"")),o.includes(r)||(o=`${o.trimEnd()}
58
58
  ${r}
59
- `),o!==t?(pe(e,o,"utf-8"),!0):!1},xr=(e,t)=>{let{packagePath:r}=x(t),{domain:n,action:o}=Xc(e),s=le(r,"src","events");if(!te(s))return!1;let i=le(s,n),a=le(i,"index.ts"),c=le(s,"index.ts"),l=le(r,"src","index.ts"),p=e.split(".")[0],m=le(s,p);p!==n&&te(m)&&(console.warn(`\u26A0\uFE0F Warning: Legacy folder '${p}/' found. Please migrate to '${n}/' to avoid conflicts.`),console.warn(` Run: mv ${m} ${i}`));let y=!1;return Qc(a,o)&&(y=!0),el(c,n)&&(y=!0),tl(l)&&(y=!0),y},wr=(e,t)=>{if(!te(e))return!1;let r=`export * from './events/${t}'`,n=dt(e,"utf-8");if(n.includes(`'./events/${t}'`))return!1;let o=n.split(`
59
+ `),o!==t?(pe(e,o,"utf-8"),!0):!1},xr=(e,t)=>{let{packagePath:r}=x(t),{domain:n,action:o}=Qc(e),s=le(r,"src","events");if(!te(s))return!1;let i=le(s,n),a=le(i,"index.ts"),c=le(s,"index.ts"),l=le(r,"src","index.ts"),p=e.split(".")[0],m=le(s,p);p!==n&&te(m)&&(console.warn(`\u26A0\uFE0F Warning: Legacy folder '${p}/' found. Please migrate to '${n}/' to avoid conflicts.`),console.warn(` Run: mv ${m} ${i}`));let y=!1;return el(a,o)&&(y=!0),tl(c,n)&&(y=!0),rl(l)&&(y=!0),y},wr=(e,t)=>{if(!te(e))return!1;let r=`export * from './events/${t}'`,n=dt(e,"utf-8");if(n.includes(`'./events/${t}'`))return!1;let o=n.split(`
60
60
  `),s=o.findLastIndex(i=>i.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push("",r),pe(e,o.join(`
61
- `),"utf-8"),!0};f();import{existsSync as Eo,readdirSync as nl,readFileSync as ol}from"fs";import{join as To}from"path";import{generateJsonMockFromContract as sl,getJsonMockPath as il,initFaker as al}from"@crossdelta/cloudevents";var $o=e=>{let t=e.match(/handleEvent\s*\(\s*(\w+Contract)/m);if(t){let n=e.match(/type:\s*['"]([^'"]+)['"]/m);if(n)return n[1]}let r=e.match(/handleEvent\s*\(\s*\{[^}]*type:\s*['"]([^'"]+)['"]/m);if(r)return r[1];if(t){let s=t[1].replace(/Contract$/,"").split(/(?=[A-Z])/).filter(Boolean);if(s.length>=2){let i=s[0].toLowerCase(),a=s.slice(1).join("").toLowerCase();return`${i}.${a}`}}return null};var Pr=async(e,t={})=>{let r=To(e,"src","events");if(!Eo(r))return{mockPaths:[],skippedHandlers:[]};await al();let n=nl(r).filter(i=>i.endsWith(".handler.ts")||i.endsWith(".event.ts")),o=[],s=[];for(let i of n){let a=To(r,i),c=ol(a,"utf-8"),l=$o(c);if(!l){s.push(`${i} (Could not extract event type)`);continue}let p=t.outputDir??x().packagePath,m=il(l,p);if(Eo(m)&&!t.overwrite){s.push(`${i} (Mock already exists)`);continue}let y=sl(l,p,{useFaker:!0});y&&y.status!=="skipped"&&"ref"in y?o.push(y.ref):s.push(`${i} (Contract not found or generation failed)`)}return{mockPaths:o,skippedHandlers:s}};var Ao=e=>{let t=e.split("/").pop()||"service",r=pl(e,"src","events","events.service.ts");if(!cl(r))return!1;let n=vr(e);if(n.length===0||ll(r,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let a=Cr(n),c=kr(a,t);if(!c)return!1;let l=new ml({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(r),m=!1;for(let y of p.getClasses()){let j=y.getMethod("startConsumers");if(!j)continue;let N=[...c.split(`
61
+ `),"utf-8"),!0};f();import{existsSync as Eo,readdirSync as ol,readFileSync as sl}from"fs";import{join as To}from"path";import{generateJsonMockFromContract as il,getJsonMockPath as al,initFaker as cl}from"@crossdelta/cloudevents";var $o=e=>{let t=e.match(/handleEvent\s*\(\s*(\w+Contract)/m);if(t){let n=e.match(/type:\s*['"]([^'"]+)['"]/m);if(n)return n[1]}let r=e.match(/handleEvent\s*\(\s*\{[^}]*type:\s*['"]([^'"]+)['"]/m);if(r)return r[1];if(t){let s=t[1].replace(/Contract$/,"").split(/(?=[A-Z])/).filter(Boolean);if(s.length>=2){let i=s[0].toLowerCase(),a=s.slice(1).join("").toLowerCase();return`${i}.${a}`}}return null};var Pr=async(e,t={})=>{let r=To(e,"src","events");if(!Eo(r))return{mockPaths:[],skippedHandlers:[]};await cl();let n=ol(r).filter(i=>i.endsWith(".handler.ts")||i.endsWith(".event.ts")),o=[],s=[];for(let i of n){let a=To(r,i),c=sl(a,"utf-8"),l=$o(c);if(!l){s.push(`${i} (Could not extract event type)`);continue}let p=t.outputDir??x().packagePath,m=al(l,p);if(Eo(m)&&!t.overwrite){s.push(`${i} (Mock already exists)`);continue}let y=il(l,p,{useFaker:!0});y&&y.status!=="skipped"&&"ref"in y?o.push(y.ref):s.push(`${i} (Contract not found or generation failed)`)}return{mockPaths:o,skippedHandlers:s}};var Ao=e=>{let t=e.split("/").pop()||"service",r=ml(e,"src","events","events.service.ts");if(!ll(r))return!1;let n=vr(e);if(n.length===0||pl(r,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let a=Cr(n),c=kr(a,t);if(!c)return!1;let l=new dl({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(r),m=!1;for(let y of p.getClasses()){let j=y.getMethod("startConsumers");if(!j)continue;let N=[...c.split(`
62
62
  `),""," this.logger.log('Event consumers started successfully')"].join(`
63
- `);j.setBodyText(N),m=!0;break}return m&&l.saveSync(),m};f();var dl=e=>{let t=e.split(/\s+/),r=t[0],n=t.slice(1);return r==="pf"&&(r=process.argv[1]),{executable:r,args:n}},gl=async(e,t)=>{try{let{executable:r,args:n}=dl(e.command);return await K(r,n,{cwd:t,shell:!1}),{command:e.command,success:!0}}catch(r){return{command:e.command,success:!1,error:r instanceof Error?r.message:String(r)}}},Sr=async(e,t)=>{let r=[];for(let n of e){let o=await gl(n,t);if(r.push(o),!o.success)break}return r},br=e=>{let t=[/^pf\s+/,/^bun\s+pf\s+/,/^npx\s+pf\s+/,/^bunx\s+pf\s+/];return e.filter(r=>t.some(n=>n.test(r.command)))},Io=e=>{for(let t of e){let r=t.command.match(/(?:bun\s+)?pf\s+new\s+\S+\s+(\S+)/);if(r)return r[1]}return null};import{existsSync as Fo,readFileSync as vl}from"fs";import{join as Er}from"path";import G from"chalk";f();or();import{existsSync as Ro,mkdirSync as ul,writeFileSync as fl}from"fs";import{dirname as hl}from"path";var yl=(e,t)=>{let n=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o;try{o=_n(e.path,n)}catch(s){return{status:"failed",path:e.path,error:s.message}}try{if(Ro(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=hl(o);return Ro(s)||ul(s,{recursive:!0}),fl(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},No=(e,t)=>{let r=e.map(n=>yl(n,t));return{written:r.filter(n=>n.status==="written").map(n=>n.path),skipped:r.filter(n=>n.status==="skipped").map(n=>n.path),failed:r.filter(n=>n.status==="failed").map(n=>({path:n.path,error:n.error}))}};var Cl=(e,t)=>{let r=E(t.workspaceRoot),n=Er(t.workspaceRoot,r.contracts);if(!Fo(n))return[];let o=/import\s+(?:type\s+)?{([^}]+)}\s+from\s+['"]@\w+\/contracts['"]/g,s=new Set;for(let i of e){let a=i.content.matchAll(o);for(let c of a){let p=c[1].split(",").map(m=>m.trim()).map(m=>m.replace(/^type\s+/,"").replace(/\s+as\s+.+$/,"").trim()).filter(m=>m.endsWith("Contract"));for(let m of p)s.add(m)}}return Array.from(s).sort()},kl=e=>{let t=Er(e,"packages/contracts/src/index.ts");if(!Fo(t))return new Set;try{let r=vl(t,"utf-8"),n=new Set,o=/export\s+(?:\*|{[^}]*Contract[^}]*})\s+from\s+['"]\.\/events\/([^'"]+)['"]/g,s=r.matchAll(o);for(let i of s){let a=i[0],c=/(\w+Contract)/g,l=a.matchAll(c);for(let p of l)n.add(p[1])}return n}catch{return new Set}},xl=e=>{let t=e.replace(/Contract$/,""),r=t.split(/(?=[A-Z])/).filter(Boolean);if(r.length<2)return t.toLowerCase();let n=r[0].toLowerCase(),o=r.slice(1).join("").toLowerCase();return`${n}.${o}`},wl=(e,t,r)=>{let n=kl(t),o=[],s=[],i=[];for(let a of e)if(n.has(a))o.push(a);else{s.push(a);let c=xl(a),l=r.replace(`${t}/`,"");i.push(`pf cloudevents add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:i}},Pl=(e,t)=>{if(e.length!==0){console.log(G.cyan(`\u{1F4E6} Using existing contracts:
64
- `));for(let r of e)console.log(G.dim(` ${t}/contracts \u2192 ${r}`));console.log()}},Sl=(e,t)=>{let r=/^packages\/contracts\/src\/events\/([^/]+)\.ts$/,n=Er(t,"packages/contracts/src/index.ts");for(let o of e){let s=o.match(r);s&&s[1]!=="index"&&wr(n,s[1])}},Oo=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")}},bl=async(e,t)=>{t.start("Scanning for event handlers...");let{mockPaths:r,skippedHandlers:n}=await Pr(e);if(r.length+n.length===0){t.info("No event handlers found");return}if(r.length>0){t.succeed(`Generated ${r.length} event ${r.length===1?"mock":"mocks"}`),console.log();for(let s of r){let i=s.replace(`${e}/`,"");console.log(G.dim(` ${i}`))}console.log()}else t.succeed("Event handlers found");if(n.length>0){for(let s of n)console.log(G.dim(` \u2139 Skipped: ${s}`));console.log()}},Mo=async(e,t,r,n)=>{n.start("Writing generated files...");let o=No(e,{baseDir:t,workspaceRoot:r.workspaceRoot,overwrite:!0});if(o.written.length>0){n.succeed(`Created ${o.written.length} files`),console.log();for(let l of o.written)console.log(G.dim(` ${l}`));console.log()}else n.succeed("No files to write");let s=Cl(e,r),{existing:i,missing:a,suggestedCommands:c}=wl(s,r.workspaceRoot,t);if(i.length>0&&Pl(i,r.scope),a.length>0){console.log(G.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${r.scope}/contracts):
63
+ `);j.setBodyText(N),m=!0;break}return m&&l.saveSync(),m};f();var gl=e=>{let t=e.split(/\s+/),r=t[0],n=t.slice(1);return r==="pf"&&(r=process.argv[1]),{executable:r,args:n}},ul=async(e,t)=>{try{let{executable:r,args:n}=gl(e.command);return await K(r,n,{cwd:t,shell:!1}),{command:e.command,success:!0}}catch(r){return{command:e.command,success:!1,error:r instanceof Error?r.message:String(r)}}},Sr=async(e,t)=>{let r=[];for(let n of e){let o=await ul(n,t);if(r.push(o),!o.success)break}return r},br=e=>{let t=[/^pf\s+/,/^bun\s+pf\s+/,/^npx\s+pf\s+/,/^bunx\s+pf\s+/];return e.filter(r=>t.some(n=>n.test(r.command)))},Io=e=>{for(let t of e){let r=t.command.match(/(?:bun\s+)?pf\s+new\s+\S+\s+(\S+)/);if(r)return r[1]}return null};import{existsSync as Fo,readFileSync as Cl}from"fs";import{join as Er}from"path";import G from"chalk";f();or();import{existsSync as Ro,mkdirSync as fl,writeFileSync as hl}from"fs";import{dirname as yl}from"path";var vl=(e,t)=>{let n=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o;try{o=_n(e.path,n)}catch(s){return{status:"failed",path:e.path,error:s.message}}try{if(Ro(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=yl(o);return Ro(s)||fl(s,{recursive:!0}),hl(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},No=(e,t)=>{let r=e.map(n=>vl(n,t));return{written:r.filter(n=>n.status==="written").map(n=>n.path),skipped:r.filter(n=>n.status==="skipped").map(n=>n.path),failed:r.filter(n=>n.status==="failed").map(n=>({path:n.path,error:n.error}))}};var kl=(e,t)=>{let r=E(t.workspaceRoot),n=Er(t.workspaceRoot,r.contracts);if(!Fo(n))return[];let o=/import\s+(?:type\s+)?{([^}]+)}\s+from\s+['"]@\w+\/contracts['"]/g,s=new Set;for(let i of e){let a=i.content.matchAll(o);for(let c of a){let p=c[1].split(",").map(m=>m.trim()).map(m=>m.replace(/^type\s+/,"").replace(/\s+as\s+.+$/,"").trim()).filter(m=>m.endsWith("Contract"));for(let m of p)s.add(m)}}return Array.from(s).sort()},xl=e=>{let t=Er(e,"packages/contracts/src/index.ts");if(!Fo(t))return new Set;try{let r=Cl(t,"utf-8"),n=new Set,o=/export\s+(?:\*|{[^}]*Contract[^}]*})\s+from\s+['"]\.\/events\/([^'"]+)['"]/g,s=r.matchAll(o);for(let i of s){let a=i[0],c=/(\w+Contract)/g,l=a.matchAll(c);for(let p of l)n.add(p[1])}return n}catch{return new Set}},wl=e=>{let t=e.replace(/Contract$/,""),r=t.split(/(?=[A-Z])/).filter(Boolean);if(r.length<2)return t.toLowerCase();let n=r[0].toLowerCase(),o=r.slice(1).join("").toLowerCase();return`${n}.${o}`},Pl=(e,t,r)=>{let n=xl(t),o=[],s=[],i=[];for(let a of e)if(n.has(a))o.push(a);else{s.push(a);let c=wl(a),l=r.replace(`${t}/`,"");i.push(`pf cloudevents add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:i}},Sl=(e,t)=>{if(e.length!==0){console.log(G.cyan(`\u{1F4E6} Using existing contracts:
64
+ `));for(let r of e)console.log(G.dim(` ${t}/contracts \u2192 ${r}`));console.log()}},bl=(e,t)=>{let r=/^packages\/contracts\/src\/events\/([^/]+)\.ts$/,n=Er(t,"packages/contracts/src/index.ts");for(let o of e){let s=o.match(r);s&&s[1]!=="index"&&wr(n,s[1])}},Oo=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")}},El=async(e,t)=>{t.start("Scanning for event handlers...");let{mockPaths:r,skippedHandlers:n}=await Pr(e);if(r.length+n.length===0){t.info("No event handlers found");return}if(r.length>0){t.succeed(`Generated ${r.length} event ${r.length===1?"mock":"mocks"}`),console.log();for(let s of r){let i=s.replace(`${e}/`,"");console.log(G.dim(` ${i}`))}console.log()}else t.succeed("Event handlers found");if(n.length>0){for(let s of n)console.log(G.dim(` \u2139 Skipped: ${s}`));console.log()}},Mo=async(e,t,r,n)=>{n.start("Writing generated files...");let o=No(e,{baseDir:t,workspaceRoot:r.workspaceRoot,overwrite:!0});if(o.written.length>0){n.succeed(`Created ${o.written.length} files`),console.log();for(let l of o.written)console.log(G.dim(` ${l}`));console.log()}else n.succeed("No files to write");let s=kl(e,r),{existing:i,missing:a,suggestedCommands:c}=Pl(s,r.workspaceRoot,t);if(i.length>0&&Sl(i,r.scope),a.length>0){console.log(G.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${r.scope}/contracts):
65
65
  `));for(let l of a)console.log(G.yellow(` ${l}`));console.log(),console.log(G.cyan(`\u{1F4A1} Run these commands to create the missing contracts:
66
- `));for(let l of c)console.log(G.dim(` ${l}`));console.log()}return Sl(o.written,r.workspaceRoot),o.written.length>0&&await bl(t,n),{missingContractCommands:c}};f();import{existsSync as Fl,readFileSync as Ol}from"fs";import{join as _e}from"path";f();f();import{existsSync as El,readdirSync as Tl,readFileSync as $l}from"fs";import{join as Al}from"path";var Do=e=>{let{eventsPath:t}=x(e);if(!El(t))return[];let r=[];try{let n=Tl(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of n){let s=Al(t,o),i=$l(s,"utf-8"),a=Il(i,s);a&&r.push(a)}}catch(n){return console.warn("Warning: Could not scan contracts package:",n),[]}return r},Il=(e,t)=>{try{let r=e.match(/export const (\w+Contract) = createContract/);if(!r)return null;let n=r[1],o=e.match(/export type (\w+(?:Data|Event)) = z\.infer/);if(!o)return null;let s=o[1],i=e.match(/type:\s*['"]([^'"]+)['"]/);if(!i)return null;let a=i[1],c=Nl(e);return{name:n,typeName:s,eventType:a,fields:c,filePath:t}}catch{return null}},Rl={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},Nl=e=>{let t=e.match(/z\.object\({([^}]+)\}/);if(!t)return[];let r=t[1],n=/(\w+):\s*z\.(\w+)\([^)]*\)/g,o=[...r.matchAll(n)].map(([,a,c])=>{let l=Rl[c]||c;return`${a}: ${l}`});if(!e.includes("z.array("))return o;let s=/(\w+):\s*z\.array\(/g,i=[...e.matchAll(s)].map(([,a])=>a).filter(a=>!o.some(c=>c.startsWith(a))).map(a=>`${a}: array`);return[...o,...i]},_o=(e,t)=>{if(e.length===0)return`
66
+ `));for(let l of c)console.log(G.dim(` ${l}`));console.log()}return bl(o.written,r.workspaceRoot),o.written.length>0&&await El(t,n),{missingContractCommands:c}};f();import{existsSync as Ol,readFileSync as Ml}from"fs";import{join as _e}from"path";f();f();import{existsSync as Tl,readdirSync as $l,readFileSync as Al}from"fs";import{join as Il}from"path";var Do=e=>{let{eventsPath:t}=x(e);if(!Tl(t))return[];let r=[];try{let n=$l(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of n){let s=Il(t,o),i=Al(s,"utf-8"),a=Rl(i,s);a&&r.push(a)}}catch(n){return console.warn("Warning: Could not scan contracts package:",n),[]}return r},Rl=(e,t)=>{try{let r=e.match(/export const (\w+Contract) = createContract/);if(!r)return null;let n=r[1],o=e.match(/export type (\w+(?:Data|Event)) = z\.infer/);if(!o)return null;let s=o[1],i=e.match(/type:\s*['"]([^'"]+)['"]/);if(!i)return null;let a=i[1],c=Fl(e);return{name:n,typeName:s,eventType:a,fields:c,filePath:t}}catch{return null}},Nl={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},Fl=e=>{let t=e.match(/z\.object\({([^}]+)\}/);if(!t)return[];let r=t[1],n=/(\w+):\s*z\.(\w+)\([^)]*\)/g,o=[...r.matchAll(n)].map(([,a,c])=>{let l=Nl[c]||c;return`${a}: ${l}`});if(!e.includes("z.array("))return o;let s=/(\w+):\s*z\.array\(/g,i=[...e.matchAll(s)].map(([,a])=>a).filter(a=>!o.some(c=>c.startsWith(a))).map(a=>`${a}: array`);return[...o,...i]},_o=(e,t)=>{if(e.length===0)return`
67
67
  **Available Contracts:**
68
68
 
69
69
  No contracts are currently defined. Use Basic Mode with inline schemas for all events.
@@ -84,15 +84,15 @@ The following event contracts are available in \`${t}/contracts\`:
84
84
  ${r}
85
85
 
86
86
  If the event type your service consumes matches one of these, **you MUST use Advanced Mode**.
87
- `.trim()};var Ml=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Dl=(e,t)=>{let r=_e(Ml(),"docs","generators"),n=ce(),o=[];for(let s of n.docs.base)o.push(_e(r,s));if(e&&n.docs.frameworks[e]){let s=n.docs.frameworks[e];if(typeof s=="string")o.push(_e(r,s));else{let i=t==="bun"?"bun":"node";s[i]&&o.push(_e(r,s[i]))}}return o},_l=["CLAUDE.md","AGENTS.md",".github/copilot-instructions.md","docs/ai-guidelines.md"],jo=1500,Lo=50,Wo=e=>{try{return Fl(e)?Ol(e,"utf-8"):null}catch{return null}},jl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
87
+ `.trim()};var Dl=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),_l=(e,t)=>{let r=_e(Dl(),"docs","generators"),n=ce(),o=[];for(let s of n.docs.base)o.push(_e(r,s));if(e&&n.docs.frameworks[e]){let s=n.docs.frameworks[e];if(typeof s=="string")o.push(_e(r,s));else{let i=t==="bun"?"bun":"node";s[i]&&o.push(_e(r,s[i]))}}return o},jl=["CLAUDE.md","AGENTS.md",".github/copilot-instructions.md","docs/ai-guidelines.md"],jo=1500,Lo=50,Wo=e=>{try{return Ol(e)?Ml(e,"utf-8"):null}catch{return null}},Ll=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
88
88
 
89
- `).replace(/[ \t]+$/gm,"").trim(),Ll=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/```[\s\S]*?```/g,"").replace(/`[^`]{50,}`/g,"`...`").replace(/\n{3,}/g,`
89
+ `).replace(/[ \t]+$/gm,"").trim(),Wl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/```[\s\S]*?```/g,"").replace(/`[^`]{50,}`/g,"`...`").replace(/\n{3,}/g,`
90
90
 
91
- `).replace(/[ \t]+$/gm,"").trim(),Wl=e=>Math.ceil(e.length/4),Hl=(e,t)=>{let r=e.split(/(?=^## )/m),n="",o=0;for(let s of r){let i=Wl(s);if(o+i<=t)n+=s,o+=i;else if(o===0){n=s.slice(0,t*4);break}else break}return n.trim()},Gl=(e,t)=>{let{workspaceRoot:r,scope:n}=t,o=Do(r),s=_o(o,n);return e.replace(/\{\{scope\}\}/g,n).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},Ho=e=>{let{workspaceRoot:t,scope:r}=e,n=[],o=Dl(e.serviceType,e.packageManager);for(let a of o){let c=Wo(a);if(c){let l=Gl(c,e),p=jl(l);n.push(p)}}let s=[...new Set(_l.map(a=>Wo(_e(t,a))).filter(a=>a!==null).map(Ll).filter(a=>a.length>Lo))],i=s.length?Math.floor(jo/s.length):jo;for(let a of s){let c=Hl(a,i);c.length>Lo&&n.push(c)}return n.length===0?(console.warn("\u26A0\uFE0F No instruction files found."),`Use ${r}/contracts for shared types.`):n.join(`
91
+ `).replace(/[ \t]+$/gm,"").trim(),Hl=e=>Math.ceil(e.length/4),Gl=(e,t)=>{let r=e.split(/(?=^## )/m),n="",o=0;for(let s of r){let i=Hl(s);if(o+i<=t)n+=s,o+=i;else if(o===0){n=s.slice(0,t*4);break}else break}return n.trim()},Bl=(e,t)=>{let{workspaceRoot:r,scope:n}=t,o=Do(r),s=_o(o,n);return e.replace(/\{\{scope\}\}/g,n).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},Ho=e=>{let{workspaceRoot:t,scope:r}=e,n=[],o=_l(e.serviceType,e.packageManager);for(let a of o){let c=Wo(a);if(c){let l=Bl(c,e),p=Ll(l);n.push(p)}}let s=[...new Set(jl.map(a=>Wo(_e(t,a))).filter(a=>a!==null).map(Wl).filter(a=>a.length>Lo))],i=s.length?Math.floor(jo/s.length):jo;for(let a of s){let c=Gl(a,i);c.length>Lo&&n.push(c)}return n.length===0?(console.warn("\u26A0\uFE0F No instruction files found."),`Use ${r}/contracts for shared types.`):n.join(`
92
92
 
93
93
  ---
94
94
 
95
- `)};var Bl=`You are an expert code generator. Generate clean, production-ready code.
95
+ `)};var Ul=`You are an expert code generator. Generate clean, production-ready code.
96
96
 
97
97
  ## Output Format
98
98
 
@@ -106,13 +106,13 @@ Format your code blocks with the file path on the line before the code block:
106
106
  **IMPORTANT:** Always generate:
107
107
  - Source code files (src/**)
108
108
  - Test files (src/**/*.test.ts) for all business logic
109
- - README.md with service documentation`,Ul=e=>e.replace(/-/g,"_").toUpperCase(),zl=e=>e.split("/").pop()||"my-service",Go=(e,t,r)=>{let n=Ho({...e,serviceType:t,packageManager:r});return`${Bl}
109
+ - README.md with service documentation`,Vl=e=>e.replace(/-/g,"_").toUpperCase(),zl=e=>e.split("/").pop()||"my-service",Go=(e,t,r)=>{let n=Ho({...e,serviceType:t,packageManager:r});return`${Ul}
110
110
 
111
111
  ## Project Guidelines & Patterns
112
112
 
113
113
  Follow these project-specific conventions and patterns when generating code:
114
114
 
115
- ${n}`},Bo=(e,t,r,n)=>{let o=zl(e),s=`${Ul(o)}_PORT`,i=st();return`Generate source code for a microservice at path "${e}".
115
+ ${n}`},Bo=(e,t,r,n)=>{let o=zl(e),s=`${Vl(o)}_PORT`,i=st();return`Generate source code for a microservice at path "${e}".
116
116
 
117
117
  Use the patterns and conventions from the Project Guidelines above.
118
118
 
@@ -127,9 +127,9 @@ Service purpose: ${t}
127
127
  - BUT you MUST keep the existing port configuration line unchanged!
128
128
 
129
129
  Do NOT include the service path in file headers (use \`src/...\`, NOT \`${e}/src/...\`).
130
- `};var Vl=()=>!!process.env.DEBUG,Uo=(e,t)=>{Vl()&&console.log(`[AI Parser] ${e}`,t??"")},gt={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},$r=(e,t)=>[...e.matchAll(t)].flatMap(n=>n[1].split(`
131
- `).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),zo=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),Jl=e=>$r(e,gt.commandsBlock).map(zo),Kl=e=>$r(e,gt.postCommandsBlock).map(zo),ql=e=>$r(e,gt.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),Yl=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},r=(e||"typescript").toLowerCase();return t[r]||r},Zl=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"},Xl=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),Ql=e=>{let t=e.split(`
132
- `),r=[],n=0;for(let o of t){let s=gt.fileHeader.exec(o);s&&r.push({path:s[1],index:n}),n+=o.length+1}return r},ep=(e,t)=>{let n=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return n?{language:n[1]?Yl(n[1]):void 0,content:Xl(n[2])}:null},tp=e=>Ql(e).map(r=>{let n=ep(e,r.index);return!n||n.content.length===0?null:{path:r.path,language:n.language||Zl(r.path),content:n.content,startIndex:r.index}}).filter(r=>r!==null),Tr=e=>e.includes("packages/contracts")||e.includes("contracts/src"),rp=e=>{let t=e.filter(n=>Tr(n.path)),r=e.filter(n=>!Tr(n.path));return[...t,...r]},np=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(Tr(t))return t;let r=t.match(/^services\/[^/]+\/(.+)$/);return r?r[1]:t},Vo=(e,t)=>{Uo("Parsing AI response",{length:e.length});let r=Jl(e),n=Kl(e),o=ql(e),s=tp(e),i=rp(s.map(a=>({path:np(a.path),content:a.content,language:a.language})));return Uo("Parsed response",{commands:r.length,postCommands:n.length,dependencies:o.length,files:i.length}),{commands:r,files:i,dependencies:o,postCommands:n}},Jo=e=>{let t=e.filter(s=>!s.content||s.content.trim().length===0),r=e.length===0?["No files could be extracted from the AI response"]:t.map(s=>`File ${s.path} is empty`),n=e.some(s=>["src/index.ts","src/main.ts","index.ts"].includes(s.path)),o=e.length>0&&!n?["No entry point file (src/index.ts or src/main.ts) found - assuming it exists from scaffolding"]:[];return{valid:r.length===0,errors:r,warnings:o}};import{mkdirSync as op}from"fs";import H from"chalk";var Ko=async(e,t,r)=>{if(e.length===0){op(t,{recursive:!0}),console.log(H.yellow(`\u26A0 No scaffolding command found - creating empty directory
130
+ `};var Jl=()=>!!process.env.DEBUG,Uo=(e,t)=>{Jl()&&console.log(`[AI Parser] ${e}`,t??"")},gt={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},$r=(e,t)=>[...e.matchAll(t)].flatMap(n=>n[1].split(`
131
+ `).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),Vo=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),Kl=e=>$r(e,gt.commandsBlock).map(Vo),ql=e=>$r(e,gt.postCommandsBlock).map(Vo),Yl=e=>$r(e,gt.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),Zl=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},r=(e||"typescript").toLowerCase();return t[r]||r},Xl=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"},Ql=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),ep=e=>{let t=e.split(`
132
+ `),r=[],n=0;for(let o of t){let s=gt.fileHeader.exec(o);s&&r.push({path:s[1],index:n}),n+=o.length+1}return r},tp=(e,t)=>{let n=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return n?{language:n[1]?Zl(n[1]):void 0,content:Ql(n[2])}:null},rp=e=>ep(e).map(r=>{let n=tp(e,r.index);return!n||n.content.length===0?null:{path:r.path,language:n.language||Xl(r.path),content:n.content,startIndex:r.index}}).filter(r=>r!==null),Tr=e=>e.includes("packages/contracts")||e.includes("contracts/src"),np=e=>{let t=e.filter(n=>Tr(n.path)),r=e.filter(n=>!Tr(n.path));return[...t,...r]},op=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(Tr(t))return t;let r=t.match(/^services\/[^/]+\/(.+)$/);return r?r[1]:t},zo=(e,t)=>{Uo("Parsing AI response",{length:e.length});let r=Kl(e),n=ql(e),o=Yl(e),s=rp(e),i=np(s.map(a=>({path:op(a.path),content:a.content,language:a.language})));return Uo("Parsed response",{commands:r.length,postCommands:n.length,dependencies:o.length,files:i.length}),{commands:r,files:i,dependencies:o,postCommands:n}},Jo=e=>{let t=e.filter(s=>!s.content||s.content.trim().length===0),r=e.length===0?["No files could be extracted from the AI response"]:t.map(s=>`File ${s.path} is empty`),n=e.some(s=>["src/index.ts","src/main.ts","index.ts"].includes(s.path)),o=e.length>0&&!n?["No entry point file (src/index.ts or src/main.ts) found - assuming it exists from scaffolding"]:[];return{valid:r.length===0,errors:r,warnings:o}};import{mkdirSync as sp}from"fs";import H from"chalk";var Ko=async(e,t,r)=>{if(e.length===0){sp(t,{recursive:!0}),console.log(H.yellow(`\u26A0 No scaffolding command found - creating empty directory
133
133
  `));return}let o=(await Sr(e,r)).find(s=>!s.success);if(o)throw console.log(H.red(`
134
134
  \u2717 Scaffolding failed: ${o.command}`)),o.error&&console.log(H.red(` Error: ${o.error}`)),new Error(`Command failed: ${o.command}${o.error?` - ${o.error}`:""}`)},qo=async(e,t,r)=>{if(e.length===0)return;r.stop();let n=e.length===1?"package":"packages";console.log(H.cyan(`
135
135
  \u25B6 Installing ${e.length} additional ${n}...
@@ -139,44 +139,44 @@ Do NOT include the service path in file headers (use \`src/...\`, NOT \`${e}/src
139
139
  \u25B6 Running post-generation commands...
140
140
  `));let n=(await Sr(e,t)).find(o=>!o.success);if(n){console.log(H.yellow(`
141
141
  \u26A0 Post-command failed: ${n.command}`)),n.error&&console.log(H.yellow(` Error: ${n.error}`));return}console.log(H.green(`\u2713 Post-generation commands complete
142
- `))};import ut from"chalk";var sp=e=>`${ut.dim(" \u2022 ")+ut.cyan(e)}
142
+ `))};import ut from"chalk";var ip=e=>`${ut.dim(" \u2022 ")+ut.cyan(e)}
143
143
  `,Yo=e=>ut.dim(` \u2728 Generated ${ut.white.bold(e)} tokens
144
- `),Zo=()=>{let e="",t=0,r=Date.now(),n=[],o=()=>{let i=e.match(/####\s+`([^`]+)`/);if(!i)return!1;n.push(i[1]),process.stdout.write(sp(i[1]));let a=e.indexOf(i[0])+i[0].length;return e=e.slice(a),!0},s=i=>{e+=i,t++,o(),e.length>500&&(e=e.slice(-200))};return s.getStats=()=>{let i=((Date.now()-r)/1e3).toFixed(2),a=(t/Number.parseFloat(i)).toFixed(0);return{tokenCount:t,duration:i,tokensPerSec:a}},s.getFiles=()=>n,s};var mp=()=>{let e=g(),t=ts(e,"package.json"),r=(()=>{if(!es(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse(ip(t,"utf-8")).name;if(!o)throw new Error('package.json has no "name" field. Please add a name to your root package.json.');return o.startsWith("@")?o:`@${o}`}catch(n){throw n instanceof SyntaxError?new Error("Invalid JSON in package.json"):n}})();return{workspaceRoot:e,scope:r,cwd:process.cwd()}},dp=async(e,t,r,n,o,s)=>{let i=Bo(r,n,o,t.workspaceRoot),a=Go(t,o,s),c=Zo(),l=await yo(e,i,{system:a,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(Yo(p.tokenCount)),console.log(),l},gp=(e,t)=>{let{serviceTypes:r}=ce(),n=r[t]?.commandType;if(!n)return e;let o=Object.values(r).map(s=>s.commandType);return e.map(s=>{for(let i of o)if(i!==n&&s.command.includes(`pf new ${i}`))return{...s,command:s.command.replace(`pf new ${i}`,`pf new ${n}`)};return s})},up=e=>e.length===0?"":`${[h.cyan(`
144
+ `),Zo=()=>{let e="",t=0,r=Date.now(),n=[],o=()=>{let i=e.match(/####\s+`([^`]+)`/);if(!i)return!1;n.push(i[1]),process.stdout.write(ip(i[1]));let a=e.indexOf(i[0])+i[0].length;return e=e.slice(a),!0},s=i=>{e+=i,t++,o(),e.length>500&&(e=e.slice(-200))};return s.getStats=()=>{let i=((Date.now()-r)/1e3).toFixed(2),a=(t/Number.parseFloat(i)).toFixed(0);return{tokenCount:t,duration:i,tokensPerSec:a}},s.getFiles=()=>n,s};var dp=()=>{let e=g(),t=ts(e,"package.json"),r=(()=>{if(!es(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse(ap(t,"utf-8")).name;if(!o)throw new Error('package.json has no "name" field. Please add a name to your root package.json.');return o.startsWith("@")?o:`@${o}`}catch(n){throw n instanceof SyntaxError?new Error("Invalid JSON in package.json"):n}})();return{workspaceRoot:e,scope:r,cwd:process.cwd()}},gp=async(e,t,r,n,o,s)=>{let i=Bo(r,n,o,t.workspaceRoot),a=Go(t,o,s),c=Zo(),l=await yo(e,i,{system:a,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(Yo(p.tokenCount)),console.log(),l},up=(e,t)=>{let{serviceTypes:r}=ce(),n=r[t]?.commandType;if(!n)return e;let o=Object.values(r).map(s=>s.commandType);return e.map(s=>{for(let i of o)if(i!==n&&s.command.includes(`pf new ${i}`))return{...s,command:s.command.replace(`pf new ${i}`,`pf new ${n}`)};return s})},fp=e=>e.length===0?"":`${[h.cyan(`
145
145
  \u{1F4C1} Files to create:`),...e.map(t=>` ${h.green("\u2022")} ${h.white(t.path)} ${h.dim(`(${t.language})`)}`)].join(`
146
146
  `)}
147
147
  `,Qo=(e,t,r)=>e.length===0?"":`${[h.cyan(`
148
148
  ${r} ${t}:`),...e.map(n=>` ${h.yellow("$")} ${h.white(n.command)}`)].join(`
149
149
  `)}
150
- `,fp=e=>e.length===0?"":`${[h.cyan(`
150
+ `,hp=e=>e.length===0?"":`${[h.cyan(`
151
151
  \u{1F4E6} Dependencies to install:`),...e.map(t=>` ${h.magenta("+")} ${h.white(t)}`)].join(`
152
152
  `)}
153
- `,hp=(e,t)=>`${[h.yellow(`
153
+ `,yp=(e,t)=>`${[h.yellow(`
154
154
  Validation errors:`),...e.map(r=>h.yellow(` \u26A0 ${r}`)),h.dim(`
155
155
  Response preview:`),h.dim(t)].join(`
156
156
  `)}
157
- `,me=e=>{e&&process.stdout.write(e)},yp=(e,t)=>{let r=Vo(e,t),n=br(r.commands),o=br(r.postCommands),s=Jo(r.files);return s.valid?{files:r.files,commands:n,dependencies:r.dependencies,postCommands:o}:(console.log(`${h.yellow("\u26A0")} Could not extract structured files from AI response`),me(hp(s.errors,e.slice(0,500))),null)},vp=e=>{console.log(`${h.green("\u2714")} Extracted ${e.files.length} files`),me(up(e.files)),me(Qo(e.commands,"Commands to run","\u{1F527}")),me(Qo(e.postCommands,"Post-generation commands","\u{1F4DD}")),me(fp(e.dependencies)),me(`
158
- `)},Cp=(e,t,r)=>{let n=Io(e);return n&&!n.includes("/")&&!n.startsWith(".")&&(n=`${E().services}/${n}`),n?Xo(r,n):Xo(r,t)},kp=(e,t)=>{let{serviceTypes:r}=ce(),n=r[t]?.skipFiles||["package.json","tsconfig.json","Dockerfile"];return e.filter(o=>!n.includes(o.path))},de=()=>{if(!De())return{valid:!1,error:h.red.bold(`\u274C AI configuration not found.
157
+ `,me=e=>{e&&process.stdout.write(e)},vp=(e,t)=>{let r=zo(e,t),n=br(r.commands),o=br(r.postCommands),s=Jo(r.files);return s.valid?{files:r.files,commands:n,dependencies:r.dependencies,postCommands:o}:(console.log(`${h.yellow("\u26A0")} Could not extract structured files from AI response`),me(yp(s.errors,e.slice(0,500))),null)},Cp=e=>{console.log(`${h.green("\u2714")} Extracted ${e.files.length} files`),me(fp(e.files)),me(Qo(e.commands,"Commands to run","\u{1F527}")),me(Qo(e.postCommands,"Post-generation commands","\u{1F4DD}")),me(hp(e.dependencies)),me(`
158
+ `)},kp=(e,t,r)=>{let n=Io(e);return n&&!n.includes("/")&&!n.startsWith(".")&&(n=`${E().services}/${n}`),n?Xo(r,n):Xo(r,t)},xp=(e,t)=>{let{serviceTypes:r}=ce(),n=r[t]?.skipFiles||["package.json","tsconfig.json","Dockerfile"];return e.filter(o=>!n.includes(o.path))},de=()=>{if(!De())return{valid:!1,error:h.red.bold(`\u274C AI configuration not found.
159
159
  `)+h.yellow("Please run ")+h.cyan.bold("pf setup --ai")+h.yellow(` first to configure your AI provider.
160
160
  `)};try{return{valid:!0,config:pt()}}catch(e){return{valid:!1,error:h.red.bold(`\u274C ${e.message}
161
- `)}}},ft=async e=>e||lp({message:"\u{1F4DD} Describe what this service should do:",validate:t=>t.trim().length>0||"Please provide a description for the AI to generate code"}),ht=(e,t,r)=>{console.log(h.cyan.bold(`
161
+ `)}}},ft=async e=>e||pp({message:"\u{1F4DD} Describe what this service should do:",validate:t=>t.trim().length>0||"Please provide a description for the AI to generate code"}),ht=(e,t,r)=>{console.log(h.cyan.bold(`
162
162
  \u{1F916} AI-Powered Generation
163
163
  `)),console.log(h.dim(`Service: ${e.split("/").pop()}`)),console.log(h.dim(`Path: ${e}`)),console.log(h.dim(`Model: ${t.model}`)),console.log(h.dim(`Description: ${r}
164
- `))},yt=async(e,t)=>{let{servicePath:r,description:n="",serviceType:o,packageManager:s}=e,i=r.split("/").pop()||r,a=mp(),c=ts(a.workspaceRoot,er);cp(c,`generating:${r}`);let l=()=>{es(c)&&ap(c)},p=()=>{l(),process.exit(w.CANCELLED)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(h.cyan.bold(`
164
+ `))},yt=async(e,t)=>{let{servicePath:r,description:n="",serviceType:o,packageManager:s}=e,i=r.split("/").pop()||r,a=dp(),c=ts(a.workspaceRoot,er);lp(c,`generating:${r}`);let l=()=>{es(c)&&cp(c)},p=()=>{l(),process.exit(w.CANCELLED)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(h.cyan.bold(`
165
165
  \u{1F916} AI Generation
166
- `));let m=await dp(t,a,r,n,o,s),y=yp(m,i);if(!y)return!1;vp(y);let j=pp({text:"Processing files...",color:"cyan"}).start(),be=gp(y.commands,o),N=Cp(be,r,a.cwd),na=kp(y.files,o);await Ko(be,N,a.workspaceRoot);let{missingContractCommands:Cn}=await Mo(na,N,a,j);if(y.postCommands.length>0)await Ar(y.postCommands,a.workspaceRoot);else if(Cn.length>0){console.log(h.cyan(`\u{1F527} Auto-creating missing contracts...
167
- `));let oa=Cn.map(sa=>({command:sa,isPfCommand:!0}));await Ar(oa,a.workspaceRoot)}return Ao(N),await qo(y.dependencies,N,j),await Oo(N,j),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};import{existsSync as nC}from"fs";import{Project as xp,SyntaxKind as sC}from"ts-morph";var iC=new xp({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0});v();import{promises as Ir}from"fs";import vt from"path";import rs from"chalk";var ns=async e=>{await K("bash",["-c",`
166
+ `));let m=await gp(t,a,r,n,o,s),y=vp(m,i);if(!y)return!1;Cp(y);let j=mp({text:"Processing files...",color:"cyan"}).start(),be=up(y.commands,o),N=kp(be,r,a.cwd),oa=xp(y.files,o);await Ko(be,N,a.workspaceRoot);let{missingContractCommands:Cn}=await Mo(oa,N,a,j);if(y.postCommands.length>0)await Ar(y.postCommands,a.workspaceRoot);else if(Cn.length>0){console.log(h.cyan(`\u{1F527} Auto-creating missing contracts...
167
+ `));let sa=Cn.map(ia=>({command:ia,isPfCommand:!0}));await Ar(sa,a.workspaceRoot)}return Ao(N),await qo(y.dependencies,N,j),await Oo(N,j),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};import{existsSync as sC}from"fs";import{Project as wp,SyntaxKind as aC}from"ts-morph";var cC=new wp({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0});v();import{promises as Ir}from"fs";import vt from"path";import rs from"chalk";var ns=async e=>{await K("bash",["-c",`
168
168
  curl -fsSL https://bun.sh/install | bash && if [ -f "$HOME/.bun/bin/bun" ]; then export PATH="$HOME/.bun/bin:$PATH"; fi
169
- `],{task:e,shell:!0}),await Ep()},Rr=()=>Ee("bun"),os=()=>Yt([{label:"Bun",value:59026,color:"magenta",barColor:"magenta"},{label:"Deno",value:25335},{label:"Node.js",value:19039}],{title:'Express.js "hello world" HTTP requests per second (Linux x64)',barColor:"blackBright"}),ss=()=>Yt([{label:"Bun",value:.36,color:"magenta",barColor:"magenta"},{label:"pnpm",value:6.44},{label:"npm",value:10.58},{label:"yarn",value:12.08}],{title:"Bun is an npm-compatible package manager.",unit:"s",footer:rs.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),Ep=async()=>{let e='export PATH="$HOME/.bun/bin:$PATH"',t=process.env.HOME;if(!t){d.error("Could not detect $HOME environment variable. Cannot update shell config.");return}let r=[vt.join(t,".zshrc"),vt.join(t,".bashrc"),vt.join(t,".bash_profile")];for(let n of r)try{if(await Ir.stat(n).then(()=>!0).catch(()=>!1)){(await Ir.readFile(n,"utf8")).includes(e)||(await Ir.appendFile(n,`
169
+ `],{task:e,shell:!0}),await Tp()},Rr=()=>Ee("bun"),os=()=>Yt([{label:"Bun",value:59026,color:"magenta",barColor:"magenta"},{label:"Deno",value:25335},{label:"Node.js",value:19039}],{title:'Express.js "hello world" HTTP requests per second (Linux x64)',barColor:"blackBright"}),ss=()=>Yt([{label:"Bun",value:.36,color:"magenta",barColor:"magenta"},{label:"pnpm",value:6.44},{label:"npm",value:10.58},{label:"yarn",value:12.08}],{title:"Bun is an npm-compatible package manager.",unit:"s",footer:rs.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),Tp=async()=>{let e='export PATH="$HOME/.bun/bin:$PATH"',t=process.env.HOME;if(!t){d.error("Could not detect $HOME environment variable. Cannot update shell config.");return}let r=[vt.join(t,".zshrc"),vt.join(t,".bashrc"),vt.join(t,".bash_profile")];for(let n of r)try{if(await Ir.stat(n).then(()=>!0).catch(()=>!1)){(await Ir.readFile(n,"utf8")).includes(e)||(await Ir.appendFile(n,`
170
170
  # Added by platform installer
171
171
  ${e}
172
- `),d.log(`Added Bun path to ${vt.basename(n)}`));return}}catch(o){d.error(`Failed to update ${n}: ${o.message}`)}d.warn("No shell config file (.zshrc, .bashrc, .bash_profile) found. Please add the following manually:"),d.log(rs.cyan(e))};f();import{existsSync as xt,mkdirSync as Hp,readFileSync as Gp,renameSync as Bp,statSync as ms,unlinkSync as Up,writeFileSync as zp}from"fs";import{join as We}from"path";import{existsSync as Tp}from"fs";import{join as $p}from"path";import Ct from"chalk";f();import Nr from"chalk";var ge=e=>{let t=Math.max(...e.commands.map(o=>o.name.length)),r=e.commands.map(o=>{let s=" ".repeat(t-o.name.length+3);return` ${Nr.cyan(o.name)}${s}${o.description}`}),n=e.footer||'Run "<command> --help" for more information';return[Nr.cyan.bold(`
172
+ `),d.log(`Added Bun path to ${vt.basename(n)}`));return}}catch(o){d.error(`Failed to update ${n}: ${o.message}`)}d.warn("No shell config file (.zshrc, .bashrc, .bash_profile) found. Please add the following manually:"),d.log(rs.cyan(e))};f();import{existsSync as xt,mkdirSync as Gp,readFileSync as Bp,renameSync as Up,statSync as ms,unlinkSync as Vp,writeFileSync as zp}from"fs";import{join as We}from"path";import{existsSync as $p}from"fs";import{join as Ap}from"path";import Ct from"chalk";f();import Nr from"chalk";var ge=e=>{let t=Math.max(...e.commands.map(o=>o.name.length)),r=e.commands.map(o=>{let s=" ".repeat(t-o.name.length+3);return` ${Nr.cyan(o.name)}${s}${o.description}`}),n=e.footer||'Run "<command> --help" for more information';return[Nr.cyan.bold(`
173
173
  ${e.title}
174
174
  `),`Available commands:
175
175
  `,...r,"",Nr.dim(`${n}
176
176
  `)].join(`
177
- `)};var Ap=(e,t)=>t.some(r=>r.name()===e),Ip=(e,t)=>t.pf?.commands?.[e]??null,Rp=(e,t)=>!!t.scripts?.[e],Np=(e,t)=>t.cwd?$p(e,t.cwd):e,Fp=(e,t)=>t.command||e,Op=(e,t,r,n)=>{let o=Np(n,r),s=Fp(e,r);if(r.cwd&&!Tp(o))return console.error(Ct.red(`
177
+ `)};var Ip=(e,t)=>t.some(r=>r.name()===e),Rp=(e,t)=>t.pf?.commands?.[e]??null,Np=(e,t)=>!!t.scripts?.[e],Fp=(e,t)=>t.cwd?Ap(e,t.cwd):e,Op=(e,t)=>t.command||e,Mp=(e,t,r,n)=>{let o=Fp(n,r),s=Op(e,r);if(r.cwd&&!$p(o))return console.error(Ct.red(`
178
178
  \u2716 Directory not found: ${o}
179
- `)),!0;let i=r.cwd?Ct.dim(` in ${r.cwd}/`):"";return console.log(Ct.dim(`Running ${s}${i}`)),Xn(s,t,{cwd:o}),!0},Mp=(e,t,r)=>(console.log(Ct.dim(`Running workspace script: ${e}`)),Fe(e,{args:t,cwd:r}),!0);async function Dp(e,t,r){if(Ap(e,r))return!1;let n;try{n=g()}catch{return!1}let o=F(n);if(!o)return!1;let s=Ip(e,o);return s?Op(e,t,s,n):Rp(e,o)?Mp(e,t,n):!1}function is(){let e;try{e=F()}catch{return{configured:[],scripts:[]}}if(!e)return{configured:[],scripts:[]};let t=Object.keys(e.pf?.commands??{}),n=Object.keys(e.scripts??{}).filter(o=>!t.includes(o));return{configured:t,scripts:n}}function Fr(){let{configured:e,scripts:t}=is();return[...e,...t]}function as(){let{configured:e,scripts:t}=is(),r=[...e,...t];if(r.length===0)return"";let o=F()?.pf?.commands||{},s=r.map(i=>({name:i,description:o[i]?.description||kt[i]||""}));return ge({title:"Workspace Commands",commands:s,footer:""})}function cs(e,t,r){let n=t.slice(2);if(n.length>0&&!n[0].startsWith("-")){let o=n[0],s=n.slice(1);if(o==="__workspace-commands"&&s.includes("--names-only")){let i=Fr();for(let a of i)console.log(a);return}Dp(o,s,r).then(i=>{i||e.parse(t)})}else e.parse(t)}f();var ls={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"},ps=(e,t)=>t?`${e}:${t}`:e,_p=()=>Object.entries(ls).map(([e,t])=>ps(e,t)),jp=()=>{try{let e=Fr(),r=F()?.pf?.commands||{},n=Object.keys(ls);return e.filter(o=>!n.includes(o)).map(o=>{let s=r[o]?.description||kt[o]||"";return ps(o,s)})}catch{return[]}},Lp=()=>{try{let e=g(),t=x(e),r=`${e}/${t.relativePath}/src`,{discoverEventTypes:n}=Jt("@crossdelta/cloudevents");return n(r)}catch{return[]}},Wp=async()=>{try{let e=g();return await ko(e)}catch{return[]}},Or=async()=>({commands:[..._p(),...jp()],events:Lp(),services:await Wp()});var je="node_modules/.cache/pf",Le="completion-cache";var Vp=e=>{let t=R.version||"0.0.0",r=e.commands.join("|"),n=e.events.join("|"),o=e.services.join("|");return`${t} ${r} ${n} ${o}`},Jp=e=>{let t=e.split(" ");if(t.length===4){let[o,s,i,a]=t;return{version:o,commands:s?s.split("|"):[],events:i?i.split("|"):[],services:a?a.split("|"):[]}}if(t.length===3){let[o,s,i]=t;return{version:o,commands:s?s.split("|"):[],events:i?i.split("|"):[],services:[]}}let[r,n]=t;return{commands:r?r.split("|"):[],events:n?n.split("|"):[],services:[]}},Kp=e=>{let t=We(e,je);return We(t,Le)},qp=(e,t=!1)=>{if(t)return!0;let r=Kp(e);if(!xt(r))return!0;let n=Gp(r,"utf-8").trim(),o=Jp(n),s=R.version||"0.0.0";if(o.version!==s)return!0;let i=We(e,"package.json");if(!xt(i))return!1;let a=ms(r).mtimeMs;return ms(i).mtimeMs>a};var Yp=(e,t)=>{let r=We(e,je),n=We(r,Le),o=`${n}.tmp.${process.pid}`;xt(r)||Hp(r,{recursive:!0});let s=Vp(t);try{zp(o,s,"utf-8"),Bp(o,n)}catch(i){try{xt(o)&&Up(o)}catch{}throw i}},wt=async(e={})=>{let t;try{t=g()}catch{return!1}if(!t)return!1;if(!qp(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let r=await Or();return Yp(t,r),e.verbose&&console.log(`[completion] Cache regenerated: ${r.commands.length} commands, ${r.events.length} events`),!0},He=async(e={})=>{await wt({...e,force:!0})};import{existsSync as Dr,readFileSync as hs,writeFileSync as ys}from"fs";import{homedir as vs}from"os";import{join as Mr}from"path";import ue from"chalk";var ds=`${je}/${Le}`,gs=e=>`# ${e} completion (workspace-local cache)
179
+ `)),!0;let i=r.cwd?Ct.dim(` in ${r.cwd}/`):"";return console.log(Ct.dim(`Running ${s}${i}`)),Xn(s,t,{cwd:o}),!0},Dp=(e,t,r)=>(console.log(Ct.dim(`Running workspace script: ${e}`)),Fe(e,{args:t,cwd:r}),!0);async function _p(e,t,r){if(Ip(e,r))return!1;let n;try{n=g()}catch{return!1}let o=F(n);if(!o)return!1;let s=Rp(e,o);return s?Mp(e,t,s,n):Np(e,o)?Dp(e,t,n):!1}function is(){let e;try{e=F()}catch{return{configured:[],scripts:[]}}if(!e)return{configured:[],scripts:[]};let t=Object.keys(e.pf?.commands??{}),n=Object.keys(e.scripts??{}).filter(o=>!t.includes(o));return{configured:t,scripts:n}}function Fr(){let{configured:e,scripts:t}=is();return[...e,...t]}function as(){let{configured:e,scripts:t}=is(),r=[...e,...t];if(r.length===0)return"";let o=F()?.pf?.commands||{},s=r.map(i=>({name:i,description:o[i]?.description||kt[i]||""}));return ge({title:"Workspace Commands",commands:s,footer:""})}function cs(e,t,r){let n=t.slice(2);if(n.length>0&&!n[0].startsWith("-")){let o=n[0],s=n.slice(1);if(o==="__workspace-commands"&&s.includes("--names-only")){let i=Fr();for(let a of i)console.log(a);return}_p(o,s,r).then(i=>{i||e.parse(t)})}else e.parse(t)}f();var ls={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"},ps=(e,t)=>t?`${e}:${t}`:e,jp=()=>Object.entries(ls).map(([e,t])=>ps(e,t)),Lp=()=>{try{let e=Fr(),r=F()?.pf?.commands||{},n=Object.keys(ls);return e.filter(o=>!n.includes(o)).map(o=>{let s=r[o]?.description||kt[o]||"";return ps(o,s)})}catch{return[]}},Wp=()=>{try{let e=g(),t=x(e),r=`${e}/${t.relativePath}/src`,{discoverEventTypes:n}=Jt("@crossdelta/cloudevents");return n(r)}catch{return[]}},Hp=async()=>{try{let e=g();return await ko(e)}catch{return[]}},Or=async()=>({commands:[...jp(),...Lp()],events:Wp(),services:await Hp()});var je="node_modules/.cache/pf",Le="completion-cache";var Jp=e=>{let t=R.version||"0.0.0",r=e.commands.join("|"),n=e.events.join("|"),o=e.services.join("|");return`${t} ${r} ${n} ${o}`},Kp=e=>{let t=e.split(" ");if(t.length===4){let[o,s,i,a]=t;return{version:o,commands:s?s.split("|"):[],events:i?i.split("|"):[],services:a?a.split("|"):[]}}if(t.length===3){let[o,s,i]=t;return{version:o,commands:s?s.split("|"):[],events:i?i.split("|"):[],services:[]}}let[r,n]=t;return{commands:r?r.split("|"):[],events:n?n.split("|"):[],services:[]}},qp=e=>{let t=We(e,je);return We(t,Le)},Yp=(e,t=!1)=>{if(t)return!0;let r=qp(e);if(!xt(r))return!0;let n=Bp(r,"utf-8").trim(),o=Kp(n),s=R.version||"0.0.0";if(o.version!==s)return!0;let i=We(e,"package.json");if(!xt(i))return!1;let a=ms(r).mtimeMs;return ms(i).mtimeMs>a};var Zp=(e,t)=>{let r=We(e,je),n=We(r,Le),o=`${n}.tmp.${process.pid}`;xt(r)||Gp(r,{recursive:!0});let s=Jp(t);try{zp(o,s,"utf-8"),Up(o,n)}catch(i){try{xt(o)&&Vp(o)}catch{}throw i}},wt=async(e={})=>{let t;try{t=g()}catch{return!1}if(!t)return!1;if(!Yp(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let r=await Or();return Zp(t,r),e.verbose&&console.log(`[completion] Cache regenerated: ${r.commands.length} commands, ${r.events.length} events`),!0},He=async(e={})=>{await wt({...e,force:!0})};import{existsSync as Dr,readFileSync as hs,writeFileSync as ys}from"fs";import{homedir as vs}from"os";import{join as Mr}from"path";import ue from"chalk";var ds=`${je}/${Le}`,gs=e=>`# ${e} completion (workspace-local cache)
180
180
  # Generated: ${new Date().toISOString()}
181
181
 
182
182
  # Cache file path (relative to workspace root)
@@ -405,13 +405,13 @@ _${e}_completions() {
405
405
  return 0
406
406
  }
407
407
 
408
- complete -F _${e}_completions ${e}`;var Zp=(e,t)=>Mr(vs(),`.${t}-completion.${e}`),Cs=e=>{let t=vs();return e==="zsh"?Mr(t,".zshrc"):Mr(t,".bashrc")},Xp=e=>`[[ -f "${e}" ]] && source "${e}"`,Qp=(e,t)=>Dr(e)?hs(e,"utf-8").includes(t):!1,em=(e,t)=>{let r=Dr(e)?hs(e,"utf-8"):"",n=r.endsWith(`
408
+ complete -F _${e}_completions ${e}`;var Xp=(e,t)=>Mr(vs(),`.${t}-completion.${e}`),Cs=e=>{let t=vs();return e==="zsh"?Mr(t,".zshrc"):Mr(t,".bashrc")},Qp=e=>`[[ -f "${e}" ]] && source "${e}"`,em=(e,t)=>Dr(e)?hs(e,"utf-8").includes(t):!1,tm=(e,t)=>{let r=Dr(e)?hs(e,"utf-8"):"",n=r.endsWith(`
409
409
  `)?`${r}${t}
410
410
  `:`${r}
411
411
  ${t}
412
- `;ys(e,n,"utf-8")},tm=(e,t)=>{let r=Zp(e,t),n=e==="zsh"?gs(t):us(t);return ys(r,n,"utf-8"),r},fs=(e,t,r)=>{let n=tm(e,t),o=Cs(e),s=Xp(n);return Qp(o,s)?(r&&console.log(ue.dim(`[${e}] Already configured in ${o}`)),!1):(em(o,s),r&&console.log(ue.green(`[${e}] Added source line to ${o}`)),!0)},rm=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",_r=(e,t=!1)=>{let r=rm();t&&console.log(ue.cyan(`Installing ${r} completion...`)),fs(r,e,t);let n=r==="zsh"?"bash":"zsh",o=Cs(n);Dr(o)&&fs(n,e,t),t&&(console.log(ue.green("\u2713 Shell completion installed")),console.log(ue.dim(` Run: ${ue.cyan("exec $SHELL")} to reload`)))};V();import{readdir as Jx}from"fs/promises";import{dirname as qx,join as Yx}from"path";import{fileURLToPath as Xx}from"url";import{runFlow as ew}from"@crossdelta/flowcore";var nm={debug:()=>{},info:console.log,warn:console.warn,error:console.error},ks=e=>e!==null&&typeof e=="object",xs=e=>typeof e=="string"&&e.length>0,ws=e=>typeof e=="string",jr=e=>typeof e=="function",om=(e,t)=>ks(e)?[!xs(e.name)&&`commands[${t}]: missing or invalid 'name'`,!ws(e.description)&&`commands[${t}]: missing or invalid 'description'`,!Array.isArray(e.args)&&`commands[${t}]: missing 'args' array`,!Array.isArray(e.options)&&`commands[${t}]: missing 'options' array`,!jr(e.run)&&`commands[${t}]: missing 'run' function`].filter(r=>r!==!1):[`commands[${t}]: must be an object`];var Ps=e=>{if(!ks(e))return["Plugin must be an object"];let t=[!xs(e.name)&&"Missing or invalid 'name'",!ws(e.version)&&"Missing or invalid 'version'",!Array.isArray(e.commands)&&"Missing 'commands' array",!Array.isArray(e.flows)&&"Missing 'flows' array",!jr(e.setup)&&"Missing 'setup' function"].filter(n=>n!==!1),r=Array.isArray(e.commands)?e.commands.flatMap((n,o)=>om(n,o)):[];return[...t,...r]},Pt=(e,t=nm)=>({workspace:e,logger:t}),St=async(e,t)=>{let{logger:r}=t;r.debug(`Loading plugin from module: ${e}`);let n=await import(e),o=n.createPfPlugin||n.default?.createPfPlugin;if(!jr(o))throw new Error(`Module ${e} does not export createPfPlugin`);let s=o({contractsPath:t.workspace.contracts.path,contractsPackage:t.workspace.contracts.packageName,availableServices:t.workspace.availableServices}),i=Ps(s);if(i.length>0)throw new Error(`Plugin from ${e} does not conform to PfPlugin interface:
412
+ `;ys(e,n,"utf-8")},rm=(e,t)=>{let r=Xp(e,t),n=e==="zsh"?gs(t):us(t);return ys(r,n,"utf-8"),r},fs=(e,t,r)=>{let n=rm(e,t),o=Cs(e),s=Qp(n);return em(o,s)?(r&&console.log(ue.dim(`[${e}] Already configured in ${o}`)),!1):(tm(o,s),r&&console.log(ue.green(`[${e}] Added source line to ${o}`)),!0)},nm=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",_r=(e,t=!1)=>{let r=nm();t&&console.log(ue.cyan(`Installing ${r} completion...`)),fs(r,e,t);let n=r==="zsh"?"bash":"zsh",o=Cs(n);Dr(o)&&fs(n,e,t),t&&(console.log(ue.green("\u2713 Shell completion installed")),console.log(ue.dim(` Run: ${ue.cyan("exec $SHELL")} to reload`)))};z();import{readdir as qx}from"fs/promises";import{dirname as Zx,join as Xx}from"path";import{fileURLToPath as ew}from"url";import{runFlow as rw}from"@crossdelta/flowcore";var om={debug:()=>{},info:console.log,warn:console.warn,error:console.error},ks=e=>e!==null&&typeof e=="object",xs=e=>typeof e=="string"&&e.length>0,ws=e=>typeof e=="string",jr=e=>typeof e=="function",sm=(e,t)=>ks(e)?[!xs(e.name)&&`commands[${t}]: missing or invalid 'name'`,!ws(e.description)&&`commands[${t}]: missing or invalid 'description'`,!Array.isArray(e.args)&&`commands[${t}]: missing 'args' array`,!Array.isArray(e.options)&&`commands[${t}]: missing 'options' array`,!jr(e.run)&&`commands[${t}]: missing 'run' function`].filter(r=>r!==!1):[`commands[${t}]: must be an object`];var Ps=e=>{if(!ks(e))return["Plugin must be an object"];let t=[!xs(e.name)&&"Missing or invalid 'name'",!ws(e.version)&&"Missing or invalid 'version'",!Array.isArray(e.commands)&&"Missing 'commands' array",!Array.isArray(e.flows)&&"Missing 'flows' array",!jr(e.setup)&&"Missing 'setup' function"].filter(n=>n!==!1),r=Array.isArray(e.commands)?e.commands.flatMap((n,o)=>sm(n,o)):[];return[...t,...r]},Pt=(e,t=om)=>({workspace:e,logger:t}),St=async(e,t)=>{let{logger:r}=t;r.debug(`Loading plugin from module: ${e}`);let n=await import(e),o=n.createPfPlugin||n.default?.createPfPlugin;if(!jr(o))throw new Error(`Module ${e} does not export createPfPlugin`);let s=o({contractsPath:t.workspace.contracts.path,contractsPackage:t.workspace.contracts.packageName,availableServices:t.workspace.availableServices}),i=Ps(s);if(i.length>0)throw new Error(`Plugin from ${e} does not conform to PfPlugin interface:
413
413
  - ${i.join(`
414
- - `)}`);let a=s;return r.debug(`Loaded plugin: ${a.name} v${a.version}`),await a.setup(t),{plugin:a,source:e}};import{deriveEventNames as ow}from"@crossdelta/cloudevents";import{z as C}from"zod";var bt=C.object({dependencies:C.record(C.string(),C.string()).default({}),envVars:C.array(C.object({key:C.string(),description:C.string(),required:C.boolean().default(!0)})).default([]),adapterFile:C.string().optional()}),sm=C.object({push:C.string().optional(),email:C.string().optional(),slack:C.string().optional(),sms:C.string().optional()}).optional(),im=C.object({defaults:sm,providers:C.object({push:C.record(C.string(),bt).optional(),email:C.record(C.string(),bt).optional(),slack:C.record(C.string(),bt).optional(),sms:C.record(C.string(),bt).optional()}).optional()}),sk=C.object({notifier:im.optional()});import{z as u}from"zod";var am=u.object({type:u.literal("event"),eventType:u.string(),stream:u.string().optional()}),cm=u.object({type:u.literal("http"),method:u.enum(["GET","POST","PUT","DELETE","PATCH"]).optional(),path:u.string().optional()}),Ss=u.discriminatedUnion("type",[am,cm]),lm=u.object({type:u.literal("emit.event"),eventType:u.string()}),pm=u.object({type:u.literal("notify"),channel:u.enum(["push","email","slack","sms"]),provider:u.string().optional()}),mm=u.object({type:u.literal("call.http"),name:u.string().optional(),baseUrl:u.string().optional()}),dm=u.object({type:u.literal("persist"),store:u.enum(["db","kv","cache"]),entity:u.string().optional()}),bs=u.discriminatedUnion("type",[lm,pm,mm,dm]),Es=u.object({serviceName:u.string().regex(/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/),framework:u.enum(["hono","nest"]).default("hono"),triggers:u.array(Ss).min(1),actions:u.array(bs).default([])});var wm=(e,t,r)=>{let{stream:n,servicePath:o}=e,s=o.startsWith("/")?o:`${t.workspace.workspaceRoot}/${o}`;if(r?.dryRun)return{success:!0,message:`Would wire stream ${n} to ${o}`,changes:[{type:"update",path:s,description:`Wire ${n} stream to service`,preview:`consumeJetStreams({ streams: ['${n.toUpperCase()}'], ... })`}]};let i=yr(s,`${n.toLowerCase()}.event`);return i.warning?(t.logger.warn(i.warning),{success:!1,message:i.warning}):i.added?(t.logger.info(`Wired stream ${i.streamName} to service`),{success:!0,message:`Wired stream ${i.streamName}`}):(t.logger.debug(`Stream ${i.streamName} already wired`),{success:!0,message:`Stream ${i.streamName} already configured`})},Pm=(e,t,r)=>{let{path:n,eventType:o}=e;if(r?.dryRun){let i=`
414
+ - `)}`);let a=s;return r.debug(`Loaded plugin: ${a.name} v${a.version}`),await a.setup(t),{plugin:a,source:e}};import{deriveEventNames as iw}from"@crossdelta/cloudevents";import{z as C}from"zod";var bt=C.object({dependencies:C.record(C.string(),C.string()).default({}),envVars:C.array(C.object({key:C.string(),description:C.string(),required:C.boolean().default(!0)})).default([]),adapterFile:C.string().optional()}),im=C.object({push:C.string().optional(),email:C.string().optional(),slack:C.string().optional(),sms:C.string().optional()}).optional(),am=C.object({defaults:im,providers:C.object({push:C.record(C.string(),bt).optional(),email:C.record(C.string(),bt).optional(),slack:C.record(C.string(),bt).optional(),sms:C.record(C.string(),bt).optional()}).optional()}),ak=C.object({notifier:am.optional()});import{z as u}from"zod";var cm=u.object({type:u.literal("event"),eventType:u.string(),stream:u.string().optional()}),lm=u.object({type:u.literal("http"),method:u.enum(["GET","POST","PUT","DELETE","PATCH"]).optional(),path:u.string().optional()}),Ss=u.discriminatedUnion("type",[cm,lm]),pm=u.object({type:u.literal("emit.event"),eventType:u.string()}),mm=u.object({type:u.literal("notify"),channel:u.enum(["push","email","slack","sms"]),provider:u.string().optional()}),dm=u.object({type:u.literal("call.http"),name:u.string().optional(),baseUrl:u.string().optional()}),gm=u.object({type:u.literal("persist"),store:u.enum(["db","kv","cache"]),entity:u.string().optional()}),bs=u.discriminatedUnion("type",[pm,mm,dm,gm]),Es=u.object({serviceName:u.string().regex(/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/),framework:u.enum(["hono","nest"]).default("hono"),triggers:u.array(Ss).min(1),actions:u.array(bs).default([])});var Pm=(e,t,r)=>{let{stream:n,servicePath:o}=e,s=o.startsWith("/")?o:`${t.workspace.workspaceRoot}/${o}`;if(r?.dryRun)return{success:!0,message:`Would wire stream ${n} to ${o}`,changes:[{type:"update",path:s,description:`Wire ${n} stream to service`,preview:`consumeJetStreams({ streams: ['${n.toUpperCase()}'], ... })`}]};let i=yr(s,`${n.toLowerCase()}.event`);return i.warning?(t.logger.warn(i.warning),{success:!1,message:i.warning}):i.added?(t.logger.info(`Wired stream ${i.streamName} to service`),{success:!0,message:`Wired stream ${i.streamName}`}):(t.logger.debug(`Stream ${i.streamName} already wired`),{success:!0,message:`Stream ${i.streamName} already configured`})},Sm=(e,t,r)=>{let{path:n,eventType:o}=e;if(r?.dryRun){let i=`
415
415
  import { createContract } from '@crossdelta/cloudevents'
416
416
  import { z } from 'zod'
417
417
 
@@ -419,7 +419,7 @@ export const ${Lr(o)}Contract = createContract({
419
419
  type: '${o}',
420
420
  schema: z.object({ ... }),
421
421
  })
422
- `.trim();return{success:!0,message:`Would create contract ${o}`,changes:[{type:"create",path:n,description:`Create event contract for ${o}`,preview:i.slice(0,500)}]}}let s=xr(o,t.workspace.workspaceRoot);return s&&t.logger.debug(`Added export for ${o} to contracts index`),t.logger.debug(`Contract created: ${o} at ${n}`),{success:!0,message:s?`Contract ${o} created with exports`:`Contract ${o} created`}},Lr=e=>e.split(".").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),Sm=(e,t,r)=>{let{path:n,eventType:o,servicePath:s}=e;if(r?.dryRun){let i=`
422
+ `.trim();return{success:!0,message:`Would create contract ${o}`,changes:[{type:"create",path:n,description:`Create event contract for ${o}`,preview:i.slice(0,500)}]}}let s=xr(o,t.workspace.workspaceRoot);return s&&t.logger.debug(`Added export for ${o} to contracts index`),t.logger.debug(`Contract created: ${o} at ${n}`),{success:!0,message:s?`Contract ${o} created with exports`:`Contract ${o} created`}},Lr=e=>e.split(".").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),bm=(e,t,r)=>{let{path:n,eventType:o,servicePath:s}=e;if(r?.dryRun){let i=`
423
423
  import { handleEvent } from '@crossdelta/cloudevents'
424
424
  import { ${Lr(o)}Contract } from '@your-scope/contracts'
425
425
 
@@ -427,9 +427,9 @@ export default handleEvent(${Lr(o)}Contract, async (data) => {
427
427
  console.log('Processing ${o}:', data)
428
428
  // TODO: Implement handler logic
429
429
  })
430
- `.trim();return{success:!0,message:`Would create handler for ${o}`,changes:[{type:"create",path:n,description:`Create event handler for ${o}`,preview:i.slice(0,500)}]}}return t.logger.debug(`Handler created: ${o} at ${n} (service: ${s})`),{success:!0}},bm={"stream.wired":wm,"contract.created":Pm,"handler.created":Sm},Wr=(e,t,r)=>e.map(n=>{let o=bm[n.kind];return o?o(n,t,r):(t.logger.warn(`Unknown effect kind: ${n.kind}`),{success:!1,message:`Unknown effect kind: ${n.kind}`})});import{join as It}from"path";import{deriveEventNames as ud}from"@crossdelta/cloudevents";var Hr=(e,t,r={})=>({ok:!0,operation:e,summary:t,artifacts:r.artifacts??[],changes:r.changes??[],diagnostics:r.diagnostics??[],next:r.next,data:r.data});f();import{join as Br}from"path";import{readFileSync as Em}from"fs";import{join as Tm}from"path";import $m from"handlebars";var fe=(e,t)=>Co(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),Gr=(e,t={})=>{let r=Em(e,"utf-8");return $m.compile(r)(t)},Et=e=>(t,r={})=>{let n=Tm(e,t);return Gr(n,r)};var B=e=>e.toUpperCase().replace(/-/g,"_");var $s=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");var Am=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Im=()=>{let e=Am(),t=ee();return fe([Br(e,"templates","hono-microservice"),Br(e,"..","hono-microservice","templates"),Br(t,"bin","templates","hono-microservice")],"Hono templates directory not found.")},Tt=(e,t={})=>Et(Im())(e,t);function As(){return Tt("tsconfig.json.hbs")}function Is(e="1.2.23"){return Tt("Dockerfile.hbs",{bunVersion:e})}function Rs(){return Tt("biome.json.hbs")}function Ns(e,t=[]){return Tt("src/config/env.ts.hbs",{envKey:B(e),envVars:t})}var Rm=e=>{let t=["import './config/env'","import '@crossdelta/telemetry'",""];return e&&t.push("import { consumeJetStreams, isConsumerConnected } from '@crossdelta/cloudevents'"),t.push("import { Hono } from 'hono'"),t},Nm=(e,t)=>{let r=[`const port = Number(process.env.${e}_PORT) || 8080`,"const app = new Hono()","","app.get('/health', (c) => {"," return c.json({ status: 'ok' })","})"];return t&&r.push("","app.get('/health/ready', (c) => {"," const ready = isConsumerConnected()"," return c.json({ status: ready ? 'ok' : 'not-ready' }, ready ? 200 : 503)","})"),r},Fm=(e,t)=>["","// Start NATS JetStream consumer","consumeJetStreams({",` streams: [${t.map(r=>`'${r}'`).join(", ")}],`,` consumer: '${e}',`," discover: './src/events/**/*.handler.ts',","})"],Om=()=>["","Bun.serve({"," port,"," fetch: app.fetch,","})","","console.log(`\u{1F680} Service ready at http://localhost:${port}`)"],Mm=e=>{let t=B(e.serviceName);return`${[...Rm(e.hasEvents),"",...Nm(t,e.hasEvents),...e.hasEvents?Fm(e.serviceName,e.streams):[],...Om()].join(`
430
+ `.trim();return{success:!0,message:`Would create handler for ${o}`,changes:[{type:"create",path:n,description:`Create event handler for ${o}`,preview:i.slice(0,500)}]}}return t.logger.debug(`Handler created: ${o} at ${n} (service: ${s})`),{success:!0}},Em={"stream.wired":Pm,"contract.created":Sm,"handler.created":bm},Wr=(e,t,r)=>e.map(n=>{let o=Em[n.kind];return o?o(n,t,r):(t.logger.warn(`Unknown effect kind: ${n.kind}`),{success:!1,message:`Unknown effect kind: ${n.kind}`})});import{join as It}from"path";import{deriveEventNames as fd}from"@crossdelta/cloudevents";var Hr=(e,t,r={})=>({ok:!0,operation:e,summary:t,artifacts:r.artifacts??[],changes:r.changes??[],diagnostics:r.diagnostics??[],next:r.next,data:r.data});f();import{join as Br}from"path";import{readFileSync as Tm}from"fs";import{join as $m}from"path";import Am from"handlebars";var fe=(e,t)=>Co(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),Gr=(e,t={})=>{let r=Tm(e,"utf-8");return Am.compile(r)(t)},Et=e=>(t,r={})=>{let n=$m(e,t);return Gr(n,r)};var B=e=>e.toUpperCase().replace(/-/g,"_");var $s=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");var Im=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Rm=()=>{let e=Im(),t=ee();return fe([Br(e,"templates","hono-microservice"),Br(e,"..","hono-microservice","templates"),Br(t,"bin","templates","hono-microservice")],"Hono templates directory not found.")},Tt=(e,t={})=>Et(Rm())(e,t);function As(){return Tt("tsconfig.json.hbs")}function Is(e="1.2.23"){return Tt("Dockerfile.hbs",{bunVersion:e})}function Rs(){return Tt("biome.json.hbs")}function Ns(e,t=[]){return Tt("src/config/env.ts.hbs",{envKey:B(e),envVars:t})}var Nm=e=>{let t=["import './config/env'","import '@crossdelta/telemetry'",""];return e&&t.push("import { consumeJetStreams, isConsumerConnected } from '@crossdelta/cloudevents'"),t.push("import { Hono } from 'hono'"),t},Fm=(e,t)=>{let r=[`const port = Number(process.env.${e}_PORT) || 8080`,"const app = new Hono()","","app.get('/health', (c) => {"," return c.json({ status: 'ok' })","})"];return t&&r.push("","app.get('/health/ready', (c) => {"," const ready = isConsumerConnected()"," return c.json({ status: ready ? 'ok' : 'not-ready' }, ready ? 200 : 503)","})"),r},Om=(e,t)=>["","// Start NATS JetStream consumer","consumeJetStreams({",` streams: [${t.map(r=>`'${r}'`).join(", ")}],`,` consumer: '${e}',`," discover: './src/events/**/*.handler.ts',","})"],Mm=()=>["","Bun.serve({"," port,"," fetch: app.fetch,","})","","console.log(`\u{1F680} Service ready at http://localhost:${port}`)"],Dm=e=>{let t=B(e.serviceName);return`${[...Nm(e.hasEvents),"",...Fm(t,e.hasEvents),...e.hasEvents?Om(e.serviceName,e.streams):[],...Mm()].join(`
431
431
  `)}
432
- `},Dm=e=>{let t={hono:"^4.6.14","@crossdelta/telemetry":"workspace:*",zod:"^4.1.0",[`${e.workspaceScope}/contracts`]:"workspace:*"};e.hasEvents&&(t["@crossdelta/cloudevents"]="workspace:*");let r={name:e.packageName,version:"0.0.1",type:"module",scripts:{"start:dev":"bun --watch src/index.ts",start:"bun src/index.ts",test:"bun test"},dependencies:t,devDependencies:{"@types/bun":"^1.2.23"}};return JSON.stringify(r,null,2)},_m=e=>`# ${e.serviceName}
432
+ `},_m=e=>{let t={hono:"^4.6.14","@crossdelta/telemetry":"workspace:*",zod:"^4.1.0",[`${e.workspaceScope}/contracts`]:"workspace:*"};e.hasEvents&&(t["@crossdelta/cloudevents"]="workspace:*");let r={name:e.packageName,version:"0.0.1",type:"module",scripts:{"start:dev":"bun --watch src/index.ts",start:"bun src/index.ts",test:"bun test"},dependencies:t,devDependencies:{"@types/bun":"^1.2.23"}};return JSON.stringify(r,null,2)},jm=e=>`# ${e.serviceName}
433
433
 
434
434
  ## Development
435
435
 
@@ -449,7 +449,7 @@ ${e.hasEvents?`
449
449
  This service consumes from:
450
450
  ${e.streams.map(t=>`- ${t}`).join(`
451
451
  `)}`:""}
452
- `,jm=()=>"",Fs={name:"hono-bun",runtime:"bun",framework:"hono",files:[{path:"src/index.ts",content:Mm},{path:"src/config/env.ts",content:e=>Ns(e.serviceName,e.envVars)},{path:"package.json",content:Dm},{path:"tsconfig.json",content:()=>As()},{path:"Dockerfile",content:()=>Is()},{path:"biome.json",content:()=>Rs()},{path:"README.md",content:_m},{path:"src/events/.gitkeep",content:jm,skip:e=>!e.hasEvents}]};import{join as Ur}from"path";var Lm=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Wm=()=>{let e=Lm(),t=ee();return fe([Ur(e,"templates","nest-microservice"),Ur(e,"..","nest-microservice","templates"),Ur(t,"bin","templates","nest-microservice")],"NestJS templates directory not found.")},re=(e,t={})=>Et(Wm())(e,t);function Os(e,t=3e3){return re("src/main.ts.hbs",{serviceName:e,envKey:B(e),displayName:$s(e),defaultPort:t})}function Ms(){return re("src/app.context.ts.hbs",{})}function Ds(){return re("src/events/events.module.ts.hbs",{})}function _s(e){return re("src/events/events.service.ts.hbs",{serviceName:e})}function js(e="24",t="1.2.23"){return re("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function Ls(){return re("biome.json.hbs",{})}function Ws(e,t=[]){return re("src/config/env.ts.hbs",{envKey:B(e),envVars:t})}var Hm=e=>{let t={"@nestjs/common":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/platform-express":"^11.0.0","@crossdelta/telemetry":"workspace:*","reflect-metadata":"^0.2.0",rxjs:"^7.8.0",zod:"^4.1.0",[`${e.workspaceScope}/contracts`]:"workspace:*"};e.hasEvents&&(t["@crossdelta/cloudevents"]="workspace:*");let r={name:e.packageName,version:"0.0.1",scripts:{"start:dev":"bun --watch src/main.ts",start:"node dist/main.js",build:"tsc",test:"bun test"},dependencies:t,devDependencies:{"@nestjs/cli":"^11.0.0","@types/node":"^24.0.0",typescript:"^5.7.0"}};return JSON.stringify(r,null,2)},Gm=()=>JSON.stringify({extends:"../../../../tsconfig.json",compilerOptions:{outDir:"./dist",rootDir:"./src",experimentalDecorators:!0,emitDecoratorMetadata:!0},include:["src/**/*"],exclude:["node_modules","dist","**/*.test.ts"]},null,2),Bm=e=>{let t=["Module","HttpModule"],r=["HttpModule"];return e.hasEvents&&(t.push("OnModuleInit"),r.push("EventsModule")),`import { ${t.join(", ")} } from '@nestjs/common'
452
+ `,Lm=()=>"",Fs={name:"hono-bun",runtime:"bun",framework:"hono",files:[{path:"src/index.ts",content:Dm},{path:"src/config/env.ts",content:e=>Ns(e.serviceName,e.envVars)},{path:"package.json",content:_m},{path:"tsconfig.json",content:()=>As()},{path:"Dockerfile",content:()=>Is()},{path:"biome.json",content:()=>Rs()},{path:"README.md",content:jm},{path:"src/events/.gitkeep",content:Lm,skip:e=>!e.hasEvents}]};import{join as Ur}from"path";var Wm=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Hm=()=>{let e=Wm(),t=ee();return fe([Ur(e,"templates","nest-microservice"),Ur(e,"..","nest-microservice","templates"),Ur(t,"bin","templates","nest-microservice")],"NestJS templates directory not found.")},re=(e,t={})=>Et(Hm())(e,t);function Os(e,t=3e3){return re("src/main.ts.hbs",{serviceName:e,envKey:B(e),displayName:$s(e),defaultPort:t})}function Ms(){return re("src/app.context.ts.hbs",{})}function Ds(){return re("src/events/events.module.ts.hbs",{})}function _s(e){return re("src/events/events.service.ts.hbs",{serviceName:e})}function js(e="24",t="1.2.23"){return re("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function Ls(){return re("biome.json.hbs",{})}function Ws(e,t=[]){return re("src/config/env.ts.hbs",{envKey:B(e),envVars:t})}var Gm=e=>{let t={"@nestjs/common":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/platform-express":"^11.0.0","@crossdelta/telemetry":"workspace:*","reflect-metadata":"^0.2.0",rxjs:"^7.8.0",zod:"^4.1.0",[`${e.workspaceScope}/contracts`]:"workspace:*"};e.hasEvents&&(t["@crossdelta/cloudevents"]="workspace:*");let r={name:e.packageName,version:"0.0.1",scripts:{"start:dev":"bun --watch src/main.ts",start:"node dist/main.js",build:"tsc",test:"bun test"},dependencies:t,devDependencies:{"@nestjs/cli":"^11.0.0","@types/node":"^24.0.0",typescript:"^5.7.0"}};return JSON.stringify(r,null,2)},Bm=()=>JSON.stringify({extends:"../../../../tsconfig.json",compilerOptions:{outDir:"./dist",rootDir:"./src",experimentalDecorators:!0,emitDecoratorMetadata:!0},include:["src/**/*"],exclude:["node_modules","dist","**/*.test.ts"]},null,2),Um=e=>{let t=["Module","HttpModule"],r=["HttpModule"];return e.hasEvents&&(t.push("OnModuleInit"),r.push("EventsModule")),`import { ${t.join(", ")} } from '@nestjs/common'
453
453
  ${e.hasEvents?"import { EventsModule } from './events/events.module'":""}
454
454
 
455
455
  @Module({
@@ -462,7 +462,7 @@ export class AppModule${e.hasEvents?" implements OnModuleInit":""} {
462
462
  // Events module initializes NATS consumer
463
463
  }`:""}
464
464
  }
465
- `},Um=()=>`import { Controller, Get } from '@nestjs/common'
465
+ `},Vm=()=>`import { Controller, Get } from '@nestjs/common'
466
466
 
467
467
  @Controller()
468
468
  export class AppController {
@@ -491,8 +491,8 @@ ${e.hasEvents?`
491
491
  This service consumes from:
492
492
  ${e.streams.map(t=>`- ${t}`).join(`
493
493
  `)}`:""}
494
- `,Vm=()=>"",Hs={name:"nest",runtime:"node",framework:"nest",files:[{path:"src/config/env.ts",content:e=>Ws(e.serviceName,e.envVars)},{path:"src/main.ts",content:e=>Os(e.serviceName,e.port)},{path:"src/app.module.ts",content:Bm},{path:"src/app.controller.ts",content:()=>Um()},{path:"src/app.context.ts",content:()=>Ms()},{path:"package.json",content:Hm},{path:"tsconfig.json",content:()=>Gm()},{path:"Dockerfile",content:()=>js()},{path:"biome.json",content:()=>Ls()},{path:"README.md",content:zm},{path:"src/events/events.module.ts",content:()=>Ds(),skip:e=>!e.hasEvents},{path:"src/events/events.service.ts",content:e=>_s(e.serviceName),skip:e=>!e.hasEvents},{path:"src/events/handlers/.gitkeep",content:Vm,skip:e=>!e.hasEvents}]};var Gs=[Fs,Hs],Bs=e=>{let t=Jm(e),r=Gs.find(n=>n.name===t);if(!r)throw new Error(`Template '${e}' not found. Available: ${Gs.map(n=>n.name).join(", ")}`);return r},Jm=e=>({"hono-micro":"hono-bun","nest-micro":"nest"})[e]||e;import{join as Vr}from"path";import{deriveEventNames as Jr}from"@crossdelta/cloudevents";var Us={appliesTo:["src/domain","src/use-cases"],forbiddenPatterns:[{pattern:"console\\.(log|error|warn|info|debug)\\s*\\(",description:"console.* is forbidden in business logic (use structured logging)",code:"CONSOLE_IN_DOMAIN"},{pattern:"process\\.env\\b",description:"process.env is forbidden in business logic (use dependency injection)",code:"PROCESS_ENV_IN_DOMAIN"},{pattern:"\\bfetch\\s*\\(",description:"fetch() is forbidden in business logic (use adapters/services)",code:"FETCH_IN_DOMAIN"}]},Ge={hono:{businessLogicDir:"use-cases",eventsDir:"events",filePattern:"{name}.use-case.ts",suffix:"use-case",handlerDelegatesToBusinessLogic:!0,pathGuards:{forbidDirs:["src/services"]},codingConstraints:Us},nestjs:{businessLogicDir:"",eventsDir:"events",filePattern:"{name}.service.ts",suffix:"service",handlerDelegatesToBusinessLogic:!1,pathGuards:{forbidDirs:[]},codingConstraints:{appliesTo:["src/domain"],forbiddenPatterns:Us.forbiddenPatterns}}},Km=e=>e.replace(/-([a-z])/g,(t,r)=>r.toUpperCase()),qm=(e,t)=>`../${e}/${t}`,he=(e,t)=>{let r=Ge[e],n=r.filePattern.replace("{name}",t),o=n.replace(/\.ts$/,""),s=r.businessLogicDir?`src/${r.businessLogicDir}`:"src";return{filePath:s?`${s}/${n}`:`src/${n}`,dirPath:s,fileName:n,functionName:Km(t),delegateFromHandler:r.handlerDelegatesToBusinessLogic,importFromEvents:r.businessLogicDir?qm(r.businessLogicDir,o):`./${o}`}},zr=(e,t)=>{let n=`src/${Ge[e].eventsDir}`,o=`${t}.handler.ts`;return{filePath:`${n}/${o}`,dirPath:n,fileName:o}},Be=e=>`handle-${e.replace(/\./g,"-")}`,$t=e=>{let t=e.replace(/\\/g,"/");t=t.replace(/^\.\//,"").replace(/^\//,"");let r=t.split("/"),n=[];for(let o of r)o===".."?n.pop():o!=="."&&o!==""&&n.push(o);return n.join("/")},Ym=(e,t)=>{let r=$t(e);for(let n of t){let o=$t(n);if(r.startsWith(`${o}/`)||r===o)return n}return null},Zm=(e,t)=>{let r=$t(e);return t.some(n=>{let o=$t(n);return r.startsWith(`${o}/`)||r===o})},Xm=(e,t,r)=>{let n=[],o=e.split(`
495
- `);for(let{pattern:s,description:i,code:a}of t){let c=new RegExp(s,"g");for(let l=0;l<o.length;l++)c.test(o[l])&&n.push({code:a,message:i,path:r,line:l+1}),c.lastIndex=0}return n},Qm=(e,t)=>{let r=[],n=Ym(e.path,t.pathGuards.forbidDirs);if(n&&r.push({code:"FORBIDDEN_DIR",message:`Path '${e.path}' is in forbidden directory '${n}'`,path:e.path}),Zm(e.path,t.codingConstraints.appliesTo)){let o=Xm(e.content,t.codingConstraints.forbiddenPatterns,e.path);r.push(...o)}return r},At=(e,t)=>{let r=Ge[e],n=[];for(let o of t)n.push(...Qm(o,r));return{valid:n.length===0,violations:n}};var rd=(e,t)=>t.map(r=>({kind:"file:write",path:Vr(e,r.path),content:r.content})),nd=(e,t,r)=>({kind:"infra:add",serviceName:e,port:t,framework:r.framework,runtime:r.runtime}),od=(e,t)=>({kind:"env:add",key:`${e}_PORT`,value:t.toString()}),sd=(e,t)=>{let{typeName:r}=Jr(e),n=Be(e),o=he("hono",n);return`import type { ${r} } from '${t}/contracts'
494
+ `,Jm=()=>"",Hs={name:"nest",runtime:"node",framework:"nest",files:[{path:"src/config/env.ts",content:e=>Ws(e.serviceName,e.envVars)},{path:"src/main.ts",content:e=>Os(e.serviceName,e.port)},{path:"src/app.module.ts",content:Um},{path:"src/app.controller.ts",content:()=>Vm()},{path:"src/app.context.ts",content:()=>Ms()},{path:"package.json",content:Gm},{path:"tsconfig.json",content:()=>Bm()},{path:"Dockerfile",content:()=>js()},{path:"biome.json",content:()=>Ls()},{path:"README.md",content:zm},{path:"src/events/events.module.ts",content:()=>Ds(),skip:e=>!e.hasEvents},{path:"src/events/events.service.ts",content:e=>_s(e.serviceName),skip:e=>!e.hasEvents},{path:"src/events/handlers/.gitkeep",content:Jm,skip:e=>!e.hasEvents}]};var Gs=[Fs,Hs],Bs=e=>{let t=Km(e),r=Gs.find(n=>n.name===t);if(!r)throw new Error(`Template '${e}' not found. Available: ${Gs.map(n=>n.name).join(", ")}`);return r},Km=e=>({"hono-micro":"hono-bun","nest-micro":"nest"})[e]||e;import{join as zr}from"path";import{deriveEventNames as Jr}from"@crossdelta/cloudevents";var Us={appliesTo:["src/domain","src/use-cases"],forbiddenPatterns:[{pattern:"console\\.(log|error|warn|info|debug)\\s*\\(",description:"console.* is forbidden in business logic (use structured logging)",code:"CONSOLE_IN_DOMAIN"},{pattern:"process\\.env\\b",description:"process.env is forbidden in business logic (use dependency injection)",code:"PROCESS_ENV_IN_DOMAIN"},{pattern:"\\bfetch\\s*\\(",description:"fetch() is forbidden in business logic (use adapters/services)",code:"FETCH_IN_DOMAIN"}]},Ge={hono:{businessLogicDir:"use-cases",eventsDir:"events",filePattern:"{name}.use-case.ts",suffix:"use-case",handlerDelegatesToBusinessLogic:!0,pathGuards:{forbidDirs:["src/services"]},codingConstraints:Us},nestjs:{businessLogicDir:"",eventsDir:"events",filePattern:"{name}.service.ts",suffix:"service",handlerDelegatesToBusinessLogic:!1,pathGuards:{forbidDirs:[]},codingConstraints:{appliesTo:["src/domain"],forbiddenPatterns:Us.forbiddenPatterns}}},qm=e=>e.replace(/-([a-z])/g,(t,r)=>r.toUpperCase()),Ym=(e,t)=>`../${e}/${t}`,he=(e,t)=>{let r=Ge[e],n=r.filePattern.replace("{name}",t),o=n.replace(/\.ts$/,""),s=r.businessLogicDir?`src/${r.businessLogicDir}`:"src";return{filePath:s?`${s}/${n}`:`src/${n}`,dirPath:s,fileName:n,functionName:qm(t),delegateFromHandler:r.handlerDelegatesToBusinessLogic,importFromEvents:r.businessLogicDir?Ym(r.businessLogicDir,o):`./${o}`}},Vr=(e,t)=>{let n=`src/${Ge[e].eventsDir}`,o=`${t}.handler.ts`;return{filePath:`${n}/${o}`,dirPath:n,fileName:o}},Be=e=>`handle-${e.replace(/\./g,"-")}`,$t=e=>{let t=e.replace(/\\/g,"/");t=t.replace(/^\.\//,"").replace(/^\//,"");let r=t.split("/"),n=[];for(let o of r)o===".."?n.pop():o!=="."&&o!==""&&n.push(o);return n.join("/")},Zm=(e,t)=>{let r=$t(e);for(let n of t){let o=$t(n);if(r.startsWith(`${o}/`)||r===o)return n}return null},Xm=(e,t)=>{let r=$t(e);return t.some(n=>{let o=$t(n);return r.startsWith(`${o}/`)||r===o})},Qm=(e,t,r)=>{let n=[],o=e.split(`
495
+ `);for(let{pattern:s,description:i,code:a}of t){let c=new RegExp(s,"g");for(let l=0;l<o.length;l++)c.test(o[l])&&n.push({code:a,message:i,path:r,line:l+1}),c.lastIndex=0}return n},ed=(e,t)=>{let r=[],n=Zm(e.path,t.pathGuards.forbidDirs);if(n&&r.push({code:"FORBIDDEN_DIR",message:`Path '${e.path}' is in forbidden directory '${n}'`,path:e.path}),Xm(e.path,t.codingConstraints.appliesTo)){let o=Qm(e.content,t.codingConstraints.forbiddenPatterns,e.path);r.push(...o)}return r},At=(e,t)=>{let r=Ge[e],n=[];for(let o of t)n.push(...ed(o,r));return{valid:n.length===0,violations:n}};var nd=(e,t)=>t.map(r=>({kind:"file:write",path:zr(e,r.path),content:r.content})),od=(e,t,r)=>({kind:"infra:add",serviceName:e,port:t,framework:r.framework,runtime:r.runtime}),sd=(e,t)=>({kind:"env:add",key:`${e}_PORT`,value:t.toString()}),id=(e,t)=>{let{typeName:r}=Jr(e),n=Be(e),o=he("hono",n);return`import type { ${r} } from '${t}/contracts'
496
496
 
497
497
  /**
498
498
  * Handle ${e} event
@@ -504,7 +504,7 @@ export const ${o.functionName} = async (data: ${r}): Promise<void> => {
504
504
  // TODO: Implement business logic
505
505
  // Example: validate data, transform, call external services
506
506
  }
507
- `},id=(e,t,r)=>{let{contractName:n,typeName:o}=Jr(e),s=Be(e),i=he(r,s);return i.delegateFromHandler?`import { handleEvent } from '@crossdelta/cloudevents'
507
+ `},ad=(e,t,r)=>{let{contractName:n,typeName:o}=Jr(e),s=Be(e),i=he(r,s);return i.delegateFromHandler?`import { handleEvent } from '@crossdelta/cloudevents'
508
508
  import { ${n}, type ${o} } from '${t}/contracts'
509
509
  import { ${i.functionName} } from '${i.importFromEvents}'
510
510
 
@@ -519,13 +519,13 @@ export default handleEvent(${n}, async (data: ${o}) => {
519
519
  console.log('\u{1F4E6} [${e}] Event received:', data)
520
520
  // TODO: Inject and call service
521
521
  })
522
- `},ad=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:he(r,"stub").delegateFromHandler?t.events.map(o=>{let s=Be(o),i=he(r,s);return{kind:"file:write",path:Vr(e,i.filePath),content:sd(o,t.workspaceScope)}}):[],cd=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:t.events.map(n=>{let{kebab:o}=Jr(n),s=zr(r,o);return{kind:"file:write",path:Vr(e,s.filePath),content:id(n,t.workspaceScope,r)}}),ld=e=>e==="hono"?"hono":e==="nest"?"nestjs":"hono",zs=(e,t,r,n)=>{let o=ld(n.framework),s=rd(e,t),i=ad(e,r,o),a=cd(e,r,o),c=nd(r.serviceName,r.port,n),l=od(r.envVarName,r.port);return[...s,...i,...a,c,l]};import{existsSync as pd,readdirSync as md,readFileSync as dd}from"fs";import{join as Vs}from"path";var Js=4001,gd=e=>{let t=e.match(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/);if(t)return Number.parseInt(t[1],10);let r=e.match(/containerPort:\s*(\d+)/);return r?Number.parseInt(r[1],10):null},Ks=e=>{try{let t=Vs(e,"infra","services");return pd(t)?md(t).filter(n=>n.endsWith(".ts")).reduce((n,o)=>{let s=dd(Vs(t,o),"utf-8"),i=gd(s);return i!==null&&n.add(i),n},new Set):new Set}catch(t){return console.warn("Failed to scan ports:",t),new Set}},Kr=(e,t)=>e.has(t)?Kr(e,t+1):t;var fd=e=>{if(!e||e.trim().length===0)throw new Error("Service name cannot be empty");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(e))throw new Error(`Service name '${e}' must be kebab-case (lowercase, alphanumeric, hyphens only)`)},hd=(e,t,r)=>{if(t){if(t.startsWith("/"))return t;if(t.startsWith("."))return It(r,t);if(t.includes("/"))return It(r,t)}let n=E(r);return It(r,n.services,e)},yd=e=>[...new Set(e.map(t=>ud(t).streamName))],vd=(e,t,r,n)=>{let s=x(t).packageName.split("/")[0],i=e.events??[],a=i.length>0||e.hasEvents||!1,c=i.length>0?yd(i):e.streams??[];return{serviceName:e.name,packageName:`${s}/${e.name}`,servicePath:r.replace(`${t}/`,""),port:n,envVarName:B(e.name),hasEvents:a,streams:c,events:i,workspaceScope:s,envVars:e.envVars}},Cd=(e,t)=>e.files.filter(r=>!r.skip?.(t)).map(r=>({path:r.path,content:r.content(t)})),kd=(e,t,r)=>[...e.map(o=>({type:"file",path:It(r,o.path),description:`Service file: ${o.path}`})),{type:"config",path:`infra/services/${t}.ts`,description:"Infrastructure configuration"},{type:"env",path:".env.local",description:"Environment variables"}],xd=e=>[{command:`cd ${e} && bun dev`,description:"Start this service"},{command:"pf dev",description:"Start all services"}],qs=e=>{fd(e.name);let t=e.workspaceRoot??g(),r=hd(e.name,e.path,t),n=e.port??Kr(Ks(t),Js),o=vd(e,t,r,n),s=Bs(e.type),i=Cd(s,o),a=zs(r,i,o,s),c=kd(i,e.name,r),l=xd(r);return Hr("service.generate",`Generated ${e.name} service (port ${n})`,{artifacts:c,changes:a,next:l,data:{serviceName:e.name,servicePath:r,port:n,vars:o}})},Ys=e=>{let t=qs(e);if(!t.ok||!t.data)throw new Error(t.summary);return{serviceName:t.data.serviceName,servicePath:t.data.servicePath,port:t.data.port,effects:t.changes,vars:t.data.vars}};f();f();f();import A from"chalk";import{execa as Pd}from"execa";import{createJiti as Sd}from"jiti";var Yr=async e=>{let{stdout:t}=await Pd("sh",["-c",e]);return t.trim()},bd="pf-local-nats",Ed="2.10-alpine",Td=4222,$d=8222,Ad=e=>({clientPort:e.clientPort??Td,monitoringPort:e.monitoringPort??$d,containerName:e.containerName??bd,version:e.version??Ed}),Id=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"],Rd=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),Nd=async()=>{try{return await Yr("docker info"),!0}catch{return!1}},Fd=async e=>{try{return(await Yr(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var Od=async e=>{let t=Id(e);try{return await Yr(`docker ${t.join(" ")}`),{success:!0,value:Rd(e)}}catch{return{success:!1}}},Md=e=>{console.log(A.green("\u2713 NATS started")),console.log(A.dim(` Client: ${e.clientUrl}`)),console.log(A.dim(` Monitoring: ${e.monitoringUrl}`)),console.log(A.dim(" Streams: ephemeral, auto-created by services")),console.log("")},Zs=async(e={})=>{let t=Ad(e);if(!await Nd())return console.log(A.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await Fd(t.containerName))return console.log(A.dim("\u2713 NATS already running")),!0;console.log(A.cyan("\u{1F680} Starting development infrastructure...")),console.log(A.dim(" NATS with JetStream (ephemeral)"));let r=await Od(t);return r.success?(Md(r.value),!0):(console.error(A.red("\u2717 Failed to start NATS")),!1)},Dd=e=>e.map(({stream:t,subjects:r})=>({stream:t,subjects:r,config:{storage:"memory",retention:"limits",maxAge:36e5}})),qr="@crossdelta/infrastructure",Xs=e=>e.includes(qr)&&(e.includes("is not defined by")||e.includes("Cannot find module")||e.includes("Cannot find package")),Qs=e=>{if(typeof e!="object"||e===null)return null;let{message:t}=e;return typeof t=="string"?t:null},_d=e=>{let t=Qs(e);if(t===null)return!0;if(Xs(t))return!1;let r=t.toLowerCase();return!r.includes("insufficient storage")&&!r.includes("connection refused")},jd=e=>{let t=Qs(e);if(t===null)return"Unknown error";let r=t.toLowerCase();return r.includes("insufficient storage")?["NATS has insufficient storage to create streams."," Your disk is likely full. Free space and restart:",""," docker system prune -af"," pf dev"].join(`
523
- `):r.includes("connection refused")?"Cannot connect to NATS \u2014 is the container running?":Xs(t)?[`${qr} is missing or too old to provide its /streams entry point.`,""," It is a peer dependency of this CLI, so neither `bun add -g` nor `npm i -g` installs it"," alongside pf, and bun reports nothing when it is absent. Install it explicitly:","",` bun add -g ${qr}`,""," Not continuing without it: letting the services create the streams instead leaves them in"," whatever shape they already had, so a corrected contract subject never takes effect and"," its events are dropped without an error."].join(`
524
- `):t},Zr=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:r}=x(e),o=await Sd(e,{moduleCache:!1}).import(r,{default:!0}),{collectStreamDefinitions:s}=await import("@crossdelta/infrastructure/streams"),i=s(o);if(i.length===0){console.log(A.dim(" No streams found in contracts"));return}let a=Dd(i);await t({streams:a});let c=i.map(l=>l.stream);console.log(A.dim(` Created ${i.length} ephemeral stream(s): ${c.join(", ")}`))}catch(t){if(!_d(t))throw console.error(A.red(`
525
- \u2717 ${jd(t)}
526
- `)),t;console.log(A.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log(A.dim(" Streams will be created when services connect"))}};var ei=`// env: string literals \u2192 written to .env.local by generate-env (use for values meaningful locally)
522
+ `},cd=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:he(r,"stub").delegateFromHandler?t.events.map(o=>{let s=Be(o),i=he(r,s);return{kind:"file:write",path:zr(e,i.filePath),content:id(o,t.workspaceScope)}}):[],ld=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:t.events.map(n=>{let{kebab:o}=Jr(n),s=Vr(r,o);return{kind:"file:write",path:zr(e,s.filePath),content:ad(n,t.workspaceScope,r)}}),pd=e=>e==="hono"?"hono":e==="nest"?"nestjs":"hono",Vs=(e,t,r,n)=>{let o=pd(n.framework),s=nd(e,t),i=cd(e,r,o),a=ld(e,r,o),c=od(r.serviceName,r.port,n),l=sd(r.envVarName,r.port);return[...s,...i,...a,c,l]};import{existsSync as md,readdirSync as dd,readFileSync as gd}from"fs";import{join as zs}from"path";var Js=4001,ud=e=>{let t=e.match(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/);if(t)return Number.parseInt(t[1],10);let r=e.match(/containerPort:\s*(\d+)/);return r?Number.parseInt(r[1],10):null},Ks=e=>{try{let t=zs(e,"infra","services");return md(t)?dd(t).filter(n=>n.endsWith(".ts")).reduce((n,o)=>{let s=gd(zs(t,o),"utf-8"),i=ud(s);return i!==null&&n.add(i),n},new Set):new Set}catch(t){return console.warn("Failed to scan ports:",t),new Set}},Kr=(e,t)=>e.has(t)?Kr(e,t+1):t;var hd=e=>{if(!e||e.trim().length===0)throw new Error("Service name cannot be empty");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(e))throw new Error(`Service name '${e}' must be kebab-case (lowercase, alphanumeric, hyphens only)`)},yd=(e,t,r)=>{if(t){if(t.startsWith("/"))return t;if(t.startsWith("."))return It(r,t);if(t.includes("/"))return It(r,t)}let n=E(r);return It(r,n.services,e)},vd=e=>[...new Set(e.map(t=>fd(t).streamName))],Cd=(e,t,r,n)=>{let s=x(t).packageName.split("/")[0],i=e.events??[],a=i.length>0||e.hasEvents||!1,c=i.length>0?vd(i):e.streams??[];return{serviceName:e.name,packageName:`${s}/${e.name}`,servicePath:r.replace(`${t}/`,""),port:n,envVarName:B(e.name),hasEvents:a,streams:c,events:i,workspaceScope:s,envVars:e.envVars}},kd=(e,t)=>e.files.filter(r=>!r.skip?.(t)).map(r=>({path:r.path,content:r.content(t)})),xd=(e,t,r)=>[...e.map(o=>({type:"file",path:It(r,o.path),description:`Service file: ${o.path}`})),{type:"config",path:`infra/services/${t}.ts`,description:"Infrastructure configuration"},{type:"env",path:".env.local",description:"Environment variables"}],wd=e=>[{command:`cd ${e} && bun dev`,description:"Start this service"},{command:"pf dev",description:"Start all services"}],qs=e=>{hd(e.name);let t=e.workspaceRoot??g(),r=yd(e.name,e.path,t),n=e.port??Kr(Ks(t),Js),o=Cd(e,t,r,n),s=Bs(e.type),i=kd(s,o),a=Vs(r,i,o,s),c=xd(i,e.name,r),l=wd(r);return Hr("service.generate",`Generated ${e.name} service (port ${n})`,{artifacts:c,changes:a,next:l,data:{serviceName:e.name,servicePath:r,port:n,vars:o}})},Ys=e=>{let t=qs(e);if(!t.ok||!t.data)throw new Error(t.summary);return{serviceName:t.data.serviceName,servicePath:t.data.servicePath,port:t.data.port,effects:t.changes,vars:t.data.vars}};f();f();f();import A from"chalk";import{execa as Sd}from"execa";import{createJiti as bd}from"jiti";var Yr=async e=>{let{stdout:t}=await Sd("sh",["-c",e]);return t.trim()},Zs="pf-local-nats",Ed="2.10-alpine",Td=4222,$d=8222,Ad=64*1024*1024,Id={storage:"memory",retention:"limits",maxAge:36e5,maxBytes:Ad},Rd=e=>({clientPort:e.clientPort??Td,monitoringPort:e.monitoringPort??$d,containerName:e.containerName??Zs,version:e.version??Ed}),Nd=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"],Fd=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),Od=async()=>{try{return await Yr("docker info"),!0}catch{return!1}},Md=async e=>{try{return(await Yr(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var Dd=async e=>{let t=Nd(e);try{return await Yr(`docker ${t.join(" ")}`),{success:!0,value:Fd(e)}}catch{return{success:!1}}},_d=e=>{console.log(A.green("\u2713 NATS started")),console.log(A.dim(` Client: ${e.clientUrl}`)),console.log(A.dim(` Monitoring: ${e.monitoringUrl}`)),console.log(A.dim(" Streams: ephemeral, auto-created by services")),console.log("")},Xs=async(e={})=>{let t=Rd(e);if(!await Od())return console.log(A.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await Md(t.containerName))return console.log(A.dim("\u2713 NATS already running")),!0;console.log(A.cyan("\u{1F680} Starting development infrastructure...")),console.log(A.dim(" NATS with JetStream (ephemeral)"));let r=await Dd(t);return r.success?(_d(r.value),!0):(console.error(A.red("\u2717 Failed to start NATS")),!1)},jd=e=>e.map(({stream:t,subjects:r})=>({stream:t,subjects:r,config:Id})),qr="@crossdelta/infrastructure",Qs=e=>e.includes(qr)&&(e.includes("is not defined by")||e.includes("Cannot find module")||e.includes("Cannot find package")),ei=e=>{if(typeof e!="object"||e===null)return null;let{message:t}=e;return typeof t=="string"?t:null},Ld=e=>{let t=ei(e);if(t===null)return!0;if(Qs(t))return!1;let r=t.toLowerCase();return!r.includes("insufficient storage")&&!r.includes("connection refused")},Wd=e=>{let t=ei(e);if(t===null)return"Unknown error";let r=t.toLowerCase();return r.includes("insufficient storage")?["NATS has insufficient storage to create streams."," JetStream fixes its storage limit when the server starts, at 75% of the free space it"," sees then, and never recomputes it. So a disk that was full when the container started"," keeps the old limit even after you free space. Restart the container first:","",` docker restart ${Zs}`," pf dev",""," If it still fails, the disk is full now as well:",""," docker system prune -af"].join(`
523
+ `):r.includes("connection refused")?"Cannot connect to NATS \u2014 is the container running?":Qs(t)?[`${qr} is missing or too old to provide its /streams entry point.`,""," It is a peer dependency of this CLI, so neither `bun add -g` nor `npm i -g` installs it"," alongside pf, and bun reports nothing when it is absent. Install it explicitly:","",` bun add -g ${qr}`,""," Not continuing without it: letting the services create the streams instead leaves them in"," whatever shape they already had, so a corrected contract subject never takes effect and"," its events are dropped without an error."].join(`
524
+ `):t},Zr=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:r}=x(e),o=await bd(e,{moduleCache:!1}).import(r,{default:!0}),{collectStreamDefinitions:s}=await import("@crossdelta/infrastructure/streams"),i=s(o);if(i.length===0){console.log(A.dim(" No streams found in contracts"));return}let a=jd(i);await t({streams:a});let c=i.map(l=>l.stream);console.log(A.dim(` Ensured ${i.length} ephemeral stream(s): ${c.join(", ")}`))}catch(t){if(!Ld(t))throw console.error(A.red(`
525
+ \u2717 ${Wd(t)}
526
+ `)),t;console.log(A.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log(A.dim(" Streams will be created when services connect"))}};var ti=`// env: string literals \u2192 written to .env.local by generate-env (use for values meaningful locally)
527
527
  // containerEnv: \u2192 only applied in the K8s container, never in .env.local
528
- // (use for deployment-specific values like ORIGIN or NODE_OPTIONS)`;function ti(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
528
+ // (use for deployment-specific values like ORIGIN or NODE_OPTIONS)`;function ri(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
529
529
  import { ports } from '@crossdelta/infrastructure'
530
530
 
531
531
  /**
@@ -534,7 +534,7 @@ import { ports } from '@crossdelta/infrastructure'
534
534
  * Internal-only service - accessed via cluster DNS:
535
535
  * http://${e}.{namespace}.svc.cluster.local:${t}
536
536
  */
537
- ${ei}
537
+ ${ti}
538
538
  const config: K8sServiceConfig = {
539
539
  name: '${e}',
540
540
  ports: ports().http(${t}).build(),
@@ -547,7 +547,7 @@ const config: K8sServiceConfig = {
547
547
  }
548
548
 
549
549
  export default config
550
- `}function ri(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
550
+ `}function ni(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
551
551
  import { ports } from '@crossdelta/infrastructure'
552
552
 
553
553
  /**
@@ -556,7 +556,7 @@ import { ports } from '@crossdelta/infrastructure'
556
556
  * Internal-only service - accessed via cluster DNS:
557
557
  * http://${e}.{namespace}.svc.cluster.local:${t}
558
558
  */
559
- ${ei}
559
+ ${ti}
560
560
  const config: K8sServiceConfig = {
561
561
  name: '${e}',
562
562
  ports: ports().http(${t}).build(),
@@ -569,53 +569,53 @@ const config: K8sServiceConfig = {
569
569
  }
570
570
 
571
571
  export default config
572
- `}v();import ne from"chalk";import Wd from"terminal-link";var Rt="integrations-run";import{z as T}from"zod";var Ld=T.object({name:T.string(),description:T.string(),link:T.url().optional(),install:T.union([T.string(),T.array(T.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:T.array(T.string()).optional(),run:T.array(T.string()).optional(),initial:T.boolean().optional(),interactive:T.boolean().optional()}),ni=T.array(Ld);var oi=e=>{try{return ni.parse(e)}catch(t){throw new Error(t.issues.map(r=>` - Path ${r.path.join(". ")} : ${r.message}`).join(`
573
- `))}};var D=()=>{try{let e=Re("bin/integration.collection.json");return oi(e)}catch(e){throw new Error(`Failed to load integrations!
572
+ `}v();import ne from"chalk";import Gd from"terminal-link";var Rt="integrations-run";import{z as T}from"zod";var Hd=T.object({name:T.string(),description:T.string(),link:T.url().optional(),install:T.union([T.string(),T.array(T.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:T.array(T.string()).optional(),run:T.array(T.string()).optional(),initial:T.boolean().optional(),interactive:T.boolean().optional()}),oi=T.array(Hd);var si=e=>{try{return oi.parse(e)}catch(t){throw new Error(t.issues.map(r=>` - Path ${r.path.join(". ")} : ${r.message}`).join(`
573
+ `))}};var D=()=>{try{let e=Re("bin/integration.collection.json");return si(e)}catch(e){throw new Error(`Failed to load integrations!
574
574
  Check your integration.collection.json:
575
- ${e.message}`)}},ye=()=>D().reduce((t,r)=>(r.initial&&t.push(r.name),t),[]),Hd=e=>!!e?.name&&!!e?.link&&!!e?.description,Nt=e=>{let t=D();if(!t?.length||!e?.length)return;let r=e.map(n=>t.find(o=>o.name===n)).filter(Hd);r.length&&(d.breakLine().log("\u{1F50C} Installed Integrations:"),r.forEach(({name:n,link:o,description:s})=>{let i=d.getStoredLogs(`${Rt}:${n}`);o&&d.log(`${Wd(ne.cyan(n),o)} - ${s}`),i.length&&d.log(i.map(a=>` \u203A ${ne.dim(a.message)}`).join(`
576
- `))}))},Gd=e=>e.toUpperCase().replace(/-/g,"_"),si=(e,t)=>{let r=Gd(e);d.breakLine().log(ne.bold("Environment variables:")).log(ne.dim(" Local (.env.local):")).log(ne.cyan(` ${r}_PORT=${t}`)).breakLine().log(ne.dim(" Production (auto-injected by infra):")).log(ne.cyan(` PORT=${t}`))};v();import ii from"chalk";var Bd=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},ai=async e=>{let{selectedIntegrations:t,cwd:r,packageManager:n=b(),task:o}=e;if(!t?.length||!o)return;let s=Ud(t,r,n,o);await rt(o,s)},Ud=(e,t,r,n)=>{let s=D()?.filter(a=>e.includes(a.name))?.flatMap(a=>a.install.map(c=>{let{name:l,version:p}=Bd(c);return{title:ii.cyanBright(`Adding ${c} (${a.name})`),fn:async()=>{it(`dependencies.${l}`,p,t)}}})),i={title:ii.cyanBright("Installing packages..."),fn:async()=>{await L({cwd:t,packageManager:r,task:n})}};return[...s??[],i]};v();import zd from"chalk";var ci=async e=>{let{selectedIntegrations:t,cwd:r,task:n}=e;if(!t?.length||!n)return;let o=Vd(t,r,n,e.packageManager);await rt(n,o)},Vd=(e,t,r,n)=>D().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(i=>({title:zd.cyanBright(`Running "${i}" for ${s.name}
577
- `),fn:()=>Jd(s,i,t,r,n)}))),Jd=async(e,t,r,n,o)=>{let s=`${Rt}:${e.name}`;try{if(e.interactive)return no(t,[],{cwd:r,context:s,task:n,manager:o});await Ne(t,[],{cwd:r,task:n,context:s})}catch(i){d.error(`Failed to run command "${t}" for ${e.name}: ${i.message}`)}};v();import{readFileSync as Qw,writeFileSync as eP}from"fs";import{join as rP}from"path";v();import{join as iP}from"path";import{ListrEnquirerPromptAdapter as Ue}from"@listr2/prompt-adapter-enquirer";var k=e=>({select:async t=>e.prompt(Ue).run({type:"select",message:t.message,choices:t.choices}),confirm:async t=>e.prompt(Ue).run({type:"confirm",message:t.message,initial:t.initial??!1}),toggle:async t=>e.prompt(Ue).run({type:"toggle",message:t.message,enabled:t.enabled??"Yes",disabled:t.disabled??"No",initial:t.initial??!1}),input:async t=>e.prompt(Ue).run({type:"input",message:t.message,initial:t.initial,validate:t.validate}),multiSelect:async t=>e.prompt(Ue).run({type:"MultiSelect",message:t.message,hint:t.hint,initial:t.initial,choices:t.choices})});v();import{readFileSync as kP}from"fs";import{join as wP}from"path";import NP from"chalk";import OP from"cli-table3";v();function Ft(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function li(e,t,r={},n=[],o=[]){if(!e){console.error("Subcommand is not defined.");return}let s=n.map(l=>t[l]).filter(l=>l!==void 0),i=o.map(l=>{let p=t[l];if(!(p===!1||p===void 0))return p===!0?`--${Ft(String(l))}`:`--${Ft(String(l))}=${String(p)}`}).filter(l=>l!==void 0),a=Object.entries(r).map(([l,p])=>{if(!(p===!1||p===void 0))return p===!0?`--${Ft(l)}`:`--${Ft(l)}=${String(p)}`}).filter(l=>l!==void 0),c=[...s,...i,...a].map(String);await e.parseAsync(c,{from:"user"})}import{basename as yg}from"path";import oe from"chalk";f();var ve={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{let r=k(t);if(e.userConfirmed=await r.toggle({initial:!0,message:"\u{1F680} Ready to launch your project?"}),!e.userConfirmed)throw new Error("Project creation was canceled by the user.")}};import{existsSync as Xr,readdirSync as qd,readFileSync as Yd,writeFileSync as Zd}from"fs";import{basename as Xd,join as Qr}from"path";var Qd=4001,eg=4e3;function tg(e){let t=[],r=e.matchAll(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/g);for(let c of r)t.push(Number(c[1]));let n=e.matchAll(/\.add(?:Http|Grpc)?\((\d+)/g);for(let c of n)t.push(Number(c[1]));let o=e.match(/containerPort\s*:\s*(\d+)/);o&&t.push(Number(o[1]));let s=e.match(/internalPorts\s*:\s*\[([^\]]+)\]/);if(s){let c=s[1].match(/\d+/g);c&&t.push(...c.map(Number))}let i=e.match(/httpPort\s*:\s*(\d+)/);i&&t.push(Number(i[1]));let a=e.matchAll(/const\s+\w*[pP]ort\w*\s*=\s*(\d+)/g);for(let c of a)t.push(Number(c[1]));return t}function rg(e,t){let r=t?Qd:eg,n=new Set;if(!Xr(e))return r;let o=qd(e).filter(i=>i.endsWith(".ts"));for(let i of o){let a=Qr(e,i);try{let c=Yd(a,"utf-8"),l=tg(c);for(let p of l)n.add(p)}catch{}}let s=r;for(;n.has(s);)s++;return s}function ng(e){return Xd(e)}var Ot={title:"Creating infrastructure service config",task:async(e,t)=>{let r=ng(e.projectName),n=g(),o=Qr(n,"infra","services");if(!Xr(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=Qr(o,`${r}.ts`);if(Xr(s)){t.title=`Service config already exists: infra/services/${r}.ts`;return}let i=rg(o,!0);e.assignedPort=i;let a=e.serviceType==="hono"?ti(r,i):ri(r,i);Zd(s,a),t.title=`Created infra/services/${r}.ts (port: ${i})`}};import{execSync as Mt}from"child_process";import{existsSync as og}from"fs";import{join as sg}from"path";var ig=()=>{try{return Mt("git --version",{stdio:"ignore"}),!0}catch{return!1}},ag=e=>og(sg(e,".git")),pi={title:"Initializing git repository",enabled:()=>ig(),skip:e=>ag(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{Mt("git init",{cwd:e.cwd,stdio:"ignore"}),Mt("git add -A",{cwd:e.cwd,stdio:"ignore"}),Mt('git commit -m "chore: initial commit"',{cwd:e.cwd,stdio:"ignore",env:{...process.env,GIT_AUTHOR_NAME:process.env.GIT_AUTHOR_NAME||"Platform SDK",GIT_AUTHOR_EMAIL:process.env.GIT_AUTHOR_EMAIL||"platform-sdk@localhost",GIT_COMMITTER_NAME:process.env.GIT_COMMITTER_NAME||"Platform SDK",GIT_COMMITTER_EMAIL:process.env.GIT_COMMITTER_EMAIL||"platform-sdk@localhost"}}),t.title="Git repository initialized with initial commit"}catch{t.title="Git initialization skipped (git error)"}}};import mi from"chalk";v();var Ce={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!Rr(),task:async(e,t)=>M(t,async r=>{await ns(t),e.elapsedTime+=r(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},ke={enabled:e=>!Rr()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{let r=k(t);console.log(["",`${mi.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${mi.underline("https://bun.sh")}`,os(),ss()].join(`
578
- `)),e.shouldInstallBun=await r.toggle({message:"Would you like to use Bun? (recommended)",initial:!0}),e.shouldInstallBun&&(e.packageManager="bun")}};import di from"chalk";v();var Dt={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>M(t,async r=>{let{selectedIntegrations:n,cwd:o,packageManager:s}=e;await ai({selectedIntegrations:n,packageManager:s,cwd:o,task:t}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}},_t={title:"Select integrations",enabled:e=>e.selectedIntegrations.length===0,task:async(e,t)=>{let r=k(t);e.selectedIntegrations=await r.multiSelect({hint:"\\nPress <space> to select/deselect, <enter> to confirm, <i> to invert selection",message:"Which integrations would you like to include?",initial:ye().map((n,o)=>o),choices:e.availableIntegrations.map(({name:n,description:o})=>({name:n,message:[di.bold(n),o].join(" - "),value:n}))}),!e.selectedIntegrations||e.selectedIntegrations.length===0?t.title="No integrations selected.":t.title=["Selected integrations:",...e.selectedIntegrations.map(n=>di.bold(`\u2022 ${n}`))].join("\\n")}};v();var gi={title:"Install Nest CLI",task:async(e,t)=>M(t,async r=>{await ro({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}};v();var jt={title:"Install dependencies",task:async(e,t)=>M(t,async r=>{await L({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()})};import cg from"chalk";v();var xe={enabled:e=>!e.removeDir&&!et(e.cwd),task:async(e,t)=>{let r=k(t);if(e.removeDir=await r.toggle({message:cg.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!e.removeDir)throw new Error("Project creation was canceled by the user.")}},we={enabled:e=>!!e.removeDir,task:async e=>Ln(e.cwd)};v();var Lt={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>M(t,async r=>{let{selectedIntegrations:n,cwd:o}=e;await ci({selectedIntegrations:n,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1}};v();var lg=["services/my-hono-service","services/my-nest-service","my-platform"],Pe={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?lg.includes(e.projectName):!0,task:async(e,t)=>{let r=k(t);e.projectName=await r.input({initial:e.projectName,message:"Enter project name",validate:n=>n?!0:"Project name is required."}),e.cwd&&(e.cwd=O(e.projectName))}};import ui from"chalk";var Se={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=dr(),e.packageManager){t.title=`Using ${ui.bold(e.packageManager)} as package manager.`;return}let r=k(t);e.packageManager=await r.select({message:"Which package manager would you like to use?",choices:to().map(n=>({name:n,value:n}))}),t.title=`Using ${ui.bold(e.packageManager)} as package manager.`}};import Wt from"chalk";var fi={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${Wt.bold(e.githubOwner)}`;return}let r=k(t);e.githubOwner=await r.input({message:"Enter GitHub organization or username",initial:"my-org",validate:n=>n?.trim()?!0:"GitHub owner is required."}),t.title=`GitHub owner: ${Wt.bold(e.githubOwner)}`}},hi={title:"Include GitHub CI/CD",task:async(e,t)=>{if(e.includeGitHubCI!==void 0){t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD";return}let r=k(t);e.includeGitHubCI=await r.toggle({message:"Include GitHub Actions workflows and CI/CD?",initial:!0,enabled:"Yes",disabled:"No"}),t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD"}};var yi={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${Wt.bold(e.pulumiStackBase)}`;return}let r=e.githubOwner||"myorg",n=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${r}/${n}`,s=k(t);e.pulumiStackBase=await s.input({message:"Enter Pulumi stack base name (org/project)",initial:o,validate:i=>i?.trim()?i.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),t.title=`Pulumi stack: ${Wt.bold(e.pulumiStackBase)}`}};v();import{mkdirSync as pg,writeFileSync as mg}from"fs";import{dirname as dg}from"path";v();var gg=e=>e==="hono"?"hono":"nestjs",ug=e=>{let t=dg(e.path);pg(t,{recursive:!0}),mg(e.path,e.content,"utf-8")},fg=(e,t)=>{let r=e.map(o=>{let s=o.path.match(/services\/[^/]+\/(.+)$/);return{path:s?s[1]:o.path,content:o.content}}),n=At(t,r);if(!n.valid){let o=n.violations.map(s=>` - ${s.code}: ${s.message} (${s.path})`).join(`
575
+ ${e.message}`)}},ye=()=>D().reduce((t,r)=>(r.initial&&t.push(r.name),t),[]),Bd=e=>!!e?.name&&!!e?.link&&!!e?.description,Nt=e=>{let t=D();if(!t?.length||!e?.length)return;let r=e.map(n=>t.find(o=>o.name===n)).filter(Bd);r.length&&(d.breakLine().log("\u{1F50C} Installed Integrations:"),r.forEach(({name:n,link:o,description:s})=>{let i=d.getStoredLogs(`${Rt}:${n}`);o&&d.log(`${Gd(ne.cyan(n),o)} - ${s}`),i.length&&d.log(i.map(a=>` \u203A ${ne.dim(a.message)}`).join(`
576
+ `))}))},Ud=e=>e.toUpperCase().replace(/-/g,"_"),ii=(e,t)=>{let r=Ud(e);d.breakLine().log(ne.bold("Environment variables:")).log(ne.dim(" Local (.env.local):")).log(ne.cyan(` ${r}_PORT=${t}`)).breakLine().log(ne.dim(" Production (auto-injected by infra):")).log(ne.cyan(` PORT=${t}`))};v();import ai from"chalk";var Vd=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},ci=async e=>{let{selectedIntegrations:t,cwd:r,packageManager:n=b(),task:o}=e;if(!t?.length||!o)return;let s=zd(t,r,n,o);await rt(o,s)},zd=(e,t,r,n)=>{let s=D()?.filter(a=>e.includes(a.name))?.flatMap(a=>a.install.map(c=>{let{name:l,version:p}=Vd(c);return{title:ai.cyanBright(`Adding ${c} (${a.name})`),fn:async()=>{it(`dependencies.${l}`,p,t)}}})),i={title:ai.cyanBright("Installing packages..."),fn:async()=>{await L({cwd:t,packageManager:r,task:n})}};return[...s??[],i]};v();import Jd from"chalk";var li=async e=>{let{selectedIntegrations:t,cwd:r,task:n}=e;if(!t?.length||!n)return;let o=Kd(t,r,n,e.packageManager);await rt(n,o)},Kd=(e,t,r,n)=>D().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(i=>({title:Jd.cyanBright(`Running "${i}" for ${s.name}
577
+ `),fn:()=>qd(s,i,t,r,n)}))),qd=async(e,t,r,n,o)=>{let s=`${Rt}:${e.name}`;try{if(e.interactive)return no(t,[],{cwd:r,context:s,task:n,manager:o});await Ne(t,[],{cwd:r,task:n,context:s})}catch(i){d.error(`Failed to run command "${t}" for ${e.name}: ${i.message}`)}};v();import{readFileSync as tP,writeFileSync as rP}from"fs";import{join as oP}from"path";v();import{join as cP}from"path";import{ListrEnquirerPromptAdapter as Ue}from"@listr2/prompt-adapter-enquirer";var k=e=>({select:async t=>e.prompt(Ue).run({type:"select",message:t.message,choices:t.choices}),confirm:async t=>e.prompt(Ue).run({type:"confirm",message:t.message,initial:t.initial??!1}),toggle:async t=>e.prompt(Ue).run({type:"toggle",message:t.message,enabled:t.enabled??"Yes",disabled:t.disabled??"No",initial:t.initial??!1}),input:async t=>e.prompt(Ue).run({type:"input",message:t.message,initial:t.initial,validate:t.validate}),multiSelect:async t=>e.prompt(Ue).run({type:"MultiSelect",message:t.message,hint:t.hint,initial:t.initial,choices:t.choices})});v();import{readFileSync as wP}from"fs";import{join as SP}from"path";import OP from"chalk";import DP from"cli-table3";v();function Ft(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function pi(e,t,r={},n=[],o=[]){if(!e){console.error("Subcommand is not defined.");return}let s=n.map(l=>t[l]).filter(l=>l!==void 0),i=o.map(l=>{let p=t[l];if(!(p===!1||p===void 0))return p===!0?`--${Ft(String(l))}`:`--${Ft(String(l))}=${String(p)}`}).filter(l=>l!==void 0),a=Object.entries(r).map(([l,p])=>{if(!(p===!1||p===void 0))return p===!0?`--${Ft(l)}`:`--${Ft(l)}=${String(p)}`}).filter(l=>l!==void 0),c=[...s,...i,...a].map(String);await e.parseAsync(c,{from:"user"})}import{basename as Cg}from"path";import oe from"chalk";f();var ve={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{let r=k(t);if(e.userConfirmed=await r.toggle({initial:!0,message:"\u{1F680} Ready to launch your project?"}),!e.userConfirmed)throw new Error("Project creation was canceled by the user.")}};import{existsSync as Xr,readdirSync as Zd,readFileSync as Xd,writeFileSync as Qd}from"fs";import{basename as eg,join as Qr}from"path";var tg=4001,rg=4e3;function ng(e){let t=[],r=e.matchAll(/ports\(\)\.(?:http|https|grpc|primary)\((\d+)\)/g);for(let c of r)t.push(Number(c[1]));let n=e.matchAll(/\.add(?:Http|Grpc)?\((\d+)/g);for(let c of n)t.push(Number(c[1]));let o=e.match(/containerPort\s*:\s*(\d+)/);o&&t.push(Number(o[1]));let s=e.match(/internalPorts\s*:\s*\[([^\]]+)\]/);if(s){let c=s[1].match(/\d+/g);c&&t.push(...c.map(Number))}let i=e.match(/httpPort\s*:\s*(\d+)/);i&&t.push(Number(i[1]));let a=e.matchAll(/const\s+\w*[pP]ort\w*\s*=\s*(\d+)/g);for(let c of a)t.push(Number(c[1]));return t}function og(e,t){let r=t?tg:rg,n=new Set;if(!Xr(e))return r;let o=Zd(e).filter(i=>i.endsWith(".ts"));for(let i of o){let a=Qr(e,i);try{let c=Xd(a,"utf-8"),l=ng(c);for(let p of l)n.add(p)}catch{}}let s=r;for(;n.has(s);)s++;return s}function sg(e){return eg(e)}var Ot={title:"Creating infrastructure service config",task:async(e,t)=>{let r=sg(e.projectName),n=g(),o=Qr(n,"infra","services");if(!Xr(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=Qr(o,`${r}.ts`);if(Xr(s)){t.title=`Service config already exists: infra/services/${r}.ts`;return}let i=og(o,!0);e.assignedPort=i;let a=e.serviceType==="hono"?ri(r,i):ni(r,i);Qd(s,a),t.title=`Created infra/services/${r}.ts (port: ${i})`}};import{execSync as Mt}from"child_process";import{existsSync as ig}from"fs";import{join as ag}from"path";var cg=()=>{try{return Mt("git --version",{stdio:"ignore"}),!0}catch{return!1}},lg=e=>ig(ag(e,".git")),mi={title:"Initializing git repository",enabled:()=>cg(),skip:e=>lg(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{Mt("git init",{cwd:e.cwd,stdio:"ignore"}),Mt("git add -A",{cwd:e.cwd,stdio:"ignore"}),Mt('git commit -m "chore: initial commit"',{cwd:e.cwd,stdio:"ignore",env:{...process.env,GIT_AUTHOR_NAME:process.env.GIT_AUTHOR_NAME||"Platform SDK",GIT_AUTHOR_EMAIL:process.env.GIT_AUTHOR_EMAIL||"platform-sdk@localhost",GIT_COMMITTER_NAME:process.env.GIT_COMMITTER_NAME||"Platform SDK",GIT_COMMITTER_EMAIL:process.env.GIT_COMMITTER_EMAIL||"platform-sdk@localhost"}}),t.title="Git repository initialized with initial commit"}catch{t.title="Git initialization skipped (git error)"}}};import di from"chalk";v();var Ce={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!Rr(),task:async(e,t)=>M(t,async r=>{await ns(t),e.elapsedTime+=r(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},ke={enabled:e=>!Rr()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{let r=k(t);console.log(["",`${di.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${di.underline("https://bun.sh")}`,os(),ss()].join(`
578
+ `)),e.shouldInstallBun=await r.toggle({message:"Would you like to use Bun? (recommended)",initial:!0}),e.shouldInstallBun&&(e.packageManager="bun")}};import gi from"chalk";v();var Dt={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>M(t,async r=>{let{selectedIntegrations:n,cwd:o,packageManager:s}=e;await ci({selectedIntegrations:n,packageManager:s,cwd:o,task:t}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}},_t={title:"Select integrations",enabled:e=>e.selectedIntegrations.length===0,task:async(e,t)=>{let r=k(t);e.selectedIntegrations=await r.multiSelect({hint:"\\nPress <space> to select/deselect, <enter> to confirm, <i> to invert selection",message:"Which integrations would you like to include?",initial:ye().map((n,o)=>o),choices:e.availableIntegrations.map(({name:n,description:o})=>({name:n,message:[gi.bold(n),o].join(" - "),value:n}))}),!e.selectedIntegrations||e.selectedIntegrations.length===0?t.title="No integrations selected.":t.title=["Selected integrations:",...e.selectedIntegrations.map(n=>gi.bold(`\u2022 ${n}`))].join("\\n")}};v();var ui={title:"Install Nest CLI",task:async(e,t)=>M(t,async r=>{await ro({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}};v();var jt={title:"Install dependencies",task:async(e,t)=>M(t,async r=>{await L({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()})};import pg from"chalk";v();var xe={enabled:e=>!e.removeDir&&!et(e.cwd),task:async(e,t)=>{let r=k(t);if(e.removeDir=await r.toggle({message:pg.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!e.removeDir)throw new Error("Project creation was canceled by the user.")}},we={enabled:e=>!!e.removeDir,task:async e=>Ln(e.cwd)};v();var Lt={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>M(t,async r=>{let{selectedIntegrations:n,cwd:o}=e;await li({selectedIntegrations:n,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1}};v();var mg=["services/my-hono-service","services/my-nest-service","my-platform"],Pe={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?mg.includes(e.projectName):!0,task:async(e,t)=>{let r=k(t);e.projectName=await r.input({initial:e.projectName,message:"Enter project name",validate:n=>n?!0:"Project name is required."}),e.cwd&&(e.cwd=O(e.projectName))}};import fi from"chalk";var Se={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=dr(),e.packageManager){t.title=`Using ${fi.bold(e.packageManager)} as package manager.`;return}let r=k(t);e.packageManager=await r.select({message:"Which package manager would you like to use?",choices:to().map(n=>({name:n,value:n}))}),t.title=`Using ${fi.bold(e.packageManager)} as package manager.`}};import Wt from"chalk";var hi={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${Wt.bold(e.githubOwner)}`;return}let r=k(t);e.githubOwner=await r.input({message:"Enter GitHub organization or username",initial:"my-org",validate:n=>n?.trim()?!0:"GitHub owner is required."}),t.title=`GitHub owner: ${Wt.bold(e.githubOwner)}`}},yi={title:"Include GitHub CI/CD",task:async(e,t)=>{if(e.includeGitHubCI!==void 0){t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD";return}let r=k(t);e.includeGitHubCI=await r.toggle({message:"Include GitHub Actions workflows and CI/CD?",initial:!0,enabled:"Yes",disabled:"No"}),t.title=e.includeGitHubCI?"Including GitHub CI/CD workflows":"Skipping GitHub CI/CD"}};var vi={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${Wt.bold(e.pulumiStackBase)}`;return}let r=e.githubOwner||"myorg",n=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${r}/${n}`,s=k(t);e.pulumiStackBase=await s.input({message:"Enter Pulumi stack base name (org/project)",initial:o,validate:i=>i?.trim()?i.includes("/")?!0:"Format should be org/project (e.g., myorg/myproject)":"Pulumi stack name is required."}),t.title=`Pulumi stack: ${Wt.bold(e.pulumiStackBase)}`}};v();import{mkdirSync as dg,writeFileSync as gg}from"fs";import{dirname as ug}from"path";v();var fg=e=>e==="hono"?"hono":"nestjs",hg=e=>{let t=ug(e.path);dg(t,{recursive:!0}),gg(e.path,e.content,"utf-8")},yg=(e,t)=>{let r=e.map(o=>{let s=o.path.match(/services\/[^/]+\/(.+)$/);return{path:s?s[1]:o.path,content:o.content}}),n=At(t,r);if(!n.valid){let o=n.violations.map(s=>` - ${s.code}: ${s.message} (${s.path})`).join(`
579
579
  `);throw new Error(`Policy violation(s) detected:
580
- ${o}`)}e.forEach(ug)},hg=async(e,t,r)=>{let{projectName:n,serviceType:o,hasEvents:s,streams:i}=e,a=n.split("/").pop()||n,l=Ys({type:o==="hono"?"hono-micro":"nest",name:a,path:n,hasEvents:s,streams:i}),p=l.effects.filter(y=>y.kind==="file:write"),m=gg(o);fg(p,m),e.assignedPort=l.port,e.elapsedTime+=r(),t.title=`Generated ${a} (port ${l.port}, ${e.elapsedTime}s)`},Ht={title:"Generating service",task:async(e,t)=>M(t,async r=>{await hg(e,t,r)})};var vg=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${E().services}/${t}`},Cg=async(e,t)=>{let{valid:r,config:n,error:o}=de();if(!r||!n){$(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=vg(e.name),i=t.packageManager||b(),a=await ft(t.description);if(ht(s,n,a),await yt({servicePath:s,description:a,serviceType:"hono",packageManager:i},n))d.breakLine().success("Service generated successfully!").breakLine().log(oe.dim("Next steps:")).log(oe.dim(` ${oe.cyan("pf dev")} - Start all services`)).log(oe.dim(` ${oe.cyan(`cd ${s} && bun dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},vi=J({name:"hono-micro",description:"Create a new Hono microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new hono-micro my-service --ai -d "Payment processing service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:Cg,buildContext:async(e,t)=>{let r=(e.name??"my-hono-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${E().services}/${r}`);let n=O(r),o=t.packageManager??(t.yes&&b()),s=D(),i=t.yes?ye():[],a=t.packageManager==="bun",c=!!t.yes||!!e.name&&e.name!=="my-hono-service";return{cwd:n,projectName:r,packageManager:o,shouldInstallBun:a,availableIntegrations:s,selectedIntegrations:i,serviceType:"hono",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Pe,xe,ke,Se,_t,ve],actions:[we,Ce,Ht,Ot,Dt,Lt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{d.breakLine().log(oe.bold.green("Hono Microservice created successfully!")),Nt(r),si(yg(e),n??8080);let o=t??b();d.breakLine().log(`To start the project, run:
581
- ${oe.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});import se from"chalk";f();v();var kg=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${E().services}/${t}`},xg=async(e,t)=>{let{valid:r,config:n,error:o}=de();if(!r||!n){$(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=kg(e.name),i=t.packageManager||b(),a=await ft(t.description);if(ht(s,n,a),await yt({servicePath:s,description:a,serviceType:"nest",packageManager:i},n))d.breakLine().success("Service generated successfully!").breakLine().log(se.dim("Next steps:")).log(se.dim(` ${se.cyan("pf dev")} - Start all services`)).log(se.dim(` ${se.cyan(`cd ${s} && bun run start:dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},Ci=J({name:"nest-micro",description:"Create a new NestJS microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new nest-micro my-service --ai -d "User authentication service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:xg,buildContext:async(e,t)=>{let r=(e.name??"my-nest-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${E().services}/${r}`);let n=O(r),o=t.packageManager??(t.yes&&b()),s=t.packageManager==="bun",i=D(),a=t.yes?ye():[],c=!!t.yes||!!e.name;return{cwd:n,projectName:r,shouldInstallBun:s,packageManager:o,availableIntegrations:i,selectedIntegrations:a,serviceType:"nest",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Pe,xe,ke,Se,_t,ve],actions:[we,Ce,Ht,Ot,jt,gi,Dt,Lt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{d.breakLine().log(se.bold.green("NestJS Microservice created successfully!")),Nt(r),d.breakLine().log(`To start the project, run:
582
- ${se.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});import _ from"chalk";v();import{spawnSync as Sg}from"child_process";import{chmodSync as bg,existsSync as rn,mkdirSync as Eg,readFileSync as Tg,writeFileSync as nn}from"fs";import{dirname as $g,join as on}from"path";import{existsSync as wg}from"fs";import{join as Gt}from"path";var Pg=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),tn=()=>{let e=Pg(),t=ee();return fe([Gt(e,"templates","workspace"),Gt(e,"..","..","..","..","templates","workspace"),Gt(t,"bin","templates","workspace")],"Workspace templates directory not found.")},ki=()=>{let e=tn(),t=Gt(e,"packages","contracts");if(!wg(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},Bt=(e,t)=>Gr(e,t);var xi=e=>{e.endsWith(".sh")&&bg(e,493)},Ag=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"pnpm-workspace.yaml.hbs",output:"pnpm-workspace.yaml",forPackageManager:"pnpm"},{template:"biome.json.hbs",output:"biome.json"},{template:"turbo.json.hbs",output:"turbo.json"},{template:"bunfig.toml.hbs",output:"bunfig.toml"},{template:"gitignore.hbs",output:".gitignore"},{template:"editorconfig.hbs",output:".editorconfig"},{template:"npmrc.hbs",output:".npmrc"},{template:".vscode/settings.json",output:".vscode/settings.json",isStatic:!0},{template:".vscode/extensions.json",output:".vscode/extensions.json",isStatic:!0},{template:"infra/package.json.hbs",output:"infra/package.json"},{template:"infra/index.ts.hbs",output:"infra/index.ts"},{template:"infra/tsconfig.json.hbs",output:"infra/tsconfig.json"},{template:"infra/Pulumi.yaml.hbs",output:"infra/Pulumi.yaml"},{template:"infra/Pulumi.dev.yaml.hbs",output:"infra/Pulumi.dev.yaml"},{template:"apps/.gitkeep",output:"apps/.gitkeep",isStatic:!0},{template:"services/.gitkeep",output:"services/.gitkeep",isStatic:!0},{template:"packages/.gitkeep",output:"packages/.gitkeep",isStatic:!0},{template:"docs/.gitkeep",output:"docs/.gitkeep",isStatic:!0},{template:"infra/services/.gitkeep",output:"infra/services/.gitkeep",isStatic:!0},{template:".github/README.md",output:".github/README.md",isStatic:!0,isGitHubCI:!0},{template:".github/dependabot.yml",output:".github/dependabot.yml",isStatic:!0,isGitHubCI:!0},{template:".github/workflows/lint-and-tests.yml.hbs",output:".github/workflows/lint-and-tests.yml",isGitHubCI:!0},{template:".github/workflows/build-and-deploy.yml.hbs",output:".github/workflows/build-and-deploy.yml",isGitHubCI:!0},{template:".github/workflows/publish-packages.yml",output:".github/workflows/publish-packages.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/setup-bun-install/action.yml.hbs",output:".github/actions/setup-bun-install/action.yml",isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/action.yml",output:".github/actions/check-image-tag-exists/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/index.js",output:".github/actions/check-image-tag-exists/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/action.yml",output:".github/actions/generate-scope-matrix/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/index.js",output:".github/actions/generate-scope-matrix/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/prepare-build-context/action.yml",output:".github/actions/prepare-build-context/action.yml",isStatic:!0,isGitHubCI:!0},{template:"CLAUDE.md",output:"CLAUDE.md",isStatic:!0},{template:".claude/rules/cloudevents.md",output:".claude/rules/cloudevents.md",isStatic:!0}],wi={title:"Creating workspace structure",task:async(e,t)=>{if(rn(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=tn(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let m=Sg(c,["--version"],{encoding:"utf-8",timeout:5e3}).stdout?.trim();if(m&&/^\d+\.\d+/.test(m))return`${c}@${m}`}catch{}return{bun:"bun@1.2.7",npm:"npm@10.9.2",yarn:"yarn@4.6.0",pnpm:"pnpm@9.15.2"}[c]||`${c}@latest`},i={projectName:e.projectName,scope:`@${e.projectName}`,githubOwner:e.githubOwner||"",pulumiStackBase:e.pulumiStackBase||e.projectName,packageManager:o,packageManagerVersion:s(o)},a=Ag.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of a){let l=on(e.cwd,c.output),p=$g(l);if(rn(p)||Eg(p,{recursive:!0}),c.isStatic){let m=on(r,c.template);rn(m)?nn(l,Tg(m)):nn(l,""),xi(l)}else{let m=on(r,c.template),y=Bt(m,i);nn(l,y),xi(l)}}t.title="Workspace structure created"}};f();import{existsSync as Si,mkdirSync as Pi,readFileSync as Ig,writeFileSync as Rg}from"fs";import{join as Ut}from"path";import Ng from"chalk";var Fg=()=>{let e=Ut(process.cwd(),"package.json");if(!Si(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse(Ig(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},Og=()=>{let e=Fg(),{relativePath:t,packagePath:r}=x();if(Si(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=ki(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};Pi(r,{recursive:!0}),Pi(Ut(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"tsup.config.ts",output:"tsup.config.ts"},{template:"README.md.hbs",output:"README.md"},{template:"src/index.ts",output:"src/index.ts"},{template:"src/stream-policies.ts.hbs",output:"src/stream-policies.ts"},{template:"src/events/index.ts",output:"src/events/index.ts"}];for(let i of s){let a=Ut(n,i.template),c=Ut(r,i.output),l=Bt(a,o);Rg(c,l,"utf-8")}},bi={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),Og(),t.title="Contracts package initialized"}catch(n){throw t.title=Ng.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};import Mg from"chalk";var Ei={title:"Registering shell completion",task:async(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),await He(),t.title="Shell completion registered"}catch{t.title=Mg.dim("Shell completion skipped")}finally{process.chdir(r)}}};var Ti=J({name:"workspace",description:"Create a new workspace with infrastructure setup",arguments:[["[name]","Name or path of the workspace"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["-o, --github-owner <owner>","GitHub organization or username"],["-s, --pulumi-stack <name>","Pulumi stack base name (org/project)"],["--no-github","Skip GitHub CI/CD workflows"],["--remove-dir","Remove existing directory before creating (internal use)"]],exampleUsage:"pf new workspace my-platform -o my-org",buildContext:(e,t)=>{let r=(e.name??"my-platform").trim(),n=O(r),o=!!t.yes,s=t.packageManager??(o?b():void 0),i=t.packageManager==="bun",a=t.githubOwner??(o?"my-org":void 0),c=t.pulumiStack??(o?`${a}/${r}`:void 0),l=t.github===!1?!1:o?!0:void 0,p=!!e.name,m=t.removeDir||o;return{cwd:n,projectName:r,shouldInstallBun:i,packageManager:s,elapsedTime:0,userConfirmed:o,skipInputPrompts:p&&!o,removeDir:m,githubOwner:a,pulumiStackBase:c,includeGitHubCI:l}},prompts:[{enabled:e=>!e.userConfirmed,task:async(e,t)=>{try{let r=g();if(!await k(t).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${r}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");t.title=_.yellow("Warning: Creating nested workspace")}catch(r){if(X(r)&&r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},Pe,xe,fi,hi,yi,ke,Se,ve],actions:[we,Ce,wi,bi,jt,pi,Ei],onComplete:({projectName:e,includeGitHubCI:t})=>{d.breakLine().log(_.bold.green("Workspace created successfully!")),d.breakLine().log(_.bold("Next steps:")).log(` 1. ${_.cyan(`cd ${e}`)}`).log(` 2. ${_.cyan("exec $SHELL")} ${_.dim("(enable tab completion)")}`),t&&d.breakLine().log(_.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${_.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${_.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${_.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),d.breakLine().log(_.bold("Structure created:")).log(" apps/ # Frontend applications").log(" services/ # Backend microservices").log(" packages/").log(" \u2514\u2500\u2500 contracts/ # Shared event contracts").log(" infra/").log(" \u251C\u2500\u2500 index.ts # Pulumi entry point").log(" \u251C\u2500\u2500 services/ # Service configs").log(" \u251C\u2500\u2500 Pulumi.yaml # Pulumi project config").log(" \u2514\u2500\u2500 Pulumi.dev.yaml # Dev stack config"),t&&d.log(" .github/").log(" \u251C\u2500\u2500 workflows/ # CI/CD workflows").log(" \u2514\u2500\u2500 actions/ # Custom actions"),d.breakLine().log("Happy coding! \u{1F389}").breakLine()}});var ze=[{name:"Hono Microservice",value:"hono-micro",command:vi,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:Ci,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:Ti,supportsAi:!1}],$i=()=>{let e=J({name:"new",description:"Create a new project",arguments:[["[type]","Type of the project (e.g., nest-micro, hono-micro, workspace)"]],exampleUsage:"platform new hono-micro test-service",buildContext:t=>({projectType:t.type??"",useAi:!1,aiDescription:"",elapsedTime:0,cwd:process.cwd()}),prompts:[{enabled:t=>!t.projectType,task:async(t,r)=>{let o=await k(r).select({message:"Select Project type",choices:ze});t.projectType=ze.find(s=>s.name===o)?.value||"",r.title=`Using ${q.bold(o)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,r)=>{try{g(),r.title="Workspace detected"}catch{let n=["Not in a workspace directory","",`Current directory: ${process.cwd()}`,"","This command must be run from within a workspace created with pf new workspace","","To create a new workspace, run:",""," pf new workspace my-platform"].join(`
583
- `);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=g();if(!await k(r).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${n}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");r.title=q.yellow("Warning: Creating nested workspace")}catch(n){if(X(n)&&n.message?.includes("cancelled"))throw n;r.title="No existing workspace detected"}}},{enabled:t=>!!t.projectType,task:async(t,r)=>{let o={"hono-micro":"services/my-hono-service","nest-micro":"services/my-nest-service",workspace:"my-platform"}[t.projectType]||"my-project",s=t.projectType==="workspace"?"\u{1F4E6} Workspace name:":"\u{1F4E6} Service path (e.g., services/my-service):",a=await k(r).input({message:s,initial:o});t.servicePath=a.trim(),r.title=`Path: ${q.dim(a)}`}},{enabled:t=>!!ze.find(n=>n.value===t.projectType)?.supportsAi&&de().valid,task:async(t,r)=>{let o=await k(r).toggle({message:"Use AI to generate service code?",initial:!1});t.useAi=o,r.title=o?q.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:t=>t.useAi,task:async(t,r)=>{let o=await k(r).input({message:"Describe what this service should do:"});t.aiDescription=o,r.title=`Description: ${q.dim(o.slice(0,50))}${o.length>50?"...":""}`}},{enabled:t=>{if(!t.servicePath)return!1;let r=O(t.servicePath);return!et(r)},task:async(t,r)=>{if(!await k(r).toggle({message:q.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,r.title=q.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,r)=>{if(!await k(r).toggle({message:"\u{1F680} Ready to launch your project?",initial:!0}))throw new Error("Project creation was canceled by the user.")}}],actions:[],onComplete:async t=>{ze.find(s=>s.value===t.projectType)||e.error(q.red(`Project type ${t.projectType} is not supported.`));let r=e.commands.find(s=>s.name()===t.projectType),n={};t.projectType!=="workspace"&&(n.yes=!0);let o=[];t.servicePath&&o.push("servicePath"),t.shouldRemoveDir&&(n.removeDir=!0),t.useAi&&(n.ai=!0,n.description=t.aiDescription),await li(r,t,n,o)}});for(let t of ze)e.addCommand(t.command);return e};import{Command as Ug}from"commander";v();import{createHash as Dg}from"crypto";import{existsSync as ie,readdirSync as Ai,readFileSync as Ii,unlinkSync as _g,writeFileSync as jg}from"fs";import{join as Y}from"path";import Lg from"chokidar";f();v();var Wg=e=>{let t=Y(e,"infra","services");if(!ie(t))return[];let r=Ai(t).filter(a=>a.endsWith(".ts")&&a!=="index.ts").map(a=>a.replace(".ts","")),n=E(e),o=a=>{let c=Y(e,a);return ie(c)?Ai(c).filter(l=>ie(Y(c,l,"package.json"))):[]},s=[...o(n.services),...o(n.apps)],i=r.filter(a=>!s.includes(a));for(let a of i)_g(Y(t,`${a}.ts`));return i},Ri=".install-hash",Ni=e=>{let t=Ii(e);return Dg("sha256").update(t).digest("hex")},Hg=e=>{let t=Y(e,"node_modules",Ri),r=Y(e,"bun.lock");return!ie(r)||!ie(t)?!0:Ii(t,"utf-8")!==Ni(r)},Gg=e=>{let t=Y(e,"bun.lock"),r=Y(e,"node_modules",Ri);ie(t)&&jg(r,Ni(t),"utf-8")},sn=async e=>{let t=Wg(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),Hg(e)&&(await L({cwd:e,quiet:!0}),Gg(e)),await Fe("generate-env",{cwd:e})},an=async e=>{await Zs()&&await Zr(e)},Fi=e=>{let{eventsPath:t}=x(e);if(!ie(t))return async()=>{};let r=ae(async()=>{console.log(`
584
- \u{1F4E6} Contracts changed, updating streams...`),await Zr(e)},500),n=Lg.watch(`${t}/**/*.ts`,{ignoreInitial:!0,ignored:["**/index.ts","**/*.test.ts","**/*.spec.ts"]});return n.on("add",r).on("change",r),async()=>{await n.close()}};Ze();import Oi from"chalk";f();var cn=e=>new Promise(t=>setTimeout(t,e)),Mi=e=>process.stdout.write(`${e}
585
- `),Bg=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},Di=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),ln=async(e,t,r=[])=>{let{dev:n}=Ie(t),o=r.length>0?[...r]:n.filter,s=qn(Kn(".env.local",t),o);s.length>0&&(await Qn(s),await cn(50));let i=o.flatMap(a=>["--filter",a]);Mi(Oi.cyan("\u{1F525} Starting services...")),Mi(Oi.dim(` Command: turbo run ${qt} --continue${i.length?` ${i.join(" ")}`:""}`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=Yn("turbo",["run",qt,"--continue","--no-daemon",...i],{cwd:t,envFile:".env.local",onExit:a=>{e.isRestarting||e.isShuttingDown||a===1&&process.exit(w.SUCCESS)}})},zt=async e=>{let t=e.turboProcess?.pid;if(t){e.isShuttingDown=!0;try{try{process.kill(-t,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await cn(200);try{process.kill(-t,"SIGKILL")}catch{}await cn(30)}catch{}e.turboProcess=null,Bg()}};var _i=new Ug("dev").description("Start development mode with auto-reload").option("-f, --filter <packages...>","Only start these workspace packages (e.g. @orderboss/website). Overrides pf.dev.filter, and narrows the ports freed on start so a second worktree does not kill the first one.").action(async e=>{let t=e.filter??[],r;try{r=g()}catch(l){$(l);return}let n=Di(),o=async()=>{await sn(r),await an(r),await ln(n,r,t)},i=ae(async()=>{if(!(n.isRestarting||n.isShuttingDown)){n.isRestarting=!0,console.log(`
580
+ ${o}`)}e.forEach(hg)},vg=async(e,t,r)=>{let{projectName:n,serviceType:o,hasEvents:s,streams:i}=e,a=n.split("/").pop()||n,l=Ys({type:o==="hono"?"hono-micro":"nest",name:a,path:n,hasEvents:s,streams:i}),p=l.effects.filter(y=>y.kind==="file:write"),m=fg(o);yg(p,m),e.assignedPort=l.port,e.elapsedTime+=r(),t.title=`Generated ${a} (port ${l.port}, ${e.elapsedTime}s)`},Ht={title:"Generating service",task:async(e,t)=>M(t,async r=>{await vg(e,t,r)})};var kg=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${E().services}/${t}`},xg=async(e,t)=>{let{valid:r,config:n,error:o}=de();if(!r||!n){$(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=kg(e.name),i=t.packageManager||b(),a=await ft(t.description);if(ht(s,n,a),await yt({servicePath:s,description:a,serviceType:"hono",packageManager:i},n))d.breakLine().success("Service generated successfully!").breakLine().log(oe.dim("Next steps:")).log(oe.dim(` ${oe.cyan("pf dev")} - Start all services`)).log(oe.dim(` ${oe.cyan(`cd ${s} && bun dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},Ci=J({name:"hono-micro",description:"Create a new Hono microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new hono-micro my-service --ai -d "Payment processing service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:xg,buildContext:async(e,t)=>{let r=(e.name??"my-hono-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${E().services}/${r}`);let n=O(r),o=t.packageManager??(t.yes&&b()),s=D(),i=t.yes?ye():[],a=t.packageManager==="bun",c=!!t.yes||!!e.name&&e.name!=="my-hono-service";return{cwd:n,projectName:r,packageManager:o,shouldInstallBun:a,availableIntegrations:s,selectedIntegrations:i,serviceType:"hono",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Pe,xe,ke,Se,_t,ve],actions:[we,Ce,Ht,Ot,Dt,Lt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{d.breakLine().log(oe.bold.green("Hono Microservice created successfully!")),Nt(r),ii(Cg(e),n??8080);let o=t??b();d.breakLine().log(`To start the project, run:
581
+ ${oe.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});import se from"chalk";f();v();var wg=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${E().services}/${t}`},Pg=async(e,t)=>{let{valid:r,config:n,error:o}=de();if(!r||!n){$(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=wg(e.name),i=t.packageManager||b(),a=await ft(t.description);if(ht(s,n,a),await yt({servicePath:s,description:a,serviceType:"nest",packageManager:i},n))d.breakLine().success("Service generated successfully!").breakLine().log(se.dim("Next steps:")).log(se.dim(` ${se.cyan("pf dev")} - Start all services`)).log(se.dim(` ${se.cyan(`cd ${s} && bun run start:dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},ki=J({name:"nest-micro",description:"Create a new NestJS microservice with the Crossdelta setup. Use --ai for AI-powered generation.",arguments:[["[name]","Name or path of the service"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["--ai","Use AI to generate service code based on a description"],["-d, --description <description>","Service description for AI generation (requires --ai)"],["--remove-dir","Remove existing directory before creating (used internally)"]],exampleUsage:'platform new nest-micro my-service --ai -d "User authentication service"',shouldSkipWorkflow:(e,t)=>!!t.ai,onSkipWorkflow:Pg,buildContext:async(e,t)=>{let r=(e.name??"my-nest-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${E().services}/${r}`);let n=O(r),o=t.packageManager??(t.yes&&b()),s=t.packageManager==="bun",i=D(),a=t.yes?ye():[],c=!!t.yes||!!e.name;return{cwd:n,projectName:r,shouldInstallBun:s,packageManager:o,availableIntegrations:i,selectedIntegrations:a,serviceType:"nest",elapsedTime:0,userConfirmed:!!t.yes,skipInputPrompts:c,removeDir:!!t.removeDir||!!t.yes}},prompts:[Pe,xe,ke,Se,_t,ve],actions:[we,Ce,Ht,Ot,jt,ui,Dt,Lt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{d.breakLine().log(se.bold.green("NestJS Microservice created successfully!")),Nt(r),d.breakLine().log(`To start the project, run:
582
+ ${se.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});import _ from"chalk";v();import{spawnSync as Eg}from"child_process";import{chmodSync as Tg,existsSync as rn,mkdirSync as $g,readFileSync as Ag,writeFileSync as nn}from"fs";import{dirname as Ig,join as on}from"path";import{existsSync as Sg}from"fs";import{join as Gt}from"path";var bg=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),tn=()=>{let e=bg(),t=ee();return fe([Gt(e,"templates","workspace"),Gt(e,"..","..","..","..","templates","workspace"),Gt(t,"bin","templates","workspace")],"Workspace templates directory not found.")},xi=()=>{let e=tn(),t=Gt(e,"packages","contracts");if(!Sg(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},Bt=(e,t)=>Gr(e,t);var wi=e=>{e.endsWith(".sh")&&Tg(e,493)},Rg=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"pnpm-workspace.yaml.hbs",output:"pnpm-workspace.yaml",forPackageManager:"pnpm"},{template:"biome.json.hbs",output:"biome.json"},{template:"turbo.json.hbs",output:"turbo.json"},{template:"bunfig.toml.hbs",output:"bunfig.toml"},{template:"gitignore.hbs",output:".gitignore"},{template:"editorconfig.hbs",output:".editorconfig"},{template:"npmrc.hbs",output:".npmrc"},{template:".vscode/settings.json",output:".vscode/settings.json",isStatic:!0},{template:".vscode/extensions.json",output:".vscode/extensions.json",isStatic:!0},{template:"infra/package.json.hbs",output:"infra/package.json"},{template:"infra/index.ts.hbs",output:"infra/index.ts"},{template:"infra/tsconfig.json.hbs",output:"infra/tsconfig.json"},{template:"infra/Pulumi.yaml.hbs",output:"infra/Pulumi.yaml"},{template:"infra/Pulumi.dev.yaml.hbs",output:"infra/Pulumi.dev.yaml"},{template:"apps/.gitkeep",output:"apps/.gitkeep",isStatic:!0},{template:"services/.gitkeep",output:"services/.gitkeep",isStatic:!0},{template:"packages/.gitkeep",output:"packages/.gitkeep",isStatic:!0},{template:"docs/.gitkeep",output:"docs/.gitkeep",isStatic:!0},{template:"infra/services/.gitkeep",output:"infra/services/.gitkeep",isStatic:!0},{template:".github/README.md",output:".github/README.md",isStatic:!0,isGitHubCI:!0},{template:".github/dependabot.yml",output:".github/dependabot.yml",isStatic:!0,isGitHubCI:!0},{template:".github/workflows/lint-and-tests.yml.hbs",output:".github/workflows/lint-and-tests.yml",isGitHubCI:!0},{template:".github/workflows/build-and-deploy.yml.hbs",output:".github/workflows/build-and-deploy.yml",isGitHubCI:!0},{template:".github/workflows/publish-packages.yml",output:".github/workflows/publish-packages.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/setup-bun-install/action.yml.hbs",output:".github/actions/setup-bun-install/action.yml",isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/action.yml",output:".github/actions/check-image-tag-exists/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/index.js",output:".github/actions/check-image-tag-exists/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/action.yml",output:".github/actions/generate-scope-matrix/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/index.js",output:".github/actions/generate-scope-matrix/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/prepare-build-context/action.yml",output:".github/actions/prepare-build-context/action.yml",isStatic:!0,isGitHubCI:!0},{template:"CLAUDE.md",output:"CLAUDE.md",isStatic:!0},{template:".claude/rules/cloudevents.md",output:".claude/rules/cloudevents.md",isStatic:!0}],Pi={title:"Creating workspace structure",task:async(e,t)=>{if(rn(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=tn(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let m=Eg(c,["--version"],{encoding:"utf-8",timeout:5e3}).stdout?.trim();if(m&&/^\d+\.\d+/.test(m))return`${c}@${m}`}catch{}return{bun:"bun@1.2.7",npm:"npm@10.9.2",yarn:"yarn@4.6.0",pnpm:"pnpm@9.15.2"}[c]||`${c}@latest`},i={projectName:e.projectName,scope:`@${e.projectName}`,githubOwner:e.githubOwner||"",pulumiStackBase:e.pulumiStackBase||e.projectName,packageManager:o,packageManagerVersion:s(o)},a=Rg.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of a){let l=on(e.cwd,c.output),p=Ig(l);if(rn(p)||$g(p,{recursive:!0}),c.isStatic){let m=on(r,c.template);rn(m)?nn(l,Ag(m)):nn(l,""),wi(l)}else{let m=on(r,c.template),y=Bt(m,i);nn(l,y),wi(l)}}t.title="Workspace structure created"}};f();import{existsSync as bi,mkdirSync as Si,readFileSync as Ng,writeFileSync as Fg}from"fs";import{join as Ut}from"path";import Og from"chalk";var Mg=()=>{let e=Ut(process.cwd(),"package.json");if(!bi(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse(Ng(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},Dg=()=>{let e=Mg(),{relativePath:t,packagePath:r}=x();if(bi(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=xi(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};Si(r,{recursive:!0}),Si(Ut(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"tsup.config.ts",output:"tsup.config.ts"},{template:"README.md.hbs",output:"README.md"},{template:"src/index.ts",output:"src/index.ts"},{template:"src/stream-policies.ts.hbs",output:"src/stream-policies.ts"},{template:"src/events/index.ts",output:"src/events/index.ts"}];for(let i of s){let a=Ut(n,i.template),c=Ut(r,i.output),l=Bt(a,o);Fg(c,l,"utf-8")}},Ei={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),Dg(),t.title="Contracts package initialized"}catch(n){throw t.title=Og.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};import _g from"chalk";var Ti={title:"Registering shell completion",task:async(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),await He(),t.title="Shell completion registered"}catch{t.title=_g.dim("Shell completion skipped")}finally{process.chdir(r)}}};var $i=J({name:"workspace",description:"Create a new workspace with infrastructure setup",arguments:[["[name]","Name or path of the workspace"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["-o, --github-owner <owner>","GitHub organization or username"],["-s, --pulumi-stack <name>","Pulumi stack base name (org/project)"],["--no-github","Skip GitHub CI/CD workflows"],["--remove-dir","Remove existing directory before creating (internal use)"]],exampleUsage:"pf new workspace my-platform -o my-org",buildContext:(e,t)=>{let r=(e.name??"my-platform").trim(),n=O(r),o=!!t.yes,s=t.packageManager??(o?b():void 0),i=t.packageManager==="bun",a=t.githubOwner??(o?"my-org":void 0),c=t.pulumiStack??(o?`${a}/${r}`:void 0),l=t.github===!1?!1:o?!0:void 0,p=!!e.name,m=t.removeDir||o;return{cwd:n,projectName:r,shouldInstallBun:i,packageManager:s,elapsedTime:0,userConfirmed:o,skipInputPrompts:p&&!o,removeDir:m,githubOwner:a,pulumiStackBase:c,includeGitHubCI:l}},prompts:[{enabled:e=>!e.userConfirmed,task:async(e,t)=>{try{let r=g();if(!await k(t).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${r}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");t.title=_.yellow("Warning: Creating nested workspace")}catch(r){if(X(r)&&r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},Pe,xe,hi,yi,vi,ke,Se,ve],actions:[we,Ce,Pi,Ei,jt,mi,Ti],onComplete:({projectName:e,includeGitHubCI:t})=>{d.breakLine().log(_.bold.green("Workspace created successfully!")),d.breakLine().log(_.bold("Next steps:")).log(` 1. ${_.cyan(`cd ${e}`)}`).log(` 2. ${_.cyan("exec $SHELL")} ${_.dim("(enable tab completion)")}`),t&&d.breakLine().log(_.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${_.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${_.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${_.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),d.breakLine().log(_.bold("Structure created:")).log(" apps/ # Frontend applications").log(" services/ # Backend microservices").log(" packages/").log(" \u2514\u2500\u2500 contracts/ # Shared event contracts").log(" infra/").log(" \u251C\u2500\u2500 index.ts # Pulumi entry point").log(" \u251C\u2500\u2500 services/ # Service configs").log(" \u251C\u2500\u2500 Pulumi.yaml # Pulumi project config").log(" \u2514\u2500\u2500 Pulumi.dev.yaml # Dev stack config"),t&&d.log(" .github/").log(" \u251C\u2500\u2500 workflows/ # CI/CD workflows").log(" \u2514\u2500\u2500 actions/ # Custom actions"),d.breakLine().log("Happy coding! \u{1F389}").breakLine()}});var Ve=[{name:"Hono Microservice",value:"hono-micro",command:Ci,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:ki,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:$i,supportsAi:!1}],Ai=()=>{let e=J({name:"new",description:"Create a new project",arguments:[["[type]","Type of the project (e.g., nest-micro, hono-micro, workspace)"]],exampleUsage:"platform new hono-micro test-service",buildContext:t=>({projectType:t.type??"",useAi:!1,aiDescription:"",elapsedTime:0,cwd:process.cwd()}),prompts:[{enabled:t=>!t.projectType,task:async(t,r)=>{let o=await k(r).select({message:"Select Project type",choices:Ve});t.projectType=Ve.find(s=>s.name===o)?.value||"",r.title=`Using ${q.bold(o)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,r)=>{try{g(),r.title="Workspace detected"}catch{let n=["Not in a workspace directory","",`Current directory: ${process.cwd()}`,"","This command must be run from within a workspace created with pf new workspace","","To create a new workspace, run:",""," pf new workspace my-platform"].join(`
583
+ `);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=g();if(!await k(r).toggle({message:`\u26A0\uFE0F You are inside an existing workspace (${n}). Create a nested workspace anyway?`,initial:!1}))throw new Error("Workspace creation cancelled - already inside a workspace");r.title=q.yellow("Warning: Creating nested workspace")}catch(n){if(X(n)&&n.message?.includes("cancelled"))throw n;r.title="No existing workspace detected"}}},{enabled:t=>!!t.projectType,task:async(t,r)=>{let o={"hono-micro":"services/my-hono-service","nest-micro":"services/my-nest-service",workspace:"my-platform"}[t.projectType]||"my-project",s=t.projectType==="workspace"?"\u{1F4E6} Workspace name:":"\u{1F4E6} Service path (e.g., services/my-service):",a=await k(r).input({message:s,initial:o});t.servicePath=a.trim(),r.title=`Path: ${q.dim(a)}`}},{enabled:t=>!!Ve.find(n=>n.value===t.projectType)?.supportsAi&&de().valid,task:async(t,r)=>{let o=await k(r).toggle({message:"Use AI to generate service code?",initial:!1});t.useAi=o,r.title=o?q.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:t=>t.useAi,task:async(t,r)=>{let o=await k(r).input({message:"Describe what this service should do:"});t.aiDescription=o,r.title=`Description: ${q.dim(o.slice(0,50))}${o.length>50?"...":""}`}},{enabled:t=>{if(!t.servicePath)return!1;let r=O(t.servicePath);return!et(r)},task:async(t,r)=>{if(!await k(r).toggle({message:q.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,r.title=q.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,r)=>{if(!await k(r).toggle({message:"\u{1F680} Ready to launch your project?",initial:!0}))throw new Error("Project creation was canceled by the user.")}}],actions:[],onComplete:async t=>{Ve.find(s=>s.value===t.projectType)||e.error(q.red(`Project type ${t.projectType} is not supported.`));let r=e.commands.find(s=>s.name()===t.projectType),n={};t.projectType!=="workspace"&&(n.yes=!0);let o=[];t.servicePath&&o.push("servicePath"),t.shouldRemoveDir&&(n.removeDir=!0),t.useAi&&(n.ai=!0,n.description=t.aiDescription),await pi(r,t,n,o)}});for(let t of Ve)e.addCommand(t.command);return e};import{Command as zg}from"commander";v();import{createHash as jg}from"crypto";import{existsSync as ie,readdirSync as Ii,readFileSync as Ri,unlinkSync as Lg,writeFileSync as Wg}from"fs";import{join as Y}from"path";import Hg from"chokidar";f();v();var Gg=e=>{let t=Y(e,"infra","services");if(!ie(t))return[];let r=Ii(t).filter(a=>a.endsWith(".ts")&&a!=="index.ts").map(a=>a.replace(".ts","")),n=E(e),o=a=>{let c=Y(e,a);return ie(c)?Ii(c).filter(l=>ie(Y(c,l,"package.json"))):[]},s=[...o(n.services),...o(n.apps)],i=r.filter(a=>!s.includes(a));for(let a of i)Lg(Y(t,`${a}.ts`));return i},Ni=".install-hash",Fi=e=>{let t=Ri(e);return jg("sha256").update(t).digest("hex")},Bg=e=>{let t=Y(e,"node_modules",Ni),r=Y(e,"bun.lock");return!ie(r)||!ie(t)?!0:Ri(t,"utf-8")!==Fi(r)},Ug=e=>{let t=Y(e,"bun.lock"),r=Y(e,"node_modules",Ni);ie(t)&&Wg(r,Fi(t),"utf-8")},sn=async e=>{let t=Gg(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),Bg(e)&&(await L({cwd:e,quiet:!0}),Ug(e)),await Fe("generate-env",{cwd:e})},an=async e=>{await Xs()&&await Zr(e)},Oi=e=>{let{eventsPath:t}=x(e);if(!ie(t))return async()=>{};let r=ae(async()=>{console.log(`
584
+ \u{1F4E6} Contracts changed, updating streams...`),await Zr(e)},500),n=Hg.watch(`${t}/**/*.ts`,{ignoreInitial:!0,ignored:["**/index.ts","**/*.test.ts","**/*.spec.ts"]});return n.on("add",r).on("change",r),async()=>{await n.close()}};Ze();import Mi from"chalk";f();var cn=e=>new Promise(t=>setTimeout(t,e)),Di=e=>process.stdout.write(`${e}
585
+ `),Vg=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},_i=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),ln=async(e,t,r=[])=>{let{dev:n}=Ie(t),o=r.length>0?[...r]:n.filter,s=qn(Kn(".env.local",t),o);s.length>0&&(await Qn(s),await cn(50));let i=o.flatMap(a=>["--filter",a]);Di(Mi.cyan("\u{1F525} Starting services...")),Di(Mi.dim(` Command: turbo run ${qt} --continue${i.length?` ${i.join(" ")}`:""}`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=Yn("turbo",["run",qt,"--continue","--no-daemon",...i],{cwd:t,envFile:".env.local",onExit:a=>{e.isRestarting||e.isShuttingDown||a===1&&process.exit(w.SUCCESS)}})},Vt=async e=>{let t=e.turboProcess?.pid;if(t){e.isShuttingDown=!0;try{try{process.kill(-t,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await cn(200);try{process.kill(-t,"SIGKILL")}catch{}await cn(30)}catch{}e.turboProcess=null,Vg()}};var ji=new zg("dev").description("Start development mode with auto-reload").option("-f, --filter <packages...>","Only start these workspace packages (e.g. @orderboss/website). Overrides pf.dev.filter, and narrows the ports freed on start so a second worktree does not kill the first one.").action(async e=>{let t=e.filter??[],r;try{r=g()}catch(l){$(l);return}let n=_i(),o=async()=>{await sn(r),await an(r),await ln(n,r,t)},i=ae(async()=>{if(!(n.isRestarting||n.isShuttingDown)){n.isRestarting=!0,console.log(`
586
586
  \u{1F504} Change detected, restarting...
587
- `);try{await zt(n),await sn(r),await an(r),await ln(n,r,t)}catch(l){$(l)}finally{n.isRestarting=!1}}},300),a=async()=>{n.isShuttingDown||(console.log(`
588
- \u{1F6D1} Shutting down...`),await zt(n),process.exit(w.SUCCESS))};process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",a),process.on("SIGTERM",a);let c;try{await o(),Tn(r,i),c=Fi(r),console.log(`
587
+ `);try{await Vt(n),await sn(r),await an(r),await ln(n,r,t)}catch(l){$(l)}finally{n.isRestarting=!1}}},300),a=async()=>{n.isShuttingDown||(console.log(`
588
+ \u{1F6D1} Shutting down...`),await Vt(n),process.exit(w.SUCCESS))};process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",a),process.on("SIGTERM",a);let c;try{await o(),Tn(r,i),c=Oi(r),console.log(`
589
589
  \u{1F440} Watching for changes...`),console.log(` Press Ctrl+C twice to exit (first stops Turbo, second triggers cleanup)
590
- `)}catch(l){await c?.(),await zt(n),$(l)}});import Hi from"chalk";import{Command as nu}from"commander";import{existsSync as zg,readFileSync as Vg,writeFileSync as Jg}from"fs";import Kg from"os";import ji from"path";import pn from"chalk";import{Command as qg}from"commander";v();var{name:Yg,publishConfig:Zg}=R,Xg=Zg?.registry,Qg=Yg?.split("/")[0],jE=new qg("token:set").description(pn.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)",Qg).option("--registry <registry>","Registry URL",Xg).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)=>Li(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${pn.cyan(`
590
+ `)}catch(l){await c?.(),await Vt(n),$(l)}});import Gi from"chalk";import{Command as su}from"commander";import{existsSync as Jg,readFileSync as Kg,writeFileSync as qg}from"fs";import Yg from"os";import Li from"path";import pn from"chalk";import{Command as Zg}from"commander";v();var{name:Xg,publishConfig:Qg}=R,eu=Qg?.registry,tu=Xg?.split("/")[0],WE=new Zg("token:set").description(pn.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)",tu).option("--registry <registry>","Registry URL",eu).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)=>Wi(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${pn.cyan(`
591
591
  Example:`)}
592
592
  ${pn.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
593
- `),eu=e=>e?ji.join(process.cwd(),".npmrc"):ji.join(Kg.homedir(),".npmrc"),tu=(e,t,r)=>{let n=new URL(r).host;return t?`${t}:registry=https://${n}
594
- //${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},ru=e=>zg(e)?Vg(e,"utf8"):"",mn=(e,t)=>Jg(e,t),Li=(e,t,r,n=!1,o=!1)=>{let s=eu(n),i=tu(e,t,r),a=new URL(r).host,c=ru(s),l=new RegExp(`//${a}/:_authToken=\\S+`);if(!c){mn(s,`${i}
593
+ `),ru=e=>e?Li.join(process.cwd(),".npmrc"):Li.join(Yg.homedir(),".npmrc"),nu=(e,t,r)=>{let n=new URL(r).host;return t?`${t}:registry=https://${n}
594
+ //${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},ou=e=>Jg(e)?Kg(e,"utf8"):"",mn=(e,t)=>qg(e,t),Wi=(e,t,r,n=!1,o=!1)=>{let s=ru(n),i=nu(e,t,r),a=new URL(r).host,c=ou(s),l=new RegExp(`//${a}/:_authToken=\\S+`);if(!c){mn(s,`${i}
595
595
  `),d.success(`Created new .npmrc and set token for ${a}`);return}if(l.test(c)){if(!o){d.warn(`Token for ${a} already exists in ${s}. Use --force to overwrite.`);return}c=c.replace(l,i),mn(s,c),d.success(`Overwrote existing token for ${a} in ${s}`);return}c+=`
596
596
  ${i}
597
- `,mn(s,c),d.success(`Appended token for ${a} to ${s}`)},Wi=(e,t)=>Li(e,t.scope||"",t.registry||"",t.local,t.force);var{name:ou,publishConfig:su}=R,iu=su?.registry,au=ou?.split("/")[0],dn=new nu("token").description("Token management commands");dn.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)",au).option("--registry <registry>","Registry URL",iu).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(Wi).addHelpText("after",()=>`${Hi.cyan(`
597
+ `,mn(s,c),d.success(`Appended token for ${a} to ${s}`)},Hi=(e,t)=>Wi(e,t.scope||"",t.registry||"",t.local,t.force);var{name:iu,publishConfig:au}=R,cu=au?.registry,lu=iu?.split("/")[0],dn=new su("token").description("Token management commands");dn.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)",lu).option("--registry <registry>","Registry URL",cu).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(Hi).addHelpText("after",()=>`${Gi.cyan(`
598
598
  Example:`)}
599
- ${Hi.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
600
- `);dn.action(()=>{let e=ge({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 Gi=dn;import un from"chalk";import{Command as ku}from"commander";f();Ze();var JE={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};import{confirm as Ui,input as du,password as gu,select as zi}from"@inquirer/prompts";import P from"chalk";var cu=[/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],lu=async(e,t,r=1e4)=>{let n=new AbortController,o=setTimeout(()=>n.abort(),r);try{return await fetch(e,{...t,signal:n.signal})}finally{clearTimeout(o)}},pu=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(),mu=async(e,t)=>{let r=Me(e),n=await lu(r.modelsApiUrl,{headers:r.buildHeaders(t)});if(!n.ok)throw new Error(`${r.name} API error: ${n.status}`);let o=await n.json(),s=r.parseModelsResponse(o);if(!Array.isArray(s)||s.length===0)throw new Error(`No models returned from ${r.name} API`);let i=s.filter(a=>{let c=r.modelFilters.some(p=>p.test(a.id)),l=cu.some(p=>p.test(a.id));return c&&!l}).sort((a,c)=>{let l=typeof a.created=="number"?a.created:new Date(a.created).getTime();return(typeof c.created=="number"?c.created:new Date(c.created).getTime())-l}).map(a=>({name:pu(a.id),value:a.id}));if(i.length===0)throw new Error(`No chat models found from ${r.name} API`);return i};async function Bi(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await mu(e,t),fromApi:!0}}V();function uu(){if(!De())return null;try{let e=pt();return console.log(P.dim(`Found existing configuration at ${Q}
599
+ ${Gi.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
600
+ `);dn.action(()=>{let e=ge({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 Bi=dn;import un from"chalk";import{Command as wu}from"commander";f();Ze();var qE={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};import{confirm as Vi,input as uu,password as fu,select as zi}from"@inquirer/prompts";import P from"chalk";var pu=[/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],mu=async(e,t,r=1e4)=>{let n=new AbortController,o=setTimeout(()=>n.abort(),r);try{return await fetch(e,{...t,signal:n.signal})}finally{clearTimeout(o)}},du=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(),gu=async(e,t)=>{let r=Me(e),n=await mu(r.modelsApiUrl,{headers:r.buildHeaders(t)});if(!n.ok)throw new Error(`${r.name} API error: ${n.status}`);let o=await n.json(),s=r.parseModelsResponse(o);if(!Array.isArray(s)||s.length===0)throw new Error(`No models returned from ${r.name} API`);let i=s.filter(a=>{let c=r.modelFilters.some(p=>p.test(a.id)),l=pu.some(p=>p.test(a.id));return c&&!l}).sort((a,c)=>{let l=typeof a.created=="number"?a.created:new Date(a.created).getTime();return(typeof c.created=="number"?c.created:new Date(c.created).getTime())-l}).map(a=>({name:du(a.id),value:a.id}));if(i.length===0)throw new Error(`No chat models found from ${r.name} API`);return i};async function Ui(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await gu(e,t),fromApi:!0}}z();function hu(){if(!De())return null;try{let e=pt();return console.log(P.dim(`Found existing configuration at ${Q}
601
601
  `)),e}catch{return console.log(P.yellow(`Found corrupted configuration, starting fresh.
602
- `)),null}}async function fu(e,t){return console.log(P.dim(`
602
+ `)),null}}async function yu(e,t){return console.log(P.dim(`
603
603
  \u{1F4CB} Get your ${e} API key here:`)),console.log(P.cyan(` ${t}
604
- `)),gu({message:`Enter your ${e} API key:`,mask:"*",validate:r=>r.trim()?r.length<10?"API key seems too short":!0:"API key cannot be empty"})}async function hu(e,t,r){let n=await zi({message:"Select model:",choices:e,default:t?.provider===r?t.model:void 0});return await Ui({message:"Enter a custom model ID instead?",default:!1})?du({message:"Enter custom model ID:",default:n,validate:s=>s.trim()?!0:"Model ID cannot be empty"}):n}function Vi(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function yu(e,t){console.log(P.green.bold(`
604
+ `)),fu({message:`Enter your ${e} API key:`,mask:"*",validate:r=>r.trim()?r.length<10?"API key seems too short":!0:"API key cannot be empty"})}async function vu(e,t,r){let n=await zi({message:"Select model:",choices:e,default:t?.provider===r?t.model:void 0});return await Vi({message:"Enter a custom model ID instead?",default:!1})?uu({message:"Enter custom model ID:",default:n,validate:s=>s.trim()?!0:"Model ID cannot be empty"}):n}function Ji(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function Cu(e,t){console.log(P.green.bold(`
605
605
  \u2705 AI configuration saved successfully!
606
- `)),console.log(P.dim(`Configuration file: ${Q}`)),console.log(P.dim("API Key: Stored securely in system keychain")),console.log(P.dim(`Provider: ${e.provider}`)),console.log(P.dim(`Model: ${e.model}`)),console.log(P.dim(`API Key: ${Vi(t)}
606
+ `)),console.log(P.dim(`Configuration file: ${Q}`)),console.log(P.dim("API Key: Stored securely in system keychain")),console.log(P.dim(`Provider: ${e.provider}`)),console.log(P.dim(`Model: ${e.model}`)),console.log(P.dim(`API Key: ${Ji(t)}
607
607
  `)),console.log(P.cyan("You can now use AI-powered service generation:")),console.log(P.dim(` pf new hono-micro services/my-service --ai
608
- `))}async function vu(e){let t=await lt(e);if(t)return t;let r=Me(e);return process.env[r.defaultApiKeyEnvVar]??null}async function Ji(){console.log(P.cyan.bold(`
608
+ `))}async function ku(e){let t=await lt(e);if(t)return t;let r=Me(e);return process.env[r.defaultApiKeyEnvVar]??null}async function Ki(){console.log(P.cyan.bold(`
609
609
  \u{1F916} AI Configuration Setup
610
- `));let e=uu();try{let t=await zi({message:"Select AI provider:",choices:go(),default:e?.provider??ur.provider}),r=Me(t),n,o=await vu(t);o&&(console.log(P.green(`
611
- \u2713 Found existing API key: ${Vi(o)}`)),await Ui({message:"Use this existing API key?",default:!0})&&(n=o)),n||(n=await fu(r.name,r.apiKeyUrl)),console.log(P.dim(`
612
- Fetching available models...`));let s;try{s=(await Bi(t,n)).models,console.log(P.green(`\u2713 Loaded ${s.length} models from ${r.name} API
610
+ `));let e=hu();try{let t=await zi({message:"Select AI provider:",choices:go(),default:e?.provider??ur.provider}),r=Me(t),n,o=await ku(t);o&&(console.log(P.green(`
611
+ \u2713 Found existing API key: ${Ji(o)}`)),await Vi({message:"Use this existing API key?",default:!0})&&(n=o)),n||(n=await yu(r.name,r.apiKeyUrl)),console.log(P.dim(`
612
+ Fetching available models...`));let s;try{s=(await Ui(t,n)).models,console.log(P.green(`\u2713 Loaded ${s.length} models from ${r.name} API
613
613
  `))}catch(c){console.error(P.red(`
614
614
  \u274C Failed to fetch models: ${kn(c)}`)),console.log(P.yellow(`
615
615
  Please check your API key and try again.
616
- `)),process.exit(w.CONFIG_ERROR)}let i=await hu(s,e,t),a={provider:t,model:i.trim()};uo(a),await fo(t,n),yu(a,n)}catch(t){throw X(t)&&t.name==="ExitPromptError"&&(console.log(P.yellow(`
616
+ `)),process.exit(w.CONFIG_ERROR)}let i=await vu(s,e,t),a={provider:t,model:i.trim()};uo(a),await fo(t,n),Cu(a,n)}catch(t){throw X(t)&&t.name==="ExitPromptError"&&(console.log(P.yellow(`
617
617
  Setup cancelled.
618
- `)),process.exit(w.CANCELLED)),t}}import{existsSync as aT,readFileSync as cT}from"fs";import{homedir as pT}from"os";import{join as dT}from"path";var gn=async(e,t=!1)=>{try{return _r(e,t),await He({verbose:t}),!0}catch{return!1}};var Vt=e=>{let t=new ku("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
618
+ `)),process.exit(w.CANCELLED)),t}}import{existsSync as lT,readFileSync as pT}from"fs";import{homedir as dT}from"os";import{join as uT}from"path";var gn=async(e,t=!1)=>{try{return _r(e,t),await He({verbose:t}),!0}catch{return!1}};var zt=e=>{let t=new wu("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
619
619
  Examples:
620
620
  $ pf setup completion
621
621
  $ pf setup completion --verbose
@@ -625,6 +625,6 @@ Examples:
625
625
  `)))}),t.command("ai").description("Configure AI provider and API key for code generation").addHelpText("after",`
626
626
  Example:
627
627
  $ pf setup ai
628
- `).action(async()=>{await Ji()}),t.action(()=>{let r=ge({title:"\u2699\uFE0F Platform Setup",commands:[{name:"completion",description:"Install shell autocompletion"},{name:"ai",description:"Configure AI provider"}],footer:'Run "pf setup <command> --help" for more information'});console.log(r)}),t},xu=Vt("pf");V();f();import Pu from"chalk";import{Command as qi}from"commander";import Ki from"chalk";var wu=e=>({debug:()=>{},info:e?()=>{}:t=>console.log(` ${t}`),warn:e?()=>{}:t=>console.log(Ki.yellow(` ${t}`)),error:e?()=>{}:t=>console.error(Ki.red(` ${t}`))}),fn=async e=>{let{command:t,args:r,options:n,context:o,silent:s=!1}=e,i=await t.run(r,n),a=i?.effects??[];if(a.length>0){let c={workspace:o.workspace,logger:wu(s)};Wr(a,c)}if(!s&&i?.output){let c=Array.isArray(i.output)?i.output:[i.output];for(let l of c)console.log(l)}return{effects:a,output:i?.output}};var Su=e=>e.required?`<${e.name}>`:`[${e.name}]`,bu=(e,t)=>{e.argument(Su(t),t.description)},Eu=(e,t)=>{t.default!==void 0?e.option(t.flags,t.description,t.default):e.option(t.flags,t.description)},Tu=(e,t)=>Object.fromEntries(e.args.map((r,n)=>[r.name,t[n]])),$u=e=>e[e.length-2],Au=(e,t)=>async(...r)=>{try{await fn({command:e,args:Tu(e,r),options:$u(r),context:t})}catch(n){console.error(Pu.red(`Error executing ${e.name}:`),n instanceof Error?n.message:n),process.exit(1)}},Yi=(e,t)=>{let r=new qi(e.name).description(e.description);return e.args.forEach(n=>{bu(r,n)}),e.options.forEach(n=>{Eu(r,n)}),r.action(Au(e,t)),r},hn=(e,t,r,n)=>{let o=new qi(e).description(t);return r.forEach(s=>{o.addCommand(Yi(s,n))}),o};wt();process.on("SIGINT",()=>{process.exit(w.CANCELLED)});process.on("unhandledRejection",e=>{throw Ye(e)&&process.exit(w.CANCELLED),e});process.on("uncaughtException",e=>{$(e)});var Ve=new Ru,Zi=Object.keys(R.bin||{}),[vn="pf",yn]=Zi.length>0?Zi:["pf"],{description:Xi,version:Fu,repository:Qi,homepage:Ou}=R,ea=Xi?.split(/ —|,|\./)[0]||Xi||"Platform CLI",ra=Qi?.url?`https://${Qi.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,ta=ra||Ou,Mu=ra?"GitHub":"README",Du=ta?[Je.bold(ea),`
628
+ `).action(async()=>{await Ki()}),t.action(()=>{let r=ge({title:"\u2699\uFE0F Platform Setup",commands:[{name:"completion",description:"Install shell autocompletion"},{name:"ai",description:"Configure AI provider"}],footer:'Run "pf setup <command> --help" for more information'});console.log(r)}),t},Pu=zt("pf");z();f();import bu from"chalk";import{Command as Yi}from"commander";import qi from"chalk";var Su=e=>({debug:()=>{},info:e?()=>{}:t=>console.log(` ${t}`),warn:e?()=>{}:t=>console.log(qi.yellow(` ${t}`)),error:e?()=>{}:t=>console.error(qi.red(` ${t}`))}),fn=async e=>{let{command:t,args:r,options:n,context:o,silent:s=!1}=e,i=await t.run(r,n),a=i?.effects??[];if(a.length>0){let c={workspace:o.workspace,logger:Su(s)};Wr(a,c)}if(!s&&i?.output){let c=Array.isArray(i.output)?i.output:[i.output];for(let l of c)console.log(l)}return{effects:a,output:i?.output}};var Eu=e=>e.required?`<${e.name}>`:`[${e.name}]`,Tu=(e,t)=>{e.argument(Eu(t),t.description)},$u=(e,t)=>{t.default!==void 0?e.option(t.flags,t.description,t.default):e.option(t.flags,t.description)},Au=(e,t)=>Object.fromEntries(e.args.map((r,n)=>[r.name,t[n]])),Iu=e=>e[e.length-2],Ru=(e,t)=>async(...r)=>{try{await fn({command:e,args:Au(e,r),options:Iu(r),context:t})}catch(n){console.error(bu.red(`Error executing ${e.name}:`),n instanceof Error?n.message:n),process.exit(1)}},Zi=(e,t)=>{let r=new Yi(e.name).description(e.description);return e.args.forEach(n=>{Tu(r,n)}),e.options.forEach(n=>{$u(r,n)}),r.action(Ru(e,t)),r},hn=(e,t,r,n)=>{let o=new Yi(e).description(t);return r.forEach(s=>{o.addCommand(Zi(s,n))}),o};wt();process.on("SIGINT",()=>{process.exit(w.CANCELLED)});process.on("unhandledRejection",e=>{throw Ye(e)&&process.exit(w.CANCELLED),e});process.on("uncaughtException",e=>{$(e)});var ze=new Fu,Xi=Object.keys(R.bin||{}),[vn="pf",yn]=Xi.length>0?Xi:["pf"],{description:Qi,version:Mu,repository:ea,homepage:Du}=R,ta=Qi?.split(/ —|,|\./)[0]||Qi||"Platform CLI",na=ea?.url?`https://${ea.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,ra=na||Du,_u=na?"GitHub":"README",ju=ra?[Je.bold(ta),`
629
629
 
630
- `,Je.cyan("See more at: "),Je.bold(Nu(Mu,String(ta)))].join(""):Je.bold(ea),_u=[Vt(vn),$i(),_i,Gi,io],ju=async()=>{try{let e=g(),t=Ie(e);if(!t.plugins?.length)return[];let r=x(e),n=Pt({workspaceRoot:e,availableServices:at(e),contracts:{path:`${r.relativePath}/src`,packageName:r.packageName}}),o=[];for(let s of t.plugins)try{let{plugin:i}=await St(s,n),a=hn(i.name,i.description??`Commands from ${i.name}`,i.commands,n);o.push(a)}catch(i){console.warn(`\u26A0\uFE0F Failed to load plugin '${s}':`,i.message)}return o}catch{return[]}},Lu=async()=>{let e=await ju(),t=[..._u,...e];Ve.name(vn).description(Du).version(Fu||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:r=>Je.cyan(r.name())}).addHelpText("after",as),yn&&yn!==vn&&Ve.alias(yn);for(let r of t)Ve.addCommand(r);Ve.command("__workspace-hash",{hidden:!0}).action(()=>{let r=process.cwd(),n=Math.abs(r.split("").reduce((o,s)=>(o<<5)-o+s.charCodeAt(0)|0,0));console.log(n)}),cs(Ve,Iu,t)};Lu();
630
+ `,Je.cyan("See more at: "),Je.bold(Ou(_u,String(ra)))].join(""):Je.bold(ta),Lu=[zt(vn),Ai(),ji,Bi,io],Wu=async()=>{try{let e=g(),t=Ie(e);if(!t.plugins?.length)return[];let r=x(e),n=Pt({workspaceRoot:e,availableServices:at(e),contracts:{path:`${r.relativePath}/src`,packageName:r.packageName}}),o=[];for(let s of t.plugins)try{let{plugin:i}=await St(s,n),a=hn(i.name,i.description??`Commands from ${i.name}`,i.commands,n);o.push(a)}catch(i){console.warn(`\u26A0\uFE0F Failed to load plugin '${s}':`,i.message)}return o}catch{return[]}},Hu=async()=>{let e=await Wu(),t=[...Lu,...e];ze.name(vn).description(ju).version(Mu||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:r=>Je.cyan(r.name())}).addHelpText("after",as),yn&&yn!==vn&&ze.alias(yn);for(let r of t)ze.addCommand(r);ze.command("__workspace-hash",{hidden:!0}).action(()=>{let r=process.cwd(),n=Math.abs(r.split("").reduce((o,s)=>(o<<5)-o+s.charCodeAt(0)|0,0));console.log(n)}),cs(ze,Nu,t)};Hu();
@@ -7,7 +7,7 @@
7
7
  "pulumi": "pulumi"
8
8
  },
9
9
  "dependencies": {
10
- "@crossdelta/cloudevents": "^0.8.4",
10
+ "@crossdelta/cloudevents": "^0.10.0",
11
11
  "@crossdelta/infrastructure": "^0.15.3",
12
12
  "{{scope}}/contracts": "workspace:*",
13
13
  "@pulumi/digitalocean": "^4.55.0",
@@ -19,7 +19,7 @@
19
19
  "clean": "rm -rf dist"
20
20
  },
21
21
  "dependencies": {
22
- "@crossdelta/cloudevents": "^0.8.4",
22
+ "@crossdelta/cloudevents": "^0.10.0",
23
23
  "@crossdelta/infrastructure": "^0.15.3",
24
24
  "zod": "^4.0.0"
25
25
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossdelta/platform-sdk",
3
- "version": "0.24.0",
3
+ "version": "0.24.1",
4
4
  "description": "Platform toolkit for event-driven microservices — keeping code and infrastructure in lockstep.",
5
5
  "keywords": [
6
6
  "cli",
@@ -118,7 +118,7 @@
118
118
  "@ai-sdk/anthropic": "^2.0.53",
119
119
  "@ai-sdk/openai": "^2.0.79",
120
120
  "@angular-devkit/core": "^21.0.0",
121
- "@crossdelta/cloudevents": "^0.8.4",
121
+ "@crossdelta/cloudevents": "^0.10.0",
122
122
  "@crossdelta/flowcore": "^0.1.2",
123
123
  "@faker-js/faker": "^9.8.0",
124
124
  "@inquirer/prompts": "^7.5.0",