@zibby/cli 0.1.66 → 0.1.69
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/dist/bin/zibby.js +2 -2
- package/dist/commands/chat.js +29 -29
- package/dist/commands/generate.js +21 -60
- package/dist/commands/workflows/logs.js +36 -40
- package/dist/commands/workflows/trigger.js +12 -12
- package/dist/package.json +3 -4
- package/package.json +1 -2
|
@@ -1,42 +1,38 @@
|
|
|
1
|
-
import
|
|
2
|
-
Not authenticated`)),console.log(
|
|
3
|
-
`)),process.exit(1));let
|
|
4
|
-
Config file corrupt`)),console.log(
|
|
5
|
-
`)),process.exit(1)}let
|
|
6
|
-
Not authenticated`)),console.log(
|
|
7
|
-
`)),process.exit(1));let
|
|
8
|
-
|
|
9
|
-
`)),process.exit(1))
|
|
10
|
-
|
|
11
|
-
`)),
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
`));for(let
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
`));
|
|
1
|
+
import e from"chalk";import{readFileSync as N,existsSync as R}from"fs";import{homedir as v}from"os";import{join as P}from"path";var E="https://logs.workflows.zibby.app",j="https://logs-stream.zibby.app/",h=null;async function C(i){return h||(process.env.ZIBBY_SSE_ENDPOINT?(h=process.env.ZIBBY_SSE_ENDPOINT,h):(h=j,h))}function A(i){let s=P(v(),".zibby","config.json");R(s)||(console.log(e.red(`
|
|
2
|
+
Not authenticated`)),console.log(e.gray(` Run: zibby login
|
|
3
|
+
`)),process.exit(1));let n;try{n=JSON.parse(N(s,"utf-8"))}catch{console.log(e.red(`
|
|
4
|
+
Config file corrupt`)),console.log(e.gray(` Run: zibby login
|
|
5
|
+
`)),process.exit(1)}let a=n.sessionToken;a||(console.log(e.red(`
|
|
6
|
+
Not authenticated`)),console.log(e.gray(` Run: zibby login
|
|
7
|
+
`)),process.exit(1));let f=i.project;return{token:a,projectId:f}}function k(i){return new Date(i).toISOString().replace("T"," ").replace("Z","")}async function T(i,s){let n=await fetch(i,{headers:{Authorization:`Bearer ${s}`}});if(!n.ok){let a=await n.text();throw new Error(`API ${n.status}: ${a}`)}return n.json()}async function _(i,s,n,a){return i||(console.log(e.red(`
|
|
8
|
+
Workflow UUID is required`)),console.log(e.gray(" Usage: zibby logs <workflow-uuid>")),console.log(e.gray(` zibby logs <workflow-uuid> -t
|
|
9
|
+
`)),process.exit(1)),i}async function J({token:i,jobId:s,follow:n}){console.log(e.gray(` Streaming logs for workflow ${e.cyan(s)}...`)),console.log(n?e.gray(` Press Ctrl+C to stop.
|
|
10
|
+
`):"");let a=await C(i);if(!a)return console.log(e.yellow(` SSE endpoint not configured, using CloudWatch polling...
|
|
11
|
+
`)),I({token:i,projectId:null,jobId:s,follow:n,limit:1e3});let f=!1,u=null,c=()=>{f=!0,console.log(e.gray(`
|
|
12
|
+
Stopped streaming.
|
|
13
|
+
`)),process.exit(0)};process.on("SIGINT",c),process.on("SIGTERM",c);try{let l=new URL(a);l.searchParams.set("jobId",s),u&&l.searchParams.set("lastEventId",u);let p=await fetch(l.toString(),{headers:{Authorization:`Bearer ${i}`,Accept:"text/event-stream"}});if(!p.ok)throw new Error(`SSE connection failed: ${p.status} ${p.statusText}`);let w=p.body.getReader(),b=new TextDecoder,d="";for(;!f;){let{done:$,value:m}=await w.read();if($)break;d+=b.decode(m,{stream:!0});let o=d.split(`
|
|
14
|
+
`);d=o.pop()||"";for(let r of o)if(r.trim()){if(r.startsWith("id:"))u=r.slice(3).trim();else if(r.startsWith("event:")){let y=r.slice(6).trim();if(y==="status"||y==="log")continue;if(y==="complete"){console.log(e.green(`
|
|
15
|
+
Job completed.`)),n||process.exit(0);return}if(y==="error"){let g=o[o.indexOf(r)+1];if(g&&g.startsWith("data:"))try{let t=JSON.parse(g.slice(5).trim());if(t.error==="No executions found for workflow"){console.log(e.yellow(`
|
|
16
|
+
No executions found for this workflow. Trigger the workflow first.
|
|
17
|
+
`)),process.exit(1);return}if(t.error==="Task not started yet"){console.log(e.yellow(`
|
|
18
|
+
Task not started yet. Try again in a few seconds.
|
|
19
|
+
`)),process.exit(1);return}}catch{}console.log(e.red(`
|
|
20
|
+
Job failed.`)),n||process.exit(1);return}}else if(r.startsWith("data:")){let y=r.slice(5).trim();if(!y)continue;try{let g=JSON.parse(y);if(g.timestamp&&g.message){let t=e.gray(k(g.timestamp));console.log(`${t} ${g.message.replace(/\n$/,"")}`)}}catch{}}}}}catch(l){return l.name==="AbortError"?void 0:(console.error(e.red(` SSE Error: ${l.message}`)),console.log(e.yellow(` Falling back to polling mode...
|
|
21
|
+
`)),I({token:i,projectId:null,jobId:s,follow:n,limit:1e3}))}}async function I({token:i,projectId:s,jobId:n,follow:a,limit:f}){let u=s?`${E}/logs/${s}/${n}`:`${E}/job/${n}`,c=null,l=0,p=new Set,w=!1,b=0,d=5,$=()=>{w=!0,console.log(e.gray(`
|
|
18
22
|
Stopped tailing.
|
|
19
|
-
`)),process.exit(0)};for(process.on("SIGINT"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
`)),process.exit(0)};for(process.on("SIGINT",$),process.on("SIGTERM",$),console.log(e.gray(` Fetching logs for workflow ${e.cyan(n)}...`)),console.log(a?e.gray(` Press Ctrl+C to stop.
|
|
24
|
+
`):"");!w;)try{let m=new URLSearchParams({limit:String(f)});c&&m.set("nextToken",c);let o=await T(`${u}?${m}`,i);b=0,o.message&&o.lines?.length===0&&l===0&&console.log(e.gray(` ${o.message}`)),o.status==="starting"&&o.lines?.length===0&&l===0&&console.log(e.gray(" Container starting..."));for(let t of o.lines||[]){let S=`${t.timestamp}:${t.message}`;if(p.has(S))continue;p.add(S);let x=e.gray(k(t.timestamp));console.log(`${x} ${t.message.replace(/\n$/,"")}`)}if(l=o.lines?.length>0?0:l+1,c=o.nextForwardToken||null,o.status==="completed"||o.status==="failed"){let t=o.status==="completed"?e.green:e.red;console.log(t(`
|
|
25
|
+
Job ${o.status}.`)),process.exit(o.status==="completed"?0:1)}if(!a){o.status&&console.log(e.gray(`
|
|
26
|
+
Status: ${o.status}`));break}let g=o.lines?.length>0?500:l>5?5e3:2e3;await new Promise(t=>setTimeout(t,g))}catch(m){if(m.name==="AbortError")break;b++,console.error(e.red(` Error: ${m.message}`)),b>=d&&(console.error(e.red(`
|
|
27
|
+
Too many consecutive errors (${d}). Stopping.
|
|
28
|
+
`)),process.exit(1)),a||process.exit(1),await new Promise(o=>setTimeout(o,3e3))}}async function O({token:i,projectId:s,workflow:n,follow:a,limit:f}){let u=`${E}/all/${s}`,c=null,l=0,p=new Set,w=null,b=!1,d=0,$=5,m=()=>{b=!0,console.log(e.gray(`
|
|
24
29
|
Stopped tailing.
|
|
25
|
-
`)),process.exit(0)};for(process.on("SIGINT",
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
`)),
|
|
33
|
-
|
|
34
|
-
`):"");!b;)try{let s=new URLSearchParams({workflow:t,limit:String(c)});a&&s.set("nextToken",a);let g=await S(`${u}?${s}`,n);w=0,g.message&&g.lines?.length===0&&i===0&&console.log(o.gray(` ${g.message}`));for(let e of g.lines||[]){let f=`${e.timestamp}:${e.jobId}:${e.message}`;if(m.has(f))continue;m.add(f),e.jobId!==d&&(d!==null&&console.log(""),console.log(o.dim(` \u2500\u2500 ${h(e.jobId)} \u2500\u2500`)),d=e.jobId);let k=o.gray(x(e.timestamp));console.log(`${k} ${e.message.replace(/\n$/,"")}`)}if(i=g.lines?.length>0?0:i+1,a=g.nextToken||null,!l){a&&console.log(o.gray(`
|
|
35
|
-
... more logs available. Run again or use --follow to stream.`)),g.jobCount&&console.log(o.gray(` ${g.jobCount} job(s) found.`));break}if(!g.hasRunning&&!a&&i>2){console.log(o.gray(`
|
|
36
|
-
No running jobs. All caught up.`));break}await new Promise(e=>setTimeout(e,i>5?5e3:2e3))}catch(s){if(s.name==="AbortError")break;w++,console.error(o.red(` Error: ${s.message}`)),w>=y&&(console.error(o.red(`
|
|
37
|
-
Too many consecutive errors (${y}). Stopping.
|
|
38
|
-
`)),process.exit(1)),l||process.exit(1),await new Promise(g=>setTimeout(g,3e3))}}async function O(n,r){let{token:t,projectId:l}=R(r),c=r.follow!==!1,u=r.lines?parseInt(r.lines,10):500;if(r.all){let i=r.workflow;return i||(console.log(o.red(`
|
|
39
|
-
--workflow is required with --all`)),console.log(o.gray(` Example: zibby logs --workflow ticket-triage --all --project <id>
|
|
40
|
-
`)),process.exit(1)),U({token:t,projectId:l,workflow:i,follow:c,limit:u})}if(r.tailLatest)return n||(console.log(o.red(`
|
|
41
|
-
Workflow UUID is required with --tail-latest`)),console.log(o.gray(` Example: zibby logs <workflowUuid> -t
|
|
42
|
-
`)),process.exit(1)),z({token:t,projectId:l,workflowUuid:n,follow:c,limit:u});let a=await P(n,r,t,l);return A({token:t,projectId:l,jobId:a,follow:c,limit:u})}export{O as logsCommand};
|
|
30
|
+
`)),process.exit(0)};for(process.on("SIGINT",m),process.on("SIGTERM",m),console.log(e.gray(`
|
|
31
|
+
Tailing all runs for ${e.cyan(n)}...`)),console.log(a?e.gray(` Press Ctrl+C to stop.
|
|
32
|
+
`):"");!b;)try{let o=new URLSearchParams({workflow:n,limit:String(f)});c&&o.set("nextToken",c);let r=await T(`${u}?${o}`,i);d=0,r.message&&r.lines?.length===0&&l===0&&console.log(e.gray(` ${r.message}`));for(let t of r.lines||[]){let S=`${t.timestamp}:${t.jobId}:${t.message}`;if(p.has(S))continue;p.add(S),t.jobId!==w&&(w!==null&&console.log(""),console.log(e.dim(` \u2500\u2500 ${t.jobId} \u2500\u2500`)),w=t.jobId);let x=e.gray(k(t.timestamp));console.log(`${x} ${t.message.replace(/\n$/,"")}`)}if(l=r.lines?.length>0?0:l+1,c=r.nextToken||null,!a){c&&console.log(e.gray(`
|
|
33
|
+
... more logs available. Run again or use --follow to stream.`)),r.jobCount&&console.log(e.gray(` ${r.jobCount} job(s) found.`));break}if(!r.hasRunning&&!c&&l>2){console.log(e.gray(`
|
|
34
|
+
No running jobs. All caught up.`));break}let g=r.lines?.length>0?500:l>5?5e3:2e3;await new Promise(t=>setTimeout(t,g))}catch(o){if(o.name==="AbortError")break;d++,console.error(e.red(` Error: ${o.message}`)),d>=$&&(console.error(e.red(`
|
|
35
|
+
Too many consecutive errors (${$}). Stopping.
|
|
36
|
+
`)),process.exit(1)),a||process.exit(1),await new Promise(r=>setTimeout(r,3e3))}}async function B(i,s){let{token:n,projectId:a}=A(s),f=s.follow===!0,u=s.lines?parseInt(s.lines,10):1e3;if(s.all){let l=s.workflow;return l||(console.log(e.red(`
|
|
37
|
+
--workflow is required with --all`)),console.log(e.gray(` Example: zibby logs --workflow ticket-triage --all --project <id>
|
|
38
|
+
`)),process.exit(1)),O({token:n,projectId:a,workflow:l,follow:f,limit:u})}let c=await _(i,s,n,a);return f?J({token:n,jobId:c,follow:f}):I({token:n,projectId:a,jobId:c,follow:!1,limit:u})}export{B as logsCommand};
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import w from"ora";import{select as m}from"@inquirer/prompts";import{readFileSync as v,existsSync as B}from"fs";import{homedir as _}from"os";import{join as b}from"path";var $={local:{name:"Local Development",apiUrl:"http://localhost:3001",accountApiUrl:"http://localhost:3001",frontendUrl:"http://localhost:3000",description:"Local backend running on port 3001"},prod:{name:"Production",apiUrl:process.env.ZIBBY_PROD_API_URL||"https://api-prod.zibby.app",accountApiUrl:process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://account-api-prod.zibby.app",frontendUrl:process.env.ZIBBY_PROD_FRONTEND_URL||"https://studio.zibby.app",description:"Production environment"}};function y(){let o;if(process.env.ZIBBY_API_URL)o=process.env.ZIBBY_API_URL;else{let e=process.env.ZIBBY_ENV||"prod";$[e]?o=$[e].apiUrl:o=$.prod.apiUrl}try{let e=new URL(o);return e.protocol!=="http:"&&e.protocol!=="https:"?(console.error(`\u26A0\uFE0F Invalid API URL protocol: ${e.protocol} (only http/https allowed)`),$.prod.apiUrl):o}catch{return console.error(`\u26A0\uFE0F Invalid API URL: ${o}`),$.prod.apiUrl}}function U(){let o=b(_(),".zibby","config.json");if(B(o))try{let r=JSON.parse(v(o,"utf-8"));if(r.sessionToken)return r.sessionToken}catch{}let e=process.env.ZIBBY_API_KEY;if(e)return e;console.log(`
|
|
2
2
|
Not authenticated`),console.log(" Run: zibby login"),console.log(` OR set ZIBBY_API_KEY env var (for CI/CD)
|
|
3
|
-
`),process.exit(1)}async function E(o){let e=y(),
|
|
4
|
-
\u2713 Found workflow "${
|
|
5
|
-
`);break}}}(!
|
|
3
|
+
`),process.exit(1)}async function E(o){let e=y(),r=w("Fetching projects...").start();try{let p=await fetch(`${e}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}});p.ok||(r.fail("Failed to fetch projects"),process.exit(1));let n=await p.json();Array.isArray(n)||(n.projects?n=n.projects:n.data&&(n=n.data)),(!n||n.length===0)&&(r.fail("No projects found"),process.exit(1)),r.succeed(`Found ${n.length} project${n.length===1?"":"s"}`),console.log("");let t=n.map(s=>({name:`${s.name||"Unnamed"} (${s.projectId||s.id})`,value:s.projectId||s.id}));return await m({message:"Select a project:",choices:t})}catch(p){r.fail(`Error: ${p.message}`),process.exit(1)}}async function T(o,e){let r=y(),p=w("Fetching deployed workflows...").start();try{let n=["analysis","implementation","run_test"],t=[];for(let i of n){let d=await fetch(`${r}/projects/${o}/workflows/${i}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(d.ok){let l=await d.json();l.graph&&t.push({name:i,version:l.version||0,isDefault:l.isDefault!==!1})}}t.length===0&&(p.fail("No deployed workflows found for this project"),process.exit(1)),p.succeed(`Found ${t.length} deployed workflow${t.length===1?"":"s"}`),console.log("");let s=t.map(i=>({name:`${i.name} (v${i.version})${i.isDefault?" [default]":""}`,value:i.name}));return await m({message:"Select a workflow to trigger:",choices:s})}catch(n){p.fail(`Error: ${n.message}`),process.exit(1)}}async function L(o,e={}){let r=U(),n=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(o),t=e.project||process.env.ZIBBY_PROJECT_ID,s=o;if(o&&n){let l=y();try{let a=await fetch(`${l}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`}});if(a.ok){let f=(await a.json()).projects||[];for(let c of f){let u=await fetch(`${l}/projects/${c.projectId}/workflows`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`}});if(u.ok){let j=(await u.json()).find(I=>I.uuid===o);if(j){t=c.projectId,s=j.workflowType||j.name,console.log(`
|
|
4
|
+
\u2713 Found workflow "${s}" (UUID: ${o})
|
|
5
|
+
`);break}}}(!s||s===o)&&(console.log(`
|
|
6
6
|
Error: Workflow with UUID "${o}" not found`),console.log(` Check: zibby workflow list
|
|
7
7
|
`),process.exit(1))}}catch(a){console.log(`
|
|
8
8
|
Error looking up workflow UUID: ${a.message}
|
|
9
|
-
`),process.exit(1)}}else if(o&&!
|
|
10
|
-
\u2713 Found workflow "${o}" in project: ${c[0].name||
|
|
9
|
+
`),process.exit(1)}}else if(o&&!t){let l=y();try{let a=await fetch(`${l}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`}});if(a.ok){let f=(await a.json()).projects||[],c=[];for(let u of f){let h=await fetch(`${l}/projects/${u.projectId}/workflows`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`}});h.ok&&(await h.json()).some(I=>I.workflowType===o)&&c.push(u)}if(c.length===1)t=c[0].projectId,console.log(`
|
|
10
|
+
\u2713 Found workflow "${o}" in project: ${c[0].name||t}
|
|
11
11
|
`);else if(c.length>1){console.log(`
|
|
12
12
|
Workflow "${o}" is deployed to multiple projects:
|
|
13
|
-
`);let u=c.map(h=>({name:`${h.name||"Unnamed"} (${h.projectId})`,value:h.projectId}));
|
|
13
|
+
`);let u=c.map(h=>({name:`${h.name||"Unnamed"} (${h.projectId})`,value:h.projectId}));t=await m({message:"Select a project:",choices:u})}else console.log(`
|
|
14
14
|
Error: Workflow "${o}" not found in any of your projects`),console.log(` Deploy it first with: zibby deploy ${o}
|
|
15
|
-
`),process.exit(1)}}catch{}}
|
|
16
|
-
Error: Invalid JSON in --input`),console.log(` ${
|
|
15
|
+
`),process.exit(1)}}catch{}}t||(console.log(""),t=await E(r)),s||(console.log(""),s=await T(t,r));let i={};if(e.input)try{i=JSON.parse(e.input)}catch(l){console.log(`
|
|
16
|
+
Error: Invalid JSON in --input`),console.log(` ${l.message}
|
|
17
17
|
`),process.exit(1)}console.log(`
|
|
18
18
|
Triggering Workflow
|
|
19
|
-
`),console.log(" ".padEnd(60,"-")),console.log(` Workflow: ${
|
|
19
|
+
`),console.log(" ".padEnd(60,"-")),console.log(` Workflow: ${s}`),console.log(` Project: ${t}`),Object.keys(i).length>0&&console.log(` Input: ${JSON.stringify(i).substring(0,50)}...`),e.idempotencyKey&&console.log(` Idempotency: ${e.idempotencyKey}`),console.log(" ".padEnd(60,"-")),console.log("");let d=w("Triggering workflow execution...").start();try{let l=y(),a={input:i};e.idempotencyKey&&(a.idempotencyKey=e.idempotencyKey);let g=await fetch(`${l}/projects/${t}/workflows/${s}/trigger`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(a)});if(!g.ok){let c=await g.json().catch(()=>({}));g.status===429&&(d.fail("Quota exceeded"),console.log(`
|
|
20
20
|
Your workflow execution quota has been exceeded`),c.quotaInfo&&(console.log(` Used: ${c.quotaInfo.used}/${c.quotaInfo.limit} executions`),console.log(` Plan: ${c.quotaInfo.planId}`),c.quotaInfo.periodEnd&&console.log(` Resets: ${new Date(c.quotaInfo.periodEnd).toLocaleDateString()}`)),console.log(""),process.exit(1)),d.fail("Trigger failed"),console.log(` Error: ${c.message||g.statusText}
|
|
21
|
-
`),process.exit(1)}let f=await g.json();d.succeed("Workflow triggered successfully"),console.log(""),console.log(" Job Details:"),console.log(` Job ID: ${f.jobId}`),console.log(` Status: ${f.status}`),console.log(` Version: ${f.version}`),console.log(` Triggered: ${new Date(f.triggeredAt).toLocaleString()}`),console.log(""),console.log(" Monitor execution:"),console.log(` zibby logs ${
|
|
22
|
-
`),process.exit(1)}}export{
|
|
21
|
+
`),process.exit(1)}let f=await g.json();d.succeed("Workflow triggered successfully"),console.log(""),console.log(" Job Details:"),console.log(` Job ID: ${f.jobId}`),console.log(` Status: ${f.status}`),console.log(` Version: ${f.version}`),console.log(` Triggered: ${new Date(f.triggeredAt).toLocaleString()}`),console.log(""),console.log(" Monitor execution:"),o&&n?(console.log(` zibby logs ${o}`),console.log(` zibby logs ${o} -t`)):(console.log(` zibby logs --workflow ${s} --project ${t}`),console.log(` zibby logs --workflow ${s} --project ${t} -t`)),console.log("")}catch(l){d.fail("Trigger failed"),console.log(` Error: ${l.message}
|
|
22
|
+
`),process.exit(1)}}export{L as triggerWorkflowCommand};
|
package/dist/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zibby/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.69",
|
|
4
4
|
"description": "Zibby CLI - Test automation generator and runner",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"zibby": "./bin/zibby.js"
|
|
7
|
+
"zibby": "./dist/bin/zibby.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "node ../scripts/build.mjs --extra-dirs bin",
|
|
@@ -52,8 +52,7 @@
|
|
|
52
52
|
"ws": "^8.20.0"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
55
|
-
"
|
|
56
|
-
"src/",
|
|
55
|
+
"dist/",
|
|
57
56
|
"README.md",
|
|
58
57
|
"LICENSE"
|
|
59
58
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zibby/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.69",
|
|
4
4
|
"description": "Zibby CLI - Test automation generator and runner",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -52,7 +52,6 @@
|
|
|
52
52
|
"ws": "^8.20.0"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
55
|
-
"dist/bin/",
|
|
56
55
|
"dist/",
|
|
57
56
|
"README.md",
|
|
58
57
|
"LICENSE"
|