kaven-cli 0.11.3 → 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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +1 -1
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-XY5BXJEH.js";import{Command as Br}from"commander";var ko={name:"kaven-cli",version:"0.11.3",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(/[\^~>=<]/,"").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(`
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}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kaven-cli",
3
- "version": "0.11.3",
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",