@dashnex/cli 0.5.36 → 0.5.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -32,6 +32,7 @@ dashnex <command> [options]
32
32
  | `app status` | Show current application status |
33
33
  | `install` | Install dependencies using pnpm or npm |
34
34
  | `dev` | Run the development server |
35
+ | `check` | Run build-time validations |
35
36
 
36
37
  ### Options
37
38
 
@@ -53,3 +54,6 @@ dashnex <command> [options]
53
54
 
54
55
  **app delete**:
55
56
  - `-y, --yes` — Skip confirmation prompt
57
+
58
+ **app deploy**:
59
+ - `--no-check` — Skip pre-deploy checks
@@ -1 +1 @@
1
- import e from"chalk";import{debug as t,debugError as o}from"../../lib/debug.js";import{getDeployerBase as s,getBusinessApiBase as r}from"../../lib/api.js";import{ensureLoggedIn as n}from"../../services/auth.js";import{createSpinner as a}from"../../lib/spinner.js";import{isUserInterrupt as i,INTERRUPTED_MESSAGE as c}from"../../lib/errors.js";import{getApplicationUrl as l}from"../../lib/app-url.js";import{ensureAgreements as p}from"../../services/agreements.js";const d=3e5,m=99,f=e=>new Promise(t=>setTimeout(t,e)),u=async(s,r,n,a)=>{const i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${r}`,Accept:"text/event-stream"}});if(t(`SSE connection opened: ${i.status}`),!i.ok){const t=i.status;let o="Failed to start deployment.";if(401===t||403===t)o="Please run 'dashnex login' to authenticate.";else try{const e=await i.text(),t=JSON.parse(e);"string"==typeof t.error?o=t.error:"string"==typeof t.message&&(o=t.message)}catch{}throw console.error(e.red(o)),new Error(`HTTP ${t}: ${o}`)}if(!i.body)throw new Error("Response body is null");t("SSE connection established successfully"),a?.();const c=i.body.getReader();try{for await(const e of async function*(e){const t=new TextDecoder("utf-8");let o="";for(;;){const{value:s,done:r}=await e.read();if(r)break;o+=t.decode(s,{stream:!0});const n=o.split("\n");o=n.pop()||"";let a="";for(const e of n)e.startsWith("data: ")?a=e.slice(6):""===e&&a&&(yield{data:a},a="")}if(o.startsWith("data: ")){const e=o.slice(6);e&&(yield{data:e})}}(c))try{if(!e.data){t("Received empty SSE event");continue}const o=JSON.parse(e.data);t(`SSE message received: ${JSON.stringify(o)}`),n(o)}catch(l){o(l),t(`Failed to parse SSE event data: ${e.data}`)}}finally{c.releaseLock()}};class y{async execute(){t("Deploy flow started");const r=await n();if(!r)return;if(!(await p(r.token,{ciMode:!0})))return;const l=`${s()}/business/v1/applications/deploy`;t(`GET ${l} (SSE)`);let y=0,h="",g=!1,w=0,S=!1;const $=a();let b=0,v=0,x=null;const E=(e,t)=>{const o=Math.round(e);$.text(`[${o}%] ${t}`)},D=()=>{k();const e=y,t=Date.now(),o=d*((m-e)/m);x=setInterval(()=>{const s=Date.now()-t;let r;if(v>t){const e=Date.now()-v,t=m-b,o=t*3030.3030303030305;r=Math.min(b+e/o*t,m)}else r=Math.min(e+s/o*(m-e),m);r>y&&(y=r,E(y,h))},200)},k=()=>{x&&(clearInterval(x),x=null)};let T=!1;const j=t=>{if(S=!0,"string"==typeof t.error)return k(),$.stop(),console.error(e.red(t.error)),g=!0,void(T=!0);if("string"==typeof t.message&&(h=t.message),"number"==typeof t.progress&&(b=t.progress,v=Date.now(),t.progress>y&&(y=t.progress)),"string"==typeof t.message||"number"==typeof t.progress)if(y>=100){k(),$.stop();const t=h||"Application is deployed";process.stdout.write(`${e.green(t)}\n`),g=!0}else E(y,h)};for(;w<=5;)try{return S?E(y,h):$.start("Connecting..."),D(),await u(l,r.token,j,()=>{S||($.text(`[${Math.round(y)}%] Deployment in progress...`),h="Deployment in progress...")}),k(),$.stop(),t("SSE connection closed"),T&&process.exit(1),void(g&&await this.showDeployedUrl(r.token))}catch(M){if(k(),o(M),t(`SSE connection error: ${M}`),g)return $.stop(),void(T&&process.exit(1));if(i(M))return $.stop(),void console.log(e.yellow(c));M instanceof Error&&M.message.startsWith("HTTP")&&($.stop(),console.error(e.red("Could not complete deployment. Check your connection and try again.")),process.exit(1)),w++,w>5&&($.stop(),console.error(e.red("Deployment failed. Maximum reconnection attempts exceeded.")),process.exit(1));const s=Math.min(1e3*Math.pow(2,w-1),3e4);t(`Connection error. Reconnecting in ${s/1e3}s... (attempt ${w}/5)`),await f(s)}}async showDeployedUrl(s){try{const o=`${r()}/business/v1/applications`;t(`GET ${o} (for deployed URL)`);const n=await fetch(o,{headers:{Authorization:`Bearer ${s}`}});if(!n.ok)return;const a=await n.json().catch(()=>({})),i=l({subdomain:a.subdomain,appFullCustomDomain:a.appFullCustomDomain});i&&console.log(`Application is deployed to ${e.cyan(i)}`)}catch(n){o(n)}}}export{y as DeployCommand};
1
+ import e from"chalk";import{debug as t,debugError as o}from"../../lib/debug.js";import{getDeployerBase as s,getBusinessApiBase as r}from"../../lib/api.js";import{ensureLoggedIn as n}from"../../services/auth.js";import{createSpinner as a}from"../../lib/spinner.js";import{isUserInterrupt as i,INTERRUPTED_MESSAGE as c}from"../../lib/errors.js";import{getApplicationUrl as l}from"../../lib/app-url.js";import{ensureAgreements as p}from"../../services/agreements.js";import{CheckCommand as d}from"../check.js";const m=3e5,f=99,u=e=>new Promise(t=>setTimeout(t,e)),y=async(s,r,n,a)=>{const i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${r}`,Accept:"text/event-stream"}});if(t(`SSE connection opened: ${i.status}`),!i.ok){const t=i.status;let o="Failed to start deployment.";if(401===t||403===t)o="Please run 'dashnex login' to authenticate.";else try{const e=await i.text(),t=JSON.parse(e);"string"==typeof t.error?o=t.error:"string"==typeof t.message&&(o=t.message)}catch{}throw console.error(e.red(o)),new Error(`HTTP ${t}: ${o}`)}if(!i.body)throw new Error("Response body is null");t("SSE connection established successfully"),a?.();const c=i.body.getReader();try{for await(const e of async function*(e){const t=new TextDecoder("utf-8");let o="";for(;;){const{value:s,done:r}=await e.read();if(r)break;o+=t.decode(s,{stream:!0});const n=o.split("\n");o=n.pop()||"";let a="";for(const e of n)e.startsWith("data: ")?a=e.slice(6):""===e&&a&&(yield{data:a},a="")}if(o.startsWith("data: ")){const e=o.slice(6);e&&(yield{data:e})}}(c))try{if(!e.data){t("Received empty SSE event");continue}const o=JSON.parse(e.data);t(`SSE message received: ${JSON.stringify(o)}`),n(o)}catch(l){o(l),t(`Failed to parse SSE event data: ${e.data}`)}}finally{c.releaseLock()}};class h{async execute(r={}){t("Deploy flow started");if(!1===r.check)t("Skipping pre-deploy checks (--no-check)");else{t("Running pre-deploy checks");const o=new d;await o.run()||(console.error(e.red("Deploy aborted: checks failed.")),process.exit(1))}const l=await n();if(!l)return;if(!(await p(l.token,{ciMode:!0})))return;const h=`${s()}/business/v1/applications/deploy`;t(`GET ${h} (SSE)`);let g=0,w="",S=!1,$=0,b=!1;const k=a();let v=0,x=0,D=null;const E=(e,t)=>{const o=Math.round(e);k.text(`[${o}%] ${t}`)},j=()=>{T();const e=g,t=Date.now(),o=m*((f-e)/f);D=setInterval(()=>{const s=Date.now()-t;let r;if(x>t){const e=Date.now()-x,t=f-v,o=t*3030.3030303030305;r=Math.min(v+e/o*t,f)}else r=Math.min(e+s/o*(f-e),f);r>g&&(g=r,E(g,w))},200)},T=()=>{D&&(clearInterval(D),D=null)};let M=!1;const C=t=>{if(b=!0,"string"==typeof t.error)return T(),k.stop(),console.error(e.red(t.error)),S=!0,void(M=!0);if("string"==typeof t.message&&(w=t.message),"number"==typeof t.progress&&(v=t.progress,x=Date.now(),t.progress>g&&(g=t.progress)),"string"==typeof t.message||"number"==typeof t.progress)if(g>=100){T(),k.stop();const t=w||"Application is deployed";process.stdout.write(`${e.green(t)}\n`),S=!0}else E(g,w)};for(;$<=5;)try{return b?E(g,w):k.start("Connecting..."),j(),await y(h,l.token,C,()=>{b||(k.text(`[${Math.round(g)}%] Deployment in progress...`),w="Deployment in progress...")}),T(),k.stop(),t("SSE connection closed"),M&&process.exit(1),void(S&&await this.showDeployedUrl(l.token))}catch(R){if(T(),o(R),t(`SSE connection error: ${R}`),S)return k.stop(),void(M&&process.exit(1));if(i(R))return k.stop(),void console.log(e.yellow(c));R instanceof Error&&R.message.startsWith("HTTP")&&(k.stop(),console.error(e.red("Could not complete deployment. Check your connection and try again.")),process.exit(1)),$++,$>5&&(k.stop(),console.error(e.red("Deployment failed. Maximum reconnection attempts exceeded.")),process.exit(1));const s=Math.min(1e3*Math.pow(2,$-1),3e4);t(`Connection error. Reconnecting in ${s/1e3}s... (attempt ${$}/5)`),await u(s)}}async showDeployedUrl(s){try{const o=`${r()}/business/v1/applications`;t(`GET ${o} (for deployed URL)`);const n=await fetch(o,{headers:{Authorization:`Bearer ${s}`}});if(!n.ok)return;const a=await n.json().catch(()=>({})),i=l({subdomain:a.subdomain,appFullCustomDomain:a.appFullCustomDomain});i&&console.log(`Application is deployed to ${e.cyan(i)}`)}catch(n){o(n)}}}export{h as DeployCommand};
@@ -1 +1 @@
1
- import{CreateCommand as e}from"./create.js";import{PullCommand as o}from"./pull.js";import{PushCommand as p}from"./push.js";import{DeleteCommand as a}from"./delete.js";import{DeployCommand as t}from"./deploy.js";import{StatusCommand as i}from"./status.js";const s={name:"app",description:"Manage DashNex applications",handler:{execute:async()=>{}},options:[],subcommands:[{name:"create",description:"Create a new DashNex application",handler:new e,options:[{flags:"-t, --template <template>",description:"Template (name@branch-or-tag)",defaultValue:"webapp-base@live"},{flags:"--subdomain <subdomain>",description:"Subdomain (CI mode, skip prompts)"}]},{name:"pull",description:"Pull existing application to specified folder",handler:new o,options:[{flags:"-y, --yes",description:"Skip prompts and child commands (CI mode)"}]},{name:"push",description:"Push local application to DashNex",handler:new p,options:[{flags:"--deploy",description:"Auto-deploy after push (skip prompt)"},{flags:"--no-deploy",description:"Skip deploy prompt"}]},{name:"delete",description:"Delete application from DashNex",handler:new a,options:[{flags:"-y, --yes",description:"Skip confirmation prompt"}]},{name:"deploy",description:"Deploy application to DashNex",handler:new t,options:[]},{name:"status",description:"Show current application status",handler:new i,options:[]}]};export{s as default};
1
+ import{CreateCommand as e}from"./create.js";import{PullCommand as o}from"./pull.js";import{PushCommand as p}from"./push.js";import{DeleteCommand as a}from"./delete.js";import{DeployCommand as i}from"./deploy.js";import{StatusCommand as t}from"./status.js";const s={name:"app",description:"Manage DashNex applications",handler:{execute:async()=>{}},options:[],subcommands:[{name:"create",description:"Create a new DashNex application",handler:new e,options:[{flags:"-t, --template <template>",description:"Template (name@branch-or-tag)",defaultValue:"webapp-base@live"},{flags:"--subdomain <subdomain>",description:"Subdomain (CI mode, skip prompts)"}]},{name:"pull",description:"Pull existing application to specified folder",handler:new o,options:[{flags:"-y, --yes",description:"Skip prompts and child commands (CI mode)"}]},{name:"push",description:"Push local application to DashNex",handler:new p,options:[{flags:"--deploy",description:"Auto-deploy after push (skip prompt)"},{flags:"--no-deploy",description:"Skip deploy prompt"}]},{name:"delete",description:"Delete application from DashNex",handler:new a,options:[{flags:"-y, --yes",description:"Skip confirmation prompt"}]},{name:"deploy",description:"Deploy application to DashNex",handler:new i,options:[{flags:"--no-check",description:"Skip pre-deploy checks"}]},{name:"status",description:"Show current application status",handler:new t,options:[]}]};export{s as default};
@@ -0,0 +1 @@
1
+ import{spawn as e}from"child_process";import o from"chalk";import{debug as n,debugError as r}from"../lib/debug.js";const s=(o,s)=>new Promise((c,t)=>{n(`Running: ${o} ${s.join(" ")}`);const a=e(o,s,{stdio:"inherit",cwd:process.cwd(),shell:!0});a.on("error",e=>{r(e),t(e)}),a.on("close",e=>{n(`${o} exited with code ${e}`),c(null===e?1:e)})}),c=o=>new Promise(n=>{const r=e(o,["--version"],{stdio:"ignore",shell:!0});r.on("error",()=>n(!1)),r.on("close",e=>n(0===e))}),t=[{name:"TypeScript",command:"npx",args:["tsc","--noEmit"],notFoundMessage:"TypeScript is not available. Please install it with: npm install -D typescript"}];class a{async execute(){n("Check flow started"),n(`Running ${t.length} check(s)`);for(const a of t){n(`Running check: ${a.name}`);await c(a.command)||(console.error(o.red(a.notFoundMessage)),process.exit(1));try{0!==await s(a.command,a.args)&&(console.error(o.red("Check failed.")),process.exit(1))}catch(e){r(e),console.error(o.red(a.notFoundMessage)),process.exit(1)}}console.log(o.green("All checks passed."))}async run(){n("Running checks (called from deploy)");for(const a of t){n(`Running check: ${a.name}`);if(!(await c(a.command)))return console.error(o.red(a.notFoundMessage)),!1;try{if(0!==await s(a.command,a.args))return!1}catch(e){return r(e),console.error(o.red(a.notFoundMessage)),!1}}return console.log(o.green("All checks passed.")),!0}}export{a as CheckCommand};
@@ -1 +1 @@
1
- import o from"./version.js";import{LoginCommand as e}from"./login.js";import{LogoutCommand as s}from"./logout.js";import{WhoamiCommand as n}from"./whoami.js";import{InstallCommand as i}from"./install.js";import{DevCommand as r}from"./dev.js";import p from"./app/index.js";const t=[{name:"version",description:"Display the version of the CLI",handler:new o,options:[]},{name:"login",description:"Log in to your DashNex account",handler:new e,options:[{flags:"--email <email>",description:"Email address (skip prompt)"},{flags:"--password <password>",description:"Password (skip prompt)"},{flags:"--code <code>",description:"2FA code (skip prompt)"},{flags:"--business <id>",description:"Business ID to select (skip prompt)"}]},{name:"logout",description:"Log out and remove local credentials",handler:new s,options:[]},{name:"whoami",description:"Show current logged-in business and user",handler:new n,options:[]},p,{name:"install",description:"Install dependencies using pnpm or npm",handler:new i,options:[]},{name:"dev",description:"Run the development server",handler:new r,options:[]}];export{t as default};
1
+ import o from"./version.js";import{LoginCommand as e}from"./login.js";import{LogoutCommand as i}from"./logout.js";import{WhoamiCommand as n}from"./whoami.js";import{InstallCommand as s}from"./install.js";import{DevCommand as r}from"./dev.js";import{CheckCommand as t}from"./check.js";import p from"./app/index.js";const a=[{name:"version",description:"Display the version of the CLI",handler:new o,options:[]},{name:"login",description:"Log in to your DashNex account",handler:new e,options:[{flags:"--email <email>",description:"Email address (skip prompt)"},{flags:"--password <password>",description:"Password (skip prompt)"},{flags:"--code <code>",description:"2FA code (skip prompt)"},{flags:"--business <id>",description:"Business ID to select (skip prompt)"}]},{name:"logout",description:"Log out and remove local credentials",handler:new i,options:[]},{name:"whoami",description:"Show current logged-in business and user",handler:new n,options:[]},p,{name:"install",description:"Install dependencies using pnpm or npm",handler:new s,options:[]},{name:"dev",description:"Run the development server",handler:new r,options:[]},{name:"check",description:"Run build-time validations",handler:new t,options:[]}];export{a as default};
@@ -1 +1 @@
1
- const e="@dashnex/cli",a="0.5.36",n="Command-line interface for DashNex framework",o={name:e,version:a,description:n};export{o as default,n as description,e as name,a as version};
1
+ const e="@dashnex/cli",a="0.5.40",n="Command-line interface for DashNex framework",o={name:e,version:a,description:n};export{o as default,n as description,e as name,a as version};
@@ -1 +1 @@
1
- import e from"chalk";import t from"inquirer";import{debug as r,debugError as o}from"../lib/debug.js";import{getBusinessApiBase as n}from"../lib/api.js";import{getApplicationUrl as a}from"../lib/app-url.js";const s=async t=>{const o=`${n()}/business/v1/agreements/payment-processing/status`;r(`GET ${o}`);const s=await fetch(o,{headers:{Authorization:`Bearer ${t}`}});if(r(`Payment agreement response: ${s.status}`),!s.ok)return!0;if((await s.json().catch(()=>({}))).hasAccepted)return!0;const c=await(async e=>{try{const t=`${n()}/business/v1/applications`,r=await fetch(t,{headers:{Authorization:`Bearer ${e}`}});if(r.ok){const e=await r.json().catch(()=>({})),t=a({subdomain:e.subdomain,appFullCustomDomain:e.appFullCustomDomain});if(t)return t}}catch{}return"qa"===(process.env.APPLICATION_ENV??"")?"https://dashnex.dev":"https://dashnexcloud.com"})(t),i=`${c}/money/agreement/`;return console.error(e.red(`You need to accept Master Payment Processing Agreement first by visiting this link: ${i}`)),!1},c=async(a,c={})=>{const i=c.ciMode??!1;if(!(await s(a)))return!1;const p=await(async(a,s)=>{const c=`${n()}/business/v1/tos/latest`;r(`GET ${c}`);const i=await fetch(c,{headers:{Authorization:`Bearer ${a}`}});if(r(`TOS latest response: ${i.status}`),i.ok)return!0;if(404!==i.status)return!0;const p=`${n()}/business/v1/tos/current`;r(`GET ${p}`);const l=await fetch(p,{headers:{Authorization:`Bearer ${a}`}});if(r(`TOS current response: ${l.status}`),!l.ok)return r("Could not fetch current TOS, skipping check"),!0;const u=await l.json().catch(()=>({})),m=u.version??"unknown";if(u.text&&(console.log(e.dim("─".repeat(60))),console.log(e.bold(`Terms of Service ${m}`)),console.log(e.dim("─".repeat(60))),console.log(u.text.replace(/<br\s*\/?>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/<\/div>/gi,"\n").replace(/<\/li>/gi,"\n").replace(/<[^>]+>/g,"").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&nbsp;/g," ").replace(/\n{3,}/g,"\n\n").trim()),console.log(e.dim("─".repeat(60)))),s)return console.log(e.yellow(`By proceeding you accept the Terms of Service ${m}.`)),!0;const{accept:g}=await t.prompt([{type:"confirm",name:"accept",message:`By creating an application you accept the Terms of Service ${m}. Continue?`,default:!0}]);if(!g)return console.log(e.yellow("Cancelled.")),!1;try{const e=`${n()}/business/v1/tos/${u.id}/accept`;r(`POST ${e}`),await fetch(e,{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({})})}catch(h){o(h)}return!0})(a,i);return!!p};export{c as ensureAgreements};
1
+ import e from"chalk";import t from"inquirer";import{debug as r,debugError as n}from"../lib/debug.js";import{getBusinessApiBase as o}from"../lib/api.js";import{getApplicationUrl as s}from"../lib/app-url.js";const a=async t=>{const n=`${o()}/business/v1/agreements/payment-processing/status`;r(`GET ${n}`);const a=await fetch(n,{headers:{Authorization:`Bearer ${t}`}});if(r(`Payment agreement response: ${a.status}`),!a.ok)return!0;if((await a.json().catch(()=>({}))).hasAccepted)return!0;const i=await(async e=>{try{const t=`${o()}/business/v1/applications`,r=await fetch(t,{headers:{Authorization:`Bearer ${e}`}});if(r.ok){const e=await r.json().catch(()=>({})),t=s({subdomain:e.subdomain,appFullCustomDomain:e.appFullCustomDomain});if(t)return t}}catch{}return"qa"===(process.env.APPLICATION_ENV??"")?"https://business.qa.dashnex.com":"https://business.dashnex.com"})(t),c=`${i}/money/agreement/`;return console.error(e.red(`You need to accept Master Payment Processing Agreement first by visiting this link: ${c}`)),!1},i=async(s,i={})=>{const c=i.ciMode??!1;if(!(await a(s)))return!1;const p=await(async(s,a)=>{const i=`${o()}/business/v1/tos/latest`;r(`GET ${i}`);const c=await fetch(i,{headers:{Authorization:`Bearer ${s}`}});if(r(`TOS latest response: ${c.status}`),c.ok)return!0;if(404!==c.status)return!0;const p=`${o()}/business/v1/tos/current`;r(`GET ${p}`);const l=await fetch(p,{headers:{Authorization:`Bearer ${s}`}});if(r(`TOS current response: ${l.status}`),!l.ok)return r("Could not fetch current TOS, skipping check"),!0;const u=await l.json().catch(()=>({})),m=u.version??"unknown";if(u.text&&(console.log(e.dim("─".repeat(60))),console.log(e.bold(`Terms of Service ${m}`)),console.log(e.dim("─".repeat(60))),console.log(u.text.replace(/<br\s*\/?>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/<\/div>/gi,"\n").replace(/<\/li>/gi,"\n").replace(/<[^>]+>/g,"").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&nbsp;/g," ").replace(/\n{3,}/g,"\n\n").trim()),console.log(e.dim("─".repeat(60)))),a)return console.log(e.yellow(`By proceeding you accept the Terms of Service ${m}.`)),!0;const{accept:g}=await t.prompt([{type:"confirm",name:"accept",message:`By creating an application you accept the Terms of Service ${m}. Continue?`,default:!0}]);if(!g)return console.log(e.yellow("Cancelled.")),!1;try{const e=`${o()}/business/v1/tos/${u.id}/accept`;r(`POST ${e}`),await fetch(e,{method:"POST",headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"},body:JSON.stringify({})})}catch(h){n(h)}return!0})(s,c);return!!p};export{i as ensureAgreements};
@@ -1,5 +1,8 @@
1
1
  import { CliCommand } from '@dashnex/types';
2
+ export interface DeployCommandOptions {
3
+ check?: boolean;
4
+ }
2
5
  export declare class DeployCommand implements CliCommand {
3
- execute(): Promise<void>;
6
+ execute(options?: DeployCommandOptions): Promise<void>;
4
7
  private showDeployedUrl;
5
8
  }
@@ -0,0 +1,5 @@
1
+ import { CliCommand } from '@dashnex/types';
2
+ export declare class CheckCommand implements CliCommand {
3
+ execute(): Promise<void>;
4
+ run(): Promise<boolean>;
5
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "@dashnex/cli",
4
- "version": "0.5.36",
4
+ "version": "0.5.40",
5
5
  "description": "Command-line interface for DashNex framework",
6
6
  "homepage": "https://dashnex.io",
7
7
  "type": "module",