@zibby/cli 0.1.80 → 0.1.81

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,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import{mkdirSync as F,writeFileSync as L,existsSync as T}from"fs";import{join as w,dirname as W,resolve as h}from"path";import{pathToFileURL as K}from"url";import{SQSClient as N,SendMessageCommand as C}from"@aws-sdk/client-sqs";var g=null;function v(){return g||(g=new N({region:process.env.AWS_REGION||"ap-southeast-2"})),g}async function P(s,{status:e,error:o}){let{EXECUTION_ID:t,SQS_AUTH_TOKEN:r,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:n,PROJECT_API_TOKEN:d}=s;if(!t)return;let l={executionId:t,...r&&{sqsAuthToken:r},status:e,...o&&{error:o},timestamp:new Date().toISOString()},p=i?"HTTP":n?"SQS":"NONE",f=JSON.stringify(l).length;console.log(`Sending final status: ${e} via ${p} (${(f/1024).toFixed(1)}KB)`);try{if(i)await k(i,t,l,d);else if(n){let c=["completed","failed","insufficient_context","blocked"].includes(e)?"execution_completed":"progress_update";await x(n,t,l,c)}else{console.warn("No transport configured for final status \u2014 neither PROGRESS_API_URL nor PROGRESS_QUEUE_URL set");return}console.log(`Final status ${e} sent via ${p}`)}catch(c){console.error(`Failed to send final status (${e}) via ${p}:`),console.error(` Payload: ${(f/1024).toFixed(1)}KB`),console.error(` Error: ${c.message}`),c.name&&console.error(` Error type: ${c.name}`),c.code&&console.error(` Error code: ${c.code}`)}}async function k(s,e,o,t){let r=`${s}/${e}/progress`,i={"Content-Type":"application/json"};t&&(i.Authorization=`Bearer ${t}`);let n=await fetch(r,{method:"POST",headers:i,body:JSON.stringify(o)});if(!n.ok){let d=await n.text();throw new Error(`HTTP ${n.status}: ${d}`)}}async function x(s,e,o,t="progress_update"){let r=JSON.stringify(o),i=(r.length/1024).toFixed(1);r.length>256*1024&&console.error(`\u274C SQS message too large: ${i}KB (limit 256KB) for ${e} [${t}]`),await v().send(new C({QueueUrl:s,MessageBody:r,MessageGroupId:e,MessageAttributes:{executionId:{DataType:"String",StringValue:e},messageType:{DataType:"String",StringValue:t}}}))}var y=process.env.WORKSPACE||"/workspace";async function D(){let s=process.env.WORKFLOW_SOURCES_URL;if(!s)throw new Error("WORKFLOW_SOURCES_URL env var is required");console.log("Fetching workflow sources via pre-signed URL...");let e=await fetch(s);if(!e.ok)throw new Error(`Failed to fetch sources: ${e.status} ${e.statusText}`);let o=await e.json();if(!o.sources||typeof o.sources!="object")throw new Error('Invalid sources payload \u2014 missing "sources" map');return o}function b(s,e){let o=h(e),t=0;for(let[r,i]of Object.entries(s)){let n=h(e,r);if(!n.startsWith(`${o}/`)&&n!==o){console.error(` \u26D4 Skipping unsafe path: ${r}`);continue}F(W(n),{recursive:!0}),L(n,i,"utf-8"),t++}return t}async function G(s,e){let o=w(s,"graph.mjs");if(!T(o))throw new Error(`graph.mjs not found at ${o}`);let t=await import(K(o).href),r=e?.entryClass,i=r&&t[r]||t.default||Object.values(t).find(n=>typeof n=="function"&&n.prototype?.buildGraph);if(!i)throw new Error("No WorkflowAgent class found in graph.mjs");return i}async function z(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let a=await import("module");a.default._initPaths&&a.default._initPaths()}let{WORKFLOW_JOB_ID:s,WORKFLOW_TYPE:e,PROJECT_ID:o,AGENT_TYPE:t,MODEL:r}=process.env;e||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1)),console.log(`
3
- Zibby Custom Workflow Runner`),console.log(` Job: ${s||"local"}`),console.log(` Workflow: ${e}`),console.log(` Project: ${o||"none"}`),console.log(` Agent: ${t||"default"}`),console.log(` Model: ${r||"auto"}`),console.log("\u2500".repeat(60));let i=await D(),{sources:n,input:d,workflowType:l,version:p}=i;console.log(` Workflow v${p||"?"} \u2014 ${Object.keys(n).length} source files`);let f=w(y,".zibby","workflows",l||e),c=b(n,f);console.log(` Wrote ${c} files to ${f}`),console.log(" Installing dependencies...");let{execSync:U}=await import("child_process");try{U("npm install --silent --no-audit --no-fund",{cwd:f,stdio:"inherit"}),console.log(" Dependencies installed")}catch(a){console.warn(` npm install failed: ${a.message}`)}let _={},O=w(f,"workflow.json");if(T(O)){let{readFileSync:a}=await import("fs");_=JSON.parse(a(O,"utf-8"))}let m=await G(f,_);console.log(` Loaded ${m.name}`);let I=Date.now(),u=new m({workflow:l||e}),R=u.buildGraph(),A={input:d||{},cwd:y,runId:s||`run-${Date.now()}`};console.log(`
2
+ import{mkdirSync as _,writeFileSync as D,existsSync as U,createWriteStream as Q}from"fs";import{join as p,dirname as I,resolve as P}from"path";import{pathToFileURL as J}from"url";import{execSync as A}from"node:child_process";import{Readable as j}from"node:stream";import{pipeline as H}from"node:stream/promises";import{SQSClient as W,SendMessageCommand as L}from"@aws-sdk/client-sqs";var w=null;function K(){return w||(w=new W({region:process.env.AWS_REGION||"ap-southeast-2"})),w}async function y(r,{status:e,error:o}){let{EXECUTION_ID:n,SQS_AUTH_TOKEN:i,PROGRESS_API_URL:a,PROGRESS_QUEUE_URL:t,PROJECT_API_TOKEN:f}=r;if(!n)return;let c={executionId:n,...i&&{sqsAuthToken:i},status:e,...o&&{error:o},timestamp:new Date().toISOString()},d=a?"HTTP":t?"SQS":"NONE",u=JSON.stringify(c).length;console.log(`Sending final status: ${e} via ${d} (${(u/1024).toFixed(1)}KB)`);try{if(a)await B(a,n,c,f);else if(t){let l=["completed","failed","insufficient_context","blocked"].includes(e)?"execution_completed":"progress_update";await G(t,n,c,l)}else{console.warn("No transport configured for final status \u2014 neither PROGRESS_API_URL nor PROGRESS_QUEUE_URL set");return}console.log(`Final status ${e} sent via ${d}`)}catch(l){console.error(`Failed to send final status (${e}) via ${d}:`),console.error(` Payload: ${(u/1024).toFixed(1)}KB`),console.error(` Error: ${l.message}`),l.name&&console.error(` Error type: ${l.name}`),l.code&&console.error(` Error code: ${l.code}`)}}async function B(r,e,o,n){let i=`${r}/${e}/progress`,a={"Content-Type":"application/json"};n&&(a.Authorization=`Bearer ${n}`);let t=await fetch(i,{method:"POST",headers:a,body:JSON.stringify(o)});if(!t.ok){let f=await t.text();throw new Error(`HTTP ${t.status}: ${f}`)}}async function G(r,e,o,n="progress_update"){let i=JSON.stringify(o),a=(i.length/1024).toFixed(1);i.length>256*1024&&console.error(`\u274C SQS message too large: ${a}KB (limit 256KB) for ${e} [${n}]`),await K().send(new L({QueueUrl:r,MessageBody:i,MessageGroupId:e,MessageAttributes:{executionId:{DataType:"String",StringValue:e},messageType:{DataType:"String",StringValue:n}}}))}var E=process.env.WORKSPACE||"/workspace";async function z(r,e){console.log("Fetching pre-built bundle...");let o=await fetch(r);if(!o.ok)throw new Error(`Failed to fetch bundle: ${o.status} ${o.statusText}`);_(e,{recursive:!0});let n=p(e,"..","bundle.tgz");return _(I(n),{recursive:!0}),await H(j.fromWeb(o.body),Q(n)),A(`tar -xzf ${n} -C ${e}`,{stdio:"inherit"}),e}async function T(){let r=process.env.WORKFLOW_SOURCES_URL;if(!r)throw new Error("WORKFLOW_SOURCES_URL env var is required");console.log("Fetching workflow sources via pre-signed URL...");let e=await fetch(r);if(!e.ok)throw new Error(`Failed to fetch sources: ${e.status} ${e.statusText}`);let o=await e.json();if(!o.sources||typeof o.sources!="object")throw new Error('Invalid sources payload \u2014 missing "sources" map');return o}function M(r,e){let o=P(e),n=0;for(let[i,a]of Object.entries(r)){let t=P(e,i);if(!t.startsWith(`${o}/`)&&t!==o){console.error(` \u26D4 Skipping unsafe path: ${i}`);continue}_(I(t),{recursive:!0}),D(t,a,"utf-8"),n++}return n}async function q(r,e){let o=p(r,"graph.mjs");if(!U(o))throw new Error(`graph.mjs not found at ${o}`);let n=await import(J(o).href),i=e?.entryClass,a=i&&n[i]||n.default||Object.values(n).find(t=>typeof t=="function"&&t.prototype?.buildGraph);if(!a)throw new Error("No WorkflowAgent class found in graph.mjs");return a}async function ie(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let s=await import("module");s.default._initPaths&&s.default._initPaths()}let{WORKFLOW_JOB_ID:r,WORKFLOW_TYPE:e,PROJECT_ID:o,AGENT_TYPE:n,MODEL:i}=process.env;e||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1)),console.log(`
3
+ Zibby Custom Workflow Runner`),console.log(` Job: ${r||"local"}`),console.log(` Workflow: ${e}`),console.log(` Project: ${o||"none"}`),console.log(` Agent: ${n||"default"}`),console.log(` Model: ${i||"auto"}`),console.log("\u2500".repeat(60));let a=process.env.WORKFLOW_BUNDLE_URL,t,f={},c,d;if(a){c=e,t=p(E,".zibby","workflows",c);try{await z(a,t),console.log(" Extracted pre-built bundle (no npm install needed)");try{let s=await T();f=s.input||{},d=s.version}catch(s){console.warn(` Could not fetch input payload: ${s.message}`)}}catch(s){console.warn(` Bundle extract failed (${s.message}); falling back to source install`),t=null}}if(!t){let s=await T(),{sources:h,input:N,workflowType:k,version:x}=s;f=N||{},c=k||e,d=x,console.log(` Workflow v${d||"?"} \u2014 ${Object.keys(h).length} source files`),t=p(E,".zibby","workflows",c);let C=M(h,t);console.log(` Wrote ${C} files to ${t}`),console.log(" Installing dependencies...");try{A("npm install --silent --no-audit --no-fund",{cwd:t,stdio:"inherit"}),console.log(" Dependencies installed")}catch(F){console.warn(` npm install failed: ${F.message}`)}}let u={},l=p(t,"workflow.json");if(U(l)){let{readFileSync:s}=await import("fs");u=JSON.parse(s(l,"utf-8"))}let O=await q(t,u);console.log(` Loaded ${O.name}`);let v=Date.now(),g=new O({workflow:c||e}),R=g.buildGraph(),b={input:f||{},cwd:E,runId:r||`run-${Date.now()}`};console.log(`
4
4
  Running graph (${R.nodes?.size||"?"} nodes)...
5
- `);let S;try{S=await R.run(u,A)}catch(a){console.error(`
6
- Workflow execution failed: ${a.message}`),console.error(a.stack),await E("failed",a.message),process.exit(1)}let $=((Date.now()-I)/1e3).toFixed(1);S?.success!==!1?(console.log(`
7
- Workflow "${l||e}" completed in ${$}s`),await E("completed")):(console.error(`
8
- Workflow "${l||e}" failed after ${$}s`),await E("failed",S?.error||"Workflow execution failed"),process.exit(1)),u.onComplete&&await u.onComplete(S)}async function E(s,e=null){let o={EXECUTION_ID:process.env.WORKFLOW_JOB_ID,PROGRESS_API_URL:process.env.PROGRESS_API_URL,PROGRESS_QUEUE_URL:process.env.PROGRESS_QUEUE_URL,PROJECT_API_TOKEN:process.env.PROJECT_API_TOKEN,SQS_AUTH_TOKEN:process.env.SQS_AUTH_TOKEN};if(o.EXECUTION_ID)try{await P(o,{status:s,...e&&{error:e}})}catch(t){console.error(`\u26A0\uFE0F Failed to report status: ${t.message}`)}}export{z as runWorkflowCommand};
5
+ `);let S;try{S=await R.run(g,b)}catch(s){console.error(`
6
+ Workflow execution failed: ${s.message}`),console.error(s.stack),await m("failed",s.message),process.exit(1)}let $=((Date.now()-v)/1e3).toFixed(1);S?.success!==!1?(console.log(`
7
+ Workflow "${c||e}" completed in ${$}s`),await m("completed")):(console.error(`
8
+ Workflow "${c||e}" failed after ${$}s`),await m("failed",S?.error||"Workflow execution failed"),process.exit(1)),g.onComplete&&await g.onComplete(S)}async function m(r,e=null){let o={EXECUTION_ID:process.env.WORKFLOW_JOB_ID,PROGRESS_API_URL:process.env.PROGRESS_API_URL,PROGRESS_QUEUE_URL:process.env.PROGRESS_QUEUE_URL,PROJECT_API_TOKEN:process.env.PROJECT_API_TOKEN,SQS_AUTH_TOKEN:process.env.SQS_AUTH_TOKEN};if(o.EXECUTION_ID)try{await y(o,{status:r,...e&&{error:e}})}catch(n){console.error(`\u26A0\uFE0F Failed to report status: ${n.message}`)}}export{ie as runWorkflowCommand};
@@ -1,7 +1,7 @@
1
1
  import{existsSync as y}from"fs";import{readFile as j}from"fs/promises";import{join as m}from"path";import{pathToFileURL as E}from"url";import o from"chalk";import T from"ora";var W=3848;function S(e){let n=process.cwd();return m(n,".zibby","workflows",e)}async function z(e,n){let t=m(e,"graph.mjs");if(!y(t))throw new Error(`graph.mjs not found in .zibby/workflows/${n}/`);let l=await O(e,n),a=await import(E(t).href),s=l.entryClass,i=s&&a[s]||a.default||Object.values(a).find(r=>typeof r=="function"&&r.prototype?.buildGraph);if(!i)throw new Error("No WorkflowAgent class found in graph.mjs. Export a class with buildGraph() method.");return{AgentClass:i,manifest:l}}async function O(e,n){let t=m(e,"workflow.json");if(!y(t))return{name:n,triggers:{api:!0}};let l=await j(t,"utf-8");return JSON.parse(l)}async function A(e,n){e||(console.log(o.red(`
2
- Workflow name is required`)),console.log(o.gray(" Usage: zibby start <workflow-name>")),console.log(o.gray(` Example: zibby start ticket-triage
2
+ Workflow name is required`)),console.log(o.gray(" Usage: zibby workflow start <workflow-name>")),console.log(o.gray(` Example: zibby workflow start ticket-triage
3
3
  `)),process.exit(1));let t=e.toLowerCase(),l=S(t);y(l)||(console.log(o.red(`
4
- Workflow not found: .zibby/workflows/${t}/`)),console.log(o.gray(" Create one first:")),console.log(o.cyan(` zibby g workflow ${t}
4
+ Workflow not found: .zibby/workflows/${t}/`)),console.log(o.gray(" Create one first:")),console.log(o.cyan(` zibby workflow new ${t}
5
5
  `)),process.exit(1));let a=T(` Loading workflow "${t}"...`).start(),s,i;try{({AgentClass:s,manifest:i}=await z(l,t)),a.succeed(` Loaded ${o.bold(i.entryClass||s.name)} (${t})`)}catch(g){a.fail(" Failed to load workflow"),console.log(o.red(`
6
6
  ${g.message}
7
7
  `)),process.exit(1)}let r=parseInt(n.port,10)||W,f;try{f=(await import("express")).default}catch{console.log(o.red(`
@@ -1 +1 @@
1
- var t=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function e(r){return r?t.test(r)?{ok:!0}:{ok:!1,error:`'${r}' is not a UUID. Cloud workflows are identified by UUID only. Run \`zibby workflow list\` to find yours, or run \`zibby trigger\` with no argument for interactive selection.`}:{ok:!0}}export{t as TRIGGER_UUID_REGEX,e as validateTriggerUuid};
1
+ var o=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function t(r){return r?o.test(r)?{ok:!0}:{ok:!1,error:`'${r}' is not a UUID. Cloud workflows are identified by UUID only. Run \`zibby workflow list\` to find yours, or run \`zibby workflow trigger\` with no argument for interactive selection.`}:{ok:!0}}export{o as TRIGGER_UUID_REGEX,t as validateTriggerUuid};
@@ -1,22 +1,22 @@
1
- import y from"ora";import{select as I}from"@inquirer/prompts";import{readFileSync as $,existsSync as U}from"fs";import{homedir as k}from"os";import{join as j,resolve as _}from"path";var g={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 u(){let o;if(process.env.ZIBBY_API_URL)o=process.env.ZIBBY_API_URL;else{let e=process.env.ZIBBY_ENV||"prod";g[e]?o=g[e].apiUrl:o=g.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)`),g.prod.apiUrl):o}catch{return console.error(`\u26A0\uFE0F Invalid API URL: ${o}`),g.prod.apiUrl}}var b=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function m(o){return o?b.test(o)?{ok:!0}:{ok:!1,error:`'${o}' is not a UUID. Cloud workflows are identified by UUID only. Run \`zibby workflow list\` to find yours, or run \`zibby trigger\` with no argument for interactive selection.`}:{ok:!0}}function B(o){return o==="true"?!0:o==="false"?!1:o==="null"?null:o!==""&&!isNaN(Number(o))?Number(o):o}function E(o){let e={};for(let r of o||[]){let i=r.indexOf("=");if(i===-1){console.warn(` Warning: ignored param "${r}" \u2014 expected key=value format`);continue}let t=r.slice(0,i).trim(),n=B(r.slice(i+1)),c=t.split("."),l=e;for(let s=0;s<c.length-1;s++)(typeof l[c[s]]!="object"||l[c[s]]===null)&&(l[c[s]]={}),l=l[c[s]];l[c[c.length-1]]=n}return e}function N(o){let e=_(o);U(e)||(console.log(`
1
+ import h from"ora";import{select as I}from"@inquirer/prompts";import{readFileSync as $,existsSync as U}from"fs";import{homedir as b}from"os";import{join as j,resolve as _}from"path";var g={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 u(){let o;if(process.env.ZIBBY_API_URL)o=process.env.ZIBBY_API_URL;else{let e=process.env.ZIBBY_ENV||"prod";g[e]?o=g[e].apiUrl:o=g.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)`),g.prod.apiUrl):o}catch{return console.error(`\u26A0\uFE0F Invalid API URL: ${o}`),g.prod.apiUrl}}var v=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function m(o){return o?v.test(o)?{ok:!0}:{ok:!1,error:`'${o}' is not a UUID. Cloud workflows are identified by UUID only. Run \`zibby workflow list\` to find yours, or run \`zibby workflow trigger\` with no argument for interactive selection.`}:{ok:!0}}function B(o){return o==="true"?!0:o==="false"?!1:o==="null"?null:o!==""&&!isNaN(Number(o))?Number(o):o}function E(o){let e={};for(let r of o||[]){let i=r.indexOf("=");if(i===-1){console.warn(` Warning: ignored param "${r}" \u2014 expected key=value format`);continue}let t=r.slice(0,i).trim(),n=B(r.slice(i+1)),l=t.split("."),c=e;for(let s=0;s<l.length-1;s++)(typeof c[l[s]]!="object"||c[l[s]]===null)&&(c[l[s]]={}),c=c[l[s]];c[l[l.length-1]]=n}return e}function N(o){let e=_(o);U(e)||(console.log(`
2
2
  Error: --input-file not found: ${o}
3
3
  `),process.exit(1));try{return JSON.parse($(e,"utf-8"))}catch(r){console.log(`
4
4
  Error: --input-file is not valid JSON: ${r.message}
5
5
  `),process.exit(1)}}function x(o){let e={};if(o.inputFile&&(e={...N(o.inputFile)}),o.input)try{e={...e,...JSON.parse(o.input)}}catch(r){console.log(`
6
6
  Error: --input is not valid JSON`),console.log(` ${r.message}
7
- `),process.exit(1)}return o.param?.length&&(e={...e,...E(o.param)}),e}function R(){let o=j(k(),".zibby","config.json");if(U(o))try{let r=JSON.parse($(o,"utf-8"));if(r.sessionToken)return r.sessionToken}catch{}let e=process.env.ZIBBY_API_KEY;if(e)return e;console.log(`
7
+ `),process.exit(1)}return o.param?.length&&(e={...e,...E(o.param)}),e}function R(){let o=j(b(),".zibby","config.json");if(U(o))try{let r=JSON.parse($(o,"utf-8"));if(r.sessionToken)return r.sessionToken}catch{}let e=process.env.ZIBBY_API_KEY;if(e)return e;console.log(`
8
8
  Not authenticated`),console.log(" Run: zibby login"),console.log(` OR set ZIBBY_API_KEY env var (for CI/CD)
9
- `),process.exit(1)}async function T(o){let e=u(),r=y("Fetching projects...").start();try{let i=await fetch(`${e}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}});i.ok||(r.fail("Failed to fetch projects"),process.exit(1));let t=await i.json();Array.isArray(t)||(t.projects?t=t.projects:t.data&&(t=t.data)),(!t||t.length===0)&&(r.fail("No projects found"),process.exit(1)),r.succeed(`Found ${t.length} project${t.length===1?"":"s"}`),console.log("");let n=t.map(c=>({name:`${c.name||"Unnamed"} (${c.projectId||c.id})`,value:c.projectId||c.id}));return await I({message:"Select a project:",choices:n})}catch(i){r.fail(`Error: ${i.message}`),process.exit(1)}}async function A(o,e){let r=u(),i=y("Fetching deployed workflows...").start();try{let t=["analysis","implementation","run_test"],n=[];for(let l of t){let s=await fetch(`${r}/projects/${o}/workflows/${l}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(s.ok){let a=await s.json();a.graph&&n.push({name:l,version:a.version||0,isDefault:a.isDefault!==!1})}}n.length===0&&(i.fail("No deployed workflows found for this project"),process.exit(1)),i.succeed(`Found ${n.length} deployed workflow${n.length===1?"":"s"}`),console.log("");let c=n.map(l=>({name:`${l.name} (v${l.version})${l.isDefault?" [default]":""}`,value:l.name}));return await I({message:"Select a workflow to trigger:",choices:c})}catch(t){i.fail(`Error: ${t.message}`),process.exit(1)}}async function J(o,e={}){let r=m(o);r.ok||(console.log(`
9
+ `),process.exit(1)}async function T(o){let e=u(),r=h("Fetching projects...").start();try{let i=await fetch(`${e}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}});i.ok||(r.fail("Failed to fetch projects"),process.exit(1));let t=await i.json();Array.isArray(t)||(t.projects?t=t.projects:t.data&&(t=t.data)),(!t||t.length===0)&&(r.fail("No projects found"),process.exit(1)),r.succeed(`Found ${t.length} project${t.length===1?"":"s"}`),console.log("");let n=t.map(l=>({name:`${l.name||"Unnamed"} (${l.projectId||l.id})`,value:l.projectId||l.id}));return await I({message:"Select a project:",choices:n})}catch(i){r.fail(`Error: ${i.message}`),process.exit(1)}}async function A(o,e){let r=u(),i=h("Fetching deployed workflows...").start();try{let t=["analysis","implementation","run_test"],n=[];for(let c of t){let s=await fetch(`${r}/projects/${o}/workflows/${c}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(s.ok){let a=await s.json();a.graph&&n.push({name:c,version:a.version||0,isDefault:a.isDefault!==!1})}}n.length===0&&(i.fail("No deployed workflows found for this project"),process.exit(1)),i.succeed(`Found ${n.length} deployed workflow${n.length===1?"":"s"}`),console.log("");let l=n.map(c=>({name:`${c.name} (v${c.version})${c.isDefault?" [default]":""}`,value:c.name}));return await I({message:"Select a workflow to trigger:",choices:l})}catch(t){i.fail(`Error: ${t.message}`),process.exit(1)}}async function J(o,e={}){let r=m(o);r.ok||(console.log(`
10
10
  Error: ${r.error}
11
- `),process.exit(1));let i=R(),t=e.project||process.env.ZIBBY_PROJECT_ID,n;if(o){let s=u();try{let a=await fetch(`${s}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}});if(a.ok){let d=(await a.json()).projects||[];for(let p of d){let w=await fetch(`${s}/projects/${p.projectId}/workflows`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}});if(w.ok){let h=(await w.json()).find(v=>v.uuid===o);if(h){t=p.projectId,n=h.workflowType||h.name,console.log(`
11
+ `),process.exit(1));let i=R(),t=e.project||process.env.ZIBBY_PROJECT_ID,n;if(o){let s=u();try{let a=await fetch(`${s}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}});if(a.ok){let d=(await a.json()).projects||[];for(let p of d){let y=await fetch(`${s}/projects/${p.projectId}/workflows`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}});if(y.ok){let w=(await y.json()).find(k=>k.uuid===o);if(w){t=p.projectId,n=w.workflowType||w.name,console.log(`
12
12
  \u2713 Found workflow "${n}" (UUID: ${o})
13
13
  `);break}}}(!n||n===o)&&(console.log(`
14
14
  Error: Workflow with UUID "${o}" not found`),console.log(` Check: zibby workflow list
15
15
  `),process.exit(1))}}catch(a){console.log(`
16
16
  Error looking up workflow UUID: ${a.message}
17
- `),process.exit(1)}}t||(console.log(""),t=await T(i)),n||(console.log(""),n=await A(t,i));let c=x(e);if(console.log(`
17
+ `),process.exit(1)}}t||(console.log(""),t=await T(i)),n||(console.log(""),n=await A(t,i));let l=x(e);if(console.log(`
18
18
  Triggering Workflow
19
- `),console.log(" ".padEnd(60,"-")),console.log(` Workflow: ${n}`),console.log(` Project: ${t}`),Object.keys(c).length>0){let s=JSON.stringify(c);console.log(` Input: ${s.length>60?`${s.substring(0,57)}...`:s}`)}e.idempotencyKey&&console.log(` Idempotency: ${e.idempotencyKey}`),console.log(" ".padEnd(60,"-")),console.log("");let l=y("Triggering workflow execution...").start();try{let s=u(),a={input:c};e.idempotencyKey&&(a.idempotencyKey=e.idempotencyKey);let f=await fetch(`${s}/projects/${t}/workflows/${n}/trigger`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(a)});if(!f.ok){let p=await f.json().catch(()=>({}));f.status===429&&(l.fail("Quota exceeded"),console.log(`
20
- Your workflow execution quota has been exceeded`),p.quotaInfo&&(console.log(` Used: ${p.quotaInfo.used}/${p.quotaInfo.limit} executions`),console.log(` Plan: ${p.quotaInfo.planId}`),p.quotaInfo.periodEnd&&console.log(` Resets: ${new Date(p.quotaInfo.periodEnd).toLocaleDateString()}`)),console.log(""),process.exit(1)),l.fail("Trigger failed"),console.log(` Error: ${p.message||f.statusText}
21
- `),process.exit(1)}let d=await f.json();l.succeed("Workflow triggered successfully"),console.log(""),console.log(" Job Details:"),console.log(` Job ID: ${d.jobId}`),console.log(` Status: ${d.status}`),console.log(` Version: ${d.version}`),console.log(` Triggered: ${new Date(d.triggeredAt).toLocaleString()}`),console.log(""),console.log(" Monitor execution:"),o?(console.log(` zibby logs ${o}`),console.log(` zibby logs ${o} -t`)):(console.log(` zibby logs --workflow ${n} --project ${t}`),console.log(` zibby logs --workflow ${n} --project ${t} -t`)),console.log("")}catch(s){l.fail("Trigger failed"),console.log(` Error: ${s.message}
19
+ `),console.log(" ".padEnd(60,"-")),console.log(` Workflow: ${n}`),console.log(` Project: ${t}`),Object.keys(l).length>0){let s=JSON.stringify(l);console.log(` Input: ${s.length>60?`${s.substring(0,57)}...`:s}`)}e.idempotencyKey&&console.log(` Idempotency: ${e.idempotencyKey}`),console.log(" ".padEnd(60,"-")),console.log("");let c=h("Triggering workflow execution...").start();try{let s=u(),a={input:l};e.idempotencyKey&&(a.idempotencyKey=e.idempotencyKey);let f=await fetch(`${s}/projects/${t}/workflows/${n}/trigger`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(a)});if(!f.ok){let p=await f.json().catch(()=>({}));f.status===429&&(c.fail("Quota exceeded"),console.log(`
20
+ Your workflow execution quota has been exceeded`),p.quotaInfo&&(console.log(` Used: ${p.quotaInfo.used}/${p.quotaInfo.limit} executions`),console.log(` Plan: ${p.quotaInfo.planId}`),p.quotaInfo.periodEnd&&console.log(` Resets: ${new Date(p.quotaInfo.periodEnd).toLocaleDateString()}`)),console.log(""),process.exit(1)),c.fail("Trigger failed"),console.log(` Error: ${p.message||f.statusText}
21
+ `),process.exit(1)}let d=await f.json();c.succeed("Workflow triggered successfully"),console.log(""),console.log(" Job Details:"),console.log(` Job ID: ${d.jobId}`),console.log(` Status: ${d.status}`),console.log(` Version: ${d.version}`),console.log(` Triggered: ${new Date(d.triggeredAt).toLocaleString()}`),console.log(""),console.log(" Monitor execution:"),o?(console.log(` zibby workflow logs ${o}`),console.log(` zibby workflow logs ${o} -t`)):(console.log(` zibby workflow logs --workflow ${n} --project ${t}`),console.log(` zibby workflow logs --workflow ${n} --project ${t} -t`)),console.log("")}catch(s){c.fail("Trigger failed"),console.log(` Error: ${s.message}
22
22
  `),process.exit(1)}}export{B as coerceValue,E as parseParams,x as resolveInput,J as triggerWorkflowCommand};
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/cli",
3
- "version": "0.1.80",
3
+ "version": "0.1.81",
4
4
  "description": "Zibby CLI - Test automation generator and runner",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "scripts": {
10
10
  "build": "node ../scripts/build.mjs --extra-dirs bin",
11
- "test": "vitest run test/auth*.test.js test/two-layer-auth.test.js test/trigger-params.test.js test/trigger-helpers.test.js test/deploy-helpers.test.js",
11
+ "test": "vitest run test/auth*.test.js test/two-layer-auth.test.js test/trigger-params.test.js test/trigger-helpers.test.js test/deploy-helpers.test.js test/cli-namespace-consistency.test.js test/cli-workflow-subcommands.test.js",
12
12
  "test:unit": "vitest run src/",
13
13
  "test:auth": "vitest run test/auth*.test.js test/two-layer-auth.test.js",
14
14
  "lint": "eslint .",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/cli",
3
- "version": "0.1.80",
3
+ "version": "0.1.81",
4
4
  "description": "Zibby CLI - Test automation generator and runner",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "scripts": {
10
10
  "build": "node ../scripts/build.mjs --extra-dirs bin",
11
- "test": "vitest run test/auth*.test.js test/two-layer-auth.test.js test/trigger-params.test.js test/trigger-helpers.test.js test/deploy-helpers.test.js",
11
+ "test": "vitest run test/auth*.test.js test/two-layer-auth.test.js test/trigger-params.test.js test/trigger-helpers.test.js test/deploy-helpers.test.js test/cli-namespace-consistency.test.js test/cli-workflow-subcommands.test.js",
12
12
  "test:unit": "vitest run src/",
13
13
  "test:auth": "vitest run test/auth*.test.js test/two-layer-auth.test.js",
14
14
  "lint": "eslint .",