@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.
@@ -1,42 +1,38 @@
1
- import o from"chalk";import{readFileSync as T,existsSync as I}from"fs";import{homedir as E}from"os";import{join as j}from"path";var $="https://logs.workflows.zibby.app";function R(n){let r=j(E(),".zibby","config.json");I(r)||(console.log(o.red(`
2
- Not authenticated`)),console.log(o.gray(` Run: zibby login
3
- `)),process.exit(1));let t;try{t=JSON.parse(T(r,"utf-8"))}catch{console.log(o.red(`
4
- Config file corrupt`)),console.log(o.gray(` Run: zibby login
5
- `)),process.exit(1)}let l=t.sessionToken;l||(console.log(o.red(`
6
- Not authenticated`)),console.log(o.gray(` Run: zibby login
7
- `)),process.exit(1));let c=n.project;return{token:l,projectId:c}}function x(n){return new Date(n).toISOString().replace("T"," ").replace("Z","")}function C(n){return n==="running"?o.yellow(n):n==="completed"?o.green(n):o.red(n||"unknown")}function h(n){return n?.length>16?n.slice(0,16):n}async function S(n,r){let t=await fetch(n,{headers:{Authorization:`Bearer ${r}`}});if(!t.ok){let l=await t.text();throw new Error(`API ${t.status}: ${l}`)}return t.json()}async function P(n,r,t,l){if(n)return n;l||(console.log(o.red(`
8
- Job ID or --project is required`)),console.log(o.gray(" Usage: zibby logs <uuid>")),console.log(o.gray(` zibby logs --workflow ticket-triage --project <id>
9
- `)),process.exit(1));let c=r.workflow;c||(console.log(o.red(`
10
- Job ID or --workflow is required`)),console.log(o.gray(" Usage: zibby logs <uuid>")),console.log(o.gray(" zibby logs --workflow ticket-triage --project <id>")),console.log(o.gray(` zibby logs --workflow ticket-triage --all --project <id>
11
- `)),process.exit(1));let u=new URLSearchParams({workflow:c,limit:"10"}),{jobs:a}=await S(`${$}/jobs/${l}?${u}`,t);(!a||a.length===0)&&(console.log(o.yellow(`
12
- No jobs found for workflow "${c}".`)),process.exit(0)),console.log(o.gray(`
13
- Recent runs for ${o.cyan(c)}:
14
- `));for(let m of a.slice(0,5))console.log(o.gray(` ${h(m.jobId)} ${C(m.status)} ${m.createdAt||""}`));let i=a[0];return console.log(o.gray(`
15
- Tailing latest: ${o.cyan(h(i.jobId))}
16
- `)),i.jobId}async function z({token:n,projectId:r,workflowUuid:t,follow:l,limit:c}){console.log(o.gray(` Tailing all executions for workflow ${o.cyan(t)}...`)),console.log(o.gray(" Showing live logs from all runs (interleaved by timestamp).")),console.log(o.gray(` Press Ctrl+C to stop.
17
- `));let u=new Set,a=new Set,i=null,m=!1,d=0,b=5,w=()=>{m=!0,console.log(o.gray(`
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",w),process.on("SIGTERM",w);!m;)try{let y=r?`${$}/logs/${r}/${t}`:`${$}/job/${t}`,p=new URLSearchParams({limit:String(c)}),s=await S(`${y}?${p}`,n);if(d=0,s.executions)for(let e of s.executions)a.has(e.jobId)||(a.size>0&&console.log(o.yellow(`
20
- \u26A1 New execution: ${h(e.jobId)}
21
- `)),a.add(e.jobId));let g=[];for(let e of s.lines||[]){let f=`${e.jobId}:${e.timestamp}:${e.message}`;u.has(f)||(u.add(f),g.push(e))}g.sort((e,f)=>e.timestamp-f.timestamp);for(let e of g){let f=e.jobId||e.executionId;f!==i&&(i!==null&&console.log(""),console.log(o.dim(` \u2500\u2500 Execution: ${h(f)} \u2500\u2500`)),i=f);let k=o.gray(x(e.timestamp));console.log(`${k} ${e.message.replace(/\n$/,"")}`)}if(!l)break;await new Promise(e=>setTimeout(e,2e3))}catch(y){if(y.name==="AbortError")break;d++,console.error(o.red(` Error: ${y.message}`)),d>=b&&(console.error(o.red(`
22
- Too many consecutive errors (${b}). Stopping.
23
- `)),process.exit(1)),l||process.exit(1),await new Promise(p=>setTimeout(p,3e3))}}async function A({token:n,projectId:r,jobId:t,follow:l,limit:c}){let u=r?`${$}/logs/${r}/${t}`:`${$}/job/${t}`,a=null,i=0,m=new Set,d=!1,b=0,w=5,y=()=>{d=!0,console.log(o.gray(`
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",y),process.on("SIGTERM",y),console.log(o.gray(` Tailing logs for job ${o.cyan(t)}...`)),console.log(l?o.gray(` Press Ctrl+C to stop.
26
- `):"");!d;)try{let p=new URLSearchParams({limit:String(c)});a&&p.set("nextToken",a);let s=await S(`${u}?${p}`,n);b=0,s.message&&s.lines?.length===0&&i===0&&console.log(o.gray(` ${s.message}`)),s.status==="starting"&&s.lines?.length===0&&i===0&&console.log(o.gray(" Container starting..."));for(let e of s.lines||[]){let f=`${e.timestamp}:${e.message}`;if(m.has(f))continue;m.add(f);let k=o.gray(x(e.timestamp));console.log(`${k} ${e.message.replace(/\n$/,"")}`)}if(i=s.lines?.length>0?0:i+1,a=s.nextForwardToken||null,s.status==="completed"||s.status==="failed"){let e=s.status==="completed"?o.green:o.red;console.log(e(`
27
- Job ${s.status}.`)),process.exit(s.status==="completed"?0:1)}if(!l){s.status&&console.log(o.gray(`
28
- Status: ${s.status}`));break}await new Promise(e=>setTimeout(e,i>5?5e3:2e3))}catch(p){if(p.name==="AbortError")break;b++,console.error(o.red(` Error: ${p.message}`)),b>=w&&(console.error(o.red(`
29
- Too many consecutive errors (${w}). Stopping.
30
- `)),process.exit(1)),l||process.exit(1),await new Promise(s=>setTimeout(s,3e3))}}async function U({token:n,projectId:r,workflow:t,follow:l,limit:c}){let u=`${$}/all/${r}`,a=null,i=0,m=new Set,d=null,b=!1,w=0,y=5,p=()=>{b=!0,console.log(o.gray(`
31
- Stopped tailing.
32
- `)),process.exit(0)};for(process.on("SIGINT",p),process.on("SIGTERM",p),console.log(o.gray(`
33
- Tailing all runs for ${o.cyan(t)}...`)),console.log(l?o.gray(` Press Ctrl+C to stop.
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 j from"ora";import{select as m}from"@inquirer/prompts";import{readFileSync as U,existsSync as v}from"fs";import{homedir as B}from"os";import{join as _}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 b(){let o=_(B(),".zibby","config.json");if(v(o))try{let s=JSON.parse(U(o,"utf-8"));if(s.sessionToken)return s.sessionToken}catch{}let e=process.env.ZIBBY_API_KEY;if(e)return e;console.log(`
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(),s=j("Fetching projects...").start();try{let p=await fetch(`${e}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}});p.ok||(s.fail("Failed to fetch projects"),process.exit(1));let t=await p.json();Array.isArray(t)||(t.projects?t=t.projects:t.data&&(t=t.data)),(!t||t.length===0)&&(s.fail("No projects found"),process.exit(1)),s.succeed(`Found ${t.length} project${t.length===1?"":"s"}`),console.log("");let n=t.map(r=>({name:`${r.name||"Unnamed"} (${r.projectId||r.id})`,value:r.projectId||r.id}));return await m({message:"Select a project:",choices:n})}catch(p){s.fail(`Error: ${p.message}`),process.exit(1)}}async function k(o,e){let s=y(),p=j("Fetching deployed workflows...").start();try{let t=["analysis","implementation","run_test"],n=[];for(let l of t){let d=await fetch(`${s}/projects/${o}/workflows/${l}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(d.ok){let i=await d.json();i.graph&&n.push({name:l,version:i.version||0,isDefault:i.isDefault!==!1})}}n.length===0&&(p.fail("No deployed workflows found for this project"),process.exit(1)),p.succeed(`Found ${n.length} deployed workflow${n.length===1?"":"s"}`),console.log("");let r=n.map(l=>({name:`${l.name} (v${l.version})${l.isDefault?" [default]":""}`,value:l.name}));return await m({message:"Select a workflow to trigger:",choices:r})}catch(t){p.fail(`Error: ${t.message}`),process.exit(1)}}async function Y(o,e={}){let s=b(),t=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(o),n=e.project||process.env.ZIBBY_PROJECT_ID,r=o;if(o&&t){let i=y();try{let a=await fetch(`${i}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`}});if(a.ok){let f=(await a.json()).projects||[];for(let c of f){let u=await fetch(`${i}/projects/${c.projectId}/workflows`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`}});if(u.ok){let I=(await u.json()).find(w=>w.uuid===o);if(I){n=c.projectId,r=I.workflowType||I.name,console.log(`
4
- \u2713 Found workflow "${r}" (UUID: ${o})
5
- `);break}}}(!r||r===o)&&(console.log(`
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&&!n){let i=y();try{let a=await fetch(`${i}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`}});if(a.ok){let f=(await a.json()).projects||[],c=[];for(let u of f){let h=await fetch(`${i}/projects/${u.projectId}/workflows`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`}});h.ok&&(await h.json()).some(w=>w.workflowType===o)&&c.push(u)}if(c.length===1)n=c[0].projectId,console.log(`
10
- \u2713 Found workflow "${o}" in project: ${c[0].name||n}
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}));n=await m({message:"Select a project:",choices:u})}else console.log(`
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{}}n||(console.log(""),n=await E(s)),r||(console.log(""),r=await k(n,s));let l={};if(e.input)try{l=JSON.parse(e.input)}catch(i){console.log(`
16
- Error: Invalid JSON in --input`),console.log(` ${i.message}
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: ${r}`),console.log(` Project: ${n}`),Object.keys(l).length>0&&console.log(` Input: ${JSON.stringify(l).substring(0,50)}...`),e.idempotencyKey&&console.log(` Idempotency: ${e.idempotencyKey}`),console.log(" ".padEnd(60,"-")),console.log("");let d=j("Triggering workflow execution...").start();try{let i=y(),a={input:l};e.idempotencyKey&&(a.idempotencyKey=e.idempotencyKey);let g=await fetch(`${i}/projects/${n}/workflows/${r}/trigger`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify(a)});if(!g.ok){let c=await g.json().catch(()=>({}));g.status===429&&(d.fail("Quota exceeded"),console.log(`
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 ${f.jobId}`),console.log(` zibby logs --workflow ${r}`),console.log("")}catch(i){d.fail("Trigger failed"),console.log(` Error: ${i.message}
22
- `),process.exit(1)}}export{Y as triggerWorkflowCommand};
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.66",
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
- "bin/",
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.66",
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"