runhuman 1.9.0 → 1.9.1

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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -201,8 +201,8 @@ Showing ${j}-${I} of ${a.total} projects`);let S=[["View project","runhuman proj
201
201
  `),console.log(" Use this key:"),console.log(" export RUNHUMAN_API_KEY="+a.key),console.log(` runhuman create https://myapp.com -d "Test"
202
202
  `),console.log(" Store securely:"),console.log(" - Use environment variables (recommended)"),console.log(" - Use secret management tools"),console.log(` - Never commit to git!
203
203
  `)}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("show").alias("info").alias("get").description("Show details of a specific API key").argument("<keyId>","Key ID to show").option("--show-key","Show full API key (default: masked)").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=await y(c,"key",t),l=await c.getApiKey(u);if(e.json){let a=p.result(l);n.output(a)}else n.heading("API Key Details"),n.detail("Key ID",l.id),n.detail("Name",l.name),n.detail("API Key",e.showKey?l.key:wt(l.key)),n.detail("Created",n.formatTimestamp(l.createdAt)),l.lastUsedAt&&n.detail("Last Used",n.formatTimestamp(l.lastUsedAt)),console.log()}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("delete").aliases(["rm","revoke"]).description("Delete an API key permanently").argument("<keyId>","Key ID to delete").option("-f, --force","Skip confirmation prompt").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=await y(c,"key",t,{requireFullId:{reason:"deletion"}});if(!e.json&&!e.force){let{confirmed:l}=await ar.prompt([{type:"confirm",name:"confirmed",message:`Permanently delete API key ${u}? This cannot be undone.`,default:!1}]);if(!l)return}if(await c.deleteApiKey(u),e.json){let l=p.result({success:!0});n.output(l)}else n.success("API key deleted successfully!")}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i}function wt(i){return i.length<=12?"****":i.substring(0,8)+"*".repeat(i.length-12)+i.substring(i.length-4)}P();U();A();x();import{Command as lr}from"commander";import ur from"inquirer";R();import pr from"cli-table3";function Ct(){let i=new lr("templates");return i.description("Manage test templates"),i.command("list").alias("ls").description("List all test templates").option("-p, --project <id>","Filter by project (required)").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async t=>{try{let r=await new h().loadConfig({apiKey:t.apiKey,apiUrl:t.apiUrl}),o=new p({json:t.json,color:r.color}),n=new b(r),c=T("project",t.project,r,o),u=await y(n,"project",c),{items:l,pagination:a}=await n.listTemplates(u);if(t.json){let d=p.result({templates:l,pagination:a});o.output(d)}else{if(a.total===0){o.heading("Test Templates (0)"),console.log(`No templates found for this project.
204
- `),o.hints([["Create a template",'runhuman templates create "Template Name" --project '+u]]);return}o.heading(`Test Templates (${l.length} of ${a.total})`);let d=new pr({head:o.tableHead(["ID","Name","Description","Created"]),colWidths:[30,25,35,20]});l.forEach(m=>{let g=m.testDescription&&m.testDescription.length>30?m.testDescription.substring(0,27)+"...":m.testDescription||"-";d.push([m.id,m.name,g,o.formatShortDate(m.createdAt)])}),console.log(d.toString()),console.log(),o.hints([["Create new template",'runhuman templates create "Template Name" --project '+u],["View template","runhuman templates show <templateId>"]])}}catch(e){let r=f(e);new p({json:t.json}).outputError(r.message,r.details),process.exit(r.exitCode)}}),i.command("create").alias("new").description("Create a new test template").argument("<name>","Template name").option("-p, --project <id>","Project ID (required)").option("-d, --description <text>","Template description").option("--duration <minutes>","Target test duration in minutes (1-60)",parseInt).option("--device-class <class>","Device class (desktop/mobile)").option("--schema <path>","Path to JSON schema file").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u),a;if(e.schema){let{readFileSync:g}=await import("fs"),j=g(e.schema,"utf-8");a=JSON.parse(j)}let d={name:t,testDescription:e.description,targetDurationMinutes:e.duration,deviceClass:e.deviceClass,outputSchema:a},m=await c.createTemplate(l,d);if(e.json){let g=p.result(m);n.output(g)}else n.success("Template created successfully!"),n.detail("Template ID",m.id),n.detail("Name",m.name),m.testDescription&&n.detail("Description",m.testDescription),console.log(),n.hints([["Use this template",'runhuman create https://myapp.com --template "'+m.name+'"']])}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("show").alias("info").alias("get").description("Show details of a specific template").argument("<templateId>","Template ID to show").option("-p, --project <id>","Project ID (required)").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u),a=await y(c,"template",t),d=await c.getTemplate(l,a);if(e.json){let m=p.result(d);n.output(m)}else n.heading("Template Details"),n.detail("Template ID",d.id),n.detail("Name",d.name),n.detail("Description",d.testDescription||"-"),n.detail("Project",d.projectId),d.targetDurationMinutes&&n.detail("Duration",d.targetDurationMinutes+" minutes"),d.deviceClass&&n.detail("Device Class",d.deviceClass),n.detail("Created",n.formatTimestamp(d.createdAt)),d.outputSchema&&(console.log(`
205
- Output Schema:`),console.log(JSON.stringify(d.outputSchema,null,2))),console.log(),n.hints([["Use this template",'runhuman create https://myapp.com --template "'+d.name+'"']])}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("update").alias("edit").description("Update a template").argument("<templateId>","Template ID to update").option("-p, --project <id>","Project ID (required)").option("--name <name>","New template name").option("-d, --description <text>","New description").option("--duration <minutes>","New target duration in minutes (1-60)",parseInt).option("--device-class <class>","New device class (desktop/mobile)").option("--schema <path>","Path to new JSON schema file").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u),a=await y(c,"template",t),d;if(e.schema){let{readFileSync:I}=await import("fs"),S=I(e.schema,"utf-8");d=JSON.parse(S)}let m={name:e.name,testDescription:e.description,targetDurationMinutes:e.duration,deviceClass:e.deviceClass,outputSchema:d},g=Object.fromEntries(Object.entries(m).filter(([,I])=>I!==void 0));if(Object.keys(g).length===0)throw new Error("No updates provided. Use --name, --description, --duration, --device-class, or --schema");let j=await c.updateTemplate(l,a,m);if(e.json){let I=p.result(j);n.output(I)}else n.success("Template updated successfully!"),n.detail("Template ID",j.id),n.detail("Name",j.name),console.log()}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("delete").alias("rm").description("Delete a template permanently").argument("<templateId>","Template ID to delete").option("-p, --project <id>","Project ID (required)").option("-f, --force","Skip confirmation prompt").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u),a=await y(c,"template",t);if(!e.json&&!e.force){let{confirmed:d}=await ur.prompt([{type:"confirm",name:"confirmed",message:`Permanently delete template ${a}? This cannot be undone.`,default:!1}]);if(!d)return}if(await c.deleteTemplate(l,a),e.json){let d=p.result({success:!0});n.output(d)}else n.success("Template deleted successfully!")}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i}P();U();A();x();import{Command as dr}from"commander";R();import St from"cli-table3";function At(){let i=new dr("github");return i.alias("gh"),i.description("GitHub integration commands"),i.command("link").description("Link a GitHub repository to your project").argument("<repo>","Repository in format owner/repo").option("-p, --project <id>","Project ID (required)").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let r=new h,o=await r.loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u);if(!t.match(/^([^/]+)\/([^/]+)$/))throw new Error("Invalid repository format. Use: owner/repo");if(await c.updateProject(l,{githubRepo:t}),e.json){let d=p.result({success:!0,repository:t});n.output(d)}else n.success("GitHub repository linked successfully!"),n.detail("Repository",t),n.detail("Project",l),console.log(),await r.saveProjectConfig({githubRepo:t}),console.log(` Repository saved to project config (.runhumanrc)
204
+ `),o.hints([["Create a template",'runhuman templates create "Template Name" --project '+u]]);return}o.heading(`Test Templates (${l.length} of ${a.total})`);let d=new pr({head:o.tableHead(["ID","Name","Description","Created"]),colWidths:[30,25,35,20]});l.forEach(m=>{let g=m.testDescription&&m.testDescription.length>30?m.testDescription.substring(0,27)+"...":m.testDescription||"-";d.push([m.id,m.name,g,o.formatShortDate(m.createdAt)])}),console.log(d.toString()),console.log(),o.hints([["Create new template",'runhuman templates create "Template Name" --project '+u],["View template","runhuman templates show <templateId>"]])}}catch(e){let r=f(e);new p({json:t.json}).outputError(r.message,r.details),process.exit(r.exitCode)}}),i.command("create").alias("new").description("Create a new test template").argument("<name>","Template name").option("-p, --project <id>","Project ID (required)").option("-d, --description <text>","Template description").option("--duration <minutes>","Target test duration in minutes (1-60)",parseInt).option("--device-class <class>","Device class (desktop/mobile)").option("--schema <path>","Path to JSON schema file").option("--schema-inline <json>","Inline JSON schema").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u),a;if(e.schema){let{readFileSync:g}=await import("fs"),j=g(e.schema,"utf-8");a=JSON.parse(j)}else e.schemaInline&&(a=JSON.parse(e.schemaInline));let d={name:t,testDescription:e.description,targetDurationMinutes:e.duration,deviceClass:e.deviceClass,outputSchema:a},m=await c.createTemplate(l,d);if(e.json){let g=p.result(m);n.output(g)}else n.success("Template created successfully!"),n.detail("Template ID",m.id),n.detail("Name",m.name),m.testDescription&&n.detail("Description",m.testDescription),console.log(),n.hints([["Use this template",'runhuman create https://myapp.com --template "'+m.name+'"']])}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("show").alias("info").alias("get").description("Show details of a specific template").argument("<templateId>","Template ID to show").option("-p, --project <id>","Project ID (required)").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u),a=await y(c,"template",t),d=await c.getTemplate(l,a);if(e.json){let m=p.result(d);n.output(m)}else n.heading("Template Details"),n.detail("Template ID",d.id),n.detail("Name",d.name),n.detail("Description",d.testDescription||"-"),n.detail("Project",d.projectId),d.targetDurationMinutes&&n.detail("Duration",d.targetDurationMinutes+" minutes"),d.deviceClass&&n.detail("Device Class",d.deviceClass),n.detail("Created",n.formatTimestamp(d.createdAt)),d.outputSchema&&(console.log(`
205
+ Output Schema:`),console.log(JSON.stringify(d.outputSchema,null,2))),console.log(),n.hints([["Use this template",'runhuman create https://myapp.com --template "'+d.name+'"']])}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("update").alias("edit").description("Update a template").argument("<templateId>","Template ID to update").option("-p, --project <id>","Project ID (required)").option("--name <name>","New template name").option("-d, --description <text>","New description").option("--duration <minutes>","New target duration in minutes (1-60)",parseInt).option("--device-class <class>","New device class (desktop/mobile)").option("--schema <path>","Path to new JSON schema file").option("--schema-inline <json>","Inline JSON schema").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u),a=await y(c,"template",t),d;if(e.schema){let{readFileSync:I}=await import("fs"),S=I(e.schema,"utf-8");d=JSON.parse(S)}else e.schemaInline&&(d=JSON.parse(e.schemaInline));let m={name:e.name,testDescription:e.description,targetDurationMinutes:e.duration,deviceClass:e.deviceClass,outputSchema:d},g=Object.fromEntries(Object.entries(m).filter(([,I])=>I!==void 0));if(Object.keys(g).length===0)throw new Error("No updates provided. Use --name, --description, --duration, --device-class, or --schema");let j=await c.updateTemplate(l,a,m);if(e.json){let I=p.result(j);n.output(I)}else n.success("Template updated successfully!"),n.detail("Template ID",j.id),n.detail("Name",j.name),console.log()}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("delete").alias("rm").description("Delete a template permanently").argument("<templateId>","Template ID to delete").option("-p, --project <id>","Project ID (required)").option("-f, --force","Skip confirmation prompt").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u),a=await y(c,"template",t);if(!e.json&&!e.force){let{confirmed:d}=await ur.prompt([{type:"confirm",name:"confirmed",message:`Permanently delete template ${a}? This cannot be undone.`,default:!1}]);if(!d)return}if(await c.deleteTemplate(l,a),e.json){let d=p.result({success:!0});n.output(d)}else n.success("Template deleted successfully!")}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i}P();U();A();x();import{Command as dr}from"commander";R();import St from"cli-table3";function At(){let i=new dr("github");return i.alias("gh"),i.description("GitHub integration commands"),i.command("link").description("Link a GitHub repository to your project").argument("<repo>","Repository in format owner/repo").option("-p, --project <id>","Project ID (required)").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let r=new h,o=await r.loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=new b(o),u=T("project",e.project,o,n),l=await y(c,"project",u);if(!t.match(/^([^/]+)\/([^/]+)$/))throw new Error("Invalid repository format. Use: owner/repo");if(await c.updateProject(l,{githubRepo:t}),e.json){let d=p.result({success:!0,repository:t});n.output(d)}else n.success("GitHub repository linked successfully!"),n.detail("Repository",t),n.detail("Project",l),console.log(),await r.saveProjectConfig({githubRepo:t}),console.log(` Repository saved to project config (.runhumanrc)
206
206
  `),n.hints([["List issues","runhuman github issues "+t],["Test an issue","runhuman github test <issueNumber> --repo "+t],["Bulk test","runhuman github bulk-test --repo "+t]])}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("repos").alias("repositories").description("List GitHub repositories accessible to an organization").option("-o, --organization <id>","Organization ID (required)").option("--search <query>","Filter by repository name").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async t=>{try{let r=await new h().loadConfig({apiKey:t.apiKey,apiUrl:t.apiUrl}),o=new p({json:t.json,color:r.color}),n=new b(r),c=T("organization",t.organization,r,o),u=await y(n,"organization",c),l=await n.listGithubRepos(u,{search:t.search});if(t.json)o.output(p.result(l));else{o.heading(`GitHub Repositories (${l.items.length})`);let a=new St({head:o.tableHead(["Repository","Added"]),colWidths:[45,20]});l.items.forEach(d=>{a.push([d.fullName,o.formatShortDate(d.createdAt)])}),console.log(a.toString()),console.log(),o.hints([["Test an issue","runhuman github test <issueNumber> --repo owner/repo"]])}}catch(e){let r=f(e);new p({json:t.json}).outputError(r.message,r.details),process.exit(r.exitCode)}}),i.command("issues").description("List GitHub issues for a repository").argument("<repo>","Repository in format owner/repo").option("--state <state>","Filter by state (open/closed/all)","open").option("-l, --labels <labels>","Filter by comma-separated labels").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=new p({json:e.json,color:o.color}),c=t.match(/^([^/]+)\/([^/]+)$/);if(!c)throw new Error("Invalid repository format. Use: owner/repo");let[,u,l]=c,d=await new b(o).listGithubIssues(u,l,{state:e.state,labels:e.labels?.split(",")});if(e.json){let m=p.result({issues:d});n.output(m)}else{n.heading(`GitHub Issues for ${t} (${d.length})`);let m=new St({head:n.tableHead(["#","Title","State","Labels","Created"]),colWidths:[8,40,10,20,15]});d.forEach(g=>{let j=g.labels?.join(", ")||"-",I=j.length>18?j.substring(0,15)+"...":j;m.push(["#"+g.number,g.title.length>38?g.title.substring(0,35)+"...":g.title,g.state,I,n.formatShortDate(g.createdAt)])}),console.log(m.toString()),console.log(),n.hints([["Test an issue","runhuman github test <issueNumber> --repo "+t]])}}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("test").description("Create a QA test job for a GitHub issue").argument("<issueNumber>","Issue number to test").option("-r, --repo <owner/repo>","Repository (or use default from config)").option("-u, --url <url>","URL to test (required)").option("-t, --template <id>","Template ID to use").option("-s, --sync","Wait for result before exiting").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async(t,e)=>{try{let o=await new h().loadConfig({apiKey:e.apiKey,apiUrl:e.apiUrl}),n=e.repo||o.githubRepo;if(!n)throw new Error("Repository required (use --repo or set default with: runhuman github link)");if(!e.url)throw new Error("URL required (use --url)");let c=new p({json:e.json,color:o.color}),u=n.match(/^([^/]+)\/([^/]+)$/);if(!u)throw new Error("Invalid repository format. Use: owner/repo");let[,l,a]=u,d=new b(o),m=await d.getGithubIssue(l,a,parseInt(t)),g=T("project",void 0,o,c),I={projectId:await y(d,"project",g),url:e.url,description:`Test GitHub issue #${t}: ${m.title}
207
207
 
208
208
  ${m.body}`,metadata:{githubIssue:{owner:l,repo:a,number:parseInt(t),url:m.url}},template:e.template},S=await d.createJob(I);if(e.json){let C=p.result(S);c.output(C)}else if(c.success("QA test job created for issue #"+t),c.detail("Job ID",S.jobId),c.detail("Issue","#"+t+" - "+m.title),c.detail("Status",S.status),c.detail("URL",e.url),console.log(),c.hints([["Check status","runhuman status "+S.jobId]]),e.sync){let{waitForJob:C}=await Promise.resolve().then(()=>(fe(),Ue));await C(S.jobId,d,c,600)}}catch(r){let o=f(r);new p({json:e.json}).outputError(o.message,o.details),process.exit(o.exitCode)}}),i.command("bulk-test").description("Create QA test jobs for multiple GitHub issues").option("-r, --repo <owner/repo>","Repository (or use default from config)").option("-u, --url <url>","URL to test (required)").option("-l, --labels <labels>","Filter issues by comma-separated labels").option("--state <state>","Filter by state (open/closed/all)","open").option("-t, --template <id>","Template ID to use").option("-n, --limit <number>","Maximum number of jobs to create","10").option("-j, --json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async t=>{try{let r=await new h().loadConfig({apiKey:t.apiKey,apiUrl:t.apiUrl}),o=t.repo||r.githubRepo;if(!o)throw new Error("Repository required (use --repo or set default with: runhuman github link)");if(!t.url)throw new Error("URL required (use --url)");let n=new p({json:t.json,color:r.color}),c=o.match(/^([^/]+)\/([^/]+)$/);if(!c)throw new Error("Invalid repository format. Use: owner/repo");let[,u,l]=c,a=new b(r),d=await a.listGithubIssues(u,l,{state:t.state,labels:t.labels?.split(",")}),m=parseInt(t.limit),g=d.slice(0,m);if(g.length===0){console.log(`No issues found matching the criteria.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runhuman",
3
- "version": "1.9.0",
3
+ "version": "1.9.1",
4
4
  "description": "CLI for Runhuman - AI-orchestrated human QA testing",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",