runhuman 1.0.2 → 1.0.3
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/index.js +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var st=Object.defineProperty;var it=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});var b=(s,t)=>()=>(s&&(t=s(s=0)),t);var at=(s,t)=>{for(var e in t)st(s,e,{get:t[e],enumerable:!0})};function ct(s){return s instanceof R}function m(s){return ct(s)?{message:s.message,exitCode:s.exitCode,details:s.details}:s instanceof Error?{message:s.message,exitCode:1}:{message:String(s),exitCode:1}}var R,W,q,D,V,I=b(()=>{"use strict";R=class extends Error{constructor(e,n=1,o){super(e);this.exitCode=n;this.details=o;this.name="CliError"}},W=class extends R{constructor(t="Authentication failed",e){super(t,2,e),this.name="AuthenticationError"}},q=class extends R{constructor(t="Resource not found",e){super(t,3,e),this.name="NotFoundError"}},D=class extends R{constructor(t="Validation failed",e){super(t,4,e),this.name="ValidationError"}},V=class extends R{constructor(t="Operation timed out",e){super(t,5,e),this.name="TimeoutError"}}});var ie=b(()=>{"use strict"});var ee=b(()=>{"use strict"});var ae=b(()=>{"use strict"});var pe=b(()=>{"use strict";ie();ee();ae()});var me=b(()=>{"use strict"});var de=b(()=>{"use strict";me()});var ge=b(()=>{"use strict"});var fe=b(()=>{"use strict";ee()});var he=b(()=>{"use strict";ge();fe()});function p(s){return{pattern:s,build:e=>{if(!e)return s;let n=s;for(let[o,r]of Object.entries(e))r!==void 0&&(n=n.replace(`:${o}?`,r),n=n.replace(`:${o}`,r));return n=n.replace(/\/:[^/]+\?/g,""),n=n.replace(/\/+/g,"/"),n.length>1&&n.endsWith("/")&&(n=n.slice(0,-1)),n}}}var B=b(()=>{"use strict"});var ye,be=b(()=>{"use strict";B();ye={dashboard:p("/dashboard"),onboarding:p("/dashboard/onboarding"),projects:p("/dashboard/projects"),usage:p("/dashboard/usage"),managePlan:p("/dashboard/manage-plan"),admin:p("/dashboard/admin"),settings:p("/dashboard/settings"),settingsAccount:p("/dashboard/settings/account"),settingsGitHub:p("/dashboard/settings/github"),settingsApiKeys:p("/dashboard/settings/api-keys"),project:p("/dashboard/:projectId"),playground:p("/dashboard/:projectId/playground"),jobs:p("/dashboard/:projectId/jobs"),job:p("/dashboard/:projectId/jobs/:jobId"),templates:p("/dashboard/:projectId/templates"),template:p("/dashboard/:projectId/templates/:templateId"),issues:p("/dashboard/:projectId/issues"),issue:p("/dashboard/:projectId/issues/:issueNumber"),issueSessions:p("/dashboard/:projectId/issue-sessions"),issueSession:p("/dashboard/:projectId/issue-sessions/:sessionId"),projectSettings:p("/dashboard/:projectId/settings"),quickStart:p("/start"),publicJob:p("/j/:jobId/:token"),docs:p("/docs/quick-start"),pricing:p("/pricing"),home:p("/")}});var w,we=b(()=>{"use strict";B();w={jobs:p("/jobs"),job:p("/jobs/:jobId"),jobStatus:p("/jobs/:jobId/status"),run:p("/run"),publicJob:p("/public/jobs/:jobId/:token"),keys:p("/keys"),key:p("/keys/:keyId"),keyRevoke:p("/keys/:keyId/revoke"),projects:p("/projects"),project:p("/projects/:projectId"),projectJobs:p("/projects/:projectId/jobs"),projectApiKeys:p("/projects/:projectId/api-keys"),projectTemplates:p("/projects/:projectId/templates"),projectTemplate:p("/projects/:projectId/templates/:templateId"),bulkCreateProjects:p("/projects/bulk"),githubOAuthAuthorize:p("/github/oauth/authorize"),githubCallback:p("/github/auth/callback"),githubInstallations:p("/github/installations"),githubInstallation:p("/github/installations/:installationId"),githubInstallationRefresh:p("/github/installations/:installationId/refresh"),githubRepos:p("/github/repos"),githubRepoCheckAccess:p("/github/repos/check-access"),githubRepoFindUrl:p("/github/repos/find-url"),githubIssuesByRepo:p("/github/issues/:owner/:repo"),githubIssues:p("/github/issues"),githubIssue:p("/github/issues/:issueNumber"),githubIssueComments:p("/github/issues/:issueNumber/comments"),githubIssueLabels:p("/github/issues/labels"),githubIssueAssignees:p("/github/issues/assignees"),githubIssueTest:p("/github/issues/test"),githubIssuesBulkTest:p("/github/issues/bulk-test"),githubTestSessions:p("/github/issues/test-sessions"),githubTestSession:p("/github/issues/test-sessions/:sessionId"),githubTestSessionSeen:p("/github/issues/test-sessions/:sessionId/seen"),githubTestSessionsCounts:p("/github/issues/test-sessions/counts"),githubBulkTest:p("/github/bulk-test"),githubWebhooks:p("/github/webhooks"),authSync:p("/auth/sync"),authMe:p("/auth/me"),authStartup:p("/auth/startup"),authDeleteAccount:p("/auth/account"),tokensBalance:p("/tokens/balance"),tokensTransactions:p("/tokens/transactions"),tokensContact:p("/tokens/contact"),health:p("/health"),templates:p("/templates"),issueAnalyzer:p("/issue-analyzer"),prAnalyzer:p("/pr-analyzer"),logs:p("/logs"),relevantIssuesDiscover:p("/relevant-issues/discover"),relevantIssuesLatest:p("/relevant-issues/latest"),onboarding:p("/onboarding"),onboardingComplete:p("/onboarding/complete"),onboardingCheck:p("/onboarding/check"),search:p("/search"),testerApply:p("/tester/apply"),testerProfile:p("/tester/profile"),testerPublicProfile:p("/testers/:testerId/profile"),repoTemplates:p("/repos/:owner/:repo/templates"),repoTemplate:p("/repos/:owner/:repo/templates/:templateName")}});var je=b(()=>{"use strict";B();be();we()});var Ce=b(()=>{"use strict"});var Ie=b(()=>{"use strict"});var Se=b(()=>{"use strict";Ce();Ie()});var Ae=b(()=>{"use strict"});var ke=b(()=>{"use strict"});var Ue=b(()=>{"use strict";Ae();ke()});var xe=b(()=>{"use strict"});var Pe=b(()=>{"use strict"});var Te=b(()=>{"use strict";xe();Pe()});var Re=b(()=>{"use strict";pe();de();he();je();Se();Ue();Te()});import Lt from"axios";var g,x=b(()=>{"use strict";I();Re();g=class{client;config;constructor(t){if(this.config=t,!t.apiUrl)throw new Error("apiUrl is required in CLI config");this.client=Lt.create({baseURL:t.apiUrl+"/api",timeout:3e4,headers:{"Content-Type":"application/json"}}),this.client.interceptors.request.use(e=>(this.config.apiKey&&(e.headers.Authorization=`Bearer ${this.config.apiKey}`),e)),this.client.interceptors.response.use(e=>e,e=>{throw this.handleError(e)})}handleError(t){if(t.response){let e=t.response.status,n=t.response.data,o=n?.error||n?.message||t.message;switch(e){case 401:case 403:return new W(o,n);case 404:return new q(o,n);case 400:case 422:return new D(o,n);default:return new R(o,1,n)}}return t.code==="ECONNABORTED"?new R("Request timeout",5):t.code==="ENOTFOUND"||t.code==="ECONNREFUSED"?new R("Cannot connect to Runhuman API",1):new R(t.message,1)}async createJob(t){return(await this.client.post(w.jobs.build(),t)).data}async getJob(t){return(await this.client.get(w.jobStatus.build({jobId:t}))).data}async listJobs(t){return(await this.client.get(w.jobs.build(),{params:t})).data}async cancelJob(t){await this.client.post(`${w.job.build({jobId:t})}/cancel`)}async deleteJob(t){await this.client.delete(w.job.build({jobId:t}))}async listProjects(t){return(await this.client.get(w.projects.build(),{params:t})).data}async getProject(t){return(await this.client.get(w.project.build({projectId:t}))).data}async createProject(t){return(await this.client.post(w.projects.build(),t)).data}async updateProject(t,e){return(await this.client.put(w.project.build({projectId:t}),e)).data}async deleteProject(t){await this.client.delete(w.project.build({projectId:t}))}async listApiKeys(t){return(await this.client.get(w.projectApiKeys.build({projectId:t}))).data}async createApiKey(t,e){return(await this.client.post(w.projectApiKeys.build({projectId:t}),{name:e})).data}async deleteApiKey(t){await this.client.delete(w.key.build({keyId:t}))}async listTemplates(t){return(await this.client.get(w.projectTemplates.build({projectId:t}))).data}async getTemplate(t,e){return(await this.client.get(w.projectTemplate.build({projectId:t,templateId:e}))).data}async createTemplate(t,e){return(await this.client.post(w.projectTemplates.build({projectId:t}),e)).data}async updateTemplate(t,e,n){return(await this.client.put(w.projectTemplate.build({projectId:t,templateId:e}),n)).data}async deleteTemplate(t,e){await this.client.delete(w.projectTemplate.build({projectId:t,templateId:e}))}async getCurrentUser(){return(await this.client.get(w.authMe.build())).data}async getTokenBalance(){return(await this.client.get(w.tokensBalance.build())).data}async linkGithubRepo(t,e,n){return(await this.client.post(`${w.project.build({projectId:t})}/github/link`,{owner:e,repo:n})).data}async listGithubRepos(t){let e=t?{projectId:t}:void 0;return(await this.client.get(w.githubRepos.build(),{params:e})).data}async listGithubIssues(t,e,n){return(await this.client.get(w.githubIssuesByRepo.build({owner:t,repo:e}),{params:n})).data}async getGithubIssue(t,e,n){return(await this.client.get(`${w.githubIssuesByRepo.build({owner:t,repo:e})}/${n}`)).data}}});import{cosmiconfig as Jt}from"cosmiconfig";import{homedir as _t}from"os";import{join as v}from"path";import{readFileSync as F,writeFileSync as O,existsSync as P,mkdirSync as te,chmodSync as Ft}from"fs";function zt(s){return Ht.includes(s)}var Kt,E,M,K,Ht,d,k=b(()=>{"use strict";Kt="runhuman",E=v(_t(),".config","runhuman"),M=v(E,"config.json"),K=v(E,"credentials.json"),Ht=["pretty","json","compact"];d=class{constructor(t=process.cwd()){this.cwd=t}projectConfig=null;globalConfig=null;envConfig=null;async loadConfig(t={}){this.envConfig=this.loadEnvConfig(),this.projectConfig=await this.loadProjectConfig(),this.globalConfig=this.loadGlobalConfig();let e=this.loadCredentials(),n=e?.accessToken?{apiKey:e.accessToken}:{},o=Object.fromEntries(Object.entries(t).filter(([,l])=>l!==void 0));return{...this.getDefaults(),...this.globalConfig,...this.projectConfig,...n,...this.envConfig,...o}}getDefaults(){return{apiUrl:"https://runhuman.com",outputFormat:"pretty",color:!0,autoOpenBrowser:!0,defaultDuration:5,defaultScreenSize:"desktop"}}loadEnvConfig(){let t={};return process.env.RUNHUMAN_API_KEY&&(t.apiKey=process.env.RUNHUMAN_API_KEY),process.env.RUNHUMAN_API_URL&&(t.apiUrl=process.env.RUNHUMAN_API_URL),process.env.RUNHUMAN_PROJECT&&(t.project=process.env.RUNHUMAN_PROJECT),process.env.RUNHUMAN_DEFAULT_URL&&(t.defaultUrl=process.env.RUNHUMAN_DEFAULT_URL),process.env.RUNHUMAN_DEFAULT_DURATION&&(t.defaultDuration=parseInt(process.env.RUNHUMAN_DEFAULT_DURATION,10)),process.env.RUNHUMAN_DEFAULT_SCREEN_SIZE&&(t.defaultScreenSize=process.env.RUNHUMAN_DEFAULT_SCREEN_SIZE),process.env.RUNHUMAN_OUTPUT_FORMAT&&zt(process.env.RUNHUMAN_OUTPUT_FORMAT)&&(t.outputFormat=process.env.RUNHUMAN_OUTPUT_FORMAT),process.env.RUNHUMAN_NO_COLOR==="1"&&(t.color=!1),t}async loadProjectConfig(){try{return(await Jt(Kt).search(this.cwd))?.config||null}catch{return null}}loadGlobalConfig(){try{if(!P(M))return null;let t=F(M,"utf-8");return JSON.parse(t)}catch{return null}}async get(t){return(await this.loadConfig())[t]}async set(t,e,n=!1){n?await this.setGlobalConfig(t,e):await this.setProjectConfig(t,e)}async setGlobalConfig(t,e){P(E)||te(E,{recursive:!0});let n={};if(P(M)){let o=F(M,"utf-8");n=JSON.parse(o)}n[t]=e,O(M,JSON.stringify(n,null,2))}async setProjectConfig(t,e){let n=v(this.cwd,".runhumanrc"),o={};if(P(n)){let r=F(n,"utf-8");o=JSON.parse(r)}o[t]=e,O(n,JSON.stringify(o,null,2))}async saveProjectConfig(t){let e=v(this.cwd,".runhumanrc"),n={};if(P(e)){let r=F(e,"utf-8");n=JSON.parse(r)}let o={...n,...t};O(e,JSON.stringify(o,null,2))}async list(){let t=await this.loadConfig();return{global:this.globalConfig,project:this.projectConfig,env:this.envConfig,effective:t}}async reset(t){if((t==="global"||t==="all")&&P(M)&&O(M,"{}"),t==="project"||t==="all"){let e=v(this.cwd,".runhumanrc");P(e)&&O(e,"{}")}}saveCredentials(t){P(E)||te(E,{recursive:!0}),O(K,JSON.stringify(t,null,2));try{process.platform!=="win32"&&Ft(K,384)}catch{}}loadCredentials(){try{if(!P(K))return null;let t=F(K,"utf-8");return JSON.parse(t)}catch{return null}}clearCredentials(){P(K)&&O(K,"{}")}saveUserInfo(t){let e=v(E,"user.json");P(E)||te(E,{recursive:!0}),O(e,JSON.stringify(t,null,2))}loadUserInfo(){try{let t=v(E,"user.json");if(!P(t))return null;let e=F(t,"utf-8");return JSON.parse(e)}catch{return null}}clearUserInfo(){let t=v(E,"user.json");P(t)&&O(t,"{}")}}});import L from"chalk";import Gt from"cli-table3";var a,S=b(()=>{"use strict";a=class{constructor(t={}){this.options=t}output(t){this.options.json?console.log(JSON.stringify(t,null,2)):t.success?t.data&&!this.options.quiet&&this.outputPretty(t.data):this.outputError(t.error?.message||"An error occurred")}outputPretty(t){typeof t=="string"?console.log(t):(Array.isArray(t),console.log(JSON.stringify(t,null,2)))}outputError(t,e){if(this.options.json){let n={success:!1,error:{message:t,details:e},timestamp:new Date().toISOString()};console.error(JSON.stringify(n,null,2))}else console.error(this.color("red",`
|
|
2
|
+
var st=Object.defineProperty;var it=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});var b=(s,t)=>()=>(s&&(t=s(s=0)),t);var at=(s,t)=>{for(var e in t)st(s,e,{get:t[e],enumerable:!0})};function ct(s){return s instanceof R}function m(s){return ct(s)?{message:s.message,exitCode:s.exitCode,details:s.details}:s instanceof Error?{message:s.message,exitCode:1}:{message:String(s),exitCode:1}}var R,W,q,D,V,I=b(()=>{"use strict";R=class extends Error{constructor(e,n=1,o){super(e);this.exitCode=n;this.details=o;this.name="CliError"}},W=class extends R{constructor(t="Authentication failed",e){super(t,2,e),this.name="AuthenticationError"}},q=class extends R{constructor(t="Resource not found",e){super(t,3,e),this.name="NotFoundError"}},D=class extends R{constructor(t="Validation failed",e){super(t,4,e),this.name="ValidationError"}},V=class extends R{constructor(t="Operation timed out",e){super(t,5,e),this.name="TimeoutError"}}});var ie=b(()=>{"use strict"});var ee=b(()=>{"use strict"});var ae=b(()=>{"use strict"});var pe=b(()=>{"use strict";ie();ee();ae()});var me=b(()=>{"use strict"});var de=b(()=>{"use strict";me()});var ge=b(()=>{"use strict"});var fe=b(()=>{"use strict";ee()});var he=b(()=>{"use strict";ge();fe()});function p(s){return{pattern:s,build:e=>{if(!e)return s;let n=s;for(let[o,r]of Object.entries(e))r!==void 0&&(n=n.replace(`:${o}?`,r),n=n.replace(`:${o}`,r));return n=n.replace(/\/:[^/]+\?/g,""),n=n.replace(/\/+/g,"/"),n.length>1&&n.endsWith("/")&&(n=n.slice(0,-1)),n}}}var B=b(()=>{"use strict"});var ye,be=b(()=>{"use strict";B();ye={dashboard:p("/dashboard"),onboarding:p("/dashboard/onboarding"),projects:p("/dashboard/projects"),usage:p("/dashboard/usage"),managePlan:p("/dashboard/manage-plan"),admin:p("/dashboard/admin"),settings:p("/dashboard/settings"),settingsAccount:p("/dashboard/settings/account"),settingsGitHub:p("/dashboard/settings/github"),settingsApiKeys:p("/dashboard/settings/api-keys"),tester:p("/tester"),testerJobs:p("/tester/jobs"),testerSettings:p("/tester/settings"),project:p("/dashboard/:projectId"),playground:p("/dashboard/:projectId/playground"),jobs:p("/dashboard/:projectId/jobs"),job:p("/dashboard/:projectId/jobs/:jobId"),templates:p("/dashboard/:projectId/templates"),template:p("/dashboard/:projectId/templates/:templateId"),issues:p("/dashboard/:projectId/issues"),issue:p("/dashboard/:projectId/issues/:issueNumber"),issueSessions:p("/dashboard/:projectId/issue-sessions"),issueSession:p("/dashboard/:projectId/issue-sessions/:sessionId"),projectSettings:p("/dashboard/:projectId/settings"),quickStart:p("/start"),publicJob:p("/j/:jobId/:token"),docs:p("/docs/quick-start"),pricing:p("/pricing"),home:p("/")}});var w,we=b(()=>{"use strict";B();w={jobs:p("/jobs"),job:p("/jobs/:jobId"),jobStatus:p("/jobs/:jobId/status"),run:p("/run"),publicJob:p("/public/jobs/:jobId/:token"),keys:p("/keys"),key:p("/keys/:keyId"),keyRevoke:p("/keys/:keyId/revoke"),projects:p("/projects"),project:p("/projects/:projectId"),projectJobs:p("/projects/:projectId/jobs"),projectApiKeys:p("/projects/:projectId/api-keys"),projectTemplates:p("/projects/:projectId/templates"),projectTemplate:p("/projects/:projectId/templates/:templateId"),bulkCreateProjects:p("/projects/bulk"),githubOAuthAuthorize:p("/github/oauth/authorize"),githubCallback:p("/github/auth/callback"),githubInstallations:p("/github/installations"),githubInstallation:p("/github/installations/:installationId"),githubInstallationRefresh:p("/github/installations/:installationId/refresh"),githubRepos:p("/github/repos"),githubRepoCheckAccess:p("/github/repos/check-access"),githubRepoFindUrl:p("/github/repos/find-url"),githubIssuesByRepo:p("/github/issues/:owner/:repo"),githubIssues:p("/github/issues"),githubIssue:p("/github/issues/:issueNumber"),githubIssueComments:p("/github/issues/:issueNumber/comments"),githubIssueLabels:p("/github/issues/labels"),githubIssueAssignees:p("/github/issues/assignees"),githubIssueTest:p("/github/issues/test"),githubIssuesBulkTest:p("/github/issues/bulk-test"),githubTestSessions:p("/github/issues/test-sessions"),githubTestSession:p("/github/issues/test-sessions/:sessionId"),githubTestSessionSeen:p("/github/issues/test-sessions/:sessionId/seen"),githubTestSessionsCounts:p("/github/issues/test-sessions/counts"),githubBulkTest:p("/github/bulk-test"),githubWebhooks:p("/github/webhooks"),authSync:p("/auth/sync"),authMe:p("/auth/me"),authStartup:p("/auth/startup"),authDeleteAccount:p("/auth/account"),tokensBalance:p("/tokens/balance"),tokensTransactions:p("/tokens/transactions"),tokensContact:p("/tokens/contact"),health:p("/health"),templates:p("/templates"),issueAnalyzer:p("/issue-analyzer"),prAnalyzer:p("/pr-analyzer"),logs:p("/logs"),relevantIssuesDiscover:p("/relevant-issues/discover"),relevantIssuesLatest:p("/relevant-issues/latest"),onboarding:p("/onboarding"),onboardingComplete:p("/onboarding/complete"),onboardingCheck:p("/onboarding/check"),search:p("/search"),testerApply:p("/tester/apply"),testerProfile:p("/tester/profile"),testerPublicProfile:p("/testers/:testerId/profile"),repoTemplates:p("/repos/:owner/:repo/templates"),repoTemplate:p("/repos/:owner/:repo/templates/:templateName")}});var je=b(()=>{"use strict";B();be();we()});var Ce=b(()=>{"use strict"});var Ie=b(()=>{"use strict"});var Se=b(()=>{"use strict";Ce();Ie()});var Ae=b(()=>{"use strict"});var ke=b(()=>{"use strict"});var Ue=b(()=>{"use strict";Ae();ke()});var xe=b(()=>{"use strict"});var Pe=b(()=>{"use strict"});var Te=b(()=>{"use strict";xe();Pe()});var Re=b(()=>{"use strict";pe();de();he();je();Se();Ue();Te()});import Lt from"axios";var g,x=b(()=>{"use strict";I();Re();g=class{client;config;constructor(t){if(this.config=t,!t.apiUrl)throw new Error("apiUrl is required in CLI config");this.client=Lt.create({baseURL:t.apiUrl+"/api",timeout:3e4,headers:{"Content-Type":"application/json"}}),this.client.interceptors.request.use(e=>(this.config.apiKey&&(e.headers.Authorization=`Bearer ${this.config.apiKey}`),e)),this.client.interceptors.response.use(e=>e,e=>{throw this.handleError(e)})}handleError(t){if(t.response){let e=t.response.status,n=t.response.data,o=n?.error||n?.message||t.message;switch(e){case 401:case 403:return new W(o,n);case 404:return new q(o,n);case 400:case 422:return new D(o,n);default:return new R(o,1,n)}}return t.code==="ECONNABORTED"?new R("Request timeout",5):t.code==="ENOTFOUND"||t.code==="ECONNREFUSED"?new R("Cannot connect to Runhuman API",1):new R(t.message,1)}async createJob(t){return(await this.client.post(w.jobs.build(),t)).data}async getJob(t){return(await this.client.get(w.jobStatus.build({jobId:t}))).data}async listJobs(t){return(await this.client.get(w.jobs.build(),{params:t})).data}async cancelJob(t){await this.client.post(`${w.job.build({jobId:t})}/cancel`)}async deleteJob(t){await this.client.delete(w.job.build({jobId:t}))}async listProjects(t){return(await this.client.get(w.projects.build(),{params:t})).data}async getProject(t){return(await this.client.get(w.project.build({projectId:t}))).data}async createProject(t){return(await this.client.post(w.projects.build(),t)).data}async updateProject(t,e){return(await this.client.put(w.project.build({projectId:t}),e)).data}async deleteProject(t){await this.client.delete(w.project.build({projectId:t}))}async listApiKeys(t){return(await this.client.get(w.projectApiKeys.build({projectId:t}))).data}async createApiKey(t,e){return(await this.client.post(w.projectApiKeys.build({projectId:t}),{name:e})).data}async deleteApiKey(t){await this.client.delete(w.key.build({keyId:t}))}async listTemplates(t){return(await this.client.get(w.projectTemplates.build({projectId:t}))).data}async getTemplate(t,e){return(await this.client.get(w.projectTemplate.build({projectId:t,templateId:e}))).data}async createTemplate(t,e){return(await this.client.post(w.projectTemplates.build({projectId:t}),e)).data}async updateTemplate(t,e,n){return(await this.client.put(w.projectTemplate.build({projectId:t,templateId:e}),n)).data}async deleteTemplate(t,e){await this.client.delete(w.projectTemplate.build({projectId:t,templateId:e}))}async getCurrentUser(){return(await this.client.get(w.authMe.build())).data}async getTokenBalance(){return(await this.client.get(w.tokensBalance.build())).data}async linkGithubRepo(t,e,n){return(await this.client.post(`${w.project.build({projectId:t})}/github/link`,{owner:e,repo:n})).data}async listGithubRepos(t){let e=t?{projectId:t}:void 0;return(await this.client.get(w.githubRepos.build(),{params:e})).data}async listGithubIssues(t,e,n){return(await this.client.get(w.githubIssuesByRepo.build({owner:t,repo:e}),{params:n})).data}async getGithubIssue(t,e,n){return(await this.client.get(`${w.githubIssuesByRepo.build({owner:t,repo:e})}/${n}`)).data}}});import{cosmiconfig as Jt}from"cosmiconfig";import{homedir as _t}from"os";import{join as v}from"path";import{readFileSync as F,writeFileSync as O,existsSync as P,mkdirSync as te,chmodSync as Ft}from"fs";function zt(s){return Ht.includes(s)}var Kt,E,M,K,Ht,d,k=b(()=>{"use strict";Kt="runhuman",E=v(_t(),".config","runhuman"),M=v(E,"config.json"),K=v(E,"credentials.json"),Ht=["pretty","json","compact"];d=class{constructor(t=process.cwd()){this.cwd=t}projectConfig=null;globalConfig=null;envConfig=null;async loadConfig(t={}){this.envConfig=this.loadEnvConfig(),this.projectConfig=await this.loadProjectConfig(),this.globalConfig=this.loadGlobalConfig();let e=this.loadCredentials(),n=e?.accessToken?{apiKey:e.accessToken}:{},o=Object.fromEntries(Object.entries(t).filter(([,l])=>l!==void 0));return{...this.getDefaults(),...this.globalConfig,...this.projectConfig,...n,...this.envConfig,...o}}getDefaults(){return{apiUrl:"https://runhuman.com",outputFormat:"pretty",color:!0,autoOpenBrowser:!0,defaultDuration:5,defaultScreenSize:"desktop"}}loadEnvConfig(){let t={};return process.env.RUNHUMAN_API_KEY&&(t.apiKey=process.env.RUNHUMAN_API_KEY),process.env.RUNHUMAN_API_URL&&(t.apiUrl=process.env.RUNHUMAN_API_URL),process.env.RUNHUMAN_PROJECT&&(t.project=process.env.RUNHUMAN_PROJECT),process.env.RUNHUMAN_DEFAULT_URL&&(t.defaultUrl=process.env.RUNHUMAN_DEFAULT_URL),process.env.RUNHUMAN_DEFAULT_DURATION&&(t.defaultDuration=parseInt(process.env.RUNHUMAN_DEFAULT_DURATION,10)),process.env.RUNHUMAN_DEFAULT_SCREEN_SIZE&&(t.defaultScreenSize=process.env.RUNHUMAN_DEFAULT_SCREEN_SIZE),process.env.RUNHUMAN_OUTPUT_FORMAT&&zt(process.env.RUNHUMAN_OUTPUT_FORMAT)&&(t.outputFormat=process.env.RUNHUMAN_OUTPUT_FORMAT),process.env.RUNHUMAN_NO_COLOR==="1"&&(t.color=!1),t}async loadProjectConfig(){try{return(await Jt(Kt).search(this.cwd))?.config||null}catch{return null}}loadGlobalConfig(){try{if(!P(M))return null;let t=F(M,"utf-8");return JSON.parse(t)}catch{return null}}async get(t){return(await this.loadConfig())[t]}async set(t,e,n=!1){n?await this.setGlobalConfig(t,e):await this.setProjectConfig(t,e)}async setGlobalConfig(t,e){P(E)||te(E,{recursive:!0});let n={};if(P(M)){let o=F(M,"utf-8");n=JSON.parse(o)}n[t]=e,O(M,JSON.stringify(n,null,2))}async setProjectConfig(t,e){let n=v(this.cwd,".runhumanrc"),o={};if(P(n)){let r=F(n,"utf-8");o=JSON.parse(r)}o[t]=e,O(n,JSON.stringify(o,null,2))}async saveProjectConfig(t){let e=v(this.cwd,".runhumanrc"),n={};if(P(e)){let r=F(e,"utf-8");n=JSON.parse(r)}let o={...n,...t};O(e,JSON.stringify(o,null,2))}async list(){let t=await this.loadConfig();return{global:this.globalConfig,project:this.projectConfig,env:this.envConfig,effective:t}}async reset(t){if((t==="global"||t==="all")&&P(M)&&O(M,"{}"),t==="project"||t==="all"){let e=v(this.cwd,".runhumanrc");P(e)&&O(e,"{}")}}saveCredentials(t){P(E)||te(E,{recursive:!0}),O(K,JSON.stringify(t,null,2));try{process.platform!=="win32"&&Ft(K,384)}catch{}}loadCredentials(){try{if(!P(K))return null;let t=F(K,"utf-8");return JSON.parse(t)}catch{return null}}clearCredentials(){P(K)&&O(K,"{}")}saveUserInfo(t){let e=v(E,"user.json");P(E)||te(E,{recursive:!0}),O(e,JSON.stringify(t,null,2))}loadUserInfo(){try{let t=v(E,"user.json");if(!P(t))return null;let e=F(t,"utf-8");return JSON.parse(e)}catch{return null}}clearUserInfo(){let t=v(E,"user.json");P(t)&&O(t,"{}")}}});import L from"chalk";import Gt from"cli-table3";var a,S=b(()=>{"use strict";a=class{constructor(t={}){this.options=t}output(t){this.options.json?console.log(JSON.stringify(t,null,2)):t.success?t.data&&!this.options.quiet&&this.outputPretty(t.data):this.outputError(t.error?.message||"An error occurred")}outputPretty(t){typeof t=="string"?console.log(t):(Array.isArray(t),console.log(JSON.stringify(t,null,2)))}outputError(t,e){if(this.options.json){let n={success:!1,error:{message:t,details:e},timestamp:new Date().toISOString()};console.error(JSON.stringify(n,null,2))}else console.error(this.color("red",`
|
|
3
3
|
Error: ${t}
|
|
4
4
|
`)),e&&console.error(this.color("gray",JSON.stringify(e,null,2)))}success(t){!this.options.json&&!this.options.quiet&&console.log(this.color("green",`
|
|
5
5
|
${t}
|
|
@@ -149,7 +149,7 @@ Please visit: ${f}`)}}else console.log(`Please visit: ${f}`);console.log(""),con
|
|
|
149
149
|
</body>
|
|
150
150
|
</html>`}function Ke(){let s=new po("login");return s.description("Authenticate with Runhuman").option("--token <token>","Login with API key (skip browser)").option("--no-browser","Print auth URL instead of opening browser").option("--json","Output as JSON").action(async t=>{try{let e=new d,n=await e.loadConfig(),o=new a({json:t.json,color:n.color});if(t.token)await mo(e,o,t.token,t.json);else{let r=t.browser!==!1&&n.autoOpenBrowser!==!1;await go(e,o,n.apiUrl,r,t.json)}}catch(e){let n=m(e);new a({json:t.json}).outputError(n.message,n.details),process.exit(n.exitCode)}}),s}async function mo(s,t,e,n){s.saveCredentials({accessToken:e});let o=await s.loadConfig({apiKey:e}),l=await new g(o).getCurrentUser();s.saveUserInfo(l),n?t.output(a.result({success:!0,user:l})):(t.success("Successfully logged in!"),console.log(` User: ${l.email}`),console.log(` Account ID: ${l.accountId}
|
|
151
151
|
`))}async function go(s,t,e,n,o){o||console.log("Logging in to Runhuman...");let r=await X({apiUrl:e||"https://runhuman.com",autoOpenBrowser:n});s.saveCredentials({accessToken:r.token}),await s.set("project",r.projectId,!0);let l=await s.loadConfig({apiKey:r.token}),c=await new g(l).getCurrentUser();s.saveUserInfo(c),o?t.output(a.result({success:!0,user:c,projectId:r.projectId})):(console.log(""),t.success("Successfully logged in!"),console.log(` User: ${c.email}`),console.log(` Account ID: ${c.accountId}`),console.log(` Default Project: ${r.projectId}
|
|
152
|
-
`))}k();I();S();import{Command as fo}from"commander";function He(){let s=new fo("logout");return s.description("Log out and clear stored credentials").option("--force","Skip confirmation prompt").option("--json","Output as JSON").action(async t=>{try{let e=new d,n=new a({json:t.json});if(e.clearCredentials(),e.clearUserInfo(),t.json){let o=a.result({success:!0,message:"Logged out successfully"});n.output(o)}else n.success("Logged out successfully!"),console.log(`Credentials have been cleared.
|
|
152
|
+
`)),process.exit(0)}k();I();S();import{Command as fo}from"commander";function He(){let s=new fo("logout");return s.description("Log out and clear stored credentials").option("--force","Skip confirmation prompt").option("--json","Output as JSON").action(async t=>{try{let e=new d,n=new a({json:t.json});if(e.clearCredentials(),e.clearUserInfo(),t.json){let o=a.result({success:!0,message:"Logged out successfully"});n.output(o)}else n.success("Logged out successfully!"),console.log(`Credentials have been cleared.
|
|
153
153
|
`)}catch(e){let n=m(e);new a({json:t.json}).outputError(n.message,n.details),process.exit(n.exitCode)}}),s}x();k();I();S();import{Command as ho}from"commander";function ze(){let s=new ho("whoami");return s.description("Display current user information").option("--json","Output as JSON").option("--api-key <key>","API key").option("--api-url <url>","API URL").action(async t=>{try{let e=new d,n=await e.loadConfig({apiKey:t.apiKey,apiUrl:t.apiUrl}),o=new a({json:t.json}),r=new g(n),l=await r.getCurrentUser(),i;try{i=(await r.getTokenBalance()).balance}catch{i=null}let c=e.loadUserInfo();if(t.json){let u=a.result({user:l,balance:i});o.output(u)}else console.log(`
|
|
154
154
|
\u{1F464} Current User
|
|
155
155
|
`),console.log(" Email: "+l.email),console.log(" Account ID: "+l.accountId),i!==null&&console.log(" Token Balance: $"+i.toFixed(2)),n.project&&console.log(`
|