@zibby/cli 0.2.1 → 0.3.0
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 +3 -3
- package/dist/commands/chat-agents.js +1 -1
- package/dist/commands/chat.js +62 -62
- package/dist/commands/credentials-api.js +1 -1
- package/dist/commands/credentials-file.js +1 -1
- package/dist/commands/creds.js +1 -1
- package/dist/commands/init.js +82 -74
- package/dist/commands/memory.js +28 -18
- package/dist/commands/run.js +52 -55
- package/dist/commands/template.js +9 -0
- package/dist/commands/workflows/generate.js +13 -13
- package/dist/commands/workflows/run-local.js +19 -19
- package/dist/commands/workflows/start.js +12 -12
- package/dist/package.json +2 -2
- package/dist/utils/agent-credentials.js +4 -3
- package/dist/utils/credentials-loader.js +1 -1
- package/package.json +2 -2
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
var
|
|
1
|
+
var j=Object.defineProperty;var I=(n,t)=>()=>(n&&(t=n(n=0)),t);var K=(n,t)=>{for(var o in t)j(n,o,{get:t[o],enumerable:!0})};var $={};K($,{_resetLoaderCacheForTests:()=>G,loadCredentialsIntoEnv:()=>Y});import k from"node:fs";import R from"node:path";import W from"node:os";async function N(){if(!(process.env.__ZIBBY_CLAUDE_PLAN||process.platform!=="darwin"||!(process.env.CLAUDE_CODE_OAUTH_TOKEN||process.env.CLAUDE_CODE_OAUTH_TOKEN_POOL||process.env.ANTHROPIC_AUTH_TOKEN)))try{let{execSync:t}=await import("node:child_process"),o=t('security find-generic-password -s "Claude Code-credentials" -w',{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim();if(o){let f=JSON.parse(o)?.claudeAiOauth?.subscriptionType;f&&(process.env.__ZIBBY_CLAUDE_PLAN=f)}}catch{}}function F(n){try{if(!k.existsSync(n))return{};let t=k.readFileSync(n,"utf-8"),o=JSON.parse(t);return o&&o.agentKeys&&typeof o.agentKeys=="object"?o.agentKeys:{}}catch{return{}}}async function Y(n={}){let{verbose:t=!1,force:o=!1,configPath:i}=n;if(m&&!o)return w;if(!!(process.env.CLAUDE_CODE_OAUTH_TOKEN_POOL||process.env.ANTHROPIC_API_KEY_POOL||process.env.CLAUDE_CODE_OAUTH_TOKEN||process.env.ANTHROPIC_API_KEY||process.env.ANTHROPIC_AUTH_TOKEN))return await N(),m=!0,w={oauthCount:0,apiCount:0,source:"cloud-env"},t&&console.log("[credentials-loader] env vars already set \u2014 skipping local discovery"),w;let l=i||R.join(W.homedir(),".zibby","config.json"),a=F(l),c="none",s=0,p=0;for(let r of z)a[r]&&!process.env[r]&&(process.env[r]=String(a[r]).trim(),c="config.json",r.endsWith("_POOL")?s+=String(a[r]).split(",").filter(g=>g.trim()).length:s+=1);for(let r of B)a[r]&&!process.env[r]&&(process.env[r]=String(a[r]).trim(),c="config.json",r.endsWith("_POOL")?p+=String(a[r]).split(",").filter(g=>g.trim()).length:p+=1);return await N(),m=!0,w={oauthCount:s,apiCount:p,source:c},t&&s+p>0&&console.log(`[credentials-loader] loaded ${s} OAuth + ${p} API from ${c} (~/.zibby/config.json)`),w}function G(){m=!1,w=null}var m,w,z,B,v=I(()=>{m=!1,w=null,z=["CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN_POOL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_AUTH_TOKEN_POOL"],B=["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_POOL"]});import{existsSync as C}from"fs";import{readFile as J}from"fs/promises";import{join as A}from"path";import{pathToFileURL as M}from"url";import e from"chalk";import Z from"ora";import{existsSync as H}from"fs";import{join as D}from"path";import{pathToFileURL as x}from"url";async function b(n){let t=D(n,".zibby.config.mjs");if(!H(t))throw new Error(".zibby.config.mjs not found");try{let o=await import(x(t).href);return o.default||o}catch(o){throw new Error(`Failed to load .zibby.config.mjs: ${o.message}`,{cause:o})}}var q=3848;async function V(n){try{let t=await b(n);return{userConfig:t,workflowsBasePath:t?.paths?.workflows||".zibby/workflows"}}catch{return{userConfig:null,workflowsBasePath:".zibby/workflows"}}}async function X(n,t,o){let i=A(n,"graph.mjs");if(!C(i))throw new Error(`graph.mjs not found in ${o}/${t}/`);let f=await Q(n,t),l=await import(M(i).href),a=f.entryClass,c=a&&l[a]||l.default||Object.values(l).find(s=>typeof s=="function"&&s.prototype?.buildGraph);if(!c)throw new Error("No WorkflowAgent class found in graph.mjs. Export a class with buildGraph() method.");return{AgentClass:c,manifest:f}}async function Q(n,t){let o=A(n,"workflow.json");if(!C(o))return{name:t,triggers:{api:!0}};let i=await J(o,"utf-8");return JSON.parse(i)}async function yo(n,t){n||(console.log(e.red(`
|
|
2
2
|
Workflow name is required`)),console.log(e.gray(" Usage: zibby workflow start <workflow-name>")),console.log(e.gray(` Example: zibby workflow start ticket-triage
|
|
3
|
-
`)),process.exit(1));let o=
|
|
4
|
-
Workflow not found: ${
|
|
5
|
-
`)),process.exit(1));let
|
|
6
|
-
${
|
|
7
|
-
`)),process.exit(1)}let
|
|
3
|
+
`)),process.exit(1));let o=n.toLowerCase(),i=process.cwd();try{let{loadCredentialsIntoEnv:d}=await Promise.resolve().then(()=>(v(),$));await d({verbose:!!process.env.ZIBBY_DEBUG})}catch{}let{userConfig:f,workflowsBasePath:l}=await V(i),a=A(i,l,o);C(a)||(console.log(e.red(`
|
|
4
|
+
Workflow not found: ${l}/${o}/`)),console.log(e.gray(" Create one first:")),console.log(e.cyan(` zibby workflow new ${o}
|
|
5
|
+
`)),process.exit(1));let c=Z(` Loading workflow "${o}"...`).start(),s,p;try{({AgentClass:s,manifest:p}=await X(a,o,l)),c.succeed(` Loaded ${e.bold(p.entryClass||s.name)} (${o})`)}catch(d){c.fail(" Failed to load workflow"),console.log(e.red(`
|
|
6
|
+
${d.message}
|
|
7
|
+
`)),process.exit(1)}let r=parseInt(t.port,10)||q,g;try{g=(await import("express")).default}catch{console.log(e.red(`
|
|
8
8
|
express is required for local workflow server`)),console.log(e.gray(` npm install express
|
|
9
|
-
`)),process.exit(1)}let
|
|
10
|
-
\u25B6 Run ${
|
|
9
|
+
`)),process.exit(1)}let y=g();y.use(g.json({limit:"1mb"})),y.get("/health",(d,O)=>{O.json({status:"ok",workflow:o,class:s.name})}),y.post("/trigger",async(d,O)=>{let u=`local-${Date.now()}`,E=d.body.input||d.body||{};console.log(e.cyan(`
|
|
10
|
+
\u25B6 Run ${u} triggered`)),console.log(e.gray(` input: ${JSON.stringify(E).slice(0,200)}`)),O.status(202).json({runId:u,status:"running",workflow:o});try{let _=Date.now(),h=new s({workflow:o}),U=h.buildGraph(),L={input:E,cwd:process.cwd(),runId:u,config:f||{}},T=await U.run(h,L),P=((Date.now()-_)/1e3).toFixed(1),S=T?.success!==!1;console.log(S?e.green(` \u2714 Run ${u} succeeded (${P}s)`):e.red(` \u2716 Run ${u} failed (${P}s)`)),h.onComplete&&await h.onComplete(T)}catch(_){console.log(e.red(` \u2716 Run ${u} error: ${_.message}`))}}),y.listen(r,()=>{console.log(e.bold.cyan(`
|
|
11
11
|
Zibby Workflow Server \u2014 ${o}
|
|
12
|
-
`)),console.log(e.gray(" ".padEnd(56,"-"))),console.log(e.white(` Workflow: ${e.cyan(o)}`)),console.log(e.white(` Class: ${e.cyan(s.name)}`)),console.log(e.white(` Port: ${e.cyan(
|
|
13
|
-
Endpoints:`)),console.log(e.gray(` GET http://localhost:${
|
|
14
|
-
Test with:`)),console.log(e.gray(` curl -X POST http://localhost:${
|
|
12
|
+
`)),console.log(e.gray(" ".padEnd(56,"-"))),console.log(e.white(` Workflow: ${e.cyan(o)}`)),console.log(e.white(` Class: ${e.cyan(s.name)}`)),console.log(e.white(` Port: ${e.cyan(r)}`)),console.log(e.gray(" ".padEnd(56,"-"))),console.log(e.white(`
|
|
13
|
+
Endpoints:`)),console.log(e.gray(` GET http://localhost:${r}/health`)),console.log(e.cyan(` POST http://localhost:${r}/trigger`)),console.log(e.white(`
|
|
14
|
+
Test with:`)),console.log(e.gray(` curl -X POST http://localhost:${r}/trigger \\`)),console.log(e.gray(' -H "Content-Type: application/json" \\')),console.log(e.gray(` -d '{"input": {"key": "value"}}'
|
|
15
15
|
`)),console.log(e.gray(` Ctrl+C to stop
|
|
16
|
-
`))})}export{
|
|
16
|
+
`))})}export{yo as startWorkflowCommand};
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zibby/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Zibby CLI - Test automation generator and runner",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@aws-sdk/client-sqs": "^3.1038.0",
|
|
36
36
|
"@zibby/agent-workflow": "^0.3.0",
|
|
37
37
|
"@zibby/core": "^0.3.0",
|
|
38
|
-
"@zibby/memory": "^0.
|
|
38
|
+
"@zibby/ui-memory": "^1.0.0",
|
|
39
39
|
"@zibby/skills": "^0.1.11",
|
|
40
40
|
"adm-zip": "^0.5.17",
|
|
41
41
|
"chalk": "^5.3.0",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import{existsSync as
|
|
2
|
-
`,"utf-8")}function
|
|
3
|
-
|
|
1
|
+
import{existsSync as _,readFileSync as l,writeFileSync as P,mkdirSync as I}from"fs";import{join as s}from"path";import{homedir as A}from"os";var u={cursor:{envVar:"CURSOR_API_KEY",label:"Cursor API Key",url:"https://cursor.com/settings"},claude:{envVar:"ANTHROPIC_API_KEY",label:"Anthropic API Key",url:"https://console.anthropic.com/settings/keys"},codex:{envVar:"OPENAI_API_KEY",label:"OpenAI API Key",url:"https://platform.openai.com/api-keys"},gemini:{envVar:"GEMINI_API_KEY",label:"Gemini API Key",url:"https://aistudio.google.com/app/apikey"}};function g(){return s(A(),".zibby","config.json")}function p(){try{let e=g();return _(e)?JSON.parse(l(e,"utf-8")):{}}catch{return{}}}function h(e,t){let n=t?u[t]:null;n&&d(n.envVar,e)}function d(e,t){if(!e||typeof e!="string"||!t||typeof t!="string")return;let n=s(A(),".zibby");I(n,{recursive:!0});let i=g(),o=p();(!o.agentKeys||typeof o.agentKeys!="object")&&(o.agentKeys={}),o.agentKeys[e]=String(t).trim(),delete o.agentApiKey,P(i,`${JSON.stringify(o,null,2)}
|
|
2
|
+
`,"utf-8")}function R(e){let t=p();return!t.agentKeys||!(e in t.agentKeys)?!1:(delete t.agentKeys[e],P(g(),`${JSON.stringify(t,null,2)}
|
|
3
|
+
`,"utf-8"),!0)}var m={claude:["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_POOL","CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN_POOL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_AUTH_TOKEN_POOL"],cursor:["CURSOR_API_KEY","CURSOR_API_KEY_POOL"],codex:["OPENAI_API_KEY","OPENAI_API_KEY_POOL"],gemini:["GEMINI_API_KEY","GEMINI_API_KEY_POOL","GOOGLE_API_KEY"]};function N(e){let t=[s(e,".zibby.config.mjs"),s(A(),".zibby.config.mjs")];for(let n of t)if(_(n))try{let i=l(n,"utf-8");for(let o of["cursor","claude","codex","gemini"])if(new RegExp(`agent\\s*:\\s*\\{[^}]*${o}\\s*:`,"s").test(i))return o}catch{}return null}function Y(e){let t=e||process.cwd(),n=N(t);if(!n)return;let i=m[n]||(u[n]?[u[n].envVar]:[]);if(i.length===0)return;let o=(r,a)=>{!process.env[r]&&a&&(process.env[r]=String(a).trim())},y=[s(t,".env.local"),s(t,".env")];for(let r of y)if(_(r))try{for(let a of l(r,"utf-8").split(`
|
|
4
|
+
`)){let c=a.trim();if(c.startsWith("#")||!c.includes("="))continue;let O=c.indexOf("="),K=c.slice(0,O).trim(),E=c.slice(O+1).trim();i.includes(K)&&E&&o(K,E)}}catch{}let f=p();if(f.agentKeys&&typeof f.agentKeys=="object")for(let r of i)f.agentKeys[r]&&o(r,f.agentKeys[r])}export{u as AGENT_KEY_MAP,Y as bootstrapAgentEnv,N as detectAgentType,p as readGlobalConfig,R as removeCredential,h as saveAgentApiKey,d as saveCredential};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import A from"node:fs";import d from"node:path";import T from"node:os";var _=!1,s=null,C=["CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN_POOL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_AUTH_TOKEN_POOL"],E=["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_POOL"];async function u(){if(!(process.env.__ZIBBY_CLAUDE_PLAN||process.platform!=="darwin"||!(process.env.CLAUDE_CODE_OAUTH_TOKEN||process.env.CLAUDE_CODE_OAUTH_TOKEN_POOL||process.env.ANTHROPIC_AUTH_TOKEN)))try{let{execSync:n}=await import("node:child_process"),t=n('security find-generic-password -s "Claude Code-credentials" -w',{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim();if(t){let O=JSON.parse(t)?.claudeAiOauth?.subscriptionType;O&&(process.env.__ZIBBY_CLAUDE_PLAN=O)}}catch{}}function N(r){try{if(!A.existsSync(r))return{};let n=A.readFileSync(r,"utf-8"),t=JSON.parse(n);return t&&t.agentKeys&&typeof t.agentKeys=="object"?t.agentKeys:{}}catch{return{}}}async function y(r={}){let{verbose:n=!1,force:t=!1,configPath:l}=r;if(_&&!t)return s;if(!!(process.env.CLAUDE_CODE_OAUTH_TOKEN_POOL||process.env.ANTHROPIC_API_KEY_POOL||process.env.CLAUDE_CODE_OAUTH_TOKEN||process.env.ANTHROPIC_API_KEY||process.env.ANTHROPIC_AUTH_TOKEN))return await u(),_=!0,s={oauthCount:0,apiCount:0,source:"cloud-env"},n&&console.log("[credentials-loader] env vars already set \u2014 skipping local discovery"),s;let p=l||d.join(T.homedir(),".zibby","config.json"),o=N(p),a="none",i=0,c=0;for(let e of C)o[e]&&!process.env[e]&&(process.env[e]=String(o[e]).trim(),a="config.json",e.endsWith("_POOL")?i+=String(o[e]).split(",").filter(f=>f.trim()).length:i+=1);for(let e of E)o[e]&&!process.env[e]&&(process.env[e]=String(o[e]).trim(),a="config.json",e.endsWith("_POOL")?c+=String(o[e]).split(",").filter(f=>f.trim()).length:c+=1);return await u(),_=!0,s={oauthCount:i,apiCount:c,source:a},n&&i+c>0&&console.log(`[credentials-loader] loaded ${i} OAuth + ${c} API from ${a} (~/.zibby/config.json)`),s}function K(){_=!1,s=null}export{K as _resetLoaderCacheForTests,y as loadCredentialsIntoEnv};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zibby/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Zibby CLI - Test automation generator and runner",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@aws-sdk/client-sqs": "^3.1038.0",
|
|
36
36
|
"@zibby/agent-workflow": "^0.3.0",
|
|
37
37
|
"@zibby/core": "^0.3.0",
|
|
38
|
-
"@zibby/memory": "^0.
|
|
38
|
+
"@zibby/ui-memory": "^1.0.0",
|
|
39
39
|
"@zibby/skills": "^0.1.11",
|
|
40
40
|
"adm-zip": "^0.5.17",
|
|
41
41
|
"chalk": "^5.3.0",
|