kaven-cli 0.5.0 → 0.7.0

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 (2) hide show
  1. package/dist/index.js +105 -83
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,95 +1,103 @@
1
1
  #!/usr/bin/env node
2
- import{a as Lt,b as Ot,c as Ft,d as Ge,e as je,f as Te,g as J}from"./chunk-JHLQ46NG.js";import{Command as Kr}from"commander";import b from"chalk";import{execSync as Ut}from"child_process";import Bt from"path";import qe from"fs-extra";import x from"fs-extra";import R from"path";import Zo from"os";var He=class{constructor(e,t,n){this.projectRoot=e;this.markerService=t;this.manifestParser=n}async checkAll(){let e=[];return e.push(...await this.checkAnchors()),e.push(...await this.checkMarkers()),e.push(...await this.checkDependencies()),e.push(...await this.checkSchemaMerge()),e.push(...await this.checkEnvCompleteness()),e.push(...await this.checkLicense()),e.push(...await this.checkFrameworkVersion()),e.push(...await this.checkPrismaClientSync()),e}async checkAnchors(){let e=[],t=[{file:"apps/api/src/app.ts",anchor:"// [KAVEN_MODULE_IMPORTS]"},{file:"apps/api/src/app.ts",anchor:"// [KAVEN_MODULE_HOOKS]"},{file:"apps/api/src/app.ts",anchor:"// [KAVEN_MODULE_REGISTRATION]"}];for(let{file:n,anchor:r}of t){let a=R.join(this.projectRoot,n);if(!await x.pathExists(a)){e.push({type:"anchor",severity:"warning",message:`File not found: ${n}`,file:n,fixable:!1});continue}(await x.readFile(a,"utf-8")).includes(r)||e.push({type:"anchor",severity:"error",message:`Missing anchor: ${r}`,file:n,fixable:!1})}return e}async checkMarkers(){let e=[],n=(await this.readKavenConfig()).modules.filter(r=>r.installed);for(let r of n){let a=R.join(this.projectRoot,".kaven/modules",r.name,"module.json");if(!await x.pathExists(a)){e.push({type:"marker",severity:"error",message:`Manifest not found for installed module: ${r.name}`,fixable:!1});continue}try{let i=await this.manifestParser.parse(a);for(let s of i.injections){let c=R.join(this.projectRoot,s.file);if(!await x.pathExists(c)){e.push({type:"marker",severity:"error",message:`Injection target not found: ${s.file}`,file:s.file,fixable:!1});continue}let l=await x.readFile(c,"utf-8"),d=s.moduleName||r.name;this.markerService.detectMarkers(l,d).found||e.push({type:"marker",severity:"error",message:`Module ${r.name} not injected in ${s.file}`,file:s.file,fixable:!0})}}catch(i){e.push({type:"marker",severity:"error",message:`Invalid manifest for module ${r.name}: ${i instanceof Error?i.message:String(i)}`,fixable:!1})}}return e}async checkDependencies(){let e=[],n=(await this.readKavenConfig()).modules.filter(i=>i.installed),r=R.join(this.projectRoot,"package.json");if(!await x.pathExists(r))return e.push({type:"dependency",severity:"error",message:"package.json not found",fixable:!1}),e;let a=await x.readJSON(r);for(let i of n){let s=R.join(this.projectRoot,".kaven/modules",i.name,"module.json");if(await x.pathExists(s))try{let c=await this.manifestParser.parse(s);for(let l of c.dependencies.npm){let[d]=l.split("@"),p=a.dependencies?.[d],u=a.devDependencies?.[d];!p&&!u&&e.push({type:"dependency",severity:"warning",message:`Missing npm dependency: ${l}`,fixable:!0})}}catch{}}return e}async checkSchemaMerge(){let e=[],t=R.join(this.projectRoot,"packages/database/prisma/schema.base.prisma");if(!await x.pathExists(t))return e.push({type:"dependency",severity:"warning",message:"Prisma base schema not found: packages/database/prisma/schema.base.prisma",file:"packages/database/prisma/schema.base.prisma",fixable:!1}),e;let n=R.dirname(t);try{let r=await x.readdir(n);for(let a of r){if(!a.endsWith(".prisma"))continue;let i=R.join(n,a);(await x.readFile(i,"utf-8")).includes("<<<<<<<")&&e.push({type:"marker",severity:"error",message:`Merge conflict detected in schema file: ${a}`,file:R.join("packages/database/prisma",a),fixable:!1})}}catch{}return e.length===0&&e.push({type:"dependency",severity:"info",message:"Prisma schema integrity OK",fixable:!1}),e}async checkEnvCompleteness(){let e=[],t=R.join(this.projectRoot,".env.example"),n=R.join(this.projectRoot,".env");if(!await x.pathExists(t))return e.push({type:"dependency",severity:"info",message:".env.example not found \u2014 skipping env completeness check",fixable:!1}),e;if(!await x.pathExists(n))return e.push({type:"dependency",severity:"warning",message:".env file not found. Copy .env.example to .env and fill in values",file:".env",fixable:!1}),e;let r=await x.readFile(t,"utf-8"),a=await x.readFile(n,"utf-8"),i=d=>{let p=new Set;for(let u of d.split(`
3
- `)){let m=u.trim();if(m.startsWith("#")||!m.includes("="))continue;let g=m.split("=")[0].trim();g&&p.add(g)}return p},s=i(r),c=i(a),l=[];for(let d of s)c.has(d)||l.push(d);return l.length>0?e.push({type:"dependency",severity:"warning",message:`Missing env vars in .env: ${l.join(", ")}`,file:".env",fixable:!0}):e.push({type:"dependency",severity:"info",message:"Env vars completeness OK",fixable:!1}),e}async checkLicense(){let e=[],t=R.join(Zo.homedir(),".kaven","license.json");if(!await x.pathExists(t))return e.push({type:"dependency",severity:"warning",message:"No license found at ~/.kaven/license.json. Run 'kaven license status' to set up.",fixable:!1}),e;try{let n=await x.readJson(t);if(n.expiresAt){let r=new Date(n.expiresAt).getTime();if(Date.now()>r)return e.push({type:"dependency",severity:"error",message:`License expired on ${n.expiresAt}. Run 'kaven upgrade' to renew.`,fixable:!1}),e}e.push({type:"dependency",severity:"info",message:`License valid (tier: ${n.tier||"unknown"})`,fixable:!1})}catch{e.push({type:"dependency",severity:"warning",message:"Could not read license file. Try 'kaven license status'.",fixable:!1})}return e}async checkFrameworkVersion(){let e=[],t=R.join(this.projectRoot,"package.json");if(!await x.pathExists(t))return e.push({type:"dependency",severity:"info",message:"package.json not found \u2014 skipping framework version check",fixable:!1}),e;try{let n=await x.readJSON(t),r=n.dependencies?.["@kaven/core"]||n.devDependencies?.["@kaven/core"];if(!r)return e.push({type:"dependency",severity:"info",message:"@kaven/core not found in dependencies \u2014 not a Kaven framework project",fixable:!1}),e;let a="1.0.0",s=r.replace(/[\^~>=<]/,"").split(" ")[0].split(".").map(Number),c=a.split(".").map(Number),l=!0;for(let d=0;d<3&&!((s[d]||0)>(c[d]||0));d++)if((s[d]||0)<(c[d]||0)){l=!1;break}l?e.push({type:"dependency",severity:"info",message:`Framework version OK (${r})`,fixable:!1}):e.push({type:"dependency",severity:"warning",message:`@kaven/core version ${r} may be outdated. Minimum: ^${a}`,fixable:!1})}catch{e.push({type:"dependency",severity:"info",message:"Could not determine framework version",fixable:!1})}return e}async checkPrismaClientSync(){let e=[],t=R.join(this.projectRoot,"node_modules/@prisma/client"),n=R.join(this.projectRoot,"prisma/schema.prisma");if(!await x.pathExists(t))return e.push({type:"dependency",severity:"warning",message:"@prisma/client not found. Run 'npx prisma generate' to generate the client.",fixable:!0}),e;if(!await x.pathExists(n))return e.push({type:"dependency",severity:"info",message:"prisma/schema.prisma not found \u2014 skipping Prisma sync check",fixable:!1}),e;try{let r=await x.stat(n),a=await x.stat(t);r.mtime>a.mtime?e.push({type:"dependency",severity:"warning",message:"Prisma schema was modified after client generation. Run 'npx prisma generate'.",fixable:!0}):e.push({type:"dependency",severity:"info",message:"Prisma client is up to date",fixable:!1})}catch{e.push({type:"dependency",severity:"info",message:"Could not compare Prisma schema and client timestamps",fixable:!1})}return e}async readKavenConfig(){let e=R.join(this.projectRoot,"kaven.json");if(!await x.pathExists(e))return{modules:[]};try{return await x.readJSON(e)}catch{return{modules:[]}}}};function Ie(o){return{moduleName:o,beginMarker:`// [KAVEN_MODULE:${o} BEGIN]`,endMarker:`// [KAVEN_MODULE:${o} END]`}}var W=class{hasModule(e,t){let n=Ie(t);return e.includes(n.beginMarker)&&e.includes(n.endMarker)}detectMarkers(e,t){let n=Ie(t),r=e.split(`
2
+ import{a as lo,b as uo,c as po,d as ct,e as Ge,f as de,g as V}from"./chunk-JHLQ46NG.js";import{Command as Ca}from"commander";import E from"chalk";import{execSync as go}from"child_process";import ho from"path";import dt from"fs-extra";import S from"fs-extra";import B from"path";import $n from"os";var lt=class{constructor(e,t,n){this.projectRoot=e;this.markerService=t;this.manifestParser=n}async checkAll(){let e=[];return e.push(...await this.checkAnchors()),e.push(...await this.checkMarkers()),e.push(...await this.checkDependencies()),e.push(...await this.checkSchemaMerge()),e.push(...await this.checkEnvCompleteness()),e.push(...await this.checkLicense()),e.push(...await this.checkFrameworkVersion()),e.push(...await this.checkPrismaClientSync()),e}async checkAnchors(){let e=[],t=[{file:"apps/api/src/app.ts",anchor:"// [KAVEN_MODULE_IMPORTS]"},{file:"apps/api/src/app.ts",anchor:"// [KAVEN_MODULE_HOOKS]"},{file:"apps/api/src/app.ts",anchor:"// [KAVEN_MODULE_REGISTRATION]"}];for(let{file:n,anchor:r}of t){let a=B.join(this.projectRoot,n);if(!await S.pathExists(a)){e.push({type:"anchor",severity:"warning",message:`File not found: ${n}`,file:n,fixable:!1});continue}(await S.readFile(a,"utf-8")).includes(r)||e.push({type:"anchor",severity:"error",message:`Missing anchor: ${r}`,file:n,fixable:!1})}return e}async checkMarkers(){let e=[],n=(await this.readKavenConfig()).modules.filter(r=>r.installed);for(let r of n){let a=B.join(this.projectRoot,".kaven/modules",r.name,"module.json");if(!await S.pathExists(a)){e.push({type:"marker",severity:"error",message:`Manifest not found for installed module: ${r.name}`,fixable:!1});continue}try{let i=await this.manifestParser.parse(a);for(let s of i.injections){let c=B.join(this.projectRoot,s.file);if(!await S.pathExists(c)){e.push({type:"marker",severity:"error",message:`Injection target not found: ${s.file}`,file:s.file,fixable:!1});continue}let l=await S.readFile(c,"utf-8"),d=s.moduleName||r.name;this.markerService.detectMarkers(l,d).found||e.push({type:"marker",severity:"error",message:`Module ${r.name} not injected in ${s.file}`,file:s.file,fixable:!0})}}catch(i){e.push({type:"marker",severity:"error",message:`Invalid manifest for module ${r.name}: ${i instanceof Error?i.message:String(i)}`,fixable:!1})}}return e}async checkDependencies(){let e=[],n=(await this.readKavenConfig()).modules.filter(i=>i.installed),r=B.join(this.projectRoot,"package.json");if(!await S.pathExists(r))return e.push({type:"dependency",severity:"error",message:"package.json not found",fixable:!1}),e;let a=await S.readJSON(r);for(let i of n){let s=B.join(this.projectRoot,".kaven/modules",i.name,"module.json");if(await S.pathExists(s))try{let c=await this.manifestParser.parse(s);for(let l of c.dependencies.npm){let[d]=l.split("@"),m=a.dependencies?.[d],p=a.devDependencies?.[d];!m&&!p&&e.push({type:"dependency",severity:"warning",message:`Missing npm dependency: ${l}`,fixable:!0})}}catch{}}return e}async checkSchemaMerge(){let e=[],t=B.join(this.projectRoot,"packages/database/prisma/schema.base.prisma");if(!await S.pathExists(t))return e.push({type:"dependency",severity:"warning",message:"Prisma base schema not found: packages/database/prisma/schema.base.prisma",file:"packages/database/prisma/schema.base.prisma",fixable:!1}),e;let n=B.dirname(t);try{let r=await S.readdir(n);for(let a of r){if(!a.endsWith(".prisma"))continue;let i=B.join(n,a);(await S.readFile(i,"utf-8")).includes("<<<<<<<")&&e.push({type:"marker",severity:"error",message:`Merge conflict detected in schema file: ${a}`,file:B.join("packages/database/prisma",a),fixable:!1})}}catch{}return e.length===0&&e.push({type:"dependency",severity:"info",message:"Prisma schema integrity OK",fixable:!1}),e}async checkEnvCompleteness(){let e=[],t=B.join(this.projectRoot,".env.example"),n=B.join(this.projectRoot,".env");if(!await S.pathExists(t))return e.push({type:"dependency",severity:"info",message:".env.example not found \u2014 skipping env completeness check",fixable:!1}),e;if(!await S.pathExists(n))return e.push({type:"dependency",severity:"warning",message:".env file not found. Copy .env.example to .env and fill in values",file:".env",fixable:!1}),e;let r=await S.readFile(t,"utf-8"),a=await S.readFile(n,"utf-8"),i=d=>{let m=new Set;for(let p of d.split(`
3
+ `)){let u=p.trim();if(u.startsWith("#")||!u.includes("="))continue;let g=u.split("=")[0].trim();g&&m.add(g)}return m},s=i(r),c=i(a),l=[];for(let d of s)c.has(d)||l.push(d);return l.length>0?e.push({type:"dependency",severity:"warning",message:`Missing env vars in .env: ${l.join(", ")}`,file:".env",fixable:!0}):e.push({type:"dependency",severity:"info",message:"Env vars completeness OK",fixable:!1}),e}async checkLicense(){let e=[],t=B.join($n.homedir(),".kaven","license.json");if(!await S.pathExists(t))return e.push({type:"dependency",severity:"warning",message:"No license found at ~/.kaven/license.json. Run 'kaven license status' to set up.",fixable:!1}),e;try{let n=await S.readJson(t);if(n.expiresAt){let r=new Date(n.expiresAt).getTime();if(Date.now()>r)return e.push({type:"dependency",severity:"error",message:`License expired on ${n.expiresAt}. Run 'kaven upgrade' to renew.`,fixable:!1}),e}e.push({type:"dependency",severity:"info",message:`License valid (tier: ${n.tier||"unknown"})`,fixable:!1})}catch{e.push({type:"dependency",severity:"warning",message:"Could not read license file. Try 'kaven license status'.",fixable:!1})}return e}async checkFrameworkVersion(){let e=[],t=B.join(this.projectRoot,"package.json");if(!await S.pathExists(t))return e.push({type:"dependency",severity:"info",message:"package.json not found \u2014 skipping framework version check",fixable:!1}),e;try{let n=await S.readJSON(t),r=n.dependencies?.["@kaven/core"]||n.devDependencies?.["@kaven/core"];if(!r)return e.push({type:"dependency",severity:"info",message:"@kaven/core not found in dependencies \u2014 not a Kaven framework project",fixable:!1}),e;let a="1.0.0",s=r.replace(/[\^~>=<]/,"").split(" ")[0].split(".").map(Number),c=a.split(".").map(Number),l=!0;for(let d=0;d<3&&!((s[d]||0)>(c[d]||0));d++)if((s[d]||0)<(c[d]||0)){l=!1;break}l?e.push({type:"dependency",severity:"info",message:`Framework version OK (${r})`,fixable:!1}):e.push({type:"dependency",severity:"warning",message:`@kaven/core version ${r} may be outdated. Minimum: ^${a}`,fixable:!1})}catch{e.push({type:"dependency",severity:"info",message:"Could not determine framework version",fixable:!1})}return e}async checkPrismaClientSync(){let e=[],t=B.join(this.projectRoot,"node_modules/@prisma/client"),n=B.join(this.projectRoot,"prisma/schema.prisma");if(!await S.pathExists(t))return e.push({type:"dependency",severity:"warning",message:"@prisma/client not found. Run 'npx prisma generate' to generate the client.",fixable:!0}),e;if(!await S.pathExists(n))return e.push({type:"dependency",severity:"info",message:"prisma/schema.prisma not found \u2014 skipping Prisma sync check",fixable:!1}),e;try{let r=await S.stat(n),a=await S.stat(t);r.mtime>a.mtime?e.push({type:"dependency",severity:"warning",message:"Prisma schema was modified after client generation. Run 'npx prisma generate'.",fixable:!0}):e.push({type:"dependency",severity:"info",message:"Prisma client is up to date",fixable:!1})}catch{e.push({type:"dependency",severity:"info",message:"Could not compare Prisma schema and client timestamps",fixable:!1})}return e}async readKavenConfig(){let e=B.join(this.projectRoot,"kaven.json");if(!await S.pathExists(e))return{modules:[]};try{return await S.readJSON(e)}catch{return{modules:[]}}}};function He(o){return{moduleName:o,beginMarker:`// [KAVEN_MODULE:${o} BEGIN]`,endMarker:`// [KAVEN_MODULE:${o} END]`}}var ae=class{hasModule(e,t){let n=He(t);return e.includes(n.beginMarker)&&e.includes(n.endMarker)}detectMarkers(e,t){let n=He(t),r=e.split(`
4
4
  `),a,i;for(let s=0;s<r.length;s++)if(r[s].includes(n.beginMarker)&&(a=s),r[s].includes(n.endMarker)){i=s;break}if(a!==void 0&&i!==void 0){let s=r.slice(a+1,i).join(`
5
- `);return{found:!0,beginLine:a,endLine:i,content:s}}return{found:!1}}injectModule(e,t,n,r){if(this.hasModule(e,n))throw new Error(`Module ${n} already injected`);if(!e.includes(t))throw new Error(`Anchor not found: ${t}`);let a=Ie(n),i=`
5
+ `);return{found:!0,beginLine:a,endLine:i,content:s}}return{found:!1}}injectModule(e,t,n,r){if(this.hasModule(e,n))throw new Error(`Module ${n} already injected`);if(!e.includes(t))throw new Error(`Anchor not found: ${t}`);let a=He(n),i=`
6
6
  ${a.beginMarker}
7
7
  ${r}
8
8
  ${a.endMarker}
9
- `;return e.replace(t,`${t}${i}`)}removeModule(e,t){let n=Ie(t),r=this.escapeRegex(n.beginMarker),a=this.escapeRegex(n.endMarker),i=new RegExp(`\\n?${r}[\\s\\S]*?${a}\\n?`,"g"),s=e.replace(i,"");if(s===e)throw new Error(`Module ${t} not found in file`);return s}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}};import Nt from"fs-extra";import{z as v}from"zod";var Qo=v.object({npm:v.array(v.string()).default([]),peerModules:v.array(v.string()).default([]),kavenVersion:v.string().default(">=0.1.0")}),it=v.object({source:v.string(),dest:v.string()}),en=v.object({backend:v.array(it).default([]),frontend:v.array(it).default([]),database:v.array(it).default([])}),tn=v.object({file:v.string(),anchor:v.string(),code:v.string(),moduleName:v.string().optional()}),on=v.object({postInstall:v.string().nullable().default(null),preRemove:v.string().nullable().default(null)}),nn=v.object({key:v.string(),required:v.boolean().default(!1),example:v.string().optional()}),Kt=v.object({name:v.string().min(1),version:v.string().regex(/^\d+\.\d+\.\d+$/),description:v.string().optional(),author:v.string().default("Kaven"),license:v.string().default("Proprietary"),dependencies:Qo,files:en,injections:v.array(tn),scripts:on,env:v.array(nn).default([])});import{ZodError as rn}from"zod";var ye=class{async parse(e){if(!await Nt.pathExists(e))throw new Error(`Manifest not found: ${e}`);let t=await Nt.readFile(e,"utf-8"),n;try{n=JSON.parse(t)}catch{throw new Error(`Failed to parse manifest JSON: ${e}`)}try{return Kt.parse(n)}catch(r){throw r instanceof rn?new Error(`Invalid manifest:
9
+ `;return e.replace(t,`${t}${i}`)}removeModule(e,t){let n=He(t),r=this.escapeRegex(n.beginMarker),a=this.escapeRegex(n.endMarker),i=new RegExp(`\\n?${r}[\\s\\S]*?${a}\\n?`,"g"),s=e.replace(i,"");if(s===e)throw new Error(`Module ${t} not found in file`);return s}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}};import fo from"fs-extra";import{z as v}from"zod";var Pn=v.object({npm:v.array(v.string()).default([]),peerModules:v.array(v.string()).default([]),kavenVersion:v.string().default(">=0.1.0")}),Tt=v.object({source:v.string(),dest:v.string()}),Mn=v.object({backend:v.array(Tt).default([]),frontend:v.array(Tt).default([]),database:v.array(Tt).default([])}),An=v.object({file:v.string(),anchor:v.string(),code:v.string(),moduleName:v.string().optional()}),jn=v.object({postInstall:v.string().nullable().default(null),preRemove:v.string().nullable().default(null)}),In=v.object({key:v.string(),required:v.boolean().default(!1),example:v.string().optional()}),mo=v.object({name:v.string().min(1),version:v.string().regex(/^\d+\.\d+\.\d+$/),description:v.string().optional(),author:v.string().default("Kaven"),license:v.string().default("Proprietary"),dependencies:Pn,files:Mn,injections:v.array(An),scripts:jn,env:v.array(In).default([])});import{ZodError as Tn}from"zod";var Te=class{async parse(e){if(!await fo.pathExists(e))throw new Error(`Manifest not found: ${e}`);let t=await fo.readFile(e,"utf-8"),n;try{n=JSON.parse(t)}catch{throw new Error(`Failed to parse manifest JSON: ${e}`)}try{return mo.parse(n)}catch(r){throw r instanceof Tn?new Error(`Invalid manifest:
10
10
  ${this.formatZodError(r)}`):r}}async validate(e){try{return await this.parse(e),{valid:!0,errors:[]}}catch(t){return{valid:!1,errors:[t instanceof Error?t.message:String(t)]}}}formatZodError(e){return e.issues.map(t=>` - ${t.path.map(String).join(".")}: ${t.message}`).join(`
11
- `)}};function an(o){switch(o){case"error":return b.red("[ERROR]");case"warning":return b.yellow("[WARN] ");case"info":return b.cyan("[INFO] ");default:return b.green("[OK] ")}}async function sn(o,e){let t=o.filter(n=>n.fixable);if(t.length===0){console.log(b.gray(" No automatically fixable issues found."));return}for(let n of t){let r=n.message.toLowerCase();if(r.includes("missing npm dependency")||r.includes("pnpm install")){console.log(b.blue(` Fixing: ${n.message}`));try{Ut("pnpm install",{cwd:e,stdio:"inherit"}),console.log(b.green(" \u2713 pnpm install completed"))}catch{console.log(b.red(" \u2717 pnpm install failed"))}continue}if(r.includes("prisma")){console.log(b.blue(` Fixing: ${n.message}`));try{Ut("npx prisma generate",{cwd:e,stdio:"inherit"}),console.log(b.green(" \u2713 npx prisma generate completed"))}catch{console.log(b.red(" \u2717 npx prisma generate failed"))}continue}if(r.includes("missing env vars")&&n.file===".env"){let a=Bt.join(e,".env"),i=Bt.join(e,".env.example");console.log(b.blue(` Fixing: ${n.message}`));try{let s=await qe.readFile(i,"utf-8"),c=await qe.pathExists(a)?await qe.readFile(a,"utf-8"):"",l=m=>{let g=new Set;for(let k of m.split(`
12
- `)){let F=k.trim();if(F.startsWith("#")||!F.includes("="))continue;let I=F.split("=")[0].trim();I&&g.add(I)}return g},d=l(s),p=l(c),u=`
11
+ `)}};function Rn(o){switch(o){case"error":return E.red("[ERROR]");case"warning":return E.yellow("[WARN] ");case"info":return E.cyan("[INFO] ");default:return E.green("[OK] ")}}async function Dn(o,e){let t=o.filter(n=>n.fixable);if(t.length===0){console.log(E.gray(" No automatically fixable issues found."));return}for(let n of t){let r=n.message.toLowerCase();if(r.includes("missing npm dependency")||r.includes("pnpm install")){console.log(E.blue(` Fixing: ${n.message}`));try{go("pnpm install",{cwd:e,stdio:"inherit"}),console.log(E.green(" \u2713 pnpm install completed"))}catch{console.log(E.red(" \u2717 pnpm install failed"))}continue}if(r.includes("prisma")){console.log(E.blue(` Fixing: ${n.message}`));try{go("npx prisma generate",{cwd:e,stdio:"inherit"}),console.log(E.green(" \u2713 npx prisma generate completed"))}catch{console.log(E.red(" \u2717 npx prisma generate failed"))}continue}if(r.includes("missing env vars")&&n.file===".env"){let a=ho.join(e,".env"),i=ho.join(e,".env.example");console.log(E.blue(` Fixing: ${n.message}`));try{let s=await dt.readFile(i,"utf-8"),c=await dt.pathExists(a)?await dt.readFile(a,"utf-8"):"",l=u=>{let g=new Set;for(let k of u.split(`
12
+ `)){let C=k.trim();if(C.startsWith("#")||!C.includes("="))continue;let F=C.split("=")[0].trim();F&&g.add(F)}return g},d=l(s),m=l(c),p=`
13
13
  # Added by kaven doctor --fix
14
- `;for(let m of d)p.has(m)||(u+=`${m}=PLACEHOLDER
15
- `);await qe.appendFile(a,u),console.log(b.green(" \u2713 Placeholder env vars appended to .env"))}catch{console.log(b.red(" \u2717 Could not append env vars"))}continue}console.log(b.yellow(` Manual action required: ${n.message}`))}}async function Vt(o){o.json||console.log(b.blue(`Running module doctor...
16
- `));let e=new W,t=new ye,n=new He(process.cwd(),e,t),r=[];try{r=await n.checkAll()}catch(s){o.json?console.log(JSON.stringify({success:!1,error:s instanceof Error?s.message:String(s),results:[]})):console.error(b.red(`[ERROR] Heavy failure during doctor audit: ${s instanceof Error?s.message:String(s)}`)),process.exit(1);return}if(o.json){let s=r.filter(l=>l.severity==="error"),c=r.filter(l=>l.severity==="warning");console.log(JSON.stringify({success:s.length===0,errors:s.length,warnings:c.length,results:r},null,2)),process.exit(s.length>0?1:c.length>0?2:0);return}for(let s of r){let c=an(s.severity);console.log(`${c} ${s.message}`),s.file&&console.log(b.gray(` file: ${s.file}`)),s.fixable&&!o.fix&&console.log(b.gray(" (fixable: run with --fix)"))}let a=r.filter(s=>s.severity==="error"),i=r.filter(s=>s.severity==="warning");console.log(),a.length===0&&i.length===0?console.log(b.green("[OK] All checks passed! Your project is healthy.")):(a.length>0&&console.log(b.red(`[ERROR] Found ${a.length} error(s)`)),i.length>0&&console.log(b.yellow(`[WARN] Found ${i.length} warning(s)`)),o.fix||(console.log(b.gray(`
17
- Tip: Run with --fix to attempt automatic repairs`)),console.log(b.gray("Try: kaven module doctor --fix")))),o.fix&&(console.log(),console.log(b.blue(`Applying auto-fixes...
18
- `)),await sn(r,process.cwd()),console.log(b.green(`
19
- Auto-fix completed.`))),a.length>0&&process.exit(1),i.length>0&&process.exit(2)}import Gt from"chalk";import pn from"ora";import De from"path";import ve from"fs-extra";import G from"fs-extra";import H from"path";import{glob as cn}from"glob";var Re=class{constructor(e,t=".agent/backups"){this.projectRoot=e;this.backupDir=H.join(e,t),this.backupId=`backup_${Date.now()}`}backupDir;backupId;filesToBackup=[];async backup(e){let t=H.join(this.backupDir,this.backupId);await G.ensureDir(t);for(let n of e){let r=H.resolve(this.projectRoot,n);if(!await G.pathExists(r))throw new Error(`File not found for backup: ${n}`);let a=H.relative(this.projectRoot,r),i=H.join(t,a);await G.ensureDir(H.dirname(i)),await G.copy(r,i),this.filesToBackup.push(r)}console.log(`\u{1F4E6} Backup created: ${this.backupId}`)}async rollback(){let e=H.join(this.backupDir,this.backupId);if(!await G.pathExists(e))throw new Error(`Backup not found: ${this.backupId}`);let t=await cn(`${e}/**/*`,{nodir:!0});for(let n of t){let r=H.relative(e,n),a=H.join(this.projectRoot,r);await G.ensureDir(H.dirname(a)),await G.copy(n,a,{overwrite:!0})}console.log(`\u267B\uFE0F Rollback complete: ${this.backupId}`)}async commit(){let e=H.join(this.backupDir,this.backupId);await G.pathExists(e)&&await G.remove(e),console.log("\u2705 Transaction committed")}getBackupId(){return this.backupId}async cleanup(){if(!await G.pathExists(this.backupDir))return;let e=await G.readdir(this.backupDir),t=Date.now(),n=10080*60*1e3;for(let r of e){let a=r.match(/backup_(\d+)/);if(a){let i=parseInt(a[1]);t-i>n&&await G.remove(H.join(this.backupDir,r))}}}};import ln from"child_process";import dn from"readline";import ze from"chalk";var _e=class{timeoutMs;constructor(e=6e4){this.timeoutMs=e}async runScript(e,t,n=!1){if(!n&&!await this.confirm(`Run ${t} script: ${e.command} ${(e.args??[]).join(" ")}?`)){console.log(ze.dim(` Skipping ${t} script.`));return}return new Promise((r,a)=>{let i=ln.spawn(e.command,e.args??[],{cwd:e.cwd,stdio:["ignore","pipe","pipe"],shell:!0}),s=ze.dim(`[${t}] `);i.stdout?.on("data",l=>{process.stdout.write(s+l.toString())}),i.stderr?.on("data",l=>{process.stderr.write(s+ze.yellow(l.toString()))});let c=setTimeout(()=>{console.warn(ze.yellow(`
20
- \u26A0 ${t} script timed out after ${this.timeoutMs/1e3}s, sending SIGTERM...`)),i.kill("SIGTERM"),setTimeout(()=>{i.kill("SIGKILL")},5e3)},this.timeoutMs);i.on("close",l=>{clearTimeout(c),l===0||l===null?r():a(new Error(`${t} script exited with code ${l}`))}),i.on("error",l=>{clearTimeout(c),a(l)})})}async runScripts(e,t,n=!1){for(let r of e)await this.runScript(r,t,n)}confirm(e){return new Promise(t=>{let n=dn.createInterface({input:process.stdin,output:process.stdout});n.question(`
21
- ${e} [y/N] `,r=>{n.close(),t(r.toLowerCase()==="y"||r.toLowerCase()==="yes")})})}};import we from"fs-extra";import st from"path";import ct from"chalk";var ae=class{constructor(e,t){this.projectRoot=e;this.markerService=t}async isModuleInstalled(e){try{let t=await this.findProjectFiles();for(let n of t)try{let r=await we.readFile(n,"utf-8");if(this.markerService.hasModule(r,e))return!0}catch{}return!1}catch{return!1}}async findProjectFiles(){let{glob:e}=await import("glob"),t=["**/*.ts","**/*.tsx","**/*.js","**/*.jsx"],n=["**/node_modules/**","**/.next/**","**/dist/**","**/build/**"],r=[];for(let a of t){let i=await e(a,{cwd:this.projectRoot,absolute:!0,ignore:n});r.push(...i)}return[...new Set(r)]}async install(e,t){let n=new Re(this.projectRoot);try{let r=Array.from(new Set(e.injections.map(i=>i.file)));await n.backup(r);for(let i of e.injections)await this.injectCode(i);await n.commit();let a=await this.readManifest(this.projectRoot);if(a?.scripts?.postInstall?.length){let i=new _e;try{await i.runScripts(a.scripts.postInstall.map(s=>({...s,cwd:this.projectRoot})),"postInstall",!1)}catch(s){let c=s instanceof Error?s.message:String(s);console.warn(ct.yellow(`
22
- \u26A0 PostInstall script failed: ${c}`)),console.warn(ct.dim(" The module is installed. Run the script manually if needed."))}}if(!t?.skipEnv&&a?.env?.length){let{EnvManager:i}=await import("./EnvManager-NMS3NMIE.js"),s=new i,c=a.env.map(l=>({name:l.key,description:l.example??l.key,required:l.required??!1}));await s.injectEnvVars(e.name,c,{projectDir:this.projectRoot,envFile:t?.envFile,skipEnv:t?.skipEnv,skipConfirmation:t?.yes})}}catch(r){let a=r instanceof Error?r.message:String(r);throw console.error(`\u274C Installation failed: ${a}`),console.log("\u{1F504} Rolling back..."),await n.rollback(),r}}async uninstall(e,t){let n=new Re(this.projectRoot);try{let r=Array.from(new Set(e.injections.map(c=>c.file)));await n.backup(r);let{EnvManager:a}=await import("./EnvManager-NMS3NMIE.js");new a().removeEnvVars(e.name,{projectDir:this.projectRoot,skipEnv:t?.skipEnv});let s=await this.readManifest(this.projectRoot);if(s?.scripts?.preRemove?.length){let c=new _e;try{await c.runScripts(s.scripts.preRemove.map(l=>({...l,cwd:this.projectRoot})),"preRemove",!1)}catch(l){let d=l instanceof Error?l.message:String(l);console.warn(ct.yellow(`
23
- \u26A0 PreRemove script failed: ${d}`))}}for(let c of r)await this.removeCode(c,e.name);await n.commit()}catch(r){let a=r instanceof Error?r.message:String(r);throw console.error(`\u274C Removal failed: ${a}`),console.log("\u{1F504} Rolling back..."),await n.rollback(),r}}async injectCode(e){let t=st.join(this.projectRoot,e.file),n=await we.readFile(t,"utf-8"),r=this.markerService.injectModule(n,e.anchor,e.moduleName||"unnamed",e.code);await we.writeFile(t,r)}async removeCode(e,t){let n=st.join(this.projectRoot,e),r=await we.readFile(n,"utf-8"),a=this.markerService.removeModule(r,t);await we.writeFile(n,a)}async readManifest(e){try{let t=await we.readFile(st.join(e,"module.json"),"utf-8");return JSON.parse(t)}catch{return null}}};import We from"fs-extra";import Jt from"path";import un from"os";var j=class o{static instance;logPath;buffer=[];constructor(){this.logPath=Jt.join(un.homedir(),".kaven","telemetry.log")}static getInstance(){return o.instance||(o.instance=new o),o.instance}capture(e,t,n){let r={event:e,timestamp:new Date().toISOString(),metadata:t,duration:n};this.buffer.push(r)}async flush(){if(this.buffer.length!==0)try{let e=Jt.dirname(this.logPath);await We.ensureDir(e);let t=this.buffer.map(n=>JSON.stringify(n)).join(`
14
+ `;for(let u of d)m.has(u)||(p+=`${u}=PLACEHOLDER
15
+ `);await dt.appendFile(a,p),console.log(E.green(" \u2713 Placeholder env vars appended to .env"))}catch{console.log(E.red(" \u2717 Could not append env vars"))}continue}console.log(E.yellow(` Manual action required: ${n.message}`))}}async function yo(o){o.json||console.log(E.blue(`Running module doctor...
16
+ `));let e=new ae,t=new Te,n=new lt(process.cwd(),e,t),r=[];try{r=await n.checkAll()}catch(s){o.json?console.log(JSON.stringify({success:!1,error:s instanceof Error?s.message:String(s),results:[]})):console.error(E.red(`[ERROR] Heavy failure during doctor audit: ${s instanceof Error?s.message:String(s)}`)),process.exit(1);return}if(o.json){let s=r.filter(l=>l.severity==="error"),c=r.filter(l=>l.severity==="warning");console.log(JSON.stringify({success:s.length===0,errors:s.length,warnings:c.length,results:r},null,2)),process.exit(s.length>0?1:c.length>0?2:0);return}for(let s of r){let c=Rn(s.severity);console.log(`${c} ${s.message}`),s.file&&console.log(E.gray(` file: ${s.file}`)),s.fixable&&!o.fix&&console.log(E.gray(" (fixable: run with --fix)"))}let a=r.filter(s=>s.severity==="error"),i=r.filter(s=>s.severity==="warning");console.log(),a.length===0&&i.length===0?console.log(E.green("[OK] All checks passed! Your project is healthy.")):(a.length>0&&console.log(E.red(`[ERROR] Found ${a.length} error(s)`)),i.length>0&&console.log(E.yellow(`[WARN] Found ${i.length} warning(s)`)),o.fix||(console.log(E.gray(`
17
+ Tip: Run with --fix to attempt automatic repairs`)),console.log(E.gray("Try: kaven module doctor --fix")))),o.fix&&(console.log(),console.log(E.blue(`Applying auto-fixes...
18
+ `)),await Dn(r,process.cwd()),console.log(E.green(`
19
+ Auto-fix completed.`))),a.length>0&&process.exit(1),i.length>0&&process.exit(2)}import vo from"chalk";import Un from"ora";import Xe from"path";import De from"fs-extra";import oe from"fs-extra";import ne from"path";import{glob as _n}from"glob";var qe=class{constructor(e,t=".agent/backups"){this.projectRoot=e;this.backupDir=ne.join(e,t),this.backupId=`backup_${Date.now()}`}backupDir;backupId;filesToBackup=[];async backup(e){let t=ne.join(this.backupDir,this.backupId);await oe.ensureDir(t);for(let n of e){let r=ne.resolve(this.projectRoot,n);if(!await oe.pathExists(r))throw new Error(`File not found for backup: ${n}`);let a=ne.relative(this.projectRoot,r),i=ne.join(t,a);await oe.ensureDir(ne.dirname(i)),await oe.copy(r,i),this.filesToBackup.push(r)}console.log(`\u{1F4E6} Backup created: ${this.backupId}`)}async rollback(){let e=ne.join(this.backupDir,this.backupId);if(!await oe.pathExists(e))throw new Error(`Backup not found: ${this.backupId}`);let t=await _n(`${e}/**/*`,{nodir:!0});for(let n of t){let r=ne.relative(e,n),a=ne.join(this.projectRoot,r);await oe.ensureDir(ne.dirname(a)),await oe.copy(n,a,{overwrite:!0})}console.log(`\u267B\uFE0F Rollback complete: ${this.backupId}`)}async commit(){let e=ne.join(this.backupDir,this.backupId);await oe.pathExists(e)&&await oe.remove(e),console.log("\u2705 Transaction committed")}getBackupId(){return this.backupId}async cleanup(){if(!await oe.pathExists(this.backupDir))return;let e=await oe.readdir(this.backupDir),t=Date.now(),n=10080*60*1e3;for(let r of e){let a=r.match(/backup_(\d+)/);if(a){let i=parseInt(a[1]);t-i>n&&await oe.remove(ne.join(this.backupDir,r))}}}};import Ln from"child_process";import On from"readline";import ut from"chalk";var We=class{timeoutMs;constructor(e=6e4){this.timeoutMs=e}async runScript(e,t,n=!1){if(!n&&!await this.confirm(`Run ${t} script: ${e.command} ${(e.args??[]).join(" ")}?`)){console.log(ut.dim(` Skipping ${t} script.`));return}return new Promise((r,a)=>{let i=Ln.spawn(e.command,e.args??[],{cwd:e.cwd,stdio:["ignore","pipe","pipe"],shell:!0}),s=ut.dim(`[${t}] `);i.stdout?.on("data",l=>{process.stdout.write(s+l.toString())}),i.stderr?.on("data",l=>{process.stderr.write(s+ut.yellow(l.toString()))});let c=setTimeout(()=>{console.warn(ut.yellow(`
20
+ \u26A0 ${t} script timed out after ${this.timeoutMs/1e3}s, sending SIGTERM...`)),i.kill("SIGTERM"),setTimeout(()=>{i.kill("SIGKILL")},5e3)},this.timeoutMs);i.on("close",l=>{clearTimeout(c),l===0||l===null?r():a(new Error(`${t} script exited with code ${l}`))}),i.on("error",l=>{clearTimeout(c),a(l)})})}async runScripts(e,t,n=!1){for(let r of e)await this.runScript(r,t,n)}confirm(e){return new Promise(t=>{let n=On.createInterface({input:process.stdin,output:process.stdout});n.question(`
21
+ ${e} [y/N] `,r=>{n.close(),t(r.toLowerCase()==="y"||r.toLowerCase()==="yes")})})}};import Re from"fs-extra";import Rt from"path";import Dt from"chalk";var ye=class{constructor(e,t){this.projectRoot=e;this.markerService=t}async isModuleInstalled(e){try{let t=await this.findProjectFiles();for(let n of t)try{let r=await Re.readFile(n,"utf-8");if(this.markerService.hasModule(r,e))return!0}catch{}return!1}catch{return!1}}async findProjectFiles(){let{glob:e}=await import("glob"),t=["**/*.ts","**/*.tsx","**/*.js","**/*.jsx"],n=["**/node_modules/**","**/.next/**","**/dist/**","**/build/**"],r=[];for(let a of t){let i=await e(a,{cwd:this.projectRoot,absolute:!0,ignore:n});r.push(...i)}return[...new Set(r)]}async install(e,t){let n=new qe(this.projectRoot);try{let r=Array.from(new Set(e.injections.map(i=>i.file)));await n.backup(r);for(let i of e.injections)await this.injectCode(i);await n.commit();let a=await this.readManifest(this.projectRoot);if(a?.scripts?.postInstall?.length){let i=new We;try{await i.runScripts(a.scripts.postInstall.map(s=>({...s,cwd:this.projectRoot})),"postInstall",!1)}catch(s){let c=s instanceof Error?s.message:String(s);console.warn(Dt.yellow(`
22
+ \u26A0 PostInstall script failed: ${c}`)),console.warn(Dt.dim(" The module is installed. Run the script manually if needed."))}}if(!t?.skipEnv&&a?.env?.length){let{EnvManager:i}=await import("./EnvManager-NMS3NMIE.js"),s=new i,c=a.env.map(l=>({name:l.key,description:l.example??l.key,required:l.required??!1}));await s.injectEnvVars(e.name,c,{projectDir:this.projectRoot,envFile:t?.envFile,skipEnv:t?.skipEnv,skipConfirmation:t?.yes})}}catch(r){let a=r instanceof Error?r.message:String(r);throw console.error(`\u274C Installation failed: ${a}`),console.log("\u{1F504} Rolling back..."),await n.rollback(),r}}async uninstall(e,t){let n=new qe(this.projectRoot);try{let r=Array.from(new Set(e.injections.map(c=>c.file)));await n.backup(r);let{EnvManager:a}=await import("./EnvManager-NMS3NMIE.js");new a().removeEnvVars(e.name,{projectDir:this.projectRoot,skipEnv:t?.skipEnv});let s=await this.readManifest(this.projectRoot);if(s?.scripts?.preRemove?.length){let c=new We;try{await c.runScripts(s.scripts.preRemove.map(l=>({...l,cwd:this.projectRoot})),"preRemove",!1)}catch(l){let d=l instanceof Error?l.message:String(l);console.warn(Dt.yellow(`
23
+ \u26A0 PreRemove script failed: ${d}`))}}for(let c of r)await this.removeCode(c,e.name);await n.commit()}catch(r){let a=r instanceof Error?r.message:String(r);throw console.error(`\u274C Removal failed: ${a}`),console.log("\u{1F504} Rolling back..."),await n.rollback(),r}}async injectCode(e){let t=Rt.join(this.projectRoot,e.file),n=await Re.readFile(t,"utf-8"),r=this.markerService.injectModule(n,e.anchor,e.moduleName||"unnamed",e.code);await Re.writeFile(t,r)}async removeCode(e,t){let n=Rt.join(this.projectRoot,e),r=await Re.readFile(n,"utf-8"),a=this.markerService.removeModule(r,t);await Re.writeFile(n,a)}async readManifest(e){try{let t=await Re.readFile(Rt.join(e,"module.json"),"utf-8");return JSON.parse(t)}catch{return null}}};import pt from"fs-extra";import wo from"path";import Fn from"os";var A=class o{static instance;logPath;buffer=[];constructor(){this.logPath=wo.join(Fn.homedir(),".kaven","telemetry.log")}static getInstance(){return o.instance||(o.instance=new o),o.instance}capture(e,t,n){let r={event:e,timestamp:new Date().toISOString(),metadata:t,duration:n};this.buffer.push(r)}async flush(){if(this.buffer.length!==0)try{let e=wo.dirname(this.logPath);await pt.ensureDir(e);let t=this.buffer.map(n=>JSON.stringify(n)).join(`
24
24
  `)+`
25
- `;await We.appendFile(this.logPath,t,"utf8"),this.buffer=[]}catch(e){console.debug("Erro ao gravar telemetria:",e)}}async getRecentEvents(e=20){if(!await We.pathExists(this.logPath))return[];try{return(await We.readFile(this.logPath,"utf8")).trim().split(`
26
- `).reverse().slice(0,e).map(n=>JSON.parse(n))}catch{return[]}}};async function Ht(o,e){let t=j.getInstance(),n=Date.now();t.capture("cli.module.add.start",{manifestPath:o});let r=e||process.cwd(),a=pn("Preparando instala\xE7\xE3o do m\xF3dulo...").start();try{let i=new W,s=new ye,c=new ae(r,i),l=De.isAbsolute(o)?o:De.join(r,o);if(!await ve.pathExists(l))throw new Error(`Arquivo de manifest n\xE3o encontrado: ${o}`);a.text="Validando manifest...";let d=await s.parse(l);a.text=`Instalando ${d.name}@${d.version}...`,await c.install(d),a.text="Atualizando configura\xE7\xE3o do projeto...",await mn(r,d.name,d.version),a.text="Salvando cache do manifest...";let p=De.join(r,".kaven","modules",d.name);await ve.ensureDir(p),await ve.writeJson(De.join(p,"module.json"),d,{spaces:2}),a.succeed(Gt.green(`M\xF3dulo ${d.name} instalado com sucesso!`)),t.capture("cli.module.add.success",{name:d.name},Date.now()-n),await t.flush()}catch(i){t.capture("cli.module.add.error",{error:i.message},Date.now()-n),await t.flush(),a.fail(Gt.red(`Falha na instala\xE7\xE3o: ${i instanceof Error?i.message:String(i)}`)),process.exit(1)}}async function mn(o,e,t){let n=De.join(o,"kaven.json"),r={modules:{}};await ve.pathExists(n)&&(r=await ve.readJson(n)),r.modules||(r.modules={}),r.modules[e]=t,await ve.writeJson(n,r,{spaces:2})}import lt from"chalk";import dt from"ora";import ut from"path";import ke from"fs-extra";async function qt(o,e){let t=j.getInstance(),n=Date.now();t.capture("cli.module.remove.start",{moduleName:o});let r=e||process.cwd(),a=dt(`Removendo m\xF3dulo ${o}...`).start();try{let i=new W,s=new ae(r,i),c=ut.join(r,"kaven.json");if(!await ke.pathExists(c))throw new Error("Arquivo kaven.json n\xE3o encontrado. Este \xE9 um projeto Kaven?");let l=await ke.readJson(c);if(!l.modules||!l.modules[o])throw new Error(`O m\xF3dulo ${o} n\xE3o est\xE1 instalado.`);let d=ut.join(r,".kaven","modules",o,"module.json");if(!await ke.pathExists(d))throw new Error(`Cache do manifest para ${o} n\xE3o encontrado em ${d}. A remo\xE7\xE3o precisa do manifest original.`);let p=await ke.readJson(d);a.text=`Removendo inje\xE7\xF5es de ${o}...`,await s.uninstall(p),a.text="Atualizando configura\xE7\xE3o do projeto...",delete l.modules[o],await ke.writeJson(c,l,{spaces:2}),await ke.remove(ut.dirname(d)),dt().succeed(lt.green(`M\xF3dulo ${o} removido com sucesso!`)),t.capture("cli.module.remove.success",{moduleName:o},Date.now()-n),await t.flush()}catch(i){t.capture("cli.module.remove.error",{error:i.message},Date.now()-n),await t.flush(),dt().fail(lt.red(`Falha ao remover m\xF3dulo ${o}:`)),a.fail(lt.red(`${i instanceof Error?i.message:String(i)}`)),process.exit(1)}}import C from"chalk";import be from"ora";import Xe from"path";import P from"fs-extra";import Oe from"crypto";import Wt from"os";import{z as ie}from"zod";import q from"fs-extra";import pt from"path";import gn from"os";function zt(o){try{let e=o.split(".");if(e.length!==3)return null;let t=e[1].replace(/-/g,"+").replace(/_/g,"/"),n=t+"=".repeat((4-t.length%4)%4),r=Buffer.from(n,"base64").toString("utf8");return JSON.parse(r)}catch{return null}}function fn(o){let e=Date.now(),t=new Date(o).getTime(),n=Math.max(0,Math.floor((t-e)/1e3));if(n===0)return"expired";let r=Math.floor(n/3600),a=Math.floor(n%3600/60);return r>0?`expires in ${r}h ${a}m`:`expires in ${a}m`}var T=class{configPath;constructor(){this.configPath=pt.join(gn.homedir(),".kaven","auth.json")}async saveTokens(e){let t=pt.dirname(this.configPath);await q.ensureDir(t),await q.writeJson(this.configPath,e,{spaces:2}),process.platform!=="win32"&&await q.chmod(this.configPath,384)}async storeToken(e){let t=pt.dirname(this.configPath);await q.ensureDir(t),await q.writeJson(this.configPath,{token:e},{spaces:2}),process.platform!=="win32"&&await q.chmod(this.configPath,384)}async getAuth(){if(!await q.pathExists(this.configPath))return null;try{let e=await q.readJson(this.configPath);return e.access_token?e:null}catch{return null}}async getToken(){if(!await q.pathExists(this.configPath))return null;try{let e=await q.readJson(this.configPath);return e.access_token?e.access_token:e.token||null}catch{return null}}async getValidToken(){let e=await this.getAuth();if(!e)throw new Error("Not authenticated. Run 'kaven auth login' to authenticate.");let t=new Date(e.expires_at).getTime(),n=Date.now(),r=300*1e3,a=t-n<r,i=n>=t;if(!a)return e.access_token;try{let{MarketplaceClient:s}=await import("./MarketplaceClient-YCFH2VU4.js"),l=await new s(this).refreshToken(e.refresh_token),d={access_token:l.access_token,refresh_token:l.refresh_token,expires_at:l.expires_at,user:e.user};return await this.saveTokens(d),l.access_token}catch{if(!i)return console.warn("[kaven] Warning: Failed to refresh token. Using existing token."),e.access_token;throw new Error("Session expired. Run 'kaven auth login' to re-authenticate.")}}async isAuthenticated(){try{return!!await this.getToken()}catch{return!1}}async logout(){await q.pathExists(this.configPath)&&await q.remove(this.configPath)}async clearToken(){return this.logout()}async getUserInfo(){let e=await this.getAuth();if(!e)return null;let t=zt(e.access_token);return t?{id:t.sub,email:t.email,name:t.githubId}:{id:e.user.githubId,email:e.user.email,name:void 0}}async getDecodedToken(){let e=await this.getAuth();return e?zt(e.access_token):null}async getWhoamiInfo(){let e=await this.getAuth();return e?{email:e.user.email,githubId:e.user.githubId,tier:e.user.tier.charAt(0).toUpperCase()+e.user.tier.slice(1),sessionExpiry:fn(e.expires_at)}:null}};var hn=ie.object({name:ie.string().min(1),slug:ie.string().min(1).regex(/^[a-z0-9-]+$/),version:ie.string().regex(/^\d+\.\d+\.\d+$/),description:ie.string().min(1),author:ie.string().optional(),license:ie.string().optional(),tier:ie.enum(["free","starter","complete","pro"])}),Le=Xe.join(Wt.homedir(),".kaven","signing-key.json");async function yn(){if(await P.pathExists(Le))try{let r=await P.readJson(Le),a=Oe.createPrivateKey({key:Buffer.from(r.privateKey,"base64"),type:"pkcs8",format:"der"}),i=Oe.createPublicKey(a);return{privateKey:a,publicKey:i}}catch{}let{privateKey:o,publicKey:e}=Oe.generateKeyPairSync("ed25519"),t=o.export({type:"pkcs8",format:"der"}),n=e.export({type:"spki",format:"der"});return await P.ensureDir(Xe.dirname(Le)),await P.writeJson(Le,{privateKey:t.toString("base64"),publicKey:n.toString("base64")},{spaces:2}),process.platform!=="win32"&&await P.chmod(Le,384),{privateKey:o,publicKey:e}}async function wn(o){let e=await P.readFile(o);return Oe.createHash("sha256").update(e).digest("hex")}async function vn(o,e){await(await import("tar")).create({gzip:!0,file:e,cwd:o,filter:n=>{let r=n.replace(/\\/g,"/"),a=["node_modules",".git","dist",".env"];for(let i of a)if(r.startsWith(i+"/")||r===i||r.endsWith(".log"))return!1;return!0}},["."])}async function Xt(o){let e=process.cwd(),t=Xe.join(e,"module.json");await P.pathExists(t)||(console.error(C.red("Error: module.json not found in current directory.")),console.error(C.gray("Try: run this command from inside a module directory")),process.exit(1));let n;try{let f=await P.readJson(t),S=hn.safeParse(f);if(!S.success){console.error(C.red("Error: Invalid module.json:"));for(let he of S.error.issues)console.error(C.red(` - ${he.path.join(".")}: ${he.message}`));process.exit(1)}n=S.data}catch(f){console.error(C.red(`Error: Failed to parse module.json: ${f instanceof Error?f.message:String(f)}`)),process.exit(1)}console.log(),console.log(C.bold(`Publishing module: ${n.name} v${n.version}`)),console.log(C.gray(`Slug: ${n.slug} | Tier: ${n.tier}`)),console.log();let r=Xe.join(Wt.tmpdir(),`kaven-${n.slug}-${n.version}.tar.gz`),a=be("Creating module package...").start();try{await vn(e,r);let f=await P.stat(r);a.succeed(`Package created (${(f.size/1024).toFixed(1)} KB)`)}catch(f){a.fail("Failed to create package"),console.error(C.red(f instanceof Error?f.message:String(f))),await P.remove(r).catch(()=>{}),process.exit(1)}let i=be("Computing SHA-256 checksum...").start(),s;try{s=await wn(r),i.succeed(`Checksum: ${s.substring(0,16)}...`)}catch{i.fail("Failed to compute checksum"),await P.remove(r).catch(()=>{}),process.exit(1);return}let c=be("Signing package...").start(),l,d;try{let{privateKey:f,publicKey:S}=await yn();l=Oe.sign(null,Buffer.from(s),f).toString("base64"),d=S.export({type:"spki",format:"der"}).toString("base64"),c.succeed(`Package signed (${l.substring(0,16)}...)`)}catch{c.fail("Failed to sign package"),await P.remove(r).catch(()=>{}),process.exit(1);return}if(o.dryRun){console.log(),console.log(C.yellow("Dry-run mode: skipping upload and release creation.")),console.log(C.green("\u2705 Package validated successfully.")),await P.remove(r).catch(()=>{});return}let p=new T;try{await p.getValidToken()}catch{console.error(C.red("Error: Not authenticated. Run 'kaven auth login' first.")),await P.remove(r).catch(()=>{}),process.exit(1);return}let u=new J(p),m=await P.stat(r),g=be("Getting upload URL...").start(),k,F;try{let f=await u.getUploadUrl(n.slug,n.version,m.size);k=f.uploadUrl,F=f.s3Key,g.succeed("Upload URL received")}catch(f){g.fail("Failed to get upload URL"),console.error(C.red(f instanceof Error?f.message:String(f))),await P.remove(r).catch(()=>{}),process.exit(1);return}let I=be(`Uploading package (${(m.size/1024).toFixed(1)} KB)...`).start();try{let f=await P.readFile(r),S=await fetch(k,{method:"PUT",headers:{"Content-Type":"application/gzip","Content-Length":String(m.size)},body:f});if(!S.ok)throw new Error(`Upload failed: ${S.status} ${S.statusText}`);I.succeed("Package uploaded successfully")}catch(f){I.fail("Upload failed"),console.error(C.red(f instanceof Error?f.message:String(f))),await P.remove(r).catch(()=>{}),process.exit(1);return}let Q=be("Creating release record...").start();try{let f=await u.createRelease({moduleSlug:n.slug,version:n.version,s3Key:F,checksum:s,signature:l,publicKey:d,changelog:o.changelog});Q.succeed(`Release created: ${n.slug}@${f.version} (ID: ${f.id})`)}catch(f){Q.fail("Failed to create release"),console.error(C.red(f instanceof Error?f.message:String(f))),await P.remove(r).catch(()=>{}),process.exit(1);return}await P.remove(r).catch(()=>{}),console.log(),console.log(C.green(`\u2705 Published ${n.name} v${n.version} to the Kaven Marketplace!`)),console.log(C.gray(`View your module at: https://marketplace.kaven.site/modules/${n.slug}`)),console.log(),console.log(C.bold("Next steps:")),console.log(C.gray(" 1. Share your module with the community")),console.log(C.gray(" 2. Monitor installation metrics")),console.log(C.gray(" 3. Update module with 'kaven module publish' when ready"))}import w from"chalk";import Yt from"ora";import xn from"path";import*as Zt from"@inquirer/prompts";import mt from"fs-extra";import kn from"path";var le=[{id:"auth",label:"Auth & Identity",description:"Gest\xE3o de usu\xE1rios, permiss\xF5es e sess\xF5es",models:["User","Role","Capability","AuthSession","AuditLog"],enums:["UserRole"],dependsOn:[]},{id:"billing",label:"Billing",description:"Faturamento, assinaturas e pagamentos",models:["Invoice","Order","Subscription","Plan","Payment","Product"],enums:[],dependsOn:["auth"]},{id:"projects",label:"Projects",description:"Gest\xE3o de projetos e tasks",models:["Project","Task"],enums:["ProjectStatus","TaskStatus","TaskPriority"],dependsOn:["auth"]},{id:"notifications",label:"Notifications",description:"Notifica\xE7\xF5es e prefer\xEAncias de usu\xE1rio",models:["Notification","UserPreference"],enums:[],dependsOn:["auth"]},{id:"marketing-tracking",label:"Marketing Tracking",description:"Observabilidade de an\xFAncios, GTM, GA4 e Meta CAPI",models:["TrackingEvent"],enums:["TrackingSource"],dependsOn:["auth"]}],Fe=o=>`// [KAVEN_MODULE:${o.toUpperCase()} BEGIN]`,Ke=o=>`// [KAVEN_MODULE:${o.toUpperCase()} END]`,bn=/^(\s*)\/\/\s*(.*)$/,xe=class{schemaPath;constructor(e){this.schemaPath=kn.join(e,"packages","database","prisma","schema.extended.prisma")}async exists(){return mt.pathExists(this.schemaPath)}get path(){return this.schemaPath}async readSchema(){return mt.readFile(this.schemaPath,"utf-8")}async writeSchema(e){await mt.writeFile(this.schemaPath,e,"utf-8")}validateMarkers(e,t){let n=Fe(t),r=Ke(t),a=e.includes(n),i=e.includes(r);if(a&&!i)throw new Error(`Marcador \xF3rf\xE3o detectado: Faltando END para o m\xF3dulo "${t}".`);if(!a&&i)throw new Error(`Marcador \xF3rf\xE3o detectado: Faltando BEGIN para o m\xF3dulo "${t}".`);if(!a&&!i)throw new Error(`O m\xF3dulo "${t}" n\xE3o possui uma se\xE7\xE3o marcada no schema.`);if(e.indexOf(n)>e.indexOf(r))throw new Error(`Marcadores invertidos para o m\xF3dulo "${t}".`)}async getModuleStatus(e){let t=await this.readSchema(),n=Fe(e.id),r=Ke(e.id),a=t.includes(n)&&t.includes(r),i=!1;if(a){let s=this.extractBlock(t,e.id);i=s!==null&&this.isBlockActive(s)}else i=e.models.some(s=>this.isModelActive(t,s));return{id:e.id,label:e.label,description:e.description,models:e.models,dependsOn:e.dependsOn,active:i,hasMarkers:a}}async activateModule(e){let t=await this.readSchema();this.validateMarkers(t,e.id);let n=this.uncommentBlock(t,e.id);await this.writeSchema(n)}async deactivateModule(e){let t=await this.readSchema();this.validateMarkers(t,e.id);let n=this.commentBlock(t,e.id);await this.writeSchema(n)}extractBlock(e,t){let n=Fe(t),r=Ke(t),a=e.split(`
25
+ `;await pt.appendFile(this.logPath,t,"utf8"),this.buffer=[]}catch(e){console.debug("Erro ao gravar telemetria:",e)}}async getRecentEvents(e=20){if(!await pt.pathExists(this.logPath))return[];try{return(await pt.readFile(this.logPath,"utf8")).trim().split(`
26
+ `).reverse().slice(0,e).map(n=>JSON.parse(n))}catch{return[]}}};async function ko(o,e){let t=A.getInstance(),n=Date.now();t.capture("cli.module.add.start",{manifestPath:o});let r=e||process.cwd(),a=Un("Preparando instala\xE7\xE3o do m\xF3dulo...").start();try{let i=new ae,s=new Te,c=new ye(r,i),l=Xe.isAbsolute(o)?o:Xe.join(r,o);if(!await De.pathExists(l))throw new Error(`Arquivo de manifest n\xE3o encontrado: ${o}`);a.text="Validando manifest...";let d=await s.parse(l);a.text=`Instalando ${d.name}@${d.version}...`,await c.install(d),a.text="Atualizando configura\xE7\xE3o do projeto...",await Nn(r,d.name,d.version),a.text="Salvando cache do manifest...";let m=Xe.join(r,".kaven","modules",d.name);await De.ensureDir(m),await De.writeJson(Xe.join(m,"module.json"),d,{spaces:2}),a.succeed(vo.green(`M\xF3dulo ${d.name} instalado com sucesso!`)),t.capture("cli.module.add.success",{name:d.name},Date.now()-n),await t.flush()}catch(i){t.capture("cli.module.add.error",{error:i.message},Date.now()-n),await t.flush(),a.fail(vo.red(`Falha na instala\xE7\xE3o: ${i instanceof Error?i.message:String(i)}`)),process.exit(1)}}async function Nn(o,e,t){let n=Xe.join(o,"kaven.json"),r={modules:{}};await De.pathExists(n)&&(r=await De.readJson(n)),r.modules||(r.modules={}),r.modules[e]=t,await De.writeJson(n,r,{spaces:2})}import _t from"chalk";import Lt from"ora";import Ot from"path";import _e from"fs-extra";async function bo(o,e){let t=A.getInstance(),n=Date.now();t.capture("cli.module.remove.start",{moduleName:o});let r=e||process.cwd(),a=Lt(`Removendo m\xF3dulo ${o}...`).start();try{let i=new ae,s=new ye(r,i),c=Ot.join(r,"kaven.json");if(!await _e.pathExists(c))throw new Error("Arquivo kaven.json n\xE3o encontrado. Este \xE9 um projeto Kaven?");let l=await _e.readJson(c);if(!l.modules||!l.modules[o])throw new Error(`O m\xF3dulo ${o} n\xE3o est\xE1 instalado.`);let d=Ot.join(r,".kaven","modules",o,"module.json");if(!await _e.pathExists(d))throw new Error(`Cache do manifest para ${o} n\xE3o encontrado em ${d}. A remo\xE7\xE3o precisa do manifest original.`);let m=await _e.readJson(d);a.text=`Removendo inje\xE7\xF5es de ${o}...`,await s.uninstall(m),a.text="Atualizando configura\xE7\xE3o do projeto...",delete l.modules[o],await _e.writeJson(c,l,{spaces:2}),await _e.remove(Ot.dirname(d)),Lt().succeed(_t.green(`M\xF3dulo ${o} removido com sucesso!`)),t.capture("cli.module.remove.success",{moduleName:o},Date.now()-n),await t.flush()}catch(i){t.capture("cli.module.remove.error",{error:i.message},Date.now()-n),await t.flush(),Lt().fail(_t.red(`Falha ao remover m\xF3dulo ${o}:`)),a.fail(_t.red(`${i instanceof Error?i.message:String(i)}`)),process.exit(1)}}import I from"fs-extra";import U from"path";import Xn from"os";import*as Co from"tar";import*as X from"@clack/prompts";import N from"picocolors";import re from"fs-extra";import Ft from"path";import Kn from"os";function xo(o){try{let e=o.split(".");if(e.length!==3)return null;let t=e[1].replace(/-/g,"+").replace(/_/g,"/"),n=t+"=".repeat((4-t.length%4)%4),r=Buffer.from(n,"base64").toString("utf8");return JSON.parse(r)}catch{return null}}function Vn(o){let e=Date.now(),t=new Date(o).getTime(),n=Math.max(0,Math.floor((t-e)/1e3));if(n===0)return"expired";let r=Math.floor(n/3600),a=Math.floor(n%3600/60);return r>0?`expires in ${r}h ${a}m`:`expires in ${a}m`}var P=class{configPath;constructor(){this.configPath=Ft.join(Kn.homedir(),".kaven","auth.json")}async saveTokens(e){let t=Ft.dirname(this.configPath);await re.ensureDir(t),await re.writeJson(this.configPath,e,{spaces:2}),process.platform!=="win32"&&await re.chmod(this.configPath,384)}async storeToken(e){let t=Ft.dirname(this.configPath);await re.ensureDir(t),await re.writeJson(this.configPath,{token:e},{spaces:2}),process.platform!=="win32"&&await re.chmod(this.configPath,384)}async getAuth(){if(!await re.pathExists(this.configPath))return null;try{let e=await re.readJson(this.configPath);return e.access_token?e:null}catch{return null}}async getToken(){if(!await re.pathExists(this.configPath))return null;try{let e=await re.readJson(this.configPath);return e.access_token?e.access_token:e.token||null}catch{return null}}async getValidToken(){let e=await this.getAuth();if(!e)throw new Error("Not authenticated. Run 'kaven auth login' to authenticate.");let t=new Date(e.expires_at).getTime(),n=Date.now(),r=300*1e3,a=t-n<r,i=n>=t;if(!a)return e.access_token;try{let{MarketplaceClient:s}=await import("./MarketplaceClient-YCFH2VU4.js"),l=await new s(this).refreshToken(e.refresh_token),d={access_token:l.access_token,refresh_token:l.refresh_token,expires_at:l.expires_at,user:e.user};return await this.saveTokens(d),l.access_token}catch{if(!i)return console.warn("[kaven] Warning: Failed to refresh token. Using existing token."),e.access_token;throw new Error("Session expired. Run 'kaven auth login' to re-authenticate.")}}async isAuthenticated(){try{return!!await this.getToken()}catch{return!1}}async logout(){await re.pathExists(this.configPath)&&await re.remove(this.configPath)}async clearToken(){return this.logout()}async getUserInfo(){let e=await this.getAuth();if(!e)return null;let t=xo(e.access_token);return t?{id:t.sub,email:t.email,name:t.githubId}:{id:e.user.githubId,email:e.user.email,name:void 0}}async getDecodedToken(){let e=await this.getAuth();return e?xo(e.access_token):null}async getWhoamiInfo(){let e=await this.getAuth();return e?{email:e.user.email,githubId:e.user.githubId,tier:e.user.tier.charAt(0).toUpperCase()+e.user.tier.slice(1),sessionExpiry:Vn(e.expires_at)}:null}};import{spawn as Bn}from"child_process";import*as Ye from"fs-extra";var mt=class{async performMerge(e,t,n){if(!await Ye.pathExists(t))throw new Error("Baseline cache file missing: "+t+". Cannot perform safe merge.");return await Ye.pathExists(e)?new Promise((r,a)=>{let i=Bn("git",["merge-file","-L","Your Modifications (OURS)","-L","Original Version (BASE)","-L","Kaven Update (THEIRS)",e,t,n]),s="";i.stdout.on("data",c=>{s+=c.toString()}),i.stderr.on("data",c=>{s+=c.toString()}),i.on("close",c=>{c===0?r({success:!0,conflicts:!1,output:s}):c!==null&&c>0?r({success:!0,conflicts:!0,output:s}):a(new Error("Git merge-file failed critically: "+s))})}):(await Ye.copy(n,e),{success:!0,conflicts:!1,output:"New file copied"})}};import ft from"crypto";import Jn from"fs-extra";async function zn(o){let e=await Jn.readFile(o);return ft.createHash("sha256").update(e).digest("hex")}var Gn=/^[0-9a-fA-F]+$/;function Hn(o){return Gn.test(o)&&o.length===128?Buffer.from(o,"hex"):Buffer.from(o,"base64")}function qn(o,e,t){try{let n=ft.createPublicKey({key:Buffer.from(t,"base64"),type:"spki",format:"der"}),r=Hn(e);return ft.verify(null,Buffer.from(o),n,r)?!0:ft.verify(null,Buffer.from(o+`
27
+ `),n,r)}catch{return!1}}async function gt(o){let e=await zn(o.filePath);if(e!==o.expectedChecksum)throw new Ge(`Checksum mismatch: expected ${o.expectedChecksum.substring(0,16)}..., got ${e.substring(0,16)}...`);if(!qn(o.expectedChecksum,o.signature,o.publicKeyBase64))throw new Ge("Ed25519 signature verification failed. The package may have been tampered with.")}import Le from"fs-extra";import Ut from"path";var Nt=".kaven/cache/modules";function Wn(o,e){let t=o.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++)if((t[r]??0)!==(n[r]??0))return(t[r]??0)-(n[r]??0);return 0}async function ht(o,e,t,n){let r=Ut.join(n,Nt,`${o}-${e}`);await Le.ensureDir(r),await Le.copy(t,r)}async function yt(o,e){let t=Ut.join(e,Nt);if(!await Le.pathExists(t))return null;let r=(await Le.readdir(t)).filter(i=>{let s=i.lastIndexOf("-");return s>0&&i.slice(0,s)===o});if(r.length===0)return null;r.sort((i,s)=>{let c=i.slice(i.lastIndexOf("-")+1),l=s.slice(s.lastIndexOf("-")+1);return Wn(c,l)});let a=r[0];return a.slice(a.lastIndexOf("-")+1)}function Kt(o,e,t){return Ut.join(t,Nt,`${o}-${e}`)}async function Eo(o,e,t){let n=Kt(o,e,t);await Le.pathExists(n)&&await Le.remove(n)}var Yn={x:Co.x},K={intro:X.intro,outro:X.outro,spinner:X.spinner,confirm:X.confirm,select:X.select,isCancel:X.isCancel,log:X.log};function So(o){return o.filter(e=>{let t=U.normalize(e);return!t.startsWith("..")&&!U.isAbsolute(t)})}async function Zn(){let o=U.join(Xn.tmpdir(),`kaven-update-${Date.now()}`);return await I.ensureDir(o),o}async function Qn(o,e){let t=U.join(o,".kaven","conflicts.json");if(!await I.pathExists(t))return null;try{let n=await I.readJson(t);if(n.module===e)return n}catch{}return null}async function Ze(o,e,t={}){let n=A.getInstance(),r=Date.now(),a=e??process.cwd();if(K.intro(N.bold(N.cyan("kaven module update"))),!o&&(o=await tr(a),!o)){K.outro(N.yellow("Nenhum m\xF3dulo selecionado."));return}n.capture("cli.module.update.start",{slug:o});let i;try{let s=await Qn(a,o);if(s){let b=await K.confirm({message:N.yellow(`Conflitos pendentes encontrados do update ${s.fromVersion}\u2192${s.toVersion}. Deseja tentar novamente?`)});if(K.isCancel(b)||!b){K.outro(N.yellow("Update cancelado. Resolva os conflitos manualmente e rode novamente."));return}await I.remove(U.join(a,".kaven","conflicts.json"))}let c=await yt(o,a);c||(K.outro(N.red(`M\xF3dulo '${o}' n\xE3o est\xE1 instalado. Use 'kaven marketplace install ${o}' primeiro.`)),process.exit(1));let l=K.spinner();l.start(`Verificando vers\xE3o mais recente de '${o}'...`);let d=new P,m=new V(d);try{await d.getValidToken()}catch{l.stop("Autentica\xE7\xE3o necess\xE1ria."),K.outro(N.red("Execute: kaven auth login")),process.exit(1)}let p=await m.getModule(o),u=p.latestVersion??p.releases?.[0]?.version;if(u||(l.stop(),K.outro(N.red(`Nenhuma vers\xE3o publicada encontrada para '${o}'.`)),process.exit(1)),l.stop(`Vers\xE3o instalada: ${N.bold(c)} \u2014 \xDAltima vers\xE3o: ${N.bold(u)}`),c===u){K.outro(N.green(`\u2713 '${o}' j\xE1 est\xE1 na vers\xE3o mais recente (${u}).`)),n.capture("cli.module.update.already_latest",{slug:o,version:u},Date.now()-r),await n.flush();return}l.start(`Baixando '${o}@${u}'...`);let g=await m.createDownloadToken(o,u);i=await Zn();let k=U.join(i,"module.tar.gz"),C=U.join(i,"extracted");await I.ensureDir(C);let F=await m.resolveUrl(g.downloadUrl),q=await fetch(F);if(!q.ok||!q.body)throw new Error(`Download falhou: ${q.status} ${q.statusText}`);let f=I.createWriteStream(k),$=q.body.getReader();if(await new Promise((b,M)=>{(async()=>{try{let he=!0;for(;he;){let{done:Ee,value:jt}=await $.read();Ee?(f.end(),he=!1):f.write(jt)||await new Promise(It=>f.once("drain",It))}f.once("finish",b),f.once("error",M)}catch(he){M(he)}})()}),l.stop(`Download conclu\xEDdo: ${o}@${u}`),!t.skipVerify){l.start(`Verificando assinatura de ${o}@${u}...`);let b=await m.getReleaseInfo(o,u);b.checksum&&b.signature&&b.publicKey?(await gt({filePath:k,expectedChecksum:b.checksum,signature:b.signature,publicKeyBase64:b.publicKey}),l.stop(`Assinatura verificada: ${o}@${u}`)):l.stop(`Sem dados de assinatura para ${o}@${u} \u2014 verifica\xE7\xE3o ignorada`)}l.start("Extraindo arquivos..."),await Yn.x({file:k,cwd:C}),l.stop("Extra\xE7\xE3o completa.");let le=U.join(C,"module.json");if(!await I.pathExists(le))throw new Error(`module.json n\xE3o encontrado no pacote de '${o}@${u}'`);let ze=await I.readJson(le),be=So(ze.mergeable??[]),At=So(ze.copyOnly??[]);l.start(`Cacheando baseline de ${o}@${u}...`),await ht(o,u,C,a),l.stop("Baseline cacheado.");let co=Kt(o,c,a),st=new mt,xe=[];for(let b of be){let M=U.join(a,b),ge=U.join(co,b),he=U.join(C,b);if(!await I.pathExists(he))continue;l.start(`Mergeando ${b}...`),(await st.performMerge(M,ge,he)).conflicts?(xe.push(b),l.stop(N.yellow(` Conflito em ${b}`))):l.stop(N.green(` \u2713 ${b}`))}for(let b of At){let M=U.join(C,b),ge=U.join(a,b);await I.pathExists(M)&&(l.start(`Copiando ${b}...`),await I.ensureDir(U.dirname(ge)),await I.copy(M,ge,{overwrite:!0}),l.stop(N.green(` \u2713 ${b} (sobrescrito)`)))}if(xe.length>0){let b={module:o,fromVersion:c,toVersion:u,timestamp:new Date().toISOString(),conflicts:xe};await I.ensureDir(U.join(a,".kaven")),await I.writeJson(U.join(a,".kaven","conflicts.json"),b,{spaces:2}),K.outro(N.red(`Update parcial \u2014 ${xe.length} conflito(s) detectado(s):
28
+ `+xe.map(M=>` \u2022 ${M}`).join(`
29
+ `)+`
30
+
31
+ Resolva os conflitos (marcadores git <<<<<<< / ======= / >>>>>>>), depois rode 'kaven module update ${o}' novamente.`)),n.capture("cli.module.update.conflicts",{slug:o,fromVersion:c,toVersion:u,conflictCount:xe.length},Date.now()-r),await n.flush();return}await er(a,o,u),await Eo(o,c,a),K.outro(N.green(`\u2713 '${o}' atualizado de ${c} \u2192 ${u}`)),n.capture("cli.module.update.success",{slug:o,fromVersion:c,toVersion:u},Date.now()-r),await n.flush()}catch(s){let c=de(s);K.outro(N.red(`Falha ao atualizar '${o}': ${c.message}`)),n.capture("cli.module.update.error",{slug:o,error:c.message},Date.now()-r),await n.flush(),process.exit(1)}finally{i&&await I.remove(i).catch(()=>{})}}async function er(o,e,t){let n=U.join(o,"kaven.json"),r={};await I.pathExists(n)&&(r=await I.readJson(n)),(!r.modules||typeof r.modules!="object"||Array.isArray(r.modules))&&(r.modules={}),r.modules[e]=t,await I.writeJson(n,r,{spaces:2})}async function tr(o){let e=U.join(o,".kaven","cache","modules");if(!await I.pathExists(e)){K.log.warn("Nenhum m\xF3dulo instalado encontrado.");return}let t=await I.readdir(e);if(t.length===0){K.log.warn("Nenhum m\xF3dulo instalado encontrado.");return}let n=t.map(a=>{let i=a.lastIndexOf("-"),s=a.slice(0,i),c=a.slice(i+1);return{value:s,label:`${s} (${c})`}}),r=await K.select({message:"Selecione o m\xF3dulo para atualizar:",options:n});if(!K.isCancel(r))return r}import T from"chalk";import Oe from"ora";import wt from"path";import R from"fs-extra";import et from"crypto";import $o from"os";import{z as we}from"zod";var or=we.object({name:we.string().min(1),slug:we.string().min(1).regex(/^[a-z0-9-]+$/),version:we.string().regex(/^\d+\.\d+\.\d+$/),description:we.string().min(1),author:we.string().optional(),license:we.string().optional(),tier:we.enum(["free","starter","complete","pro"])}),Qe=wt.join($o.homedir(),".kaven","signing-key.json");async function nr(){if(await R.pathExists(Qe))try{let r=await R.readJson(Qe),a=et.createPrivateKey({key:Buffer.from(r.privateKey,"base64"),type:"pkcs8",format:"der"}),i=et.createPublicKey(a);return{privateKey:a,publicKey:i}}catch{}let{privateKey:o,publicKey:e}=et.generateKeyPairSync("ed25519"),t=o.export({type:"pkcs8",format:"der"}),n=e.export({type:"spki",format:"der"});return await R.ensureDir(wt.dirname(Qe)),await R.writeJson(Qe,{privateKey:t.toString("base64"),publicKey:n.toString("base64")},{spaces:2}),process.platform!=="win32"&&await R.chmod(Qe,384),{privateKey:o,publicKey:e}}async function rr(o){let e=await R.readFile(o);return et.createHash("sha256").update(e).digest("hex")}async function ar(o,e){await(await import("tar")).create({gzip:!0,file:e,cwd:o,filter:n=>{let r=n.replace(/\\/g,"/"),a=["node_modules",".git","dist",".env"];for(let i of a)if(r.startsWith(i+"/")||r===i||r.endsWith(".log"))return!1;return!0}},["."])}async function Po(o){let e=process.cwd(),t=wt.join(e,"module.json");await R.pathExists(t)||(console.error(T.red("Error: module.json not found in current directory.")),console.error(T.gray("Try: run this command from inside a module directory")),process.exit(1));let n;try{let f=await R.readJson(t),$=or.safeParse(f);if(!$.success){console.error(T.red("Error: Invalid module.json:"));for(let le of $.error.issues)console.error(T.red(` - ${le.path.join(".")}: ${le.message}`));process.exit(1)}n=$.data}catch(f){console.error(T.red(`Error: Failed to parse module.json: ${f instanceof Error?f.message:String(f)}`)),process.exit(1)}console.log(),console.log(T.bold(`Publishing module: ${n.name} v${n.version}`)),console.log(T.gray(`Slug: ${n.slug} | Tier: ${n.tier}`)),console.log();let r=wt.join($o.tmpdir(),`kaven-${n.slug}-${n.version}.tar.gz`),a=Oe("Creating module package...").start();try{await ar(e,r);let f=await R.stat(r);a.succeed(`Package created (${(f.size/1024).toFixed(1)} KB)`)}catch(f){a.fail("Failed to create package"),console.error(T.red(f instanceof Error?f.message:String(f))),await R.remove(r).catch(()=>{}),process.exit(1)}let i=Oe("Computing SHA-256 checksum...").start(),s;try{s=await rr(r),i.succeed(`Checksum: ${s.substring(0,16)}...`)}catch{i.fail("Failed to compute checksum"),await R.remove(r).catch(()=>{}),process.exit(1);return}let c=Oe("Signing package...").start(),l,d;try{let{privateKey:f,publicKey:$}=await nr();l=et.sign(null,Buffer.from(s),f).toString("base64"),d=$.export({type:"spki",format:"der"}).toString("base64"),c.succeed(`Package signed (${l.substring(0,16)}...)`)}catch{c.fail("Failed to sign package"),await R.remove(r).catch(()=>{}),process.exit(1);return}if(o.dryRun){console.log(),console.log(T.yellow("Dry-run mode: skipping upload and release creation.")),console.log(T.green("\u2705 Package validated successfully.")),await R.remove(r).catch(()=>{});return}let m=new P;try{await m.getValidToken()}catch{console.error(T.red("Error: Not authenticated. Run 'kaven auth login' first.")),await R.remove(r).catch(()=>{}),process.exit(1);return}let p=new V(m),u=await R.stat(r),g=Oe("Getting upload URL...").start(),k,C;try{let f=await p.getUploadUrl(n.slug,n.version,u.size);k=f.uploadUrl,C=f.s3Key,g.succeed("Upload URL received")}catch(f){g.fail("Failed to get upload URL"),console.error(T.red(f instanceof Error?f.message:String(f))),await R.remove(r).catch(()=>{}),process.exit(1);return}let F=Oe(`Uploading package (${(u.size/1024).toFixed(1)} KB)...`).start();try{let f=await R.readFile(r),$=await fetch(k,{method:"PUT",headers:{"Content-Type":"application/gzip","Content-Length":String(u.size)},body:f});if(!$.ok)throw new Error(`Upload failed: ${$.status} ${$.statusText}`);F.succeed("Package uploaded successfully")}catch(f){F.fail("Upload failed"),console.error(T.red(f instanceof Error?f.message:String(f))),await R.remove(r).catch(()=>{}),process.exit(1);return}let q=Oe("Creating release record...").start();try{let f=await p.createRelease({moduleSlug:n.slug,version:n.version,s3Key:C,checksum:s,signature:l,publicKey:d,changelog:o.changelog});q.succeed(`Release created: ${n.slug}@${f.version} (ID: ${f.id})`)}catch(f){q.fail("Failed to create release"),console.error(T.red(f instanceof Error?f.message:String(f))),await R.remove(r).catch(()=>{}),process.exit(1);return}await R.remove(r).catch(()=>{}),console.log(),console.log(T.green(`\u2705 Published ${n.name} v${n.version} to the Kaven Marketplace!`)),console.log(T.gray(`View your module at: https://marketplace.kaven.site/modules/${n.slug}`)),console.log(),console.log(T.bold("Next steps:")),console.log(T.gray(" 1. Share your module with the community")),console.log(T.gray(" 2. Monitor installation metrics")),console.log(T.gray(" 3. Update module with 'kaven module publish' when ready"))}import w from"chalk";import Mo from"ora";import cr from"path";import*as Ao from"@inquirer/prompts";import Vt from"fs-extra";import ir from"path";var Se=[{id:"auth",label:"Auth & Identity",description:"Gest\xE3o de usu\xE1rios, permiss\xF5es e sess\xF5es",models:["User","Role","Capability","AuthSession","AuditLog"],enums:["UserRole"],dependsOn:[]},{id:"billing",label:"Billing",description:"Faturamento, assinaturas e pagamentos",models:["Invoice","Order","Subscription","Plan","Payment","Product"],enums:[],dependsOn:["auth"]},{id:"projects",label:"Projects",description:"Gest\xE3o de projetos e tasks",models:["Project","Task"],enums:["ProjectStatus","TaskStatus","TaskPriority"],dependsOn:["auth"]},{id:"notifications",label:"Notifications",description:"Notifica\xE7\xF5es e prefer\xEAncias de usu\xE1rio",models:["Notification","UserPreference"],enums:[],dependsOn:["auth"]},{id:"marketing-tracking",label:"Marketing Tracking",description:"Observabilidade de an\xFAncios, GTM, GA4 e Meta CAPI",models:["TrackingEvent"],enums:["TrackingSource"],dependsOn:["auth"]}],tt=o=>`// [KAVEN_MODULE:${o.toUpperCase()} BEGIN]`,ot=o=>`// [KAVEN_MODULE:${o.toUpperCase()} END]`,sr=/^(\s*)\/\/\s*(.*)$/,Fe=class{schemaPath;constructor(e){this.schemaPath=ir.join(e,"packages","database","prisma","schema.extended.prisma")}async exists(){return Vt.pathExists(this.schemaPath)}get path(){return this.schemaPath}async readSchema(){return Vt.readFile(this.schemaPath,"utf-8")}async writeSchema(e){await Vt.writeFile(this.schemaPath,e,"utf-8")}validateMarkers(e,t){let n=tt(t),r=ot(t),a=e.includes(n),i=e.includes(r);if(a&&!i)throw new Error(`Marcador \xF3rf\xE3o detectado: Faltando END para o m\xF3dulo "${t}".`);if(!a&&i)throw new Error(`Marcador \xF3rf\xE3o detectado: Faltando BEGIN para o m\xF3dulo "${t}".`);if(!a&&!i)throw new Error(`O m\xF3dulo "${t}" n\xE3o possui uma se\xE7\xE3o marcada no schema.`);if(e.indexOf(n)>e.indexOf(r))throw new Error(`Marcadores invertidos para o m\xF3dulo "${t}".`)}async getModuleStatus(e){let t=await this.readSchema(),n=tt(e.id),r=ot(e.id),a=t.includes(n)&&t.includes(r),i=!1;if(a){let s=this.extractBlock(t,e.id);i=s!==null&&this.isBlockActive(s)}else i=e.models.some(s=>this.isModelActive(t,s));return{id:e.id,label:e.label,description:e.description,models:e.models,dependsOn:e.dependsOn,active:i,hasMarkers:a}}async activateModule(e){let t=await this.readSchema();this.validateMarkers(t,e.id);let n=this.uncommentBlock(t,e.id);await this.writeSchema(n)}async deactivateModule(e){let t=await this.readSchema();this.validateMarkers(t,e.id);let n=this.commentBlock(t,e.id);await this.writeSchema(n)}extractBlock(e,t){let n=tt(t),r=ot(t),a=e.split(`
27
32
  `),i=-1,s=-1;for(let c=0;c<a.length;c++)if(a[c].includes(n)&&(i=c),a[c].includes(r)&&i!==-1){s=c;break}return i===-1||s===-1?null:a.slice(i+1,s).join(`
28
33
  `)}isBlockActive(e){return e.split(`
29
34
  `).some(t=>{let n=t.trim();return n.length>0&&!n.startsWith("//")&&!n.startsWith("/*")&&!n.startsWith("*")})}isModelActive(e,t){let n=e.split(`
30
- `);for(let r of n)if(r.trim().startsWith(`model ${t}`)&&!r.trimStart().startsWith("//"))return!0;return!1}commentBlock(e,t){let n=Fe(t),r=Ke(t),a=e.split(`
35
+ `);for(let r of n)if(r.trim().startsWith(`model ${t}`)&&!r.trimStart().startsWith("//"))return!0;return!1}commentBlock(e,t){let n=tt(t),r=ot(t),a=e.split(`
31
36
  `),i=!1,s=[];for(let c of a){if(c.includes(n)){i=!0,s.push(c);continue}if(c.includes(r)){i=!1,s.push(c);continue}if(i){let l=c.trim();l.length===0||l.startsWith("//")?s.push(c):s.push(`// ${c}`)}else s.push(c)}return s.join(`
32
- `)}uncommentBlock(e,t){let n=Fe(t),r=Ke(t),a=e.split(`
33
- `),i=!1,s=[];for(let c of a){if(c.includes(n)){i=!0,s.push(c);continue}if(c.includes(r)){i=!1,s.push(c);continue}if(i){let l=c.match(bn);l?s.push(l[1]+l[2]):s.push(c)}else s.push(c)}return s.join(`
34
- `)}};var En={confirm:Zt.confirm};function gt(o){return le.find(e=>e.id===o.toLowerCase())}function Qt(o,e){if(!o){let t=xn.join(e,"packages","database","prisma","schema.extended.prisma");console.error(w.red(`
35
- Error: Schema not found at: ${t}`)),console.error(w.gray("Make sure you are in the root of a valid Kaven project.")),process.exit(1)}}async function ft(o,e,t={}){let n=j.getInstance(),r=Date.now();n.capture("cli.module.activate.start",{moduleName:o});let a=e??process.cwd(),i=new xe(a),s=Yt(`Activating module ${o}...`).start();try{let c=await i.exists();s.stop(),Qt(c,a);let l=gt(o);if(l||(console.error(w.red(`
36
- Unknown module: "${o}".`)),console.error(w.gray(`Available modules: ${le.map(p=>p.id).join(", ")}`)),process.exit(1)),l.dependsOn.length>0){s.start("Checking dependencies...");let p=[];for(let m of l.dependsOn){let g=gt(m);if(!g)continue;let k=await i.getModuleStatus(g);p.push(k)}let u=p.filter(m=>!m.active);if(u.length>0)if(s.stop(),t.withDeps)for(let m of u)await ft(m.id,e,{...t,withDeps:!0});else console.error(w.red(`
37
- Inactive dependencies for "${o}": ${u.map(m=>m.id).join(", ")}`)),console.error(w.gray(`Activate them first:
38
- ${u.map(m=>` kaven module activate ${m.id}`).join(`
37
+ `)}uncommentBlock(e,t){let n=tt(t),r=ot(t),a=e.split(`
38
+ `),i=!1,s=[];for(let c of a){if(c.includes(n)){i=!0,s.push(c);continue}if(c.includes(r)){i=!1,s.push(c);continue}if(i){let l=c.match(sr);l?s.push(l[1]+l[2]):s.push(c)}else s.push(c)}return s.join(`
39
+ `)}};var lr={confirm:Ao.confirm};function Bt(o){return Se.find(e=>e.id===o.toLowerCase())}function jo(o,e){if(!o){let t=cr.join(e,"packages","database","prisma","schema.extended.prisma");console.error(w.red(`
40
+ Error: Schema not found at: ${t}`)),console.error(w.gray("Make sure you are in the root of a valid Kaven project.")),process.exit(1)}}async function Jt(o,e,t={}){let n=A.getInstance(),r=Date.now();n.capture("cli.module.activate.start",{moduleName:o});let a=e??process.cwd(),i=new Fe(a),s=Mo(`Activating module ${o}...`).start();try{let c=await i.exists();s.stop(),jo(c,a);let l=Bt(o);if(l||(console.error(w.red(`
41
+ Unknown module: "${o}".`)),console.error(w.gray(`Available modules: ${Se.map(m=>m.id).join(", ")}`)),process.exit(1)),l.dependsOn.length>0){s.start("Checking dependencies...");let m=[];for(let u of l.dependsOn){let g=Bt(u);if(!g)continue;let k=await i.getModuleStatus(g);m.push(k)}let p=m.filter(u=>!u.active);if(p.length>0)if(s.stop(),t.withDeps)for(let u of p)await Jt(u.id,e,{...t,withDeps:!0});else console.error(w.red(`
42
+ Inactive dependencies for "${o}": ${p.map(u=>u.id).join(", ")}`)),console.error(w.gray(`Activate them first:
43
+ ${p.map(u=>` kaven module activate ${u.id}`).join(`
39
44
  `)}`)),console.log(w.gray(`
40
45
  Or use --with-deps to activate them automatically.`)),process.exit(1);s.stop()}if((await i.getModuleStatus(l)).active){console.log(w.yellow(`
41
- Module "${l.label}" is already active.`));return}if(!t.yes&&!await En.confirm({message:`Activate module "${l.label}"? This will uncomment ${l.models.length} model(s) in the schema.`,default:!0})){console.log(w.gray(`
46
+ Module "${l.label}" is already active.`));return}if(!t.yes&&!await lr.confirm({message:`Activate module "${l.label}"? This will uncomment ${l.models.length} model(s) in the schema.`,default:!0})){console.log(w.gray(`
42
47
  Activation aborted.`));return}if(t.dryRun){console.log(w.bold(`
43
48
  --- DRY RUN: Activating ${l.label} ---`)),console.log(`Models to uncomment: ${l.models.join(", ")}`),l.enums.length>0&&console.log(`Enums to uncomment: ${l.enums.join(", ")}`);return}s.start(`Uncommenting ${l.label} models in schema...`),await i.activateModule(l),s.succeed(w.green(`
44
- Module ${l.label} activated. ${l.models.length} models added: ${l.models.join(", ")}`)),t.skipMigrate||console.log(w.cyan("\nNext step: Run `pnpm db:generate && pnpm db:migrate` to apply changes.")),n.capture("cli.module.activate.success",{moduleName:l.id,models:l.models.length},Date.now()-r),await n.flush()}catch(c){let l=Te(c);s.fail(w.red(`Failed to activate module: ${l.message}`)),n.capture("cli.module.activate.error",{moduleName:o,error:l.message},Date.now()-r),await n.flush(),process.exit(1)}}async function eo(o,e,t={}){let n=j.getInstance(),r=Date.now();n.capture("cli.module.deactivate.start",{moduleName:o});let a=e??process.cwd(),i=new xe(a),s=Yt(`Deactivating module ${o}...`).start();try{let c=await i.exists();s.stop(),Qt(c,a);let l=gt(o);l||(console.error(w.red(`
45
- Unknown module: "${o}".`)),console.error(w.gray(`Available modules: ${le.map(u=>u.id).join(", ")}`)),process.exit(1)),s.start("Checking reverse dependencies...");let d=[];for(let u of le){if(u.id===l.id||!u.dependsOn.includes(l.id))continue;(await i.getModuleStatus(u)).active&&d.push(u.id)}if(d.length>0&&(s.stop(),console.error(w.red(`
49
+ Module ${l.label} activated. ${l.models.length} models added: ${l.models.join(", ")}`)),t.skipMigrate||console.log(w.cyan("\nNext step: Run `pnpm db:generate && pnpm db:migrate` to apply changes.")),n.capture("cli.module.activate.success",{moduleName:l.id,models:l.models.length},Date.now()-r),await n.flush()}catch(c){let l=de(c);s.fail(w.red(`Failed to activate module: ${l.message}`)),n.capture("cli.module.activate.error",{moduleName:o,error:l.message},Date.now()-r),await n.flush(),process.exit(1)}}async function Io(o,e,t={}){let n=A.getInstance(),r=Date.now();n.capture("cli.module.deactivate.start",{moduleName:o});let a=e??process.cwd(),i=new Fe(a),s=Mo(`Deactivating module ${o}...`).start();try{let c=await i.exists();s.stop(),jo(c,a);let l=Bt(o);l||(console.error(w.red(`
50
+ Unknown module: "${o}".`)),console.error(w.gray(`Available modules: ${Se.map(p=>p.id).join(", ")}`)),process.exit(1)),s.start("Checking reverse dependencies...");let d=[];for(let p of Se){if(p.id===l.id||!p.dependsOn.includes(l.id))continue;(await i.getModuleStatus(p)).active&&d.push(p.id)}if(d.length>0&&(s.stop(),console.error(w.red(`
46
51
  Cannot deactivate "${o}": the following active modules depend on it:`)),console.error(w.gray(` ${d.join(", ")}`)),console.error(w.gray(`Deactivate them first:
47
- ${d.map(u=>` kaven module deactivate ${u}`).join(`
52
+ ${d.map(p=>` kaven module deactivate ${p}`).join(`
48
53
  `)}`)),process.exit(1)),!(await i.getModuleStatus(l)).active){s.stop(),console.log(w.yellow(`
49
54
  Module "${l.label}" is already inactive.`));return}if(t.dryRun){s.stop(),console.log(w.bold(`
50
55
  --- DRY RUN: Deactivating ${l.label} ---`)),console.log(`Models to comment: ${l.models.join(", ")}`);return}s.start(`Commenting ${l.label} models in schema...`),await i.deactivateModule(l),s.succeed(w.green(`
51
- Module ${l.label} deactivated successfully.`)),t.skipMigrate||console.log(w.cyan("\nNext step: Run `pnpm db:generate && pnpm db:migrate` to apply changes.")),n.capture("cli.module.deactivate.success",{moduleName:l.id},Date.now()-r),await n.flush()}catch(c){let l=Te(c);s.fail(w.red(`Failed to deactivate module: ${l.message}`)),n.capture("cli.module.deactivate.error",{moduleName:o,error:l.message},Date.now()-r),await n.flush(),process.exit(1)}}async function to(o){let e=o??process.cwd(),t=new xe(e),n=await t.exists(),r={module:18,status:10,models:44,deps:20},a=w.bold("Module".padEnd(r.module))+w.bold("Status".padEnd(r.status))+w.bold("Models".padEnd(r.models))+w.bold("Depends on"),i="\u2500".repeat(r.module+r.status+r.models+r.deps);if(console.log(),console.log(w.blue(`Kaven Schema Modules
52
- `)),console.log(a),console.log(w.gray(i)),!n){for(let s of le){let c=s.id.padEnd(r.module),l=w.gray("unknown".padEnd(r.status)),d=s.models.join(", ").padEnd(r.models),p=s.dependsOn.length>0?s.dependsOn.join(", "):"\u2014";console.log(`${c}${l}${d}${p}`)}console.log(),console.log(w.yellow("Warning: schema.extended.prisma not found. Status cannot be determined.")),console.log(w.gray("Run this command in the root of a Kaven project to see real status."));return}for(let s of le){let c=await t.getModuleStatus(s),l=s.id.padEnd(r.module),d=c.active?"active":"inactive",p=c.active?w.green(d.padEnd(r.status)):w.gray(d.padEnd(r.status)),u=s.models.join(", ").padEnd(r.models),m=s.dependsOn.length>0?s.dependsOn.join(", "):"\u2014";console.log(`${l}${p}${u}${m}`)}console.log(),console.log(w.gray("To activate: kaven module activate <name> | To deactivate: kaven module deactivate <name>"))}import B from"chalk";import oo from"ora";import Sn from"open";function Cn(o){return new Promise(e=>setTimeout(e,o))}async function Pn(o,e,t,n,r){let a=Date.now()+t*1e3,i=[5,10,15,20],s=0,c=n;for(;Date.now()<a;){let l=Math.ceil((a-Date.now())/1e3),d=Math.floor(l/60),p=String(l%60).padStart(2,"0");r.text=`Waiting for authorization... (expires in ${d}:${p})`,await Cn(c*1e3);try{let u=await o.pollDeviceToken(e);if(u.status==="success"&&u.tokens)return u.tokens;switch(u.status){case"slow_down":c+=5;break;case"access_denied":throw new Error("Authorization denied by user. Try again with 'kaven auth login'.");case"expired_token":throw new Error("Device code expired. Run 'kaven auth login' again.");case"authorization_pending":s<i.length-1&&(s++,c=i[s]);break}}catch(u){if(u.message.includes("denied")||u.message.includes("expired"))throw u;let m=u;throw m.code==="ECONNREFUSED"||m.code==="ENOTFOUND"?new Error("Network error. Check your connection and try again."):u}}throw new Error("Device code expired. Run 'kaven auth login' again.")}async function no(){let o=j.getInstance(),e=Date.now();o.capture("cli.auth.login.start");let t=new J,n=new T;console.log(B.blue(`\u{1F510} Starting authentication flow...
53
- `));let r=oo("Requesting device code from marketplace...").start();try{let{device_code:a,user_code:i,verification_uri:s,expires_in:c,interval:l}=await t.requestDeviceCode();r.stop(),console.log(B.yellow(`To complete login, follow these steps:
54
- `)),console.log(B.bold(` Your verification code: ${B.cyan(i)}
55
- `));try{await Sn(s),console.log(B.dim(" \u2713 Browser opened automatically"))}catch{console.log(B.yellow(" Open this URL in your browser:")),console.log(B.underline(` ${s}
56
- `))}let d=oo("Waiting for authorization...").start(),p=await Pn(t,a,c,l,d);await n.saveTokens(p),d.succeed(B.green(`Logged in as ${B.bold(p.user.email)}`)),console.log(B.dim(` Tier: ${p.user.tier}`)),console.log(B.gray(`
56
+ Module ${l.label} deactivated successfully.`)),t.skipMigrate||console.log(w.cyan("\nNext step: Run `pnpm db:generate && pnpm db:migrate` to apply changes.")),n.capture("cli.module.deactivate.success",{moduleName:l.id},Date.now()-r),await n.flush()}catch(c){let l=de(c);s.fail(w.red(`Failed to deactivate module: ${l.message}`)),n.capture("cli.module.deactivate.error",{moduleName:o,error:l.message},Date.now()-r),await n.flush(),process.exit(1)}}async function To(o){let e=o??process.cwd(),t=new Fe(e),n=await t.exists(),r={module:18,status:10,models:44,deps:20},a=w.bold("Module".padEnd(r.module))+w.bold("Status".padEnd(r.status))+w.bold("Models".padEnd(r.models))+w.bold("Depends on"),i="\u2500".repeat(r.module+r.status+r.models+r.deps);if(console.log(),console.log(w.blue(`Kaven Schema Modules
57
+ `)),console.log(a),console.log(w.gray(i)),!n){for(let s of Se){let c=s.id.padEnd(r.module),l=w.gray("unknown".padEnd(r.status)),d=s.models.join(", ").padEnd(r.models),m=s.dependsOn.length>0?s.dependsOn.join(", "):"\u2014";console.log(`${c}${l}${d}${m}`)}console.log(),console.log(w.yellow("Warning: schema.extended.prisma not found. Status cannot be determined.")),console.log(w.gray("Run this command in the root of a Kaven project to see real status."));return}for(let s of Se){let c=await t.getModuleStatus(s),l=s.id.padEnd(r.module),d=c.active?"active":"inactive",m=c.active?w.green(d.padEnd(r.status)):w.gray(d.padEnd(r.status)),p=s.models.join(", ").padEnd(r.models),u=s.dependsOn.length>0?s.dependsOn.join(", "):"\u2014";console.log(`${l}${m}${p}${u}`)}console.log(),console.log(w.gray("To activate: kaven module activate <name> | To deactivate: kaven module deactivate <name>"))}import Q from"chalk";import Ro from"ora";import dr from"open";function ur(o){return new Promise(e=>setTimeout(e,o))}async function pr(o,e,t,n,r){let a=Date.now()+t*1e3,i=[5,10,15,20],s=0,c=n;for(;Date.now()<a;){let l=Math.ceil((a-Date.now())/1e3),d=Math.floor(l/60),m=String(l%60).padStart(2,"0");r.text=`Waiting for authorization... (expires in ${d}:${m})`,await ur(c*1e3);try{let p=await o.pollDeviceToken(e);if(p.status==="success"&&p.tokens)return p.tokens;switch(p.status){case"slow_down":c+=5;break;case"access_denied":throw new Error("Authorization denied by user. Try again with 'kaven auth login'.");case"expired_token":throw new Error("Device code expired. Run 'kaven auth login' again.");case"authorization_pending":s<i.length-1&&(s++,c=i[s]);break}}catch(p){if(p.message.includes("denied")||p.message.includes("expired"))throw p;let u=p;throw u.code==="ECONNREFUSED"||u.code==="ENOTFOUND"?new Error("Network error. Check your connection and try again."):p}}throw new Error("Device code expired. Run 'kaven auth login' again.")}async function Do(){let o=A.getInstance(),e=Date.now();o.capture("cli.auth.login.start");let t=new V,n=new P;console.log(Q.blue(`\u{1F510} Starting authentication flow...
58
+ `));let r=Ro("Requesting device code from marketplace...").start();try{let{device_code:a,user_code:i,verification_uri:s,expires_in:c,interval:l}=await t.requestDeviceCode();r.stop(),console.log(Q.yellow(`To complete login, follow these steps:
59
+ `)),console.log(Q.bold(` Your verification code: ${Q.cyan(i)}
60
+ `));try{await dr(s),console.log(Q.dim(" \u2713 Browser opened automatically"))}catch{console.log(Q.yellow(" Open this URL in your browser:")),console.log(Q.underline(` ${s}
61
+ `))}let d=Ro("Waiting for authorization...").start(),m=await pr(t,a,c,l,d);await n.saveTokens(m),d.succeed(Q.green(`Logged in as ${Q.bold(m.user.email)}`)),console.log(Q.dim(` Tier: ${m.user.tier}`)),console.log(Q.gray(`
57
62
  Your credentials were saved securely in ~/.kaven/auth.json
58
- `)),o.capture("cli.auth.login.success",{tier:p.user.tier},Date.now()-e),await o.flush()}catch(a){o.capture("cli.auth.login.error",{error:a.message},Date.now()-e),await o.flush(),r.fail(B.red("Authentication failed")),console.error(B.red(`
63
+ `)),o.capture("cli.auth.login.success",{tier:m.user.tier},Date.now()-e),await o.flush()}catch(a){o.capture("cli.auth.login.error",{error:a.message},Date.now()-e),await o.flush(),r.fail(Q.red("Authentication failed")),console.error(Q.red(`
59
64
  Error: ${a.message}
60
- `)),process.exit(1)}}import ht from"chalk";async function ro(){let o=new T;try{if(!await o.isAuthenticated()){console.log(ht.yellow("You are not authenticated."));return}await o.logout(),console.log(ht.green("Logged out successfully."))}catch{console.error(ht.red("Error during logout.")),process.exit(1)}}import de from"chalk";async function ao(){let o=j.getInstance();o.capture("cli.auth.whoami.start");let e=new T;try{let t=await e.getWhoamiInfo();if(!t){console.log(de.yellow("You are not authenticated.")),console.log(de.gray("Use 'kaven auth login' to sign in.")),o.capture("cli.auth.whoami.not_authenticated"),await o.flush();return}o.capture("cli.auth.whoami.authenticated"),console.log(),console.log(` ${de.bold("Email:")} ${t.email}`),console.log(` ${de.bold("GitHub:")} ${t.githubId}`),console.log(` ${de.bold("Tier:")} ${t.tier}`),console.log(` ${de.bold("Session:")} ${t.sessionExpiry}`),console.log()}catch{console.error(de.red("Error checking authentication status.")),process.exit(1)}await o.flush()}import $ from"chalk";import $n from"ora";import An from"cli-table3";function Mn(o){switch(o.toLowerCase()){case"starter":return $.green(o.toLowerCase());case"complete":return $.yellow(o.toLowerCase());case"pro":return $.magenta(o.toLowerCase());case"enterprise":return $.blue(o.toLowerCase());default:return o}}async function io(o={}){let e=j.getInstance(),t=Date.now();e.capture("cli.marketplace.list.start");let n=new T,r=new J(n),a=o.page??1,i=Math.min(o.limit??20,100),s=o.sort??"newest";await n.isAuthenticated()||console.log($.yellow("Warning: Not authenticated. Only public modules will be shown. Run: kaven auth login"));let l=$n("Fetching modules from Marketplace...").start();try{let d=await r.listModules({category:o.category,page:a,pageSize:i,q:void 0});l.stop();let p=d.data,u=d.meta,m=d.total??u?.total??p.length;if(o.json){console.log(JSON.stringify(d,null,2)),e.capture("cli.marketplace.list.success",{count:p.length,json:!0},Date.now()-t),await e.flush();return}if(p.length===0){console.log($.yellow("No modules found matching your criteria.")),e.capture("cli.marketplace.list.success",{count:0},Date.now()-t),await e.flush();return}let g=new An({head:[$.white.bold("Slug"),$.white.bold("Name"),$.white.bold("Version"),$.white.bold("Tier"),$.white.bold("Installs")],style:{head:[],border:["gray"]}}),k=[...p];s==="popular"?k.sort((f,S)=>S.installCount-f.installCount):s==="name"&&k.sort((f,S)=>f.name.localeCompare(S.name));for(let f of k)g.push([$.cyan(f.slug),$.white(f.name),$.green(f.latestVersion??"\u2014"),Mn(f.requiredTier??f.tier??""),$.gray(String(f.installCount))]);console.log($.blue.bold(`
65
+ `)),process.exit(1)}}import zt from"chalk";async function _o(){let o=new P;try{if(!await o.isAuthenticated()){console.log(zt.yellow("You are not authenticated."));return}await o.logout(),console.log(zt.green("Logged out successfully."))}catch{console.error(zt.red("Error during logout.")),process.exit(1)}}import Ce from"chalk";async function Lo(){let o=A.getInstance();o.capture("cli.auth.whoami.start");let e=new P;try{let t=await e.getWhoamiInfo();if(!t){console.log(Ce.yellow("You are not authenticated.")),console.log(Ce.gray("Use 'kaven auth login' to sign in.")),o.capture("cli.auth.whoami.not_authenticated"),await o.flush();return}o.capture("cli.auth.whoami.authenticated"),console.log(),console.log(` ${Ce.bold("Email:")} ${t.email}`),console.log(` ${Ce.bold("GitHub:")} ${t.githubId}`),console.log(` ${Ce.bold("Tier:")} ${t.tier}`),console.log(` ${Ce.bold("Session:")} ${t.sessionExpiry}`),console.log()}catch{console.error(Ce.red("Error checking authentication status.")),process.exit(1)}await o.flush()}import D from"chalk";import mr from"ora";import fr from"cli-table3";function gr(o){switch(o.toLowerCase()){case"starter":return D.green(o.toLowerCase());case"complete":return D.yellow(o.toLowerCase());case"pro":return D.magenta(o.toLowerCase());case"enterprise":return D.blue(o.toLowerCase());default:return o}}async function Oo(o={}){let e=A.getInstance(),t=Date.now();e.capture("cli.marketplace.list.start");let n=new P,r=new V(n),a=o.page??1,i=Math.min(o.limit??20,100),s=o.sort??"newest";await n.isAuthenticated()||console.log(D.yellow("Warning: Not authenticated. Only public modules will be shown. Run: kaven auth login"));let l=mr("Fetching modules from Marketplace...").start();try{let d=await r.listModules({category:o.category,page:a,pageSize:i,q:void 0});l.stop();let m=d.data,p=d.meta,u=d.total??p?.total??m.length;if(o.json){console.log(JSON.stringify(d,null,2)),e.capture("cli.marketplace.list.success",{count:m.length,json:!0},Date.now()-t),await e.flush();return}if(m.length===0){console.log(D.yellow("No modules found matching your criteria.")),e.capture("cli.marketplace.list.success",{count:0},Date.now()-t),await e.flush();return}let g=new fr({head:[D.white.bold("Slug"),D.white.bold("Name"),D.white.bold("Version"),D.white.bold("Tier"),D.white.bold("Installs")],style:{head:[],border:["gray"]}}),k=[...m];s==="popular"?k.sort((f,$)=>$.installCount-f.installCount):s==="name"&&k.sort((f,$)=>f.name.localeCompare($.name));for(let f of k)g.push([D.cyan(f.slug),D.white(f.name),D.green(f.latestVersion??"\u2014"),gr(f.requiredTier??f.tier??""),D.gray(String(f.installCount))]);console.log(D.blue.bold(`
61
66
  Available Marketplace Modules:
62
- `)),console.log(g.toString());let F=Math.ceil(m/i),I=(a-1)*i+1,Q=Math.min(a*i,m);console.log($.gray(`
63
- Showing ${I}-${Q} of ${m} modules (page ${a}/${F})`)),console.log($.gray("Use 'kaven marketplace install <slug>' to install a module.")),e.capture("cli.marketplace.list.success",{count:p.length,total:m},Date.now()-t),await e.flush()}catch(d){l.stop(),d instanceof Ge&&(console.error($.red("Could not reach marketplace. Check your connection.")),e.capture("cli.marketplace.list.error",{error:"network_error"},Date.now()-t),await e.flush(),process.exit(1)),e.capture("cli.marketplace.list.error",{error:d.message},Date.now()-t),await e.flush(),console.error($.red("Error fetching modules from Marketplace.")),console.error(d),process.exit(1)}}import V from"chalk";import Dn from"ora";import ee from"fs-extra";import Ee from"path";import On from"os";import*as co from"tar";import Ye from"crypto";import jn from"fs-extra";async function Tn(o){let e=await jn.readFile(o);return Ye.createHash("sha256").update(e).digest("hex")}var In=/^[0-9a-fA-F]+$/;function Rn(o){return In.test(o)&&o.length===128?Buffer.from(o,"hex"):Buffer.from(o,"base64")}function _n(o,e,t){try{let n=Ye.createPublicKey({key:Buffer.from(t,"base64"),type:"spki",format:"der"}),r=Rn(e);return Ye.verify(null,Buffer.from(o),n,r)?!0:Ye.verify(null,Buffer.from(o+`
64
- `),n,r)}catch{return!1}}async function so(o){let e=await Tn(o.filePath);if(e!==o.expectedChecksum)throw new je(`Checksum mismatch: expected ${o.expectedChecksum.substring(0,16)}..., got ${e.substring(0,16)}...`);if(!_n(o.expectedChecksum,o.signature,o.publicKeyBase64))throw new je("Ed25519 signature verification failed. The package may have been tampered with.")}var Ln={ora:Dn},Fn={x:co.x};async function Kn(){let o=Ee.join(On.tmpdir(),"kaven-install-");return ee.mkdtemp(o)}function Nn(o){return o<1024?`${o} B`:o<1024*1024?`${Math.round(o/1024)} KB`:`${(o/(1024*1024)).toFixed(1)} MB`}async function Un(o,e,t,n){let r=Ee.join(n,".kaven","cache","modules"),a=Ee.join(r,`${o}-${e}`);await ee.ensureDir(a),await ee.copy(t,a)}async function Ze(o,e={}){let t=j.getInstance(),n=Date.now();t.capture("cli.marketplace.install.start",{slug:o});let r=new T,a=new J(r),i=process.cwd(),s;try{s=await r.getValidToken()}catch{console.error(V.red("Authentication required. Run: kaven auth login")),t.capture("cli.marketplace.install.error",{slug:o,error:"not_authenticated"},Date.now()-n),await t.flush(),process.exit(1);return}let c=Ln.ora(`Preparing installation of '${o}'...`).start(),l=null;try{c.text=`Fetching module '${o}' from Marketplace...`;let d;try{d=await a.getModule(o)}catch(z){if(z instanceof Ft){c.fail(V.red(`Module '${o}' not found in Marketplace.`)),process.exit(1);return}throw z}let p=d.latestVersion??d.releases?.[0]?.version,u=e.version??p;if(!u){c.fail(V.red(`No published version found for '${o}'.`)),process.exit(1);return}let m=new W,g=new ae(i,m);if(await g.isModuleInstalled(o)&&!e.force){c.stop(),console.log(V.yellow(`Module '${o}' is already installed. Use --force to overwrite.`)),t.capture("cli.marketplace.install.skipped",{slug:o,reason:"already_installed"},Date.now()-n),await t.flush();return}c.text=`Creating download token for '${o}@${u}'...`;let F=await a.createDownloadToken(o,u);l=await Kn();let I=Ee.join(l,"module.tar.gz"),Q=Ee.join(l,"extracted");await ee.ensureDir(Q),c.text=`Downloading ${o} v${u}...`;let f=await a.resolveUrl(F.downloadUrl),S=await fetch(f);if(!S.ok)throw new Error(`Download failed: ${S.status} ${S.statusText}`);let he=S.headers.get("content-length"),Rt=he?` (${Nn(parseInt(he,10))})`:"";if(c.text=`Downloading ${o} v${u}${Rt}...`,!S.body)throw new Error("No response body received for download");let Me=ee.createWriteStream(I),qo=S.body.getReader();if(await new Promise((z,Dt)=>{(async()=>{try{let Je=!0;for(;Je;){let{done:Wo,value:Xo}=await qo.read();Wo?(Me.end(),Je=!1):Me.write(Xo)||await new Promise(Yo=>Me.once("drain",Yo))}Me.once("finish",z),Me.once("error",Dt)}catch(Je){Dt(Je)}})()}),(await ee.stat(I)).size===0)throw new Error("Downloaded file is empty");if(!e.skipVerify){c.text=`Verifying signature for ${o} v${u}...`;let z=await a.getReleaseInfo(o,u);z.checksum&&z.signature&&z.publicKey?(await so({filePath:I,expectedChecksum:z.checksum,signature:z.signature,publicKeyBase64:z.publicKey}),c.text=`Signature verified for ${o} v${u}`):c.text=`No signature data for ${o} v${u} \u2014 skipping verification`}c.text=`Extracting ${o} v${u}...`,await Fn.x({file:I,cwd:Q});let _t=Ee.join(Q,"module.json");if(!await ee.pathExists(_t))throw new Error(`module.json not found in extracted archive for '${o}'`);let zo=await ee.readJson(_t);c.text=`Caching baseline for ${o} v${u}...`,await Un(o,u,Q,i),c.text=`Installing ${o} v${u}...`,await g.install(zo),c.succeed(V.green(`Module '${o}@${u}' installed successfully.`)),console.log(V.gray("Use 'kaven module doctor' to verify the installation.")),t.capture("cli.marketplace.install.success",{slug:o,version:u},Date.now()-n),await t.flush()}catch(d){let p=Te(d);if(c.stop(),p instanceof je){console.error(V.red(`Signature verification failed for '${o}': ${p.message}`)),console.error(V.yellow("Use --skip-verify to bypass (not recommended).")),t.capture("cli.marketplace.install.error",{slug:o,error:"signature_verification_failed"},Date.now()-n),await t.flush(),process.exit(1);return}if(p instanceof Ot){console.error(V.red(`License required: '${o}' requires a '${p.requiredTier}' license.`)),console.error(V.yellow(`Run: kaven upgrade ${p.requiredTier}`)),t.capture("cli.marketplace.install.error",{slug:o,error:"license_required",tier:p.requiredTier},Date.now()-n),await t.flush(),process.exit(1);return}if(p instanceof Lt||p.message.includes("Not authenticated")){console.error(V.red("Authentication required. Run: kaven auth login")),t.capture("cli.marketplace.install.error",{slug:o,error:"auth_error"},Date.now()-n),await t.flush(),process.exit(1);return}if(p instanceof Ge){console.error(V.red("Could not reach marketplace. Check your connection.")),t.capture("cli.marketplace.install.error",{slug:o,error:"network_error"},Date.now()-n),await t.flush(),process.exit(1);return}t.capture("cli.marketplace.install.error",{slug:o,error:p.message},Date.now()-n),await t.flush(),c.fail(V.red(`Failed to install module '${o}'.`)),console.error(p),process.exit(1)}finally{l&&await ee.remove(l).catch(()=>{})}}import{select as yt,spinner as Gn,outro as Hn,isCancel as qn,cancel as zn}from"@clack/prompts";import A from"picocolors";import{createInstance as Bn}from"i18next";var Vn={common:{welcome:"Welcome to Kaven CLI",success:"Success",error:"Error",warning:"Warning",suggestion:"Suggestion",proceed:"Do you want to proceed?",cancelled:"Operation cancelled",exit:"Exit",back:"Back",cancel:"Cancel"},init:{intro:"Bootstrapping a new Kaven project",outro:"Project created successfully! Ready to build.",projectName:"What is the name of your project?",template:"Select a template",withSquad:"Include AIOX Squad (AI Agents)?",installing:"Installing dependencies..."},module:{activate:{title:"Module Activation: {{name}}",models:"Models to be added: {{count}}",envVars:"Env vars to inject: {{count}}",alreadyActive:"Module '{{name}}' is already active."},list:{header:"Kaven Schema Modules"}},doctor:{checking:"Running diagnostics...",allClear:"Your project is healthy!",issuesFound:"Found {{count}} issue(s).",fixSuggestion:"\u{1F4A1} Run 'kaven module doctor --fix' to resolve automatically."},marketplace:{browse:{loadingCategories:"Loading categories...",categoryLoadFailed:"Could not load categories \u2014 showing all modules.",browseByCategory:"Browse by category:",allModules:"All modules",loadingModules:"Loading modules...",errorLoadingModules:"Error loading modules: {{error}}",noModulesFound:"No modules found.",nextPage:"\u2192 Next page",prevPage:"\u2190 Previous page",backToCategories:"\u2191 Back to categories",whatToDo:"What would you like to do?",install:"Install {{name}}",backToList:"Back to module list",sessionEnded:"Browse session ended."}},config:{features:{catalogHeader:"Kaven Framework \u2014 Capability Catalog",capabilitiesTotal:"{{count}} capabilities total",tierPresets:"Tier presets:",tuiHeader:"\u{1F6E1}\uFE0F Kaven Feature Flag Configuration",selectTier:"Select a base tier:",customize:"Customize individual capabilities?",confirmOverwrite:"Seed file already exists. Overwrite?",seedWritten:"Seed file written to: {{path}}",runSeed:"Run pnpm prisma db seed to apply capabilities to your database.",dryRunHeader:"--- DRY RUN: Generated Content ---"}}},Jn={common:{welcome:"Bem-vindo \xE0 Kaven CLI",success:"Sucesso",error:"Erro",warning:"Aviso",suggestion:"Sugest\xE3o",proceed:"Deseja continuar?",cancelled:"Opera\xE7\xE3o cancelada",exit:"Sair",back:"Voltar",cancel:"Cancelar"},init:{intro:"Iniciando um novo projeto Kaven",outro:"Projeto criado com sucesso! Hora de construir.",projectName:"Qual o nome do seu projeto?",template:"Selecione um template",withSquad:"Incluir AIOX Squad (Agentes de IA)?",installing:"Instalando depend\xEAncias..."},module:{activate:{title:"Ativa\xE7\xE3o de M\xF3dulo: {{name}}",models:"Models a serem adicionados: {{count}}",envVars:"Vari\xE1veis de ambiente: {{count}}",alreadyActive:"O m\xF3dulo '{{name}}' j\xE1 est\xE1 ativo."},list:{header:"M\xF3dulos de Schema Kaven"}},doctor:{checking:"Executando diagn\xF3sticos...",allClear:"Seu projeto est\xE1 saud\xE1vel!",issuesFound:"Encontrados {{count}} problema(s).",fixSuggestion:"\u{1F4A1} Execute 'kaven module doctor --fix' para resolver automaticamente."},marketplace:{browse:{loadingCategories:"Carregando categorias...",categoryLoadFailed:"N\xE3o foi poss\xEDvel carregar categorias \u2014 exibindo todos os m\xF3dulos.",browseByCategory:"Navegar por categoria:",allModules:"Todos os m\xF3dulos",loadingModules:"Carregando m\xF3dulos...",errorLoadingModules:"Erro ao carregar m\xF3dulos: {{error}}",noModulesFound:"Nenhum m\xF3dulo encontrado.",nextPage:"\u2192 Pr\xF3xima p\xE1gina",prevPage:"\u2190 P\xE1gina anterior",backToCategories:"\u2191 Voltar \xE0s categorias",whatToDo:"O que deseja fazer?",install:"Instalar {{name}}",backToList:"Voltar \xE0 lista",sessionEnded:"Sess\xE3o de navega\xE7\xE3o encerrada."}},config:{features:{catalogHeader:"Kaven Framework \u2014 Cat\xE1logo de Capacidades",capabilitiesTotal:"{{count}} capacidades no total",tierPresets:"Presets de tier:",tuiHeader:"\u{1F6E1}\uFE0F Configura\xE7\xE3o de Feature Flags Kaven",selectTier:"Selecione um tier base:",customize:"Personalizar capacidades individualmente?",confirmOverwrite:"Arquivo de seed j\xE1 existe. Sobrescrever?",seedWritten:"Seed escrito em: {{path}}",runSeed:"Execute pnpm prisma db seed para aplicar as capacidades ao banco.",dryRunHeader:"--- DRY RUN: Conte\xFAdo Gerado ---"}}},X=class o{static instance;i18n=Bn();constructor(){}static async getInstance(){return o.instance||(o.instance=new o,await o.instance.init()),o.instance}async init(){let e=process.env.KAVEN_LANG||"en";await this.i18n.init({lng:e,fallbackLng:"en",resources:{en:{translation:Vn},"pt-BR":{translation:Jn}}})}t(e,t){return this.i18n.t(e,t)}async setLanguage(e){await this.i18n.changeLanguage(e)}getI18n(){return this.i18n}};var lo=10;function uo(o){switch(o.toUpperCase()){case"FREE":return A.dim("[FREE]");case"STARTER":return A.green("[STARTER]");case"COMPLETE":return A.yellow("[COMPLETE]");case"PRO":return A.magenta("[PRO]");case"ENTERPRISE":return A.cyan("[ENTERPRISE]");default:return A.dim(`[${o}]`)}}function wt(o){qn(o)&&(zn("Cancelled."),process.exit(0))}async function po(){let o=await X.getInstance(),e=new T,t=new J(e),n=Gn(),r={category:null,page:1,selectedModule:null,screen:"categories"};for(;r.screen!=="exit";){if(r.screen==="categories"){n.start(o.t("marketplace.browse.loadingCategories"));let a=[];try{a=await t.getCategories(),n.stop()}catch{n.stop(A.yellow(o.t("marketplace.browse.categoryLoadFailed")))}let i=[{label:o.t("marketplace.browse.allModules"),value:"__all__"},...a.map(c=>({label:c,value:c})),{label:A.dim(o.t("common.exit")),value:"__exit__"}],s=await yt({message:o.t("marketplace.browse.browseByCategory"),options:i});if(wt(s),s==="__exit__"){r.screen="exit";break}r.category=s==="__all__"?null:s,r.page=1,r.screen="list";continue}if(r.screen==="list"){n.start(o.t("marketplace.browse.loadingModules"));let a=[],i=1;try{let u=await t.listModules({category:r.category||void 0,page:r.page,pageSize:lo});a=u.data,i=Math.ceil(u.total/lo)||1,n.stop()}catch(u){n.stop(A.red(o.t("marketplace.browse.errorLoadingModules",{error:u instanceof Error?u.message:String(u)}))),r.screen="categories";continue}if(a.length===0){console.log(A.yellow(o.t("marketplace.browse.noModulesFound"))),r.screen="categories";continue}let s=r.category?` [${r.category}]`:"",c=i>1?` (${r.page}/${i})`:"",l=[...a.map(u=>({label:`${u.name} ${uo(u.requiredTier??u.tier??"")}`,hint:u.description,value:u.slug})),...r.page<i?[{label:A.cyan(o.t("marketplace.browse.nextPage")),value:"__next__"}]:[],...r.page>1?[{label:A.cyan(o.t("marketplace.browse.prevPage")),value:"__prev__"}]:[],{label:A.dim(o.t("marketplace.browse.backToCategories")),value:"__back__"},{label:A.dim(o.t("common.exit")),value:"__exit__"}],d=await yt({message:`Modules${s}${c}:`,options:l});if(wt(d),d==="__exit__"){r.screen="exit";break}if(d==="__back__"){r.screen="categories";continue}if(d==="__next__"){r.page++;continue}if(d==="__prev__"){r.page=Math.max(1,r.page-1);continue}let p=a.find(u=>u.slug===d);p&&(r.selectedModule=p,r.screen="detail");continue}if(r.screen==="detail"&&r.selectedModule){let a=r.selectedModule;console.log(),console.log(A.bold(a.name),uo(a.requiredTier??a.tier??"")),console.log(A.dim(`Version: ${a.latestVersion||"latest"}`)),a.installCount!==void 0&&console.log(A.dim(`Installs: ${a.installCount.toLocaleString()}`)),a.description&&(console.log(),console.log(a.description)),console.log();let i=await yt({message:o.t("marketplace.browse.whatToDo"),options:[{label:o.t("marketplace.browse.install",{name:a.name}),value:"install"},{label:A.dim(o.t("marketplace.browse.backToList")),value:"back"},{label:A.dim(o.t("common.exit")),value:"exit"}]});if(wt(i),i==="exit"){r.screen="exit";break}if(i==="back"){r.selectedModule=null,r.screen="list";continue}if(i==="install"){console.log(),await Ze(a.slug,{force:!1,skipEnv:!1}),r.screen="exit";break}}}Hn(A.dim(o.t("marketplace.browse.sessionEnded")))}import te from"chalk";async function mo(o=10){let t=await j.getInstance().getRecentEvents(o);if(t.length===0){console.log(te.yellow(`
67
+ `)),console.log(g.toString());let C=Math.ceil(u/i),F=(a-1)*i+1,q=Math.min(a*i,u);console.log(D.gray(`
68
+ Showing ${F}-${q} of ${u} modules (page ${a}/${C})`)),console.log(D.gray("Use 'kaven marketplace install <slug>' to install a module.")),e.capture("cli.marketplace.list.success",{count:m.length,total:u},Date.now()-t),await e.flush()}catch(d){l.stop(),d instanceof ct&&(console.error(D.red("Could not reach marketplace. Check your connection.")),e.capture("cli.marketplace.list.error",{error:"network_error"},Date.now()-t),await e.flush(),process.exit(1)),e.capture("cli.marketplace.list.error",{error:d.message},Date.now()-t),await e.flush(),console.error(D.red("Error fetching modules from Marketplace.")),console.error(d),process.exit(1)}}import ee from"chalk";import hr from"ora";import $e from"fs-extra";import vt from"path";import wr from"os";import*as Fo from"tar";var yr={ora:hr},vr={x:Fo.x};async function kr(){let o=vt.join(wr.tmpdir(),"kaven-install-");return $e.mkdtemp(o)}function br(o){return o<1024?`${o} B`:o<1024*1024?`${Math.round(o/1024)} KB`:`${(o/(1024*1024)).toFixed(1)} MB`}async function kt(o,e={}){let t=A.getInstance(),n=Date.now();t.capture("cli.marketplace.install.start",{slug:o});let r=new P,a=new V(r),i=process.cwd(),s;try{s=await r.getValidToken()}catch{console.error(ee.red("Authentication required. Run: kaven auth login")),t.capture("cli.marketplace.install.error",{slug:o,error:"not_authenticated"},Date.now()-n),await t.flush(),process.exit(1);return}let c=yr.ora(`Preparing installation of '${o}'...`).start(),l=null;try{c.text=`Fetching module '${o}' from Marketplace...`;let d;try{d=await a.getModule(o)}catch(M){if(M instanceof po){c.fail(ee.red(`Module '${o}' not found in Marketplace.`)),process.exit(1);return}throw M}let m=d.latestVersion??d.releases?.[0]?.version,p=e.version??m;if(!p){c.fail(ee.red(`No published version found for '${o}'.`)),process.exit(1);return}let u=new ae,g=new ye(i,u);if(await g.isModuleInstalled(o)&&!e.force){c.stop(),console.log(ee.yellow(`Module '${o}' is already installed. Use --force to overwrite.`)),t.capture("cli.marketplace.install.skipped",{slug:o,reason:"already_installed"},Date.now()-n),await t.flush();return}c.text=`Creating download token for '${o}@${p}'...`;let C=await a.createDownloadToken(o,p);l=await kr();let F=vt.join(l,"module.tar.gz"),q=vt.join(l,"extracted");await $e.ensureDir(q),c.text=`Downloading ${o} v${p}...`;let f=await a.resolveUrl(C.downloadUrl),$=await fetch(f);if(!$.ok)throw new Error(`Download failed: ${$.status} ${$.statusText}`);let le=$.headers.get("content-length"),ze=le?` (${br(parseInt(le,10))})`:"";if(c.text=`Downloading ${o} v${p}${ze}...`,!$.body)throw new Error("No response body received for download");let be=$e.createWriteStream(F),At=$.body.getReader();if(await new Promise((M,ge)=>{(async()=>{try{let Ee=!0;for(;Ee;){let{done:jt,value:It}=await At.read();jt?(be.end(),Ee=!1):be.write(It)||await new Promise(Cn=>be.once("drain",Cn))}be.once("finish",M),be.once("error",ge)}catch(Ee){ge(Ee)}})()}),(await $e.stat(F)).size===0)throw new Error("Downloaded file is empty");if(!e.skipVerify){c.text=`Verifying signature for ${o} v${p}...`;let M=await a.getReleaseInfo(o,p);M.checksum&&M.signature&&M.publicKey?(await gt({filePath:F,expectedChecksum:M.checksum,signature:M.signature,publicKeyBase64:M.publicKey}),c.text=`Signature verified for ${o} v${p}`):c.text=`No signature data for ${o} v${p} \u2014 skipping verification`}c.text=`Extracting ${o} v${p}...`,await vr.x({file:F,cwd:q});let st=vt.join(q,"module.json");if(!await $e.pathExists(st))throw new Error(`module.json not found in extracted archive for '${o}'`);let b=await $e.readJson(st);c.text=`Caching baseline for ${o} v${p}...`,await ht(o,p,q,i),c.text=`Installing ${o} v${p}...`,await g.install(b),c.succeed(ee.green(`Module '${o}@${p}' installed successfully.`)),console.log(ee.gray("Use 'kaven module doctor' to verify the installation.")),t.capture("cli.marketplace.install.success",{slug:o,version:p},Date.now()-n),await t.flush()}catch(d){let m=de(d);if(c.stop(),m instanceof Ge){console.error(ee.red(`Signature verification failed for '${o}': ${m.message}`)),console.error(ee.yellow("Use --skip-verify to bypass (not recommended).")),t.capture("cli.marketplace.install.error",{slug:o,error:"signature_verification_failed"},Date.now()-n),await t.flush(),process.exit(1);return}if(m instanceof uo){console.error(ee.red(`License required: '${o}' requires a '${m.requiredTier}' license.`)),console.error(ee.yellow(`Run: kaven upgrade ${m.requiredTier}`)),t.capture("cli.marketplace.install.error",{slug:o,error:"license_required",tier:m.requiredTier},Date.now()-n),await t.flush(),process.exit(1);return}if(m instanceof lo||m.message.includes("Not authenticated")){console.error(ee.red("Authentication required. Run: kaven auth login")),t.capture("cli.marketplace.install.error",{slug:o,error:"auth_error"},Date.now()-n),await t.flush(),process.exit(1);return}if(m instanceof ct){console.error(ee.red("Could not reach marketplace. Check your connection.")),t.capture("cli.marketplace.install.error",{slug:o,error:"network_error"},Date.now()-n),await t.flush(),process.exit(1);return}t.capture("cli.marketplace.install.error",{slug:o,error:m.message},Date.now()-n),await t.flush(),c.fail(ee.red(`Failed to install module '${o}'.`)),console.error(m),process.exit(1)}finally{l&&await $e.remove(l).catch(()=>{})}}import{select as Gt,spinner as Cr,outro as $r,isCancel as Pr,cancel as Mr}from"@clack/prompts";import _ from"picocolors";import{createInstance as xr}from"i18next";var Er={common:{welcome:"Welcome to Kaven CLI",success:"Success",error:"Error",warning:"Warning",suggestion:"Suggestion",proceed:"Do you want to proceed?",cancelled:"Operation cancelled",exit:"Exit",back:"Back",cancel:"Cancel"},init:{intro:"Bootstrapping a new Kaven project",outro:"Project created successfully! Ready to build.",projectName:"What is the name of your project?",template:"Select a template",withSquad:"Include AIOX Squad (AI Agents)?",installing:"Installing dependencies..."},module:{activate:{title:"Module Activation: {{name}}",models:"Models to be added: {{count}}",envVars:"Env vars to inject: {{count}}",alreadyActive:"Module '{{name}}' is already active."},list:{header:"Kaven Schema Modules"}},doctor:{checking:"Running diagnostics...",allClear:"Your project is healthy!",issuesFound:"Found {{count}} issue(s).",fixSuggestion:"\u{1F4A1} Run 'kaven module doctor --fix' to resolve automatically."},marketplace:{browse:{loadingCategories:"Loading categories...",categoryLoadFailed:"Could not load categories \u2014 showing all modules.",browseByCategory:"Browse by category:",allModules:"All modules",loadingModules:"Loading modules...",errorLoadingModules:"Error loading modules: {{error}}",noModulesFound:"No modules found.",nextPage:"\u2192 Next page",prevPage:"\u2190 Previous page",backToCategories:"\u2191 Back to categories",whatToDo:"What would you like to do?",install:"Install {{name}}",backToList:"Back to module list",sessionEnded:"Browse session ended."}},config:{features:{catalogHeader:"Kaven Framework \u2014 Capability Catalog",capabilitiesTotal:"{{count}} capabilities total",tierPresets:"Tier presets:",tuiHeader:"\u{1F6E1}\uFE0F Kaven Feature Flag Configuration",selectTier:"Select a base tier:",customize:"Customize individual capabilities?",confirmOverwrite:"Seed file already exists. Overwrite?",seedWritten:"Seed file written to: {{path}}",runSeed:"Run pnpm prisma db seed to apply capabilities to your database.",dryRunHeader:"--- DRY RUN: Generated Content ---"}}},Sr={common:{welcome:"Bem-vindo \xE0 Kaven CLI",success:"Sucesso",error:"Erro",warning:"Aviso",suggestion:"Sugest\xE3o",proceed:"Deseja continuar?",cancelled:"Opera\xE7\xE3o cancelada",exit:"Sair",back:"Voltar",cancel:"Cancelar"},init:{intro:"Iniciando um novo projeto Kaven",outro:"Projeto criado com sucesso! Hora de construir.",projectName:"Qual o nome do seu projeto?",template:"Selecione um template",withSquad:"Incluir AIOX Squad (Agentes de IA)?",installing:"Instalando depend\xEAncias..."},module:{activate:{title:"Ativa\xE7\xE3o de M\xF3dulo: {{name}}",models:"Models a serem adicionados: {{count}}",envVars:"Vari\xE1veis de ambiente: {{count}}",alreadyActive:"O m\xF3dulo '{{name}}' j\xE1 est\xE1 ativo."},list:{header:"M\xF3dulos de Schema Kaven"}},doctor:{checking:"Executando diagn\xF3sticos...",allClear:"Seu projeto est\xE1 saud\xE1vel!",issuesFound:"Encontrados {{count}} problema(s).",fixSuggestion:"\u{1F4A1} Execute 'kaven module doctor --fix' para resolver automaticamente."},marketplace:{browse:{loadingCategories:"Carregando categorias...",categoryLoadFailed:"N\xE3o foi poss\xEDvel carregar categorias \u2014 exibindo todos os m\xF3dulos.",browseByCategory:"Navegar por categoria:",allModules:"Todos os m\xF3dulos",loadingModules:"Carregando m\xF3dulos...",errorLoadingModules:"Erro ao carregar m\xF3dulos: {{error}}",noModulesFound:"Nenhum m\xF3dulo encontrado.",nextPage:"\u2192 Pr\xF3xima p\xE1gina",prevPage:"\u2190 P\xE1gina anterior",backToCategories:"\u2191 Voltar \xE0s categorias",whatToDo:"O que deseja fazer?",install:"Instalar {{name}}",backToList:"Voltar \xE0 lista",sessionEnded:"Sess\xE3o de navega\xE7\xE3o encerrada."}},config:{features:{catalogHeader:"Kaven Framework \u2014 Cat\xE1logo de Capacidades",capabilitiesTotal:"{{count}} capacidades no total",tierPresets:"Presets de tier:",tuiHeader:"\u{1F6E1}\uFE0F Configura\xE7\xE3o de Feature Flags Kaven",selectTier:"Selecione um tier base:",customize:"Personalizar capacidades individualmente?",confirmOverwrite:"Arquivo de seed j\xE1 existe. Sobrescrever?",seedWritten:"Seed escrito em: {{path}}",runSeed:"Execute pnpm prisma db seed para aplicar as capacidades ao banco.",dryRunHeader:"--- DRY RUN: Conte\xFAdo Gerado ---"}}},ie=class o{static instance;i18n=xr();constructor(){}static async getInstance(){return o.instance||(o.instance=new o,await o.instance.init()),o.instance}async init(){let e=process.env.KAVEN_LANG||"en";await this.i18n.init({lng:e,fallbackLng:"en",resources:{en:{translation:Er},"pt-BR":{translation:Sr}}})}t(e,t){return this.i18n.t(e,t)}async setLanguage(e){await this.i18n.changeLanguage(e)}getI18n(){return this.i18n}};var Uo=10;function No(o){switch(o.toUpperCase()){case"FREE":return _.dim("[FREE]");case"STARTER":return _.green("[STARTER]");case"COMPLETE":return _.yellow("[COMPLETE]");case"PRO":return _.magenta("[PRO]");case"ENTERPRISE":return _.cyan("[ENTERPRISE]");default:return _.dim(`[${o}]`)}}function Ht(o){Pr(o)&&(Mr("Cancelled."),process.exit(0))}async function Ko(){let o=await ie.getInstance(),e=new P,t=new V(e),n=Cr(),r={category:null,page:1,selectedModule:null,screen:"categories"};for(;r.screen!=="exit";){if(r.screen==="categories"){n.start(o.t("marketplace.browse.loadingCategories"));let a=[];try{a=await t.getCategories(),n.stop()}catch{n.stop(_.yellow(o.t("marketplace.browse.categoryLoadFailed")))}let i=[{label:o.t("marketplace.browse.allModules"),value:"__all__"},...a.map(c=>({label:c,value:c})),{label:_.dim(o.t("common.exit")),value:"__exit__"}],s=await Gt({message:o.t("marketplace.browse.browseByCategory"),options:i});if(Ht(s),s==="__exit__"){r.screen="exit";break}r.category=s==="__all__"?null:s,r.page=1,r.screen="list";continue}if(r.screen==="list"){n.start(o.t("marketplace.browse.loadingModules"));let a=[],i=1;try{let p=await t.listModules({category:r.category||void 0,page:r.page,pageSize:Uo});a=p.data,i=Math.ceil(p.total/Uo)||1,n.stop()}catch(p){n.stop(_.red(o.t("marketplace.browse.errorLoadingModules",{error:p instanceof Error?p.message:String(p)}))),r.screen="categories";continue}if(a.length===0){console.log(_.yellow(o.t("marketplace.browse.noModulesFound"))),r.screen="categories";continue}let s=r.category?` [${r.category}]`:"",c=i>1?` (${r.page}/${i})`:"",l=[...a.map(p=>({label:`${p.name} ${No(p.requiredTier??p.tier??"")}`,hint:p.description,value:p.slug})),...r.page<i?[{label:_.cyan(o.t("marketplace.browse.nextPage")),value:"__next__"}]:[],...r.page>1?[{label:_.cyan(o.t("marketplace.browse.prevPage")),value:"__prev__"}]:[],{label:_.dim(o.t("marketplace.browse.backToCategories")),value:"__back__"},{label:_.dim(o.t("common.exit")),value:"__exit__"}],d=await Gt({message:`Modules${s}${c}:`,options:l});if(Ht(d),d==="__exit__"){r.screen="exit";break}if(d==="__back__"){r.screen="categories";continue}if(d==="__next__"){r.page++;continue}if(d==="__prev__"){r.page=Math.max(1,r.page-1);continue}let m=a.find(p=>p.slug===d);m&&(r.selectedModule=m,r.screen="detail");continue}if(r.screen==="detail"&&r.selectedModule){let a=r.selectedModule;console.log(),console.log(_.bold(a.name),No(a.requiredTier??a.tier??"")),console.log(_.dim(`Version: ${a.latestVersion||"latest"}`)),a.installCount!==void 0&&console.log(_.dim(`Installs: ${a.installCount.toLocaleString()}`)),a.description&&(console.log(),console.log(a.description)),console.log();let i=await Gt({message:o.t("marketplace.browse.whatToDo"),options:[{label:o.t("marketplace.browse.install",{name:a.name}),value:"install"},{label:_.dim(o.t("marketplace.browse.backToList")),value:"back"},{label:_.dim(o.t("common.exit")),value:"exit"}]});if(Ht(i),i==="exit"){r.screen="exit";break}if(i==="back"){r.selectedModule=null,r.screen="list";continue}if(i==="install"){console.log(),await kt(a.slug,{force:!1,skipEnv:!1}),r.screen="exit";break}}}$r(_.dim(o.t("marketplace.browse.sessionEnded")))}import ue from"chalk";async function Vo(o=10){let t=await A.getInstance().getRecentEvents(o);if(t.length===0){console.log(ue.yellow(`
65
69
  Nenhum evento de telemetria encontrado localmente.
66
- `));return}console.log(te.blue.bold(`
70
+ `));return}console.log(ue.blue.bold(`
67
71
  \u{1F4CA} \xDAltimos ${t.length} eventos de telemetria:
68
- `)),t.forEach(n=>{let r=te.gray(`[${new Date(n.timestamp).toLocaleTimeString()}]`),a=n.event.includes("error")?te.red("\u2716"):te.green("\u2714"),i=n.duration?te.yellow(` (${n.duration}ms)`):"";console.log(`${r} ${a} ${te.cyan(n.event)}${i}`),n.metadata&&Object.keys(n.metadata).length>0&&console.log(te.gray(` > ${JSON.stringify(n.metadata)}`))}),console.log(te.gray(`
72
+ `)),t.forEach(n=>{let r=ue.gray(`[${new Date(n.timestamp).toLocaleTimeString()}]`),a=n.event.includes("error")?ue.red("\u2716"):ue.green("\u2714"),i=n.duration?ue.yellow(` (${n.duration}ms)`):"";console.log(`${r} ${a} ${ue.cyan(n.event)}${i}`),n.metadata&&Object.keys(n.metadata).length>0&&console.log(ue.gray(` > ${JSON.stringify(n.metadata)}`))}),console.log(ue.gray(`
69
73
  Log local: ~/.kaven/telemetry.log
70
- `))}import{Command as Yn}from"commander";import{Command as Xn}from"commander";import Y from"chalk";import vt from"fs/promises";import fo from"path";import ho from"os";var go=fo.join(ho.homedir(),".kaven","cache","licenses.json"),Wn=3600*1e3,Qe=class{cacheDir=fo.join(ho.homedir(),".kaven","cache");isValidFormat(e){return/^KAVEN-(STARTER|COMPLETE|PRO|ENTERPRISE)-[A-Z0-9]{8}-[A-Z0-9]{2}$/.test(e)}async readCache(){try{let e=await vt.readFile(go,"utf-8");return JSON.parse(e)}catch{return{}}}async writeCache(e){await vt.mkdir(this.cacheDir,{recursive:!0}),await vt.writeFile(go,JSON.stringify(e,null,2),"utf-8")}isCacheValid(e){return Date.now()-e.validatedAt<Wn}async getCached(e){let n=(await this.readCache())[e];return n&&this.isCacheValid(n)?n:null}async setCached(e){let t=await this.readCache();t[e.key]={...e,validatedAt:Date.now()},await this.writeCache(t)}async validateLicense(e,t){let n=await this.getCached(e);if(n)return{valid:!0,tier:n.tier,expiresAt:n.expiresAt,source:"cache"};if(!this.isValidFormat(e))throw new Error("Invalid license key format");let{MarketplaceClient:r}=await import("./MarketplaceClient-YCFH2VU4.js"),i=await new r().validateLicense(e,t);return await this.setCached({key:e,tier:i.tier,expiresAt:i.expiresAt,validatedAt:Date.now()}),{...i,source:"api"}}async getLicenseStatus(e){let{MarketplaceClient:t}=await import("./MarketplaceClient-YCFH2VU4.js");return new t().getLicenseStatus(e)}tierLevel(e){return{STARTER:1,COMPLETE:2,PRO:3,ENTERPRISE:4}[e.toUpperCase()]??0}userHasRequiredTier(e,t){return this.tierLevel(e)>=this.tierLevel(t)}};function yo(){return new Xn("status").description("Show license status and tier information").argument("[license-key]","License key to check (uses stored license if omitted)").action(async o=>{let e=new Qe,t=o??process.env.KAVEN_LICENSE_KEY;t||(console.error(Y.red("\u2717 No license key provided. Pass as argument or set KAVEN_LICENSE_KEY.")),process.exit(1));try{console.log(Y.dim("Checking license status..."));let n=await e.getLicenseStatus(t);if(console.log(`
71
- `+Y.bold("License Status")+`
72
- `),console.log(` Key: ${Y.dim(n.key.substring(0,16)+"...")}`),console.log(` Tier: ${Y.magenta(n.tier)}`),n.expiresAt){let r=n.daysUntilExpiry,a=r!==null&&r<30?Y.red:Y.green;console.log(` Expires: ${a(n.expiresAt)}${r!==null?Y.dim(` (${r} days)`):""}`)}else console.log(` Expires: ${Y.green("Never")}`);console.log()}catch(n){let r=n instanceof Error?n.message:"Failed to check license status";console.error(Y.red("\u2717 "+r)),process.exit(1)}})}function wo(){let o=new Yn("license").description("Manage Kaven licenses");return o.addCommand(yo()),o}import Ne from"path";import Ue from"fs-extra";import{fileURLToPath as sr}from"url";import{intro as cr,outro as lr,text as rt,select as So,confirm as dr,spinner as ur,note as pr,isCancel as mr,cancel as Et}from"@clack/prompts";import K from"picocolors";import _ from"fs-extra";import se from"path";import{spawn as Zn}from"child_process";var Qn="https://github.com/kaven-co/kaven-template.git",er="https://github.com/bychrisr/kaven-squad";function ue(o,e,t,n){return new Promise((r,a)=>{let i=Zn(o,e,{cwd:t,stdio:n?"pipe":"inherit"});n&&i.stdout&&i.stdout.on("data",s=>n(s.toString())),n&&i.stderr&&i.stderr.on("data",s=>n(s.toString())),i.on("error",a),i.on("close",s=>r(s??0))})}var et=class{validateName(e){return!e||e.trim().length===0?{valid:!1,reason:"Project name cannot be empty"}:/\s/.test(e)?{valid:!1,reason:"Project name cannot contain spaces"}:/^[a-z0-9-]+$/.test(e)?{valid:!0}:{valid:!1,reason:"Project name must only contain lowercase letters, numbers, and hyphens"}}async cloneTemplate(e,t){let n=t||Qn;if(console.log(`[INIT] Clone Source: ${n}`),console.log(`[INIT] Target Dir: ${e}`),await _.pathExists(n)&&(n.startsWith("/")||n.startsWith("./")||n.startsWith("../"))){console.log("[INIT] Local Path Detected. Copying..."),await _.copy(n,e,{filter:a=>!a.includes("node_modules")&&!a.includes(".git")&&!a.includes(".turbo")}),console.log("[INIT] Local Copy Done.");return}let r=await ue("git",["clone","--depth","1",n,e],process.cwd());if(r!==0)throw new Error(`git clone failed with exit code ${r}`)}async removeGitDir(e){let t=se.join(e,".git");await _.pathExists(t)&&await _.remove(t)}async replacePlaceholders(e,t){let n={"{{PROJECT_NAME}}":t.projectName,"{{DATABASE_URL}}":t.dbUrl,"{{DEFAULT_LOCALE}}":t.locale,"{{DEFAULT_CURRENCY}}":t.currency},r=["package.json",".env.example","packages/database/prisma/schema.prisma","apps/api/package.json","apps/admin/package.json","apps/tenant/package.json","docs/architecture/tech-stack.md","docs/architecture/source-tree.md","docs/architecture/coding-standards.md"];for(let i of r){let s=se.join(e,i);if(!await _.pathExists(s))continue;let c=await _.readFile(s,"utf-8");for(let[l,d]of Object.entries(n))c=c.split(l).join(d);await _.writeFile(s,c,"utf-8")}let a=se.join(e,"package.json");if(await _.pathExists(a)){let i=await _.readJson(a);i.name!==t.projectName&&(i.name=t.projectName,await _.writeJson(a,i,{spaces:2}))}}async runInstall(e){let t=await ue("pnpm",["install"],e);if(t!==0)throw new Error(`pnpm install failed with exit code ${t}`)}async initGit(e){await ue("git",["init"],e),await ue("git",["add","."],e),await ue("git",["commit","-m","chore: initial kaven setup"],e)}async installSquad(e){let t=se.join(e,"squads"),n=se.join(t,"kaven-squad");if(await _.pathExists(n))return{installed:!1,reason:"already-exists"};await _.ensureDir(t);let r=await ue("git",["clone","--depth","1",er,n],process.cwd());if(r!==0)return{installed:!1,reason:`git clone exited with code ${r}`};let a=se.join(n,".git");return await _.pathExists(a)&&await _.remove(a),{installed:!0}}async installAIOXCore(e){let t=await ue("npx",["aiox-core@5.0.3","install","--quiet"],e);return t!==0?{installed:!1,reason:`npx aiox-core exited with code ${t}`}:{installed:!0}}async healthCheck(e){let t=[],n=["package.json",".env.example","packages/database/prisma/schema.prisma"];for(let a of n)await _.pathExists(se.join(e,a))||t.push(`Missing required file: ${a}`);return await _.pathExists(se.join(e,"node_modules"))||t.push("Dependencies not installed. Run: pnpm install"),{healthy:t.length===0,issues:t}}};import pe from"path";import oe from"fs-extra";import tr from"os";import vo from"js-yaml";import{z as E}from"zod";var tt=pe.join(tr.homedir(),".kaven"),kt=pe.join(tt,"config.json"),ko="kaven-config.yaml",bo=E.object({registry:E.string().url().default("https://marketplace.kaven.site"),telemetry:E.boolean().default(!0),theme:E.enum(["light","dark"]).default("dark"),language:E.enum(["en","pt-BR"]).default("en"),customRegistry:E.string().url().optional(),projectId:E.string().uuid().optional(),activeModules:E.array(E.string()).default([]),capabilities:E.record(E.string(),E.union([E.string(),E.boolean(),E.number()])).default({}),lastLogin:E.string().datetime().optional(),projectDefaults:E.object({dbUrl:E.string().optional(),emailProvider:E.enum(["postmark","resend","ses","smtp"]).optional(),locale:E.string().optional(),currency:E.string().optional()}).optional()}),bt=class{globalConfig={};projectConfig={};currentConfig;constructor(){this.currentConfig=bo.parse({})}async initialize(){if(await oe.ensureDir(tt),await oe.pathExists(kt))try{this.globalConfig=await oe.readJson(kt)}catch{this.globalConfig={}}let e=this.findProjectRoot();if(e){let t=pe.join(e,ko);if(await oe.pathExists(t))try{let n=await oe.readFile(t,"utf-8");this.projectConfig=vo.load(n)}catch{this.projectConfig={}}}this.resolve()}resolve(){this.currentConfig=bo.parse({...this.globalConfig,...this.projectConfig})}findProjectRoot(){let e=process.cwd();for(;e!==pe.parse(e).root;){if(oe.existsSync(pe.join(e,"package.json")))return e;e=pe.dirname(e)}return null}get(e){let t=`KAVEN_${e.toUpperCase()}`;if(process.env[t]!==void 0){let n=process.env[t];return typeof this.currentConfig[e]=="boolean"?n==="true":typeof this.currentConfig[e]=="number"?Number(n):n}return this.currentConfig[e]}async set(e,t,n="project"){n==="project"?(this.projectConfig[e]=t,await this.persistProject()):(this.globalConfig[e]=t,await this.persistGlobal()),this.resolve()}async persistGlobal(){await oe.ensureDir(tt),await oe.writeJson(kt,this.globalConfig,{spaces:2})}async persistProject(){let e=this.findProjectRoot();if(!e)return;let t=pe.join(e,ko),n=vo.dump(this.projectConfig,{lineWidth:120,noRefs:!0});await oe.writeFile(t,n,"utf-8")}async reset(){this.globalConfig={},this.projectConfig={},await this.persistGlobal(),await this.persistProject(),this.resolve()}getRegistry(){return this.currentConfig.customRegistry||this.currentConfig.registry}getAll(){return{...this.currentConfig}}getProjectRoot(){return this.findProjectRoot()}getConfigDir(){return tt}},D=new bt;import ce from"picocolors";var or=`
74
+ `))}import{Command as Ir}from"commander";import{Command as jr}from"commander";import se from"chalk";import qt from"fs/promises";import Jo from"path";import zo from"os";var Bo=Jo.join(zo.homedir(),".kaven","cache","licenses.json"),Ar=3600*1e3,bt=class{cacheDir=Jo.join(zo.homedir(),".kaven","cache");isValidFormat(e){return/^KAVEN-(STARTER|COMPLETE|PRO|ENTERPRISE)-[A-Z0-9]{8}-[A-Z0-9]{2}$/.test(e)}async readCache(){try{let e=await qt.readFile(Bo,"utf-8");return JSON.parse(e)}catch{return{}}}async writeCache(e){await qt.mkdir(this.cacheDir,{recursive:!0}),await qt.writeFile(Bo,JSON.stringify(e,null,2),"utf-8")}isCacheValid(e){return Date.now()-e.validatedAt<Ar}async getCached(e){let n=(await this.readCache())[e];return n&&this.isCacheValid(n)?n:null}async setCached(e){let t=await this.readCache();t[e.key]={...e,validatedAt:Date.now()},await this.writeCache(t)}async validateLicense(e,t){let n=await this.getCached(e);if(n)return{valid:!0,tier:n.tier,expiresAt:n.expiresAt,source:"cache"};if(!this.isValidFormat(e))throw new Error("Invalid license key format");let{MarketplaceClient:r}=await import("./MarketplaceClient-YCFH2VU4.js"),i=await new r().validateLicense(e,t);return await this.setCached({key:e,tier:i.tier,expiresAt:i.expiresAt,validatedAt:Date.now()}),{...i,source:"api"}}async getLicenseStatus(e){let{MarketplaceClient:t}=await import("./MarketplaceClient-YCFH2VU4.js");return new t().getLicenseStatus(e)}tierLevel(e){return{STARTER:1,COMPLETE:2,PRO:3,ENTERPRISE:4}[e.toUpperCase()]??0}userHasRequiredTier(e,t){return this.tierLevel(e)>=this.tierLevel(t)}};function Go(){return new jr("status").description("Show license status and tier information").argument("[license-key]","License key to check (uses stored license if omitted)").action(async o=>{let e=new bt,t=o??process.env.KAVEN_LICENSE_KEY;t||(console.error(se.red("\u2717 No license key provided. Pass as argument or set KAVEN_LICENSE_KEY.")),process.exit(1));try{console.log(se.dim("Checking license status..."));let n=await e.getLicenseStatus(t);if(console.log(`
75
+ `+se.bold("License Status")+`
76
+ `),console.log(` Key: ${se.dim(n.key.substring(0,16)+"...")}`),console.log(` Tier: ${se.magenta(n.tier)}`),n.expiresAt){let r=n.daysUntilExpiry,a=r!==null&&r<30?se.red:se.green;console.log(` Expires: ${a(n.expiresAt)}${r!==null?se.dim(` (${r} days)`):""}`)}else console.log(` Expires: ${se.green("Never")}`);console.log()}catch(n){let r=n instanceof Error?n.message:"Failed to check license status";console.error(se.red("\u2717 "+r)),process.exit(1)}})}function Ho(){let o=new Ir("license").description("Manage Kaven licenses");return o.addCommand(Go()),o}import nt from"path";import rt from"fs-extra";import{fileURLToPath as Kr}from"url";import{intro as Vr,outro as Br,text as $t,select as Qo,confirm as Jr,spinner as zr,note as Gr,isCancel as Hr,cancel as Zt}from"@clack/prompts";import W from"picocolors";import J from"fs-extra";import ve from"path";import{spawn as Tr}from"child_process";var Rr="https://github.com/kaven-co/kaven-template.git",Dr="https://github.com/bychrisr/kaven-squad";function Pe(o,e,t,n){return new Promise((r,a)=>{let i=Tr(o,e,{cwd:t,stdio:n?"pipe":"inherit"});n&&i.stdout&&i.stdout.on("data",s=>n(s.toString())),n&&i.stderr&&i.stderr.on("data",s=>n(s.toString())),i.on("error",a),i.on("close",s=>r(s??0))})}var xt=class{validateName(e){return!e||e.trim().length===0?{valid:!1,reason:"Project name cannot be empty"}:/\s/.test(e)?{valid:!1,reason:"Project name cannot contain spaces"}:/^[a-z0-9-]+$/.test(e)?{valid:!0}:{valid:!1,reason:"Project name must only contain lowercase letters, numbers, and hyphens"}}async cloneTemplate(e,t){let n=t||Rr;if(console.log(`[INIT] Clone Source: ${n}`),console.log(`[INIT] Target Dir: ${e}`),await J.pathExists(n)&&(n.startsWith("/")||n.startsWith("./")||n.startsWith("../"))){console.log("[INIT] Local Path Detected. Copying..."),await J.copy(n,e,{filter:a=>!a.includes("node_modules")&&!a.includes(".git")&&!a.includes(".turbo")}),console.log("[INIT] Local Copy Done.");return}let r=await Pe("git",["clone","--depth","1",n,e],process.cwd());if(r!==0)throw new Error(`git clone failed with exit code ${r}`)}async removeGitDir(e){let t=ve.join(e,".git");await J.pathExists(t)&&await J.remove(t)}async replacePlaceholders(e,t){let n={"{{PROJECT_NAME}}":t.projectName,"{{DATABASE_URL}}":t.dbUrl,"{{DEFAULT_LOCALE}}":t.locale,"{{DEFAULT_CURRENCY}}":t.currency},r=["package.json",".env.example","packages/database/prisma/schema.prisma","apps/api/package.json","apps/admin/package.json","apps/tenant/package.json","docs/architecture/tech-stack.md","docs/architecture/source-tree.md","docs/architecture/coding-standards.md"];for(let i of r){let s=ve.join(e,i);if(!await J.pathExists(s))continue;let c=await J.readFile(s,"utf-8");for(let[l,d]of Object.entries(n))c=c.split(l).join(d);await J.writeFile(s,c,"utf-8")}let a=ve.join(e,"package.json");if(await J.pathExists(a)){let i=await J.readJson(a);i.name!==t.projectName&&(i.name=t.projectName,await J.writeJson(a,i,{spaces:2}))}}async runInstall(e){let t=await Pe("pnpm",["install"],e);if(t!==0)throw new Error(`pnpm install failed with exit code ${t}`)}async initGit(e){await Pe("git",["init"],e),await Pe("git",["add","."],e),await Pe("git",["commit","-m","chore: initial kaven setup"],e)}async installSquad(e){let t=ve.join(e,"squads"),n=ve.join(t,"kaven-squad");if(await J.pathExists(n))return{installed:!1,reason:"already-exists"};await J.ensureDir(t);let r=await Pe("git",["clone","--depth","1",Dr,n],process.cwd());if(r!==0)return{installed:!1,reason:`git clone exited with code ${r}`};let a=ve.join(n,".git");return await J.pathExists(a)&&await J.remove(a),{installed:!0}}async installAIOXCore(e){let t=await Pe("npx",["aiox-core@5.0.3","install","--quiet"],e);return t!==0?{installed:!1,reason:`npx aiox-core exited with code ${t}`}:{installed:!0}}async healthCheck(e){let t=[],n=["package.json",".env.example","packages/database/prisma/schema.prisma"];for(let a of n)await J.pathExists(ve.join(e,a))||t.push(`Missing required file: ${a}`);return await J.pathExists(ve.join(e,"node_modules"))||t.push("Dependencies not installed. Run: pnpm install"),{healthy:t.length===0,issues:t}}};import Me from"path";import pe from"fs-extra";import _r from"os";import qo from"js-yaml";import{z as j}from"zod";var Et=Me.join(_r.homedir(),".kaven"),Wt=Me.join(Et,"config.json"),Wo="kaven-config.yaml",Xo=j.object({registry:j.string().url().default("https://marketplace.kaven.site"),telemetry:j.boolean().default(!0),theme:j.enum(["light","dark"]).default("dark"),language:j.enum(["en","pt-BR"]).default("en"),customRegistry:j.string().url().optional(),projectId:j.string().uuid().optional(),activeModules:j.array(j.string()).default([]),capabilities:j.record(j.string(),j.union([j.string(),j.boolean(),j.number()])).default({}),lastLogin:j.string().datetime().optional(),projectDefaults:j.object({dbUrl:j.string().optional(),emailProvider:j.enum(["postmark","resend","ses","smtp"]).optional(),locale:j.string().optional(),currency:j.string().optional()}).optional()}),Xt=class{globalConfig={};projectConfig={};currentConfig;constructor(){this.currentConfig=Xo.parse({})}async initialize(){if(await pe.ensureDir(Et),await pe.pathExists(Wt))try{this.globalConfig=await pe.readJson(Wt)}catch{this.globalConfig={}}let e=this.findProjectRoot();if(e){let t=Me.join(e,Wo);if(await pe.pathExists(t))try{let n=await pe.readFile(t,"utf-8");this.projectConfig=qo.load(n)}catch{this.projectConfig={}}}this.resolve()}resolve(){this.currentConfig=Xo.parse({...this.globalConfig,...this.projectConfig})}findProjectRoot(){let e=process.cwd();for(;e!==Me.parse(e).root;){if(pe.existsSync(Me.join(e,"package.json")))return e;e=Me.dirname(e)}return null}get(e){let t=`KAVEN_${e.toUpperCase()}`;if(process.env[t]!==void 0){let n=process.env[t];return typeof this.currentConfig[e]=="boolean"?n==="true":typeof this.currentConfig[e]=="number"?Number(n):n}return this.currentConfig[e]}async set(e,t,n="project"){n==="project"?(this.projectConfig[e]=t,await this.persistProject()):(this.globalConfig[e]=t,await this.persistGlobal()),this.resolve()}async persistGlobal(){await pe.ensureDir(Et),await pe.writeJson(Wt,this.globalConfig,{spaces:2})}async persistProject(){let e=this.findProjectRoot();if(!e)return;let t=Me.join(e,Wo),n=qo.dump(this.projectConfig,{lineWidth:120,noRefs:!0});await pe.writeFile(t,n,"utf-8")}async reset(){this.globalConfig={},this.projectConfig={},await this.persistGlobal(),await this.persistProject(),this.resolve()}getRegistry(){return this.currentConfig.customRegistry||this.currentConfig.registry}getAll(){return{...this.currentConfig}}getProjectRoot(){return this.findProjectRoot()}getConfigDir(){return Et}},z=new Xt;import ke from"picocolors";var Lr=`
73
77
  \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557
74
78
  \u2588\u2588\u2551 \u2588\u2588\u2554\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551
75
79
  \u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551
76
80
  \u2588\u2588\u2554\u2550\u2588\u2588\u2557 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u255A\u2588\u2588\u2557 \u2588\u2588\u2554\u255D\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551
77
81
  \u2588\u2588\u2551 \u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551
78
82
  \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D
79
- `;function xo(){return`
80
- ${or.split(`
81
- `).map(t=>ce.cyan(t)).join(`
83
+ `;function Yo(){return`
84
+ ${Lr.split(`
85
+ `).map(t=>ke.cyan(t)).join(`
82
86
  `)}
83
- ${ce.dim(" The Premium Framework Orchestrator for SaaS")}
84
- `}var hc={primary:ce.cyan,secondary:ce.magenta,success:ce.green,warning:ce.yellow,error:ce.red,dim:ce.dim};import*as nr from"child_process";import xt from"fs-extra";import*as ot from"path";import ar from"ora";import Eo from"chalk";var rr={...nr},ir={ora:ar};async function nt(o,e={}){if(e.skipAiox)return;let t=ot.join(o,".aiox-core");if(!xt.existsSync(t)&&!xt.existsSync(ot.join(o,".aiox")))return;let n=ir.ora("Bootstrapping AIOX environment...").start();try{let r=xt.existsSync(ot.join(o,".aiox-core/bin/aiox.js"))?".aiox-core/bin/aiox.js":".aiox/bin/aiox.js";rr.execSync(`node ${r} devops environment-bootstrap --quiet`,{cwd:o,stdio:"pipe",timeout:6e4}),n.succeed("AIOX environment bootstrapped")}catch(r){n.warn("AIOX environment bootstrap failed"),console.log(Eo.yellow(" \u26A0 Run manually inside the project: kaven aiox bootstrap")),process.env.KAVEN_DEBUG&&console.error(Eo.gray(` Error: ${r.message}`))}}function me(o){mr(o)&&(Et("Operation cancelled."),process.exit(0))}async function Co(o,e){let t=await X.getInstance(),n=new et,r=await So({message:"\u{1F310} Select Language / Selecione o Idioma:",options:[{label:"English",value:"en"},{label:"Portugu\xEAs (Brasil)",value:"pt-BR"}],initialValue:"en"});me(r),await t.setLanguage(r),await D.initialize(),await D.set("language",r,"global"),console.log(xo()),cr(K.cyan(t.t("init.intro")));let a=o;a||(e.defaults?a="my-kaven-app":(a=await rt({message:t.t("init.projectName"),placeholder:"my-kaven-app",validate:l=>{let d=n.validateName(l||"");return d.valid?void 0:d.reason}}),me(a)));let i=Ne.resolve(process.cwd(),a);await Ue.pathExists(i)&&!e.force&&(Et(K.red(`Error: Directory "${a}" already exists. Use --force to overwrite.`)),process.exit(1));let s;if(e.defaults){let l=D.getAll().projectDefaults||{};s={dbUrl:e.dbUrl||l.dbUrl||`postgresql://user:password@localhost:5432/${a}`,emailProvider:e.emailProvider||l.emailProvider||"postmark",locale:e.locale||l.locale||"en-US",currency:e.currency||l.currency||"USD"}}else{let l=D.getAll().projectDefaults||{},d=await rt({message:"Database URL (PostgreSQL):",initialValue:l.dbUrl||`postgresql://user:password@localhost:5432/${a}`});me(d);let p=await So({message:"Email provider:",options:[{label:"Postmark",value:"postmark"},{label:"Resend",value:"resend"},{label:"AWS SES",value:"ses"},{label:"SMTP",value:"smtp"}],initialValue:l.emailProvider||"postmark"});me(p);let u=await rt({message:"Default locale:",initialValue:l.locale||"en-US"});me(u);let m=await rt({message:"Default currency:",initialValue:l.currency||"USD"});me(m);let g=await dr({message:t.t("init.withSquad"),initialValue:!0});me(g),e.withSquad=g,s={dbUrl:d,emailProvider:p,locale:u,currency:m}}let c=ur();c.start("Cloning kaven-template...");try{await n.cloneTemplate(i,e.template),c.stop(K.green("Template cloned"))}catch(l){let d=l instanceof Error?l:new Error(String(l));c.stop(K.red("Clone failed")),Et(d.message),process.exit(1)}c.start("Configuring project..."),await n.removeGitDir(i),await n.replacePlaceholders(i,{...s,projectName:a});try{let l=Ne.join(i,".claude","CLAUDE.md");await Ue.ensureDir(Ne.dirname(l));let d=sr(import.meta.url),p=Ne.dirname(d),u=Ne.resolve(p,"../../core/templates/CLAUDE.md.hbs");if(await Ue.pathExists(u)){let g=(await Ue.readFile(u,"utf-8")).replace("${new Date().toLocaleDateString()}",new Date().toLocaleDateString());await Ue.writeFile(l,g,"utf-8")}}catch(l){console.warn(K.dim(`[init] CLAUDE.md injection skipped: ${l instanceof Error?l.message:String(l)}`))}if(c.stop(K.green("Project configured")),!e.skipInstall){c.start(t.t("init.installing"));try{await n.runInstall(i),c.stop(K.green("Dependencies installed"))}catch{c.stop(K.yellow("pnpm install failed (skip)"))}}if(!e.skipGit){c.start("Initializing git...");try{await n.initGit(i),c.stop(K.green("Git initialized"))}catch{c.stop(K.yellow("Git init failed (skip)"))}}e.withSquad&&(c.start("Infecting AIOX intelligence..."),(await n.installSquad(i)).installed?(await n.installAIOXCore(i),c.stop(K.green("Kaven Squad online \u{1F916}"))):c.stop(K.yellow("AIOX bootstrap skipped or failed"))),await nt(i,{skipAiox:e.skipAiox}),pr(`cd ${K.cyan(a)}
87
+ ${ke.dim(" The Premium Framework Orchestrator for SaaS")}
88
+ `}var kl={primary:ke.cyan,secondary:ke.magenta,success:ke.green,warning:ke.yellow,error:ke.red,dim:ke.dim};import*as Or from"child_process";import Yt from"fs-extra";import*as St from"path";import Ur from"ora";import Zo from"chalk";var Fr={...Or},Nr={ora:Ur};async function Ct(o,e={}){if(e.skipAiox)return;let t=St.join(o,".aiox-core");if(!Yt.existsSync(t)&&!Yt.existsSync(St.join(o,".aiox")))return;let n=Nr.ora("Bootstrapping AIOX environment...").start();try{let r=Yt.existsSync(St.join(o,".aiox-core/bin/aiox.js"))?".aiox-core/bin/aiox.js":".aiox/bin/aiox.js";Fr.execSync(`node ${r} devops environment-bootstrap --quiet`,{cwd:o,stdio:"pipe",timeout:6e4}),n.succeed("AIOX environment bootstrapped")}catch(r){n.warn("AIOX environment bootstrap failed"),console.log(Zo.yellow(" \u26A0 Run manually inside the project: kaven aiox bootstrap")),process.env.KAVEN_DEBUG&&console.error(Zo.gray(` Error: ${r.message}`))}}function Ae(o){Hr(o)&&(Zt("Operation cancelled."),process.exit(0))}async function en(o,e){let t=await ie.getInstance(),n=new xt,r=await Qo({message:"\u{1F310} Select Language / Selecione o Idioma:",options:[{label:"English",value:"en"},{label:"Portugu\xEAs (Brasil)",value:"pt-BR"}],initialValue:"en"});Ae(r),await t.setLanguage(r),await z.initialize(),await z.set("language",r,"global"),console.log(Yo()),Vr(W.cyan(t.t("init.intro")));let a=o;a||(e.defaults?a="my-kaven-app":(a=await $t({message:t.t("init.projectName"),placeholder:"my-kaven-app",validate:l=>{let d=n.validateName(l||"");return d.valid?void 0:d.reason}}),Ae(a)));let i=nt.resolve(process.cwd(),a);await rt.pathExists(i)&&!e.force&&(Zt(W.red(`Error: Directory "${a}" already exists. Use --force to overwrite.`)),process.exit(1));let s;if(e.defaults){let l=z.getAll().projectDefaults||{};s={dbUrl:e.dbUrl||l.dbUrl||`postgresql://user:password@localhost:5432/${a}`,emailProvider:e.emailProvider||l.emailProvider||"postmark",locale:e.locale||l.locale||"en-US",currency:e.currency||l.currency||"USD"}}else{let l=z.getAll().projectDefaults||{},d=await $t({message:"Database URL (PostgreSQL):",initialValue:l.dbUrl||`postgresql://user:password@localhost:5432/${a}`});Ae(d);let m=await Qo({message:"Email provider:",options:[{label:"Postmark",value:"postmark"},{label:"Resend",value:"resend"},{label:"AWS SES",value:"ses"},{label:"SMTP",value:"smtp"}],initialValue:l.emailProvider||"postmark"});Ae(m);let p=await $t({message:"Default locale:",initialValue:l.locale||"en-US"});Ae(p);let u=await $t({message:"Default currency:",initialValue:l.currency||"USD"});Ae(u);let g=await Jr({message:t.t("init.withSquad"),initialValue:!0});Ae(g),e.withSquad=g,s={dbUrl:d,emailProvider:m,locale:p,currency:u}}let c=zr();c.start("Cloning kaven-template...");try{await n.cloneTemplate(i,e.template),c.stop(W.green("Template cloned"))}catch(l){let d=l instanceof Error?l:new Error(String(l));c.stop(W.red("Clone failed")),Zt(d.message),process.exit(1)}c.start("Configuring project..."),await n.removeGitDir(i),await n.replacePlaceholders(i,{...s,projectName:a});try{let l=nt.join(i,".claude","CLAUDE.md");await rt.ensureDir(nt.dirname(l));let d=Kr(import.meta.url),m=nt.dirname(d),p=nt.resolve(m,"../../core/templates/CLAUDE.md.hbs");if(await rt.pathExists(p)){let g=(await rt.readFile(p,"utf-8")).replace("${new Date().toLocaleDateString()}",new Date().toLocaleDateString());await rt.writeFile(l,g,"utf-8")}}catch(l){console.warn(W.dim(`[init] CLAUDE.md injection skipped: ${l instanceof Error?l.message:String(l)}`))}if(c.stop(W.green("Project configured")),!e.skipInstall){c.start(t.t("init.installing"));try{await n.runInstall(i),c.stop(W.green("Dependencies installed"))}catch{c.stop(W.yellow("pnpm install failed (skip)"))}}if(!e.skipGit){c.start("Initializing git...");try{await n.initGit(i),c.stop(W.green("Git initialized"))}catch{c.stop(W.yellow("Git init failed (skip)"))}}e.withSquad&&(c.start("Infecting AIOX intelligence..."),(await n.installSquad(i)).installed?(await n.installAIOXCore(i),c.stop(W.green("Kaven Squad online \u{1F916}"))):c.stop(W.yellow("AIOX bootstrap skipped or failed"))),await Ct(i,{skipAiox:e.skipAiox}),Gr(`cd ${W.cyan(a)}
85
89
  cp .env.example .env
86
90
  npx prisma migrate dev
87
- pnpm dev`,"Next Steps"),lr(K.cyan(t.t("init.outro")));try{await D.set("projectDefaults",{dbUrl:s.dbUrl,emailProvider:s.emailProvider,locale:s.locale,currency:s.currency},"global")}catch(l){console.warn(K.dim(`[init] Config save skipped: ${l instanceof Error?l.message:String(l)}`))}}import M from"chalk";import $t from"ora";import kr from"open";import To from"path";import Ce from"fs-extra";import br from"os";import L from"chalk";import St from"ora";import at from"path";import{fileURLToPath as gr}from"url";import{spawn as fr}from"child_process";import Po from"fs";var hr=gr(import.meta.url),$o=at.dirname(hr);function yr(){let o=[at.join($o,"../../package.json"),at.join($o,"../../../package.json"),at.join(process.cwd(),"package.json")];for(let e of o)if(Po.existsSync(e))try{return JSON.parse(Po.readFileSync(e,"utf8"))}catch{continue}return{version:"0.4.2-alpha.0"}}var wr=yr(),Se=wr.version,ge="kaven-cli";async function Ct(){let o=St("Checking for updates...").start();try{let e=await fetch(`https://registry.npmjs.org/${ge}`);if(!e.ok){o.fail("Could not check for updates");return}let r=(await e.json())["dist-tags"]?.latest||Se;if(o.stop(),console.log(),console.log(L.bold("Version Check:")),console.log(` Current: ${L.cyan(Se)}`),console.log(` Latest: ${L.cyan(r)}`),console.log(),r===Se){console.log(L.green("\u2705 You're on the latest version!"));return}let a=Ao(Se),i=Ao(r);i.major>a.major||i.major===a.major&&i.minor>a.minor||i.major===a.major&&i.minor===a.minor&&i.patch>a.patch?(console.log(L.yellow(`\u26A0 Update available: ${r}`)),console.log(),console.log(L.bold("To upgrade, run:")),console.log(L.cyan(` npm install -g ${ge}@latest`)),console.log(L.cyan(" or")),console.log(L.cyan(` pnpm add -g ${ge}@latest`)),console.log(),console.log(L.gray("Release notes: https://github.com/kaven-co/kaven-cli/releases"))):console.log(L.green("\u2705 You're on the latest version!"))}catch(e){o.fail(`Check failed: ${e instanceof Error?e.message:String(e)}`),console.log(L.gray("You can manually check at: https://www.npmjs.com/package/kaven-cli"))}}async function Pt(){console.log();let o=St("Fetching latest version...").start();try{let e=await fetch(`https://registry.npmjs.org/${ge}`);if(!e.ok)throw new Error("Failed to fetch package info");let r=(await e.json())["dist-tags"]?.latest||Se;if(r===Se){o.succeed("Already on latest version");return}o.text=`Installing ${ge}@${r}...`;let a=process.env.npm_config_user_agent?.includes("pnpm")?"pnpm":"npm",i=await Mo(a,["install","-g",`${ge}@${r}`]);if(i!==0){o.fail(`Installation failed with exit code ${i}`),console.error(L.gray(`Try: ${a} install -g ${ge}@latest`)),process.exit(1);return}o.succeed(`Updated to ${r}`);let s=St("Running health check...").start(),c=await vr();c.ok?(s.succeed("Installation verified"),console.log(),console.log(L.green("\u2705 CLI upgraded successfully!")),console.log(L.gray("Try: kaven --version"))):(s.warn("Installation verification failed"),console.log(L.yellow(c.errors.join(`
88
- `))))}catch(e){o.fail(`Installation failed: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}async function vr(){let o=[];try{await Mo("kaven",["--version"],{stdio:"pipe"})!==0&&o.push("kaven command not available in PATH")}catch{o.push("Could not execute kaven command")}return{ok:o.length===0,errors:o}}function Mo(o,e,t){return new Promise((n,r)=>{let a=fr(o,e,t||{stdio:"inherit"});a.on("error",r),a.on("close",i=>n(i??0))})}function Ao(o){let e=o.replace(/^v/,"").split("-")[0],[t,n,r]=e.split(".").map(Number);return{major:t||0,minor:n||0,patch:r||0}}var Pe=To.join(br.homedir(),".kaven","license.json"),xr=["starter","complete","pro","enterprise"],Be={starter:"Starter",complete:"Complete",pro:"Pro",enterprise:"Enterprise"},Er=5e3,jo=120;async function Sr(){if(!await Ce.pathExists(Pe))return null;try{return(await Ce.readJson(Pe)).key||null}catch{return null}}async function Cr(o){let e={};if(await Ce.pathExists(Pe))try{e=await Ce.readJson(Pe)}catch{}await Ce.ensureDir(To.dirname(Pe)),await Ce.writeJson(Pe,{...e,tier:o},{spaces:2})}function Pr(o){return new Promise(e=>setTimeout(e,o))}async function Io(o){let e=new T;try{await e.getValidToken()}catch{console.error(M.red("Error: Not authenticated. Run 'kaven auth login' first.")),process.exit(1);return}let t=await Sr();if(!t){console.error(M.red("Error: No license found. Add your license key first with 'kaven license status'.")),process.exit(1);return}let n=new J(e),r=$t("Loading your current license...").start(),a;try{a=(await n.getLicenseStatus(t)).tier.toLowerCase(),r.succeed(`Current tier: ${M.bold(Be[a]||a)}`)}catch{r.fail("Could not load license status"),console.error(M.gray("Try: kaven license status")),process.exit(1);return}let{printTierComparisonTable:i}=await import("./tier-table-DQMPQSI2.js");i(a,"pro"),console.log();let{select:s}=await import("@inquirer/prompts"),c=xr.filter(g=>g!==a&&g!=="enterprise");if(c.length===0){console.log(M.yellow(`You're already on the highest available tier (${Be[a]||a}).`)),console.log(M.gray("For Enterprise plans, contact: enterprise@kaven.site"));return}let l=await s({message:"Select target tier:",choices:c.map(g=>({name:Be[g],value:g}))});if(l===a){console.log(M.yellow(`Already on ${Be[a]||a}.`));return}let d=$t("Creating checkout session...").start(),p,u;try{let g=await n.createCheckoutSession(l,t);p=g.sessionUrl,u=g.sessionId,d.succeed("Checkout session created")}catch(g){d.fail("Failed to create checkout session"),console.error(M.red(g instanceof Error?g.message:String(g))),process.exit(1);return}if(o.browser!==!1){console.log(M.cyan("Opening checkout in your browser...")),console.log(M.gray(`URL: ${p}`));try{await kr(p)}catch{console.log(M.yellow("Could not open browser automatically. Open this URL manually:")),console.log(M.cyan(p))}}else console.log(M.cyan("Open this URL to complete checkout:")),console.log(M.bold(p));console.log();let m=$t("Waiting for payment confirmation (checking every 5s, max 10 min)...").start();for(let g=0;g<jo;g++){await Pr(Er);let k=jo-g-1;m.text=`Waiting for payment confirmation... (${k*5}s remaining)`;try{let F=await n.getCheckoutStatus(u);if(F.status==="confirmed"){m.succeed("Payment confirmed!");let I=F.tier||l;await Cr(I),console.log(),console.log(M.green(`\u2705 Successfully upgraded to ${Be[I]||I}!`)),console.log(M.gray("Your new features are now unlocked."));return}if(F.status==="cancelled"){m.fail("Checkout was cancelled."),console.log(M.gray("No changes were made to your subscription."));return}if(F.status==="failed"){m.fail("Payment failed."),console.log(M.gray("Please try again or contact support@kaven.site")),process.exit(1);return}}catch{}}m.warn("Timed out waiting for payment confirmation."),console.log(),console.log(M.yellow("If you completed payment, your upgrade may take a few minutes to activate.")),console.log(M.gray("Check your upgrade status at: https://dashboard.kaven.site/billing"))}import ne from"chalk";import Z from"fs-extra";import $e from"path";import $r from"os";var Mt=class{cacheDir;maxSizeBytes;indexPath;constructor(e,t){this.cacheDir=e??$e.join($r.homedir(),".kaven","cache"),this.maxSizeBytes=t??50*1024*1024,this.indexPath=$e.join(this.cacheDir,"_index.json")}async ensureDir(){await Z.ensureDir(this.cacheDir)}keyToFileName(e){return e.replace(/[^a-zA-Z0-9-_:.]/g,"_")+".json"}async readIndex(){try{if(await Z.pathExists(this.indexPath))return await Z.readJson(this.indexPath)}catch{}return{}}async writeIndex(e){await this.ensureDir(),await Z.writeJson(this.indexPath,e,{spaces:2})}async get(e){let n=(await this.readIndex())[e];if(!n||Date.now()>n.expiresAt)return null;try{let r=$e.join(this.cacheDir,n.file);return(await Z.readJson(r)).data}catch{return null}}async getStale(e){let n=(await this.readIndex())[e];if(!n)return null;try{let r=$e.join(this.cacheDir,n.file);return(await Z.readJson(r)).data}catch{return null}}async set(e,t,n){await this.ensureDir();let r=JSON.stringify(t),a=Buffer.byteLength(r,"utf8"),i=Date.now(),s=i+n,c=this.keyToFileName(e),l=$e.join(this.cacheDir,c),d={data:t,expiresAt:s,size:a,createdAt:i};await Z.writeJson(l,d,{spaces:2});let p=await this.readIndex();p[e]={file:c,expiresAt:s,size:a,createdAt:i},await this.writeIndex(p),await this.evict()}async evict(){let e=await this.readIndex(),t=Object.entries(e),n=t.reduce((a,[,i])=>a+i.size,0);if(n<=this.maxSizeBytes)return;t.sort(([,a],[,i])=>a.createdAt-i.createdAt);let r={...e};for(let[a,i]of t){if(n<=this.maxSizeBytes)break;try{let s=$e.join(this.cacheDir,i.file);await Z.remove(s),delete r[a],n-=i.size}catch{}}await this.writeIndex(r)}async stats(){let e=await this.readIndex(),t=Object.values(e);if(t.length===0)return{totalSize:0,entries:0};let n=t.reduce((s,c)=>s+c.size,0),r=t.map(s=>s.createdAt),a=new Date(Math.min(...r)),i=new Date(Math.max(...r));return{totalSize:n,entries:t.length,oldest:a,newest:i}}async clear(){await Z.pathExists(this.cacheDir)&&await Z.remove(this.cacheDir)}},At=null;function jt(){return At||(At=new Mt),At}function Ro(o){if(o===0)return"0 B";let e=1024,t=["B","KB","MB","GB"],n=Math.floor(Math.log(o)/Math.log(e));return`${parseFloat((o/Math.pow(e,n)).toFixed(1))} ${t[n]}`}async function _o(){let o=jt(),e=await o.stats();console.log(ne.bold(`
91
+ pnpm dev`,"Next Steps"),Br(W.cyan(t.t("init.outro")));try{await z.set("projectDefaults",{dbUrl:s.dbUrl,emailProvider:s.emailProvider,locale:s.locale,currency:s.currency},"global")}catch(l){console.warn(W.dim(`[init] Config save skipped: ${l instanceof Error?l.message:String(l)}`))}}import L from"chalk";import oo from"ora";import ea from"open";import sn from"path";import Ne from"fs-extra";import ta from"os";import G from"chalk";import Qt from"ora";import Pt from"path";import{fileURLToPath as qr}from"url";import{spawn as Wr}from"child_process";import tn from"fs";var Xr=qr(import.meta.url),on=Pt.dirname(Xr);function Yr(){let o=[Pt.join(on,"../../package.json"),Pt.join(on,"../../../package.json"),Pt.join(process.cwd(),"package.json")];for(let e of o)if(tn.existsSync(e))try{return JSON.parse(tn.readFileSync(e,"utf8"))}catch{continue}return{version:"0.4.2-alpha.0"}}var Zr=Yr(),Ue=Zr.version,je="kaven-cli";async function eo(){let o=Qt("Checking for updates...").start();try{let e=await fetch(`https://registry.npmjs.org/${je}`);if(!e.ok){o.fail("Could not check for updates");return}let r=(await e.json())["dist-tags"]?.latest||Ue;if(o.stop(),console.log(),console.log(G.bold("Version Check:")),console.log(` Current: ${G.cyan(Ue)}`),console.log(` Latest: ${G.cyan(r)}`),console.log(),r===Ue){console.log(G.green("\u2705 You're on the latest version!"));return}let a=nn(Ue),i=nn(r);i.major>a.major||i.major===a.major&&i.minor>a.minor||i.major===a.major&&i.minor===a.minor&&i.patch>a.patch?(console.log(G.yellow(`\u26A0 Update available: ${r}`)),console.log(),console.log(G.bold("To upgrade, run:")),console.log(G.cyan(` npm install -g ${je}@latest`)),console.log(G.cyan(" or")),console.log(G.cyan(` pnpm add -g ${je}@latest`)),console.log(),console.log(G.gray("Release notes: https://github.com/kaven-co/kaven-cli/releases"))):console.log(G.green("\u2705 You're on the latest version!"))}catch(e){o.fail(`Check failed: ${e instanceof Error?e.message:String(e)}`),console.log(G.gray("You can manually check at: https://www.npmjs.com/package/kaven-cli"))}}async function to(){console.log();let o=Qt("Fetching latest version...").start();try{let e=await fetch(`https://registry.npmjs.org/${je}`);if(!e.ok)throw new Error("Failed to fetch package info");let r=(await e.json())["dist-tags"]?.latest||Ue;if(r===Ue){o.succeed("Already on latest version");return}o.text=`Installing ${je}@${r}...`;let a=process.env.npm_config_user_agent?.includes("pnpm")?"pnpm":"npm",i=await rn(a,["install","-g",`${je}@${r}`]);if(i!==0){o.fail(`Installation failed with exit code ${i}`),console.error(G.gray(`Try: ${a} install -g ${je}@latest`)),process.exit(1);return}o.succeed(`Updated to ${r}`);let s=Qt("Running health check...").start(),c=await Qr();c.ok?(s.succeed("Installation verified"),console.log(),console.log(G.green("\u2705 CLI upgraded successfully!")),console.log(G.gray("Try: kaven --version"))):(s.warn("Installation verification failed"),console.log(G.yellow(c.errors.join(`
92
+ `))))}catch(e){o.fail(`Installation failed: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}}async function Qr(){let o=[];try{await rn("kaven",["--version"],{stdio:"pipe"})!==0&&o.push("kaven command not available in PATH")}catch{o.push("Could not execute kaven command")}return{ok:o.length===0,errors:o}}function rn(o,e,t){return new Promise((n,r)=>{let a=Wr(o,e,t||{stdio:"inherit"});a.on("error",r),a.on("close",i=>n(i??0))})}function nn(o){let e=o.replace(/^v/,"").split("-")[0],[t,n,r]=e.split(".").map(Number);return{major:t||0,minor:n||0,patch:r||0}}var Ke=sn.join(ta.homedir(),".kaven","license.json"),oa=["starter","complete","pro","enterprise"],at={starter:"Starter",complete:"Complete",pro:"Pro",enterprise:"Enterprise"},na=5e3,an=120;async function ra(){if(!await Ne.pathExists(Ke))return null;try{return(await Ne.readJson(Ke)).key||null}catch{return null}}async function aa(o){let e={};if(await Ne.pathExists(Ke))try{e=await Ne.readJson(Ke)}catch{}await Ne.ensureDir(sn.dirname(Ke)),await Ne.writeJson(Ke,{...e,tier:o},{spaces:2})}function ia(o){return new Promise(e=>setTimeout(e,o))}async function cn(o){let e=new P;try{await e.getValidToken()}catch{console.error(L.red("Error: Not authenticated. Run 'kaven auth login' first.")),process.exit(1);return}let t=await ra();if(!t){console.error(L.red("Error: No license found. Add your license key first with 'kaven license status'.")),process.exit(1);return}let n=new V(e),r=oo("Loading your current license...").start(),a;try{a=(await n.getLicenseStatus(t)).tier.toLowerCase(),r.succeed(`Current tier: ${L.bold(at[a]||a)}`)}catch{r.fail("Could not load license status"),console.error(L.gray("Try: kaven license status")),process.exit(1);return}let{printTierComparisonTable:i}=await import("./tier-table-DQMPQSI2.js");i(a,"pro"),console.log();let{select:s}=await import("@inquirer/prompts"),c=oa.filter(g=>g!==a&&g!=="enterprise");if(c.length===0){console.log(L.yellow(`You're already on the highest available tier (${at[a]||a}).`)),console.log(L.gray("For Enterprise plans, contact: enterprise@kaven.site"));return}let l=await s({message:"Select target tier:",choices:c.map(g=>({name:at[g],value:g}))});if(l===a){console.log(L.yellow(`Already on ${at[a]||a}.`));return}let d=oo("Creating checkout session...").start(),m,p;try{let g=await n.createCheckoutSession(l,t);m=g.sessionUrl,p=g.sessionId,d.succeed("Checkout session created")}catch(g){d.fail("Failed to create checkout session"),console.error(L.red(g instanceof Error?g.message:String(g))),process.exit(1);return}if(o.browser!==!1){console.log(L.cyan("Opening checkout in your browser...")),console.log(L.gray(`URL: ${m}`));try{await ea(m)}catch{console.log(L.yellow("Could not open browser automatically. Open this URL manually:")),console.log(L.cyan(m))}}else console.log(L.cyan("Open this URL to complete checkout:")),console.log(L.bold(m));console.log();let u=oo("Waiting for payment confirmation (checking every 5s, max 10 min)...").start();for(let g=0;g<an;g++){await ia(na);let k=an-g-1;u.text=`Waiting for payment confirmation... (${k*5}s remaining)`;try{let C=await n.getCheckoutStatus(p);if(C.status==="confirmed"){u.succeed("Payment confirmed!");let F=C.tier||l;await aa(F),console.log(),console.log(L.green(`\u2705 Successfully upgraded to ${at[F]||F}!`)),console.log(L.gray("Your new features are now unlocked."));return}if(C.status==="cancelled"){u.fail("Checkout was cancelled."),console.log(L.gray("No changes were made to your subscription."));return}if(C.status==="failed"){u.fail("Payment failed."),console.log(L.gray("Please try again or contact support@kaven.site")),process.exit(1);return}}catch{}}u.warn("Timed out waiting for payment confirmation."),console.log(),console.log(L.yellow("If you completed payment, your upgrade may take a few minutes to activate.")),console.log(L.gray("Check your upgrade status at: https://dashboard.kaven.site/billing"))}import Ve from"path";import Mt from"fs-extra";import*as te from"@clack/prompts";import x from"picocolors";var O={intro:te.intro,outro:te.outro,spinner:te.spinner,log:{info:te.log.info,warn:te.log.warn,success:te.log.success,error:te.log.error,step:te.log.step,message:te.log.message}},sa="kaven-cli";function ca(o){let e=[Ve.join(o,"package.json"),Ve.join(Ve.dirname(new URL(import.meta.url).pathname),"../../../package.json"),Ve.join(Ve.dirname(new URL(import.meta.url).pathname),"../../package.json")];for(let t of e)try{if(Mt.existsSync(t)){let n=JSON.parse(Mt.readFileSync(t,"utf8"));if(n.version)return n.version}}catch{}return"0.4.2-alpha.0"}async function la(){try{let o=await fetch(`https://registry.npmjs.org/${sa}`);return o.ok?(await o.json())["dist-tags"]?.latest??null:null}catch{return null}}function ln(o,e){let t=a=>a.replace(/^v/,"").split("-")[0].split(".").map(Number),n=t(o),r=t(e);for(let a=0;a<3;a++)if((n[a]??0)!==(r[a]??0))return(n[a]??0)-(r[a]??0);return 0}async function da(o){let e=Ve.join(o,".kaven","cache","modules");if(!await Mt.pathExists(e))return[];let t=await Mt.readdir(e),n=new Set;for(let r of t){let a=r.lastIndexOf("-");a>0&&n.add(r.slice(0,a))}return[...n]}async function ua(o,e){let t=ca(o),n=null,r=!1;e&&(n=await la(),n&&ln(n,t)>0&&(r=!0));let a=await da(o),i=[];if(a.length>0){let s=null;try{let c=new P;await c.getValidToken(),s=new V(c)}catch{}for(let c of a){let l=await yt(c,o);if(!l)continue;let d=null,m;if(s)try{d=(await s.getModule(c)).latestVersion??null}catch(u){m=de(u).message}else m="marketplace offline or not authenticated";let p=!!(d&&ln(d,l)>0);i.push({slug:c,installed:l,latest:d,outdated:p,error:m})}}return{cliCurrent:t,cliLatest:n,cliOutdated:r,modules:i}}function pa(o,e){if(e&&(o.cliLatest===null?O.log.warn(x.yellow(`kaven-cli: ${x.bold(o.cliCurrent)} (could not reach npm)`)):o.cliOutdated?O.log.warn(x.yellow(`kaven-cli: ${x.bold(o.cliCurrent)} \u2192 ${x.bold(o.cliLatest)} available`)+x.dim(`
93
+ npm install -g kaven-cli@latest`)):O.log.success(x.green(`kaven-cli: ${x.bold(o.cliCurrent)} \u2713 up to date`))),o.modules.length===0){O.log.info(x.dim("No modules installed in this project."));return}for(let t of o.modules)t.error?O.log.warn(x.yellow(`${t.slug}: ${x.bold(t.installed)} (${t.error})`)):t.outdated?O.log.warn(x.yellow(`${t.slug}: ${x.bold(t.installed)} \u2192 ${x.bold(t.latest)} available`)):O.log.success(x.green(`${t.slug}: ${x.bold(t.installed)} \u2713`))}async function dn(o={},e){let t=e??process.cwd(),{core:n,module:r,all:a,check:i,skipVerify:s}=o;if(r){await Ze(r,t,{skipVerify:s});return}let c=!!(n||a||!n&&!r);O.intro(x.bold(x.cyan("kaven update")));let l=O.spinner();l.start("Verificando atualiza\xE7\xF5es dispon\xEDveis...");let d=await ua(t,c);if(l.stop("Status de atualiza\xE7\xF5es:"),pa(d,c),!(d.cliOutdated||d.modules.some(p=>p.outdated))){O.outro(x.green("\u2713 Tudo atualizado."));return}if(i){O.outro(x.yellow("Atualiza\xE7\xF5es dispon\xEDveis. Rode sem --check para aplicar."));return}if((a||n)&&d.cliOutdated&&d.cliLatest&&(O.log.info(x.cyan(`Atualizando kaven-cli ${d.cliCurrent} \u2192 ${d.cliLatest}...`)),O.log.info(x.dim(" Execute: npm install -g kaven-cli@latest"))),a){let p=d.modules.filter(u=>u.outdated);for(let u of p)O.log.info(x.cyan(`
94
+ Atualizando m\xF3dulo ${u.slug} ${u.installed} \u2192 ${u.latest}...`)),await Ze(u.slug,t,{skipVerify:s});O.outro(x.green("\u2713 Todos os m\xF3dulos atualizados."));return}if(!n){let p=d.modules.filter(u=>u.outdated);if(p.length>0){O.log.info(x.dim(`
95
+ Para atualizar m\xF3dulos:`));for(let u of p)O.log.info(x.dim(` kaven update --module ${u.slug}`));O.log.info(x.dim(`
96
+ Para atualizar tudo: kaven update --all`))}O.outro("")}}import me from"chalk";import ce from"fs-extra";import Be from"path";import ma from"os";var ro=class{cacheDir;maxSizeBytes;indexPath;constructor(e,t){this.cacheDir=e??Be.join(ma.homedir(),".kaven","cache"),this.maxSizeBytes=t??50*1024*1024,this.indexPath=Be.join(this.cacheDir,"_index.json")}async ensureDir(){await ce.ensureDir(this.cacheDir)}keyToFileName(e){return e.replace(/[^a-zA-Z0-9-_:.]/g,"_")+".json"}async readIndex(){try{if(await ce.pathExists(this.indexPath))return await ce.readJson(this.indexPath)}catch{}return{}}async writeIndex(e){await this.ensureDir(),await ce.writeJson(this.indexPath,e,{spaces:2})}async get(e){let n=(await this.readIndex())[e];if(!n||Date.now()>n.expiresAt)return null;try{let r=Be.join(this.cacheDir,n.file);return(await ce.readJson(r)).data}catch{return null}}async getStale(e){let n=(await this.readIndex())[e];if(!n)return null;try{let r=Be.join(this.cacheDir,n.file);return(await ce.readJson(r)).data}catch{return null}}async set(e,t,n){await this.ensureDir();let r=JSON.stringify(t),a=Buffer.byteLength(r,"utf8"),i=Date.now(),s=i+n,c=this.keyToFileName(e),l=Be.join(this.cacheDir,c),d={data:t,expiresAt:s,size:a,createdAt:i};await ce.writeJson(l,d,{spaces:2});let m=await this.readIndex();m[e]={file:c,expiresAt:s,size:a,createdAt:i},await this.writeIndex(m),await this.evict()}async evict(){let e=await this.readIndex(),t=Object.entries(e),n=t.reduce((a,[,i])=>a+i.size,0);if(n<=this.maxSizeBytes)return;t.sort(([,a],[,i])=>a.createdAt-i.createdAt);let r={...e};for(let[a,i]of t){if(n<=this.maxSizeBytes)break;try{let s=Be.join(this.cacheDir,i.file);await ce.remove(s),delete r[a],n-=i.size}catch{}}await this.writeIndex(r)}async stats(){let e=await this.readIndex(),t=Object.values(e);if(t.length===0)return{totalSize:0,entries:0};let n=t.reduce((s,c)=>s+c.size,0),r=t.map(s=>s.createdAt),a=new Date(Math.min(...r)),i=new Date(Math.max(...r));return{totalSize:n,entries:t.length,oldest:a,newest:i}}async clear(){await ce.pathExists(this.cacheDir)&&await ce.remove(this.cacheDir)}},no=null;function ao(){return no||(no=new ro),no}function un(o){if(o===0)return"0 B";let e=1024,t=["B","KB","MB","GB"],n=Math.floor(Math.log(o)/Math.log(e));return`${parseFloat((o/Math.pow(e,n)).toFixed(1))} ${t[n]}`}async function pn(){let o=ao(),e=await o.stats();console.log(me.bold(`
89
97
  Kaven CLI Cache Status
90
- `)),console.log(` Cache directory: ${ne.cyan(o.cacheDir)}`),console.log(` Total size: ${ne.cyan(Ro(e.totalSize))}`),console.log(` Cached entries: ${ne.cyan(e.entries.toString())}`),e.oldest&&console.log(` Oldest entry: ${ne.gray(e.oldest.toLocaleString())}`),e.newest&&console.log(` Newest entry: ${ne.gray(e.newest.toLocaleString())}`),console.log(),console.log(ne.gray("Run 'kaven cache clear' to remove all cached data."))}async function Do(){let o=jt(),e=await o.stats();if(e.entries===0){console.log(ne.gray("Cache is already empty."));return}await o.clear(),console.log(ne.green(`Cache cleared: ${e.entries} entries (${Ro(e.totalSize)}) removed.`))}import N from"chalk";async function Lo(o,e){(!o||!e)&&(console.error(N.red("Error: Both key and value are required")),console.error(N.gray("Usage: kaven config set KEY VALUE")),process.exit(1)),await D.initialize();try{await D.set(o,e),console.log(N.green(`\u2705 Set ${N.bold(o)} = ${N.bold(e)}`))}catch(t){console.error(N.red(`Error: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function Oo(o,e){o||(console.error(N.red("Error: Key is required")),console.error(N.gray("Usage: kaven config get KEY")),process.exit(1)),await D.initialize();try{let t=D.get(o);e.json?console.log(JSON.stringify({[o]:t},null,2)):console.log(t)}catch(t){console.error(N.red(`Error: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function Fo(o){await D.initialize();let e=D.getAll();if(o.json)console.log(JSON.stringify(e,null,2));else{console.log(N.bold("Kaven Configuration:")),console.log(N.gray(`Location: ${D.getConfigDir()}/config.json`)),console.log();let t=Object.entries(e),n=Math.max(...t.map(([r])=>r.length));for(let[r,a]of t){let i=" ".repeat(n-r.length),s=typeof a=="object"?JSON.stringify(a,null,2).replace(/\n/g,`
91
- `+" ".repeat(n+3)):a;console.log(` ${r}${i} ${N.cyan(s)}`)}}}async function Ko(){let{confirm:o}=await import("@inquirer/prompts");if(!await o({message:"Are you sure you want to reset config to defaults?",default:!1})){console.log(N.yellow("Cancelled."));return}await D.initialize(),await D.reset(),console.log(N.green("\u2705 Config reset to defaults"))}import{select as Ar,confirm as No,text as Mr,multiselect as jr,isCancel as Tr,cancel as Ir}from"@clack/prompts";import O from"picocolors";import It from"fs-extra";import Uo from"path";var re=[{key:"FEATURE_EMAIL_VERIFICATION",type:"boolean",description:"Email verification on signup",category:"Auth",defaultValue:"true"},{key:"FEATURE_2FA_TOTP",type:"boolean",description:"Two-factor authentication via TOTP",category:"Auth",defaultValue:"false"},{key:"FEATURE_SSO_SAML",type:"boolean",description:"Single Sign-On via SAML/OIDC",category:"Auth",defaultValue:"false"},{key:"FEATURE_SOCIAL_LOGIN",type:"boolean",description:"Login via Google, GitHub, etc.",category:"Auth",defaultValue:"true"},{key:"FEATURE_MAGIC_LINK",type:"boolean",description:"Passwordless login via email",category:"Auth",defaultValue:"false"},{key:"FEATURE_CUSTOM_DOMAIN",type:"boolean",description:"Custom domain per tenant",category:"Tenancy",defaultValue:"false"},{key:"FEATURE_WHITE_LABEL",type:"boolean",description:"Remove Kaven branding",category:"Tenancy",defaultValue:"false"},{key:"FEATURE_MULTI_BUSINESS",type:"boolean",description:"Multiple businesses per user",category:"Tenancy",defaultValue:"false"},{key:"FEATURE_AGENCY_HUB",type:"boolean",description:"Agency management dashboard",category:"Tenancy",defaultValue:"false"},{key:"FEATURE_TENANT_THEMES",type:"boolean",description:"Custom themes for tenants",category:"Tenancy",defaultValue:"true"},{key:"FEATURE_SUBSCRIPTIONS",type:"boolean",description:"Subscription management",category:"Billing",defaultValue:"true"},{key:"FEATURE_INVOICING",type:"boolean",description:"Automatic invoicing",category:"Billing",defaultValue:"true"},{key:"FEATURE_USAGE_BILLING",type:"boolean",description:"Metered usage billing",category:"Billing",defaultValue:"false"},{key:"FEATURE_PADDLE_CHECKOUT",type:"boolean",description:"Paddle payment integration",category:"Billing",defaultValue:"true"},{key:"FEATURE_PAGUBIT_PIX",type:"boolean",description:"Pix payment support",category:"Billing",defaultValue:"false"},{key:"FEATURE_API_ACCESS",type:"boolean",description:"External API access",category:"API",defaultValue:"false"},{key:"FEATURE_WEBHOOKS",type:"boolean",description:"Outgoing webhooks",category:"API",defaultValue:"false"},{key:"FEATURE_MARKETPLACE_ACCESS",type:"boolean",description:"Kaven Marketplace access",category:"API",defaultValue:"true"},{key:"MAX_API_CALLS_MONTH",type:"numeric",description:"Maximum API calls per month",category:"API",defaultValue:"10000"},{key:"MAX_AGENT_API_CALLS_HOUR",type:"numeric",description:"Maximum agent calls per hour",category:"API",defaultValue:"100"},{key:"MAX_TEAM_MEMBERS",type:"numeric",description:"Maximum team members per tenant",category:"Limits",defaultValue:"5"},{key:"MAX_PROJECTS",type:"numeric",description:"Maximum projects per tenant",category:"Limits",defaultValue:"3"},{key:"MAX_STORAGE_GB",type:"numeric",description:"Maximum storage in GB",category:"Limits",defaultValue:"1"},{key:"MAX_TENANTS",type:"numeric",description:"Maximum sub-tenants",category:"Limits",defaultValue:"1"},{key:"FEATURE_PRIORITY_SUPPORT",type:"boolean",description:"Priority support queue",category:"Support",defaultValue:"false"},{key:"FEATURE_AUDIT_COMPLIANCE",type:"boolean",description:"Audit logs and compliance",category:"Support",defaultValue:"false"},{key:"FEATURE_DATA_EXPORT",type:"boolean",description:"Customer data export",category:"Support",defaultValue:"true"}],Tt={starter:{FEATURE_EMAIL_VERIFICATION:!0,FEATURE_SOCIAL_LOGIN:!0,FEATURE_MARKETPLACE_ACCESS:!0,MAX_TEAM_MEMBERS:"5",MAX_PROJECTS:"3",MAX_API_CALLS_MONTH:"10000",MAX_AGENT_API_CALLS_HOUR:"100"},complete:{FEATURE_EMAIL_VERIFICATION:!0,FEATURE_SOCIAL_LOGIN:!0,FEATURE_CUSTOM_DOMAIN:!0,FEATURE_API_ACCESS:!0,FEATURE_MARKETPLACE_ACCESS:!0,MAX_TEAM_MEMBERS:"25",MAX_PROJECTS:"20",MAX_API_CALLS_MONTH:"100000",MAX_AGENT_API_CALLS_HOUR:"500"},pro:{FEATURE_EMAIL_VERIFICATION:!0,FEATURE_SOCIAL_LOGIN:!0,FEATURE_CUSTOM_DOMAIN:!0,FEATURE_WHITE_LABEL:!0,FEATURE_API_ACCESS:!0,FEATURE_MARKETPLACE_ACCESS:!0,MAX_TEAM_MEMBERS:"100",MAX_PROJECTS:"100",MAX_API_CALLS_MONTH:"1000000",MAX_AGENT_API_CALLS_HOUR:"2000"},enterprise:{}};function Ve(o){Tr(o)&&(Ir("Cancelled."),process.exit(0))}async function Bo(o){let e=o.outputPath??Uo.join(process.cwd(),"packages","database","prisma","seeds","capabilities.seed.ts");if(o.list){let t=await X.getInstance();Rr(t);return}if(o.tier){await Vo(o.tier,e,o);return}await _r(e,o)}function Rr(o){console.log(),console.log(O.bold(O.underline(o.t("config.features.catalogHeader")))),console.log(O.dim(o.t("config.features.capabilitiesTotal",{count:re.length})+`
92
- `));let e=[...new Set(re.map(t=>t.category))];for(let t of e){let n=re.filter(r=>r.category===t);console.log(O.bold(O.cyan(` ${t} (${n.length})`)));for(let r of n)console.log(` ${O.white(r.key.padEnd(30))} ${O.dim(`[${r.type}]`)}`),console.log(` ${O.dim(r.description)}`);console.log()}console.log(O.bold(o.t("config.features.tierPresets")));for(let t of["starter","complete","pro","enterprise"])console.log(` ${O.white(t.padEnd(12))}`);console.log()}async function Vo(o,e,t){let n=Tt[o]||{},r={};for(let a of re)o==="enterprise"?r[a.key]=a.type==="boolean"?!0:"-1":r[a.key]=n[a.key]??(a.type==="boolean"?!1:a.defaultValue);await Jo(r,e,t,o)}async function _r(o,e){let t=await X.getInstance();console.log(),console.log(O.bold(O.underline(t.t("config.features.tuiHeader"))));let n=await Ar({message:t.t("config.features.selectTier"),options:[{label:"Starter \u2014 Essential SaaS features",value:"starter"},{label:"Complete \u2014 White-label + Custom Domains",value:"complete"},{label:"Pro \u2014 Extended API + Limits",value:"pro"},{label:"Enterprise \u2014 Unlimited everything",value:"enterprise"},{label:O.dim(t.t("common.cancel")),value:"cancel"}]});if(Ve(n),n==="cancel")return;let r=n,a=Tt[r]||{},i={},s=await No({message:t.t("config.features.customize"),initialValue:!1});if(Ve(s),!s)return Vo(r,o,e);let c=[...new Set(re.map(l=>l.category))];for(let l of c){let d=re.filter(m=>m.category===l),p=d.filter(m=>m.type==="boolean"),u=d.filter(m=>m.type==="numeric");if(p.length>0){let m=p.filter(k=>r==="enterprise"||a[k.key]===!0).map(k=>k.key),g=await jr({message:`${l} features:`,options:p.map(k=>({label:`${k.key.padEnd(30)} \u2014 ${k.description}`,value:k.key})),initialValues:m,required:!1});Ve(g);for(let k of p)i[k.key]=g.includes(k.key)}for(let m of u){let g=r==="enterprise"?"-1":a[m.key]||m.defaultValue,k=await Mr({message:`${m.key} (${m.description}):`,placeholder:g,defaultValue:g});Ve(k),i[m.key]=k}}await Jo(i,o,e,r)}async function Jo(o,e,t,n){let r=await X.getInstance(),a=re.map(s=>{let c=o[s.key];return` { key: "${s.key}", type: "${s.type}", defaultValue: "${c}", description: "${s.description}" },`}).join(`
98
+ `)),console.log(` Cache directory: ${me.cyan(o.cacheDir)}`),console.log(` Total size: ${me.cyan(un(e.totalSize))}`),console.log(` Cached entries: ${me.cyan(e.entries.toString())}`),e.oldest&&console.log(` Oldest entry: ${me.gray(e.oldest.toLocaleString())}`),e.newest&&console.log(` Newest entry: ${me.gray(e.newest.toLocaleString())}`),console.log(),console.log(me.gray("Run 'kaven cache clear' to remove all cached data."))}async function mn(){let o=ao(),e=await o.stats();if(e.entries===0){console.log(me.gray("Cache is already empty."));return}await o.clear(),console.log(me.green(`Cache cleared: ${e.entries} entries (${un(e.totalSize)}) removed.`))}import Y from"chalk";async function fn(o,e){(!o||!e)&&(console.error(Y.red("Error: Both key and value are required")),console.error(Y.gray("Usage: kaven config set KEY VALUE")),process.exit(1)),await z.initialize();try{await z.set(o,e),console.log(Y.green(`\u2705 Set ${Y.bold(o)} = ${Y.bold(e)}`))}catch(t){console.error(Y.red(`Error: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function gn(o,e){o||(console.error(Y.red("Error: Key is required")),console.error(Y.gray("Usage: kaven config get KEY")),process.exit(1)),await z.initialize();try{let t=z.get(o);e.json?console.log(JSON.stringify({[o]:t},null,2)):console.log(t)}catch(t){console.error(Y.red(`Error: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}async function hn(o){await z.initialize();let e=z.getAll();if(o.json)console.log(JSON.stringify(e,null,2));else{console.log(Y.bold("Kaven Configuration:")),console.log(Y.gray(`Location: ${z.getConfigDir()}/config.json`)),console.log();let t=Object.entries(e),n=Math.max(...t.map(([r])=>r.length));for(let[r,a]of t){let i=" ".repeat(n-r.length),s=typeof a=="object"?JSON.stringify(a,null,2).replace(/\n/g,`
99
+ `+" ".repeat(n+3)):a;console.log(` ${r}${i} ${Y.cyan(s)}`)}}}async function yn(){let{confirm:o}=await import("@inquirer/prompts");if(!await o({message:"Are you sure you want to reset config to defaults?",default:!1})){console.log(Y.yellow("Cancelled."));return}await z.initialize(),await z.reset(),console.log(Y.green("\u2705 Config reset to defaults"))}import{select as fa,confirm as wn,text as ga,multiselect as ha,isCancel as ya,cancel as wa}from"@clack/prompts";import H from"picocolors";import so from"fs-extra";import vn from"path";var fe=[{key:"FEATURE_EMAIL_VERIFICATION",type:"boolean",description:"Email verification on signup",category:"Auth",defaultValue:"true"},{key:"FEATURE_2FA_TOTP",type:"boolean",description:"Two-factor authentication via TOTP",category:"Auth",defaultValue:"false"},{key:"FEATURE_SSO_SAML",type:"boolean",description:"Single Sign-On via SAML/OIDC",category:"Auth",defaultValue:"false"},{key:"FEATURE_SOCIAL_LOGIN",type:"boolean",description:"Login via Google, GitHub, etc.",category:"Auth",defaultValue:"true"},{key:"FEATURE_MAGIC_LINK",type:"boolean",description:"Passwordless login via email",category:"Auth",defaultValue:"false"},{key:"FEATURE_CUSTOM_DOMAIN",type:"boolean",description:"Custom domain per tenant",category:"Tenancy",defaultValue:"false"},{key:"FEATURE_WHITE_LABEL",type:"boolean",description:"Remove Kaven branding",category:"Tenancy",defaultValue:"false"},{key:"FEATURE_MULTI_BUSINESS",type:"boolean",description:"Multiple businesses per user",category:"Tenancy",defaultValue:"false"},{key:"FEATURE_AGENCY_HUB",type:"boolean",description:"Agency management dashboard",category:"Tenancy",defaultValue:"false"},{key:"FEATURE_TENANT_THEMES",type:"boolean",description:"Custom themes for tenants",category:"Tenancy",defaultValue:"true"},{key:"FEATURE_SUBSCRIPTIONS",type:"boolean",description:"Subscription management",category:"Billing",defaultValue:"true"},{key:"FEATURE_INVOICING",type:"boolean",description:"Automatic invoicing",category:"Billing",defaultValue:"true"},{key:"FEATURE_USAGE_BILLING",type:"boolean",description:"Metered usage billing",category:"Billing",defaultValue:"false"},{key:"FEATURE_PADDLE_CHECKOUT",type:"boolean",description:"Paddle payment integration",category:"Billing",defaultValue:"true"},{key:"FEATURE_PAGUBIT_PIX",type:"boolean",description:"Pix payment support",category:"Billing",defaultValue:"false"},{key:"FEATURE_API_ACCESS",type:"boolean",description:"External API access",category:"API",defaultValue:"false"},{key:"FEATURE_WEBHOOKS",type:"boolean",description:"Outgoing webhooks",category:"API",defaultValue:"false"},{key:"FEATURE_MARKETPLACE_ACCESS",type:"boolean",description:"Kaven Marketplace access",category:"API",defaultValue:"true"},{key:"MAX_API_CALLS_MONTH",type:"numeric",description:"Maximum API calls per month",category:"API",defaultValue:"10000"},{key:"MAX_AGENT_API_CALLS_HOUR",type:"numeric",description:"Maximum agent calls per hour",category:"API",defaultValue:"100"},{key:"MAX_TEAM_MEMBERS",type:"numeric",description:"Maximum team members per tenant",category:"Limits",defaultValue:"5"},{key:"MAX_PROJECTS",type:"numeric",description:"Maximum projects per tenant",category:"Limits",defaultValue:"3"},{key:"MAX_STORAGE_GB",type:"numeric",description:"Maximum storage in GB",category:"Limits",defaultValue:"1"},{key:"MAX_TENANTS",type:"numeric",description:"Maximum sub-tenants",category:"Limits",defaultValue:"1"},{key:"FEATURE_PRIORITY_SUPPORT",type:"boolean",description:"Priority support queue",category:"Support",defaultValue:"false"},{key:"FEATURE_AUDIT_COMPLIANCE",type:"boolean",description:"Audit logs and compliance",category:"Support",defaultValue:"false"},{key:"FEATURE_DATA_EXPORT",type:"boolean",description:"Customer data export",category:"Support",defaultValue:"true"}],io={starter:{FEATURE_EMAIL_VERIFICATION:!0,FEATURE_SOCIAL_LOGIN:!0,FEATURE_MARKETPLACE_ACCESS:!0,MAX_TEAM_MEMBERS:"5",MAX_PROJECTS:"3",MAX_API_CALLS_MONTH:"10000",MAX_AGENT_API_CALLS_HOUR:"100"},complete:{FEATURE_EMAIL_VERIFICATION:!0,FEATURE_SOCIAL_LOGIN:!0,FEATURE_CUSTOM_DOMAIN:!0,FEATURE_API_ACCESS:!0,FEATURE_MARKETPLACE_ACCESS:!0,MAX_TEAM_MEMBERS:"25",MAX_PROJECTS:"20",MAX_API_CALLS_MONTH:"100000",MAX_AGENT_API_CALLS_HOUR:"500"},pro:{FEATURE_EMAIL_VERIFICATION:!0,FEATURE_SOCIAL_LOGIN:!0,FEATURE_CUSTOM_DOMAIN:!0,FEATURE_WHITE_LABEL:!0,FEATURE_API_ACCESS:!0,FEATURE_MARKETPLACE_ACCESS:!0,MAX_TEAM_MEMBERS:"100",MAX_PROJECTS:"100",MAX_API_CALLS_MONTH:"1000000",MAX_AGENT_API_CALLS_HOUR:"2000"},enterprise:{}};function it(o){ya(o)&&(wa("Cancelled."),process.exit(0))}async function kn(o){let e=o.outputPath??vn.join(process.cwd(),"packages","database","prisma","seeds","capabilities.seed.ts");if(o.list){let t=await ie.getInstance();va(t);return}if(o.tier){await bn(o.tier,e,o);return}await ka(e,o)}function va(o){console.log(),console.log(H.bold(H.underline(o.t("config.features.catalogHeader")))),console.log(H.dim(o.t("config.features.capabilitiesTotal",{count:fe.length})+`
100
+ `));let e=[...new Set(fe.map(t=>t.category))];for(let t of e){let n=fe.filter(r=>r.category===t);console.log(H.bold(H.cyan(` ${t} (${n.length})`)));for(let r of n)console.log(` ${H.white(r.key.padEnd(30))} ${H.dim(`[${r.type}]`)}`),console.log(` ${H.dim(r.description)}`);console.log()}console.log(H.bold(o.t("config.features.tierPresets")));for(let t of["starter","complete","pro","enterprise"])console.log(` ${H.white(t.padEnd(12))}`);console.log()}async function bn(o,e,t){let n=io[o]||{},r={};for(let a of fe)o==="enterprise"?r[a.key]=a.type==="boolean"?!0:"-1":r[a.key]=n[a.key]??(a.type==="boolean"?!1:a.defaultValue);await xn(r,e,t,o)}async function ka(o,e){let t=await ie.getInstance();console.log(),console.log(H.bold(H.underline(t.t("config.features.tuiHeader"))));let n=await fa({message:t.t("config.features.selectTier"),options:[{label:"Starter \u2014 Essential SaaS features",value:"starter"},{label:"Complete \u2014 White-label + Custom Domains",value:"complete"},{label:"Pro \u2014 Extended API + Limits",value:"pro"},{label:"Enterprise \u2014 Unlimited everything",value:"enterprise"},{label:H.dim(t.t("common.cancel")),value:"cancel"}]});if(it(n),n==="cancel")return;let r=n,a=io[r]||{},i={},s=await wn({message:t.t("config.features.customize"),initialValue:!1});if(it(s),!s)return bn(r,o,e);let c=[...new Set(fe.map(l=>l.category))];for(let l of c){let d=fe.filter(u=>u.category===l),m=d.filter(u=>u.type==="boolean"),p=d.filter(u=>u.type==="numeric");if(m.length>0){let u=m.filter(k=>r==="enterprise"||a[k.key]===!0).map(k=>k.key),g=await ha({message:`${l} features:`,options:m.map(k=>({label:`${k.key.padEnd(30)} \u2014 ${k.description}`,value:k.key})),initialValues:u,required:!1});it(g);for(let k of m)i[k.key]=g.includes(k.key)}for(let u of p){let g=r==="enterprise"?"-1":a[u.key]||u.defaultValue,k=await ga({message:`${u.key} (${u.description}):`,placeholder:g,defaultValue:g});it(k),i[u.key]=k}}await xn(i,o,e,r)}async function xn(o,e,t,n){let r=await ie.getInstance(),a=fe.map(s=>{let c=o[s.key];return` { key: "${s.key}", type: "${s.type}", defaultValue: "${c}", description: "${s.description}" },`}).join(`
93
101
  `),i=`// packages/database/prisma/seeds/capabilities.seed.ts
94
102
  // Generated by kaven config features \u2014 ${new Date().toISOString()}
95
103
  // Tier: ${n}
@@ -101,7 +109,7 @@ export async function seedCapabilities(prisma: PrismaClient) {
101
109
  ${a}
102
110
  ];
103
111
 
104
- console.log("\u{1F510} Seeding ${re.length} Capabilities...");
112
+ console.log("\u{1F510} Seeding ${fe.length} Capabilities...");
105
113
 
106
114
  for (const cap of capabilities) {
107
115
  await prisma.capability.upsert({
@@ -111,9 +119,9 @@ ${a}
111
119
  });
112
120
  }
113
121
  }
114
- `;if(t.dryRun){console.log(O.bold(`
115
- `+r.t("config.features.dryRunHeader"))),console.log(i);return}if(It.existsSync(e)&&!t.force){let s=await No({message:r.t("config.features.confirmOverwrite"),initialValue:!1});if(Ve(s),!s)return}await It.ensureDir(Uo.dirname(e)),await It.writeFile(e,i,"utf-8"),console.log(O.green(`
116
- \u2705 ${r.t("config.features.seedWritten",{path:e})}`)),console.log(O.dim(r.t("config.features.runSeed")))}import U from"chalk";import Dr from"ora";import Ae from"path";import fe from"fs-extra";var Lr=`name: Tests
122
+ `;if(t.dryRun){console.log(H.bold(`
123
+ `+r.t("config.features.dryRunHeader"))),console.log(i);return}if(so.existsSync(e)&&!t.force){let s=await wn({message:r.t("config.features.confirmOverwrite"),initialValue:!1});if(it(s),!s)return}await so.ensureDir(vn.dirname(e)),await so.writeFile(e,i,"utf-8"),console.log(H.green(`
124
+ \u2705 ${r.t("config.features.seedWritten",{path:e})}`)),console.log(H.dim(r.t("config.features.runSeed")))}import Z from"chalk";import ba from"ora";import Je from"path";import Ie from"fs-extra";var xa=`name: Tests
117
125
  on:
118
126
  push:
119
127
  branches: [main, develop]
@@ -149,7 +157,7 @@ jobs:
149
157
  - run: pnpm lint
150
158
  - run: pnpm test
151
159
  - run: pnpm build
152
- `,Or=`name: Publish Module
160
+ `,Ea=`name: Publish Module
153
161
  on:
154
162
  push:
155
163
  tags:
@@ -173,7 +181,7 @@ jobs:
173
181
  env:
174
182
  KAVEN_LICENSE_KEY: \${{ secrets.KAVEN_LICENSE_KEY }}
175
183
  run: kaven module publish
176
- `,Fr=`#!/bin/bash
184
+ `,Sa=`#!/bin/bash
177
185
  # Pre-commit hook for Kaven projects
178
186
  set -e
179
187
 
@@ -194,7 +202,7 @@ if command -v pnpm format &> /dev/null; then
194
202
  fi
195
203
 
196
204
  echo "\u2705 All pre-commit checks passed"
197
- `;async function Go(o){let e=process.cwd(),t=Ae.join(e,"package.json");await fe.pathExists(t)||(console.error(U.red("Error: package.json not found. Run this in a Kaven project root.")),process.exit(1));let n=Dr("Setting up CI/CD configuration...").start();try{let r=Ae.join(e,".github","workflows");await fe.ensureDir(r);let a=Ae.join(r,"test.yml");o.dryRun||await fe.writeFile(a,Lr),n.text=`Creating ${U.cyan(".github/workflows/test.yml")}...`;let i=Ae.join(r,"publish.yml");o.dryRun||await fe.writeFile(i,Or),n.text=`Creating ${U.cyan(".github/workflows/publish.yml")}...`;let s=Ae.join(e,".husky");await fe.ensureDir(s);let c=Ae.join(s,"pre-commit");o.dryRun||(await fe.writeFile(c,Fr),await fe.chmod(c,493)),n.text=`Creating ${U.cyan(".husky/pre-commit")}...`,n.succeed("CI/CD configuration created"),console.log(),console.log(U.bold("Files created:")),console.log(` ${U.cyan(".github/workflows/test.yml")} - Run tests on push/PR`),console.log(` ${U.cyan(".github/workflows/publish.yml")} - Publish on git tags`),console.log(` ${U.cyan(".husky/pre-commit")} - Local pre-commit validation`),console.log(),console.log(U.bold("Next steps:")),console.log(U.gray(" 1. Install husky: pnpm husky install")),console.log(U.gray(" 2. Add GitHub secrets: KAVEN_LICENSE_KEY")),console.log(U.gray(" 3. Push to GitHub and watch workflows run")),o.dryRun&&(console.log(),console.log(U.yellow("(Dry-run: No files were actually created)")))}catch(r){n.fail("Failed to create CI/CD configuration"),console.error(U.red(r instanceof Error?r.message:String(r))),process.exit(1)}}function Ho(o){o.command("aiox").description("AIOX integration utilities").command("bootstrap").description("Run AIOX environment bootstrap in current project").option("--skip-aiox","Skip AIOX logic (for testing)").action(async t=>{let n=process.cwd();await nt(n,t)})}var Nr=()=>{let o=new Kr;o.name("kaven").description("The official CLI for the Kaven SaaS boilerplate ecosystem").version("0.4.2-alpha.0").addHelpText("after",`
205
+ `;async function En(o){let e=process.cwd(),t=Je.join(e,"package.json");await Ie.pathExists(t)||(console.error(Z.red("Error: package.json not found. Run this in a Kaven project root.")),process.exit(1));let n=ba("Setting up CI/CD configuration...").start();try{let r=Je.join(e,".github","workflows");await Ie.ensureDir(r);let a=Je.join(r,"test.yml");o.dryRun||await Ie.writeFile(a,xa),n.text=`Creating ${Z.cyan(".github/workflows/test.yml")}...`;let i=Je.join(r,"publish.yml");o.dryRun||await Ie.writeFile(i,Ea),n.text=`Creating ${Z.cyan(".github/workflows/publish.yml")}...`;let s=Je.join(e,".husky");await Ie.ensureDir(s);let c=Je.join(s,"pre-commit");o.dryRun||(await Ie.writeFile(c,Sa),await Ie.chmod(c,493)),n.text=`Creating ${Z.cyan(".husky/pre-commit")}...`,n.succeed("CI/CD configuration created"),console.log(),console.log(Z.bold("Files created:")),console.log(` ${Z.cyan(".github/workflows/test.yml")} - Run tests on push/PR`),console.log(` ${Z.cyan(".github/workflows/publish.yml")} - Publish on git tags`),console.log(` ${Z.cyan(".husky/pre-commit")} - Local pre-commit validation`),console.log(),console.log(Z.bold("Next steps:")),console.log(Z.gray(" 1. Install husky: pnpm husky install")),console.log(Z.gray(" 2. Add GitHub secrets: KAVEN_LICENSE_KEY")),console.log(Z.gray(" 3. Push to GitHub and watch workflows run")),o.dryRun&&(console.log(),console.log(Z.yellow("(Dry-run: No files were actually created)")))}catch(r){n.fail("Failed to create CI/CD configuration"),console.error(Z.red(r instanceof Error?r.message:String(r))),process.exit(1)}}function Sn(o){o.command("aiox").description("AIOX integration utilities").command("bootstrap").description("Run AIOX environment bootstrap in current project").option("--skip-aiox","Skip AIOX logic (for testing)").action(async t=>{let n=process.cwd();await Ct(n,t)})}var $a=()=>{let o=new Ca;o.name("kaven").description("The official CLI for the Kaven SaaS boilerplate ecosystem").version("0.4.2-alpha.0").addHelpText("after",`
198
206
  Examples:
199
207
  $ kaven init my-saas-app Bootstrap a new Kaven project
200
208
  $ kaven auth login Authenticate with Kaven Marketplace
@@ -211,7 +219,7 @@ Examples:
211
219
  $ kaven init my-app --defaults Use defaults (no prompts)
212
220
  $ kaven init my-app --skip-git Skip git initialization
213
221
  $ kaven init my-app --with-squad Install kaven-squad for AIOX integration
214
- `).action((c,l)=>Co(c,{defaults:l.defaults,skipInstall:l.skipInstall,skipGit:l.skipGit,force:l.force,template:l.template,withSquad:l.withSquad,skipAiox:l.skipAiox}));let e=o.command("module").alias("m").description("Manage Kaven modules: install, remove, publish, activate, and diagnose").addHelpText("after",`
222
+ `).action((c,l)=>en(c,{defaults:l.defaults,skipInstall:l.skipInstall,skipGit:l.skipGit,force:l.force,template:l.template,withSquad:l.withSquad,skipAiox:l.skipAiox}));let e=o.command("module").alias("m").description("Manage Kaven modules: install, remove, publish, activate, and diagnose").addHelpText("after",`
215
223
  Examples:
216
224
  $ kaven module doctor Check module integrity
217
225
  $ kaven module doctor --fix Auto-fix detected issues
@@ -231,15 +239,15 @@ Examples:
231
239
  $ kaven module doctor
232
240
  $ kaven module doctor --fix
233
241
  $ kaven module doctor --json
234
- `).action(c=>Vt({fix:c.fix,json:c.json})),e.command("add <path>").description("Install a module from a local manifest file").addHelpText("after",`
242
+ `).action(c=>yo({fix:c.fix,json:c.json})),e.command("add <path>").description("Install a module from a local manifest file").addHelpText("after",`
235
243
  Examples:
236
244
  $ kaven module add ./modules/payments/module.json
237
245
  $ kaven module add /absolute/path/to/module.json
238
- `).action(c=>Ht(c)),e.command("remove <name>").description("Remove an installed module and clean up injected code").addHelpText("after",`
246
+ `).action(c=>ko(c)),e.command("remove <name>").description("Remove an installed module and clean up injected code").addHelpText("after",`
239
247
  Examples:
240
248
  $ kaven module remove payments
241
249
  $ kaven module remove notifications
242
- `).action(c=>qt(c)),e.command("publish").description("Publish the current directory as a module to Kaven Marketplace").option("--dry-run","Validate and package the module without uploading").option("--changelog <text>","Release notes for this version").addHelpText("after",`
250
+ `).action(c=>bo(c)),e.command("publish").description("Publish the current directory as a module to Kaven Marketplace").option("--dry-run","Validate and package the module without uploading").option("--changelog <text>","Release notes for this version").addHelpText("after",`
243
251
  Requirements:
244
252
  - module.json must exist in the current directory
245
253
  - Must be authenticated: run 'kaven auth login' first
@@ -248,7 +256,7 @@ Examples:
248
256
  $ kaven module publish
249
257
  $ kaven module publish --dry-run
250
258
  $ kaven module publish --changelog "Added dark mode support"
251
- `).action(c=>Xt({dryRun:c.dryRun,changelog:c.changelog})),e.command("activate <name> [root]").description("Activate a Kaven schema module by uncommenting its models in schema.extended.prisma").option("--with-deps","Automatically activate required dependencies").option("--skip-migrate","Skip db:generate and db:migrate after activation").option("--dry-run","Show affected models without modifying schema").option("--yes","Skip confirmation prompt").addHelpText("after",`
259
+ `).action(c=>Po({dryRun:c.dryRun,changelog:c.changelog})),e.command("activate <name> [root]").description("Activate a Kaven schema module by uncommenting its models in schema.extended.prisma").option("--with-deps","Automatically activate required dependencies").option("--skip-migrate","Skip db:generate and db:migrate after activation").option("--dry-run","Show affected models without modifying schema").option("--yes","Skip confirmation prompt").addHelpText("after",`
252
260
  Modules: billing, projects, notifications
253
261
 
254
262
  Examples:
@@ -256,50 +264,64 @@ Examples:
256
264
  $ kaven module activate projects
257
265
  $ kaven module activate projects ./my-app
258
266
  $ kaven module activate billing --with-deps
259
- `).action((c,l,d)=>ft(c,l,d)),e.command("deactivate <name> [root]").description("Deactivate a Kaven schema module by commenting its models in schema.extended.prisma").option("--skip-migrate","Skip db:generate and db:migrate").option("--dry-run","Show affected models without modifying schema").option("--yes","Skip confirmation prompt").addHelpText("after",`
267
+ `).action((c,l,d)=>Jt(c,l,d)),e.command("deactivate <name> [root]").description("Deactivate a Kaven schema module by commenting its models in schema.extended.prisma").option("--skip-migrate","Skip db:generate and db:migrate").option("--dry-run","Show affected models without modifying schema").option("--yes","Skip confirmation prompt").addHelpText("after",`
260
268
  Modules: billing, projects, notifications
261
269
 
262
270
  Examples:
263
271
  $ kaven module deactivate billing
264
272
  $ kaven module deactivate projects
265
273
  $ kaven module deactivate projects ./my-app
266
- `).action((c,l,d)=>eo(c,l,d)),e.command("list [root]").description("List available Kaven schema modules with their status, models, and dependencies").addHelpText("after",`
274
+ `).action((c,l,d)=>Io(c,l,d)),e.command("list [root]").description("List available Kaven schema modules with their status, models, and dependencies").addHelpText("after",`
267
275
  Examples:
268
276
  $ kaven module list
269
277
  $ kaven module list ./my-app
270
- `).action(c=>to(c));let t=o.command("auth").description("Manage authentication and session tokens").addHelpText("after",`
278
+ `).action(c=>To(c)),e.command("update [slug]").description("Update an installed marketplace module to the latest version").option("--skip-verify","Skip Ed25519 signature verification (dev only)").addHelpText("after",`
279
+ Examples:
280
+ $ kaven module update payments Update the payments module
281
+ $ kaven module update Interactive: select module to update
282
+ $ kaven module update payments --skip-verify Skip signature check (dev only)
283
+ `).action((c,l)=>Ze(c,void 0,{skipVerify:l.skipVerify??!1}));let t=o.command("auth").description("Manage authentication and session tokens").addHelpText("after",`
271
284
  Examples:
272
285
  $ kaven auth login Start device code authentication flow
273
286
  $ kaven auth whoami Show current user info
274
287
  $ kaven auth logout End the local session
275
- `);t.command("login").description("Start the interactive device code authentication flow (RFC 8628)").action(()=>no()),t.command("logout").description("Clear the local authentication session").action(()=>ro()),t.command("whoami").description("Display information about the currently authenticated user").action(()=>ao());let n=o.command("marketplace").alias("mkt").alias("market").description("Explore, browse, and install modules from the Kaven Marketplace").addHelpText("after",`
288
+ `);t.command("login").description("Start the interactive device code authentication flow (RFC 8628)").action(()=>Do()),t.command("logout").description("Clear the local authentication session").action(()=>_o()),t.command("whoami").description("Display information about the currently authenticated user").action(()=>Lo());let n=o.command("marketplace").alias("mkt").alias("market").description("Explore, browse, and install modules from the Kaven Marketplace").addHelpText("after",`
276
289
  Examples:
277
290
  $ kaven marketplace list
278
291
  $ kaven marketplace list --category auth --sort popular
279
292
  $ kaven marketplace install payments
280
293
  $ kaven marketplace browse
281
- `);n.command("list").description("List all modules available in the marketplace").option("--category <category>","Filter modules by category").option("--sort <field>","Sort order: newest (default), popular, name","newest").option("--page <n>","Page number (default: 1)","1").option("--limit <n>","Results per page (default: 20, max: 100)","20").option("--json","Output raw JSON instead of formatted table").action(c=>io({category:c.category,sort:c.sort,page:parseInt(c.page,10),limit:parseInt(c.limit,10),json:c.json??!1})),n.command("install <moduleId>").description("Download and install a module from the Kaven Marketplace").option("--version <ver>","Install a specific version (default: latest)").option("--force","Skip overwrite confirmation").option("--skip-env","Skip environment variable injection").option("--skip-verify","Skip Ed25519 signature verification (dev only)").option("--env-file <path>","Target .env file (default: .env)").addHelpText("after",`
294
+ `);n.command("list").description("List all modules available in the marketplace").option("--category <category>","Filter modules by category").option("--sort <field>","Sort order: newest (default), popular, name","newest").option("--page <n>","Page number (default: 1)","1").option("--limit <n>","Results per page (default: 20, max: 100)","20").option("--json","Output raw JSON instead of formatted table").action(c=>Oo({category:c.category,sort:c.sort,page:parseInt(c.page,10),limit:parseInt(c.limit,10),json:c.json??!1})),n.command("install <moduleId>").description("Download and install a module from the Kaven Marketplace").option("--version <ver>","Install a specific version (default: latest)").option("--force","Skip overwrite confirmation").option("--skip-env","Skip environment variable injection").option("--skip-verify","Skip Ed25519 signature verification (dev only)").option("--env-file <path>","Target .env file (default: .env)").addHelpText("after",`
282
295
  Examples:
283
296
  $ kaven marketplace install payments
284
297
  $ kaven marketplace install payments --version 1.2.0
285
298
  $ kaven marketplace install auth --skip-env
286
299
  $ kaven marketplace install my-module --skip-verify
287
- `).action((c,l)=>Ze(c,{version:l.version,force:l.force??!1,skipEnv:l.skipEnv??!1,skipVerify:l.skipVerify??!1,envFile:l.envFile})),n.command("browse").description("Interactive TUI module browser \u2014 explore modules by category").addHelpText("after",`
300
+ `).action((c,l)=>kt(c,{version:l.version,force:l.force??!1,skipEnv:l.skipEnv??!1,skipVerify:l.skipVerify??!1,envFile:l.envFile})),n.command("browse").description("Interactive TUI module browser \u2014 explore modules by category").addHelpText("after",`
288
301
  Navigate with arrow keys, press Enter to select.
289
302
  Supports category filtering and pagination.
290
- `).action(()=>po());let r=o.command("upgrade").description("Upgrade your license tier or CLI version").addHelpText("after",`
303
+ `).action(()=>Ko()),o.command("update").description("Check and apply updates for CLI and installed modules").option("--core","Update only the CLI itself").option("--module <slug>","Update a specific installed module").option("--all","Apply all available updates (CLI + modules)").option("--check","Check for updates without applying").option("--skip-verify","Skip Ed25519 signature verification (dev only)").addHelpText("after",`
291
304
  Examples:
292
- $ kaven upgrade Upgrade license tier
293
- $ kaven upgrade check Check for CLI updates
294
- $ kaven upgrade install Install latest CLI version
295
- `);r.command("tier").description("Upgrade your Kaven license to a higher tier (default)").option("--no-browser","Print the checkout URL instead of opening the browser").action(c=>Io({browser:c.browser!==!1})),r.command("check").description("Check for Kaven CLI updates").action(()=>Ct()),r.command("install").description("Install the latest Kaven CLI version").action(()=>Pt()),o.command("telemetry").description("View observability and command audit logs").command("view").description("Display the most recent local telemetry events").option("-l, --limit <number>","Number of events to display","10").action(c=>mo(parseInt(c.limit))),o.addCommand(wo());let i=o.command("cache").description("Manage the local API response cache").addHelpText("after",`
305
+ $ kaven update Check all updates (CLI + modules)
306
+ $ kaven update --core Check/apply CLI update only
307
+ $ kaven update --module payments Update the payments module
308
+ $ kaven update --all Apply all updates
309
+ $ kaven update --check List updates without applying
310
+ `).action(c=>dn({core:c.core,module:c.module,all:c.all,check:c.check,skipVerify:c.skipVerify}));let r=o.command("upgrade").description("Upgrade your Kaven license plan").addHelpText("after",`
311
+ Examples:
312
+ $ kaven upgrade Upgrade license tier (interactive)
313
+ $ kaven upgrade check Check current license status
314
+ $ kaven upgrade install Force install latest CLI (manual)
315
+
316
+ Note: To update the CLI or modules, use \`kaven update\` instead.
317
+ `);r.command("tier").description("Upgrade your Kaven license to a higher tier (default)").option("--no-browser","Print the checkout URL instead of opening the browser").action(c=>cn({browser:c.browser!==!1})),r.command("check").description("Check current license status").action(()=>eo()),r.command("install").description("Force install the latest Kaven CLI version globally").action(()=>to()),o.command("telemetry").description("View observability and command audit logs").command("view").description("Display the most recent local telemetry events").option("-l, --limit <number>","Number of events to display","10").action(c=>Vo(parseInt(c.limit))),o.addCommand(Ho());let i=o.command("cache").description("Manage the local API response cache").addHelpText("after",`
296
318
  Cache directory: ~/.kaven/cache (max 50 MB)
297
319
  Cached data: module listings (24h TTL), manifests (7d), license status (1h)
298
320
 
299
321
  Examples:
300
322
  $ kaven cache status
301
323
  $ kaven cache clear
302
- `);i.command("status").description("Show cache statistics (size, entry count, age)").action(()=>_o()),i.command("clear").description("Delete all locally cached API responses").action(()=>Do());let s=o.command("config").description("Manage Kaven CLI configuration").addHelpText("after",`
324
+ `);i.command("status").description("Show cache statistics (size, entry count, age)").action(()=>pn()),i.command("clear").description("Delete all locally cached API responses").action(()=>mn());let s=o.command("config").description("Manage Kaven CLI configuration").addHelpText("after",`
303
325
  Config file: ~/.kaven/config.json
304
326
 
305
327
  Examples:
@@ -310,7 +332,7 @@ Examples:
310
332
  $ kaven config features
311
333
  $ kaven config features --tier complete
312
334
  $ kaven config features --list
313
- `);s.command("set <key> <value>").description("Set a configuration value").action((c,l)=>Lo(c,l)),s.command("get <key>").description("Get a configuration value").option("--json","Output as JSON").action((c,l)=>Oo(c,{json:l.json})),s.command("view").description("Display all configuration").option("--json","Output as JSON").action(c=>Fo({json:c.json})),s.command("reset").description("Reset configuration to defaults").action(()=>Ko()),s.command("features").description("Interactive TUI to select and configure the 60 framework capabilities (feature flags)").option("--tier <tier>","Apply a preset tier directly without prompts: starter | complete | pro | enterprise").option("--list","List all available capabilities grouped by category, without modifying anything").addHelpText("after",`
335
+ `);s.command("set <key> <value>").description("Set a configuration value").action((c,l)=>fn(c,l)),s.command("get <key>").description("Get a configuration value").option("--json","Output as JSON").action((c,l)=>gn(c,{json:l.json})),s.command("view").description("Display all configuration").option("--json","Output as JSON").action(c=>hn({json:c.json})),s.command("reset").description("Reset configuration to defaults").action(()=>yn()),s.command("features").description("Interactive TUI to select and configure the 60 framework capabilities (feature flags)").option("--tier <tier>","Apply a preset tier directly without prompts: starter | complete | pro | enterprise").option("--list","List all available capabilities grouped by category, without modifying anything").addHelpText("after",`
314
336
  Output: packages/database/prisma/seeds/capabilities.seed.ts (relative to cwd)
315
337
 
316
338
  Examples:
@@ -321,7 +343,7 @@ Examples:
321
343
 
322
344
  After generating the seed file:
323
345
  $ pnpm prisma db seed
324
- `).action(c=>Bo({tier:c.tier,list:c.list??!1})),o.command("init-ci").description("Initialize GitHub Actions CI/CD workflows").option("--dry-run","Show what would be created without writing files").addHelpText("after",`
346
+ `).action(c=>kn({tier:c.tier,list:c.list??!1})),o.command("init-ci").description("Initialize GitHub Actions CI/CD workflows").option("--dry-run","Show what would be created without writing files").addHelpText("after",`
325
347
  Creates:
326
348
  - .github/workflows/test.yml Run tests on push/PR
327
349
  - .github/workflows/publish.yml Publish modules on git tags
@@ -330,4 +352,4 @@ Creates:
330
352
  Examples:
331
353
  $ kaven init-ci Interactive setup
332
354
  $ kaven init-ci --dry-run Show what would be created
333
- `).action(c=>Go({dryRun:c.dryRun})),Ho(o),o.parse(process.argv)},Ur=process.argv[1]&&(process.argv[1].endsWith("/kaven")||process.argv[1].endsWith("/index.ts")||process.argv[1].endsWith("/index.js"));Ur&&Nr();export{Nr as main};
355
+ `).action(c=>En({dryRun:c.dryRun})),Sn(o),o.parse(process.argv)},Pa=process.argv[1]&&(process.argv[1].endsWith("/kaven")||process.argv[1].endsWith("/index.ts")||process.argv[1].endsWith("/index.js"));Pa&&$a();export{$a as main};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kaven-cli",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "description": "Kaven CLI - The official command line tool for Kaven",
6
6
  "main": "dist/index.js",