@crossdelta/platform-sdk 0.19.10 → 0.19.12

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.
Files changed (29) hide show
  1. package/bin/cli.mjs +144 -126
  2. package/bin/templates/workspace/infra/package.json.hbs +2 -2
  3. package/bin/templates/workspace/packages/contracts/package.json.hbs +2 -2
  4. package/bin/templates/workspace/turbo.json +1 -2
  5. package/package.json +4 -4
  6. package/bin/chunk-634PL24Z.mjs +0 -20
  7. package/bin/config-CKQHYOF4.mjs +0 -2
  8. package/bin/templates/workspace/.github/README.md +0 -70
  9. package/bin/templates/workspace/.github/actions/check-image-tag-exists/action.yml +0 -27
  10. package/bin/templates/workspace/.github/actions/check-image-tag-exists/index.js +0 -179
  11. package/bin/templates/workspace/.github/actions/check-path-changes/action.yml +0 -21
  12. package/bin/templates/workspace/.github/actions/check-path-changes/index.js +0 -192
  13. package/bin/templates/workspace/.github/actions/detect-skipped-services/action.yml +0 -38
  14. package/bin/templates/workspace/.github/actions/generate-scope-matrix/action.yml +0 -21
  15. package/bin/templates/workspace/.github/actions/generate-scope-matrix/index.js +0 -370
  16. package/bin/templates/workspace/.github/actions/prepare-build-context/action.yml +0 -108
  17. package/bin/templates/workspace/.github/actions/resolve-scope-tags/action.yml +0 -31
  18. package/bin/templates/workspace/.github/actions/resolve-scope-tags/index.js +0 -398
  19. package/bin/templates/workspace/.github/actions/setup-bun-install/action.yml.hbs +0 -57
  20. package/bin/templates/workspace/.github/copilot-chat-configuration.json +0 -49
  21. package/bin/templates/workspace/.github/dependabot.yml +0 -18
  22. package/bin/templates/workspace/.github/workflows/build-and-deploy.yml.hbs +0 -243
  23. package/bin/templates/workspace/.github/workflows/lint-and-tests.yml.hbs +0 -32
  24. package/bin/templates/workspace/.github/workflows/publish-packages.yml +0 -202
  25. package/bin/templates/workspace/apps/.gitkeep +0 -0
  26. package/bin/templates/workspace/docs/.gitkeep +0 -0
  27. package/bin/templates/workspace/infra/services/.gitkeep +0 -0
  28. package/bin/templates/workspace/packages/.gitkeep +0 -0
  29. package/bin/templates/workspace/services/.gitkeep +0 -0
package/bin/cli.mjs CHANGED
@@ -1,51 +1,69 @@
1
1
  #!/usr/bin/env node
2
- import{A as Ur,C as Tt,D as Et,F as A,G as ue,H as $t,a as Or,b as T,c as Y,d as _r,e as Lr,f as E,g as St,h as bt,i as Wr,j as Hr,k as L,l as Re,m as Ne,n as $,o as Gr,p as Fe,q as Br,r as d,s as I,t as Me,v as h,w as G,x as w,y as De,z as C}from"./chunk-634PL24Z.mjs";import{argv as $d}from"process";import Ae from"chalk";import{Command as Id}from"commander";import Ad from"terminal-link";import mi from"chalk";import{Command as di}from"commander";import{existsSync as si}from"fs";import{join as ii}from"path";import{cwd as qr}from"process";import{execaSync as ai}from"execa";import{spawn as Vr}from"child_process";import{resolve as Xs}from"path";import{execa as Qs}from"execa";import{existsSync as qs}from"fs";import{resolve as Ys}from"path";import{config as Zs}from"dotenv";var It=(e,t)=>{let r=Ys(t,e);return qs(r)?Zs({path:r,processEnv:{}}).parsed||{}:{}},zr=(e,t)=>{let r=It(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(i)}return n};var At={...process.env,NODE_NO_WARNINGS:"1"},ei=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",ti=(e,t,r)=>e?{...At,...e}:t||r?{...At,CI:"true"}:{...At},ri=e=>e.includes("EEXIST")||e.includes("failed to link package");async function W(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=Qs(e,t,{cwd:r,stdio:ei(i,n,a),all:n||a?!0:void 0,shell:o??!0,env:ti(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(ri(p))return;throw new Error(ni(p))}}var ni=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function Kr(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?It(o,n):{},m=Xs(n,"node_modules",".bin"),f=process.env.PATH||"",F=`${m}:${f}`,ge={...process.env,...p,PATH:F,FORCE_COLOR:"1"},b=Vr(e,t,{cwd:n,env:ge,stdio:["inherit",i?"pipe":"inherit","pipe"],detached:s});return a&&i&&b.stdout?.on("data",a),c&&b.stderr?.on("data",c),l&&b.on("exit",l),b}function je(e,t,r={}){let{cwd:n=process.cwd()}=r;Vr(e,t,{cwd:n,stdio:"inherit",shell:!0}).on("exit",s=>process.exit(s||0))}async function Jr(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(`
3
- `).filter(Boolean);for(let s of o)try{process.kill(Number.parseInt(s,10),"SIGKILL")}catch{}}catch{}}var Oe=e=>Ne(e);function Rt(e=process.cwd()){let t=r=>si(ii(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 x(e){return Rt(e)??ci()}function ci(){return Oe("bun")?"bun":Oe("pnpm")?"pnpm":Oe("yarn")?"yarn":"npm"}function Yr(){return["bun","pnpm","yarn","npm"].filter(Oe)}async function M(e,t){let r=li(e,t),{mergedOptions:n,packages:o}=r,{cwd:s=process.cwd(),flags:i=[],task:a,quiet:c}=n,l=n.packageManager??x(),p=[],m=Array.isArray(o)?o:[o];l==="bun"&&(m=m.map(F=>F.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 f=m.length?l==="npm"?["install",...i,...p,...m]:["add",...i,...p,...m]:["install",...i,...p];await W(l,f,{cwd:s,task:a,quiet:c})}async function Zr(e){let t=["-g"],r=[...e.flags??[],...t];await M({...e,flags:r,packageManager:e.packageManager??x()})}function Xr(e,t,r){let{args:n,mergedOptions:o}=en(t??[],r),s=o.manager??x(),{command:i,args:a}=Qr(s);console.log(`
2
+ var Qi=Object.defineProperty;var Kt=(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 ea=(e,t)=>{for(var r in t)Qi(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,qt=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,Cn,xn,ta,ra,Ye,na,oa,$,wn=S(()=>{"use strict";qt();Ke();X=e=>e instanceof Error,kn=e=>X(e)?e.message:typeof e=="string"?e:String(e),Cn=["ExitPromptError"],xn=["Cancelled prompt","User force closed"],ta=["ERR_USE_AFTER_CLOSE"],ra=e=>Cn.some(t=>e.name?.includes(t))||xn.some(t=>e.message?.includes(t)),Ye=e=>{if(e instanceof qe)return!0;if(!(e instanceof Error))return!1;if(Cn.some(r=>e.name?.includes(r))||xn.some(r=>e.message?.includes(r)))return!0;let t=e.code;return t&&ta.includes(t)?ra(e):!1},na=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}`)},oa=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(na(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(oa(e))}});var V=S(()=>{"use strict";qt();wn();Ke()});var zu,Pn,Yt,Ze=S(()=>{"use strict";zu=process.env.npm_package_version||"0.0.0",Pn=["bun.lock","bun.lockb","package-lock.json","yarn.lock","pnpm-lock.yaml"],Yt="start:dev"});import Xe from"chalk";function Zt(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=sa(c.barColor??t?.barColor),p=ia(c,i,o,l,s,t?.labelColor);a.push(p)}return n&&(a.push(""),a.push(n)),a.join(`
5
+ `)}function sa(e){return e?Xe[e]("\u2587"):"\u2587"}function ia(e,t,r,n,o,s){let i=Math.round(e.value/t*r),a=e.barColor?Xe[e.barColor](n.repeat(i)):n.repeat(i),c=e.color??s;return`${Xe.bold(c?Xe[c](e.label.padEnd(12)):e.label.padEnd(12))} ${a} ${e.value.toLocaleString()}${o?` ${o}`:""}`}var Sn=S(()=>{"use strict"});import{existsSync as er,unlinkSync as aa,writeFileSync as ca}from"fs";import{join as Qt}from"path";import Xt from"chokidar";var tr,Qe,la,bn,rr,pa,En,nr=S(()=>{"use strict";v();f();tr=".pf-generating",Qe=e=>Qt(e,tr),la=e=>er(Qe(e)),bn=e=>{ca(Qe(e),"","utf-8")},rr=e=>{let t=Qe(e);er(t)&&aa(t)},pa=e=>{let r=F(e)?.pf?.paths;return r?Object.values(r).filter(n=>typeof n=="object"&&n!==null&&n.watch===!0&&typeof n.path=="string"):[{path:"services"},{path:"apps"}]},En=(e,t)=>{rr(e);let r=pa(e),n=Qe(e),s=ae(async()=>{la(e)||await t()},300),i=[];i.push(Xt.watch(n,{ignoreInitial:!0}).on("unlink",()=>t()));for(let a of r){let c=Qt(e,a.path);if(!er(c))continue;let l=a.ignorePatterns?.map(p=>Qt(c,p));i.push(Xt.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(Xt.watch(`${c}/*/package.json`,{ignoreInitial:!0,ignored:l}).on("add",s).on("change",s))}return async()=>{await Promise.all(i.map(a=>a.close()))}}});import Tn from"chalk";import{Command as ma}from"commander";import{Listr as $n}from"listr2";var J,da,An,In=S(()=>{"use strict";V();nr();f();J=e=>{let t=new ma(e.name).description(e.description).showHelpAfterError();e.arguments?.forEach(([o,s])=>{t.argument(o,s)}),e.options?.forEach(([o,s])=>{t.option(o,s)}),e.exampleUsage&&t.addHelpText("after",()=>`${Tn.cyan.bold(`
6
+ Example:`)}
7
+ ${Tn.bold(e.exampleUsage)}
8
+ `),e.additionalInfo&&t.addHelpText("after",()=>(typeof e.additionalInfo=="function"?e.additionalInfo():e.additionalInfo)??"");let r=async o=>{e.prompts?.length&&await new $n(An(e.prompts,o),{rendererOptions:{lazy:!0,showErrorMessage:!1}}).run(o),await new $n(An(e.actions,o),{rendererOptions:{lazy:!1,showErrorMessage:!1}}).run(o),await e.onComplete?.(o)},n=()=>{try{let o=g();return bn(o),o}catch{return null}};return t.action(async(...o)=>{let s=null;try{let i=o.at(-1),a=i.args,c=i.opts(),l=da(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&&rr(s)}}),t},da=(e,t)=>{let r=e.map(([n],o)=>[n.replace(/[<>[\]]/g,""),t[o]]);return Object.fromEntries(r)},An=(e,t)=>e.map(r=>typeof r=="function"?r(t):r)});var ae,Rn=S(()=>{"use strict";ae=(e,t)=>{let r=null;return(...n)=>(r&&clearTimeout(r),new Promise(o=>{r=setTimeout(async()=>{r=null,await e(...n),o()},t)}))}});var Nn=S(()=>{"use strict"});import{execaSync as ga}from"execa";function Ee(e){try{return ga(e,["--version"]),!0}catch{return!1}}var or=S(()=>{"use strict"});var Fn=S(()=>{"use strict";or()});import{readdirSync as ua}from"fs";import{dirname as On,isAbsolute as fa,join as ha,normalize as ya,resolve as Mn,sep as va}from"path";import{fileURLToPath as ka}from"url";import{packageUpSync as Ca}from"package-up";import{rimraf as xa}from"rimraf";function jn(){let e=Ca({cwd:On(wa())});if(!e)throw new Error("Could not find package.json");return On(e)}var wa,O,Dn,et,_n,sr=S(()=>{"use strict";V();f();wa=()=>typeof import.meta?.url=="string"?ka(import.meta.url):process.cwd(),O=e=>{let t=ir()?g():process.cwd();return ha(t,e)},Dn=(e,t)=>{if(!e||!e.trim())throw new z("Path cannot be empty",e,{hint:"Provide a valid relative path"});if(fa(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=ya(e),s=Mn(t),i=Mn(t,o);if(!i.startsWith(s+va)&&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 ua(e).length===0}catch{return!0}};_n=e=>xa(e)});import Te from"chalk";var Ln,Pa,Sa,tt,d,Wn=S(()=>{"use strict";Ln={debug:0,info:1,warn:2,error:3,silent:4},Pa=e=>e==="debug"||e==="info"||e==="warn"||e==="error"||e==="silent",Sa=()=>{let e=process.env.LOG_LEVEL;return Pa(e)?e:process.env.DEBUG==="true"||process.env.VERBOSE==="true"?"debug":"info"},tt=e=>{let t=Sa();return Ln[e]>=Ln[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 Hn=S(()=>{"use strict"});import ba 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=ba.dim(`[${n+1}/${t.length}] ${o.title}`),await o.fn(r??{},e)}}var Bn=S(()=>{"use strict"});var v=S(()=>{"use strict";Sn();In();Rn();Nn();Fn();sr();Wn();Hn();or();Bn()});var Vn={};ea(Vn,{discoverAvailableServices:()=>at,findWorkspaceRoot:()=>g,getContractsConfig:()=>x,getGeneratorConfig:()=>ce,getPackageJsonField:()=>La,getPfConfig:()=>Ie,getPkgJson:()=>lr,getRootPackageScope:()=>st,getWorkspacePackageJson:()=>F,getWorkspacePathsConfig:()=>E,isInWorkspace:()=>ir,pkgJson:()=>R,readPackageConfig:()=>Re,updatePackageJsonField:()=>it});import{existsSync as Ae,readdirSync as Ea,readFileSync as Gn,writeFileSync as Ta}from"fs";import{join as I,resolve as $a}from"path";var cr,Aa,Ia,Ra,$e,Na,ot,nt,Fa,Oa,Un,Ma,Da,zn,ir,g,F,E,Ie,x,st,ja,_a,La,it,Re,ar,lr,R,ce,at,f=S(()=>{"use strict";Ze();v();cr=e=>JSON.parse(Gn(e,"utf-8")),Aa=cr,Ia=(e,t,r)=>Ta(e,`${JSON.stringify(t,null,2)}
9
+ `,"utf-8"),Ra=["@crossdelta/cloudevents"],$e={services:"services",apps:"apps",packages:"packages",contracts:"packages/contracts"},Na={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(Gn(e,"utf-8"))}catch{return null}},nt=(e,t)=>typeof e=="string"?e:typeof e=="object"&&e!==null&&"path"in e?e.path:t,Fa=e=>e.split("/").pop()||"workspace",Oa=e=>{let t=e.slice(0,e.lastIndexOf("/"));return t===e?null:t},Un=e=>e.split("."),Ma=(e,t)=>{if(!e.workspaces)return!1;if(e.pf||Ae(I(t,"turbo.json")))return!0;let r=Pn.some(o=>Ae(I(t,o))),n=Ae(I(t,"infra"));return r&&n},Da=e=>{let t=ot(I(e,"package.json"));return t?Ma(t,e):!1},zn=e=>{let t=e;for(;t;){if(Da(t))return t;t=Oa(t)}return null},ir=()=>zn(process.cwd())!==null,g=()=>{let e=zn(process.cwd());if(!e)throw new Error(`
10
+ \x1B[31m\u2716\x1B[0m Not in a workspace directory
11
+
12
+ Current directory: ${process.cwd()}
13
+
14
+ This command must be run from within a workspace created with \x1B[36mpf new workspace\x1B[0m
15
+
16
+ To create a new workspace, run:
17
+
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??Ra,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=`@${Fa(e)}`;return t?.name?t.name.startsWith("@")?t.name.split("/")[0]:`@${t.name}`:r},ja=(e,t)=>{let r=Un(t),n=e;for(let o of r){if(n===null||typeof n!="object"||!(o in n))return;n=n[o]}return n},_a=(e,t,r)=>{let n=Un(t),o=n[n.length-1],s=e;for(let i of n.slice(0,-1))(!(i in s)||typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];s[o]=r},La=(e,t=process.cwd())=>{let r=cr(I(t,"package.json"));return ja(r,e)},it=(e,t,r=process.cwd())=>{let n=I(r,"package.json"),o=cr(n);_a(o,e,t),Ia(n,o,{spaces:2,EOL:`
20
+ `,encoding:"utf-8"})},Re=e=>{let t=jn();return Aa($a(t,e))},ar=null,lr=()=>(ar||(ar=Re("package.json")),ar),R=new Proxy({},{get:(e,t)=>lr()[t]}),ce=()=>lr().generatorConfig??Na,at=e=>{let t=e??g(),r=E(t),n=I(t,r.services);if(!Ae(n))return[];try{return Ea(n,{withFileTypes:!0}).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>`${r.services}/${s.name}`).sort()}catch{return[]}}});import{argv as Pu}from"process";import Je from"chalk";import{Command as Su}from"commander";import bu from"terminal-link";V();f();import rc from"chalk";import{Command as nc}from"commander";v();import{existsSync as Ya}from"fs";import{join as Za}from"path";import{cwd as Zn}from"process";import{execaSync as Xa}from"execa";v();import{spawn as Kn}from"child_process";import{resolve as Ga}from"path";import{execa as Ua}from"execa";import{existsSync as Wa}from"fs";import{resolve as Ha}from"path";import{config as Ba}from"dotenv";var pr=(e,t)=>{let r=Ha(t,e);return Wa(r)?Ba({path:r,processEnv:{}}).parsed||{}:{}},Jn=(e,t)=>{let r=pr(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(i)}return n};var mr={...process.env,NODE_NO_WARNINGS:"1"},za=(e,t,r)=>e?"pipe":t||r?["ignore","pipe","pipe"]:"inherit",Va=(e,t,r)=>e?{...mr,...e}:t||r?{...mr,CI:"true"}:{...mr},Ja=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=Ua(e,t,{cwd:r,stdio:za(i,n,a),all:n||a?!0:void 0,shell:o??!0,env:Va(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(Ja(p))return;throw new Error(Ka(p))}}var Ka=e=>{let t=e.match(/error: (.+)/);return t?t[1].trim():e};function qn(e,t,r={}){let{cwd:n=process.cwd(),envFile:o,detached:s=!0,pipeStdout:i=!1,onStdout:a,onStderr:c,onExit:l}=r,p=o?pr(o,n):{},m=Ga(n,"node_modules",".bin"),y=process.env.PATH||"",_=`${m}:${y}`,be={...process.env,...p,PATH:_,FORCE_COLOR:"1"},N=Kn(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 ct(e,t,r={}){let{cwd:n=process.cwd()}=r;Kn(e,t,{cwd:n,stdio:"inherit",shell:!0}).on("exit",s=>process.exit(s||0))}async function Yn(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 lt=e=>Ee(e);function dr(e=process.cwd()){let t=r=>Ya(Za(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)??Qa()}function Qa(){return lt("bun")?"bun":lt("pnpm")?"pnpm":lt("yarn")?"yarn":"npm"}function Xn(){return["bun","pnpm","yarn","npm"].filter(lt)}async function L(e,t){let r=ec(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(_=>_.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 Qn(e){let t=["-g"],r=[...e.flags??[],...t];await L({...e,flags:r,packageManager:e.packageManager??b()})}function eo(e,t,r){let{args:n,mergedOptions:o}=ro(t??[],r),s=o.manager??b(),{command:i,args:a}=to(s);console.log(`
4
22
  Running command: ${i} ${[...a,e,...n].join(" ")}
5
- `),ai(i,[...a,e,...n],{cwd:o.cwd??qr(),stdio:"inherit",preferLocal:!0})}async function fe(e,t,r){let{args:n,mergedOptions:o}=en(t??[],r),s=o.manager??x(),{command:i,args:a}=Qr(s);await W(i,[...a,e,...n],o)}async function he(e,t){let{script:r,mergedOptions:n}=pi(e,t),o=n.packageManager??x();await W(o,["run",r,...n.args??[]],{cwd:n.cwd??qr(),task:n.task})}function Qr(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 li(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function en(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function pi(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var gi=e=>e==="yarn"?["npm","audit"]:["audit"],tn=new di("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{try{let r=h(),n=x(),o=gi(n),s=t.args||[];console.log(mi.dim(`Running ${n} ${[...o,...s].join(" ")}`)),je(n,[...o,...s],{cwd:r})}catch(r){E(r)}});import H from"chalk";import{existsSync as Ei,readFileSync as $i,writeFileSync as Ii}from"fs";import{homedir as Ai}from"os";import{join as Ri}from"path";import{createCipheriv as ui,createDecipheriv as fi,createHash as hi,randomBytes as yi}from"crypto";import{existsSync as vi,readFileSync as Ci,writeFileSync as ki}from"fs";import{homedir as rn,hostname as xi,userInfo as Pi}from"os";import{join as wi}from"path";var Nt=wi(rn(),".platform-sdk-keys"),nn="aes-256-gcm",on=()=>{let e=`${xi()}:${Pi().username}:${rn()}`;return hi("sha256").update(e).digest()},sn=()=>{if(!vi(Nt))return{};try{return JSON.parse(Ci(Nt,"utf-8"))}catch{return{}}},Si=e=>{ki(Nt,JSON.stringify(e,null,2),{mode:384})},bi=e=>{let t=on(),r=yi(16),n=ui(nn,t,r),o=n.update(e,"utf8","hex");return o+=n.final("hex"),{iv:r.toString("hex"),tag:n.getAuthTag().toString("hex"),data:o}},Ti=e=>{let t=on(),r=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),o=fi(nn,t,r);o.setAuthTag(n);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function an(e,t){let r=sn();r[e]=bi(t),Si(r)}async function _e(e){let r=sn()[e];if(!r)return null;try{return Ti(r)}catch{return null}}var ye={openai:{id:"openai",name:"OpenAI",defaultApiKeyEnvVar:"OPENAI_API_KEY",defaultModel:"gpt-4o-mini",modelsApiUrl:"https://api.openai.com/v1/models",apiKeyUrl:"https://platform.openai.com/api-keys",buildHeaders:e=>({Authorization:`Bearer ${e}`}),parseModelsResponse:e=>e.data??[],modelFilters:[/^gpt-4/,/^gpt-3\.5/,/^o1/,/^o3/]},anthropic:{id:"anthropic",name:"Anthropic (Claude)",defaultApiKeyEnvVar:"ANTHROPIC_API_KEY",defaultModel:"claude-sonnet-4-20250514",modelsApiUrl:"https://api.anthropic.com/v1/models",apiKeyUrl:"https://console.anthropic.com/settings/keys",buildHeaders:e=>({"x-api-key":e,"anthropic-version":"2023-06-01"}),parseModelsResponse:e=>(e.data??[]).map(r=>({id:r.id,created:new Date(r.created_at).getTime()})),modelFilters:[/^claude-/]}};function cn(){return Object.entries(ye).map(([e,t])=>({name:t.name,value:e}))}function ve(e){let t=ye[e];if(!t)throw new Error(`Unknown AI provider: ${e}`);return t}var B=Ri(Ai(),".platform-sdk-ai.json"),Ni=()=>{let e="anthropic",t=ye[e];return{provider:e,model:t.defaultModel}},Ft=Ni();function Ce(){return Ei(B)}function Le(){if(!Ce())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=$i(B,"utf-8"),t=JSON.parse(e);return{...Ft,...t}}catch{throw new Error(`Failed to load AI configuration from ${B}. Please run 'pf setup --ai' again.`)}}function ln(e){let t=JSON.stringify(e,null,2);Ii(B,t,"utf-8")}async function pn(e,t){await an(e,t)}async function mn(e){let t=await _e(e.provider);if(t)return t;let r=ye[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 Fi=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},Mi=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 dn(e,t,r={}){let{system:n,maxTokens:o=4096,temperature:s=.7,onToken:i}=r,a=await mn(e);switch(e.provider){case"openai":return Fi(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});case"anthropic":return Mi(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});default:throw new Error(`Unsupported AI provider: ${e.provider}`)}}import{existsSync as Jn,readFileSync as cc,unlinkSync as lc,writeFileSync as pc}from"fs";import{join as qn,resolve as Vn}from"path";import{input as mc}from"@inquirer/prompts";import u from"chalk";import dc from"ora";import{existsSync as Mt,readdirSync as Oi}from"fs";import{dirname as _i,join as gn}from"path";import{dirname as Di}from"path";import{fileURLToPath as ji}from"url";var D=e=>Di(ji(e));var Li=()=>typeof import.meta?.url=="string"?D(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),U=e=>{let t=e??Li(),r=o=>Mt(gn(o,"package.json")),n=_i(t);if(r(t))return t;if(t==="/")throw new Error("Could not find package.json (package root)");return U(n)},un=(e,t)=>{let r=e.find(Mt);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},fn=async e=>{let{getWorkspacePathsConfig:t}=await import("./config-CKQHYOF4.mjs"),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=gn(e,o);if(!Mt(s))return[];try{return Oi(s,{withFileTypes:!0}).filter(i=>i.isDirectory()&&i.name!==".gitkeep").map(i=>`${o}/${i.name}`)}catch{return[]}})};import{existsSync as pa,readFileSync as ma}from"fs";import{join as da}from"path";import{Project as ga}from"ts-morph";import{deriveEventNames as Eu,getContractPaths as $u,getStreamName as Iu}from"@crossdelta/cloudevents";import{existsSync as We,readFileSync as hn,writeFileSync as Wi}from"fs";import{join as Dt}from"path";import{getStreamName as Hi}from"@crossdelta/cloudevents";var yn=(e,t)=>{let r=Dt(e,"src","index.ts");if(!We(r))return!1;let n=hn(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)},Gi=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
23
+ `),Xa(i,[...a,e,...n],{cwd:o.cwd??Zn(),stdio:"inherit",preferLocal:!0})}async function Ne(e,t,r){let{args:n,mergedOptions:o}=ro(t??[],r),s=o.manager??b(),{command:i,args:a}=to(s);await K(i,[...a,e,...n],o)}async function Fe(e,t){let{script:r,mergedOptions:n}=tc(e,t),o=n.packageManager??b();await K(o,["run",r,...n.args??[]],{cwd:n.cwd??Zn(),task:n.task})}function to(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 ec(e,t){return Array.isArray(e)?{packages:e,mergedOptions:{...t,packages:e}}:{packages:e.packages??[],mergedOptions:e}}function ro(e,t){return Array.isArray(e)?{args:e,mergedOptions:t??{}}:{args:[],mergedOptions:e}}function tc(e,t){return typeof e=="string"?{script:e,mergedOptions:t??{}}:{script:e.script,mergedOptions:e}}var oc=e=>e==="yarn"?["npm","audit"]:["audit"],no=new nc("audit").description("Run security audit on dependencies").allowUnknownOption(!0).action((e,t)=>{try{let r=g(),n=b(),o=oc(n),s=t.args||[];console.log(rc.dim(`Running ${n} ${[...o,...s].join(" ")}`)),ct(n,[...o,...s],{cwd:r})}catch(r){$(r)}});import q from"chalk";import{existsSync as vc,readFileSync as kc,writeFileSync as Cc}from"fs";import{homedir as xc}from"os";import{join as wc}from"path";import{createCipheriv as sc,createDecipheriv as ic,createHash as ac,randomBytes as cc}from"crypto";import{existsSync as lc,readFileSync as pc,writeFileSync as mc}from"fs";import{homedir as oo,hostname as dc,userInfo as gc}from"os";import{join as uc}from"path";var gr=uc(oo(),".platform-sdk-keys"),so="aes-256-gcm",io=()=>{let e=`${dc()}:${gc().username}:${oo()}`;return ac("sha256").update(e).digest()},ao=()=>{if(!lc(gr))return{};try{return JSON.parse(pc(gr,"utf-8"))}catch{return{}}},fc=e=>{mc(gr,JSON.stringify(e,null,2),{mode:384})},hc=e=>{let t=io(),r=cc(16),n=sc(so,t,r),o=n.update(e,"utf8","hex");return o+=n.final("hex"),{iv:r.toString("hex"),tag:n.getAuthTag().toString("hex"),data:o}},yc=e=>{let t=io(),r=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),o=ic(so,t,r);o.setAuthTag(n);let s=o.update(e.data,"hex","utf8");return s+=o.final("utf8"),s};async function co(e,t){let r=ao();r[e]=hc(t),fc(r)}async function pt(e){let r=ao()[e];if(!r)return null;try{return yc(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 lo(){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=wc(xc(),".platform-sdk-ai.json"),Pc=()=>{let e="anthropic",t=Oe[e];return{provider:e,model:t.defaultModel}},ur=Pc();function De(){return vc(Q)}function mt(){if(!De())throw new Error("AI configuration not found. Please run 'pf ai:setup' to configure your AI provider.");try{let e=kc(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 po(e){let t=JSON.stringify(e,null,2);Cc(Q,t,"utf-8")}async function mo(e,t){await co(e,t)}async function go(e){let t=await pt(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 Sc=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},bc=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 uo(e,t,r={}){let{system:n,maxTokens:o=4096,temperature:s=.7,onToken:i}=r,a=await go(e);switch(e.provider){case"openai":return Sc(t,e.model,a,{system:n,maxTokens:o,temperature:s,onToken:i});case"anthropic":return bc(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 Yo,readFileSync as Ql,unlinkSync as ep,writeFileSync as tp}from"fs";import{join as Zo,resolve as Ko}from"path";import{input as rp}from"@inquirer/prompts";import h from"chalk";import np from"ora";import{existsSync as fr,readdirSync as $c}from"fs";import{dirname as Ac,join as fo}from"path";import{dirname as Ec}from"path";import{fileURLToPath as Tc}from"url";var W=e=>Ec(Tc(e));nr();var Ic=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),ee=e=>{let t=e??Ic(),r=o=>fr(fo(o,"package.json")),n=Ac(t);if(r(t))return t;if(t==="/")throw new Error("Could not find package.json (package root)");return ee(n)},ho=(e,t)=>{let r=e.find(fr);if(!r)throw new Error(t??`Directory not found. Searched in: ${e.join(", ")}`);return r},yo=async e=>{let{getWorkspacePathsConfig:t}=await Promise.resolve().then(()=>(f(),Vn)),r=t(e);return[r.services,r.apps].flatMap(o=>{let s=fo(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 tl,readFileSync as rl}from"fs";import{join as nl}from"path";import{Project as ol}from"ts-morph";import{deriveEventNames as Ny,getContractPaths as Fy,getStreamName as Oy}from"@crossdelta/cloudevents";import{existsSync as dt,readFileSync as vo,writeFileSync as Rc}from"fs";import{join as hr}from"path";import{getStreamName as Nc}from"@crossdelta/cloudevents";var ko=(e,t)=>{let r=hr(e,"src","index.ts");if(!dt(r))return!1;let n=vo(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)},Fc=e=>{if(e.includes("@crossdelta/cloudevents"))return e;let t=`import { consumeJetStreams } from '@crossdelta/cloudevents'
6
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)}
7
- ${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},Bi=(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},Oc=(e,t)=>`
8
26
 
9
27
  // Consume from ${e} stream
10
28
  consumeJetStreams({
11
29
  streams: ['${e}'],
12
30
  consumer: '${t}-service',
13
31
  discover: './src/events/**/*.handler.ts',
14
- })`,jt=(e,t)=>{let r=Hi(t),n=Dt(e,"src","index.ts"),o=Dt(e,"src","main.ts");if(!We(n)&&We(o))return{added:!1,streamName:r};if(!We(n))return{added:!1,streamName:r,warning:"Entry point not found (index.ts or main.ts)"};if(yn(e,r))return{added:!1,streamName:r};let s=hn(n,"utf-8"),i=e.split("/").pop()||"unknown";s.includes("consumeJetStreams")||(s=Gi(s));let a=Bi(r,i),c=`${s.trimEnd()+a}
15
- `;return Wi(n,c,"utf-8"),{added:!0,streamName:r}};import{existsSync as Gg,readFileSync as Bg}from"fs";import{join as zg}from"path";import{contractCreated as Kg,deriveEventNames as Jg,generateContract as qg,getContractFilePath as Yg}from"@crossdelta/cloudevents";import{readdirSync as Ui,readFileSync as zi}from"fs";import{join as vn}from"path";import{getStreamName as Vi,pluralize as Ki,singularize as Ji}from"@crossdelta/cloudevents";var Cn=e=>{try{return Ui(e,{withFileTypes:!0}).flatMap(r=>{let n=vn(e,r.name);return r.isDirectory()?Cn(n):r.name.endsWith(".handler.ts")?[n]:[]})}catch{return[]}},Ot=e=>{let t=vn(e,"src","events");return Cn(t).flatMap(n=>{let o=zi(n,"utf-8");return qi(n,o)})},qi=(e,t)=>{let r=Zi(t);if(!r)return[];let n=Yi(r);return n?[{filePath:e,eventType:n,contractName:r}]:[]},Yi=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=Ji(n),i=r.slice(1).map(a=>a.toLowerCase()).join("-");return`${o}.${i}`},Zi=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},_t=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])=>Xi(r,n)).sort((r,n)=>r.stream.localeCompare(n.stream))},Xi=(e,t)=>{let r=Vi(t[0]?.eventType??`${e}.event`),o=`${Ki(e)}.>`;return{stream:r,subjects:[o],handlers:t}},Lt=(e,t)=>e.length===0?"":` // Development: pf dev auto-creates ephemeral streams from contracts
32
+ })`,yr=(e,t)=>{let r=Nc(t),n=hr(e,"src","index.ts"),o=hr(e,"src","main.ts");if(!dt(n)&&dt(o))return{added:!1,streamName:r};if(!dt(n))return{added:!1,streamName:r,warning:"Entry point not found (index.ts or main.ts)"};if(ko(e,r))return{added:!1,streamName:r};let s=vo(n,"utf-8"),i=e.split("/").pop()||"unknown";s.includes("consumeJetStreams")||(s=Fc(s));let a=Oc(r,i),c=`${s.trimEnd()+a}
33
+ `;return Rc(n,c,"utf-8"),{added:!0,streamName:r}};f();import{existsSync as Jh,readFileSync as Kh}from"fs";import{join as Yh}from"path";import{contractCreated as Xh,deriveEventNames as Qh,generateContract as ey,getContractFilePath as ty}from"@crossdelta/cloudevents";import{readdirSync as Mc,readFileSync as Dc}from"fs";import{join as Co}from"path";import{getStreamName as jc,pluralize as _c,singularize as Lc}from"@crossdelta/cloudevents";var xo=e=>{try{return Mc(e,{withFileTypes:!0}).flatMap(r=>{let n=Co(e,r.name);return r.isDirectory()?xo(n):r.name.endsWith(".handler.ts")?[n]:[]})}catch{return[]}},vr=e=>{let t=Co(e,"src","events");return xo(t).flatMap(n=>{let o=Dc(n,"utf-8");return Wc(n,o)})},Wc=(e,t)=>{let r=Bc(t);if(!r)return[];let n=Hc(r);return n?[{filePath:e,eventType:n,contractName:r}]:[]},Hc=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=Lc(n),i=r.slice(1).map(a=>a.toLowerCase()).join("-");return`${o}.${i}`},Bc=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},kr=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])=>Gc(r,n)).sort((r,n)=>r.stream.localeCompare(n.stream))},Gc=(e,t)=>{let r=jc(t[0]?.eventType??`${e}.event`),o=`${_c(e)}.>`;return{stream:r,subjects:[o],handlers:t}},Cr=(e,t)=>e.length===0?"":` // Development: pf dev auto-creates ephemeral streams from contracts
16
34
  // Production: Pulumi materializes persistent streams
17
35
 
18
36
  consumeJetStreams({
19
37
  streams: [${e.map(r=>`'${r.stream}'`).join(", ")}],
20
38
  consumer: '${t}',
21
39
  discover: './src/events/**/*.handler.ts',
22
- })`;import{existsSync as z,mkdirSync as Qi,readFileSync as He,writeFileSync as X}from"fs";import{dirname as kn,join as Z}from"path";import{deriveEventNames as ea}from"@crossdelta/cloudevents";var ta=(e,t)=>{let r=`export * from './${t}'`;if(!z(e)){let s=kn(e);z(s)||Qi(s,{recursive:!0});let i=`/**
23
- * ${kn(e).split("/").pop()} Domain Events
40
+ })`;f();import{existsSync as te,mkdirSync as Uc,readFileSync as gt,writeFileSync as pe}from"fs";import{dirname as wo,join as le}from"path";import{deriveEventNames as zc}from"@crossdelta/cloudevents";var Vc=(e,t)=>{let r=`export * from './${t}'`;if(!te(e)){let s=wo(e);te(s)||Uc(s,{recursive:!0});let i=`/**
41
+ * ${wo(e).split("/").pop()} Domain Events
24
42
  */
25
43
 
26
- `;return X(e,`${i+r}
27
- `,"utf-8"),!0}let n=He(e,"utf-8");if(n.includes(`'./${t}'`))return!1;let o=`${n.trimEnd()}
44
+ `;return pe(e,`${i+r}
45
+ `,"utf-8"),!0}let n=gt(e,"utf-8");if(n.includes(`'./${t}'`))return!1;let o=`${n.trimEnd()}
28
46
  ${r}
29
- `;return X(e,o,"utf-8"),!0},ra=(e,t)=>{let r=`export * from './${t}'`;if(!z(e))return X(e,`/**
47
+ `;return pe(e,o,"utf-8"),!0},Jc=(e,t)=>{let r=`export * from './${t}'`;if(!te(e))return pe(e,`/**
30
48
  * Event Contracts Index
31
49
  *
32
50
  * Re-exports all event contracts for convenient importing.
33
51
  */
34
52
 
35
53
  ${r}
36
- `,"utf-8"),!0;let o=He(e,"utf-8").split(`
37
- `);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),X(e,o.join(`
38
- `),"utf-8"),!0},na=e=>{if(!z(e))return!1;let t=He(e,"utf-8"),r="export * from './events'";if(t.split(`
54
+ `,"utf-8"),!0;let o=gt(e,"utf-8").split(`
55
+ `);if(o.some(i=>i.trim()===r))return!1;let s=o.findLastIndex(i=>i.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push(r),pe(e,o.join(`
56
+ `),"utf-8"),!0},Kc=e=>{if(!te(e))return!1;let t=gt(e,"utf-8"),r="export * from './events'";if(t.split(`
39
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()}
40
58
  ${r}
41
- `),o!==t?(X(e,o,"utf-8"),!0):!1},Wt=(e,t)=>{let{packagePath:r}=C(t),{domain:n,action:o}=ea(e),s=Z(r,"src","events");if(!z(s))return!1;let i=Z(s,n),a=Z(i,"index.ts"),c=Z(s,"index.ts"),l=Z(r,"src","index.ts"),p=e.split(".")[0],m=Z(s,p);p!==n&&z(m)&&(console.warn(`\u26A0\uFE0F Warning: Legacy folder '${p}/' found. Please migrate to '${n}/' to avoid conflicts.`),console.warn(` Run: mv ${m} ${i}`));let f=!1;return ta(a,o)&&(f=!0),ra(c,n)&&(f=!0),na(l)&&(f=!0),f},Ht=(e,t)=>{if(!z(e))return!1;let r=`export * from './events/${t}'`,n=He(e,"utf-8");if(n.includes(`'./events/${t}'`))return!1;let o=n.split(`
42
- `),s=o.findLastIndex(i=>i.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push("",r),X(e,o.join(`
43
- `),"utf-8"),!0};import{existsSync as xn,readdirSync as sa,readFileSync as ia}from"fs";import{join as Pn}from"path";import{generateJsonMockFromContract as aa,getJsonMockPath as ca,initFaker as la}from"@crossdelta/cloudevents";var wn=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 Gt=async(e,t={})=>{let r=Pn(e,"src","events");if(!xn(r))return{mockPaths:[],skippedHandlers:[]};await la();let n=sa(r).filter(i=>i.endsWith(".handler.ts")||i.endsWith(".event.ts")),o=[],s=[];for(let i of n){let a=Pn(r,i),c=ia(a,"utf-8"),l=wn(c);if(!l){s.push(`${i} (Could not extract event type)`);continue}let p=t.outputDir??C().packagePath,m=ca(l,p);if(xn(m)&&!t.overwrite){s.push(`${i} (Mock already exists)`);continue}let f=aa(l,p,{useFaker:!0});f&&f.status!=="skipped"&&"ref"in f?o.push(f.ref):s.push(`${i} (Contract not found or generation failed)`)}return{mockPaths:o,skippedHandlers:s}};var Sn=e=>{let t=e.split("/").pop()||"service",r=da(e,"src","events","events.service.ts");if(!pa(r))return!1;let n=Ot(e);if(n.length===0||ma(r,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let a=_t(n),c=Lt(a,t);if(!c)return!1;let l=new ga({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(r),m=!1;for(let f of p.getClasses()){let F=f.getMethod("startConsumers");if(!F)continue;let b=[...c.split(`
59
+ `),o!==t?(pe(e,o,"utf-8"),!0):!1},xr=(e,t)=>{let{packagePath:r}=x(t),{domain:n,action:o}=zc(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 Vc(a,o)&&(y=!0),Jc(c,n)&&(y=!0),Kc(l)&&(y=!0),y},wr=(e,t)=>{if(!te(e))return!1;let r=`export * from './events/${t}'`,n=gt(e,"utf-8");if(n.includes(`'./events/${t}'`))return!1;let o=n.split(`
60
+ `),s=o.findLastIndex(i=>i.startsWith("export"));return s>=0?o.splice(s+1,0,r):o.push("",r),pe(e,o.join(`
61
+ `),"utf-8"),!0};f();import{existsSync as Po,readdirSync as Yc,readFileSync as Zc}from"fs";import{join as So}from"path";import{generateJsonMockFromContract as Xc,getJsonMockPath as Qc,initFaker as el}from"@crossdelta/cloudevents";var bo=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=So(e,"src","events");if(!Po(r))return{mockPaths:[],skippedHandlers:[]};await el();let n=Yc(r).filter(i=>i.endsWith(".handler.ts")||i.endsWith(".event.ts")),o=[],s=[];for(let i of n){let a=So(r,i),c=Zc(a,"utf-8"),l=bo(c);if(!l){s.push(`${i} (Could not extract event type)`);continue}let p=t.outputDir??x().packagePath,m=Qc(l,p);if(Po(m)&&!t.overwrite){s.push(`${i} (Mock already exists)`);continue}let y=Xc(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 Eo=e=>{let t=e.split("/").pop()||"service",r=nl(e,"src","events","events.service.ts");if(!tl(r))return!1;let n=vr(e);if(n.length===0||rl(r,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").includes("consumeJetStreams"))return!1;let a=kr(n),c=Cr(a,t);if(!c)return!1;let l=new ol({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0}),p=l.addSourceFileAtPath(r),m=!1;for(let y of p.getClasses()){let _=y.getMethod("startConsumers");if(!_)continue;let N=[...c.split(`
44
62
  `),""," this.logger.log('Event consumers started successfully')"].join(`
45
- `);F.setBodyText(b),m=!0;break}return m&&l.saveSync(),m};var ua=e=>{let t=e.split(/\s+/),r=t[0],n=t.slice(1);return r==="pf"&&(r=process.argv[1]),{executable:r,args:n}},fa=async(e,t)=>{try{let{executable:r,args:n}=ua(e.command);return await W(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)}}},Bt=async(e,t)=>{let r=[];for(let n of e){let o=await fa(n,t);if(r.push(o),!o.success)break}return r},Ut=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)))},bn=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 $n,readFileSync as ka}from"fs";import{join as zt}from"path";import O from"chalk";import{existsSync as Tn,mkdirSync as ha,writeFileSync as ya}from"fs";import{dirname as va}from"path";var Ca=(e,t)=>{let n=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o;try{o=Gr(e.path,n)}catch(s){return{status:"failed",path:e.path,error:s.message}}try{if(Tn(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=va(o);return Tn(s)||ha(s,{recursive:!0}),ya(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},En=(e,t)=>{let r=e.map(n=>Ca(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 xa=(e,t)=>{let r=w(t.workspaceRoot),n=zt(t.workspaceRoot,r.contracts);if(!$n(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()},Pa=e=>{let t=zt(e,"packages/contracts/src/index.ts");if(!$n(t))return new Set;try{let r=ka(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}},wa=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}`},Sa=(e,t,r)=>{let n=Pa(t),o=[],s=[],i=[];for(let a of e)if(n.has(a))o.push(a);else{s.push(a);let c=wa(a),l=r.replace(`${t}/`,"");i.push(`pf cloudevents add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:i}},ba=(e,t)=>{if(e.length!==0){console.log(O.cyan(`\u{1F4E6} Using existing contracts:
46
- `));for(let r of e)console.log(O.dim(` ${t}/contracts \u2192 ${r}`));console.log()}},Ta=(e,t)=>{let r=/^packages\/contracts\/src\/events\/([^/]+)\.ts$/,n=zt(t,"packages/contracts/src/index.ts");for(let o of e){let s=o.match(r);s&&s[1]!=="index"&&Ht(n,s[1])}},In=async(e,t)=>{t.start("Applying code formatting...");try{await fe("biome",["check","--fix","--unsafe","."],{cwd:e,quiet:!0}),t.succeed("Code formatted!")}catch{t.warn("Code formatting completed with warnings")}},Ea=async(e,t)=>{t.start("Scanning for event handlers...");let{mockPaths:r,skippedHandlers:n}=await Gt(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(O.dim(` ${i}`))}console.log()}else t.succeed("Event handlers found");if(n.length>0){for(let s of n)console.log(O.dim(` \u2139 Skipped: ${s}`));console.log()}},An=async(e,t,r,n)=>{n.start("Writing generated files...");let o=En(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(O.dim(` ${l}`));console.log()}else n.succeed("No files to write");let s=xa(e,r),{existing:i,missing:a,suggestedCommands:c}=Sa(s,r.workspaceRoot,t);if(i.length>0&&ba(i,r.scope),a.length>0){console.log(O.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${r.scope}/contracts):
47
- `));for(let l of a)console.log(O.yellow(` ${l}`));console.log(),console.log(O.cyan(`\u{1F4A1} Run these commands to create the missing contracts:
48
- `));for(let l of c)console.log(O.dim(` ${l}`));console.log()}return Ta(o.written,r.workspaceRoot),o.written.length>0&&await Ea(t,n),{missingContractCommands:c}};import{existsSync as Da,readFileSync as ja}from"fs";import{join as ke}from"path";import{existsSync as $a,readdirSync as Ia,readFileSync as Aa}from"fs";import{join as Ra}from"path";var Rn=e=>{let{eventsPath:t}=C(e);if(!$a(t))return[];let r=[];try{let n=Ia(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of n){let s=Ra(t,o),i=Aa(s,"utf-8"),a=Na(i,s);a&&r.push(a)}}catch(n){return console.warn("Warning: Could not scan contracts package:",n),[]}return r},Na=(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=Ma(e);return{name:n,typeName:s,eventType:a,fields:c,filePath:t}}catch{return null}},Fa={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},Ma=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=Fa[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]},Nn=(e,t)=>{if(e.length===0)return`
63
+ `);_.setBodyText(N),m=!0;break}return m&&l.saveSync(),m};f();var sl=e=>{let t=e.split(/\s+/),r=t[0],n=t.slice(1);return r==="pf"&&(r=process.argv[1]),{executable:r,args:n}},il=async(e,t)=>{try{let{executable:r,args:n}=sl(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 il(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)))},To=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 Io,readFileSync as ml}from"fs";import{join as Er}from"path";import B from"chalk";f();sr();import{existsSync as $o,mkdirSync as al,writeFileSync as cl}from"fs";import{dirname as ll}from"path";var pl=(e,t)=>{let n=e.path.startsWith("packages/")&&t.workspaceRoot?t.workspaceRoot:t.baseDir,o;try{o=Dn(e.path,n)}catch(s){return{status:"failed",path:e.path,error:s.message}}try{if($o(o)&&!t.overwrite)return{status:"skipped",path:e.path};if(t.dryRun)return{status:"written",path:e.path};let s=ll(o);return $o(s)||al(s,{recursive:!0}),cl(o,e.content,"utf-8"),{status:"written",path:e.path}}catch(s){return{status:"failed",path:e.path,error:s.message}}},Ao=(e,t)=>{let r=e.map(n=>pl(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 dl=(e,t)=>{let r=E(t.workspaceRoot),n=Er(t.workspaceRoot,r.contracts);if(!Io(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()},gl=e=>{let t=Er(e,"packages/contracts/src/index.ts");if(!Io(t))return new Set;try{let r=ml(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}},ul=e=>{let t=e.replace(/Contract$/,""),r=t.split(/(?=[A-Z])/).filter(Boolean);if(r.length<2)return t.toLowerCase();let n=r[0].toLowerCase(),o=r.slice(1).join("").toLowerCase();return`${n}.${o}`},fl=(e,t,r)=>{let n=gl(t),o=[],s=[],i=[];for(let a of e)if(n.has(a))o.push(a);else{s.push(a);let c=ul(a),l=r.replace(`${t}/`,"");i.push(`pf cloudevents add ${c} --service ${l}`)}return{existing:o,missing:s,suggestedCommands:i}},hl=(e,t)=>{if(e.length!==0){console.log(B.cyan(`\u{1F4E6} Using existing contracts:
64
+ `));for(let r of e)console.log(B.dim(` ${t}/contracts \u2192 ${r}`));console.log()}},yl=(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])}},Ro=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")}},vl=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(B.dim(` ${i}`))}console.log()}else t.succeed("Event handlers found");if(n.length>0){for(let s of n)console.log(B.dim(` \u2139 Skipped: ${s}`));console.log()}},No=async(e,t,r,n)=>{n.start("Writing generated files...");let o=Ao(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(B.dim(` ${l}`));console.log()}else n.succeed("No files to write");let s=dl(e,r),{existing:i,missing:a,suggestedCommands:c}=fl(s,r.workspaceRoot,t);if(i.length>0&&hl(i,r.scope),a.length>0){console.log(B.yellow(`\u26A0\uFE0F Missing contracts (not exported from @${r.scope}/contracts):
65
+ `));for(let l of a)console.log(B.yellow(` ${l}`));console.log(),console.log(B.cyan(`\u{1F4A1} Run these commands to create the missing contracts:
66
+ `));for(let l of c)console.log(B.dim(` ${l}`));console.log()}return yl(o.written,r.workspaceRoot),o.written.length>0&&await vl(t,n),{missingContractCommands:c}};f();import{existsSync as El,readFileSync as Tl}from"fs";import{join as je}from"path";f();f();import{existsSync as kl,readdirSync as Cl,readFileSync as xl}from"fs";import{join as wl}from"path";var Fo=e=>{let{eventsPath:t}=x(e);if(!kl(t))return[];let r=[];try{let n=Cl(t).filter(o=>o.endsWith(".ts")&&!o.endsWith(".mock.json")&&o!=="index.ts");for(let o of n){let s=wl(t,o),i=xl(s,"utf-8"),a=Pl(i,s);a&&r.push(a)}}catch(n){return console.warn("Warning: Could not scan contracts package:",n),[]}return r},Pl=(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=bl(e);return{name:n,typeName:s,eventType:a,fields:c,filePath:t}}catch{return null}},Sl={string:"string",number:"number",boolean:"boolean",array:"array",object:"object",date:"date"},bl=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=Sl[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]},Oo=(e,t)=>{if(e.length===0)return`
49
67
  **Available Contracts:**
50
68
 
51
69
  No contracts are currently defined. Use Basic Mode with inline schemas for all events.
@@ -66,15 +84,15 @@ The following event contracts are available in \`${t}/contracts\`:
66
84
  ${r}
67
85
 
68
86
  If the event type your service consumes matches one of these, **you MUST use Advanced Mode**.
69
- `.trim()};var Oa=()=>typeof import.meta?.url=="string"?D(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),_a=(e,t)=>{let r=ke(Oa(),"docs","generators"),n=ue(),o=[];for(let s of n.docs.base)o.push(ke(r,s));if(e&&n.docs.frameworks[e]){let s=n.docs.frameworks[e];if(typeof s=="string")o.push(ke(r,s));else{let i=t==="bun"?"bun":"node";s[i]&&o.push(ke(r,s[i]))}}return o},Fn={copilot:".github/copilot-instructions.md",projectGuidelines:"docs/ai-guidelines.md"},La=1500,Mn=e=>{try{return Da(e)?ja(e,"utf-8"):null}catch{return null}},Wa=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
87
+ `.trim()};var $l=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Al=(e,t)=>{let r=je($l(),"docs","generators"),n=ce(),o=[];for(let s of n.docs.base)o.push(je(r,s));if(e&&n.docs.frameworks[e]){let s=n.docs.frameworks[e];if(typeof s=="string")o.push(je(r,s));else{let i=t==="bun"?"bun":"node";s[i]&&o.push(je(r,s[i]))}}return o},Mo={copilot:".github/copilot-instructions.md",projectGuidelines:"docs/ai-guidelines.md"},Il=1500,Do=e=>{try{return El(e)?Tl(e,"utf-8"):null}catch{return null}},Rl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/\n{3,}/g,`
70
88
 
71
- `).replace(/[ \t]+$/gm,"").trim(),Ha=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(),Nl=e=>e.replace(/<!--[\s\S]*?-->/g,"").replace(/^\[.+\]:\s*.+$/gm,"").replace(/```[\s\S]*?```/g,"").replace(/`[^`]{50,}`/g,"`...`").replace(/\n{3,}/g,`
72
90
 
73
- `).replace(/[ \t]+$/gm,"").trim(),Ga=e=>Math.ceil(e.length/4),Ba=(e,t)=>{let r=e.split(/(?=^## )/m),n="",o=0;for(let s of r){let i=Ga(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()},Ua=(e,t)=>{let{workspaceRoot:r,scope:n}=t,o=Rn(r),s=Nn(o,n);return e.replace(/\{\{scope\}\}/g,n).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},Dn=e=>{let{workspaceRoot:t,scope:r}=e,n=[],o=_a(e.serviceType,e.packageManager);for(let a of o){let c=Mn(a);if(c){let l=Ua(c,e),p=Wa(l);n.push(p)}}let s=[Fn.copilot,Fn.projectGuidelines],i=Math.floor(La/s.length);for(let a of s){let c=Mn(ke(t,a));if(c){let l=Ha(c),p=Ba(l,i);p.length>50&&n.push(p)}}return n.length===0?(console.warn("\u26A0\uFE0F No instruction files found."),`Use ${r}/contracts for shared types.`):n.join(`
91
+ `).replace(/[ \t]+$/gm,"").trim(),Fl=e=>Math.ceil(e.length/4),Ol=(e,t)=>{let r=e.split(/(?=^## )/m),n="",o=0;for(let s of r){let i=Fl(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()},Ml=(e,t)=>{let{workspaceRoot:r,scope:n}=t,o=Fo(r),s=Oo(o,n);return e.replace(/\{\{scope\}\}/g,n).replace(/\{\{AVAILABLE_CONTRACTS\}\}/g,s)},jo=e=>{let{workspaceRoot:t,scope:r}=e,n=[],o=Al(e.serviceType,e.packageManager);for(let a of o){let c=Do(a);if(c){let l=Ml(c,e),p=Rl(l);n.push(p)}}let s=[Mo.copilot,Mo.projectGuidelines],i=Math.floor(Il/s.length);for(let a of s){let c=Do(je(t,a));if(c){let l=Nl(c),p=Ol(l,i);p.length>50&&n.push(p)}}return n.length===0?(console.warn("\u26A0\uFE0F No instruction files found."),`Use ${r}/contracts for shared types.`):n.join(`
74
92
 
75
93
  ---
76
94
 
77
- `)};var za=`You are an expert code generator. Generate clean, production-ready code.
95
+ `)};var Dl=`You are an expert code generator. Generate clean, production-ready code.
78
96
 
79
97
  ## Output Format
80
98
 
@@ -88,13 +106,13 @@ Format your code blocks with the file path on the line before the code block:
88
106
  **IMPORTANT:** Always generate:
89
107
  - Source code files (src/**)
90
108
  - Test files (src/**/*.test.ts) for all business logic
91
- - README.md with service documentation`,Va=e=>e.replace(/-/g,"_").toUpperCase(),Ka=e=>e.split("/").pop()||"my-service",jn=(e,t,r)=>{let n=Dn({...e,serviceType:t,packageManager:r});return`${za}
109
+ - README.md with service documentation`,jl=e=>e.replace(/-/g,"_").toUpperCase(),_l=e=>e.split("/").pop()||"my-service",_o=(e,t,r)=>{let n=jo({...e,serviceType:t,packageManager:r});return`${Dl}
92
110
 
93
111
  ## Project Guidelines & Patterns
94
112
 
95
113
  Follow these project-specific conventions and patterns when generating code:
96
114
 
97
- ${n}`},On=(e,t,r,n)=>{let o=Ka(e),s=`${Va(o)}_PORT`,i=Ur();return`Generate source code for a microservice at path "${e}".
115
+ ${n}`},Lo=(e,t,r,n)=>{let o=_l(e),s=`${jl(o)}_PORT`,i=st();return`Generate source code for a microservice at path "${e}".
98
116
 
99
117
  Use the patterns and conventions from the Project Guidelines above.
100
118
 
@@ -109,60 +127,60 @@ Service purpose: ${t}
109
127
  - BUT you MUST keep the existing port configuration line unchanged!
110
128
 
111
129
  Do NOT include the service path in file headers (use \`src/...\`, NOT \`${e}/src/...\`).
112
- `};var Ja=()=>!!process.env.DEBUG,_n=(e,t)=>{Ja()&&console.log(`[AI Parser] ${e}`,t??"")},Ge={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},Kt=(e,t)=>[...e.matchAll(t)].flatMap(n=>n[1].split(`
113
- `).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),Ln=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),qa=e=>Kt(e,Ge.commandsBlock).map(Ln),Ya=e=>Kt(e,Ge.postCommandsBlock).map(Ln),Za=e=>Kt(e,Ge.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),Xa=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},r=(e||"typescript").toLowerCase();return t[r]||r},Qa=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"},ec=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),tc=e=>{let t=e.split(`
114
- `),r=[],n=0;for(let o of t){let s=Ge.fileHeader.exec(o);s&&r.push({path:s[1],index:n}),n+=o.length+1}return r},rc=(e,t)=>{let n=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return n?{language:n[1]?Xa(n[1]):void 0,content:ec(n[2])}:null},nc=e=>tc(e).map(r=>{let n=rc(e,r.index);return!n||n.content.length===0?null:{path:r.path,language:n.language||Qa(r.path),content:n.content,startIndex:r.index}}).filter(r=>r!==null),Vt=e=>e.includes("packages/contracts")||e.includes("contracts/src"),oc=e=>{let t=e.filter(n=>Vt(n.path)),r=e.filter(n=>!Vt(n.path));return[...t,...r]},sc=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(Vt(t))return t;let r=t.match(/^services\/[^/]+\/(.+)$/);return r?r[1]:t},Wn=(e,t)=>{_n("Parsing AI response",{length:e.length});let r=qa(e),n=Ya(e),o=Za(e),s=nc(e),i=oc(s.map(a=>({path:sc(a.path),content:a.content,language:a.language})));return _n("Parsed response",{commands:r.length,postCommands:n.length,dependencies:o.length,files:i.length}),{commands:r,files:i,dependencies:o,postCommands:n}},Hn=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 ic}from"fs";import j from"chalk";var Gn=async(e,t,r)=>{if(e.length===0){ic(t,{recursive:!0}),console.log(j.yellow(`\u26A0 No scaffolding command found - creating empty directory
115
- `));return}let o=(await Bt(e,r)).find(s=>!s.success);if(o)throw console.log(j.red(`
116
- \u2717 Scaffolding failed: ${o.command}`)),o.error&&console.log(j.red(` Error: ${o.error}`)),new Error(`Command failed: ${o.command}${o.error?` - ${o.error}`:""}`)},Bn=async(e,t,r)=>{if(e.length===0)return;r.stop();let n=e.length===1?"package":"packages";console.log(j.cyan(`
130
+ `};var Ll=()=>!!process.env.DEBUG,Wo=(e,t)=>{Ll()&&console.log(`[AI Parser] ${e}`,t??"")},ut={commandsBlock:/```commands\n([\s\S]*?)```/gi,postCommandsBlock:/```post-commands\n([\s\S]*?)```/gi,dependenciesBlock:/```dependencies\n([\s\S]*?)```/gi,fileHeader:/^#{1,4}\s+`([^`]+)`\s*$/},$r=(e,t)=>[...e.matchAll(t)].flatMap(n=>n[1].split(`
131
+ `).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#"))),Ho=e=>({command:e,isPfCommand:e.startsWith("pf ")||e.includes(" pf ")}),Wl=e=>$r(e,ut.commandsBlock).map(Ho),Hl=e=>$r(e,ut.postCommandsBlock).map(Ho),Bl=e=>$r(e,ut.dependenciesBlock).filter(t=>!t.startsWith("@crossdelta/")&&t!=="zod"),Gl=e=>{let t={ts:"typescript",js:"javascript",md:"markdown",yml:"yaml"},r=(e||"typescript").toLowerCase();return t[r]||r},Ul=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"},zl=e=>e.replace(/^\s*\/\/ \.{3,}.*$/gm,"").replace(/^\s*\/\/ Lines? \d+.*omitted.*$/gim,"").replace(/^\s*\/\* Lines? \d+.*omitted.*\*\/$/gim,"").trim(),Vl=e=>{let t=e.split(`
132
+ `),r=[],n=0;for(let o of t){let s=ut.fileHeader.exec(o);s&&r.push({path:s[1],index:n}),n+=o.length+1}return r},Jl=(e,t)=>{let n=e.slice(t).match(/```(\w+)?\n([\s\S]*?)```/);return n?{language:n[1]?Gl(n[1]):void 0,content:zl(n[2])}:null},Kl=e=>Vl(e).map(r=>{let n=Jl(e,r.index);return!n||n.content.length===0?null:{path:r.path,language:n.language||Ul(r.path),content:n.content,startIndex:r.index}}).filter(r=>r!==null),Tr=e=>e.includes("packages/contracts")||e.includes("contracts/src"),ql=e=>{let t=e.filter(n=>Tr(n.path)),r=e.filter(n=>!Tr(n.path));return[...t,...r]},Yl=e=>{let t=e.replace(/^\/+/,"").replace(/\/{2,}/g,"/");if(Tr(t))return t;let r=t.match(/^services\/[^/]+\/(.+)$/);return r?r[1]:t},Bo=(e,t)=>{Wo("Parsing AI response",{length:e.length});let r=Wl(e),n=Hl(e),o=Bl(e),s=Kl(e),i=ql(s.map(a=>({path:Yl(a.path),content:a.content,language:a.language})));return Wo("Parsed response",{commands:r.length,postCommands:n.length,dependencies:o.length,files:i.length}),{commands:r,files:i,dependencies:o,postCommands:n}},Go=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 Zl}from"fs";import H from"chalk";var Uo=async(e,t,r)=>{if(e.length===0){Zl(t,{recursive:!0}),console.log(H.yellow(`\u26A0 No scaffolding command found - creating empty directory
133
+ `));return}let o=(await Sr(e,r)).find(s=>!s.success);if(o)throw console.log(H.red(`
134
+ \u2717 Scaffolding failed: ${o.command}`)),o.error&&console.log(H.red(` Error: ${o.error}`)),new Error(`Command failed: ${o.command}${o.error?` - ${o.error}`:""}`)},zo=async(e,t,r)=>{if(e.length===0)return;r.stop();let n=e.length===1?"package":"packages";console.log(H.cyan(`
117
135
  \u25B6 Installing ${e.length} additional ${n}...
118
- `));try{await M({packages:e,cwd:t,flags:["--silent"]}),console.log(j.green(`\u2713 Installed ${e.length} ${n}
119
- `))}catch(o){throw console.log(j.red(`\u2717 Package installation failed
120
- `)),o}},Jt=async(e,t)=>{if(e.length===0)return;console.log(j.cyan(`
136
+ `));try{await L({packages:e,cwd:t,flags:["--silent"]}),console.log(H.green(`\u2713 Installed ${e.length} ${n}
137
+ `))}catch(o){throw console.log(H.red(`\u2717 Package installation failed
138
+ `)),o}},Ar=async(e,t)=>{if(e.length===0)return;console.log(H.cyan(`
121
139
  \u25B6 Running post-generation commands...
122
- `));let n=(await Bt(e,t)).find(o=>!o.success);if(n){console.log(j.yellow(`
123
- \u26A0 Post-command failed: ${n.command}`)),n.error&&console.log(j.yellow(` Error: ${n.error}`));return}console.log(j.green(`\u2713 Post-generation commands complete
124
- `))};import Be from"chalk";var ac=e=>`${Be.dim(" \u2022 ")+Be.cyan(e)}
125
- `,Un=e=>Be.dim(` \u2728 Generated ${Be.white.bold(e)} tokens
126
- `),zn=()=>{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(ac(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 gc=()=>{let e=h(),t=qn(e,"package.json"),r=(()=>{if(!Jn(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse(cc(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()}},uc=async(e,t,r,n,o,s)=>{let i=On(r,n,o,t.workspaceRoot),a=jn(t,o,s),c=zn(),l=await dn(e,i,{system:a,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(Un(p.tokenCount)),console.log(),l},fc=(e,t)=>{let{serviceTypes:r}=ue(),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})},hc=e=>e.length===0?"":`${[u.cyan(`
127
- \u{1F4C1} Files to create:`),...e.map(t=>` ${u.green("\u2022")} ${u.white(t.path)} ${u.dim(`(${t.language})`)}`)].join(`
140
+ `));let n=(await Sr(e,t)).find(o=>!o.success);if(n){console.log(H.yellow(`
141
+ \u26A0 Post-command failed: ${n.command}`)),n.error&&console.log(H.yellow(` Error: ${n.error}`));return}console.log(H.green(`\u2713 Post-generation commands complete
142
+ `))};import ft from"chalk";var Xl=e=>`${ft.dim(" \u2022 ")+ft.cyan(e)}
143
+ `,Vo=e=>ft.dim(` \u2728 Generated ${ft.white.bold(e)} tokens
144
+ `),Jo=()=>{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(Xl(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 op=()=>{let e=g(),t=Zo(e,"package.json"),r=(()=>{if(!Yo(t))throw new Error("No package.json found in workspace root. Run from a valid workspace.");try{let o=JSON.parse(Ql(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()}},sp=async(e,t,r,n,o,s)=>{let i=Lo(r,n,o,t.workspaceRoot),a=_o(t,o,s),c=Jo(),l=await uo(e,i,{system:a,maxTokens:16384,temperature:.7,onToken:c}),p=c.getStats();return console.log(Vo(p.tokenCount)),console.log(),l},ip=(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})},ap=e=>e.length===0?"":`${[h.cyan(`
145
+ \u{1F4C1} Files to create:`),...e.map(t=>` ${h.green("\u2022")} ${h.white(t.path)} ${h.dim(`(${t.language})`)}`)].join(`
128
146
  `)}
129
- `,Kn=(e,t,r)=>e.length===0?"":`${[u.cyan(`
130
- ${r} ${t}:`),...e.map(n=>` ${u.yellow("$")} ${u.white(n.command)}`)].join(`
147
+ `,qo=(e,t,r)=>e.length===0?"":`${[h.cyan(`
148
+ ${r} ${t}:`),...e.map(n=>` ${h.yellow("$")} ${h.white(n.command)}`)].join(`
131
149
  `)}
132
- `,yc=e=>e.length===0?"":`${[u.cyan(`
133
- \u{1F4E6} Dependencies to install:`),...e.map(t=>` ${u.magenta("+")} ${u.white(t)}`)].join(`
150
+ `,cp=e=>e.length===0?"":`${[h.cyan(`
151
+ \u{1F4E6} Dependencies to install:`),...e.map(t=>` ${h.magenta("+")} ${h.white(t)}`)].join(`
134
152
  `)}
135
- `,vc=(e,t)=>`${[u.yellow(`
136
- Validation errors:`),...e.map(r=>u.yellow(` \u26A0 ${r}`)),u.dim(`
137
- Response preview:`),u.dim(t)].join(`
153
+ `,lp=(e,t)=>`${[h.yellow(`
154
+ Validation errors:`),...e.map(r=>h.yellow(` \u26A0 ${r}`)),h.dim(`
155
+ Response preview:`),h.dim(t)].join(`
138
156
  `)}
139
- `,Q=e=>{e&&process.stdout.write(e)},Cc=(e,t)=>{let r=Wn(e,t),n=Ut(r.commands),o=Ut(r.postCommands),s=Hn(r.files);return s.valid?{files:r.files,commands:n,dependencies:r.dependencies,postCommands:o}:(console.log(`${u.yellow("\u26A0")} Could not extract structured files from AI response`),Q(vc(s.errors,e.slice(0,500))),null)},kc=e=>{console.log(`${u.green("\u2714")} Extracted ${e.files.length} files`),Q(hc(e.files)),Q(Kn(e.commands,"Commands to run","\u{1F527}")),Q(Kn(e.postCommands,"Post-generation commands","\u{1F4DD}")),Q(yc(e.dependencies)),Q(`
140
- `)},xc=(e,t,r)=>{let n=bn(e);return n&&!n.includes("/")&&!n.startsWith(".")&&(n=`${w().services}/${n}`),n?Vn(r,n):Vn(r,t)},Pc=(e,t)=>{let{serviceTypes:r}=ue(),n=r[t]?.skipFiles||["package.json","tsconfig.json","Dockerfile"];return e.filter(o=>!n.includes(o.path))},ee=()=>{if(!Ce())return{valid:!1,error:u.red.bold(`\u274C AI configuration not found.
141
- `)+u.yellow("Please run ")+u.cyan.bold("pf setup --ai")+u.yellow(` first to configure your AI provider.
142
- `)};try{return{valid:!0,config:Le()}}catch(e){return{valid:!1,error:u.red.bold(`\u274C ${e.message}
143
- `)}}},Ue=async e=>e||mc({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"}),ze=(e,t,r)=>{console.log(u.cyan.bold(`
157
+ `,me=e=>{e&&process.stdout.write(e)},pp=(e,t)=>{let r=Bo(e,t),n=br(r.commands),o=br(r.postCommands),s=Go(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(lp(s.errors,e.slice(0,500))),null)},mp=e=>{console.log(`${h.green("\u2714")} Extracted ${e.files.length} files`),me(ap(e.files)),me(qo(e.commands,"Commands to run","\u{1F527}")),me(qo(e.postCommands,"Post-generation commands","\u{1F4DD}")),me(cp(e.dependencies)),me(`
158
+ `)},dp=(e,t,r)=>{let n=To(e);return n&&!n.includes("/")&&!n.startsWith(".")&&(n=`${E().services}/${n}`),n?Ko(r,n):Ko(r,t)},gp=(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
+ `)+h.yellow("Please run ")+h.cyan.bold("pf setup --ai")+h.yellow(` first to configure your AI provider.
160
+ `)};try{return{valid:!0,config:mt()}}catch(e){return{valid:!1,error:h.red.bold(`\u274C ${e.message}
161
+ `)}}},ht=async e=>e||rp({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"}),yt=(e,t,r)=>{console.log(h.cyan.bold(`
144
162
  \u{1F916} AI-Powered Generation
145
- `)),console.log(u.dim(`Service: ${e.split("/").pop()}`)),console.log(u.dim(`Path: ${e}`)),console.log(u.dim(`Model: ${t.model}`)),console.log(u.dim(`Description: ${r}
146
- `))},Ve=async(e,t)=>{let{servicePath:r,description:n="",serviceType:o,packageManager:s}=e,i=r.split("/").pop()||r,a=gc(),c=qn(a.workspaceRoot,Wr);pc(c,`generating:${r}`);let l=()=>{Jn(c)&&lc(c)},p=()=>{l(),process.exit(T.CANCELLED)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(u.cyan.bold(`
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
+ `))},vt=async(e,t)=>{let{servicePath:r,description:n="",serviceType:o,packageManager:s}=e,i=r.split("/").pop()||r,a=op(),c=Zo(a.workspaceRoot,tr);tp(c,`generating:${r}`);let l=()=>{Yo(c)&&ep(c)},p=()=>{l(),process.exit(w.CANCELLED)};process.on("SIGINT",p),process.on("SIGTERM",p);try{console.log(h.cyan.bold(`
147
165
  \u{1F916} AI Generation
148
- `));let m=await uc(t,a,r,n,o,s),f=Cc(m,i);if(!f)return!1;kc(f);let F=dc({text:"Processing files...",color:"cyan"}).start(),ge=fc(f.commands,o),b=xc(ge,r,a.cwd),Vs=Pc(f.files,o);await Gn(ge,b,a.workspaceRoot);let{missingContractCommands:jr}=await An(Vs,b,a,F);if(f.postCommands.length>0)await Jt(f.postCommands,a.workspaceRoot);else if(jr.length>0){console.log(u.cyan(`\u{1F527} Auto-creating missing contracts...
149
- `));let Ks=jr.map(Js=>({command:Js,isPfCommand:!0}));await Jt(Ks,a.workspaceRoot)}return Sn(b),await Bn(f.dependencies,b,F),await In(b,F),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};import{existsSync as Vf}from"fs";import{Project as wc,SyntaxKind as Jf}from"ts-morph";var qf=new wc({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0});import{promises as qt}from"fs";import Ke from"path";import Yn from"chalk";var Zn=async e=>{await W("bash",["-c",`
166
+ `));let m=await sp(t,a,r,n,o,s),y=pp(m,i);if(!y)return!1;mp(y);let _=np({text:"Processing files...",color:"cyan"}).start(),be=ip(y.commands,o),N=dp(be,r,a.cwd),Yi=gp(y.files,o);await Uo(be,N,a.workspaceRoot);let{missingContractCommands:vn}=await No(Yi,N,a,_);if(y.postCommands.length>0)await Ar(y.postCommands,a.workspaceRoot);else if(vn.length>0){console.log(h.cyan(`\u{1F527} Auto-creating missing contracts...
167
+ `));let Zi=vn.map(Xi=>({command:Xi,isPfCommand:!0}));await Ar(Zi,a.workspaceRoot)}return Eo(N),await zo(y.dependencies,N,_),await Ro(N,_),!0}finally{process.off("SIGINT",p),process.off("SIGTERM",p),l()}};import{existsSync as Yv}from"fs";import{Project as up,SyntaxKind as Xv}from"ts-morph";var Qv=new up({skipAddingFilesFromTsConfig:!0,skipFileDependencyResolution:!0});v();import{promises as Ir}from"fs";import kt from"path";import Xo from"chalk";var Qo=async e=>{await K("bash",["-c",`
150
168
  curl -fsSL https://bun.sh/install | bash && if [ -f "$HOME/.bun/bin/bun" ]; then export PATH="$HOME/.bun/bin:$PATH"; fi
151
- `],{task:e,shell:!0}),await $c()},Yt=()=>Ne("bun"),Xn=()=>bt([{label:"Bun",value:59026,color:"magenta",barColor:"magenta"},{label:"Deno",value:25335},{label:"Node.js",value:19039}],{title:'Express.js "hello world" HTTP requests per second (Linux x64)',barColor:"blackBright"}),Qn=()=>bt([{label:"Bun",value:.36,color:"magenta",barColor:"magenta"},{label:"pnpm",value:6.44},{label:"npm",value:10.58},{label:"yarn",value:12.08}],{title:"Bun is an npm-compatible package manager.",unit:"s",footer:Yn.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),$c=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=[Ke.join(t,".zshrc"),Ke.join(t,".bashrc"),Ke.join(t,".bash_profile")];for(let n of r)try{if(await qt.stat(n).then(()=>!0).catch(()=>!1)){(await qt.readFile(n,"utf8")).includes(e)||(await qt.appendFile(n,`
169
+ `],{task:e,shell:!0}),await kp()},Rr=()=>Ee("bun"),es=()=>Zt([{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"}),ts=()=>Zt([{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:Xo.blackBright("* Installing dependencies from cache for a Remix app."),barColor:"blackBright"}),kp=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=[kt.join(t,".zshrc"),kt.join(t,".bashrc"),kt.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,`
152
170
  # Added by platform installer
153
171
  ${e}
154
- `),d.log(`Added Bun path to ${Ke.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(Yn.cyan(e))};import{existsSync as Ye,mkdirSync as Bc,readFileSync as Uc,renameSync as zc,statSync as so,unlinkSync as Vc,writeFileSync as Kc}from"fs";import{join as we}from"path";import{existsSync as Ic}from"fs";import{join as Ac}from"path";import Je from"chalk";import Zt from"chalk";var te=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` ${Zt.cyan(o.name)}${s}${o.description}`}),n=e.footer||'Run "<command> --help" for more information';return[Zt.cyan.bold(`
172
+ `),d.log(`Added Bun path to ${kt.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(Xo.cyan(e))};f();import{existsSync as wt,mkdirSync as Op,readFileSync as Mp,renameSync as Dp,statSync as as,unlinkSync as jp,writeFileSync as _p}from"fs";import{join as We}from"path";import{existsSync as Cp}from"fs";import{join as xp}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(`
155
173
  ${e.title}
156
174
  `),`Available commands:
157
- `,...r,"",Zt.dim(`${n}
175
+ `,...r,"",Nr.dim(`${n}
158
176
  `)].join(`
159
- `)};var Rc=(e,t)=>t.some(r=>r.name()===e),Nc=(e,t)=>t.pf?.commands?.[e]??null,Fc=(e,t)=>!!t.scripts?.[e],Mc=(e,t)=>t.cwd?Ac(e,t.cwd):e,Dc=(e,t)=>t.command||e,jc=(e,t,r,n)=>{let o=Mc(n,r),s=Dc(e,r);if(r.cwd&&!Ic(o))return console.error(Je.red(`
177
+ `)};var wp=(e,t)=>t.some(r=>r.name()===e),Pp=(e,t)=>t.pf?.commands?.[e]??null,Sp=(e,t)=>!!t.scripts?.[e],bp=(e,t)=>t.cwd?xp(e,t.cwd):e,Ep=(e,t)=>t.command||e,Tp=(e,t,r,n)=>{let o=bp(n,r),s=Ep(e,r);if(r.cwd&&!Cp(o))return console.error(Ct.red(`
160
178
  \u2716 Directory not found: ${o}
161
- `)),!0;let i=r.cwd?Je.dim(` in ${r.cwd}/`):"";return console.log(Je.dim(`Running ${s}${i}`)),je(s,t,{cwd:o}),!0},Oc=(e,t,r)=>(console.log(Je.dim(`Running workspace script: ${e}`)),he(e,{args:t,cwd:r}),!0);async function _c(e,t,r){if(Rc(e,r))return!1;let n;try{n=h()}catch{return!1}let o=G(n);if(!o)return!1;let s=Nc(e,o);return s?jc(e,t,s,n):Fc(e,o)?Oc(e,t,n):!1}function eo(){let e;try{e=G()}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 Xt(){let{configured:e,scripts:t}=eo();return[...e,...t]}function to(){let{configured:e,scripts:t}=eo(),r=[...e,...t];if(r.length===0)return"";let o=G()?.pf?.commands||{},s=r.map(i=>({name:i,description:o[i]?.description||qe[i]||""}));return te({title:"Workspace Commands",commands:s,footer:""})}function ro(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=Xt();for(let a of i)console.log(a);return}_c(o,s,r).then(i=>{i||e.parse(t)})}else e.parse(t)}var no={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"},qe={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"},oo=(e,t)=>t?`${e}:${t}`:e,Lc=()=>Object.entries(no).map(([e,t])=>oo(e,t)),Wc=()=>{try{let e=Xt(),r=G()?.pf?.commands||{},n=Object.keys(no);return e.filter(o=>!n.includes(o)).map(o=>{let s=r[o]?.description||qe[o]||"";return oo(o,s)})}catch{return[]}},Hc=()=>{try{let e=h(),t=C(e),r=`${e}/${t.relativePath}/src`,{discoverEventTypes:n}=Or("@crossdelta/cloudevents");return n(r)}catch{return[]}},Gc=async()=>{try{let e=h();return await fn(e)}catch{return[]}},Qt=async()=>({commands:[...Lc(),...Wc()],events:Hc(),services:await Gc()});var xe="node_modules/.cache/pf",Pe="completion-cache";var Jc=e=>{let t=A.version||"0.0.0",r=e.commands.join("|"),n=e.events.join("|"),o=e.services.join("|");return`${t} ${r} ${n} ${o}`},qc=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:[]}},Yc=e=>{let t=we(e,xe);return we(t,Pe)},Zc=(e,t=!1)=>{if(t)return!0;let r=Yc(e);if(!Ye(r))return!0;let n=Uc(r,"utf-8").trim(),o=qc(n),s=A.version||"0.0.0";if(o.version!==s)return!0;let i=we(e,"package.json");if(!Ye(i))return!1;let a=so(r).mtimeMs;return so(i).mtimeMs>a};var Xc=(e,t)=>{let r=we(e,xe),n=we(r,Pe),o=`${n}.tmp.${process.pid}`;Ye(r)||Bc(r,{recursive:!0});let s=Jc(t);try{Kc(o,s,"utf-8"),zc(o,n)}catch(i){try{Ye(o)&&Vc(o)}catch{}throw i}},Ze=async(e={})=>{let t;try{t=h()}catch{return!1}if(!t)return!1;if(!Zc(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let r=await Qt();return Xc(t,r),e.verbose&&console.log(`[completion] Cache regenerated: ${r.commands.length} commands, ${r.events.length} events`),!0},Se=async(e={})=>{await Ze({...e,force:!0})};import{existsSync as tr,readFileSync as po,writeFileSync as mo}from"fs";import{homedir as go}from"os";import{join as er}from"path";import re from"chalk";var io=`${xe}/${Pe}`,ao=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}`)),ct(s,t,{cwd:o}),!0},$p=(e,t,r)=>(console.log(Ct.dim(`Running workspace script: ${e}`)),Fe(e,{args:t,cwd:r}),!0);async function Ap(e,t,r){if(wp(e,r))return!1;let n;try{n=g()}catch{return!1}let o=F(n);if(!o)return!1;let s=Pp(e,o);return s?Tp(e,t,s,n):Sp(e,o)?$p(e,t,n):!1}function rs(){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}=rs();return[...e,...t]}function ns(){let{configured:e,scripts:t}=rs(),r=[...e,...t];if(r.length===0)return"";let o=F()?.pf?.commands||{},s=r.map(i=>({name:i,description:o[i]?.description||xt[i]||""}));return ge({title:"Workspace Commands",commands:s,footer:""})}function os(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}Ap(o,s,r).then(i=>{i||e.parse(t)})}else e.parse(t)}f();var ss={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"},xt={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"},is=(e,t)=>t?`${e}:${t}`:e,Ip=()=>Object.entries(ss).map(([e,t])=>is(e,t)),Rp=()=>{try{let e=Fr(),r=F()?.pf?.commands||{},n=Object.keys(ss);return e.filter(o=>!n.includes(o)).map(o=>{let s=r[o]?.description||xt[o]||"";return is(o,s)})}catch{return[]}},Np=()=>{try{let e=g(),t=x(e),r=`${e}/${t.relativePath}/src`,{discoverEventTypes:n}=Kt("@crossdelta/cloudevents");return n(r)}catch{return[]}},Fp=async()=>{try{let e=g();return await yo(e)}catch{return[]}},Or=async()=>({commands:[...Ip(),...Rp()],events:Np(),services:await Fp()});var _e="node_modules/.cache/pf",Le="completion-cache";var Lp=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}`},Wp=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:[]}},Hp=e=>{let t=We(e,_e);return We(t,Le)},Bp=(e,t=!1)=>{if(t)return!0;let r=Hp(e);if(!wt(r))return!0;let n=Mp(r,"utf-8").trim(),o=Wp(n),s=R.version||"0.0.0";if(o.version!==s)return!0;let i=We(e,"package.json");if(!wt(i))return!1;let a=as(r).mtimeMs;return as(i).mtimeMs>a};var Gp=(e,t)=>{let r=We(e,_e),n=We(r,Le),o=`${n}.tmp.${process.pid}`;wt(r)||Op(r,{recursive:!0});let s=Lp(t);try{_p(o,s,"utf-8"),Dp(o,n)}catch(i){try{wt(o)&&jp(o)}catch{}throw i}},Pt=async(e={})=>{let t;try{t=g()}catch{return!1}if(!t)return!1;if(!Bp(t,e.force))return e.verbose&&console.log("[completion] Cache is up to date"),!1;let r=await Or();return Gp(t,r),e.verbose&&console.log(`[completion] Cache regenerated: ${r.commands.length} commands, ${r.events.length} events`),!0},He=async(e={})=>{await Pt({...e,force:!0})};import{existsSync as Dr,readFileSync as ds,writeFileSync as gs}from"fs";import{homedir as us}from"os";import{join as Mr}from"path";import ue from"chalk";var cs=`${_e}/${Le}`,ls=e=>`# ${e} completion (workspace-local cache)
162
180
  # Generated: ${new Date().toISOString()}
163
181
 
164
182
  # Cache file path (relative to workspace root)
165
- _${e}_cache_path="${io}"
183
+ _${e}_cache_path="${cs}"
166
184
 
167
185
  # Find workspace root (walk up to find monorepo package.json)
168
186
  _${e}_find_workspace() {
@@ -289,11 +307,11 @@ _${e}_completions() {
289
307
  esac
290
308
  }
291
309
 
292
- compdef _${e}_completions ${e}`,co=e=>`# ${e} completion (workspace-local cache)
310
+ compdef _${e}_completions ${e}`,ps=e=>`# ${e} completion (workspace-local cache)
293
311
  # Generated: ${new Date().toISOString()}
294
312
 
295
313
  # Cache file path (relative to workspace root)
296
- _${e}_cache_path="${io}"
314
+ _${e}_cache_path="${cs}"
297
315
 
298
316
  # Find workspace root
299
317
  _${e}_find_workspace() {
@@ -387,31 +405,31 @@ _${e}_completions() {
387
405
  return 0
388
406
  }
389
407
 
390
- complete -F _${e}_completions ${e}`;var Qc=(e,t)=>er(go(),`.${t}-completion.${e}`),uo=e=>{let t=go();return e==="zsh"?er(t,".zshrc"):er(t,".bashrc")},el=e=>`[[ -f "${e}" ]] && source "${e}"`,tl=(e,t)=>tr(e)?po(e,"utf-8").includes(t):!1,rl=(e,t)=>{let r=tr(e)?po(e,"utf-8"):"",n=r.endsWith(`
408
+ complete -F _${e}_completions ${e}`;var Up=(e,t)=>Mr(us(),`.${t}-completion.${e}`),fs=e=>{let t=us();return e==="zsh"?Mr(t,".zshrc"):Mr(t,".bashrc")},zp=e=>`[[ -f "${e}" ]] && source "${e}"`,Vp=(e,t)=>Dr(e)?ds(e,"utf-8").includes(t):!1,Jp=(e,t)=>{let r=Dr(e)?ds(e,"utf-8"):"",n=r.endsWith(`
391
409
  `)?`${r}${t}
392
410
  `:`${r}
393
411
  ${t}
394
- `;mo(e,n,"utf-8")},nl=(e,t)=>{let r=Qc(e,t),n=e==="zsh"?ao(t):co(t);return mo(r,n,"utf-8"),r},lo=(e,t,r)=>{let n=nl(e,t),o=uo(e),s=el(n);return tl(o,s)?(r&&console.log(re.dim(`[${e}] Already configured in ${o}`)),!1):(rl(o,s),r&&console.log(re.green(`[${e}] Added source line to ${o}`)),!0)},ol=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",rr=(e,t=!1)=>{let r=ol();t&&console.log(re.cyan(`Installing ${r} completion...`)),lo(r,e,t);let n=r==="zsh"?"bash":"zsh",o=uo(n);tr(o)&&lo(n,e,t),t&&(console.log(re.green("\u2713 Shell completion installed")),console.log(re.dim(` Run: ${re.cyan("exec $SHELL")} to reload`)))};import{readdir as Dv}from"fs/promises";import{dirname as Ov,join as _v}from"path";import{fileURLToPath as Wv}from"url";import{runFlow as Gv}from"@crossdelta/flowcore";var sl={debug:()=>{},info:console.log,warn:console.warn,error:console.error},fo=e=>e!==null&&typeof e=="object",ho=e=>typeof e=="string"&&e.length>0,yo=e=>typeof e=="string",nr=e=>typeof e=="function",il=(e,t)=>fo(e)?[!ho(e.name)&&`commands[${t}]: missing or invalid 'name'`,!yo(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`,!nr(e.run)&&`commands[${t}]: missing 'run' function`].filter(r=>r!==!1):[`commands[${t}]: must be an object`];var vo=e=>{if(!fo(e))return["Plugin must be an object"];let t=[!ho(e.name)&&"Missing or invalid 'name'",!yo(e.version)&&"Missing or invalid 'version'",!Array.isArray(e.commands)&&"Missing 'commands' array",!Array.isArray(e.flows)&&"Missing 'flows' array",!nr(e.setup)&&"Missing 'setup' function"].filter(n=>n!==!1),r=Array.isArray(e.commands)?e.commands.flatMap((n,o)=>il(n,o)):[];return[...t,...r]},Xe=(e,t=sl)=>({workspace:e,logger:t}),Qe=async(e,t)=>{let{logger:r}=t;r.debug(`Loading plugin from module: ${e}`);let n=await import(e),o=n.createPfPlugin||n.default?.createPfPlugin;if(!nr(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=vo(s);if(i.length>0)throw new Error(`Plugin from ${e} does not conform to PfPlugin interface:
412
+ `;gs(e,n,"utf-8")},Kp=(e,t)=>{let r=Up(e,t),n=e==="zsh"?ls(t):ps(t);return gs(r,n,"utf-8"),r},ms=(e,t,r)=>{let n=Kp(e,t),o=fs(e),s=zp(n);return Vp(o,s)?(r&&console.log(ue.dim(`[${e}] Already configured in ${o}`)),!1):(Jp(o,s),r&&console.log(ue.green(`[${e}] Added source line to ${o}`)),!0)},qp=()=>(process.env.SHELL||"").includes("zsh")?"zsh":"bash",jr=(e,t=!1)=>{let r=qp();t&&console.log(ue.cyan(`Installing ${r} completion...`)),ms(r,e,t);let n=r==="zsh"?"bash":"zsh",o=fs(n);Dr(o)&&ms(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 Lx}from"fs/promises";import{dirname as Hx,join as Bx}from"path";import{fileURLToPath as Ux}from"url";import{runFlow as Vx}from"@crossdelta/flowcore";var Yp={debug:()=>{},info:console.log,warn:console.warn,error:console.error},hs=e=>e!==null&&typeof e=="object",ys=e=>typeof e=="string"&&e.length>0,vs=e=>typeof e=="string",_r=e=>typeof e=="function",Zp=(e,t)=>hs(e)?[!ys(e.name)&&`commands[${t}]: missing or invalid 'name'`,!vs(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`,!_r(e.run)&&`commands[${t}]: missing 'run' function`].filter(r=>r!==!1):[`commands[${t}]: must be an object`];var ks=e=>{if(!hs(e))return["Plugin must be an object"];let t=[!ys(e.name)&&"Missing or invalid 'name'",!vs(e.version)&&"Missing or invalid 'version'",!Array.isArray(e.commands)&&"Missing 'commands' array",!Array.isArray(e.flows)&&"Missing 'flows' array",!_r(e.setup)&&"Missing 'setup' function"].filter(n=>n!==!1),r=Array.isArray(e.commands)?e.commands.flatMap((n,o)=>Zp(n,o)):[];return[...t,...r]},St=(e,t=Yp)=>({workspace:e,logger:t}),bt=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(!_r(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=ks(s);if(i.length>0)throw new Error(`Plugin from ${e} does not conform to PfPlugin interface:
395
413
  - ${i.join(`
396
- - `)}`);let a=s;return r.debug(`Loaded plugin: ${a.name} v${a.version}`),await a.setup(t),{plugin:a,source:e}};import{deriveEventNames as Vv}from"@crossdelta/cloudevents";import{z as y}from"zod";var et=y.object({dependencies:y.record(y.string(),y.string()).default({}),envVars:y.array(y.object({key:y.string(),description:y.string(),required:y.boolean().default(!0)})).default([]),adapterFile:y.string().optional()}),al=y.object({push:y.string().optional(),email:y.string().optional(),slack:y.string().optional(),sms:y.string().optional()}).optional(),cl=y.object({defaults:al,providers:y.object({push:y.record(y.string(),et).optional(),email:y.record(y.string(),et).optional(),slack:y.record(y.string(),et).optional(),sms:y.record(y.string(),et).optional()}).optional()}),Jh=y.object({notifier:cl.optional()});import{z as g}from"zod";var ll=g.object({type:g.literal("event"),eventType:g.string(),stream:g.string().optional()}),pl=g.object({type:g.literal("http"),method:g.enum(["GET","POST","PUT","DELETE","PATCH"]).optional(),path:g.string().optional()}),Co=g.discriminatedUnion("type",[ll,pl]),ml=g.object({type:g.literal("emit.event"),eventType:g.string()}),dl=g.object({type:g.literal("notify"),channel:g.enum(["push","email","slack","sms"]),provider:g.string().optional()}),gl=g.object({type:g.literal("call.http"),name:g.string().optional(),baseUrl:g.string().optional()}),ul=g.object({type:g.literal("persist"),store:g.enum(["db","kv","cache"]),entity:g.string().optional()}),ko=g.discriminatedUnion("type",[ml,dl,gl,ul]),xo=g.object({serviceName:g.string().regex(/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/),framework:g.enum(["hono","nest"]).default("hono"),triggers:g.array(Co).min(1),actions:g.array(ko).default([])});var Sl=(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=jt(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`})},bl=(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 Yx}from"@crossdelta/cloudevents";import{z as k}from"zod";var Et=k.object({dependencies:k.record(k.string(),k.string()).default({}),envVars:k.array(k.object({key:k.string(),description:k.string(),required:k.boolean().default(!0)})).default([]),adapterFile:k.string().optional()}),Xp=k.object({push:k.string().optional(),email:k.string().optional(),slack:k.string().optional(),sms:k.string().optional()}).optional(),Qp=k.object({defaults:Xp,providers:k.object({push:k.record(k.string(),Et).optional(),email:k.record(k.string(),Et).optional(),slack:k.record(k.string(),Et).optional(),sms:k.record(k.string(),Et).optional()}).optional()}),Xk=k.object({notifier:Qp.optional()});import{z as u}from"zod";var em=u.object({type:u.literal("event"),eventType:u.string(),stream:u.string().optional()}),tm=u.object({type:u.literal("http"),method:u.enum(["GET","POST","PUT","DELETE","PATCH"]).optional(),path:u.string().optional()}),Cs=u.discriminatedUnion("type",[em,tm]),rm=u.object({type:u.literal("emit.event"),eventType:u.string()}),nm=u.object({type:u.literal("notify"),channel:u.enum(["push","email","slack","sms"]),provider:u.string().optional()}),om=u.object({type:u.literal("call.http"),name:u.string().optional(),baseUrl:u.string().optional()}),sm=u.object({type:u.literal("persist"),store:u.enum(["db","kv","cache"]),entity:u.string().optional()}),xs=u.discriminatedUnion("type",[rm,nm,om,sm]),ws=u.object({serviceName:u.string().regex(/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/),framework:u.enum(["hono","nest"]).default("hono"),triggers:u.array(Cs).min(1),actions:u.array(xs).default([])});var fm=(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`})},hm=(e,t,r)=>{let{path:n,eventType:o}=e;if(r?.dryRun){let i=`
397
415
  import { createContract } from '@crossdelta/cloudevents'
398
416
  import { z } from 'zod'
399
417
 
400
- export const ${or(o)}Contract = createContract({
418
+ export const ${Lr(o)}Contract = createContract({
401
419
  type: '${o}',
402
420
  schema: z.object({ ... }),
403
421
  })
404
- `.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=Wt(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`}},or=e=>e.split(".").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(""),Tl=(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(""),ym=(e,t,r)=>{let{path:n,eventType:o,servicePath:s}=e;if(r?.dryRun){let i=`
405
423
  import { handleEvent } from '@crossdelta/cloudevents'
406
- import { ${or(o)}Contract } from '@your-scope/contracts'
424
+ import { ${Lr(o)}Contract } from '@your-scope/contracts'
407
425
 
408
- export default handleEvent(${or(o)}Contract, async (data) => {
426
+ export default handleEvent(${Lr(o)}Contract, async (data) => {
409
427
  console.log('Processing ${o}:', data)
410
428
  // TODO: Implement handler logic
411
429
  })
412
- `.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}},El={"stream.wired":Sl,"contract.created":bl,"handler.created":Tl},sr=(e,t,r)=>e.map(n=>{let o=El[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 st}from"path";import{deriveEventNames as hp}from"@crossdelta/cloudevents";var ir=(e,t,r={})=>({ok:!0,operation:e,summary:t,artifacts:r.artifacts??[],changes:r.changes??[],diagnostics:r.diagnostics??[],next:r.next,data:r.data});import{join as cr}from"path";import{readFileSync as $l}from"fs";import{join as Il}from"path";import Al from"handlebars";var ne=(e,t)=>un(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),ar=(e,t={})=>{let r=$l(e,"utf-8");return Al.compile(r)(t)},tt=e=>(t,r={})=>{let n=Il(e,t);return ar(n,r)};var _=e=>e.toUpperCase().replace(/-/g,"_");var wo=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");var Rl=()=>typeof import.meta?.url=="string"?D(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Nl=()=>{let e=Rl(),t=U();return ne([cr(e,"templates","hono-microservice"),cr(e,"..","hono-microservice","templates"),cr(t,"bin","templates","hono-microservice")],"Hono templates directory not found.")},rt=(e,t={})=>tt(Nl())(e,t);function So(){return rt("tsconfig.json.hbs")}function bo(e="1.2.23"){return rt("Dockerfile.hbs",{bunVersion:e})}function To(){return rt("biome.json.hbs")}function Eo(e,t=[]){return rt("src/config/env.ts.hbs",{envKey:_(e),envVars:t})}var Fl=e=>{let t=["import './config/env'","import '@crossdelta/telemetry'",""];return e&&t.push("import { consumeJetStreams } from '@crossdelta/cloudevents'"),t.push("import { Hono } from 'hono'"),t},Ml=e=>[`const port = Number(process.env.${e}_PORT) || 8080`,"const app = new Hono()","","app.get('/health', (c) => {"," return c.json({ status: 'ok' })","})"],Dl=(e,t)=>["","// Start NATS JetStream consumer","consumeJetStreams({",` streams: [${t.map(r=>`'${r}'`).join(", ")}],`,` consumer: '${e}',`," discover: './src/events/**/*.handler.ts',","})"],jl=()=>["","Bun.serve({"," port,"," fetch: app.fetch,","})","","console.log(`\u{1F680} Service ready at http://localhost:${port}`)"],Ol=e=>{let t=_(e.serviceName);return`${[...Fl(e.hasEvents),"",...Ml(t),...e.hasEvents?Dl(e.serviceName,e.streams):[],...jl()].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}},vm={"stream.wired":fm,"contract.created":hm,"handler.created":ym},Wr=(e,t,r)=>e.map(n=>{let o=vm[n.kind];return o?o(n,t,r):(t.logger.warn(`Unknown effect kind: ${n.kind}`),{success:!1,message:`Unknown effect kind: ${n.kind}`})});import{join as Rt}from"path";import{deriveEventNames as ad}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 Gr}from"path";import{readFileSync as km}from"fs";import{join as Cm}from"path";import xm from"handlebars";var fe=(e,t)=>ho(e,t??`Templates directory not found. Searched in: ${e.join(", ")}`),Br=(e,t={})=>{let r=km(e,"utf-8");return xm.compile(r)(t)},Tt=e=>(t,r={})=>{let n=Cm(e,t);return Br(n,r)};var G=e=>e.toUpperCase().replace(/-/g,"_");var Ss=e=>e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");var wm=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Pm=()=>{let e=wm(),t=ee();return fe([Gr(e,"templates","hono-microservice"),Gr(e,"..","hono-microservice","templates"),Gr(t,"bin","templates","hono-microservice")],"Hono templates directory not found.")},$t=(e,t={})=>Tt(Pm())(e,t);function bs(){return $t("tsconfig.json.hbs")}function Es(e="1.2.23"){return $t("Dockerfile.hbs",{bunVersion:e})}function Ts(){return $t("biome.json.hbs")}function $s(e,t=[]){return $t("src/config/env.ts.hbs",{envKey:G(e),envVars:t})}var Sm=e=>{let t=["import './config/env'","import '@crossdelta/telemetry'",""];return e&&t.push("import { consumeJetStreams } from '@crossdelta/cloudevents'"),t.push("import { Hono } from 'hono'"),t},bm=e=>[`const port = Number(process.env.${e}_PORT) || 8080`,"const app = new Hono()","","app.get('/health', (c) => {"," return c.json({ status: 'ok' })","})"],Em=(e,t)=>["","// Start NATS JetStream consumer","consumeJetStreams({",` streams: [${t.map(r=>`'${r}'`).join(", ")}],`,` consumer: '${e}',`," discover: './src/events/**/*.handler.ts',","})"],Tm=()=>["","Bun.serve({"," port,"," fetch: app.fetch,","})","","console.log(`\u{1F680} Service ready at http://localhost:${port}`)"],$m=e=>{let t=G(e.serviceName);return`${[...Sm(e.hasEvents),"",...bm(t),...e.hasEvents?Em(e.serviceName,e.streams):[],...Tm()].join(`
413
431
  `)}
414
- `},_l=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)},Ll=e=>`# ${e.serviceName}
432
+ `},Am=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)},Im=e=>`# ${e.serviceName}
415
433
 
416
434
  ## Development
417
435
 
@@ -431,7 +449,7 @@ ${e.hasEvents?`
431
449
  This service consumes from:
432
450
  ${e.streams.map(t=>`- ${t}`).join(`
433
451
  `)}`:""}
434
- `,Wl=()=>"",$o={name:"hono-bun",runtime:"bun",framework:"hono",files:[{path:"src/index.ts",content:Ol},{path:"src/config/env.ts",content:e=>Eo(e.serviceName,e.envVars)},{path:"package.json",content:_l},{path:"tsconfig.json",content:()=>So()},{path:"Dockerfile",content:()=>bo()},{path:"biome.json",content:()=>To()},{path:"README.md",content:Ll},{path:"src/events/.gitkeep",content:Wl,skip:e=>!e.hasEvents}]};import{join as lr}from"path";var Hl=()=>typeof import.meta?.url=="string"?D(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Gl=()=>{let e=Hl(),t=U();return ne([lr(e,"templates","nest-microservice"),lr(e,"..","nest-microservice","templates"),lr(t,"bin","templates","nest-microservice")],"NestJS templates directory not found.")},V=(e,t={})=>tt(Gl())(e,t);function Io(e,t=3e3){return V("src/main.ts.hbs",{serviceName:e,envKey:_(e),displayName:wo(e),defaultPort:t})}function Ao(){return V("src/app.context.ts.hbs",{})}function Ro(){return V("src/events/events.module.ts.hbs",{})}function No(e){return V("src/events/events.service.ts.hbs",{serviceName:e})}function Fo(e="24",t="1.2.23"){return V("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function Mo(){return V("biome.json.hbs",{})}function Do(e,t=[]){return V("src/config/env.ts.hbs",{envKey:_(e),envVars:t})}var Bl=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)},Ul=()=>JSON.stringify({extends:"../../../../tsconfig.json",compilerOptions:{outDir:"./dist",rootDir:"./src",experimentalDecorators:!0,emitDecoratorMetadata:!0},include:["src/**/*"],exclude:["node_modules","dist","**/*.test.ts"]},null,2),zl=e=>{let t=["Module","HttpModule"],r=["HttpModule"];return e.hasEvents&&(t.push("OnModuleInit"),r.push("EventsModule")),`import { ${t.join(", ")} } from '@nestjs/common'
452
+ `,Rm=()=>"",As={name:"hono-bun",runtime:"bun",framework:"hono",files:[{path:"src/index.ts",content:$m},{path:"src/config/env.ts",content:e=>$s(e.serviceName,e.envVars)},{path:"package.json",content:Am},{path:"tsconfig.json",content:()=>bs()},{path:"Dockerfile",content:()=>Es()},{path:"biome.json",content:()=>Ts()},{path:"README.md",content:Im},{path:"src/events/.gitkeep",content:Rm,skip:e=>!e.hasEvents}]};import{join as Ur}from"path";var Nm=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Fm=()=>{let e=Nm(),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={})=>Tt(Fm())(e,t);function Is(e,t=3e3){return re("src/main.ts.hbs",{serviceName:e,envKey:G(e),displayName:Ss(e),defaultPort:t})}function Rs(){return re("src/app.context.ts.hbs",{})}function Ns(){return re("src/events/events.module.ts.hbs",{})}function Fs(e){return re("src/events/events.service.ts.hbs",{serviceName:e})}function Os(e="24",t="1.2.23"){return re("Dockerfile.hbs",{nodeVersion:e,bunVersion:t})}function Ms(){return re("biome.json.hbs",{})}function Ds(e,t=[]){return re("src/config/env.ts.hbs",{envKey:G(e),envVars:t})}var Om=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)},Mm=()=>JSON.stringify({extends:"../../../../tsconfig.json",compilerOptions:{outDir:"./dist",rootDir:"./src",experimentalDecorators:!0,emitDecoratorMetadata:!0},include:["src/**/*"],exclude:["node_modules","dist","**/*.test.ts"]},null,2),Dm=e=>{let t=["Module","HttpModule"],r=["HttpModule"];return e.hasEvents&&(t.push("OnModuleInit"),r.push("EventsModule")),`import { ${t.join(", ")} } from '@nestjs/common'
435
453
  ${e.hasEvents?"import { EventsModule } from './events/events.module'":""}
436
454
 
437
455
  @Module({
@@ -444,7 +462,7 @@ export class AppModule${e.hasEvents?" implements OnModuleInit":""} {
444
462
  // Events module initializes NATS consumer
445
463
  }`:""}
446
464
  }
447
- `},Vl=()=>`import { Controller, Get } from '@nestjs/common'
465
+ `},jm=()=>`import { Controller, Get } from '@nestjs/common'
448
466
 
449
467
  @Controller()
450
468
  export class AppController {
@@ -453,7 +471,7 @@ export class AppController {
453
471
  return { status: 'ok' }
454
472
  }
455
473
  }
456
- `,Kl=e=>`# ${e.serviceName}
474
+ `,_m=e=>`# ${e.serviceName}
457
475
 
458
476
  ## Development
459
477
 
@@ -473,8 +491,8 @@ ${e.hasEvents?`
473
491
  This service consumes from:
474
492
  ${e.streams.map(t=>`- ${t}`).join(`
475
493
  `)}`:""}
476
- `,Jl=()=>"",jo={name:"nest",runtime:"node",framework:"nest",files:[{path:"src/config/env.ts",content:e=>Do(e.serviceName,e.envVars)},{path:"src/main.ts",content:e=>Io(e.serviceName,e.port)},{path:"src/app.module.ts",content:zl},{path:"src/app.controller.ts",content:()=>Vl()},{path:"src/app.context.ts",content:()=>Ao()},{path:"package.json",content:Bl},{path:"tsconfig.json",content:()=>Ul()},{path:"Dockerfile",content:()=>Fo()},{path:"biome.json",content:()=>Mo()},{path:"README.md",content:Kl},{path:"src/events/events.module.ts",content:()=>Ro(),skip:e=>!e.hasEvents},{path:"src/events/events.service.ts",content:e=>No(e.serviceName),skip:e=>!e.hasEvents},{path:"src/events/handlers/.gitkeep",content:Jl,skip:e=>!e.hasEvents}]};var Oo=[$o,jo],_o=e=>{let t=ql(e),r=Oo.find(n=>n.name===t);if(!r)throw new Error(`Template '${e}' not found. Available: ${Oo.map(n=>n.name).join(", ")}`);return r},ql=e=>({"hono-micro":"hono-bun","nest-micro":"nest"})[e]||e;import{join as mr}from"path";import{deriveEventNames as dr}from"@crossdelta/cloudevents";var Lo={appliesTo:["src/domain","src/use-cases"],forbiddenPatterns:[{pattern:"console\\.(log|error|warn|info|debug)\\s*\\(",description:"console.* is forbidden in business logic (use structured logging)",code:"CONSOLE_IN_DOMAIN"},{pattern:"process\\.env\\b",description:"process.env is forbidden in business logic (use dependency injection)",code:"PROCESS_ENV_IN_DOMAIN"},{pattern:"\\bfetch\\s*\\(",description:"fetch() is forbidden in business logic (use adapters/services)",code:"FETCH_IN_DOMAIN"}]},be={hono:{businessLogicDir:"use-cases",eventsDir:"events",filePattern:"{name}.use-case.ts",suffix:"use-case",handlerDelegatesToBusinessLogic:!0,pathGuards:{forbidDirs:["src/services"]},codingConstraints:Lo},nestjs:{businessLogicDir:"",eventsDir:"events",filePattern:"{name}.service.ts",suffix:"service",handlerDelegatesToBusinessLogic:!1,pathGuards:{forbidDirs:[]},codingConstraints:{appliesTo:["src/domain"],forbiddenPatterns:Lo.forbiddenPatterns}}},Yl=e=>e.replace(/-([a-z])/g,(t,r)=>r.toUpperCase()),Zl=(e,t)=>`../${e}/${t}`,oe=(e,t)=>{let r=be[e],n=r.filePattern.replace("{name}",t),o=n.replace(/\.ts$/,""),s=r.businessLogicDir?`src/${r.businessLogicDir}`:"src";return{filePath:s?`${s}/${n}`:`src/${n}`,dirPath:s,fileName:n,functionName:Yl(t),delegateFromHandler:r.handlerDelegatesToBusinessLogic,importFromEvents:r.businessLogicDir?Zl(r.businessLogicDir,o):`./${o}`}},pr=(e,t)=>{let n=`src/${be[e].eventsDir}`,o=`${t}.handler.ts`;return{filePath:`${n}/${o}`,dirPath:n,fileName:o}},Te=e=>`handle-${e.replace(/\./g,"-")}`,nt=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("/")},Xl=(e,t)=>{let r=nt(e);for(let n of t){let o=nt(n);if(r.startsWith(`${o}/`)||r===o)return n}return null},Ql=(e,t)=>{let r=nt(e);return t.some(n=>{let o=nt(n);return r.startsWith(`${o}/`)||r===o})},ep=(e,t,r)=>{let n=[],o=e.split(`
477
- `);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},tp=(e,t)=>{let r=[],n=Xl(e.path,t.pathGuards.forbidDirs);if(n&&r.push({code:"FORBIDDEN_DIR",message:`Path '${e.path}' is in forbidden directory '${n}'`,path:e.path}),Ql(e.path,t.codingConstraints.appliesTo)){let o=ep(e.content,t.codingConstraints.forbiddenPatterns,e.path);r.push(...o)}return r},ot=(e,t)=>{let r=be[e],n=[];for(let o of t)n.push(...tp(o,r));return{valid:n.length===0,violations:n}};var op=(e,t)=>t.map(r=>({kind:"file:write",path:mr(e,r.path),content:r.content})),sp=(e,t,r)=>({kind:"infra:add",serviceName:e,port:t,framework:r.framework,runtime:r.runtime}),ip=(e,t)=>({kind:"env:add",key:`${e}_PORT`,value:t.toString()}),ap=(e,t)=>{let{typeName:r}=dr(e),n=Te(e),o=oe("hono",n);return`import type { ${r} } from '${t}/contracts'
494
+ `,Lm=()=>"",js={name:"nest",runtime:"node",framework:"nest",files:[{path:"src/config/env.ts",content:e=>Ds(e.serviceName,e.envVars)},{path:"src/main.ts",content:e=>Is(e.serviceName,e.port)},{path:"src/app.module.ts",content:Dm},{path:"src/app.controller.ts",content:()=>jm()},{path:"src/app.context.ts",content:()=>Rs()},{path:"package.json",content:Om},{path:"tsconfig.json",content:()=>Mm()},{path:"Dockerfile",content:()=>Os()},{path:"biome.json",content:()=>Ms()},{path:"README.md",content:_m},{path:"src/events/events.module.ts",content:()=>Ns(),skip:e=>!e.hasEvents},{path:"src/events/events.service.ts",content:e=>Fs(e.serviceName),skip:e=>!e.hasEvents},{path:"src/events/handlers/.gitkeep",content:Lm,skip:e=>!e.hasEvents}]};var _s=[As,js],Ls=e=>{let t=Wm(e),r=_s.find(n=>n.name===t);if(!r)throw new Error(`Template '${e}' not found. Available: ${_s.map(n=>n.name).join(", ")}`);return r},Wm=e=>({"hono-micro":"hono-bun","nest-micro":"nest"})[e]||e;import{join as Vr}from"path";import{deriveEventNames as Jr}from"@crossdelta/cloudevents";var Ws={appliesTo:["src/domain","src/use-cases"],forbiddenPatterns:[{pattern:"console\\.(log|error|warn|info|debug)\\s*\\(",description:"console.* is forbidden in business logic (use structured logging)",code:"CONSOLE_IN_DOMAIN"},{pattern:"process\\.env\\b",description:"process.env is forbidden in business logic (use dependency injection)",code:"PROCESS_ENV_IN_DOMAIN"},{pattern:"\\bfetch\\s*\\(",description:"fetch() is forbidden in business logic (use adapters/services)",code:"FETCH_IN_DOMAIN"}]},Be={hono:{businessLogicDir:"use-cases",eventsDir:"events",filePattern:"{name}.use-case.ts",suffix:"use-case",handlerDelegatesToBusinessLogic:!0,pathGuards:{forbidDirs:["src/services"]},codingConstraints:Ws},nestjs:{businessLogicDir:"",eventsDir:"events",filePattern:"{name}.service.ts",suffix:"service",handlerDelegatesToBusinessLogic:!1,pathGuards:{forbidDirs:[]},codingConstraints:{appliesTo:["src/domain"],forbiddenPatterns:Ws.forbiddenPatterns}}},Hm=e=>e.replace(/-([a-z])/g,(t,r)=>r.toUpperCase()),Bm=(e,t)=>`../${e}/${t}`,he=(e,t)=>{let r=Be[e],n=r.filePattern.replace("{name}",t),o=n.replace(/\.ts$/,""),s=r.businessLogicDir?`src/${r.businessLogicDir}`:"src";return{filePath:s?`${s}/${n}`:`src/${n}`,dirPath:s,fileName:n,functionName:Hm(t),delegateFromHandler:r.handlerDelegatesToBusinessLogic,importFromEvents:r.businessLogicDir?Bm(r.businessLogicDir,o):`./${o}`}},zr=(e,t)=>{let n=`src/${Be[e].eventsDir}`,o=`${t}.handler.ts`;return{filePath:`${n}/${o}`,dirPath:n,fileName:o}},Ge=e=>`handle-${e.replace(/\./g,"-")}`,At=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("/")},Gm=(e,t)=>{let r=At(e);for(let n of t){let o=At(n);if(r.startsWith(`${o}/`)||r===o)return n}return null},Um=(e,t)=>{let r=At(e);return t.some(n=>{let o=At(n);return r.startsWith(`${o}/`)||r===o})},zm=(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},Vm=(e,t)=>{let r=[],n=Gm(e.path,t.pathGuards.forbidDirs);if(n&&r.push({code:"FORBIDDEN_DIR",message:`Path '${e.path}' is in forbidden directory '${n}'`,path:e.path}),Um(e.path,t.codingConstraints.appliesTo)){let o=zm(e.content,t.codingConstraints.forbiddenPatterns,e.path);r.push(...o)}return r},It=(e,t)=>{let r=Be[e],n=[];for(let o of t)n.push(...Vm(o,r));return{valid:n.length===0,violations:n}};var qm=(e,t)=>t.map(r=>({kind:"file:write",path:Vr(e,r.path),content:r.content})),Ym=(e,t,r)=>({kind:"infra:add",serviceName:e,port:t,framework:r.framework,runtime:r.runtime}),Zm=(e,t)=>({kind:"env:add",key:`${e}_PORT`,value:t.toString()}),Xm=(e,t)=>{let{typeName:r}=Jr(e),n=Ge(e),o=he("hono",n);return`import type { ${r} } from '${t}/contracts'
478
496
 
479
497
  /**
480
498
  * Handle ${e} event
@@ -486,7 +504,7 @@ export const ${o.functionName} = async (data: ${r}): Promise<void> => {
486
504
  // TODO: Implement business logic
487
505
  // Example: validate data, transform, call external services
488
506
  }
489
- `},cp=(e,t,r)=>{let{contractName:n,typeName:o}=dr(e),s=Te(e),i=oe(r,s);return i.delegateFromHandler?`import { handleEvent } from '@crossdelta/cloudevents'
507
+ `},Qm=(e,t,r)=>{let{contractName:n,typeName:o}=Jr(e),s=Ge(e),i=he(r,s);return i.delegateFromHandler?`import { handleEvent } from '@crossdelta/cloudevents'
490
508
  import { ${n}, type ${o} } from '${t}/contracts'
491
509
  import { ${i.functionName} } from '${i.importFromEvents}'
492
510
 
@@ -501,10 +519,10 @@ export default handleEvent(${n}, async (data: ${o}) => {
501
519
  console.log('\u{1F4E6} [${e}] Event received:', data)
502
520
  // TODO: Inject and call service
503
521
  })
504
- `},lp=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:oe(r,"stub").delegateFromHandler?t.events.map(o=>{let s=Te(o),i=oe(r,s);return{kind:"file:write",path:mr(e,i.filePath),content:ap(o,t.workspaceScope)}}):[],pp=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:t.events.map(n=>{let{kebab:o}=dr(n),s=pr(r,o);return{kind:"file:write",path:mr(e,s.filePath),content:cp(n,t.workspaceScope,r)}}),mp=e=>e==="hono"?"hono":e==="nest"?"nestjs":"hono",Wo=(e,t,r,n)=>{let o=mp(n.framework),s=op(e,t),i=lp(e,r,o),a=pp(e,r,o),c=sp(r.serviceName,r.port,n),l=ip(r.envVarName,r.port);return[...s,...i,...a,c,l]};import{existsSync as dp,readdirSync as gp,readFileSync as up}from"fs";import{join as Ho}from"path";var Go=4001,fp=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},Bo=e=>{try{let t=Ho(e,"infra","services");return dp(t)?gp(t).filter(n=>n.endsWith(".ts")).reduce((n,o)=>{let s=up(Ho(t,o),"utf-8"),i=fp(s);return i!==null&&n.add(i),n},new Set):new Set}catch(t){return console.warn("Failed to scan ports:",t),new Set}},gr=(e,t)=>e.has(t)?gr(e,t+1):t;var yp=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)`)},vp=(e,t,r)=>{if(t){if(t.startsWith("/"))return t;if(t.startsWith("."))return st(r,t);if(t.includes("/"))return st(r,t)}let n=w(r);return st(r,n.services,e)},Cp=e=>[...new Set(e.map(t=>hp(t).streamName))],kp=(e,t,r,n)=>{let s=C(t).packageName.split("/")[0],i=e.events??[],a=i.length>0||e.hasEvents||!1,c=i.length>0?Cp(i):e.streams??[];return{serviceName:e.name,packageName:`${s}/${e.name}`,servicePath:r.replace(`${t}/`,""),port:n,envVarName:_(e.name),hasEvents:a,streams:c,events:i,workspaceScope:s,envVars:e.envVars}},xp=(e,t)=>e.files.filter(r=>!r.skip||!r.skip(t)).map(r=>({path:r.path,content:r.content(t)})),Pp=(e,t,r)=>[...e.map(o=>({type:"file",path:st(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"}],wp=e=>[{command:`cd ${e} && bun dev`,description:"Start this service"},{command:"pf dev",description:"Start all services"}],Uo=e=>{yp(e.name);let t=e.workspaceRoot??h(),r=vp(e.name,e.path,t),n=e.port??gr(Bo(t),Go),o=kp(e,t,r,n),s=_o(e.type),i=xp(s,o),a=Wo(r,i,o,s),c=Pp(i,e.name,r),l=wp(r);return ir("service.generate",`Generated ${e.name} service (port ${n})`,{artifacts:c,changes:a,next:l,data:{serviceName:e.name,servicePath:r,port:n,vars:o}})},zo=e=>{let t=Uo(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}};import S from"chalk";import{execa as Sp}from"execa";import{createJiti as bp}from"jiti";var ur=async e=>{let{stdout:t}=await Sp("sh",["-c",e]);return t.trim()},Tp="pf-local-nats",Ep="2.10-alpine",$p=4222,Ip=8222,Ap=e=>({clientPort:e.clientPort??$p,monitoringPort:e.monitoringPort??Ip,containerName:e.containerName??Tp,version:e.version??Ep}),Rp=e=>["run","--rm","--detach",`--name=${e.containerName}`,`-p=${e.clientPort}:4222`,`-p=${e.monitoringPort}:8222`,`nats:${e.version}`,"--jetstream","--store_dir=/data","--http_port=8222"],Np=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),Fp=async()=>{try{return await ur("docker info"),!0}catch{return!1}},Mp=async e=>{try{return(await ur(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var Dp=async e=>{let t=Rp(e);try{return await ur(`docker ${t.join(" ")}`),{success:!0,value:Np(e)}}catch{return{success:!1}}},jp=e=>{console.log(S.green("\u2713 NATS started")),console.log(S.dim(` Client: ${e.clientUrl}`)),console.log(S.dim(` Monitoring: ${e.monitoringUrl}`)),console.log(S.dim(" Streams: ephemeral, auto-created by services")),console.log("")},Vo=async(e={})=>{let t=Ap(e);if(!await Fp())return console.log(S.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await Mp(t.containerName))return console.log(S.dim("\u2713 NATS already running")),!0;console.log(S.cyan("\u{1F680} Starting development infrastructure...")),console.log(S.dim(" NATS with JetStream (ephemeral)"));let r=await Dp(t);return r.success?(jp(r.value),!0):(console.error(S.red("\u2717 Failed to start NATS")),!1)},Op=e=>e.map(t=>({stream:t,subjects:[`${t.toLowerCase()}.*`],config:{storage:"memory",retention:"limits",maxAge:36e5}})),_p=e=>Array.from(new Set(Object.values(e).filter(t=>t!==null&&typeof t=="object"&&"channel"in t).map(t=>t.channel?.stream).filter(t=>!!t))),Lp=e=>{if(!(e instanceof Error))return!0;let t=e.message.toLowerCase();return!t.includes("insufficient storage")&&!t.includes("connection refused")},Wp=e=>{if(!(e instanceof Error))return"Unknown error";let t=e.message.toLowerCase();return t.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(`
505
- `):t.includes("connection refused")?"Cannot connect to NATS \u2014 is the container running?":e.message},fr=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:r}=C(e),o=await bp(e,{moduleCache:!1}).import(r,{default:!0}),s=_p(o);if(s.length===0){console.log(S.dim(" No streams found in contracts"));return}let i=Op(s);await t({streams:i}),console.log(S.dim(` Created ${s.length} ephemeral stream(s): ${s.join(", ")}`))}catch(t){if(!Lp(t))throw console.error(S.red(`
506
- \u2717 ${Wp(t)}
507
- `)),t;console.log(S.yellow(` \u26A0\uFE0F Stream creation failed: ${t instanceof Error?t.message:"Unknown error"}`)),console.log(S.dim(" Streams will be created when services connect"))}};function Ko(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
522
+ `},ed=(e,t,r)=>!t.hasEvents||t.events.length===0?[]:he(r,"stub").delegateFromHandler?t.events.map(o=>{let s=Ge(o),i=he(r,s);return{kind:"file:write",path:Vr(e,i.filePath),content:Xm(o,t.workspaceScope)}}):[],td=(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:Qm(n,t.workspaceScope,r)}}),rd=e=>e==="hono"?"hono":e==="nest"?"nestjs":"hono",Hs=(e,t,r,n)=>{let o=rd(n.framework),s=qm(e,t),i=ed(e,r,o),a=td(e,r,o),c=Ym(r.serviceName,r.port,n),l=Zm(r.envVarName,r.port);return[...s,...i,...a,c,l]};import{existsSync as nd,readdirSync as od,readFileSync as sd}from"fs";import{join as Bs}from"path";var Gs=4001,id=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},Us=e=>{try{let t=Bs(e,"infra","services");return nd(t)?od(t).filter(n=>n.endsWith(".ts")).reduce((n,o)=>{let s=sd(Bs(t,o),"utf-8"),i=id(s);return i!==null&&n.add(i),n},new Set):new Set}catch(t){return console.warn("Failed to scan ports:",t),new Set}},Kr=(e,t)=>e.has(t)?Kr(e,t+1):t;var cd=e=>{if(!e||e.trim().length===0)throw new Error("Service name cannot be empty");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(e))throw new Error(`Service name '${e}' must be kebab-case (lowercase, alphanumeric, hyphens only)`)},ld=(e,t,r)=>{if(t){if(t.startsWith("/"))return t;if(t.startsWith("."))return Rt(r,t);if(t.includes("/"))return Rt(r,t)}let n=E(r);return Rt(r,n.services,e)},pd=e=>[...new Set(e.map(t=>ad(t).streamName))],md=(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?pd(i):e.streams??[];return{serviceName:e.name,packageName:`${s}/${e.name}`,servicePath:r.replace(`${t}/`,""),port:n,envVarName:G(e.name),hasEvents:a,streams:c,events:i,workspaceScope:s,envVars:e.envVars}},dd=(e,t)=>e.files.filter(r=>!r.skip||!r.skip(t)).map(r=>({path:r.path,content:r.content(t)})),gd=(e,t,r)=>[...e.map(o=>({type:"file",path:Rt(r,o.path),description:`Service file: ${o.path}`})),{type:"config",path:`infra/services/${t}.ts`,description:"Infrastructure configuration"},{type:"env",path:".env.local",description:"Environment variables"}],ud=e=>[{command:`cd ${e} && bun dev`,description:"Start this service"},{command:"pf dev",description:"Start all services"}],zs=e=>{cd(e.name);let t=e.workspaceRoot??g(),r=ld(e.name,e.path,t),n=e.port??Kr(Us(t),Gs),o=md(e,t,r,n),s=Ls(e.type),i=dd(s,o),a=Hs(r,i,o,s),c=gd(i,e.name,r),l=ud(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}})},Vs=e=>{let t=zs(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 fd}from"execa";import{createJiti as hd}from"jiti";var qr=async e=>{let{stdout:t}=await fd("sh",["-c",e]);return t.trim()},yd="pf-local-nats",vd="2.10-alpine",kd=4222,Cd=8222,xd=e=>({clientPort:e.clientPort??kd,monitoringPort:e.monitoringPort??Cd,containerName:e.containerName??yd,version:e.version??vd}),wd=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"],Pd=e=>({containerName:e.containerName,clientUrl:`nats://localhost:${e.clientPort}`,monitoringUrl:`http://localhost:${e.monitoringPort}`}),Sd=async()=>{try{return await qr("docker info"),!0}catch{return!1}},bd=async e=>{try{return(await qr(`docker ps -q -f name=${e}`)).length>0}catch{return!1}};var Ed=async e=>{let t=wd(e);try{return await qr(`docker ${t.join(" ")}`),{success:!0,value:Pd(e)}}catch{return{success:!1}}},Td=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("")},Js=async(e={})=>{let t=xd(e);if(!await Sd())return console.log(A.yellow("\u26A0\uFE0F Docker not available - skipping NATS (services may fail)")),!1;if(await bd(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 Ed(t);return r.success?(Td(r.value),!0):(console.error(A.red("\u2717 Failed to start NATS")),!1)},$d=e=>e.map(t=>({stream:t,subjects:[`${t.toLowerCase()}.*`],config:{storage:"memory",retention:"limits",maxAge:36e5}})),Ad=e=>Array.from(new Set(Object.values(e).filter(t=>t!==null&&typeof t=="object"&&"channel"in t).map(t=>t.channel?.stream).filter(t=>!!t))),Id=e=>{if(!(e instanceof Error))return!0;let t=e.message.toLowerCase();return!t.includes("insufficient storage")&&!t.includes("connection refused")},Rd=e=>{if(!(e instanceof Error))return"Unknown error";let t=e.message.toLowerCase();return t.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
+ `):t.includes("connection refused")?"Cannot connect to NATS \u2014 is the container running?":e.message},Yr=async e=>{try{let{ensureJetStreams:t}=await import("@crossdelta/cloudevents"),{indexPath:r}=x(e),o=await hd(e,{moduleCache:!1}).import(r,{default:!0}),s=Ad(o);if(s.length===0){console.log(A.dim(" No streams found in contracts"));return}let i=$d(s);await t({streams:i}),console.log(A.dim(` Created ${s.length} ephemeral stream(s): ${s.join(", ")}`))}catch(t){if(!Id(t))throw console.error(A.red(`
524
+ \u2717 ${Rd(t)}
525
+ `)),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"))}};function Ks(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
508
526
  import { ports } from '@crossdelta/infrastructure'
509
527
 
510
528
  /**
@@ -525,7 +543,7 @@ const config: K8sServiceConfig = {
525
543
  }
526
544
 
527
545
  export default config
528
- `}function Jo(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
546
+ `}function qs(e,t){return`import type { K8sServiceConfig } from '@crossdelta/infrastructure'
529
547
  import { ports } from '@crossdelta/infrastructure'
530
548
 
531
549
  /**
@@ -546,62 +564,62 @@ const config: K8sServiceConfig = {
546
564
  }
547
565
 
548
566
  export default config
549
- `}import K from"chalk";import Gp from"terminal-link";var it="integrations-run";import{z as P}from"zod";var Hp=P.object({name:P.string(),description:P.string(),link:P.url().optional(),install:P.union([P.string(),P.array(P.string())]).transform(e=>Array.isArray(e)?e:[e]),installFlags:P.array(P.string()).optional(),run:P.array(P.string()).optional(),initial:P.boolean().optional(),interactive:P.boolean().optional()}),qo=P.array(Hp);var Yo=e=>{try{return qo.parse(e)}catch(t){throw new Error(t.issues.map(r=>` - Path ${r.path.join(". ")} : ${r.message}`).join(`
550
- `))}};var R=()=>{try{let e=Et("bin/integration.collection.json");return Yo(e)}catch(e){throw new Error(`Failed to load integrations!
567
+ `}v();import ne from"chalk";import Fd from"terminal-link";var Nt="integrations-run";import{z as T}from"zod";var Nd=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()}),Ys=T.array(Nd);var Zs=e=>{try{return Ys.parse(e)}catch(t){throw new Error(t.issues.map(r=>` - Path ${r.path.join(". ")} : ${r.message}`).join(`
568
+ `))}};var D=()=>{try{let e=Re("bin/integration.collection.json");return Zs(e)}catch(e){throw new Error(`Failed to load integrations!
551
569
  Check your integration.collection.json:
552
- ${e.message}`)}},se=()=>R().reduce((t,r)=>(r.initial&&t.push(r.name),t),[]),Bp=e=>!!e?.name&&!!e?.link&&!!e?.description,at=e=>{let t=R();if(!t?.length||!e?.length)return;let r=e.map(n=>t.find(o=>o.name===n)).filter(Bp);r.length&&(d.breakLine().log("\u{1F50C} Installed Integrations:"),r.forEach(({name:n,link:o,description:s})=>{let i=d.getStoredLogs(`${it}:${n}`);o&&d.log(`${Gp(K.cyan(n),o)} - ${s}`),i.length&&d.log(i.map(a=>` \u203A ${K.dim(a.message)}`).join(`
553
- `))}))},Up=e=>e.toUpperCase().replace(/-/g,"_"),Zo=(e,t)=>{let r=Up(e);d.breakLine().log(K.bold("Environment variables:")).log(K.dim(" Local (.env.local):")).log(K.cyan(` ${r}_PORT=${t}`)).breakLine().log(K.dim(" Production (auto-injected by infra):")).log(K.cyan(` PORT=${t}`))};import Xo from"chalk";var zp=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},Qo=async e=>{let{selectedIntegrations:t,cwd:r,packageManager:n=x(),task:o}=e;if(!t?.length||!o)return;let s=Vp(t,r,n,o);await Me(o,s)},Vp=(e,t,r,n)=>{let s=R()?.filter(a=>e.includes(a.name))?.flatMap(a=>a.install.map(c=>{let{name:l,version:p}=zp(c);return{title:Xo.cyanBright(`Adding ${c} (${a.name})`),fn:async()=>{Tt(`dependencies.${l}`,p,t)}}})),i={title:Xo.cyanBright("Installing packages..."),fn:async()=>{await M({cwd:t,packageManager:r,task:n})}};return[...s??[],i]};import Kp from"chalk";var es=async e=>{let{selectedIntegrations:t,cwd:r,task:n}=e;if(!t?.length||!n)return;let o=Jp(t,r,n,e.packageManager);await Me(n,o)},Jp=(e,t,r,n)=>R().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(i=>({title:Kp.cyanBright(`Running "${i}" for ${s.name}
554
- `),fn:()=>qp(s,i,t,r,n)}))),qp=async(e,t,r,n,o)=>{let s=`${it}:${e.name}`;try{if(e.interactive)return Xr(t,[],{cwd:r,context:s,task:n,manager:o});await fe(t,[],{cwd:r,task:n,context:s})}catch(i){d.error(`Failed to run command "${t}" for ${e.name}: ${i.message}`)}};import{readFileSync as HC,writeFileSync as GC}from"fs";import{join as UC}from"path";import{join as JC}from"path";import{ListrEnquirerPromptAdapter as Ee}from"@listr2/prompt-adapter-enquirer";var v=e=>({select:async t=>e.prompt(Ee).run({type:"select",message:t.message,choices:t.choices}),confirm:async t=>e.prompt(Ee).run({type:"confirm",message:t.message,initial:t.initial??!1}),toggle:async t=>e.prompt(Ee).run({type:"toggle",message:t.message,enabled:t.enabled??"Yes",disabled:t.disabled??"No",initial:t.initial??!1}),input:async t=>e.prompt(Ee).run({type:"input",message:t.message,initial:t.initial,validate:t.validate}),multiSelect:async t=>e.prompt(Ee).run({type:"MultiSelect",message:t.message,hint:t.hint,initial:t.initial,choices:t.choices})});import{readFileSync as ck}from"fs";import{join as pk}from"path";import kk from"chalk";import Pk from"cli-table3";function ct(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function ts(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?`--${ct(String(l))}`:`--${ct(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?`--${ct(l)}`:`--${ct(l)}=${String(p)}`}).filter(l=>l!==void 0),c=[...s,...i,...a].map(String);await e.parseAsync(c,{from:"user"})}import{basename as Cm}from"path";import J from"chalk";var ie={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{let r=v(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 hr,readdirSync as Zp,readFileSync as Xp,writeFileSync as Qp}from"fs";import{basename as em,join as yr}from"path";var tm=4001,rm=4e3;function nm(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 om(e,t){let r=t?tm:rm,n=new Set;if(!hr(e))return r;let o=Zp(e).filter(i=>i.endsWith(".ts"));for(let i of o){let a=yr(e,i);try{let c=Xp(a,"utf-8"),l=nm(c);for(let p of l)n.add(p)}catch{}}let s=r;for(;n.has(s);)s++;return s}function sm(e){return em(e)}var lt={title:"Creating infrastructure service config",task:async(e,t)=>{let r=sm(e.projectName),n=h(),o=yr(n,"infra","services");if(!hr(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=yr(o,`${r}.ts`);if(hr(s)){t.title=`Service config already exists: infra/services/${r}.ts`;return}let i=om(o,!0);e.assignedPort=i;let a=e.serviceType==="hono"?Ko(r,i):Jo(r,i);Qp(s,a),t.title=`Created infra/services/${r}.ts (port: ${i})`}};import{execSync as pt}from"child_process";import{existsSync as im}from"fs";import{join as am}from"path";var cm=()=>{try{return pt("git --version",{stdio:"ignore"}),!0}catch{return!1}},lm=e=>im(am(e,".git")),rs={title:"Initializing git repository",enabled:()=>cm(),skip:e=>lm(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{pt("git init",{cwd:e.cwd,stdio:"ignore"}),pt("git add -A",{cwd:e.cwd,stdio:"ignore"}),pt('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 ns from"chalk";var ae={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!Yt(),task:async(e,t)=>I(t,async r=>{await Zn(t),e.elapsedTime+=r(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},ce={enabled:e=>!Yt()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{let r=v(t);console.log(["",`${ns.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${ns.underline("https://bun.sh")}`,Xn(),Qn()].join(`
555
- `)),e.shouldInstallBun=await r.toggle({message:"Would you like to use Bun? (recommended)",initial:!0}),e.shouldInstallBun&&(e.packageManager="bun")}};import os from"chalk";var mt={title:"Install integrations",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>I(t,async r=>{let{selectedIntegrations:n,cwd:o,packageManager:s}=e;await Qo({selectedIntegrations:n,packageManager:s,cwd:o,task:t}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}},dt={title:"Select integrations",enabled:e=>e.selectedIntegrations.length===0,task:async(e,t)=>{let r=v(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:se().map((n,o)=>o),choices:e.availableIntegrations.map(({name:n,description:o})=>({name:n,message:[os.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=>os.bold(`\u2022 ${n}`))].join("\\n")}};var ss={title:"Install Nest CLI",task:async(e,t)=>I(t,async r=>{await Zr({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}};var gt={title:"Install dependencies",task:async(e,t)=>I(t,async r=>{await M({cwd:e.cwd,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()})};import pm from"chalk";var le={enabled:e=>!e.removeDir&&!Fe(e.cwd),task:async(e,t)=>{let r=v(t);if(e.removeDir=await r.toggle({message:pm.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}),!e.removeDir)throw new Error("Project creation was canceled by the user.")}},pe={enabled:e=>!!e.removeDir,task:async e=>Br(e.cwd)};var ut={title:"Run integration commands",enabled:e=>e.selectedIntegrations.length>0,task:async(e,t)=>I(t,async r=>{let{selectedIntegrations:n,cwd:o}=e;await es({selectedIntegrations:n,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1}};var mm=["services/my-hono-service","services/my-nest-service","my-platform"],me={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?mm.includes(e.projectName):!0,task:async(e,t)=>{let r=v(t);e.projectName=await r.input({initial:e.projectName,message:"Enter project name",validate:n=>n?!0:"Project name is required."}),e.cwd&&(e.cwd=$(e.projectName))}};import is from"chalk";var de={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=Rt(),e.packageManager){t.title=`Using ${is.bold(e.packageManager)} as package manager.`;return}let r=v(t);e.packageManager=await r.select({message:"Which package manager would you like to use?",choices:Yr().map(n=>({name:n,value:n}))}),t.title=`Using ${is.bold(e.packageManager)} as package manager.`}};import ft from"chalk";var as={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${ft.bold(e.githubOwner)}`;return}let r=v(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: ${ft.bold(e.githubOwner)}`}},cs={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=v(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 ls={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${ft.bold(e.pulumiStackBase)}`;return}let r=e.githubOwner||"myorg",n=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${r}/${n}`,s=v(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: ${ft.bold(e.pulumiStackBase)}`}};import{mkdirSync as dm,writeFileSync as gm}from"fs";import{dirname as um}from"path";var fm=e=>e==="hono"?"hono":"nestjs",hm=e=>{let t=um(e.path);dm(t,{recursive:!0}),gm(e.path,e.content,"utf-8")},ym=(e,t)=>{let r=e.map(o=>{let s=o.path.match(/services\/[^/]+\/(.+)$/);return{path:s?s[1]:o.path,content:o.content}}),n=ot(t,r);if(!n.valid){let o=n.violations.map(s=>` - ${s.code}: ${s.message} (${s.path})`).join(`
570
+ ${e.message}`)}},ye=()=>D().reduce((t,r)=>(r.initial&&t.push(r.name),t),[]),Od=e=>!!e?.name&&!!e?.link&&!!e?.description,Ft=e=>{let t=D();if(!t?.length||!e?.length)return;let r=e.map(n=>t.find(o=>o.name===n)).filter(Od);r.length&&(d.breakLine().log("\u{1F50C} Installed Integrations:"),r.forEach(({name:n,link:o,description:s})=>{let i=d.getStoredLogs(`${Nt}:${n}`);o&&d.log(`${Fd(ne.cyan(n),o)} - ${s}`),i.length&&d.log(i.map(a=>` \u203A ${ne.dim(a.message)}`).join(`
571
+ `))}))},Md=e=>e.toUpperCase().replace(/-/g,"_"),Xs=(e,t)=>{let r=Md(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 Qs from"chalk";var Dd=e=>{let t=e.match(/^(@?[^@]+)@(.+)$/);return t?{name:t[1],version:t[2]}:{name:e,version:"latest"}},ei=async e=>{let{selectedIntegrations:t,cwd:r,packageManager:n=b(),task:o}=e;if(!t?.length||!o)return;let s=jd(t,r,n,o);await rt(o,s)},jd=(e,t,r,n)=>{let s=D()?.filter(a=>e.includes(a.name))?.flatMap(a=>a.install.map(c=>{let{name:l,version:p}=Dd(c);return{title:Qs.cyanBright(`Adding ${c} (${a.name})`),fn:async()=>{it(`dependencies.${l}`,p,t)}}})),i={title:Qs.cyanBright("Installing packages..."),fn:async()=>{await L({cwd:t,packageManager:r,task:n})}};return[...s??[],i]};v();import _d from"chalk";var ti=async e=>{let{selectedIntegrations:t,cwd:r,task:n}=e;if(!t?.length||!n)return;let o=Ld(t,r,n,e.packageManager);await rt(n,o)},Ld=(e,t,r,n)=>D().filter(s=>e.includes(s.name)&&s.run?.length).flatMap(s=>(s.run||[]).map(i=>({title:_d.cyanBright(`Running "${i}" for ${s.name}
572
+ `),fn:()=>Wd(s,i,t,r,n)}))),Wd=async(e,t,r,n,o)=>{let s=`${Nt}:${e.name}`;try{if(e.interactive)return eo(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 zw,writeFileSync as Vw}from"fs";import{join as Kw}from"path";v();import{join as Xw}from"path";import{ListrEnquirerPromptAdapter as Ue}from"@listr2/prompt-adapter-enquirer";var C=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 dP}from"fs";import{join as uP}from"path";import SP from"chalk";import EP from"cli-table3";v();function Ot(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}async function ri(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?`--${Ot(String(l))}`:`--${Ot(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?`--${Ot(l)}`:`--${Ot(l)}=${String(p)}`}).filter(l=>l!==void 0),c=[...s,...i,...a].map(String);await e.parseAsync(c,{from:"user"})}import{basename as pg}from"path";import oe from"chalk";f();var ve={title:"Confirm creation",enabled:e=>!e.userConfirmed,task:async(e,t)=>{let r=C(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 Zr,readdirSync as Bd,readFileSync as Gd,writeFileSync as Ud}from"fs";import{basename as zd,join as Xr}from"path";var Vd=4001,Jd=4e3;function Kd(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 qd(e,t){let r=t?Vd:Jd,n=new Set;if(!Zr(e))return r;let o=Bd(e).filter(i=>i.endsWith(".ts"));for(let i of o){let a=Xr(e,i);try{let c=Gd(a,"utf-8"),l=Kd(c);for(let p of l)n.add(p)}catch{}}let s=r;for(;n.has(s);)s++;return s}function Yd(e){return zd(e)}var Mt={title:"Creating infrastructure service config",task:async(e,t)=>{let r=Yd(e.projectName),n=g(),o=Xr(n,"infra","services");if(!Zr(o)){t.title="Skipping infra config (no infra/services directory found)";return}let s=Xr(o,`${r}.ts`);if(Zr(s)){t.title=`Service config already exists: infra/services/${r}.ts`;return}let i=qd(o,!0);e.assignedPort=i;let a=e.serviceType==="hono"?Ks(r,i):qs(r,i);Ud(s,a),t.title=`Created infra/services/${r}.ts (port: ${i})`}};import{execSync as Dt}from"child_process";import{existsSync as Zd}from"fs";import{join as Xd}from"path";var Qd=()=>{try{return Dt("git --version",{stdio:"ignore"}),!0}catch{return!1}},eg=e=>Zd(Xd(e,".git")),ni={title:"Initializing git repository",enabled:()=>Qd(),skip:e=>eg(e.cwd)?"Already a git repository":!1,task:async(e,t)=>{try{Dt("git init",{cwd:e.cwd,stdio:"ignore"}),Dt("git add -A",{cwd:e.cwd,stdio:"ignore"}),Dt('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 oi from"chalk";v();var ke={title:"Installing Bun",enabled:e=>!!e.shouldInstallBun&&!Rr(),task:async(e,t)=>M(t,async r=>{await Qo(t),e.elapsedTime+=r(),t.title=`Bun installed successfully. (${e.elapsedTime}s)`})},Ce={enabled:e=>!Rr()&&!e.shouldInstallBun&&!e.packageManager,task:async(e,t)=>{let r=C(t);console.log(["",`${oi.magenta.bold("Bun")} is a fast JavaScript runtime, package manager, bundler, and test runner: ${oi.underline("https://bun.sh")}`,es(),ts()].join(`
573
+ `)),e.shouldInstallBun=await r.toggle({message:"Would you like to use Bun? (recommended)",initial:!0}),e.shouldInstallBun&&(e.packageManager="bun")}};import si from"chalk";v();var jt={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 ei({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=C(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:[si.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=>si.bold(`\u2022 ${n}`))].join("\\n")}};v();var ii={title:"Install Nest CLI",task:async(e,t)=>M(t,async r=>{await Qn({packages:["@nestjs/cli"],task:t,cwd:e.cwd}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1e3}};v();var Lt={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 tg from"chalk";v();var xe={enabled:e=>!e.removeDir&&!et(e.cwd),task:async(e,t)=>{let r=C(t);if(e.removeDir=await r.toggle({message:tg.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=>_n(e.cwd)};v();var Wt={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 ti({selectedIntegrations:n,cwd:o,task:t,packageManager:e.packageManager}),e.elapsedTime+=r()}),rendererOptions:{outputBar:1}};v();var rg=["services/my-hono-service","services/my-nest-service","my-platform"],Pe={enabled:e=>e.skipInputPrompts||e.userConfirmed?!1:e.projectName?rg.includes(e.projectName):!0,task:async(e,t)=>{let r=C(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 ai from"chalk";var Se={title:"Select Package manager",task:async(e,t)=>{if(e.packageManager??=dr(),e.packageManager){t.title=`Using ${ai.bold(e.packageManager)} as package manager.`;return}let r=C(t);e.packageManager=await r.select({message:"Which package manager would you like to use?",choices:Xn().map(n=>({name:n,value:n}))}),t.title=`Using ${ai.bold(e.packageManager)} as package manager.`}};import Ht from"chalk";var ci={title:"GitHub repository owner",task:async(e,t)=>{if(e.githubOwner){t.title=`GitHub owner: ${Ht.bold(e.githubOwner)}`;return}let r=C(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: ${Ht.bold(e.githubOwner)}`}},li={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=C(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 pi={title:"Pulumi stack name",task:async(e,t)=>{if(e.pulumiStackBase){t.title=`Pulumi stack: ${Ht.bold(e.pulumiStackBase)}`;return}let r=e.githubOwner||"myorg",n=e.projectName?.replace(/[^a-zA-Z0-9-]/g,"-")||"myproject",o=`${r}/${n}`,s=C(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: ${Ht.bold(e.pulumiStackBase)}`}};v();import{mkdirSync as ng,writeFileSync as og}from"fs";import{dirname as sg}from"path";v();var ig=e=>e==="hono"?"hono":"nestjs",ag=e=>{let t=sg(e.path);ng(t,{recursive:!0}),og(e.path,e.content,"utf-8")},cg=(e,t)=>{let r=e.map(o=>{let s=o.path.match(/services\/[^/]+\/(.+)$/);return{path:s?s[1]:o.path,content:o.content}}),n=It(t,r);if(!n.valid){let o=n.violations.map(s=>` - ${s.code}: ${s.message} (${s.path})`).join(`
556
574
  `);throw new Error(`Policy violation(s) detected:
557
- ${o}`)}e.forEach(hm)},vm=async(e,t,r)=>{let{projectName:n,serviceType:o,hasEvents:s,streams:i}=e,a=n.split("/").pop()||n,l=zo({type:o==="hono"?"hono-micro":"nest",name:a,path:n,hasEvents:s,streams:i}),p=l.effects.filter(f=>f.kind==="file:write"),m=fm(o);ym(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)=>I(t,async r=>{await vm(e,t,r)})};var km=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${w().services}/${t}`},xm=async(e,t)=>{let{valid:r,config:n,error:o}=ee();if(!r||!n){E(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=km(e.name),i=t.packageManager||x(),a=await Ue(t.description);if(ze(s,n,a),await Ve({servicePath:s,description:a,serviceType:"hono",packageManager:i},n))d.breakLine().success("Service generated successfully!").breakLine().log(J.dim("Next steps:")).log(J.dim(` ${J.cyan("pf dev")} - Start all services`)).log(J.dim(` ${J.cyan(`cd ${s} && bun dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},ps=L({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:xm,buildContext:async(e,t)=>{let r=(e.name??"my-hono-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${w().services}/${r}`);let n=$(r),o=t.packageManager??(t.yes&&x()),s=R(),i=t.yes?se():[],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:[me,le,ce,de,dt,ie],actions:[pe,ae,ht,lt,mt,ut],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{d.breakLine().log(J.bold.green("Hono Microservice created successfully!")),at(r),Zo(Cm(e),n??8080);let o=t??x();d.breakLine().log(`To start the project, run:
558
- ${J.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});import q from"chalk";var Pm=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${w().services}/${t}`},wm=async(e,t)=>{let{valid:r,config:n,error:o}=ee();if(!r||!n){E(new Error(o||"AI configuration is invalid"),{exit:!1});return}let s=Pm(e.name),i=t.packageManager||x(),a=await Ue(t.description);if(ze(s,n,a),await Ve({servicePath:s,description:a,serviceType:"nest",packageManager:i},n))d.breakLine().success("Service generated successfully!").breakLine().log(q.dim("Next steps:")).log(q.dim(` ${q.cyan("pf dev")} - Start all services`)).log(q.dim(` ${q.cyan(`cd ${s} && bun run start:dev`)} - Start this service only`)).breakLine();else throw new Error("Service generation failed")},ms=L({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:wm,buildContext:async(e,t)=>{let r=(e.name??"my-nest-service").trim();!r.includes("/")&&!r.startsWith(".")&&(r=`${w().services}/${r}`);let n=$(r),o=t.packageManager??(t.yes&&x()),s=t.packageManager==="bun",i=R(),a=t.yes?se():[],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:[me,le,ce,de,dt,ie],actions:[pe,ae,ht,lt,gt,ss,mt,ut],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{d.breakLine().log(q.bold.green("NestJS Microservice created successfully!")),at(r),d.breakLine().log(`To start the project, run:
559
- ${q.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});import N from"chalk";import{spawnSync as Tm}from"child_process";import{chmodSync as Em,existsSync as kr,mkdirSync as $m,readFileSync as Im,writeFileSync as xr}from"fs";import{dirname as Am,join as Pr}from"path";import{existsSync as Sm}from"fs";import{join as yt}from"path";var bm=()=>typeof import.meta?.url=="string"?D(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),Cr=()=>{let e=bm(),t=U();return ne([yt(e,"templates","workspace"),yt(e,"..","..","..","..","templates","workspace"),yt(t,"bin","templates","workspace")],"Workspace templates directory not found.")},ds=()=>{let e=Cr(),t=yt(e,"packages","contracts");if(!Sm(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},vt=(e,t)=>ar(e,t);var gs=e=>{e.endsWith(".sh")&&Em(e,493)},Rm=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"pnpm-workspace.yaml.hbs",output:"pnpm-workspace.yaml",forPackageManager:"pnpm"},{template:"biome.json.hbs",output:"biome.json"},{template:"turbo.json.hbs",output:"turbo.json"},{template:"bunfig.toml.hbs",output:"bunfig.toml"},{template:"gitignore.hbs",output:".gitignore"},{template:"editorconfig.hbs",output:".editorconfig"},{template:"npmrc.hbs",output:".npmrc"},{template:".vscode/settings.json",output:".vscode/settings.json",isStatic:!0},{template:".vscode/extensions.json",output:".vscode/extensions.json",isStatic:!0},{template:"infra/package.json.hbs",output:"infra/package.json"},{template:"infra/index.ts.hbs",output:"infra/index.ts"},{template:"infra/tsconfig.json.hbs",output:"infra/tsconfig.json"},{template:"infra/Pulumi.yaml.hbs",output:"infra/Pulumi.yaml"},{template:"infra/Pulumi.dev.yaml.hbs",output:"infra/Pulumi.dev.yaml"},{template:"apps/.gitkeep",output:"apps/.gitkeep",isStatic:!0},{template:"services/.gitkeep",output:"services/.gitkeep",isStatic:!0},{template:"packages/.gitkeep",output:"packages/.gitkeep",isStatic:!0},{template:"docs/.gitkeep",output:"docs/.gitkeep",isStatic:!0},{template:"infra/services/.gitkeep",output:"infra/services/.gitkeep",isStatic:!0},{template:".github/README.md",output:".github/README.md",isStatic:!0,isGitHubCI:!0},{template:".github/dependabot.yml",output:".github/dependabot.yml",isStatic:!0,isGitHubCI:!0},{template:".github/workflows/lint-and-tests.yml.hbs",output:".github/workflows/lint-and-tests.yml",isGitHubCI:!0},{template:".github/workflows/build-and-deploy.yml.hbs",output:".github/workflows/build-and-deploy.yml",isGitHubCI:!0},{template:".github/workflows/publish-packages.yml",output:".github/workflows/publish-packages.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/setup-bun-install/action.yml.hbs",output:".github/actions/setup-bun-install/action.yml",isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/action.yml",output:".github/actions/check-image-tag-exists/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-image-tag-exists/index.js",output:".github/actions/check-image-tag-exists/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-path-changes/action.yml",output:".github/actions/check-path-changes/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/check-path-changes/index.js",output:".github/actions/check-path-changes/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/detect-skipped-services/action.yml",output:".github/actions/detect-skipped-services/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/action.yml",output:".github/actions/generate-scope-matrix/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/generate-scope-matrix/index.js",output:".github/actions/generate-scope-matrix/index.js",isStatic:!0,isGitHubCI:!0},{template:".github/actions/prepare-build-context/action.yml",output:".github/actions/prepare-build-context/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/resolve-scope-tags/action.yml",output:".github/actions/resolve-scope-tags/action.yml",isStatic:!0,isGitHubCI:!0},{template:".github/actions/resolve-scope-tags/index.js",output:".github/actions/resolve-scope-tags/index.js",isStatic:!0,isGitHubCI:!0}],us={title:"Creating workspace structure",task:async(e,t)=>{if(kr(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=Cr(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let m=Tm(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=Rm.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of a){let l=Pr(e.cwd,c.output),p=Am(l);if(kr(p)||$m(p,{recursive:!0}),c.isStatic){let m=Pr(r,c.template);kr(m)?xr(l,Im(m)):xr(l,""),gs(l)}else{let m=Pr(r,c.template),f=vt(m,i);xr(l,f),gs(l)}}t.title="Workspace structure created"}};import{existsSync as hs,mkdirSync as fs,readFileSync as Nm,writeFileSync as Fm}from"fs";import{join as Ct}from"path";import Mm from"chalk";var Dm=()=>{let e=Ct(process.cwd(),"package.json");if(!hs(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse(Nm(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},jm=()=>{let e=Dm(),{relativePath:t,packagePath:r}=C();if(hs(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=ds(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};fs(r,{recursive:!0}),fs(Ct(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"README.md.hbs",output:"README.md"},{template:"src/index.ts",output:"src/index.ts"},{template:"src/stream-policies.ts.hbs",output:"src/stream-policies.ts"},{template:"src/events/index.ts",output:"src/events/index.ts"}];for(let i of s){let a=Ct(n,i.template),c=Ct(r,i.output),l=vt(a,o);Fm(c,l,"utf-8")}},ys={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),jm(),t.title="Contracts package initialized"}catch(n){throw t.title=Mm.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};import Om from"chalk";var vs={title:"Registering shell completion",task:async(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),await Se(),t.title="Shell completion registered"}catch{t.title=Om.dim("Shell completion skipped")}finally{process.chdir(r)}}};var Cs=L({name:"workspace",description:"Create a new workspace with infrastructure setup",arguments:[["[name]","Name or path of the workspace"]],options:[["-P, --package-manager <manager>","Specify the package manager (e.g., npm, yarn, pnpm, bun)"],["-y, --yes","Skip all prompts and use default values"],["-o, --github-owner <owner>","GitHub organization or username"],["-s, --pulumi-stack <name>","Pulumi stack base name (org/project)"],["--no-github","Skip GitHub CI/CD workflows"],["--remove-dir","Remove existing directory before creating (internal use)"]],exampleUsage:"pf new workspace my-platform -o my-org",buildContext:(e,t)=>{let r=(e.name??"my-platform").trim(),n=$(r),o=!!t.yes,s=t.packageManager??(o?x():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=h();if(!await v(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=N.yellow("Warning: Creating nested workspace")}catch(r){if(Y(r)&&r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},me,le,as,cs,ls,ce,de,ie],actions:[pe,ae,us,ys,gt,rs,vs],onComplete:({projectName:e,includeGitHubCI:t})=>{d.breakLine().log(N.bold.green("Workspace created successfully!")),d.breakLine().log(N.bold("Next steps:")).log(` 1. ${N.cyan(`cd ${e}`)}`).log(` 2. ${N.cyan("exec $SHELL")} ${N.dim("(enable tab completion)")}`),t&&d.breakLine().log(N.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${N.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${N.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${N.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),d.breakLine().log(N.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 $e=[{name:"Hono Microservice",value:"hono-micro",command:ps,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:ms,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:Cs,supportsAi:!1}],ks=()=>{let e=L({name:"new",description:"Create a new project",arguments:[["[type]","Type of the project (e.g., nest-micro, hono-micro, workspace)"]],exampleUsage:"platform new hono-micro test-service",buildContext:t=>({projectType:t.type??"",useAi:!1,aiDescription:"",elapsedTime:0,cwd:process.cwd()}),prompts:[{enabled:t=>!t.projectType,task:async(t,r)=>{let o=await v(r).select({message:"Select Project type",choices:$e});t.projectType=$e.find(s=>s.name===o)?.value||"",r.title=`Using ${H.bold(o)}`}},{enabled:t=>t.projectType!=="workspace"&&t.projectType!=="",task:async(t,r)=>{try{h(),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(`
560
- `);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=h();if(!await v(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=H.yellow("Warning: Creating nested workspace")}catch(n){if(Y(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 v(r).input({message:s,initial:o});t.servicePath=a.trim(),r.title=`Path: ${H.dim(a)}`}},{enabled:t=>!!$e.find(n=>n.value===t.projectType)?.supportsAi&&ee().valid,task:async(t,r)=>{let o=await v(r).toggle({message:"Use AI to generate service code?",initial:!1});t.useAi=o,r.title=o?H.cyan("\u{1F916} AI-powered generation"):"Standard scaffolding"}},{enabled:t=>t.useAi,task:async(t,r)=>{let o=await v(r).input({message:"Describe what this service should do:"});t.aiDescription=o,r.title=`Description: ${H.dim(o.slice(0,50))}${o.length>50?"...":""}`}},{enabled:t=>{if(!t.servicePath)return!1;let r=$(t.servicePath);return!Fe(r)},task:async(t,r)=>{if(!await v(r).toggle({message:H.bold("\u26A0\uFE0F Overwrite existing directory?"),initial:!1}))throw new Error("Project creation was canceled by the user.");t.shouldRemoveDir=!0,r.title=H.yellow("Will overwrite existing directory")}},{title:"Confirm creation",enabled:t=>t.projectType!=="workspace",task:async(t,r)=>{if(!await v(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=>{$e.find(s=>s.value===t.projectType)||e.error(H.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 ts(r,t,n,o)}});for(let t of $e)e.addCommand(t.command);return e};import{Command as Gm}from"commander";import{existsSync as xt,readdirSync as xs,unlinkSync as _m}from"fs";import{join as kt}from"path";import Lm from"chokidar";var Wm=e=>{let t=kt(e,"infra","services");if(!xt(t))return[];let r=xs(t).filter(a=>a.endsWith(".ts")&&a!=="index.ts").map(a=>a.replace(".ts","")),n=w(e),o=a=>{let c=kt(e,a);return xt(c)?xs(c).filter(l=>xt(kt(c,l,"package.json"))):[]},s=[...o(n.services),...o(n.apps)],i=r.filter(a=>!s.includes(a));for(let a of i)_m(kt(t,`${a}.ts`));return i},wr=async e=>{let t=Wm(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),await M({cwd:e,quiet:!0}),await he("generate-env",{cwd:e})},Sr=async e=>{await Vo()&&await fr(e)},Ps=e=>{let{eventsPath:t}=C(e);if(!xt(t))return async()=>{};let r=Re(async()=>{console.log(`
561
- \u{1F4E6} Contracts changed, updating streams...`),await fr(e)},500),n=Lm.watch(`${t}/**/*.ts`,{ignoreInitial:!0,ignored:["**/index.ts","**/*.test.ts","**/*.spec.ts"]});return n.on("add",r).on("change",r),async()=>{await n.close()}};import ws from"chalk";var br=e=>new Promise(t=>setTimeout(t,e)),Ss=e=>process.stdout.write(`${e}
562
- `),Hm=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},bs=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),Tr=async(e,t)=>{let r=zr(".env.local",t);r.length>0&&(await Jr(r),await br(50));let{dev:n}=De(t),o=n.filter.flatMap(s=>["--filter",s]);Ss(ws.cyan("\u{1F525} Starting services...")),Ss(ws.dim(` Command: turbo run ${St} --continue${o.length?` ${o.join(" ")}`:""}`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=Kr("turbo",["run",St,"--continue","--no-daemon",...o],{cwd:t,envFile:".env.local",onExit:s=>{e.isRestarting||e.isShuttingDown||s===1&&process.exit(T.SUCCESS)}})},Pt=async e=>{let t=e.turboProcess?.pid;if(t){e.isShuttingDown=!0;try{try{process.kill(-t,"SIGTERM")}catch{e.turboProcess?.kill("SIGTERM")}await br(200);try{process.kill(-t,"SIGKILL")}catch{}await br(30)}catch{}e.turboProcess=null,Hm()}};var Ts=new Gm("dev").description("Start development mode with auto-reload").action(async()=>{let e;try{e=h()}catch(a){E(a);return}let t=bs(),r=async()=>{await wr(e),await Sr(e),await Tr(t,e)},o=Re(async()=>{if(!(t.isRestarting||t.isShuttingDown)){t.isRestarting=!0,console.log(`
575
+ ${o}`)}e.forEach(ag)},lg=async(e,t,r)=>{let{projectName:n,serviceType:o,hasEvents:s,streams:i}=e,a=n.split("/").pop()||n,l=Vs({type:o==="hono"?"hono-micro":"nest",name:a,path:n,hasEvents:s,streams:i}),p=l.effects.filter(y=>y.kind==="file:write"),m=ig(o);cg(p,m),e.assignedPort=l.port,e.elapsedTime+=r(),t.title=`Generated ${a} (port ${l.port}, ${e.elapsedTime}s)`},Bt={title:"Generating service",task:async(e,t)=>M(t,async r=>{await lg(e,t,r)})};var mg=e=>{let t=(e||"my-hono-service").trim();return t.includes("/")||t.startsWith(".")?t:`${E().services}/${t}`},dg=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=mg(e.name),i=t.packageManager||b(),a=await ht(t.description);if(yt(s,n,a),await vt({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")},mi=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:dg,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,Ce,Se,_t,ve],actions:[we,ke,Bt,Mt,jt,Wt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r,assignedPort:n})=>{d.breakLine().log(oe.bold.green("Hono Microservice created successfully!")),Ft(r),Xs(pg(e),n??8080);let o=t??b();d.breakLine().log(`To start the project, run:
576
+ ${oe.bold(`cd ${e} && ${o} run dev`)}`).breakLine().log("Happy shipping with Hono! \u26A1\uFE0F").breakLine()}});import se from"chalk";f();v();var gg=e=>{let t=(e||"my-nest-service").trim();return t.includes("/")||t.startsWith(".")?t:`${E().services}/${t}`},ug=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=gg(e.name),i=t.packageManager||b(),a=await ht(t.description);if(yt(s,n,a),await vt({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")},di=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:ug,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,Ce,Se,_t,ve],actions:[we,ke,Bt,Mt,Lt,ii,jt,Wt],onComplete:({projectName:e,packageManager:t,selectedIntegrations:r})=>{d.breakLine().log(se.bold.green("NestJS Microservice created successfully!")),Ft(r),d.breakLine().log(`To start the project, run:
577
+ ${se.bold(`cd ${e} && ${t} run start:dev`)}`).breakLine().log("Happy coding! \u{1F389}").breakLine()}});import j from"chalk";v();import{spawnSync as yg}from"child_process";import{chmodSync as vg,existsSync as tn,mkdirSync as kg,readFileSync as Cg,writeFileSync as rn}from"fs";import{dirname as xg,join as nn}from"path";import{existsSync as fg}from"fs";import{join as Gt}from"path";var hg=()=>typeof import.meta?.url=="string"?W(import.meta.url):typeof __dirname=="string"?__dirname:process.cwd(),en=()=>{let e=hg(),t=ee();return fe([Gt(e,"templates","workspace"),Gt(e,"..","..","..","..","templates","workspace"),Gt(t,"bin","templates","workspace")],"Workspace templates directory not found.")},gi=()=>{let e=en(),t=Gt(e,"packages","contracts");if(!fg(t))throw new Error(`Contracts templates directory not found at: ${t}`);return t},Ut=(e,t)=>Br(e,t);var ui=e=>{e.endsWith(".sh")&&vg(e,493)},wg=[{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:".github/copilot-instructions.md",output:".github/copilot-instructions.md",isStatic:!0},{template:".github/instructions/code-style.instructions.md",output:".github/instructions/code-style.instructions.md",isStatic:!0},{template:".github/instructions/testing.instructions.md",output:".github/instructions/testing.instructions.md",isStatic:!0},{template:".github/instructions/cloudevents.instructions.md",output:".github/instructions/cloudevents.instructions.md",isStatic:!0}],fi={title:"Creating workspace structure",task:async(e,t)=>{if(tn(e.cwd)){t.title="Workspace directory already exists, skipping...";return}let r=en(),n=e.includeGitHubCI??!0,o=e.packageManager||"bun",s=c=>{try{let m=yg(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=wg.filter(c=>!(c.isGitHubCI&&!n||c.forPackageManager&&c.forPackageManager!==o));for(let c of a){let l=nn(e.cwd,c.output),p=xg(l);if(tn(p)||kg(p,{recursive:!0}),c.isStatic){let m=nn(r,c.template);tn(m)?rn(l,Cg(m)):rn(l,""),ui(l)}else{let m=nn(r,c.template),y=Ut(m,i);rn(l,y),ui(l)}}t.title="Workspace structure created"}};f();import{existsSync as yi,mkdirSync as hi,readFileSync as Pg,writeFileSync as Sg}from"fs";import{join as zt}from"path";import bg from"chalk";var Eg=()=>{let e=zt(process.cwd(),"package.json");if(!yi(e))throw new Error("Root package.json not found. Please run this command from the workspace root.");let r=JSON.parse(Pg(e,"utf-8")).name;if(!r)throw new Error('package.json must have a "name" field');return r.startsWith("@")?r:`@${r}`},Tg=()=>{let e=Eg(),{relativePath:t,packagePath:r}=x();if(yi(r))throw new Error(`${t} already exists. Remove it first if you want to regenerate.`);let n=gi(),o={scope:e,workspaceName:e.replace("@","").replace("/","-")};hi(r,{recursive:!0}),hi(zt(r,"src","events"),{recursive:!0});let s=[{template:"package.json.hbs",output:"package.json"},{template:"tsconfig.json.hbs",output:"tsconfig.json"},{template:"README.md.hbs",output:"README.md"},{template:"src/index.ts",output:"src/index.ts"},{template:"src/stream-policies.ts.hbs",output:"src/stream-policies.ts"},{template:"src/events/index.ts",output:"src/events/index.ts"}];for(let i of s){let a=zt(n,i.template),c=zt(r,i.output),l=Ut(a,o);Sg(c,l,"utf-8")}},vi={title:"Initializing contracts package",task:(e,t)=>{let r=process.cwd();try{process.chdir(e.cwd),Tg(),t.title="Contracts package initialized"}catch(n){throw t.title=bg.red(`Contracts package failed: ${n.message}`),n}finally{process.chdir(r)}}};import $g from"chalk";var ki={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 Ci=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 C(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=j.yellow("Warning: Creating nested workspace")}catch(r){if(X(r)&&r.message?.includes("cancelled"))throw r;t.title="No existing workspace detected"}}},Pe,xe,ci,li,pi,Ce,Se,ve],actions:[we,ke,fi,vi,Lt,ni,ki],onComplete:({projectName:e,includeGitHubCI:t})=>{d.breakLine().log(j.bold.green("Workspace created successfully!")),d.breakLine().log(j.bold("Next steps:")).log(` 1. ${j.cyan(`cd ${e}`)}`).log(` 2. ${j.cyan("exec $SHELL")} ${j.dim("(enable tab completion)")}`),t&&d.breakLine().log(j.bold("GitHub Setup:")).log(" Configure these secrets in your GitHub repository:").log(` \u2022 ${j.yellow("PULUMI_ACCESS_TOKEN")} - Pulumi Cloud access token`).log(` \u2022 ${j.yellow("DIGITALOCEAN_TOKEN")} - DigitalOcean API token`).log(` \u2022 ${j.yellow("NPM_TOKEN")} - (optional) NPM token for private packages`),d.breakLine().log(j.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:mi,supportsAi:!0},{name:"Nest Microservice",value:"nest-micro",command:di,supportsAi:!0},{name:"Workspace (Infrastructure)",value:"workspace",command:Ci,supportsAi:!1}],xi=()=>{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 C(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(`
578
+ `);throw new Error(n)}}},{enabled:t=>t.projectType==="workspace",task:async(t,r)=>{try{let n=g();if(!await C(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 C(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 C(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 C(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 C(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 C(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 ri(r,t,n,o)}});for(let t of ze)e.addCommand(t.command);return e};import{Command as jg}from"commander";v();import{createHash as Ag}from"crypto";import{existsSync as ie,readdirSync as wi,readFileSync as Pi,unlinkSync as Ig,writeFileSync as Rg}from"fs";import{join as Y}from"path";import Ng from"chokidar";f();v();var Fg=e=>{let t=Y(e,"infra","services");if(!ie(t))return[];let r=wi(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)?wi(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)Ig(Y(t,`${a}.ts`));return i},Si=".install-hash",bi=e=>{let t=Pi(e);return Ag("sha256").update(t).digest("hex")},Og=e=>{let t=Y(e,"node_modules",Si),r=Y(e,"bun.lock");return!ie(r)||!ie(t)?!0:Pi(t,"utf-8")!==bi(r)},Mg=e=>{let t=Y(e,"bun.lock"),r=Y(e,"node_modules",Si);ie(t)&&Rg(r,bi(t),"utf-8")},on=async e=>{let t=Fg(e);t.length>0&&console.log(`\u{1F9F9} Cleaned ${t.length} orphaned infra config(s): ${t.join(", ")}`),Og(e)&&(await L({cwd:e,quiet:!0}),Mg(e)),await Fe("generate-env",{cwd:e})},sn=async e=>{await Js()&&await Yr(e)},Ei=e=>{let{eventsPath:t}=x(e);if(!ie(t))return async()=>{};let r=ae(async()=>{console.log(`
579
+ \u{1F4E6} Contracts changed, updating streams...`),await Yr(e)},500),n=Ng.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 Ti from"chalk";f();var an=e=>new Promise(t=>setTimeout(t,e)),$i=e=>process.stdout.write(`${e}
580
+ `),Dg=()=>{process.stdout.write("\x1B[2J\x1B[3J\x1B[H"),process.stdout.isTTY&&process.stdout.write("\x1Bc")},Ai=()=>({turboProcess:null,isRestarting:!1,isShuttingDown:!1}),cn=async(e,t)=>{let r=Jn(".env.local",t);r.length>0&&(await Yn(r),await an(50));let{dev:n}=Ie(t),o=n.filter.flatMap(s=>["--filter",s]);$i(Ti.cyan("\u{1F525} Starting services...")),$i(Ti.dim(` Command: turbo run ${Yt} --continue${o.length?` ${o.join(" ")}`:""}`)),e.isShuttingDown=!1,e.isRestarting=!1,e.turboProcess=qn("turbo",["run",Yt,"--continue","--no-daemon",...o],{cwd:t,envFile:".env.local",onExit:s=>{e.isRestarting||e.isShuttingDown||s===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 an(200);try{process.kill(-t,"SIGKILL")}catch{}await an(30)}catch{}e.turboProcess=null,Dg()}};var Ii=new jg("dev").description("Start development mode with auto-reload").action(async()=>{let e;try{e=g()}catch(a){$(a);return}let t=Ai(),r=async()=>{await on(e),await sn(e),await cn(t,e)},o=ae(async()=>{if(!(t.isRestarting||t.isShuttingDown)){t.isRestarting=!0,console.log(`
563
581
  \u{1F504} Change detected, restarting...
564
- `);try{await Pt(t),await wr(e),await Sr(e),await Tr(t,e)}catch(a){E(a)}finally{t.isRestarting=!1}}},300),s=async()=>{t.isShuttingDown||(console.log(`
565
- \u{1F6D1} Shutting down...`),await Pt(t),process.exit(T.SUCCESS))};process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",s),process.on("SIGTERM",s);let i;try{await r(),Hr(e,o),i=Ps(e),console.log(`
582
+ `);try{await Vt(t),await on(e),await sn(e),await cn(t,e)}catch(a){$(a)}finally{t.isRestarting=!1}}},300),s=async()=>{t.isShuttingDown||(console.log(`
583
+ \u{1F6D1} Shutting down...`),await Vt(t),process.exit(w.SUCCESS))};process.removeAllListeners("SIGINT"),process.removeAllListeners("SIGTERM"),process.on("SIGINT",s),process.on("SIGTERM",s);let i;try{await r(),En(e,o),i=Ei(e),console.log(`
566
584
  \u{1F440} Watching for changes...`),console.log(` Press Ctrl+C twice to exit (first stops Turbo, second triggers cleanup)
567
- `)}catch(a){await i?.(),await Pt(t),E(a)}});import As from"chalk";import{Command as td}from"commander";import{existsSync as Bm,readFileSync as Um,writeFileSync as zm}from"fs";import Vm from"os";import Es from"path";import Er from"chalk";import{Command as Km}from"commander";var{name:Jm,publishConfig:qm}=A,Ym=qm?.registry,Zm=Jm?.split("/")[0],bw=new Km("token:set").description(Er.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)",Zm).option("--registry <registry>","Registry URL",Ym).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)=>$s(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${Er.cyan(`
585
+ `)}catch(a){await i?.(),await Vt(t),$(a)}});import Oi from"chalk";import{Command as Yg}from"commander";import{existsSync as _g,readFileSync as Lg,writeFileSync as Wg}from"fs";import Hg from"os";import Ri from"path";import ln from"chalk";import{Command as Bg}from"commander";v();var{name:Gg,publishConfig:Ug}=R,zg=Ug?.registry,Vg=Gg?.split("/")[0],IE=new Bg("token:set").description(ln.bold("Set a registry auth token in a .npmrc file")).argument("<token>","Authentication token (e.g. GitHub or npm token)").option("--scope <scope>","Package scope (e.g. @my-workspace)",Vg).option("--registry <registry>","Registry URL",zg).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)=>Ni(e,t.scope||"",t.registry||"",t.local,t.force)).addHelpText("after",()=>`${ln.cyan(`
568
586
  Example:`)}
569
- ${Er.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
570
- `),Xm=e=>e?Es.join(process.cwd(),".npmrc"):Es.join(Vm.homedir(),".npmrc"),Qm=(e,t,r)=>{let n=new URL(r).host;return t?`${t}:registry=https://${n}
571
- //${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},ed=e=>Bm(e)?Um(e,"utf8"):"",$r=(e,t)=>zm(e,t),$s=(e,t,r,n=!1,o=!1)=>{let s=Xm(n),i=Qm(e,t,r),a=new URL(r).host,c=ed(s),l=new RegExp(`//${a}/:_authToken=\\S+`);if(!c){$r(s,`${i}
572
- `),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),$r(s,c),d.success(`Overwrote existing token for ${a} in ${s}`);return}c+=`
587
+ ${ln.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
588
+ `),Jg=e=>e?Ri.join(process.cwd(),".npmrc"):Ri.join(Hg.homedir(),".npmrc"),Kg=(e,t,r)=>{let n=new URL(r).host;return t?`${t}:registry=https://${n}
589
+ //${n}/:_authToken=${e}`:`//${n}/:_authToken=${e}`},qg=e=>_g(e)?Lg(e,"utf8"):"",pn=(e,t)=>Wg(e,t),Ni=(e,t,r,n=!1,o=!1)=>{let s=Jg(n),i=Kg(e,t,r),a=new URL(r).host,c=qg(s),l=new RegExp(`//${a}/:_authToken=\\S+`);if(!c){pn(s,`${i}
590
+ `),d.success(`Created new .npmrc and set token for ${a}`);return}if(l.test(c)){if(!o){d.warn(`Token for ${a} already exists in ${s}. Use --force to overwrite.`);return}c=c.replace(l,i),pn(s,c),d.success(`Overwrote existing token for ${a} in ${s}`);return}c+=`
573
591
  ${i}
574
- `,$r(s,c),d.success(`Appended token for ${a} to ${s}`)},Is=(e,t)=>$s(e,t.scope||"",t.registry||"",t.local,t.force);var{name:rd,publishConfig:nd}=A,od=nd?.registry,sd=rd?.split("/")[0],Ir=new td("token").description("Token management commands");Ir.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)",sd).option("--registry <registry>","Registry URL",od).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(Is).addHelpText("after",()=>`${As.cyan(`
592
+ `,pn(s,c),d.success(`Appended token for ${a} to ${s}`)},Fi=(e,t)=>Ni(e,t.scope||"",t.registry||"",t.local,t.force);var{name:Zg,publishConfig:Xg}=R,Qg=Xg?.registry,eu=Zg?.split("/")[0],mn=new Yg("token").description("Token management commands");mn.command("set").description("Set a registry auth token in a .npmrc file").argument("<token>","Authentication token (e.g. GitHub or npm token)").option("--scope <scope>","Package scope (e.g. @my-workspace)",eu).option("--registry <registry>","Registry URL",Qg).option("--local","Write token to a local .npmrc in the current directory",!1).option("--force","Force overwrite existing token if already present",!1).action(Fi).addHelpText("after",()=>`${Oi.cyan(`
575
593
  Example:`)}
576
- ${As.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
577
- `);Ir.action(()=>{let e=te({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 Rs=Ir;import Rr from"chalk";import{Command as vd}from"commander";var Mw={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};import{confirm as Fs,input as pd,password as md,select as Ms}from"@inquirer/prompts";import k from"chalk";var id=[/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],ad=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)}},cd=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(),ld=async(e,t)=>{let r=ve(e),n=await ad(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=id.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:cd(a.id),value:a.id}));if(i.length===0)throw new Error(`No chat models found from ${r.name} API`);return i};async function Ns(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await ld(e,t),fromApi:!0}}function dd(){if(!Ce())return null;try{let e=Le();return console.log(k.dim(`Found existing configuration at ${B}
578
- `)),e}catch{return console.log(k.yellow(`Found corrupted configuration, starting fresh.
579
- `)),null}}async function gd(e,t){return console.log(k.dim(`
580
- \u{1F4CB} Get your ${e} API key here:`)),console.log(k.cyan(` ${t}
581
- `)),md({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 ud(e,t,r){let n=await Ms({message:"Select model:",choices:e,default:t?.provider===r?t.model:void 0});return await Fs({message:"Enter a custom model ID instead?",default:!1})?pd({message:"Enter custom model ID:",default:n,validate:s=>s.trim()?!0:"Model ID cannot be empty"}):n}function Ds(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function fd(e,t){console.log(k.green.bold(`
594
+ ${Oi.bold("pf token set <token> --scope @my-workspace --registry https://npm.pkg.github.com")}
595
+ `);mn.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 Mi=mn;import gn from"chalk";import{Command as gu}from"commander";f();Ze();var LE={AI_GENERATION:!0,DEBUG:process.env.PF_DEBUG==="true"};import{confirm as ji,input as su,password as iu,select as _i}from"@inquirer/prompts";import P from"chalk";var tu=[/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],ru=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)}},nu=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(),ou=async(e,t)=>{let r=Me(e),n=await ru(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=tu.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:nu(a.id),value:a.id}));if(i.length===0)throw new Error(`No chat models found from ${r.name} API`);return i};async function Di(e,t){if(!t)throw new Error("API key is required to fetch available models");return{models:await ou(e,t),fromApi:!0}}V();function au(){if(!De())return null;try{let e=mt();return console.log(P.dim(`Found existing configuration at ${Q}
596
+ `)),e}catch{return console.log(P.yellow(`Found corrupted configuration, starting fresh.
597
+ `)),null}}async function cu(e,t){return console.log(P.dim(`
598
+ \u{1F4CB} Get your ${e} API key here:`)),console.log(P.cyan(` ${t}
599
+ `)),iu({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 lu(e,t,r){let n=await _i({message:"Select model:",choices:e,default:t?.provider===r?t.model:void 0});return await ji({message:"Enter a custom model ID instead?",default:!1})?su({message:"Enter custom model ID:",default:n,validate:s=>s.trim()?!0:"Model ID cannot be empty"}):n}function Li(e){return e.length<=12?"****":`${e.slice(0,4)}...${e.slice(-4)}`}function pu(e,t){console.log(P.green.bold(`
582
600
  \u2705 AI configuration saved successfully!
583
- `)),console.log(k.dim(`Configuration file: ${B}`)),console.log(k.dim("API Key: Stored securely in system keychain")),console.log(k.dim(`Provider: ${e.provider}`)),console.log(k.dim(`Model: ${e.model}`)),console.log(k.dim(`API Key: ${Ds(t)}
584
- `)),console.log(k.cyan("You can now use AI-powered service generation:")),console.log(k.dim(` pf new hono-micro services/my-service --ai
585
- `))}async function hd(e){let t=await _e(e);if(t)return t;let r=ve(e);return process.env[r.defaultApiKeyEnvVar]??null}async function js(){console.log(k.cyan.bold(`
601
+ `)),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: ${Li(t)}
602
+ `)),console.log(P.cyan("You can now use AI-powered service generation:")),console.log(P.dim(` pf new hono-micro services/my-service --ai
603
+ `))}async function mu(e){let t=await pt(e);if(t)return t;let r=Me(e);return process.env[r.defaultApiKeyEnvVar]??null}async function Wi(){console.log(P.cyan.bold(`
586
604
  \u{1F916} AI Configuration Setup
587
- `));let e=dd();try{let t=await Ms({message:"Select AI provider:",choices:cn(),default:e?.provider??Ft.provider}),r=ve(t),n,o=await hd(t);o&&(console.log(k.green(`
588
- \u2713 Found existing API key: ${Ds(o)}`)),await Fs({message:"Use this existing API key?",default:!0})&&(n=o)),n||(n=await gd(r.name,r.apiKeyUrl)),console.log(k.dim(`
589
- Fetching available models...`));let s;try{s=(await Ns(t,n)).models,console.log(k.green(`\u2713 Loaded ${s.length} models from ${r.name} API
590
- `))}catch(c){console.error(k.red(`
591
- \u274C Failed to fetch models: ${_r(c)}`)),console.log(k.yellow(`
605
+ `));let e=au();try{let t=await _i({message:"Select AI provider:",choices:lo(),default:e?.provider??ur.provider}),r=Me(t),n,o=await mu(t);o&&(console.log(P.green(`
606
+ \u2713 Found existing API key: ${Li(o)}`)),await ji({message:"Use this existing API key?",default:!0})&&(n=o)),n||(n=await cu(r.name,r.apiKeyUrl)),console.log(P.dim(`
607
+ Fetching available models...`));let s;try{s=(await Di(t,n)).models,console.log(P.green(`\u2713 Loaded ${s.length} models from ${r.name} API
608
+ `))}catch(c){console.error(P.red(`
609
+ \u274C Failed to fetch models: ${kn(c)}`)),console.log(P.yellow(`
592
610
  Please check your API key and try again.
593
- `)),process.exit(T.CONFIG_ERROR)}let i=await ud(s,e,t),a={provider:t,model:i.trim()};ln(a),await pn(t,n),fd(a,n)}catch(t){throw Y(t)&&t.name==="ExitPromptError"&&(console.log(k.yellow(`
611
+ `)),process.exit(w.CONFIG_ERROR)}let i=await lu(s,e,t),a={provider:t,model:i.trim()};po(a),await mo(t,n),pu(a,n)}catch(t){throw X(t)&&t.name==="ExitPromptError"&&(console.log(P.yellow(`
594
612
  Setup cancelled.
595
- `)),process.exit(T.CANCELLED)),t}}import{existsSync as Jw,readFileSync as qw}from"fs";import{homedir as Zw}from"os";import{join as Qw}from"path";var Ar=async(e,t=!1)=>{try{return rr(e,t),await Se({verbose:t}),!0}catch{return!1}};var wt=e=>{let t=new vd("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
613
+ `)),process.exit(w.CANCELLED)),t}}import{existsSync as QE,readFileSync as eT}from"fs";import{homedir as rT}from"os";import{join as oT}from"path";var dn=async(e,t=!1)=>{try{return jr(e,t),await He({verbose:t}),!0}catch{return!1}};var Jt=e=>{let t=new gu("setup").description("Configure platform settings");return t.command("completion").description("Install shell autocompletion").option("--verbose","Enable verbose logging").addHelpText("after",`
596
614
  Examples:
597
615
  $ pf setup completion
598
616
  $ pf setup completion --verbose
599
- `).action(async r=>{await Ar(e,r.verbose),r.verbose||(console.log(Rr.green(`
600
- \u2714 Shell autocompletion installed!`)),console.log(Rr.dim(` Restart your shell:
601
- `)),console.log(Rr.cyan(` exec $SHELL
617
+ `).action(async r=>{await dn(e,r.verbose),r.verbose||(console.log(gn.green(`
618
+ \u2714 Shell autocompletion installed!`)),console.log(gn.dim(` Restart your shell:
619
+ `)),console.log(gn.cyan(` exec $SHELL
602
620
  `)))}),t.command("ai").description("Configure AI provider and API key for code generation").addHelpText("after",`
603
621
  Example:
604
622
  $ pf setup ai
605
- `).action(async()=>{await js()}),t.action(()=>{let r=te({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},Cd=wt("pf");import xd from"chalk";import{Command as _s}from"commander";import Os from"chalk";var kd=e=>({debug:()=>{},info:e?()=>{}:t=>console.log(` ${t}`),warn:e?()=>{}:t=>console.log(Os.yellow(` ${t}`)),error:e?()=>{}:t=>console.error(Os.red(` ${t}`))}),Nr=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:kd(s)};sr(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 Pd=e=>e.required?`<${e.name}>`:`[${e.name}]`,wd=(e,t)=>{e.argument(Pd(t),t.description)},Sd=(e,t)=>{t.default!==void 0?e.option(t.flags,t.description,t.default):e.option(t.flags,t.description)},bd=(e,t)=>Object.fromEntries(e.args.map((r,n)=>[r.name,t[n]])),Td=e=>e[e.length-2],Ed=(e,t)=>async(...r)=>{try{await Nr({command:e,args:bd(e,r),options:Td(r),context:t})}catch(n){console.error(xd.red(`Error executing ${e.name}:`),n instanceof Error?n.message:n),process.exit(1)}},Ls=(e,t)=>{let r=new _s(e.name).description(e.description);return e.args.forEach(n=>{wd(r,n)}),e.options.forEach(n=>{Sd(r,n)}),r.action(Ed(e,t)),r},Fr=(e,t,r,n)=>{let o=new _s(e).description(t);return r.forEach(s=>{o.addCommand(Ls(s,n))}),o};Ze();process.on("SIGINT",()=>{process.exit(T.CANCELLED)});process.on("unhandledRejection",e=>{throw Lr(e)&&process.exit(T.CANCELLED),e});process.on("uncaughtException",e=>{E(e)});var Ie=new Id,Ws=Object.keys(A.bin||{}),[Dr="pf",Mr]=Ws.length>0?Ws:["pf"],{description:Hs,version:Rd,repository:Gs,homepage:Nd}=A,Bs=Hs?.split(/ —|,|\./)[0]||Hs||"Platform CLI",zs=Gs?.url?`https://${Gs.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,Us=zs||Nd,Fd=zs?"GitHub":"README",Md=Us?[Ae.bold(Bs),`
623
+ `).action(async()=>{await Wi()}),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},uu=Jt("pf");V();f();import hu from"chalk";import{Command as Bi}from"commander";import Hi from"chalk";var fu=e=>({debug:()=>{},info:e?()=>{}:t=>console.log(` ${t}`),warn:e?()=>{}:t=>console.log(Hi.yellow(` ${t}`)),error:e?()=>{}:t=>console.error(Hi.red(` ${t}`))}),un=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:fu(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 yu=e=>e.required?`<${e.name}>`:`[${e.name}]`,vu=(e,t)=>{e.argument(yu(t),t.description)},ku=(e,t)=>{t.default!==void 0?e.option(t.flags,t.description,t.default):e.option(t.flags,t.description)},Cu=(e,t)=>Object.fromEntries(e.args.map((r,n)=>[r.name,t[n]])),xu=e=>e[e.length-2],wu=(e,t)=>async(...r)=>{try{await un({command:e,args:Cu(e,r),options:xu(r),context:t})}catch(n){console.error(hu.red(`Error executing ${e.name}:`),n instanceof Error?n.message:n),process.exit(1)}},Gi=(e,t)=>{let r=new Bi(e.name).description(e.description);return e.args.forEach(n=>{vu(r,n)}),e.options.forEach(n=>{ku(r,n)}),r.action(wu(e,t)),r},fn=(e,t,r,n)=>{let o=new Bi(e).description(t);return r.forEach(s=>{o.addCommand(Gi(s,n))}),o};Pt();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 Su,Ui=Object.keys(R.bin||{}),[yn="pf",hn]=Ui.length>0?Ui:["pf"],{description:zi,version:Eu,repository:Vi,homepage:Tu}=R,Ji=zi?.split(/ —|,|\./)[0]||zi||"Platform CLI",qi=Vi?.url?`https://${Vi.url.replace(/^(git\+|git@)/,"").replace(/\.git$/,"").replace(":","/")}`:null,Ki=qi||Tu,$u=qi?"GitHub":"README",Au=Ki?[Je.bold(Ji),`
606
624
 
607
- `,Ae.cyan("See more at: "),Ae.bold(Ad(Fd,String(Us)))].join(""):Ae.bold(Bs),Dd=[wt(Dr),ks(),Ts,Rs,tn],jd=async()=>{try{let e=h(),t=De(e);if(!t.plugins?.length)return[];let r=C(e),n=Xe({workspaceRoot:e,availableServices:$t(e),contracts:{path:`${r.relativePath}/src`,packageName:r.packageName}}),o=[];for(let s of t.plugins)try{let{plugin:i}=await Qe(s,n),a=Fr(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[]}},Od=async()=>{let e=await jd(),t=[...Dd,...e];Ie.name(Dr).description(Md).version(Rd||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:r=>Ae.cyan(r.name())}).addHelpText("after",to),Mr&&Mr!==Dr&&Ie.alias(Mr);for(let r of t)Ie.addCommand(r);Ie.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)}),ro(Ie,$d,t)};Od();
625
+ `,Je.cyan("See more at: "),Je.bold(bu($u,String(Ki)))].join(""):Je.bold(Ji),Iu=[Jt(yn),xi(),Ii,Mi,no],Ru=async()=>{try{let e=g(),t=Ie(e);if(!t.plugins?.length)return[];let r=x(e),n=St({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 bt(s,n),a=fn(i.name,i.description??`Commands from ${i.name}`,i.commands,n);o.push(a)}catch(i){console.warn(`\u26A0\uFE0F Failed to load plugin '${s}':`,i.message)}return o}catch{return[]}},Nu=async()=>{let e=await Ru(),t=[...Iu,...e];Ve.name(yn).description(Au).version(Eu||"0.0.1").helpCommand(!1).configureHelp({subcommandTerm:r=>Je.cyan(r.name())}).addHelpText("after",ns),hn&&hn!==yn&&Ve.alias(hn);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)}),os(Ve,Pu,t)};Nu();