kaven-cli 0.11.2 → 0.11.4
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as a}from"./chunk-XY5BXJEH.js";export{a as MarketplaceClient};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import v from"fs-extra";import q from"path";import x from"os";var c=class extends Error{constructor(e){super(e),this.name="MarketplaceError"}},T=class extends c{constructor(e){super(e),this.name="AuthenticationError"}},E=class extends c{constructor(t,s){super(s);this.requiredTier=t;this.name="LicenseRequiredError"}requiredTier},p=class extends c{constructor(e){super(e),this.name="NotFoundError"}},R=class extends c{constructor(t){super(`Rate limited. Try again in ${t}s`);this.retryAfter=t;this.name="RateLimitError"}retryAfter},m=class extends c{constructor(e){super(e),this.name="ServerError"}},y=class extends c{constructor(e){super(e),this.name="NetworkError"}},A=class extends c{constructor(e){super(e),this.name="SignatureVerificationError"}};function S(r){if(r instanceof Error)return r;if(typeof r=="string")return new Error(r);try{return new Error(JSON.stringify(r))}catch{return new Error(String(r))}}var O="https://marketplace.kaven.site",_=3e4,P=3,C=1e3;function b(r){process.env.KAVEN_DEBUG==="1"&&console.debug(`[kaven:debug] ${r}`)}async function D(){try{let r=q.join(x.homedir(),".kaven","config.json");if(await v.pathExists(r)){let e=await v.readJson(r);if(typeof e.apiUrl=="string"&&e.apiUrl)return e.apiUrl}}catch{}return null}async function I(){if(process.env.KAVEN_SERVICE_TOKEN)return process.env.KAVEN_SERVICE_TOKEN;try{let r=q.join(x.homedir(),".kaven","config.json");if(await v.pathExists(r)){let e=await v.readJson(r);if(typeof e.serviceToken=="string"&&e.serviceToken)return e.serviceToken}}catch{}return null}async function j(){if(process.env.KAVEN_API_URL)return process.env.KAVEN_API_URL.replace(/\/$/,"");let r=await D();return r?r.replace(/\/$/,""):O}function K(r){return new Promise(e=>setTimeout(e,r))}function G(r){return r>=500}var $=class{baseURLPromise;authService;constructor(e){this.authService=e??null,this.baseURLPromise=j()}async resolveUrl(e){return`${await this.baseURLPromise}${e}`}async request(e,t,s={}){let k=`${await this.baseURLPromise}${t}`,{body:d,authenticated:U=!1}=s,g=null;for(let u=0;u<=P;u++){if(u>0){let l=C*Math.pow(2,u-1);b(`Retry attempt ${u} for ${e} ${t} (delay ${l}ms)`),await K(l)}try{let l={"Content-Type":"application/json",Accept:"application/json"};if(U&&this.authService){let h=await this.authService.getValidToken();l.Authorization=`Bearer ${h}`}let n=await I();n&&(l["X-Service-Token"]=n),b(`${e} ${k}`);let w=new AbortController,M=setTimeout(()=>w.abort(),_),o;try{o=await fetch(k,{method:e,headers:l,body:d!==void 0?JSON.stringify(d):void 0,signal:w.signal})}finally{clearTimeout(M)}if(b(`Response: ${o.status} ${o.statusText}`),!o.ok){let h=await o.text().catch(()=>""),f=h;try{let a=JSON.parse(h);f=a.message||a.error||h}catch{}switch(o.status){case 401:throw new T(f||"Authentication required");case 403:{let a="pro";try{a=JSON.parse(h).requiredTier||a}catch{}throw new E(a,f||"License required")}case 404:throw new p(f||"Resource not found");case 429:{let a=parseInt(o.headers.get("retry-after")??"60",10);throw new R(isNaN(a)?60:a)}default:if(G(o.status)){g=new m(f||`Server error: ${o.status}`);continue}throw new m(f||`Server error: ${o.status}`)}}return(o.headers.get("content-type")??"").includes("application/json")?await o.json():{}}catch(l){let n=S(l);if(n instanceof T||n instanceof E||n instanceof p||n instanceof R)throw n;if(n instanceof TypeError||n.name==="AbortError"){let w=new y(n.name==="AbortError"?"Request timed out after 30s":`Network error: ${n.message}`);if(g=w,u<P)continue;throw w}if(n instanceof m){if(g=n,u<P)continue;throw n}throw n}}throw g??new y("Request failed after retries")}async requestDeviceCode(){return this.request("POST","/auth/device-code",{body:{client_id:"kaven-cli"},authenticated:!1})}async pollDeviceToken(e){try{let s=`${await this.baseURLPromise}/auth/token`,i=new AbortController,k=setTimeout(()=>i.abort(),_),d;try{d=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:i.signal})}finally{clearTimeout(k)}if(d.ok)return{status:"success",tokens:await d.json()};let g=(await d.json().catch(()=>({}))).error??"unknown_error";switch(g){case"authorization_pending":return{status:"authorization_pending"};case"slow_down":return{status:"slow_down"};case"access_denied":return{status:"access_denied"};case"expired_token":return{status:"expired_token"};default:throw new Error(`Unexpected error: ${g}`)}}catch(t){let s=S(t),i=s;throw i.code==="ECONNREFUSED"||i.code==="ENOTFOUND"?new y("Network error. Check your connection and try again."):s}}async refreshToken(e){return this.request("POST","/auth/refresh",{body:{refresh_token:e},authenticated:!1})}async listModules(e){let t=new URLSearchParams;e?.category&&t.set("category",e.category),e?.tier&&t.set("tier",e.tier),e?.q&&t.set("q",e.q),e?.page&&t.set("page",String(e.page)),e?.pageSize&&t.set("pageSize",String(e.pageSize));let s=t.toString(),i=`/modules${s?`?${s}`:""}`;return this.request("GET",i)}async getModule(e){return this.request("GET",`/modules/${e}`)}async getManifest(e,t){return this.request("GET",`/modules/${e}/versions/${t}/manifest`)}async createDownloadToken(e,t){return this.request("POST","/download-tokens",{body:{moduleSlug:e,version:t},authenticated:!0})}async validateLicense(e,t){return await this.request("POST","/licenses/validate",{body:{licenseKey:e,requiredTier:t}})}async getLicenseStatus(e){return this.request("GET",`/licenses/status?key=${encodeURIComponent(e)}`)}async getModuleManifest(e){try{return await this.getManifest(e,"latest")}catch(t){if(t instanceof p)return null;throw t}}async getReleaseInfo(e,t){return this.request("GET",`/modules/${e}/versions/${t}`)}async getUploadUrl(e,t,s){return this.request("POST","/releases/upload-url",{body:{moduleSlug:e,version:t,size:s},authenticated:!0})}async createRelease(e){return this.request("POST","/releases",{body:e,authenticated:!0})}async createCheckoutSession(e,t){return this.request("POST","/checkout/session",{body:{tier:e,licenseKey:t},authenticated:!0})}async getCheckoutStatus(e){return this.request("GET",`/checkout/session/${e}/status`,{authenticated:!0})}async getCategories(){try{let e=await this.request("GET","/categories",{authenticated:!1});return Array.isArray(e)?e:e.categories??[]}catch(e){if(e instanceof p){let s=(await this.request("GET","/search?q=",{authenticated:!1})).facets?.categories?.map(i=>i.category).filter(Boolean)??[];return[...new Set(s)].sort()}throw e}}};export{T as a,E as b,p as c,y as d,A as e,S as f,$ as g};
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{a as wo,b as yo,c as vo,d as gt,e as Ze,f as fe,g as J}from"./chunk-
|
|
3
|
-
`)){let p=m.trim();if(p.startsWith("#")||!p.includes("="))continue;let f=p.split("=")[0].trim();f&&u.add(f)}return u},s=i(a),c=i(r),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=z.join(Kn.homedir(),".kaven","license.json");if(!await C.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 C.readJson(t);if(n.expiresAt){let a=new Date(n.expiresAt).getTime();if(Date.now()>a)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=z.join(this.projectRoot,"package.json");if(!await C.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 C.readJSON(t),a=n.dependencies?.["@kaven/core"]||n.devDependencies?.["@kaven/core"];if(!a)return e.push({type:"dependency",severity:"info",message:"@kaven/core not found in dependencies \u2014 not a Kaven framework project",fixable:!1}),e;let r="1.0.0",s=a.replace(/[\^~>=<]
|
|
2
|
+
import{a as wo,b as yo,c as vo,d as gt,e as Ze,f as fe,g as J}from"./chunk-XY5BXJEH.js";import{Command as Br}from"commander";var ko={name:"kaven-cli",version:"0.11.4",type:"module",description:"Kaven CLI - The official command line tool for Kaven",main:"dist/index.js",bin:{kaven:"./dist/index.js"},files:["dist","README.md"],scripts:{build:"tsup src/index.ts --format esm --clean --minify --shims --dts",dev:"tsup src/index.ts --format esm --watch --silent",prepublishOnly:"pnpm run build",lint:"eslint 'src/**/*.{ts,tsx}' --max-warnings 0","lint:fix":"eslint 'src/**/*.{ts,tsx}' --fix",test:"node scripts/run-tests.mjs","test:watch":"node --import tsx --test --watch 'src/**/*.test.ts' 'tests/**/*.test.ts'","test:coverage":"node --import tsx --test --experimental-test-coverage 'src/**/*.test.ts' 'tests/**/*.test.ts'",typecheck:"tsc --noEmit",quality:"pnpm run lint && pnpm run typecheck && pnpm run test","quality:gate":"./.agent/scripts/quality-gate.sh",bootstrap:"./.agent/scripts/bootstrap.sh",evidence:"./.agent/scripts/evidence-bundle.sh","validate:evidence":"./.agent/scripts/validate-evidence.sh","create:pr":"./.agent/scripts/create-pr.sh","telemetry:view":"tail -f ~/.kaven/telemetry.log","telemetry:clear":"rm -f ~/.kaven/telemetry.log && touch ~/.kaven/telemetry.log"},keywords:["kaven","cli","developer-tools","saas","boilerplate"],author:"Kaven",license:"Apache-2.0",repository:{type:"git",url:"https://github.com/kaven-co/kaven-cli"},devDependencies:{"@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/git":"^10.0.1","@semantic-release/github":"^12.0.6","@semantic-release/npm":"^13.1.5","@semantic-release/release-notes-generator":"^14.1.0","@types/fs-extra":"^11.0.4","@types/js-yaml":"^4.0.9","@types/node":"^25.6.0","@types/tar":"^6.1.13","@typescript-eslint/eslint-plugin":"^8.53.1","@typescript-eslint/parser":"^8.53.1",eslint:"^8.0.0",msw:"^2.12.10","semantic-release":"^25.0.3",tsup:"^8.5.1",tsx:"^4.21.0",typescript:"^5.0.0"},engines:{node:">=20"},dependencies:{"@clack/prompts":"^1.2.0","@inquirer/prompts":"^7.5.2",chalk:"^5.6.2","cli-table3":"^0.6.5",commander:"^14.0.2","fs-extra":"^11.3.3",glob:"^13.0.0",i18next:"^26.0.6","js-yaml":"^4.2.0",open:"^10.1.0",ora:"^9.1.0",picocolors:"^1.1.1",tar:"^7.5.16",zod:"^4.3.6"},pnpm:{overrides:{"minimatch@<10.2.3":">=10.2.3","@isaacs/brace-expansion@<=5.0.0":">=5.0.1","brace-expansion@>=5.0.0 <5.0.6":">=5.0.6","esbuild@<=0.24.2":">=0.25.0","esbuild@>=0.27.0 <0.28.1":">=0.28.1","handlebars@<=4.7.8":">=4.7.9","tar@<=7.5.15":">=7.5.16","lodash@<=4.17.23":">=4.18.0","lodash-es@<=4.17.23":">=4.18.0","rollup@<4.59.0":">=4.59.0","vite@<=6.4.1":">=6.4.2","flatted@<=3.4.1":">=3.4.2","picomatch@<2.3.2":">=2.3.2","picomatch@>=4.0.0 <4.0.4":">=4.0.4",undici:">=7.28.0"}}};import S from"chalk";import{execSync as Eo}from"child_process";import So from"path";import wt from"fs-extra";import C from"fs-extra";import z from"path";import Kn from"os";var ht=class{constructor(e,t,n){this.projectRoot=e;this.markerService=t;this.manifestParser=n}projectRoot;markerService;manifestParser;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:a}of t){let r=z.join(this.projectRoot,n);if(!await C.pathExists(r)){e.push({type:"anchor",severity:"warning",message:`File not found: ${n}`,file:n,fixable:!1});continue}(await C.readFile(r,"utf-8")).includes(a)||e.push({type:"anchor",severity:"error",message:`Missing anchor: ${a}`,file:n,fixable:!1})}return e}async checkMarkers(){let e=[],n=(await this.readKavenConfig()).modules.filter(a=>a.installed);for(let a of n){let r=z.join(this.projectRoot,".kaven/modules",a.name,"module.json");if(!await C.pathExists(r)){e.push({type:"marker",severity:"error",message:`Manifest not found for installed module: ${a.name}`,fixable:!1});continue}try{let i=await this.manifestParser.parse(r);for(let s of i.injections){let c=z.join(this.projectRoot,s.file);if(!await C.pathExists(c)){e.push({type:"marker",severity:"error",message:`Injection target not found: ${s.file}`,file:s.file,fixable:!1});continue}let l=await C.readFile(c,"utf-8"),d=s.moduleName||a.name;this.markerService.detectMarkers(l,d).found||e.push({type:"marker",severity:"error",message:`Module ${a.name} not injected in ${s.file}`,file:s.file,fixable:!0})}}catch(i){e.push({type:"marker",severity:"error",message:`Invalid manifest for module ${a.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),a=z.join(this.projectRoot,"package.json");if(!await C.pathExists(a))return e.push({type:"dependency",severity:"error",message:"package.json not found",fixable:!1}),e;let r=await C.readJSON(a);for(let i of n){let s=z.join(this.projectRoot,".kaven/modules",i.name,"module.json");if(await C.pathExists(s))try{let c=await this.manifestParser.parse(s);for(let l of c.dependencies.npm){let[d]=l.split("@"),u=r.dependencies?.[d],m=r.devDependencies?.[d];!u&&!m&&e.push({type:"dependency",severity:"warning",message:`Missing npm dependency: ${l}`,fixable:!0})}}catch{}}return e}async checkSchemaMerge(){let e=[],t=z.join(this.projectRoot,"packages/database/prisma/schema.base.prisma");if(!await C.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=z.dirname(t);try{let a=await C.readdir(n);for(let r of a){if(!r.endsWith(".prisma"))continue;let i=z.join(n,r);(await C.readFile(i,"utf-8")).includes("<<<<<<<")&&e.push({type:"marker",severity:"error",message:`Merge conflict detected in schema file: ${r}`,file:z.join("packages/database/prisma",r),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=z.join(this.projectRoot,".env.example"),n=z.join(this.projectRoot,".env");if(!await C.pathExists(t))return e.push({type:"dependency",severity:"info",message:".env.example not found \u2014 skipping env completeness check",fixable:!1}),e;if(!await C.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 a=await C.readFile(t,"utf-8"),r=await C.readFile(n,"utf-8"),i=d=>{let u=new Set;for(let m of d.split(`
|
|
3
|
+
`)){let p=m.trim();if(p.startsWith("#")||!p.includes("="))continue;let f=p.split("=")[0].trim();f&&u.add(f)}return u},s=i(a),c=i(r),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=z.join(Kn.homedir(),".kaven","license.json");if(!await C.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 C.readJson(t);if(n.expiresAt){let a=new Date(n.expiresAt).getTime();if(Date.now()>a)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=z.join(this.projectRoot,"package.json");if(!await C.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 C.readJSON(t),a=n.dependencies?.["@kaven/core"]||n.devDependencies?.["@kaven/core"];if(!a)return e.push({type:"dependency",severity:"info",message:"@kaven/core not found in dependencies \u2014 not a Kaven framework project",fixable:!1}),e;let r="1.0.0",s=a.replace(/[\^~>=<]/g,"").split(" ")[0].split(".").map(Number),c=r.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 (${a})`,fixable:!1}):e.push({type:"dependency",severity:"warning",message:`@kaven/core version ${a} may be outdated. Minimum: ^${r}`,fixable:!1})}catch{e.push({type:"dependency",severity:"info",message:"Could not determine framework version",fixable:!1})}return e}async checkPrismaClientSync(){let e=[],t=z.join(this.projectRoot,"node_modules/@prisma/client"),n=z.join(this.projectRoot,"prisma/schema.prisma");if(!await C.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 C.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 a=await C.stat(n),r=await C.stat(t);a.mtime>r.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=z.join(this.projectRoot,"kaven.json");if(!await C.pathExists(e))return{modules:[]};try{return await C.readJSON(e)}catch{return{modules:[]}}}};function Qe(o){return{moduleName:o,beginMarker:`// [KAVEN_MODULE:${o} BEGIN]`,endMarker:`// [KAVEN_MODULE:${o} END]`}}var le=class{hasModule(e,t){let n=Qe(t);return e.includes(n.beginMarker)&&e.includes(n.endMarker)}detectMarkers(e,t){let n=Qe(t),a=e.split(`
|
|
4
4
|
`),r,i;for(let s=0;s<a.length;s++)if(a[s].includes(n.beginMarker)&&(r=s),a[s].includes(n.endMarker)){i=s;break}if(r!==void 0&&i!==void 0){let s=a.slice(r+1,i).join(`
|
|
5
5
|
`);return{found:!0,beginLine:r,endLine:i,content:s}}return{found:!1}}injectModule(e,t,n,a){if(this.hasModule(e,n))throw new Error(`Module ${n} already injected`);if(!e.includes(t))throw new Error(`Anchor not found: ${t}`);let r=Qe(n),i=`
|
|
6
6
|
${r.beginMarker}
|
|
@@ -16,14 +16,14 @@ ${this.formatZodError(a)}`):a}}async validate(e){try{return await this.parse(e),
|
|
|
16
16
|
`));let e=new le,t=new Oe,n=new ht(process.cwd(),e,t),a=[];try{a=await n.checkAll()}catch(s){o.json?console.log(JSON.stringify({success:!1,error:s instanceof Error?s.message:String(s),results:[]})):console.error(S.red(`[ERROR] Heavy failure during doctor audit: ${s instanceof Error?s.message:String(s)}`)),process.exit(1);return}if(o.json){let s=a.filter(l=>l.severity==="error"),c=a.filter(l=>l.severity==="warning");console.log(JSON.stringify({success:s.length===0,errors:s.length,warnings:c.length,results:a},null,2)),process.exit(s.length>0?1:c.length>0?2:0);return}for(let s of a){let c=Hn(s.severity);console.log(`${c} ${s.message}`),s.file&&console.log(S.gray(` file: ${s.file}`)),s.fixable&&!o.fix&&console.log(S.gray(" (fixable: run with --fix)"))}let r=a.filter(s=>s.severity==="error"),i=a.filter(s=>s.severity==="warning");console.log(),r.length===0&&i.length===0?console.log(S.green("[OK] All checks passed! Your project is healthy.")):(r.length>0&&console.log(S.red(`[ERROR] Found ${r.length} error(s)`)),i.length>0&&console.log(S.yellow(`[WARN] Found ${i.length} warning(s)`)),o.fix||(console.log(S.gray(`
|
|
17
17
|
Tip: Run with --fix to attempt automatic repairs`)),console.log(S.gray("Try: kaven module doctor --fix")))),o.fix&&(console.log(),console.log(S.blue(`Applying auto-fixes...
|
|
18
18
|
`)),await Wn(a,process.cwd()),console.log(S.green(`
|
|
19
|
-
Auto-fix completed.`))),r.length>0&&process.exit(1),i.length>0&&process.exit(2)}import $o from"chalk";import ea from"ora";import ot from"path";import Fe from"fs-extra";import re from"fs-extra";import ie from"path";import{glob as Xn}from"glob";var et=class{constructor(e,t=".agent/backups"){this.projectRoot=e;this.backupDir=ie.join(e,t),this.backupId=`backup_${Date.now()}`}backupDir;backupId;filesToBackup=[];async backup(e){let t=ie.join(this.backupDir,this.backupId);await re.ensureDir(t);for(let n of e){let a=ie.resolve(this.projectRoot,n);if(!await re.pathExists(a))throw new Error(`File not found for backup: ${n}`);let r=ie.relative(this.projectRoot,a),i=ie.join(t,r);await re.ensureDir(ie.dirname(i)),await re.copy(a,i),this.filesToBackup.push(a)}console.log(`\u{1F4E6} Backup created: ${this.backupId}`)}async rollback(){let e=ie.join(this.backupDir,this.backupId);if(!await re.pathExists(e))throw new Error(`Backup not found: ${this.backupId}`);let t=await Xn(`${e}/**/*`,{nodir:!0});for(let n of t){let a=ie.relative(e,n),r=ie.join(this.projectRoot,a);await re.ensureDir(ie.dirname(r)),await re.copy(n,r,{overwrite:!0})}console.log(`\u267B\uFE0F Rollback complete: ${this.backupId}`)}async commit(){let e=ie.join(this.backupDir,this.backupId);await re.pathExists(e)&&await re.remove(e),console.log("\u2705 Transaction committed")}getBackupId(){return this.backupId}async cleanup(){if(!await re.pathExists(this.backupDir))return;let e=await re.readdir(this.backupDir),t=Date.now(),n=10080*60*1e3;for(let a of e){let r=a.match(/backup_(\d+)/);if(r){let i=parseInt(r[1]);t-i>n&&await re.remove(ie.join(this.backupDir,a))}}}};import Yn from"child_process";import Zn from"readline";import yt from"chalk";var tt=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(yt.dim(` Skipping ${t} script.`));return}return new Promise((a,r)=>{let i=Yn.spawn(e.command,e.args??[],{cwd:e.cwd,stdio:["ignore","pipe","pipe"],shell:!0}),s=yt.dim(`[${t}] `);i.stdout?.on("data",l=>{process.stdout.write(s+l.toString())}),i.stderr?.on("data",l=>{process.stderr.write(s+yt.yellow(l.toString()))});let c=setTimeout(()=>{console.warn(yt.yellow(`
|
|
19
|
+
Auto-fix completed.`))),r.length>0&&process.exit(1),i.length>0&&process.exit(2)}import $o from"chalk";import ea from"ora";import ot from"path";import Fe from"fs-extra";import re from"fs-extra";import ie from"path";import{glob as Xn}from"glob";var et=class{constructor(e,t=".agent/backups"){this.projectRoot=e;this.backupDir=ie.join(e,t),this.backupId=`backup_${Date.now()}`}projectRoot;backupDir;backupId;filesToBackup=[];async backup(e){let t=ie.join(this.backupDir,this.backupId);await re.ensureDir(t);for(let n of e){let a=ie.resolve(this.projectRoot,n);if(!await re.pathExists(a))throw new Error(`File not found for backup: ${n}`);let r=ie.relative(this.projectRoot,a),i=ie.join(t,r);await re.ensureDir(ie.dirname(i)),await re.copy(a,i),this.filesToBackup.push(a)}console.log(`\u{1F4E6} Backup created: ${this.backupId}`)}async rollback(){let e=ie.join(this.backupDir,this.backupId);if(!await re.pathExists(e))throw new Error(`Backup not found: ${this.backupId}`);let t=await Xn(`${e}/**/*`,{nodir:!0});for(let n of t){let a=ie.relative(e,n),r=ie.join(this.projectRoot,a);await re.ensureDir(ie.dirname(r)),await re.copy(n,r,{overwrite:!0})}console.log(`\u267B\uFE0F Rollback complete: ${this.backupId}`)}async commit(){let e=ie.join(this.backupDir,this.backupId);await re.pathExists(e)&&await re.remove(e),console.log("\u2705 Transaction committed")}getBackupId(){return this.backupId}async cleanup(){if(!await re.pathExists(this.backupDir))return;let e=await re.readdir(this.backupDir),t=Date.now(),n=10080*60*1e3;for(let a of e){let r=a.match(/backup_(\d+)/);if(r){let i=parseInt(r[1]);t-i>n&&await re.remove(ie.join(this.backupDir,a))}}}};import Yn from"child_process";import Zn from"readline";import yt from"chalk";var tt=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(yt.dim(` Skipping ${t} script.`));return}return new Promise((a,r)=>{let i=Yn.spawn(e.command,e.args??[],{cwd:e.cwd,stdio:["ignore","pipe","pipe"],shell:!0}),s=yt.dim(`[${t}] `);i.stdout?.on("data",l=>{process.stdout.write(s+l.toString())}),i.stderr?.on("data",l=>{process.stderr.write(s+yt.yellow(l.toString()))});let c=setTimeout(()=>{console.warn(yt.yellow(`
|
|
20
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?a():r(new Error(`${t} script exited with code ${l}`))}),i.on("error",l=>{clearTimeout(c),r(l)})})}async runScripts(e,t,n=!1){for(let a of e)await this.runScript(a,t,n)}confirm(e){return new Promise(t=>{let n=Zn.createInterface({input:process.stdin,output:process.stdout});n.question(`
|
|
21
|
-
${e} [y/N] `,a=>{n.close(),t(a.toLowerCase()==="y"||a.toLowerCase()==="yes")})})}};import Le from"fs-extra";import Ft from"path";import Ut from"chalk";var be=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 a=await Le.readFile(n,"utf-8");if(this.markerService.hasModule(a,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/**"],a=[];for(let r of t){let i=await e(r,{cwd:this.projectRoot,absolute:!0,ignore:n});a.push(...i)}return[...new Set(a)]}async install(e,t){let n=new et(this.projectRoot);try{let a=Array.from(new Set(e.injections.map(i=>i.file)));await n.backup(a);for(let i of e.injections)await this.injectCode(i);await n.commit();let r=await this.readManifest(this.projectRoot);if(r?.scripts?.postInstall?.length){let i=new tt;try{await i.runScripts(r.scripts.postInstall.map(s=>({...s,cwd:this.projectRoot})),"postInstall",!1)}catch(s){let c=s instanceof Error?s.message:String(s);console.warn(Ut.yellow(`
|
|
21
|
+
${e} [y/N] `,a=>{n.close(),t(a.toLowerCase()==="y"||a.toLowerCase()==="yes")})})}};import Le from"fs-extra";import Ft from"path";import Ut from"chalk";var be=class{constructor(e,t){this.projectRoot=e;this.markerService=t}projectRoot;markerService;async isModuleInstalled(e){try{let t=await this.findProjectFiles();for(let n of t)try{let a=await Le.readFile(n,"utf-8");if(this.markerService.hasModule(a,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/**"],a=[];for(let r of t){let i=await e(r,{cwd:this.projectRoot,absolute:!0,ignore:n});a.push(...i)}return[...new Set(a)]}async install(e,t){let n=new et(this.projectRoot);try{let a=Array.from(new Set(e.injections.map(i=>i.file)));await n.backup(a);for(let i of e.injections)await this.injectCode(i);await n.commit();let r=await this.readManifest(this.projectRoot);if(r?.scripts?.postInstall?.length){let i=new tt;try{await i.runScripts(r.scripts.postInstall.map(s=>({...s,cwd:this.projectRoot})),"postInstall",!1)}catch(s){let c=s instanceof Error?s.message:String(s);console.warn(Ut.yellow(`
|
|
22
22
|
\u26A0 PostInstall script failed: ${c}`)),console.warn(Ut.dim(" The module is installed. Run the script manually if needed."))}}if(!t?.skipEnv&&r?.env?.length){let{EnvManager:i}=await import("./EnvManager-NMS3NMIE.js"),s=new i,c=r.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(a){let r=a instanceof Error?a.message:String(a);throw console.error(`\u274C Installation failed: ${r}`),console.log("\u{1F504} Rolling back..."),await n.rollback(),a}}async uninstall(e,t){let n=new et(this.projectRoot);try{let a=Array.from(new Set(e.injections.map(c=>c.file)));await n.backup(a);let{EnvManager:r}=await import("./EnvManager-NMS3NMIE.js");new r().removeEnvVars(e.name,{projectDir:this.projectRoot,skipEnv:t?.skipEnv});let s=await this.readManifest(this.projectRoot);if(s?.scripts?.preRemove?.length){let c=new tt;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(Ut.yellow(`
|
|
23
23
|
\u26A0 PreRemove script failed: ${d}`))}}for(let c of a)await this.removeCode(c,e.name);await n.commit()}catch(a){let r=a instanceof Error?a.message:String(a);throw console.error(`\u274C Removal failed: ${r}`),console.log("\u{1F504} Rolling back..."),await n.rollback(),a}}async injectCode(e){let t=Ft.join(this.projectRoot,e.file),n=await Le.readFile(t,"utf-8"),a=this.markerService.injectModule(n,e.anchor,e.moduleName||"unnamed",e.code);await Le.writeFile(t,a)}async removeCode(e,t){let n=Ft.join(this.projectRoot,e),a=await Le.readFile(n,"utf-8"),r=this.markerService.removeModule(a,t);await Le.writeFile(n,r)}async readManifest(e){try{let t=await Le.readFile(Ft.join(e,"module.json"),"utf-8");return JSON.parse(t)}catch{return null}}};import vt from"fs-extra";import Po from"path";import Qn from"os";var j=class o{static instance;logPath;buffer=[];constructor(){this.logPath=Po.join(Qn.homedir(),".kaven","telemetry.log")}static getInstance(){return o.instance||(o.instance=new o),o.instance}capture(e,t,n){let a={event:e,timestamp:new Date().toISOString(),metadata:t,duration:n};this.buffer.push(a)}async flush(){if(this.buffer.length!==0)try{let e=Po.dirname(this.logPath);await vt.ensureDir(e);let t=this.buffer.map(n=>JSON.stringify(n)).join(`
|
|
24
24
|
`)+`
|
|
25
25
|
`;await vt.appendFile(this.logPath,t,"utf8"),this.buffer=[]}catch(e){console.debug("Erro ao gravar telemetria:",e)}}async getRecentEvents(e=20){if(!await vt.pathExists(this.logPath))return[];try{return(await vt.readFile(this.logPath,"utf8")).trim().split(`
|
|
26
|
-
`).reverse().slice(0,e).map(n=>JSON.parse(n))}catch{return[]}}};async function Io(o,e){let t=j.getInstance(),n=Date.now();t.capture("cli.module.add.start",{manifestPath:o});let a=e||process.cwd(),r=ea("Preparando instala\xE7\xE3o do m\xF3dulo...").start();try{let i=new le,s=new Oe,c=new be(a,i),l=ot.isAbsolute(o)?o:ot.join(a,o);if(!await Fe.pathExists(l))throw new Error(`Arquivo de manifest n\xE3o encontrado: ${o}`);r.text="Validando manifest...";let d=await s.parse(l);r.text=`Instalando ${d.name}@${d.version}...`,await c.install(d),r.text="Atualizando configura\xE7\xE3o do projeto...",await ta(a,d.name,d.version),r.text="Salvando cache do manifest...";let u=ot.join(a,".kaven","modules",d.name);await Fe.ensureDir(u),await Fe.writeJson(ot.join(u,"module.json"),d,{spaces:2}),r.succeed($o.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(),r.fail($o.red(`Falha na instala\xE7\xE3o: ${i instanceof Error?i.message:String(i)}`)),process.exit(1)}}async function ta(o,e,t){let n=ot.join(o,"kaven.json"),a={modules:{}};await Fe.pathExists(n)&&(a=await Fe.readJson(n)),a.modules||(a.modules={}),a.modules[e]=t,await Fe.writeJson(n,a,{spaces:2})}import Nt from"chalk";import Kt from"ora";import Vt from"path";import Ue from"fs-extra";async function Ao(o,e){let t=j.getInstance(),n=Date.now();t.capture("cli.module.remove.start",{moduleName:o});let a=e||process.cwd(),r=Kt(`Removendo m\xF3dulo ${o}...`).start();try{let i=new le,s=new be(a,i),c=Vt.join(a,"kaven.json");if(!await Ue.pathExists(c))throw new Error("Arquivo kaven.json n\xE3o encontrado. Este \xE9 um projeto Kaven?");let l=await Ue.readJson(c);if(!l.modules||!l.modules[o])throw new Error(`O m\xF3dulo ${o} n\xE3o est\xE1 instalado.`);let d=Vt.join(a,".kaven","modules",o,"module.json");if(!await Ue.pathExists(d))throw new Error(`Cache do manifest para ${o} n\xE3o encontrado em ${d}. A remo\xE7\xE3o precisa do manifest original.`);let u=await Ue.readJson(d);r.text=`Removendo inje\xE7\xF5es de ${o}...`,await s.uninstall(u),r.text="Atualizando configura\xE7\xE3o do projeto...",delete l.modules[o],await Ue.writeJson(c,l,{spaces:2}),await Ue.remove(Vt.dirname(d)),Kt().succeed(Nt.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(),Kt().fail(Nt.red(`Falha ao remover m\xF3dulo ${o}:`)),r.fail(Nt.red(`${i instanceof Error?i.message:String(i)}`)),process.exit(1)}}import _ from"fs-extra";import N from"path";import ua from"os";import*as Ro from"tar";import*as Z from"@clack/prompts";import V from"picocolors";import se from"fs-extra";import Bt from"path";import oa from"os";function Mo(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),a=Buffer.from(n,"base64").toString("utf8");return JSON.parse(a)}catch{return null}}function na(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 a=Math.floor(n/3600),r=Math.floor(n%3600/60);return a>0?`expires in ${a}h ${r}m`:`expires in ${r}m`}var M=class{configPath;constructor(){this.configPath=Bt.join(oa.homedir(),".kaven","auth.json")}async saveTokens(e){let t=Bt.dirname(this.configPath);await se.ensureDir(t),await se.writeJson(this.configPath,e,{spaces:2}),process.platform!=="win32"&&await se.chmod(this.configPath,384)}async storeToken(e){let t=Bt.dirname(this.configPath);await se.ensureDir(t),await se.writeJson(this.configPath,{token:e},{spaces:2}),process.platform!=="win32"&&await se.chmod(this.configPath,384)}async getAuth(){if(!await se.pathExists(this.configPath))return null;try{let e=await se.readJson(this.configPath);return e.access_token?e:null}catch{return null}}async getToken(){if(!await se.pathExists(this.configPath))return null;try{let e=await se.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(),a=300*1e3,r=t-n<a,i=n>=t;if(!r)return e.access_token;try{let{MarketplaceClient:s}=await import("./MarketplaceClient-
|
|
26
|
+
`).reverse().slice(0,e).map(n=>JSON.parse(n))}catch{return[]}}};async function Io(o,e){let t=j.getInstance(),n=Date.now();t.capture("cli.module.add.start",{manifestPath:o});let a=e||process.cwd(),r=ea("Preparando instala\xE7\xE3o do m\xF3dulo...").start();try{let i=new le,s=new Oe,c=new be(a,i),l=ot.isAbsolute(o)?o:ot.join(a,o);if(!await Fe.pathExists(l))throw new Error(`Arquivo de manifest n\xE3o encontrado: ${o}`);r.text="Validando manifest...";let d=await s.parse(l);r.text=`Instalando ${d.name}@${d.version}...`,await c.install(d),r.text="Atualizando configura\xE7\xE3o do projeto...",await ta(a,d.name,d.version),r.text="Salvando cache do manifest...";let u=ot.join(a,".kaven","modules",d.name);await Fe.ensureDir(u),await Fe.writeJson(ot.join(u,"module.json"),d,{spaces:2}),r.succeed($o.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(),r.fail($o.red(`Falha na instala\xE7\xE3o: ${i instanceof Error?i.message:String(i)}`)),process.exit(1)}}async function ta(o,e,t){let n=ot.join(o,"kaven.json"),a={modules:{}};await Fe.pathExists(n)&&(a=await Fe.readJson(n)),a.modules||(a.modules={}),a.modules[e]=t,await Fe.writeJson(n,a,{spaces:2})}import Nt from"chalk";import Kt from"ora";import Vt from"path";import Ue from"fs-extra";async function Ao(o,e){let t=j.getInstance(),n=Date.now();t.capture("cli.module.remove.start",{moduleName:o});let a=e||process.cwd(),r=Kt(`Removendo m\xF3dulo ${o}...`).start();try{let i=new le,s=new be(a,i),c=Vt.join(a,"kaven.json");if(!await Ue.pathExists(c))throw new Error("Arquivo kaven.json n\xE3o encontrado. Este \xE9 um projeto Kaven?");let l=await Ue.readJson(c);if(!l.modules||!l.modules[o])throw new Error(`O m\xF3dulo ${o} n\xE3o est\xE1 instalado.`);let d=Vt.join(a,".kaven","modules",o,"module.json");if(!await Ue.pathExists(d))throw new Error(`Cache do manifest para ${o} n\xE3o encontrado em ${d}. A remo\xE7\xE3o precisa do manifest original.`);let u=await Ue.readJson(d);r.text=`Removendo inje\xE7\xF5es de ${o}...`,await s.uninstall(u),r.text="Atualizando configura\xE7\xE3o do projeto...",delete l.modules[o],await Ue.writeJson(c,l,{spaces:2}),await Ue.remove(Vt.dirname(d)),Kt().succeed(Nt.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(),Kt().fail(Nt.red(`Falha ao remover m\xF3dulo ${o}:`)),r.fail(Nt.red(`${i instanceof Error?i.message:String(i)}`)),process.exit(1)}}import _ from"fs-extra";import N from"path";import ua from"os";import*as Ro from"tar";import*as Z from"@clack/prompts";import V from"picocolors";import se from"fs-extra";import Bt from"path";import oa from"os";function Mo(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),a=Buffer.from(n,"base64").toString("utf8");return JSON.parse(a)}catch{return null}}function na(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 a=Math.floor(n/3600),r=Math.floor(n%3600/60);return a>0?`expires in ${a}h ${r}m`:`expires in ${r}m`}var M=class{configPath;constructor(){this.configPath=Bt.join(oa.homedir(),".kaven","auth.json")}async saveTokens(e){let t=Bt.dirname(this.configPath);await se.ensureDir(t),await se.writeJson(this.configPath,e,{spaces:2}),process.platform!=="win32"&&await se.chmod(this.configPath,384)}async storeToken(e){let t=Bt.dirname(this.configPath);await se.ensureDir(t),await se.writeJson(this.configPath,{token:e},{spaces:2}),process.platform!=="win32"&&await se.chmod(this.configPath,384)}async getAuth(){if(!await se.pathExists(this.configPath))return null;try{let e=await se.readJson(this.configPath);return e.access_token?e:null}catch{return null}}async getToken(){if(!await se.pathExists(this.configPath))return null;try{let e=await se.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(),a=300*1e3,r=t-n<a,i=n>=t;if(!r)return e.access_token;try{let{MarketplaceClient:s}=await import("./MarketplaceClient-XMLIXDWN.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 se.pathExists(this.configPath)&&await se.remove(this.configPath)}async clearToken(){return this.logout()}async getUserInfo(){let e=await this.getAuth();if(!e)return null;let t=Mo(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?Mo(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:na(e.expires_at)}:null}};import{spawn as aa}from"child_process";import*as nt from"fs-extra";var kt=class{async performMerge(e,t,n){if(!await nt.pathExists(t))throw new Error("Baseline cache file missing: "+t+". Cannot perform safe merge.");return await nt.pathExists(e)?new Promise((a,r)=>{let i=aa("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?a({success:!0,conflicts:!1,output:s}):c!==null&&c>0?a({success:!0,conflicts:!0,output:s}):r(new Error("Git merge-file failed critically: "+s))})}):(await nt.copy(n,e),{success:!0,conflicts:!1,output:"New file copied"})}};import bt from"crypto";import ra from"fs-extra";async function ia(o){let e=await ra.readFile(o);return bt.createHash("sha256").update(e).digest("hex")}var sa=/^[0-9a-fA-F]+$/;function ca(o){return sa.test(o)&&o.length===128?Buffer.from(o,"hex"):Buffer.from(o,"base64")}function la(o,e,t){try{let n=bt.createPublicKey({key:Buffer.from(t,"base64"),type:"spki",format:"der"}),a=ca(e);return bt.verify(null,Buffer.from(o),n,a)?!0:bt.verify(null,Buffer.from(o+`
|
|
27
27
|
`),n,a)}catch{return!1}}async function xt(o){let e=await ia(o.filePath);if(e!==o.expectedChecksum)throw new Ze(`Checksum mismatch: expected ${o.expectedChecksum.substring(0,16)}..., got ${e.substring(0,16)}...`);if(!la(o.expectedChecksum,o.signature,o.publicKeyBase64))throw new Ze("Ed25519 signature verification failed. The package may have been tampered with.")}import Ne from"fs-extra";import qt from"path";var Jt=".kaven/cache/modules";function da(o,e){let t=o.split(".").map(Number),n=e.split(".").map(Number);for(let a=0;a<3;a++)if((t[a]??0)!==(n[a]??0))return(t[a]??0)-(n[a]??0);return 0}async function Et(o,e,t,n){let a=qt.join(n,Jt,`${o}-${e}`);await Ne.ensureDir(a),await Ne.copy(t,a)}async function St(o,e){let t=qt.join(e,Jt);if(!await Ne.pathExists(t))return null;let a=(await Ne.readdir(t)).filter(i=>{let s=i.lastIndexOf("-");return s>0&&i.slice(0,s)===o});if(a.length===0)return null;a.sort((i,s)=>{let c=i.slice(i.lastIndexOf("-")+1),l=s.slice(s.lastIndexOf("-")+1);return da(c,l)});let r=a[0];return r.slice(r.lastIndexOf("-")+1)}function zt(o,e,t){return qt.join(t,Jt,`${o}-${e}`)}async function jo(o,e,t){let n=zt(o,e,t);await Ne.pathExists(n)&&await Ne.remove(n)}var pa={x:Ro.x},B={intro:Z.intro,outro:Z.outro,spinner:Z.spinner,confirm:Z.confirm,select:Z.select,isCancel:Z.isCancel,log:Z.log};function To(o){return o.filter(e=>{let t=N.normalize(e);return!t.startsWith("..")&&!N.isAbsolute(t)})}async function ma(){let o=N.join(ua.tmpdir(),`kaven-update-${Date.now()}`);return await _.ensureDir(o),o}async function fa(o,e){let t=N.join(o,".kaven","conflicts.json");if(!await _.pathExists(t))return null;try{let n=await _.readJson(t);if(n.module===e)return n}catch{}return null}async function at(o,e,t={}){let n=j.getInstance(),a=Date.now(),r=e??process.cwd();if(B.intro(V.bold(V.cyan("kaven module update"))),!o&&(o=await ha(r),!o)){B.outro(V.yellow("Nenhum m\xF3dulo selecionado."));return}n.capture("cli.module.update.start",{slug:o});let i;try{let s=await fa(r,o);if(s){let b=await B.confirm({message:V.yellow(`Conflitos pendentes encontrados do update ${s.fromVersion}\u2192${s.toVersion}. Deseja tentar novamente?`)});if(B.isCancel(b)||!b){B.outro(V.yellow("Update cancelado. Resolva os conflitos manualmente e rode novamente."));return}await _.remove(N.join(r,".kaven","conflicts.json"))}let c=await St(o,r);c||(B.outro(V.red(`M\xF3dulo '${o}' n\xE3o est\xE1 instalado. Use 'kaven marketplace install ${o}' primeiro.`)),process.exit(1));let l=B.spinner();l.start(`Verificando vers\xE3o mais recente de '${o}'...`);let d=new M,u=new J(d);try{await d.getValidToken()}catch{l.stop("Autentica\xE7\xE3o necess\xE1ria."),B.outro(V.red("Execute: kaven auth login")),process.exit(1)}let m=await u.getModule(o),p=m.latestVersion??m.releases?.[0]?.version;if(p||(l.stop(),B.outro(V.red(`Nenhuma vers\xE3o publicada encontrada para '${o}'.`)),process.exit(1)),l.stop(`Vers\xE3o instalada: ${V.bold(c)} \u2014 \xDAltima vers\xE3o: ${V.bold(p)}`),c===p){B.outro(V.green(`\u2713 '${o}' j\xE1 est\xE1 na vers\xE3o mais recente (${p}).`)),n.capture("cli.module.update.already_latest",{slug:o,version:p},Date.now()-a),await n.flush();return}l.start(`Baixando '${o}@${p}'...`);let f=await u.createDownloadToken(o,p);i=await ma();let y=N.join(i,"module.tar.gz"),P=N.join(i,"extracted");await _.ensureDir(P);let R=await u.resolveUrl(f.downloadUrl),K=await fetch(R);if(!K.ok||!K.body)throw new Error(`Download falhou: ${K.status} ${K.statusText}`);let g=_.createWriteStream(y),I=K.body.getReader();if(await new Promise((b,A)=>{(async()=>{try{let ae=!0;for(;ae;){let{done:Ie,value:Dt}=await I.read();Ie?(g.end(),ae=!1):g.write(Dt)||await new Promise(Ot=>g.once("drain",Ot))}g.once("finish",b),g.once("error",A)}catch(ae){A(ae)}})()}),l.stop(`Download conclu\xEDdo: ${o}@${p}`),!t.skipVerify){l.start(`Verificando assinatura de ${o}@${p}...`);let b=await u.getReleaseInfo(o,p);b.checksum&&b.signature&&b.publicKey?(await xt({filePath:y,expectedChecksum:b.checksum,signature:b.signature,publicKeyBase64:b.publicKey}),l.stop(`Assinatura verificada: ${o}@${p}`)):l.stop(`Sem dados de assinatura para ${o}@${p} \u2014 verifica\xE7\xE3o ignorada`)}l.start("Extraindo arquivos..."),await pa.x({file:y,cwd:P}),l.stop("Extra\xE7\xE3o completa.");let me=N.join(P,"module.json");if(!await _.pathExists(me))throw new Error(`module.json n\xE3o encontrado no pacote de '${o}@${p}'`);let Ye=await _.readJson(me),Pe=To(Ye.mergeable??[]),_t=To(Ye.copyOnly??[]);l.start(`Cacheando baseline de ${o}@${p}...`),await Et(o,p,P,r),l.stop("Baseline cacheado.");let ho=zt(o,c,r),ft=new kt,$e=[];for(let b of Pe){let A=N.join(r,b),ne=N.join(ho,b),ae=N.join(P,b);if(!await _.pathExists(ae))continue;l.start(`Mergeando ${b}...`),(await ft.performMerge(A,ne,ae)).conflicts?($e.push(b),l.stop(V.yellow(` Conflito em ${b}`))):l.stop(V.green(` \u2713 ${b}`))}for(let b of _t){let A=N.join(P,b),ne=N.join(r,b);await _.pathExists(A)&&(l.start(`Copiando ${b}...`),await _.ensureDir(N.dirname(ne)),await _.copy(A,ne,{overwrite:!0}),l.stop(V.green(` \u2713 ${b} (sobrescrito)`)))}if($e.length>0){let b={module:o,fromVersion:c,toVersion:p,timestamp:new Date().toISOString(),conflicts:$e};await _.ensureDir(N.join(r,".kaven")),await _.writeJson(N.join(r,".kaven","conflicts.json"),b,{spaces:2}),B.outro(V.red(`Update parcial \u2014 ${$e.length} conflito(s) detectado(s):
|
|
28
28
|
`+$e.map(A=>` \u2022 ${A}`).join(`
|
|
29
29
|
`)+`
|
|
@@ -73,7 +73,7 @@ Nenhum evento de telemetria encontrado localmente.
|
|
|
73
73
|
\u{1F4CA} \xDAltimos ${t.length} eventos de telemetria:
|
|
74
74
|
`)),t.forEach(n=>{let a=ge.gray(`[${new Date(n.timestamp).toLocaleTimeString()}]`),r=n.event.includes("error")?ge.red("\u2716"):ge.green("\u2714"),i=n.duration?ge.yellow(` (${n.duration}ms)`):"";console.log(`${a} ${r} ${ge.cyan(n.event)}${i}`),n.metadata&&Object.keys(n.metadata).length>0&&console.log(ge.gray(` > ${JSON.stringify(n.metadata)}`))}),console.log(ge.gray(`
|
|
75
75
|
Log local: ~/.kaven/telemetry.log
|
|
76
|
-
`))}import{Command as za}from"commander";import{Command as Ja}from"commander";import ue from"chalk";import to from"fs/promises";import Qo from"path";import en from"os";var Zo=Qo.join(en.homedir(),".kaven","cache","licenses.json"),qa=3600*1e3,It=class{cacheDir=Qo.join(en.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 to.readFile(Zo,"utf-8");return JSON.parse(e)}catch{return{}}}async writeCache(e){await to.mkdir(this.cacheDir,{recursive:!0}),await to.writeFile(Zo,JSON.stringify(e,null,2),"utf-8")}isCacheValid(e){return Date.now()-e.validatedAt<qa}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:a}=await import("./MarketplaceClient-
|
|
76
|
+
`))}import{Command as za}from"commander";import{Command as Ja}from"commander";import ue from"chalk";import to from"fs/promises";import Qo from"path";import en from"os";var Zo=Qo.join(en.homedir(),".kaven","cache","licenses.json"),qa=3600*1e3,It=class{cacheDir=Qo.join(en.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 to.readFile(Zo,"utf-8");return JSON.parse(e)}catch{return{}}}async writeCache(e){await to.mkdir(this.cacheDir,{recursive:!0}),await to.writeFile(Zo,JSON.stringify(e,null,2),"utf-8")}isCacheValid(e){return Date.now()-e.validatedAt<qa}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:a}=await import("./MarketplaceClient-XMLIXDWN.js"),i=await new a().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-XMLIXDWN.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 tn(){return new Ja("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 It,t=o??process.env.KAVEN_LICENSE_KEY;t||(console.error(ue.red("\u2717 No license key provided. Pass as argument or set KAVEN_LICENSE_KEY.")),process.exit(1));try{console.log(ue.dim("Checking license status..."));let n=await e.getLicenseStatus(t);if(console.log(`
|
|
77
77
|
`+ue.bold("License Status")+`
|
|
78
78
|
`),console.log(` Key: ${ue.dim(n.key.substring(0,16)+"...")}`),console.log(` Tier: ${ue.magenta(n.tier)}`),n.expiresAt){let a=n.daysUntilExpiry,r=a!==null&&a<30?ue.red:ue.green;console.log(` Expires: ${r(n.expiresAt)}${a!==null?ue.dim(` (${a} days)`):""}`)}else console.log(` Expires: ${ue.green("Never")}`);console.log()}catch(n){let a=n instanceof Error?n.message:"Failed to check license status";console.error(ue.red("\u2717 "+a)),process.exit(1)}})}function on(){let o=new za("license").description("Manage Kaven licenses");return o.addCommand(tn()),o}import we from"path";import ye from"fs-extra";import{fileURLToPath as mn}from"url";import{intro as nr,outro as ar,text as jt,select as un,confirm as pn,spinner as rr,note as ir,isCancel as sr,cancel as ro}from"@clack/prompts";import Y from"picocolors";import x from"fs-extra";import ce from"path";import{spawn as Ga}from"child_process";var Ha="https://github.com/kaven-co/kaven-template.git",Wa="https://github.com/bychrisr/kaven-squad";function Te(o,e,t,n={}){let a=typeof n=="function"?{onData:n}:n,{onData:r,timeoutMs:i,env:s}=a;return new Promise((c,l)=>{let d=Ga(o,e,{cwd:t,stdio:r?"pipe":"inherit",env:{...process.env,...s}}),u;i&&(u=setTimeout(()=>{d.kill("SIGKILL"),c(1)},i)),r&&d.stdout&&d.stdout.on("data",m=>r(m.toString())),r&&d.stderr&&d.stderr.on("data",m=>r(m.toString())),d.on("error",m=>{clearTimeout(u),l(m)}),d.on("close",m=>{clearTimeout(u),c(m??0)})})}var Be=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||Ha;if(console.log(`[INIT] Clone Source: ${n}`),console.log(`[INIT] Target Dir: ${e}`),await x.pathExists(n)&&(n.startsWith("/")||n.startsWith("./")||n.startsWith("../"))){console.log("[INIT] Local Path Detected. Copying..."),await x.copy(n,e,{filter:i=>!i.includes("node_modules")&&!i.includes(".git")&&!i.includes(".turbo")}),console.log("[INIT] Local Copy Done.");return}let a=null;if(await x.pathExists(e)){let i=await x.readdir(e);i.length===1&&i[0]===".kaven"&&(a=`${e}__kaven_state_tmp`,await x.move(ce.join(e,".kaven"),a),await x.remove(e))}let r=await Te("git",["clone","--depth","1",n,e],process.cwd());if(a&&await x.pathExists(a)&&(await x.ensureDir(e),await x.move(a,ce.join(e,".kaven"),{overwrite:!0})),r!==0)throw new Error(`git clone failed with exit code ${r}`)}async removeGitDir(e){let t=ce.join(e,".git");await x.pathExists(t)&&await x.remove(t)}async replacePlaceholders(e,t){let n={"{{PROJECT_NAME}}":t.projectName,"{{DATABASE_URL}}":t.dbUrl,"{{DEFAULT_LOCALE}}":t.locale,"{{DEFAULT_CURRENCY}}":t.currency},a=["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 a){let s=ce.join(e,i);if(!await x.pathExists(s))continue;let c=await x.readFile(s,"utf-8");for(let[l,d]of Object.entries(n))c=c.split(l).join(d);await x.writeFile(s,c,"utf-8")}let r=ce.join(e,"package.json");if(await x.pathExists(r)){let i=await x.readJson(r);i.name!==t.projectName&&(i.name=t.projectName,await x.writeJson(r,i,{spaces:2}))}}async runInstall(e){let t=await Te("pnpm",["install"],e);if(t!==0)throw new Error(`pnpm install failed with exit code ${t}`)}async initGit(e){await Te("git",["init"],e),await Te("git",["add","."],e),await Te("git",["commit","-m","chore: initial kaven setup"],e)}async installSquad(e){let t=ce.join(e,"squads"),n=ce.join(t,"kaven-squad");if(await x.pathExists(n))return{installed:!1,reason:"already-exists"};await x.ensureDir(t);let a=await Te("git",["clone","--depth","1",Wa,n],process.cwd(),{env:{GIT_TERMINAL_PROMPT:"0"},timeoutMs:3e4});if(a!==0)return await x.pathExists(n)&&await x.remove(n),{installed:!1,reason:`git clone exited with code ${a}`};let r=ce.join(n,".git");return await x.pathExists(r)&&await x.remove(r),{installed:!0}}async installAIOXCore(e){if(parseInt(process.version.slice(1).split(".")[0],10)<18)return{installed:!1,reason:`Node >= 18 required (current: ${process.version})`};let n=ce.join(e,"squads","kaven-squad");if(!await x.pathExists(n))return{installed:!1,reason:"kaven-squad not found \u2014 run squad install first"};if((await x.readdir(n)).length===0)return{installed:!1,reason:"kaven-squad directory is empty \u2014 squad install may have failed"};let r=ce.join(e,".aiox-core");if(await x.pathExists(r))return{installed:!0,reason:"already-installed"};let i=await Te("npx",["aiox-core@latest","install","--quiet"],e,{timeoutMs:12e4});return i!==0?{installed:!1,reason:`npx aiox-core exited with code ${i}`}:{installed:!0}}async healthCheck(e){let t=[],n=["package.json",".env.example","packages/database/prisma/schema.prisma"];for(let r of n)await x.pathExists(ce.join(e,r))||t.push(`Missing required file: ${r}`);return await x.pathExists(ce.join(e,"node_modules"))||t.push("Dependencies not installed. Run: pnpm install"),{healthy:t.length===0,issues:t}}};import Re from"path";import he from"fs-extra";import Xa from"os";import nn from"js-yaml";import{z as T}from"zod";var At=Re.join(Xa.homedir(),".kaven"),oo=Re.join(At,"config.json"),an="kaven-config.yaml",rn=T.object({registry:T.string().url().default("https://marketplace.kaven.site"),telemetry:T.boolean().default(!0),theme:T.enum(["light","dark"]).default("dark"),language:T.enum(["en","pt-BR"]).default("en"),customRegistry:T.string().url().optional(),projectId:T.string().uuid().optional(),activeModules:T.array(T.string()).default([]),capabilities:T.record(T.string(),T.union([T.string(),T.boolean(),T.number()])).default({}),lastLogin:T.string().datetime().optional(),projectDefaults:T.object({dbUrl:T.string().optional(),emailProvider:T.enum(["postmark","resend","ses","smtp"]).optional(),locale:T.string().optional(),currency:T.string().optional()}).optional()}),no=class{globalConfig={};projectConfig={};currentConfig;constructor(){this.currentConfig=rn.parse({})}async initialize(){if(await he.ensureDir(At),await he.pathExists(oo))try{this.globalConfig=await he.readJson(oo)}catch{this.globalConfig={}}let e=this.findProjectRoot();if(e){let t=Re.join(e,an);if(await he.pathExists(t))try{let n=await he.readFile(t,"utf-8");this.projectConfig=nn.load(n)}catch{this.projectConfig={}}}this.resolve()}resolve(){this.currentConfig=rn.parse({...this.globalConfig,...this.projectConfig})}findProjectRoot(){let e=process.cwd();for(;e!==Re.parse(e).root;){if(he.existsSync(Re.join(e,"package.json")))return e;e=Re.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 he.ensureDir(At),await he.writeJson(oo,this.globalConfig,{spaces:2})}async persistProject(){let e=this.findProjectRoot();if(!e)return;let t=Re.join(e,an),n=nn.dump(this.projectConfig,{lineWidth:120,noRefs:!0});await he.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 At}},q=new no;import Ee from"picocolors";var Ya=`
|
|
79
79
|
\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
|
|
@@ -87,7 +87,7 @@ ${Ya.split(`
|
|
|
87
87
|
`).map(t=>Ee.cyan(t)).join(`
|
|
88
88
|
`)}
|
|
89
89
|
${Ee.dim(" The Premium Framework Orchestrator for SaaS")}
|
|
90
|
-
`}var Bl={primary:Ee.cyan,secondary:Ee.magenta,success:Ee.green,warning:Ee.yellow,error:Ee.red,dim:Ee.dim};import*as Za from"child_process";import ao from"fs-extra";import*as Mt from"path";import er from"ora";import cn from"chalk";var Qa={...Za},tr={ora:er};async function dt(o,e={}){if(e.skipAiox)return;let t=Mt.join(o,".aiox-core");if(!ao.existsSync(t)&&!ao.existsSync(Mt.join(o,".aiox")))return;let n=tr.ora("Bootstrapping AIOX environment...").start();try{let a=ao.existsSync(Mt.join(o,".aiox-core/bin/aiox.js"))?".aiox-core/bin/aiox.js":".aiox/bin/aiox.js";Qa.execSync(`node ${a} devops environment-bootstrap --quiet`,{cwd:o,stdio:"pipe",timeout:6e4}),n.succeed("AIOX environment bootstrapped")}catch(a){n.warn("AIOX environment bootstrap failed"),console.log(cn.yellow(" \u26A0 Run manually inside the project: kaven aiox bootstrap")),process.env.KAVEN_DEBUG&&console.error(cn.gray(` Error: ${a.message}`))}}import qe from"fs-extra";import ln from"path";var or=".kaven/init-state.json",dn=["clone","configure","install","git","squad","aiox-core","env-bootstrap"],ut=class o{constructor(e){this.projectDir=e;this.statePath=ln.join(e,or)}statePath;state=null;static async findIncomplete(e){let t=new o(e);return!await qe.pathExists(t.statePath)||(await t.load(),t.isComplete())?null:t}async load(){return this.state=await qe.readJson(this.statePath),this.state}async create(e,t,n){let a={clone:"pending",configure:"pending",install:"pending",git:"pending",squad:"pending","aiox-core":"pending","env-bootstrap":"pending"};n.skipInstall&&(a.install="skipped"),n.skipGit&&(a.git="skipped"),n.withSquad||(a.squad="skipped",a["aiox-core"]="skipped"),n.skipAiox&&(a["env-bootstrap"]="skipped"),this.state={version:"1",projectName:e,answers:t,options:n,steps:a,startedAt:new Date().toISOString(),updatedAt:new Date().toISOString()},await qe.ensureDir(ln.dirname(this.statePath)),await this.persist()}async markStep(e,t){if(!this.state)throw new Error("State not initialized");this.state.steps[e]=t,this.state.updatedAt=new Date().toISOString(),await this.persist()}getState(){if(!this.state)throw new Error("State not loaded");return this.state}getResumePoint(){return this.state?dn.find(e=>this.state.steps[e]==="pending"||this.state.steps[e]==="failed")??null:null}isComplete(){return this.state?dn.every(e=>this.state.steps[e]==="done"||this.state.steps[e]==="skipped"):!1}async cleanup(){await qe.pathExists(this.statePath)&&await qe.remove(this.statePath)}async persist(){await qe.writeJson(this.statePath,this.state,{spaces:2})}};function Se(o){sr(o)&&(ro("Operation cancelled."),process.exit(0))}async function X(o,e,t,n,a={}){let r=rr();r.start(t);try{return await n(),await o.markStep(e,"done"),r.stop(Y.green(`${t} \u2713`)),!0}catch(i){await o.markStep(e,"failed");let s=i instanceof Error?i.message:String(i);return r.stop(Y.red(`${t} \u2717`)),a.fatal&&(ro(s),process.exit(1)),console.log(Y.dim(` Error: ${s}`)),!1}}async function fn(o,e){let t=await de.getInstance(),n=new Be,a=await un({message:"\u{1F310} Select Language / Selecione o Idioma:",options:[{label:"English",value:"en"},{label:"Portugu\xEAs (Brasil)",value:"pt-BR"}],initialValue:"en"});Se(a),await t.setLanguage(a),await q.initialize(),await q.set("language",a,"global"),console.log(sn()),nr(Y.cyan(t.t("init.intro")));let r=o;r||(e.defaults?r="my-kaven-app":(r=await jt({message:t.t("init.projectName"),placeholder:"my-kaven-app",validate:d=>{let u=n.validateName(d||"");return u.valid?void 0:u.reason}}),Se(r)));let i=we.resolve(process.cwd(),r),s=await ut.findIncomplete(i);if(s&&!e.force){let d=s.getResumePoint(),u=e.resume?!0:await pn({message:Y.yellow(`\u26A0 Incomplete init detected (stopped at: ${Y.bold(d??"unknown")}). Resume from here?`),initialValue:!0});if(e.resume||Se(u),u){await lr(i,s,n);return}e.force=!0}else await ye.pathExists(i)&&!e.force&&(ro(Y.red(`Error: Directory "${r}" already exists. Use --force to overwrite.`)),process.exit(1));let c;if(e.defaults){let d=q.getAll().projectDefaults||{};c={dbUrl:e.dbUrl||d.dbUrl||`postgresql://user:password@localhost:5432/${r}`,emailProvider:e.emailProvider||d.emailProvider||"postmark",locale:e.locale||d.locale||"en-US",currency:e.currency||d.currency||"USD"}}else{let d=q.getAll().projectDefaults||{},u=await jt({message:"Database URL (PostgreSQL):",initialValue:d.dbUrl||`postgresql://user:password@localhost:5432/${r}`});Se(u);let m=await un({message:"Email provider:",options:[{label:"Postmark",value:"postmark"},{label:"Resend",value:"resend"},{label:"AWS SES",value:"ses"},{label:"SMTP",value:"smtp"}],initialValue:d.emailProvider||"postmark"});Se(m);let p=await jt({message:"Default locale:",initialValue:d.locale||"en-US"});Se(p);let f=await jt({message:"Default currency:",initialValue:d.currency||"USD"});Se(f);let y=await pn({message:t.t("init.withSquad"),initialValue:!0});Se(y),e.withSquad=y,c={dbUrl:u,emailProvider:m,locale:p,currency:f}}let l=new ut(i);await l.create(r,{...c,projectName:r},{withSquad:e.withSquad,skipInstall:e.skipInstall,skipGit:e.skipGit,skipAiox:e.skipAiox,template:e.template}),await cr(i,r,c,l,n,e)}async function cr(o,e,t,n,a,r){let i=mn(import.meta.url),s=we.dirname(i);await X(n,"clone","Cloning kaven-template...",async()=>{await a.cloneTemplate(o,r.template)},{fatal:!0}),await X(n,"configure","Configuring project...",async()=>{await a.removeGitDir(o),await a.replacePlaceholders(o,{...t,projectName:e});let c=we.join(o,".claude","CLAUDE.md");await ye.ensureDir(we.dirname(c));let l=we.resolve(s,"../../core/templates/CLAUDE.md.hbs");if(await ye.pathExists(l)){let d=await ye.readFile(l,"utf-8");await ye.writeFile(c,d.replace("${new Date().toLocaleDateString()}",new Date().toLocaleDateString()),"utf-8")}},{fatal:!0}),r.skipInstall?await n.markStep("install","skipped"):await X(n,"install",dr(),async()=>{await a.runInstall(o)}),r.skipGit?await n.markStep("git","skipped"):await X(n,"git","Initializing git...",async()=>{await a.initGit(o)}),r.withSquad?await X(n,"squad","Installing kaven-squad...",async()=>{let l=await a.installSquad(o);if(!l.installed)throw new Error(l.reason??"squad install failed")})?await X(n,"aiox-core","Installing AIOX Core...",async()=>{let l=await a.installAIOXCore(o);if(!l.installed)throw new Error(l.reason??"aiox-core install failed")}):(await n.markStep("aiox-core","skipped"),console.log(Y.dim(` To retry: cd ${e} && kaven init --resume`))):(await n.markStep("squad","skipped"),await n.markStep("aiox-core","skipped")),r.skipAiox?await n.markStep("env-bootstrap","skipped"):await X(n,"env-bootstrap","Bootstrapping AIOX environment...",async()=>{await dt(o,{skipAiox:!1})}),await gn(e,n)}async function lr(o,e,t){let n=e.getState(),{answers:a,options:r,projectName:i}=n;console.log(Y.cyan(`
|
|
90
|
+
`}var Bl={primary:Ee.cyan,secondary:Ee.magenta,success:Ee.green,warning:Ee.yellow,error:Ee.red,dim:Ee.dim};import*as Za from"child_process";import ao from"fs-extra";import*as Mt from"path";import er from"ora";import cn from"chalk";var Qa={...Za},tr={ora:er};async function dt(o,e={}){if(e.skipAiox)return;let t=Mt.join(o,".aiox-core");if(!ao.existsSync(t)&&!ao.existsSync(Mt.join(o,".aiox")))return;let n=tr.ora("Bootstrapping AIOX environment...").start();try{let a=ao.existsSync(Mt.join(o,".aiox-core/bin/aiox.js"))?".aiox-core/bin/aiox.js":".aiox/bin/aiox.js";Qa.execSync(`node ${a} devops environment-bootstrap --quiet`,{cwd:o,stdio:"pipe",timeout:6e4}),n.succeed("AIOX environment bootstrapped")}catch(a){n.warn("AIOX environment bootstrap failed"),console.log(cn.yellow(" \u26A0 Run manually inside the project: kaven aiox bootstrap")),process.env.KAVEN_DEBUG&&console.error(cn.gray(` Error: ${a.message}`))}}import qe from"fs-extra";import ln from"path";var or=".kaven/init-state.json",dn=["clone","configure","install","git","squad","aiox-core","env-bootstrap"],ut=class o{constructor(e){this.projectDir=e;this.statePath=ln.join(e,or)}projectDir;statePath;state=null;static async findIncomplete(e){let t=new o(e);return!await qe.pathExists(t.statePath)||(await t.load(),t.isComplete())?null:t}async load(){return this.state=await qe.readJson(this.statePath),this.state}async create(e,t,n){let a={clone:"pending",configure:"pending",install:"pending",git:"pending",squad:"pending","aiox-core":"pending","env-bootstrap":"pending"};n.skipInstall&&(a.install="skipped"),n.skipGit&&(a.git="skipped"),n.withSquad||(a.squad="skipped",a["aiox-core"]="skipped"),n.skipAiox&&(a["env-bootstrap"]="skipped"),this.state={version:"1",projectName:e,answers:t,options:n,steps:a,startedAt:new Date().toISOString(),updatedAt:new Date().toISOString()},await qe.ensureDir(ln.dirname(this.statePath)),await this.persist()}async markStep(e,t){if(!this.state)throw new Error("State not initialized");this.state.steps[e]=t,this.state.updatedAt=new Date().toISOString(),await this.persist()}getState(){if(!this.state)throw new Error("State not loaded");return this.state}getResumePoint(){return this.state?dn.find(e=>this.state.steps[e]==="pending"||this.state.steps[e]==="failed")??null:null}isComplete(){return this.state?dn.every(e=>this.state.steps[e]==="done"||this.state.steps[e]==="skipped"):!1}async cleanup(){await qe.pathExists(this.statePath)&&await qe.remove(this.statePath)}async persist(){await qe.writeJson(this.statePath,this.state,{spaces:2})}};function Se(o){sr(o)&&(ro("Operation cancelled."),process.exit(0))}async function X(o,e,t,n,a={}){let r=rr();r.start(t);try{return await n(),await o.markStep(e,"done"),r.stop(Y.green(`${t} \u2713`)),!0}catch(i){await o.markStep(e,"failed");let s=i instanceof Error?i.message:String(i);return r.stop(Y.red(`${t} \u2717`)),a.fatal&&(ro(s),process.exit(1)),console.log(Y.dim(` Error: ${s}`)),!1}}async function fn(o,e){let t=await de.getInstance(),n=new Be,a=await un({message:"\u{1F310} Select Language / Selecione o Idioma:",options:[{label:"English",value:"en"},{label:"Portugu\xEAs (Brasil)",value:"pt-BR"}],initialValue:"en"});Se(a),await t.setLanguage(a),await q.initialize(),await q.set("language",a,"global"),console.log(sn()),nr(Y.cyan(t.t("init.intro")));let r=o;r||(e.defaults?r="my-kaven-app":(r=await jt({message:t.t("init.projectName"),placeholder:"my-kaven-app",validate:d=>{let u=n.validateName(d||"");return u.valid?void 0:u.reason}}),Se(r)));let i=we.resolve(process.cwd(),r),s=await ut.findIncomplete(i);if(s&&!e.force){let d=s.getResumePoint(),u=e.resume?!0:await pn({message:Y.yellow(`\u26A0 Incomplete init detected (stopped at: ${Y.bold(d??"unknown")}). Resume from here?`),initialValue:!0});if(e.resume||Se(u),u){await lr(i,s,n);return}e.force=!0}else await ye.pathExists(i)&&!e.force&&(ro(Y.red(`Error: Directory "${r}" already exists. Use --force to overwrite.`)),process.exit(1));let c;if(e.defaults){let d=q.getAll().projectDefaults||{};c={dbUrl:e.dbUrl||d.dbUrl||`postgresql://user:password@localhost:5432/${r}`,emailProvider:e.emailProvider||d.emailProvider||"postmark",locale:e.locale||d.locale||"en-US",currency:e.currency||d.currency||"USD"}}else{let d=q.getAll().projectDefaults||{},u=await jt({message:"Database URL (PostgreSQL):",initialValue:d.dbUrl||`postgresql://user:password@localhost:5432/${r}`});Se(u);let m=await un({message:"Email provider:",options:[{label:"Postmark",value:"postmark"},{label:"Resend",value:"resend"},{label:"AWS SES",value:"ses"},{label:"SMTP",value:"smtp"}],initialValue:d.emailProvider||"postmark"});Se(m);let p=await jt({message:"Default locale:",initialValue:d.locale||"en-US"});Se(p);let f=await jt({message:"Default currency:",initialValue:d.currency||"USD"});Se(f);let y=await pn({message:t.t("init.withSquad"),initialValue:!0});Se(y),e.withSquad=y,c={dbUrl:u,emailProvider:m,locale:p,currency:f}}let l=new ut(i);await l.create(r,{...c,projectName:r},{withSquad:e.withSquad,skipInstall:e.skipInstall,skipGit:e.skipGit,skipAiox:e.skipAiox,template:e.template}),await cr(i,r,c,l,n,e)}async function cr(o,e,t,n,a,r){let i=mn(import.meta.url),s=we.dirname(i);await X(n,"clone","Cloning kaven-template...",async()=>{await a.cloneTemplate(o,r.template)},{fatal:!0}),await X(n,"configure","Configuring project...",async()=>{await a.removeGitDir(o),await a.replacePlaceholders(o,{...t,projectName:e});let c=we.join(o,".claude","CLAUDE.md");await ye.ensureDir(we.dirname(c));let l=we.resolve(s,"../../core/templates/CLAUDE.md.hbs");if(await ye.pathExists(l)){let d=await ye.readFile(l,"utf-8");await ye.writeFile(c,d.replace("${new Date().toLocaleDateString()}",new Date().toLocaleDateString()),"utf-8")}},{fatal:!0}),r.skipInstall?await n.markStep("install","skipped"):await X(n,"install",dr(),async()=>{await a.runInstall(o)}),r.skipGit?await n.markStep("git","skipped"):await X(n,"git","Initializing git...",async()=>{await a.initGit(o)}),r.withSquad?await X(n,"squad","Installing kaven-squad...",async()=>{let l=await a.installSquad(o);if(!l.installed)throw new Error(l.reason??"squad install failed")})?await X(n,"aiox-core","Installing AIOX Core...",async()=>{let l=await a.installAIOXCore(o);if(!l.installed)throw new Error(l.reason??"aiox-core install failed")}):(await n.markStep("aiox-core","skipped"),console.log(Y.dim(` To retry: cd ${e} && kaven init --resume`))):(await n.markStep("squad","skipped"),await n.markStep("aiox-core","skipped")),r.skipAiox?await n.markStep("env-bootstrap","skipped"):await X(n,"env-bootstrap","Bootstrapping AIOX environment...",async()=>{await dt(o,{skipAiox:!1})}),await gn(e,n)}async function lr(o,e,t){let n=e.getState(),{answers:a,options:r,projectName:i}=n;console.log(Y.cyan(`
|
|
91
91
|
Resuming init for ${Y.bold(i)}...
|
|
92
92
|
`));let s=mn(import.meta.url),c=we.dirname(s),l=d=>{let u=n.steps[d];return u==="pending"||u==="failed"};l("clone")&&await X(e,"clone","Cloning kaven-template...",async()=>{await t.cloneTemplate(o,r.template)},{fatal:!0}),l("configure")&&await X(e,"configure","Configuring project...",async()=>{await t.removeGitDir(o),await t.replacePlaceholders(o,a);let d=we.join(o,".claude","CLAUDE.md");await ye.ensureDir(we.dirname(d));let u=we.resolve(c,"../../core/templates/CLAUDE.md.hbs");if(await ye.pathExists(u)){let m=await ye.readFile(u,"utf-8");await ye.writeFile(d,m.replace("${new Date().toLocaleDateString()}",new Date().toLocaleDateString()),"utf-8")}},{fatal:!0}),l("install")&&await X(e,"install","Installing dependencies...",async()=>{await t.runInstall(o)}),l("git")&&await X(e,"git","Initializing git...",async()=>{await t.initGit(o)}),l("squad")?await X(e,"squad","Installing kaven-squad...",async()=>{let u=await t.installSquad(o);if(!u.installed)throw new Error(u.reason??"squad install failed")})&&l("aiox-core")&&await X(e,"aiox-core","Installing AIOX Core...",async()=>{let u=await t.installAIOXCore(o);if(!u.installed)throw new Error(u.reason??"aiox-core install failed")}):l("aiox-core")&&await X(e,"aiox-core","Installing AIOX Core...",async()=>{let d=await t.installAIOXCore(o);if(!d.installed)throw new Error(d.reason??"aiox-core install failed")}),l("env-bootstrap")&&await X(e,"env-bootstrap","Bootstrapping AIOX environment...",async()=>{await dt(o,{skipAiox:!1})}),await gn(i,e)}function dr(){return"Installing dependencies..."}async function gn(o,e){if(e.isComplete())await e.cleanup();else{let t=e.getResumePoint();console.log(Y.yellow(`
|
|
93
93
|
\u26A0 Setup incomplete (stopped at: ${Y.bold(t??"unknown")})`)),console.log(Y.dim(` Resume with: kaven init ${o} --resume
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kaven-cli",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Kaven CLI - The official command line tool for Kaven",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -75,27 +75,30 @@
|
|
|
75
75
|
"fs-extra": "^11.3.3",
|
|
76
76
|
"glob": "^13.0.0",
|
|
77
77
|
"i18next": "^26.0.6",
|
|
78
|
-
"js-yaml": "^4.
|
|
78
|
+
"js-yaml": "^4.2.0",
|
|
79
79
|
"open": "^10.1.0",
|
|
80
80
|
"ora": "^9.1.0",
|
|
81
81
|
"picocolors": "^1.1.1",
|
|
82
|
-
"tar": "^7.5.
|
|
82
|
+
"tar": "^7.5.16",
|
|
83
83
|
"zod": "^4.3.6"
|
|
84
84
|
},
|
|
85
85
|
"pnpm": {
|
|
86
86
|
"overrides": {
|
|
87
87
|
"minimatch@<10.2.3": ">=10.2.3",
|
|
88
88
|
"@isaacs/brace-expansion@<=5.0.0": ">=5.0.1",
|
|
89
|
+
"brace-expansion@>=5.0.0 <5.0.6": ">=5.0.6",
|
|
89
90
|
"esbuild@<=0.24.2": ">=0.25.0",
|
|
91
|
+
"esbuild@>=0.27.0 <0.28.1": ">=0.28.1",
|
|
90
92
|
"handlebars@<=4.7.8": ">=4.7.9",
|
|
91
|
-
"tar@<=7.5.
|
|
93
|
+
"tar@<=7.5.15": ">=7.5.16",
|
|
92
94
|
"lodash@<=4.17.23": ">=4.18.0",
|
|
93
95
|
"lodash-es@<=4.17.23": ">=4.18.0",
|
|
94
96
|
"rollup@<4.59.0": ">=4.59.0",
|
|
95
97
|
"vite@<=6.4.1": ">=6.4.2",
|
|
96
98
|
"flatted@<=3.4.1": ">=3.4.2",
|
|
97
99
|
"picomatch@<2.3.2": ">=2.3.2",
|
|
98
|
-
"picomatch@>=4.0.0 <4.0.4": ">=4.0.4"
|
|
100
|
+
"picomatch@>=4.0.0 <4.0.4": ">=4.0.4",
|
|
101
|
+
"undici": ">=7.28.0"
|
|
99
102
|
}
|
|
100
103
|
}
|
|
101
104
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as a}from"./chunk-JHLQ46NG.js";export{a as MarketplaceClient};
|
package/dist/chunk-JHLQ46NG.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import v from"fs-extra";import q from"path";import x from"os";var c=class extends Error{constructor(e){super(e),this.name="MarketplaceError"}},T=class extends c{constructor(e){super(e),this.name="AuthenticationError"}},E=class extends c{constructor(t,s){super(s);this.requiredTier=t;this.name="LicenseRequiredError"}},p=class extends c{constructor(e){super(e),this.name="NotFoundError"}},R=class extends c{constructor(t){super(`Rate limited. Try again in ${t}s`);this.retryAfter=t;this.name="RateLimitError"}},m=class extends c{constructor(e){super(e),this.name="ServerError"}},y=class extends c{constructor(e){super(e),this.name="NetworkError"}},A=class extends c{constructor(e){super(e),this.name="SignatureVerificationError"}};function S(r){if(r instanceof Error)return r;if(typeof r=="string")return new Error(r);try{return new Error(JSON.stringify(r))}catch{return new Error(String(r))}}var O="https://marketplace.kaven.site",_=3e4,P=3,C=1e3;function b(r){process.env.KAVEN_DEBUG==="1"&&console.debug(`[kaven:debug] ${r}`)}async function D(){try{let r=q.join(x.homedir(),".kaven","config.json");if(await v.pathExists(r)){let e=await v.readJson(r);if(typeof e.apiUrl=="string"&&e.apiUrl)return e.apiUrl}}catch{}return null}async function I(){if(process.env.KAVEN_SERVICE_TOKEN)return process.env.KAVEN_SERVICE_TOKEN;try{let r=q.join(x.homedir(),".kaven","config.json");if(await v.pathExists(r)){let e=await v.readJson(r);if(typeof e.serviceToken=="string"&&e.serviceToken)return e.serviceToken}}catch{}return null}async function j(){if(process.env.KAVEN_API_URL)return process.env.KAVEN_API_URL.replace(/\/$/,"");let r=await D();return r?r.replace(/\/$/,""):O}function K(r){return new Promise(e=>setTimeout(e,r))}function G(r){return r>=500}var $=class{baseURLPromise;authService;constructor(e){this.authService=e??null,this.baseURLPromise=j()}async resolveUrl(e){return`${await this.baseURLPromise}${e}`}async request(e,t,s={}){let k=`${await this.baseURLPromise}${t}`,{body:d,authenticated:U=!1}=s,g=null;for(let u=0;u<=P;u++){if(u>0){let l=C*Math.pow(2,u-1);b(`Retry attempt ${u} for ${e} ${t} (delay ${l}ms)`),await K(l)}try{let l={"Content-Type":"application/json",Accept:"application/json"};if(U&&this.authService){let h=await this.authService.getValidToken();l.Authorization=`Bearer ${h}`}let n=await I();n&&(l["X-Service-Token"]=n),b(`${e} ${k}`);let w=new AbortController,M=setTimeout(()=>w.abort(),_),o;try{o=await fetch(k,{method:e,headers:l,body:d!==void 0?JSON.stringify(d):void 0,signal:w.signal})}finally{clearTimeout(M)}if(b(`Response: ${o.status} ${o.statusText}`),!o.ok){let h=await o.text().catch(()=>""),f=h;try{let a=JSON.parse(h);f=a.message||a.error||h}catch{}switch(o.status){case 401:throw new T(f||"Authentication required");case 403:{let a="pro";try{a=JSON.parse(h).requiredTier||a}catch{}throw new E(a,f||"License required")}case 404:throw new p(f||"Resource not found");case 429:{let a=parseInt(o.headers.get("retry-after")??"60",10);throw new R(isNaN(a)?60:a)}default:if(G(o.status)){g=new m(f||`Server error: ${o.status}`);continue}throw new m(f||`Server error: ${o.status}`)}}return(o.headers.get("content-type")??"").includes("application/json")?await o.json():{}}catch(l){let n=S(l);if(n instanceof T||n instanceof E||n instanceof p||n instanceof R)throw n;if(n instanceof TypeError||n.name==="AbortError"){let w=new y(n.name==="AbortError"?"Request timed out after 30s":`Network error: ${n.message}`);if(g=w,u<P)continue;throw w}if(n instanceof m){if(g=n,u<P)continue;throw n}throw n}}throw g??new y("Request failed after retries")}async requestDeviceCode(){return this.request("POST","/auth/device-code",{body:{client_id:"kaven-cli"},authenticated:!1})}async pollDeviceToken(e){try{let s=`${await this.baseURLPromise}/auth/token`,i=new AbortController,k=setTimeout(()=>i.abort(),_),d;try{d=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"}),signal:i.signal})}finally{clearTimeout(k)}if(d.ok)return{status:"success",tokens:await d.json()};let g=(await d.json().catch(()=>({}))).error??"unknown_error";switch(g){case"authorization_pending":return{status:"authorization_pending"};case"slow_down":return{status:"slow_down"};case"access_denied":return{status:"access_denied"};case"expired_token":return{status:"expired_token"};default:throw new Error(`Unexpected error: ${g}`)}}catch(t){let s=S(t),i=s;throw i.code==="ECONNREFUSED"||i.code==="ENOTFOUND"?new y("Network error. Check your connection and try again."):s}}async refreshToken(e){return this.request("POST","/auth/refresh",{body:{refresh_token:e},authenticated:!1})}async listModules(e){let t=new URLSearchParams;e?.category&&t.set("category",e.category),e?.tier&&t.set("tier",e.tier),e?.q&&t.set("q",e.q),e?.page&&t.set("page",String(e.page)),e?.pageSize&&t.set("pageSize",String(e.pageSize));let s=t.toString(),i=`/modules${s?`?${s}`:""}`;return this.request("GET",i)}async getModule(e){return this.request("GET",`/modules/${e}`)}async getManifest(e,t){return this.request("GET",`/modules/${e}/versions/${t}/manifest`)}async createDownloadToken(e,t){return this.request("POST","/download-tokens",{body:{moduleSlug:e,version:t},authenticated:!0})}async validateLicense(e,t){return await this.request("POST","/licenses/validate",{body:{licenseKey:e,requiredTier:t}})}async getLicenseStatus(e){return this.request("GET",`/licenses/status?key=${encodeURIComponent(e)}`)}async getModuleManifest(e){try{return await this.getManifest(e,"latest")}catch(t){if(t instanceof p)return null;throw t}}async getReleaseInfo(e,t){return this.request("GET",`/modules/${e}/versions/${t}`)}async getUploadUrl(e,t,s){return this.request("POST","/releases/upload-url",{body:{moduleSlug:e,version:t,size:s},authenticated:!0})}async createRelease(e){return this.request("POST","/releases",{body:e,authenticated:!0})}async createCheckoutSession(e,t){return this.request("POST","/checkout/session",{body:{tier:e,licenseKey:t},authenticated:!0})}async getCheckoutStatus(e){return this.request("GET",`/checkout/session/${e}/status`,{authenticated:!0})}async getCategories(){try{let e=await this.request("GET","/categories",{authenticated:!1});return Array.isArray(e)?e:e.categories??[]}catch(e){if(e instanceof p){let s=(await this.request("GET","/search?q=",{authenticated:!1})).facets?.categories?.map(i=>i.category).filter(Boolean)??[];return[...new Set(s)].sort()}throw e}}};export{T as a,E as b,p as c,y as d,A as e,S as f,$ as g};
|