dashnex 0.5.37 → 0.5.41

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)=>{const c=`${o} ${s.join(" ")}`;return new Promise((s,t)=>{n(`Running: ${c}`);const a=e(c,{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}`),s(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.37",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.41",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 r from"fs-extra";import n from"path";import{debug as s,debugError as t,debugJson as o}from"../lib/debug.js";import{getApiBase as a,apiFetch as i}from"../lib/api.js";const u=async(e,n)=>{s(`POST ${a()}/auth/v1/token/refresh`);const{response:t,body:u}=await i(`${a()}/auth/v1/token/refresh`,{method:"POST",body:JSON.stringify({refreshToken:e})});if(s(`Response: ${t.status}`),o("Refresh response",u),!t.ok)return s("Token refresh failed"),null;const h=u;if(!h.token||!h.refreshToken)return s("Refresh response missing tokens"),null;const f=await r.readJson(n);return f.token=h.token,f.refreshToken=h.refreshToken,await r.writeJson(n,f,{spaces:2}),s("Updated .dashnex with new tokens"),l(h.token,h.refreshToken,n,{...f,token:h.token,refreshToken:h.refreshToken})},l=async(e,r,n,l)=>{if(((e,r=30)=>{try{const n=e.split(".");if(3!==n.length)return!1;const t=JSON.parse(Buffer.from(n[1],"base64url").toString());if("number"!=typeof t.exp)return!1;const o=Math.floor(Date.now()/1e3),a=t.exp-r<=o;return a&&s(`Token expired or expiring soon (exp: ${t.exp}, now: ${o})`),a}catch{return!1}})(e)){if(!r)return s("Token expired, no refreshToken available"),null;s("Token expired, refreshing proactively");try{return await u(r,n)}catch(h){return t(h),null}}s(`GET ${a()}/users/v1/`);try{const{response:t,body:h}=await i(`${a()}/users/v1/`,{headers:{Authorization:`Bearer ${e}`}});if(s(`Response: ${t.status}`),o("Users response",h),t.ok){const r=h;if("string"==typeof r.name&&l.businessId)return s(`Token valid, Already logged in as ${r.name}`),{token:e,businessId:l.businessId,userName:r.name}}return r?(s("Users API rejected token, refreshing"),await u(r,n)):(s("Token invalid, no refreshToken available"),null)}catch(h){return t(h),null}},h=async(t={})=>{const{exitOnFailure:o=!0,dashnexPath:a}=t,i=a??await(async e=>{let s=n.resolve(e);for(;;){const e=n.join(s,".dashnex");if(await r.pathExists(e))return e;const t=n.dirname(s);if(t===s)return null;s=t}})(process.cwd());if(!i||!(await r.pathExists(i)))return s(".dashnex not found"),o&&(console.error(e.red("Please run 'dashnex login' to authenticate.")),process.exit(1)),null;let u;s(`Found .dashnex at ${i}`);try{u=await r.readJson(i)}catch{return s(".dashnex parse failed"),o&&(console.error(e.red("Please run 'dashnex login' to authenticate.")),process.exit(1)),null}const{token:h,refreshToken:f,businessId:c}=u;if(!h)return s(".dashnex missing token"),o&&(console.error(e.red("Please run 'dashnex login' to authenticate.")),process.exit(1)),null;const d=await l(h,f,i,u);return d||(o&&(console.error(e.red("Please run 'dashnex login' to authenticate.")),process.exit(1)),null)};export{h as ensureLoggedIn};
1
+ import e from"chalk";import n from"fs-extra";import r from"path";import{debug as s,debugError as t,debugJson as o}from"../lib/debug.js";import{getApiBase as a,apiFetch as i}from"../lib/api.js";const u=()=>{console.error(e.red("Please run 'dashnex login' to authenticate.")),console.error(e.dim("If you don't have a business account yet, create one at "+("qa"===(process.env.APPLICATION_ENV??"")?"https://business.qa.dashnex.com/":"https://business.dashnex.com/")))},h=async(e,r)=>{s(`POST ${a()}/auth/v1/token/refresh`);const{response:t,body:u}=await i(`${a()}/auth/v1/token/refresh`,{method:"POST",body:JSON.stringify({refreshToken:e})});if(s(`Response: ${t.status}`),o("Refresh response",u),!t.ok)return s("Token refresh failed"),null;const h=u;if(!h.token||!h.refreshToken)return s("Refresh response missing tokens"),null;const f=await n.readJson(r);return f.token=h.token,f.refreshToken=h.refreshToken,await n.writeJson(r,f,{spaces:2}),s("Updated .dashnex with new tokens"),l(h.token,h.refreshToken,r,{...f,token:h.token,refreshToken:h.refreshToken})},l=async(e,n,r,u)=>{if(((e,n=30)=>{try{const r=e.split(".");if(3!==r.length)return!1;const t=JSON.parse(Buffer.from(r[1],"base64url").toString());if("number"!=typeof t.exp)return!1;const o=Math.floor(Date.now()/1e3),a=t.exp-n<=o;return a&&s(`Token expired or expiring soon (exp: ${t.exp}, now: ${o})`),a}catch{return!1}})(e)){if(!n)return s("Token expired, no refreshToken available"),null;s("Token expired, refreshing proactively");try{return await h(n,r)}catch(l){return t(l),null}}s(`GET ${a()}/users/v1/`);try{const{response:t,body:l}=await i(`${a()}/users/v1/`,{headers:{Authorization:`Bearer ${e}`}});if(s(`Response: ${t.status}`),o("Users response",l),t.ok){const n=l;if("string"==typeof n.name&&u.businessId)return s(`Token valid, Already logged in as ${n.name}`),{token:e,businessId:u.businessId,userName:n.name}}return n?(s("Users API rejected token, refreshing"),await h(n,r)):(s("Token invalid, no refreshToken available"),null)}catch(l){return t(l),null}},f=async(e={})=>{const{exitOnFailure:t=!0,dashnexPath:o}=e,a=o??await(async e=>{let s=r.resolve(e);for(;;){const e=r.join(s,".dashnex");if(await n.pathExists(e))return e;const t=r.dirname(s);if(t===s)return null;s=t}})(process.cwd());if(!a||!(await n.pathExists(a)))return s(".dashnex not found"),t&&(u(),process.exit(1)),null;let i;s(`Found .dashnex at ${a}`);try{i=await n.readJson(a)}catch{return s(".dashnex parse failed"),t&&(u(),process.exit(1)),null}const{token:h,refreshToken:f,businessId:c}=i;if(!h)return s(".dashnex missing token"),t&&(u(),process.exit(1)),null;const d=await l(h,f,a,i);return d||(t&&(u(),process.exit(1)),null)};export{f as ensureLoggedIn};
@@ -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",
4
- "version": "0.5.37",
4
+ "version": "0.5.41",
5
5
  "description": "Command-line interface for DashNex framework",
6
6
  "homepage": "https://dashnex.io",
7
7
  "type": "module",