xtra-cli 1.0.6 → 1.0.8

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,14 +1,14 @@
1
- var pe=Object.create;var E=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var ue=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var I=(e,t)=>()=>(e&&(t=e(e=0)),t);var V=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})},J=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of de(t))!le.call(e,n)&&n!==r&&E(e,n,{get:()=>t[n],enumerable:!(s=ge(t,n))||s.enumerable});return e};var l=(e,t,r)=>(r=e!=null?pe(ue(e)):{},J(t||!e||!e.__esModule?E(r,"default",{value:e,enumerable:!0}):r,e)),R=e=>J(E({},"__esModule",{value:!0}),e);var M,_,H,P,y,T,S,C,G,z,U=I(()=>{M=l(require("conf")),_=l(require("fs")),H=l(require("path")),P="https://www.xtrasecurity.in/api",y=new M.default({projectName:"xtra-cli",defaults:{apiUrl:P}}),T=y.get("apiUrl");T&&!process.env.XTRA_API_URL&&(T.includes("localhost")||T.includes("xtra-security.vercel.app"))&&y.set("apiUrl",P);S=()=>({...y.store,apiUrl:process.env.XTRA_API_URL||y.get("apiUrl")||P}),C=e=>y.get(e),G=()=>y.get("token"),z=()=>{let e={};try{let t=H.default.join(process.cwd(),".xtrarc");_.default.existsSync(t)&&(e=JSON.parse(_.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||y.get("project")||"",env:e.env||y.get("env")||"development",branch:e.branch||y.get("branch")||"main"}}});var Y,X,W,fe,o,h,B=I(()=>{Y=l(require("axios"));U();X=l(require("fs")),W=l(require("path")),fe=JSON.parse(X.readFileSync(W.join(__dirname,"../../package.json"),"utf-8")),o=()=>{let{apiUrl:e}=S(),t=G();return Y.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":fe.version,...t?{Authorization:`Bearer ${t}`}:{}}})},h={login:async(e,t,r)=>(await o().post("/auth/cli-login",{email:e,password:t,apiKey:r})).data,getSecrets:async(e,t,r="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?branch=${r}`)).data,getSecretVersions:async(e,t,r="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${r}`)).data,setSecrets:async(e,t,r,s,n="main")=>(await o().post(`/projects/${e}/envs/${t}/secrets`,{secrets:r,expectedVersions:s,branch:n})).data,getSecretDetails:async(e,t,r,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets/${r}?branch=${s}`)).data,syncLogs:async e=>(await o().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,r,s,n,i)=>(await o().post(`/projects/${e}/envs/${t}/secrets/link`,{key:r,sourceProjectId:s,sourceEnv:n,sourceKey:i})).data,rotateSecret:async(e,t,r,s,n)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${r}/rotate`,{strategy:s,parsedNewValue:n})).data,promoteSecret:async(e,t,r)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${r}/promote`,{})).data,verifyAuditLogs:async()=>(await o().get("/audit/verify")).data,exportAuditLogs:async(e,t,r,s)=>{let n={format:e};return t&&(n.startDate=t),r&&(n.endDate=r),s&&(n.projectId=s),(await o().post("/audit/export",n,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,r,s)=>(await o().post("/access/request",{projectId:e,secretId:s,reason:t,duration:r})).data,approveAccess:async(e,t)=>(await o().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=S(),r=t?`&workspaceId=${t}`:"";return(await o().get(`/access/list?mode=${e}${r}`)).data},getAccessRequestStatus:async e=>(await o().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=S(),t=e?`/project?workspaceId=${e}`:"/project";return(await o().get(t)).data},getBranches:async e=>(await o().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,r)=>(await o().post("/branch",{projectId:e,name:t,description:r})).data,deleteBranch:async e=>(await o().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await o().put("/branch",{id:e,...t})).data,getRoles:async()=>(await o().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await o().get(`/admin/users${t}`)).data},setUserRole:async(e,t,r)=>(await o().put("/admin/users/role",{email:e,role:t,teamId:r})).data,getIntegrationStatus:async e=>(await o().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await o().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await o().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let r=new URLSearchParams(t).toString();return(await o().get(`/projects/${e}/kubernetes?${r}`)).data},getSecretHistory:async(e,t,r)=>(await o().get(`/projects/${e}/envs/${t}/secrets/${r}/history`)).data,rollbackSecret:async(e,t,r,s)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${r}/history`,{version:s})).data,cloneEnvironment:async(e,t,r,s,n)=>(await o().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:r,overwrite:s,branch:n})).data,generateJitLink:async e=>(await o().post("/jit/generate",e)).data,claimJitLink:async e=>(await o().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await o().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await o().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await o().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await o().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await o().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,r,s)=>(await o().post(`/projects/${e}/service-accounts/${t}/keys`,{label:r,expiresAt:s})).data,deleteServiceAccountKey:async(e,t,r)=>(await o().delete(`/projects/${e}/service-accounts/${t}/keys/${r}`)).data,post:async(e,t)=>(await o().post(e,t)).data}});function re(){let e=Q.get("masterKey");e||(e=j.default.randomBytes(32).toString("hex"),Q.set("masterKey",e));let t=(0,ee.machineIdSync)();return j.default.createHash("sha256").update(e+t).digest()}var j,Z,ee,te,Q,se,ne,oe=I(()=>{j=l(require("crypto")),Z=l(require("conf")),ee=require("node-machine-id"),te="aes-256-gcm",Q=new Z.default({projectName:"xtra-cli-crypto"});se=e=>{let t=j.default.randomBytes(16),r=re(),s=j.default.createCipheriv(te,r,t),n=s.update(e,"utf8","hex");n+=s.final("hex");let i=s.getAuthTag();return{iv:t.toString("hex"),content:n,tag:i.toString("hex")}},ne=e=>{let t=re(),r=Buffer.from(e.iv,"hex"),s=Buffer.from(e.tag,"hex"),n=j.default.createDecipheriv(te,t,r);n.setAuthTag(s);let i=n.update(e.content,"hex","utf8");return i+=n.final("utf8"),i}});var b={};V(b,{loadAuditLogs:()=>O,logAudit:()=>me,saveAuditLogs:()=>D,syncAuditLogs:()=>he});function ye(e){if(!e||typeof e!="object")return e;let t={...e},r=["password","token","secret","value","apiKey","secretValue"];for(let s of Object.keys(t))r.some(n=>s.toLowerCase().includes(n))&&(t[s]="[REDACTED]");return t}async function ie(e){try{if(!S().token)return!1;let r={action:e.action,entity:"cli-project",entityId:e.projectId||"global",details:ye(e.details),timestamp:e.timestamp,projectId:e.projectId};return await h.post("/audit/cli-logs",{logs:[r]}),!0}catch(t){return process.env.DEBUG&&console.error("Failed to send audit log to backend:",t),!1}}function me(e,t,r,s){let n={id:(0,ce.v4)(),timestamp:new Date().toISOString(),action:e,projectId:t,environment:r,details:s,synced:!1},i=O();i.push(n),D(i),ie(n).then(m=>{if(m){n.synced=!0;let g=O(),d=g.findIndex(c=>c.id===n.id);d!==-1&&(g[d].synced=!0,D(g))}}).catch(()=>{})}function O(){if(!x.default.existsSync(N))return[];try{let e=x.default.readFileSync(N,"utf-8"),t=JSON.parse(e),r=ne(t);return JSON.parse(r)}catch{return[]}}function D(e){x.default.existsSync(K)||x.default.mkdirSync(K,{recursive:!0});let t=JSON.stringify(e),r=se(t);x.default.writeFileSync(N,JSON.stringify(r),"utf-8")}async function he(){let e=O(),t=e.filter(s=>!s.synced);if(t.length===0)return 0;let r=0;for(let s of t)await ie(s)&&(s.synced=!0,r++);return r>0&&D(e),r}var x,q,ce,K,N,$=I(()=>{x=l(require("fs")),q=l(require("path")),ce=require("uuid");oe();U();B();K=q.default.join(process.cwd(),".xtra"),N=q.default.join(K,"audit.enc")});var ve={};V(ve,{secretsCommand:()=>v});module.exports=R(ve);var ae=require("commander");B();var a=l(require("chalk")),k=l(require("ora")),F=require("table");U();var v=new ae.Command("secrets").description("Manage secrets (List, Set, Delete)").option("-p, --project <projectId>","Project ID").option("-e, --env <environment>","Environment (development, staging, production)","development").option("-b, --branch <branchName>","Branch Name");v.command("list").description("List all secrets for a project/environment").option("--show","Reveal secret values",!1).addHelpText("after",`
1
+ var pe=Object.create;var E=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var ue=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var I=(e,t)=>()=>(e&&(t=e(e=0)),t);var F=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})},V=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of de(t))!le.call(e,n)&&n!==r&&E(e,n,{get:()=>t[n],enumerable:!(s=ge(t,n))||s.enumerable});return e};var l=(e,t,r)=>(r=e!=null?pe(ue(e)):{},V(t||!e||!e.__esModule?E(r,"default",{value:e,enumerable:!0}):r,e)),R=e=>V(E({},"__esModule",{value:!0}),e);var M,T,H,_,y,J,S,C,G,z,U=I(()=>{M=l(require("conf")),T=l(require("fs")),H=l(require("path")),_="https://www.xtrasecurity.in/api",y=new M.default({projectName:"xtra-cli",defaults:{apiUrl:_}}),J=y.get("apiUrl");J&&!process.env.XTRA_API_URL&&J.includes("xtra-security.vercel.app")&&y.set("apiUrl",_);S=()=>({...y.store,apiUrl:process.env.XTRA_API_URL||y.get("apiUrl")||_}),C=e=>y.get(e),G=()=>y.get("token"),z=()=>{let e={};try{let t=H.default.join(process.cwd(),".xtrarc");T.default.existsSync(t)&&(e=JSON.parse(T.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||y.get("project")||"",env:e.env||y.get("env")||"development",branch:e.branch||y.get("branch")||"main"}}});var Y,X,W,fe,o,h,P=I(()=>{Y=l(require("axios"));U();X=l(require("fs")),W=l(require("path")),fe=JSON.parse(X.readFileSync(W.join(__dirname,"../../package.json"),"utf-8")),o=()=>{let{apiUrl:e}=S(),t=G();return Y.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":fe.version,...t?{Authorization:`Bearer ${t}`}:{}}})},h={login:async(e,t,r)=>(await o().post("/auth/cli-login",{email:e,password:t,apiKey:r})).data,getSecrets:async(e,t,r="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?branch=${r}`)).data,getSecretVersions:async(e,t,r="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${r}`)).data,setSecrets:async(e,t,r,s,n="main")=>(await o().post(`/projects/${e}/envs/${t}/secrets`,{secrets:r,expectedVersions:s,branch:n})).data,getSecretDetails:async(e,t,r,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets/${r}?branch=${s}`)).data,syncLogs:async e=>(await o().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,r,s,n,i)=>(await o().post(`/projects/${e}/envs/${t}/secrets/link`,{key:r,sourceProjectId:s,sourceEnv:n,sourceKey:i})).data,rotateSecret:async(e,t,r,s,n)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${r}/rotate`,{strategy:s,parsedNewValue:n})).data,promoteSecret:async(e,t,r)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${r}/promote`,{})).data,verifyAuditLogs:async()=>(await o().get("/audit/verify")).data,exportAuditLogs:async(e,t,r,s)=>{let n={format:e};return t&&(n.startDate=t),r&&(n.endDate=r),s&&(n.projectId=s),(await o().post("/audit/export",n,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,r,s)=>(await o().post("/access/request",{projectId:e,secretId:s,reason:t,duration:r})).data,approveAccess:async(e,t)=>(await o().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=S(),r=t?`&workspaceId=${t}`:"";return(await o().get(`/access/list?mode=${e}${r}`)).data},getAccessRequestStatus:async e=>(await o().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=S(),t=e?`/project?workspaceId=${e}`:"/project";return(await o().get(t)).data},getBranches:async e=>(await o().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,r)=>(await o().post("/branch",{projectId:e,name:t,description:r})).data,deleteBranch:async e=>(await o().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await o().put("/branch",{id:e,...t})).data,getRoles:async()=>(await o().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await o().get(`/admin/users${t}`)).data},setUserRole:async(e,t,r)=>(await o().put("/admin/users/role",{email:e,role:t,teamId:r})).data,getIntegrationStatus:async e=>(await o().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await o().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await o().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let r=new URLSearchParams(t).toString();return(await o().get(`/projects/${e}/kubernetes?${r}`)).data},getSecretHistory:async(e,t,r)=>(await o().get(`/projects/${e}/envs/${t}/secrets/${r}/history`)).data,rollbackSecret:async(e,t,r,s)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${r}/history`,{version:s})).data,cloneEnvironment:async(e,t,r,s,n)=>(await o().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:r,overwrite:s,branch:n})).data,generateJitLink:async e=>(await o().post("/jit/generate",e)).data,claimJitLink:async e=>(await o().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await o().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await o().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await o().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await o().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await o().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,r,s)=>(await o().post(`/projects/${e}/service-accounts/${t}/keys`,{label:r,expiresAt:s})).data,deleteServiceAccountKey:async(e,t,r)=>(await o().delete(`/projects/${e}/service-accounts/${t}/keys/${r}`)).data,post:async(e,t)=>(await o().post(e,t)).data}});function re(){let e=Q.get("masterKey");e||(e=j.default.randomBytes(32).toString("hex"),Q.set("masterKey",e));let t=(0,ee.machineIdSync)();return j.default.createHash("sha256").update(e+t).digest()}var j,Z,ee,te,Q,se,ne,oe=I(()=>{j=l(require("crypto")),Z=l(require("conf")),ee=require("node-machine-id"),te="aes-256-gcm",Q=new Z.default({projectName:"xtra-cli-crypto"});se=e=>{let t=j.default.randomBytes(16),r=re(),s=j.default.createCipheriv(te,r,t),n=s.update(e,"utf8","hex");n+=s.final("hex");let i=s.getAuthTag();return{iv:t.toString("hex"),content:n,tag:i.toString("hex")}},ne=e=>{let t=re(),r=Buffer.from(e.iv,"hex"),s=Buffer.from(e.tag,"hex"),n=j.default.createDecipheriv(te,t,r);n.setAuthTag(s);let i=n.update(e.content,"hex","utf8");return i+=n.final("utf8"),i}});var b={};F(b,{loadAuditLogs:()=>O,logAudit:()=>me,saveAuditLogs:()=>D,syncAuditLogs:()=>he});function ye(e){if(!e||typeof e!="object")return e;let t={...e},r=["password","token","secret","value","apiKey","secretValue"];for(let s of Object.keys(t))r.some(n=>s.toLowerCase().includes(n))&&(t[s]="[REDACTED]");return t}async function ie(e){try{if(!S().token)return!1;let r={action:e.action,entity:"cli-project",entityId:e.projectId||"global",details:ye(e.details),timestamp:e.timestamp,projectId:e.projectId};return await h.post("/audit/cli-logs",{logs:[r]}),!0}catch(t){return process.env.DEBUG&&console.error("Failed to send audit log to backend:",t),!1}}function me(e,t,r,s){let n={id:(0,ce.v4)(),timestamp:new Date().toISOString(),action:e,projectId:t,environment:r,details:s,synced:!1},i=O();i.push(n),D(i),ie(n).then(m=>{if(m){n.synced=!0;let g=O(),d=g.findIndex(c=>c.id===n.id);d!==-1&&(g[d].synced=!0,D(g))}}).catch(()=>{})}function O(){if(!x.default.existsSync(K))return[];try{let e=x.default.readFileSync(K,"utf-8"),t=JSON.parse(e),r=ne(t);return JSON.parse(r)}catch{return[]}}function D(e){x.default.existsSync(B)||x.default.mkdirSync(B,{recursive:!0});let t=JSON.stringify(e),r=se(t);x.default.writeFileSync(K,JSON.stringify(r),"utf-8")}async function he(){let e=O(),t=e.filter(s=>!s.synced);if(t.length===0)return 0;let r=0;for(let s of t)await ie(s)&&(s.synced=!0,r++);return r>0&&D(e),r}var x,N,ce,B,K,$=I(()=>{x=l(require("fs")),N=l(require("path")),ce=require("uuid");oe();U();P();B=N.default.join(process.cwd(),".xtra"),K=N.default.join(B,"audit.enc")});var ve={};F(ve,{secretsCommand:()=>v});module.exports=R(ve);var ae=require("commander");P();var a=l(require("chalk")),k=l(require("ora")),q=require("table");U();var v=new ae.Command("secrets").description("Manage secrets (List, Set, Delete)").option("-p, --project <projectId>","Project ID").option("-e, --env <environment>","Environment (development, staging, production)","development").option("-b, --branch <branchName>","Branch Name");v.command("list").description("List all secrets for a project/environment").option("--show","Reveal secret values",!1).addHelpText("after",`
2
2
  Examples:
3
3
  $ xtra secrets list
4
4
  $ xtra secrets list -e production --show
5
- `).action(async e=>{let t=v.opts(),{project:r,env:s,branch:n}=t,i=z();r||(r=i.project),n||(n=i.branch),(!s||s==="development")&&(s=i.env),s={dev:"development",stg:"staging",prod:"production"}[s]||s;let{show:g}=e;r||(console.error(a.default.red("Error: Project ID is required. Use -p <id> or run `xtra init` first.")),process.exit(1));let d=(0,k.default)(`Fetching secrets for ${s} (branch: ${n})...`).start();try{let c=await h.getSecrets(r,s,n);if(d.stop(),!c||Object.keys(c).length===0){console.log(a.default.yellow("No secrets found."));return}g&&console.log(a.default.red("\u26A0 Warning: Secret values will be visible in your terminal and shell history!"));let p=[[a.default.bold("Key"),a.default.bold("Value"),a.default.bold("Env")]];Object.entries(c).forEach(([u,f])=>{p.push([u,g?f:"********",s])}),console.log((0,F.table)(p));try{let{logAudit:u}=await Promise.resolve().then(()=>($(),b));u("SECRET_LIST",r,s,{branch:n,count:Object.keys(c).length})}catch{}}catch(c){d.fail("Failed to fetch secrets"),console.error(a.default.red(c?.response?.data?.error||"An unexpected error occurred"))}});v.command("set").description("Set one or more secrets (KEY=VALUE)").argument("<secrets...>","Secrets to set (format: KEY=VALUE)").option("-f, --force","Force update (overwrite remote changes without warning)",!1).addHelpText("after",`
5
+ `).action(async e=>{let t=v.opts(),{project:r,env:s,branch:n}=t,i=z();r||(r=i.project),n||(n=i.branch),(!s||s==="development")&&(s=i.env),s={dev:"development",stg:"staging",prod:"production"}[s]||s;let{show:g}=e;r||(console.error(a.default.red("Error: Project ID is required. Use -p <id> or run `xtra init` first.")),process.exit(1));let d=(0,k.default)(`Fetching secrets for ${s} (branch: ${n})...`).start();try{let c=await h.getSecrets(r,s,n);if(d.stop(),!c||Object.keys(c).length===0){console.log(a.default.yellow("No secrets found."));return}g&&console.log(a.default.red("\u26A0 Warning: Secret values will be visible in your terminal and shell history!"));let p=[[a.default.bold("Key"),a.default.bold("Value"),a.default.bold("Env")]];Object.entries(c).forEach(([u,f])=>{p.push([u,g?f:"********",s])}),console.log((0,q.table)(p));try{let{logAudit:u}=await Promise.resolve().then(()=>($(),b));u("SECRET_LIST",r,s,{branch:n,count:Object.keys(c).length})}catch{}}catch(c){d.fail("Failed to fetch secrets"),console.error(a.default.red(c?.response?.data?.error||"An unexpected error occurred"))}});v.command("set").description("Set one or more secrets (KEY=VALUE)").argument("<secrets...>","Secrets to set (format: KEY=VALUE)").option("-f, --force","Force update (overwrite remote changes without warning)",!1).addHelpText("after",`
6
6
  Examples:
7
7
  $ xtra secrets set API_KEY=xyz
8
8
  $ xtra secrets set DB_USER=admin DB_PASS=secret -e staging
9
9
  `).action(async(e,t)=>{let r=v.opts(),{project:s,env:n,branch:i}=r;i||(i=C("branch")||"main"),n={dev:"development",stg:"staging",prod:"production"}[n]||n,s||(s=C("project")),s||(console.error(a.default.red("Error: Project ID is required. Use -p <id> or run 'xtra project set' first.")),process.exit(1));let g={};if(e.forEach(c=>{let p=c.indexOf("=");if(p===-1){console.warn(a.default.yellow(`Skipping invalid format: ${c} (expected KEY=VALUE)`));return}let u=c.substring(0,p),f=c.substring(p+1);g[u]=f}),Object.keys(g).length===0){console.error(a.default.red("No valid secrets provided."));return}if(n==="production"&&!t.force){let c=require("inquirer"),{confirm:p}=await c.prompt([{type:"confirm",name:"confirm",message:a.default.red(`\u26A0 You are about to SET ${Object.keys(g).length} secret(s) in PRODUCTION. Are you sure?`),default:!1}]);if(!p){console.log(a.default.yellow("Aborted."));return}}let d=(0,k.default)(`Setting ${Object.keys(g).length} secrets for ${n} (branch: ${i})...`);t.force&&d.start();try{let c;if(!t.force){d.text="Fetching current versions...",d.start();try{let p=await h.getSecretVersions(s,n,i);c={},d.stop(),Object.keys(g).forEach(u=>{p[u]&&(c[u]=p[u].version)})}catch{d.warn(a.default.yellow("Could not fetch remote versions. Conflict detection disabled."))}}d.start("Updating secrets..."),await h.setSecrets(s,n,g,c,i),d.succeed("Secrets updated successfully.");try{let{logAudit:p}=($(),R(b));p("SECRET_UPDATE",s,n,{keys:Object.keys(g),branch:i})}catch{}}catch(c){if(d.stop(),c.response&&c.response.status===409){let p=c.response.data.conflicts||[];console.log(a.default.red(`
10
10
  \u26A0 Conflict Detected! The following secrets have changed remotely:
11
- `));let u=[[a.default.bold("Key"),a.default.bold("Remote Version"),a.default.bold("Remote Value")]];p.forEach(w=>{u.push([w.key,w.actual,w.remoteValue])}),console.log((0,F.table)(u));let f=require("inquirer"),{confirm:L}=await f.prompt([{type:"confirm",name:"confirm",message:"Do you want to overwrite these changes exactly as you specified?",default:!1}]);if(L){let w=(0,k.default)("Overwriting secrets...").start();try{await h.setSecrets(s,n,g,void 0,i),w.succeed("Secrets overwritten successfully.");try{let{logAudit:A}=($(),R(b));A("SECRET_UPDATE_FORCE",s,n,{keys:Object.keys(g),branch:i})}catch{}}catch(A){w.fail("Failed to overwrite secrets."),console.error(a.default.red(A.message))}}else console.log(a.default.yellow("Update cancelled."));return}d.isSpinning&&d.fail("Failed to update secrets"),c.response&&c.response.data&&c.response.data.error?console.error(a.default.red(`Server Error: ${c.response.data.error}`)):console.error(a.default.red(c?.response?.data?.error||"An unexpected error occurred"))}});v.command("link").description("Link a secret to another secret (Reference)").argument("<key>","Key of the secret to create (e.g. DB_URL)").requiredOption("--source <source>","Source path (format: project/env/key)").addHelpText("after",`
11
+ `));let u=[[a.default.bold("Key"),a.default.bold("Remote Version"),a.default.bold("Remote Value")]];p.forEach(w=>{u.push([w.key,w.actual,w.remoteValue])}),console.log((0,q.table)(u));let f=require("inquirer"),{confirm:L}=await f.prompt([{type:"confirm",name:"confirm",message:"Do you want to overwrite these changes exactly as you specified?",default:!1}]);if(L){let w=(0,k.default)("Overwriting secrets...").start();try{await h.setSecrets(s,n,g,void 0,i),w.succeed("Secrets overwritten successfully.");try{let{logAudit:A}=($(),R(b));A("SECRET_UPDATE_FORCE",s,n,{keys:Object.keys(g),branch:i})}catch{}}catch(A){w.fail("Failed to overwrite secrets."),console.error(a.default.red(A.message))}}else console.log(a.default.yellow("Update cancelled."));return}d.isSpinning&&d.fail("Failed to update secrets"),c.response&&c.response.data&&c.response.data.error?console.error(a.default.red(`Server Error: ${c.response.data.error}`)):console.error(a.default.red(c?.response?.data?.error||"An unexpected error occurred"))}});v.command("link").description("Link a secret to another secret (Reference)").argument("<key>","Key of the secret to create (e.g. DB_URL)").requiredOption("--source <source>","Source path (format: project/env/key)").addHelpText("after",`
12
12
  Examples:
13
13
  $ xtra secrets link SHARED_DB_URL --source shared-proj/production/DB_URL
14
14
  `).action(async(e,t)=>{let r=v.opts(),{project:s,env:n}=r;n={dev:"development",stg:"staging",prod:"production"}[n]||n;let{source:m}=t;s||(s=C("project")),s||(console.error(a.default.red("Error: Project ID is required. Use -p <id> or run 'xtra project set' first.")),process.exit(1));let g=m.split("/");if(g.length!==3){console.error(a.default.red("Error: Source must be in format 'projectId/env/key'"));return}let[d,c,p]=g,u=(0,k.default)(`Linking ${e} to ${m}...`).start();try{await h.linkSecret(s,n,e,d,c,p),u.succeed(a.default.green(`Secret '${e}' successfully linked to '${p}'`));try{let{logAudit:f}=($(),R(b));f("SECRET_LINKED",s,n,{key:e,source:m})}catch{}}catch(f){u.fail("Failed to link secret");let L=f?.response?.data?.error||f?.response?.data?.error||"An unexpected error occurred";console.error(a.default.red(`Server Error: ${L}`))}});0&&(module.exports={secretsCommand});
@@ -1,7 +1,7 @@
1
- var C=Object.create;var m=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var N=(e,t)=>{for(var s in t)m(e,s,{get:t[s],enumerable:!0})},h=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of P(t))!L.call(e,n)&&n!==s&&m(e,n,{get:()=>t[n],enumerable:!(r=D(t,n))||r.enumerable});return e};var p=(e,t,s)=>(s=e!=null?C(R(e)):{},h(t||!e||!e.__esModule?m(s,"default",{value:e,enumerable:!0}):s,e)),K=e=>h(m({},"__esModule",{value:!0}),e);var _={};N(_,{serviceAccountCommand:()=>d});module.exports=K(_);var A=require("commander");var b=p(require("axios"));var $=p(require("conf"));var v="https://www.xtrasecurity.in/api",u=new $.default({projectName:"xtra-cli",defaults:{apiUrl:v}}),w=u.get("apiUrl");w&&!process.env.XTRA_API_URL&&(w.includes("localhost")||w.includes("xtra-security.vercel.app"))&&u.set("apiUrl",v);var f=()=>({...u.store,apiUrl:process.env.XTRA_API_URL||u.get("apiUrl")||v}),k=e=>u.get(e);var S=()=>u.get("token");var I=p(require("fs")),x=p(require("path")),T=JSON.parse(I.readFileSync(x.join(__dirname,"../../package.json"),"utf-8")),o=()=>{let{apiUrl:e}=f(),t=S();return b.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":T.version,...t?{Authorization:`Bearer ${t}`}:{}}})},g={login:async(e,t,s)=>(await o().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,r,n="main")=>(await o().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:r,branch:n})).data,getSecretDetails:async(e,t,s,r="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${r}`)).data,syncLogs:async e=>(await o().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,r,n,c)=>(await o().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:r,sourceEnv:n,sourceKey:c})).data,rotateSecret:async(e,t,s,r,n)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:r,parsedNewValue:n})).data,promoteSecret:async(e,t,s)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await o().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,r)=>{let n={format:e};return t&&(n.startDate=t),s&&(n.endDate=s),r&&(n.projectId=r),(await o().post("/audit/export",n,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,r)=>(await o().post("/access/request",{projectId:e,secretId:r,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await o().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=f(),s=t?`&workspaceId=${t}`:"";return(await o().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await o().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=f(),t=e?`/project?workspaceId=${e}`:"/project";return(await o().get(t)).data},getBranches:async e=>(await o().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await o().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await o().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await o().put("/branch",{id:e,...t})).data,getRoles:async()=>(await o().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await o().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await o().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await o().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await o().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await o().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await o().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await o().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,r)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:r})).data,cloneEnvironment:async(e,t,s,r,n)=>(await o().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:r,branch:n})).data,generateJitLink:async e=>(await o().post("/jit/generate",e)).data,claimJitLink:async e=>(await o().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await o().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await o().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await o().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await o().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await o().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,r)=>(await o().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:r})).data,deleteServiceAccountKey:async(e,t,s)=>(await o().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await o().post(e,t)).data};var a=p(require("chalk")),l=p(require("ora")),j=require("table");var U=p(require("inquirer")),d=new A.Command("service-account").alias("sa").description("Manage service accounts and machine tokens"),y=e=>{let t=e.project||k("project");return t||(console.error(a.default.red("\u2716 Error: No project specified.")),console.log(a.default.yellow(" Use --project <id> or run 'xtra project set' first.")),process.exit(1)),t};d.command("list").alias("ls").description("List all service accounts in a project").option("-p, --project <id>","Project ID").action(async e=>{let t=y(e),s=(0,l.default)("Fetching service accounts...").start();try{let r=await g.getServiceAccounts(t);if(s.stop(),!r||r.length===0){console.log(a.default.yellow("No service accounts found for this project."));return}console.log(a.default.bold(`
1
+ var C=Object.create;var m=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var N=(e,t)=>{for(var s in t)m(e,s,{get:t[s],enumerable:!0})},j=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of P(t))!L.call(e,n)&&n!==s&&m(e,n,{get:()=>t[n],enumerable:!(r=D(t,n))||r.enumerable});return e};var p=(e,t,s)=>(s=e!=null?C(R(e)):{},j(t||!e||!e.__esModule?m(s,"default",{value:e,enumerable:!0}):s,e)),K=e=>j(m({},"__esModule",{value:!0}),e);var _={};N(_,{serviceAccountCommand:()=>d});module.exports=K(_);var A=require("commander");var b=p(require("axios"));var $=p(require("conf"));var w="https://www.xtrasecurity.in/api",u=new $.default({projectName:"xtra-cli",defaults:{apiUrl:w}}),h=u.get("apiUrl");h&&!process.env.XTRA_API_URL&&h.includes("xtra-security.vercel.app")&&u.set("apiUrl",w);var f=()=>({...u.store,apiUrl:process.env.XTRA_API_URL||u.get("apiUrl")||w}),k=e=>u.get(e);var S=()=>u.get("token");var I=p(require("fs")),x=p(require("path")),T=JSON.parse(I.readFileSync(x.join(__dirname,"../../package.json"),"utf-8")),o=()=>{let{apiUrl:e}=f(),t=S();return b.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":T.version,...t?{Authorization:`Bearer ${t}`}:{}}})},g={login:async(e,t,s)=>(await o().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,r,n="main")=>(await o().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:r,branch:n})).data,getSecretDetails:async(e,t,s,r="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${r}`)).data,syncLogs:async e=>(await o().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,r,n,c)=>(await o().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:r,sourceEnv:n,sourceKey:c})).data,rotateSecret:async(e,t,s,r,n)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:r,parsedNewValue:n})).data,promoteSecret:async(e,t,s)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await o().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,r)=>{let n={format:e};return t&&(n.startDate=t),s&&(n.endDate=s),r&&(n.projectId=r),(await o().post("/audit/export",n,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,r)=>(await o().post("/access/request",{projectId:e,secretId:r,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await o().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=f(),s=t?`&workspaceId=${t}`:"";return(await o().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await o().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=f(),t=e?`/project?workspaceId=${e}`:"/project";return(await o().get(t)).data},getBranches:async e=>(await o().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await o().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await o().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await o().put("/branch",{id:e,...t})).data,getRoles:async()=>(await o().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await o().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await o().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await o().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await o().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await o().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await o().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await o().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,r)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:r})).data,cloneEnvironment:async(e,t,s,r,n)=>(await o().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:r,branch:n})).data,generateJitLink:async e=>(await o().post("/jit/generate",e)).data,claimJitLink:async e=>(await o().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await o().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await o().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await o().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await o().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await o().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,r)=>(await o().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:r})).data,deleteServiceAccountKey:async(e,t,s)=>(await o().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await o().post(e,t)).data};var a=p(require("chalk")),l=p(require("ora")),v=require("table");var U=p(require("inquirer")),d=new A.Command("service-account").alias("sa").description("Manage service accounts and machine tokens"),y=e=>{let t=e.project||k("project");return t||(console.error(a.default.red("\u2716 Error: No project specified.")),console.log(a.default.yellow(" Use --project <id> or run 'xtra project set' first.")),process.exit(1)),t};d.command("list").alias("ls").description("List all service accounts in a project").option("-p, --project <id>","Project ID").action(async e=>{let t=y(e),s=(0,l.default)("Fetching service accounts...").start();try{let r=await g.getServiceAccounts(t);if(s.stop(),!r||r.length===0){console.log(a.default.yellow("No service accounts found for this project."));return}console.log(a.default.bold(`
2
2
  Service Accounts for Project ${t}:
3
- `));let n=[[a.default.bold("ID"),a.default.bold("Name"),a.default.bold("Keys"),a.default.bold("Permissions")]];r.forEach(c=>{n.push([a.default.cyan(c.id),c.name,c._count?.apiKeys||0,c.permissions?.join(", ")||"-"])}),console.log((0,j.table)(n))}catch(r){s.fail("Failed to fetch service accounts"),console.error(a.default.red(r.response?.data?.error||"Unknown error"))}});d.command("create <name>").description("Create a new service account").option("-p, --project <id>","Project ID").option("-d, --description <text>","Description").option("-r, --role <roles>","Comma-separated permissions (read:secrets, write:secrets)","read:secrets").action(async(e,t)=>{let s=y(t),r=t.role.split(",").map(c=>c.trim()),n=(0,l.default)(`Creating service account '${e}'...`).start();try{let c=await g.createServiceAccount(s,{name:e,description:t.description,permissions:r});n.succeed(a.default.green("Service account created successfully!")),console.log(a.default.cyan(`ID: ${c.id}`)),console.log(a.default.gray(`Next: Run 'xtra sa create-key ${c.id}' to generate a token.`))}catch(c){n.fail("Failed to create service account"),console.error(a.default.red(c.response?.data?.error||"Unknown error"))}});d.command("delete <id>").description("Delete a service account").option("-p, --project <id>","Project ID").action(async(e,t)=>{let s=y(t),{confirm:r}=await U.default.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete service account ${e}? This will invalidate all its keys.`,default:!1}]);if(!r)return;let n=(0,l.default)(`Deleting service account ${e}...`).start();try{await g.deleteServiceAccount(s,e),n.succeed(a.default.green("Service account deleted."))}catch(c){n.fail("Failed to delete service account"),console.error(a.default.red(c.response?.data?.error||"Unknown error"))}});d.command("keys <saId>").description("List keys/tokens for a service account").option("-p, --project <id>","Project ID").action(async(e,t)=>{let s=y(t),r=(0,l.default)("Fetching keys...").start();try{let n=await g.getServiceAccountKeys(s,e);if(r.stop(),!n||n.length===0){console.log(a.default.yellow("No keys found for this service account."));return}console.log(a.default.bold(`
3
+ `));let n=[[a.default.bold("ID"),a.default.bold("Name"),a.default.bold("Keys"),a.default.bold("Permissions")]];r.forEach(c=>{n.push([a.default.cyan(c.id),c.name,c._count?.apiKeys||0,c.permissions?.join(", ")||"-"])}),console.log((0,v.table)(n))}catch(r){s.fail("Failed to fetch service accounts"),console.error(a.default.red(r.response?.data?.error||"Unknown error"))}});d.command("create <name>").description("Create a new service account").option("-p, --project <id>","Project ID").option("-d, --description <text>","Description").option("-r, --role <roles>","Comma-separated permissions (read:secrets, write:secrets)","read:secrets").action(async(e,t)=>{let s=y(t),r=t.role.split(",").map(c=>c.trim()),n=(0,l.default)(`Creating service account '${e}'...`).start();try{let c=await g.createServiceAccount(s,{name:e,description:t.description,permissions:r});n.succeed(a.default.green("Service account created successfully!")),console.log(a.default.cyan(`ID: ${c.id}`)),console.log(a.default.gray(`Next: Run 'xtra sa create-key ${c.id}' to generate a token.`))}catch(c){n.fail("Failed to create service account"),console.error(a.default.red(c.response?.data?.error||"Unknown error"))}});d.command("delete <id>").description("Delete a service account").option("-p, --project <id>","Project ID").action(async(e,t)=>{let s=y(t),{confirm:r}=await U.default.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete service account ${e}? This will invalidate all its keys.`,default:!1}]);if(!r)return;let n=(0,l.default)(`Deleting service account ${e}...`).start();try{await g.deleteServiceAccount(s,e),n.succeed(a.default.green("Service account deleted."))}catch(c){n.fail("Failed to delete service account"),console.error(a.default.red(c.response?.data?.error||"Unknown error"))}});d.command("keys <saId>").description("List keys/tokens for a service account").option("-p, --project <id>","Project ID").action(async(e,t)=>{let s=y(t),r=(0,l.default)("Fetching keys...").start();try{let n=await g.getServiceAccountKeys(s,e);if(r.stop(),!n||n.length===0){console.log(a.default.yellow("No keys found for this service account."));return}console.log(a.default.bold(`
4
4
  Keys for Service Account ${e}:
5
- `));let c=[[a.default.bold("ID"),a.default.bold("Label"),a.default.bold("Key Mask"),a.default.bold("Last Used"),a.default.bold("Expires")]];n.forEach(i=>{c.push([a.default.cyan(i.id),i.label||"-",a.default.yellow(i.keyMask||"****"),i.lastUsed?new Date(i.lastUsed).toLocaleString():"Never",i.expiresAt?new Date(i.expiresAt).toLocaleDateString():"Never"])}),console.log((0,j.table)(c))}catch(n){r.fail("Failed to fetch keys"),console.error(a.default.red(n.response?.data?.error||"Unknown error"))}});d.command("create-key <saId>").description("Generate a new token for a service account").option("-p, --project <id>","Project ID").option("-l, --label <text>","Label for the key","CLI Key").option("-e, --expires <days>","Expiration in days (0 for never)","0").action(async(e,t)=>{let s=y(t),r;if(t.expires&&t.expires!=="0"){let c=new Date;c.setDate(c.getDate()+parseInt(t.expires)),r=c.toISOString()}let n=(0,l.default)("Generating new token...").start();try{let c=await g.createServiceAccountKey(s,e,t.label,r);n.succeed(a.default.green("New token generated successfully!")),console.log(`
5
+ `));let c=[[a.default.bold("ID"),a.default.bold("Label"),a.default.bold("Key Mask"),a.default.bold("Last Used"),a.default.bold("Expires")]];n.forEach(i=>{c.push([a.default.cyan(i.id),i.label||"-",a.default.yellow(i.keyMask||"****"),i.lastUsed?new Date(i.lastUsed).toLocaleString():"Never",i.expiresAt?new Date(i.expiresAt).toLocaleDateString():"Never"])}),console.log((0,v.table)(c))}catch(n){r.fail("Failed to fetch keys"),console.error(a.default.red(n.response?.data?.error||"Unknown error"))}});d.command("create-key <saId>").description("Generate a new token for a service account").option("-p, --project <id>","Project ID").option("-l, --label <text>","Label for the key","CLI Key").option("-e, --expires <days>","Expiration in days (0 for never)","0").action(async(e,t)=>{let s=y(t),r;if(t.expires&&t.expires!=="0"){let c=new Date;c.setDate(c.getDate()+parseInt(t.expires)),r=c.toISOString()}let n=(0,l.default)("Generating new token...").start();try{let c=await g.createServiceAccountKey(s,e,t.label,r);n.succeed(a.default.green("New token generated successfully!")),console.log(`
6
6
  `+a.default.bold("SAVE THIS TOKEN NOW. It will NOT be shown again.")),console.log(a.default.black.bgGreen(` ${c.key} `)+`
7
7
  `),console.log(a.default.gray("Usage:")),console.log(a.default.white(`$env:XTRA_MACHINE_TOKEN = "${c.key}"`)),console.log(a.default.white("xtra ci run -- npm start"))}catch(c){n.fail("Failed to generate token"),console.error(a.default.red(c.response?.data?.error||"Unknown error"))}});d.command("delete-key <saId> <keyId>").description("Revoke a service account token").option("-p, --project <id>","Project ID").action(async(e,t,s)=>{let r=y(s),n=(0,l.default)(`Revoking key ${t}...`).start();try{await g.deleteServiceAccountKey(r,e,t),n.succeed(a.default.green("Key revoked successfully."))}catch(c){n.fail("Failed to revoke key"),console.error(a.default.red(c.response?.data?.error||"Unknown error"))}});0&&(module.exports={serviceAccountCommand});
@@ -1,6 +1,6 @@
1
- var G=Object.create;var u=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var E=(e,t)=>{for(var s in t)u(e,s,{get:t[s],enumerable:!0})},R=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of F(t))!M.call(e,a)&&a!==s&&u(e,a,{get:()=>t[a],enumerable:!(r=W(t,a))||r.enumerable});return e};var c=(e,t,s)=>(s=e!=null?G(K(e)):{},R(t||!e||!e.__esModule?u(s,"default",{value:e,enumerable:!0}):s,e)),H=e=>R(u({},"__esModule",{value:!0}),e);var Q={};E(Q,{simulateCommand:()=>z});module.exports=H(Q);var J=require("commander");var L=c(require("axios"));var I=c(require("conf")),$=c(require("fs")),C=c(require("path")),b="https://www.xtrasecurity.in/api",p=new I.default({projectName:"xtra-cli",defaults:{apiUrl:b}}),j=p.get("apiUrl");j&&!process.env.XTRA_API_URL&&(j.includes("localhost")||j.includes("xtra-security.vercel.app"))&&p.set("apiUrl",b);var y=()=>({...p.store,apiUrl:process.env.XTRA_API_URL||p.get("apiUrl")||b});var A=()=>p.get("token");var U=()=>{let e={};try{let t=C.default.join(process.cwd(),".xtrarc");$.default.existsSync(t)&&(e=JSON.parse($.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||p.get("project")||"",env:e.env||p.get("env")||"development",branch:e.branch||p.get("branch")||"main"}};var P=c(require("fs")),B=c(require("path")),X=JSON.parse(P.readFileSync(B.join(__dirname,"../../package.json"),"utf-8")),n=()=>{let{apiUrl:e}=y(),t=A();return L.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":X.version,...t?{Authorization:`Bearer ${t}`}:{}}})},_={login:async(e,t,s)=>(await n().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await n().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await n().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,r,a="main")=>(await n().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:r,branch:a})).data,getSecretDetails:async(e,t,s,r="main")=>(await n().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${r}`)).data,syncLogs:async e=>(await n().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,r,a,i)=>(await n().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:r,sourceEnv:a,sourceKey:i})).data,rotateSecret:async(e,t,s,r,a)=>(await n().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:r,parsedNewValue:a})).data,promoteSecret:async(e,t,s)=>(await n().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await n().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,r)=>{let a={format:e};return t&&(a.startDate=t),s&&(a.endDate=s),r&&(a.projectId=r),(await n().post("/audit/export",a,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,r)=>(await n().post("/access/request",{projectId:e,secretId:r,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await n().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=y(),s=t?`&workspaceId=${t}`:"";return(await n().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await n().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=y(),t=e?`/project?workspaceId=${e}`:"/project";return(await n().get(t)).data},getBranches:async e=>(await n().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await n().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await n().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await n().put("/branch",{id:e,...t})).data,getRoles:async()=>(await n().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await n().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await n().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await n().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await n().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await n().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await n().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await n().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,r)=>(await n().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:r})).data,cloneEnvironment:async(e,t,s,r,a)=>(await n().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:r,branch:a})).data,generateJitLink:async e=>(await n().post("/jit/generate",e)).data,claimJitLink:async e=>(await n().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await n().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await n().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await n().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await n().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await n().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,r)=>(await n().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:r})).data,deleteServiceAccountKey:async(e,t,s)=>(await n().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await n().post(e,t)).data};var o=c(require("chalk")),T=c(require("ora")),D=require("table"),z=new J.Command("simulate").description("Dry-run: show what 'xtra run' would inject without executing the command").option("-p, --project <id>","Project ID").option("-e, --env <environment>","Environment","development").option("-b, --branch <branch>","Branch","main").argument("[command]","Command that would be executed (display only)").option("--show-values","Reveal secret values in output (default: masked)",!1).option("--diff","Highlight secrets that differ from local .env / process.env",!1).action(async(e,t)=>{let{project:s,env:r,branch:a,showValues:i,diff:g}=t;r={dev:"development",stg:"staging",prod:"production"}[r]||r,s||(s=U().project),s||(console.error(o.default.red("Error: Project ID required. Use -p <id> or run 'xtra project set'.")),process.exit(1));let S=(0,T.default)(`Fetching secrets to simulate injection (${r}/${a})...`).start(),m;try{m=await _.getSecrets(s,r,a),S.stop()}catch(l){S.fail("Failed to fetch secrets."),console.error(o.default.red(l?.response?.data?.error||l?.response?.data?.error||"An unexpected error occurred")),process.exit(1)}let f=Object.keys(m).length,h=process.stdout.columns||100,O=Math.floor(h*.25),V=Math.floor(h*.4),N=Math.floor(h*.15);if(console.log(o.default.bold.cyan(`
1
+ var G=Object.create;var u=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var E=(e,t)=>{for(var s in t)u(e,s,{get:t[s],enumerable:!0})},k=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of F(t))!M.call(e,a)&&a!==s&&u(e,a,{get:()=>t[a],enumerable:!(r=W(t,a))||r.enumerable});return e};var c=(e,t,s)=>(s=e!=null?G(K(e)):{},k(t||!e||!e.__esModule?u(s,"default",{value:e,enumerable:!0}):s,e)),H=e=>k(u({},"__esModule",{value:!0}),e);var Q={};E(Q,{simulateCommand:()=>z});module.exports=H(Q);var J=require("commander");var L=c(require("axios"));var I=c(require("conf")),j=c(require("fs")),C=c(require("path")),$="https://www.xtrasecurity.in/api",p=new I.default({projectName:"xtra-cli",defaults:{apiUrl:$}}),R=p.get("apiUrl");R&&!process.env.XTRA_API_URL&&R.includes("xtra-security.vercel.app")&&p.set("apiUrl",$);var y=()=>({...p.store,apiUrl:process.env.XTRA_API_URL||p.get("apiUrl")||$});var A=()=>p.get("token");var U=()=>{let e={};try{let t=C.default.join(process.cwd(),".xtrarc");j.default.existsSync(t)&&(e=JSON.parse(j.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||p.get("project")||"",env:e.env||p.get("env")||"development",branch:e.branch||p.get("branch")||"main"}};var P=c(require("fs")),B=c(require("path")),X=JSON.parse(P.readFileSync(B.join(__dirname,"../../package.json"),"utf-8")),n=()=>{let{apiUrl:e}=y(),t=A();return L.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":X.version,...t?{Authorization:`Bearer ${t}`}:{}}})},_={login:async(e,t,s)=>(await n().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await n().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await n().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,r,a="main")=>(await n().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:r,branch:a})).data,getSecretDetails:async(e,t,s,r="main")=>(await n().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${r}`)).data,syncLogs:async e=>(await n().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,r,a,i)=>(await n().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:r,sourceEnv:a,sourceKey:i})).data,rotateSecret:async(e,t,s,r,a)=>(await n().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:r,parsedNewValue:a})).data,promoteSecret:async(e,t,s)=>(await n().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await n().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,r)=>{let a={format:e};return t&&(a.startDate=t),s&&(a.endDate=s),r&&(a.projectId=r),(await n().post("/audit/export",a,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,r)=>(await n().post("/access/request",{projectId:e,secretId:r,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await n().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=y(),s=t?`&workspaceId=${t}`:"";return(await n().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await n().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=y(),t=e?`/project?workspaceId=${e}`:"/project";return(await n().get(t)).data},getBranches:async e=>(await n().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await n().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await n().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await n().put("/branch",{id:e,...t})).data,getRoles:async()=>(await n().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await n().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await n().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await n().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await n().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await n().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await n().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await n().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,r)=>(await n().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:r})).data,cloneEnvironment:async(e,t,s,r,a)=>(await n().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:r,branch:a})).data,generateJitLink:async e=>(await n().post("/jit/generate",e)).data,claimJitLink:async e=>(await n().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await n().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await n().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await n().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await n().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await n().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,r)=>(await n().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:r})).data,deleteServiceAccountKey:async(e,t,s)=>(await n().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await n().post(e,t)).data};var o=c(require("chalk")),T=c(require("ora")),D=require("table"),z=new J.Command("simulate").description("Dry-run: show what 'xtra run' would inject without executing the command").option("-p, --project <id>","Project ID").option("-e, --env <environment>","Environment","development").option("-b, --branch <branch>","Branch","main").argument("[command]","Command that would be executed (display only)").option("--show-values","Reveal secret values in output (default: masked)",!1).option("--diff","Highlight secrets that differ from local .env / process.env",!1).action(async(e,t)=>{let{project:s,env:r,branch:a,showValues:i,diff:g}=t;r={dev:"development",stg:"staging",prod:"production"}[r]||r,s||(s=U().project),s||(console.error(o.default.red("Error: Project ID required. Use -p <id> or run 'xtra project set'.")),process.exit(1));let b=(0,T.default)(`Fetching secrets to simulate injection (${r}/${a})...`).start(),m;try{m=await _.getSecrets(s,r,a),b.stop()}catch(l){b.fail("Failed to fetch secrets."),console.error(o.default.red(l?.response?.data?.error||l?.response?.data?.error||"An unexpected error occurred")),process.exit(1)}let f=Object.keys(m).length,h=process.stdout.columns||100,O=Math.floor(h*.25),V=Math.floor(h*.4),N=Math.floor(h*.15);if(console.log(o.default.bold.cyan(`
2
2
  \u25CF Simulation`)+o.default.bold(` \u2014 xtra run ${e?o.default.cyan(e):"(no command specified)"}
3
3
  `)),console.log(o.default.gray(` Project : ${o.default.white(s)}`)),console.log(o.default.gray(` Env : ${o.default.white(r)}`)),console.log(o.default.gray(` Branch : ${o.default.white(a)}`)),console.log(o.default.gray(` Secrets : ${o.default.white(f)} would be injected
4
- `)),f===0){console.log(o.default.yellow(" No secrets found for this environment/branch."));return}let x=[[o.default.bold("Key"),o.default.bold("Injected Value"),o.default.bold("Local .env"),o.default.bold("Status")]];for(let[l,k]of Object.entries(m)){let w=process.env[l],q=i?o.default.cyan(k):o.default.gray("\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"),d=o.default.green("Injected"),v="-";g&&w!==void 0?(v=i?o.default.yellow(w):o.default.gray("\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"),w===k?d=o.default.gray("Same"):d=o.default.yellow("\u26A1 Override")):g&&(d=o.default.blue("New"),v=o.default.gray("(not set)")),x.push([o.default.white(l),q,g?v:"-",d])}console.log((0,D.table)(x,{columns:[{width:O,wrapWord:!0},{width:V,wrapWord:!0},{width:N,wrapWord:!0},{width:10}],border:{topBody:"\u2500",topJoin:"\u252C",topLeft:"\u250C",topRight:"\u2510",bottomBody:"\u2500",bottomJoin:"\u2534",bottomLeft:"\u2514",bottomRight:"\u2518",bodyLeft:"\u2502",bodyRight:"\u2502",bodyJoin:"\u2502",joinBody:"\u2500",joinLeft:"\u251C",joinRight:"\u2524",joinJoin:"\u253C"}})),i||console.log(o.default.gray(" Tip: use --show-values to reveal actual secret values")),g||console.log(o.default.gray(" Tip: use --diff to compare against your local process.env")),console.log(o.default.bold.green(`
4
+ `)),f===0){console.log(o.default.yellow(" No secrets found for this environment/branch."));return}let S=[[o.default.bold("Key"),o.default.bold("Injected Value"),o.default.bold("Local .env"),o.default.bold("Status")]];for(let[l,x]of Object.entries(m)){let w=process.env[l],q=i?o.default.cyan(x):o.default.gray("\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"),d=o.default.green("Injected"),v="-";g&&w!==void 0?(v=i?o.default.yellow(w):o.default.gray("\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"),w===x?d=o.default.gray("Same"):d=o.default.yellow("\u26A1 Override")):g&&(d=o.default.blue("New"),v=o.default.gray("(not set)")),S.push([o.default.white(l),q,g?v:"-",d])}console.log((0,D.table)(S,{columns:[{width:O,wrapWord:!0},{width:V,wrapWord:!0},{width:N,wrapWord:!0},{width:10}],border:{topBody:"\u2500",topJoin:"\u252C",topLeft:"\u250C",topRight:"\u2510",bottomBody:"\u2500",bottomJoin:"\u2534",bottomLeft:"\u2514",bottomRight:"\u2518",bodyLeft:"\u2502",bodyRight:"\u2502",bodyJoin:"\u2502",joinBody:"\u2500",joinLeft:"\u251C",joinRight:"\u2524",joinJoin:"\u253C"}})),i||console.log(o.default.gray(" Tip: use --show-values to reveal actual secret values")),g||console.log(o.default.gray(" Tip: use --diff to compare against your local process.env")),console.log(o.default.bold.green(`
5
5
  \u2714 Simulation complete.`)+o.default.bold(` ${f} secret(s) would be injected.`)),console.log(o.default.gray(` Run without 'simulate' to actually execute the command.
6
6
  `))});0&&(module.exports={simulateCommand});
@@ -1,2 +1,2 @@
1
- var q=Object.create;var m=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var V=(e,t)=>{for(var s in t)m(e,s,{get:t[s],enumerable:!0})},b=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of K(t))!H.call(e,o)&&o!==s&&m(e,o,{get:()=>t[o],enumerable:!(n=J(t,o))||n.enumerable});return e};var c=(e,t,s)=>(s=e!=null?q(G(e)):{},b(t||!e||!e.__esModule?m(s,"default",{value:e,enumerable:!0}):s,e)),X=e=>b(m({},"__esModule",{value:!0}),e);var Z={};V(Z,{statusCommand:()=>Y});module.exports=X(Z);var O=require("commander");var C=c(require("axios"));var I=c(require("conf")),w=c(require("fs")),k=c(require("path")),S="https://www.xtrasecurity.in/api",g=new I.default({projectName:"xtra-cli",defaults:{apiUrl:S}}),v=g.get("apiUrl");v&&!process.env.XTRA_API_URL&&(v.includes("localhost")||v.includes("xtra-security.vercel.app"))&&g.set("apiUrl",S);var y=()=>({...g.store,apiUrl:process.env.XTRA_API_URL||g.get("apiUrl")||S});var A=()=>g.get("token");var j=()=>{let e={};try{let t=k.default.join(process.cwd(),".xtrarc");w.default.existsSync(t)&&(e=JSON.parse(w.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||g.get("project")||"",env:e.env||g.get("env")||"development",branch:e.branch||g.get("branch")||"main"}};var R=c(require("fs")),U=c(require("path")),z=JSON.parse(R.readFileSync(U.join(__dirname,"../../package.json"),"utf-8")),r=()=>{let{apiUrl:e}=y(),t=A();return C.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":z.version,...t?{Authorization:`Bearer ${t}`}:{}}})},E={login:async(e,t,s)=>(await r().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,n,o="main")=>(await r().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:n,branch:o})).data,getSecretDetails:async(e,t,s,n="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${n}`)).data,syncLogs:async e=>(await r().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,n,o,i)=>(await r().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:o,sourceKey:i})).data,rotateSecret:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:o})).data,promoteSecret:async(e,t,s)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await r().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,n)=>{let o={format:e};return t&&(o.startDate=t),s&&(o.endDate=s),n&&(o.projectId=n),(await r().post("/audit/export",o,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,n)=>(await r().post("/access/request",{projectId:e,secretId:n,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await r().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=y(),s=t?`&workspaceId=${t}`:"";return(await r().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await r().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=y(),t=e?`/project?workspaceId=${e}`:"/project";return(await r().get(t)).data},getBranches:async e=>(await r().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await r().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await r().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await r().put("/branch",{id:e,...t})).data,getRoles:async()=>(await r().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await r().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await r().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await r().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await r().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await r().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await r().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,n)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:n,branch:o})).data,generateJitLink:async e=>(await r().post("/jit/generate",e)).data,claimJitLink:async e=>(await r().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await r().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await r().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await r().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await r().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await r().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,n)=>(await r().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(e,t,s)=>(await r().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await r().post(e,t)).data};var a=c(require("chalk")),B=c(require("ora")),F=require("table");var x=c(require("fs")),$=c(require("path")),W=$.default.join(process.cwd(),".xtra"),N=$.default.join(W,"manifest.json");function D(){if(!x.default.existsSync(N))return null;try{let e=x.default.readFileSync(N,"utf-8");return JSON.parse(e)}catch{return null}}var M=c(require("crypto")),P=c(require("conf")),Q=require("node-machine-id");var oe=new P.default({projectName:"xtra-cli-crypto"});var L=e=>M.default.createHash("sha256").update(e).digest("hex");var Y=new O.Command("status").description("Check synchronization status with XtraSync platform").option("-p, --project <projectId>","Project ID").option("-e, --env <environment>","Environment (dev, stg, prod)","dev").option("-b, --branch <branchName>","Branch Name").action(async e=>{let{project:t,env:s,branch:n}=e;t||(t=j().project),n||(n=j().branch||"main"),t||(console.error(a.default.red("Error: Project ID is required. Use -p <id> or run 'xtra project set' first.")),process.exit(1)),s={dev:"development",stg:"staging",prod:"production"}[s]||s;let i=D();if(!i){console.log(a.default.yellow("No local manifest found. Run 'xtra run' or 'xtra generate' first."));return}(i.projectId!==t||i.environment!==s)&&(console.log(a.default.yellow(`Manifest found for DIFFERENT project/env (${i.projectId}/${i.environment}).`)),console.log("Checking status against requested target anyway..."));let h=(0,B.default)(`Fetching remote state for ${s} (branch: ${n})...`).start();try{let l=await E.getSecrets(t,s,n);h.stop();let d=[[a.default.bold("Secret Key"),a.default.bold("Status"),a.default.bold("Local Last Updated")]],u=0;Object.entries(l).forEach(([p,T])=>{let _=L(T),f=i.secrets[p];f?f.hash!==_?(d.push([p,a.default.yellow("MODIFIED"),f.updatedAt]),u++):d.push([p,a.default.cyan("Synced"),f.updatedAt]):(d.push([p,a.default.green("NEW (Remote)"),"-"]),u++)}),Object.keys(i.secrets).forEach(p=>{l[p]||(d.push([p,a.default.red("DELETED (Remote)"),i.secrets[p].updatedAt]),u++)}),console.log(""),console.log((0,F.table)(d)),u===0?console.log(a.default.green("\u2714 Everything is in sync.")):(console.log(a.default.yellow(`\u26A0 Found ${u} difference(s).
1
+ var q=Object.create;var m=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var V=(e,t)=>{for(var s in t)m(e,s,{get:t[s],enumerable:!0})},$=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of K(t))!H.call(e,o)&&o!==s&&m(e,o,{get:()=>t[o],enumerable:!(n=J(t,o))||n.enumerable});return e};var c=(e,t,s)=>(s=e!=null?q(G(e)):{},$(t||!e||!e.__esModule?m(s,"default",{value:e,enumerable:!0}):s,e)),X=e=>$(m({},"__esModule",{value:!0}),e);var Z={};V(Z,{statusCommand:()=>Y});module.exports=X(Z);var O=require("commander");var C=c(require("axios"));var I=c(require("conf")),v=c(require("fs")),k=c(require("path")),w="https://www.xtrasecurity.in/api",g=new I.default({projectName:"xtra-cli",defaults:{apiUrl:w}}),b=g.get("apiUrl");b&&!process.env.XTRA_API_URL&&b.includes("xtra-security.vercel.app")&&g.set("apiUrl",w);var y=()=>({...g.store,apiUrl:process.env.XTRA_API_URL||g.get("apiUrl")||w});var A=()=>g.get("token");var S=()=>{let e={};try{let t=k.default.join(process.cwd(),".xtrarc");v.default.existsSync(t)&&(e=JSON.parse(v.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||g.get("project")||"",env:e.env||g.get("env")||"development",branch:e.branch||g.get("branch")||"main"}};var R=c(require("fs")),U=c(require("path")),z=JSON.parse(R.readFileSync(U.join(__dirname,"../../package.json"),"utf-8")),r=()=>{let{apiUrl:e}=y(),t=A();return C.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":z.version,...t?{Authorization:`Bearer ${t}`}:{}}})},E={login:async(e,t,s)=>(await r().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,n,o="main")=>(await r().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:n,branch:o})).data,getSecretDetails:async(e,t,s,n="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${n}`)).data,syncLogs:async e=>(await r().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,n,o,i)=>(await r().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:o,sourceKey:i})).data,rotateSecret:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:o})).data,promoteSecret:async(e,t,s)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await r().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,n)=>{let o={format:e};return t&&(o.startDate=t),s&&(o.endDate=s),n&&(o.projectId=n),(await r().post("/audit/export",o,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,n)=>(await r().post("/access/request",{projectId:e,secretId:n,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await r().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=y(),s=t?`&workspaceId=${t}`:"";return(await r().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await r().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=y(),t=e?`/project?workspaceId=${e}`:"/project";return(await r().get(t)).data},getBranches:async e=>(await r().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await r().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await r().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await r().put("/branch",{id:e,...t})).data,getRoles:async()=>(await r().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await r().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await r().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await r().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await r().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await r().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await r().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,n)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:n,branch:o})).data,generateJitLink:async e=>(await r().post("/jit/generate",e)).data,claimJitLink:async e=>(await r().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await r().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await r().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await r().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await r().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await r().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,n)=>(await r().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(e,t,s)=>(await r().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await r().post(e,t)).data};var a=c(require("chalk")),B=c(require("ora")),F=require("table");var j=c(require("fs")),x=c(require("path")),W=x.default.join(process.cwd(),".xtra"),N=x.default.join(W,"manifest.json");function D(){if(!j.default.existsSync(N))return null;try{let e=j.default.readFileSync(N,"utf-8");return JSON.parse(e)}catch{return null}}var M=c(require("crypto")),P=c(require("conf")),Q=require("node-machine-id");var oe=new P.default({projectName:"xtra-cli-crypto"});var L=e=>M.default.createHash("sha256").update(e).digest("hex");var Y=new O.Command("status").description("Check synchronization status with XtraSync platform").option("-p, --project <projectId>","Project ID").option("-e, --env <environment>","Environment (dev, stg, prod)","dev").option("-b, --branch <branchName>","Branch Name").action(async e=>{let{project:t,env:s,branch:n}=e;t||(t=S().project),n||(n=S().branch||"main"),t||(console.error(a.default.red("Error: Project ID is required. Use -p <id> or run 'xtra project set' first.")),process.exit(1)),s={dev:"development",stg:"staging",prod:"production"}[s]||s;let i=D();if(!i){console.log(a.default.yellow("No local manifest found. Run 'xtra run' or 'xtra generate' first."));return}(i.projectId!==t||i.environment!==s)&&(console.log(a.default.yellow(`Manifest found for DIFFERENT project/env (${i.projectId}/${i.environment}).`)),console.log("Checking status against requested target anyway..."));let h=(0,B.default)(`Fetching remote state for ${s} (branch: ${n})...`).start();try{let l=await E.getSecrets(t,s,n);h.stop();let d=[[a.default.bold("Secret Key"),a.default.bold("Status"),a.default.bold("Local Last Updated")]],u=0;Object.entries(l).forEach(([p,T])=>{let _=L(T),f=i.secrets[p];f?f.hash!==_?(d.push([p,a.default.yellow("MODIFIED"),f.updatedAt]),u++):d.push([p,a.default.cyan("Synced"),f.updatedAt]):(d.push([p,a.default.green("NEW (Remote)"),"-"]),u++)}),Object.keys(i.secrets).forEach(p=>{l[p]||(d.push([p,a.default.red("DELETED (Remote)"),i.secrets[p].updatedAt]),u++)}),console.log(""),console.log((0,F.table)(d)),u===0?console.log(a.default.green("\u2714 Everything is in sync.")):(console.log(a.default.yellow(`\u26A0 Found ${u} difference(s).
2
2
  `)),console.log(a.default.bold(" Next steps:")),console.log(a.default.gray(" xtra generate ")+a.default.white("# pull cloud secrets \xE2\u2020\u2019 .env (merge)")),console.log(a.default.gray(" xtra generate -f json ")+a.default.white("# pull cloud secrets \xE2\u2020\u2019 secrets.json")),console.log(a.default.gray(" xtra run node app.js ")+a.default.white("# inject secrets at runtime (no file)")),console.log(a.default.gray(" xtra local sync ")+a.default.white("# pull cloud secrets \xE2\u2020\u2019 .env.local (offline mode)")))}catch(l){h.fail("Failed to fetch remote secrets."),console.error(a.default.red(l?.response?.data?.error||"An unexpected error occurred"))}});0&&(module.exports={statusCommand});
@@ -1,4 +1,4 @@
1
- var fe=Object.create;var k=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,ve=Object.prototype.hasOwnProperty;var R=(e,t)=>()=>(e&&(t=e(e=0)),t);var G=(e,t)=>{for(var s in t)k(e,s,{get:t[s],enumerable:!0})},M=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ye(t))!ve.call(e,r)&&r!==s&&k(e,r,{get:()=>t[r],enumerable:!(n=me(t,r))||n.enumerable});return e};var l=(e,t,s)=>(s=e!=null?fe(he(e)):{},M(t||!e||!e.__esModule?k(s,"default",{value:e,enumerable:!0}):s,e)),H=e=>M(k({},"__esModule",{value:!0}),e);var V,L,Y,B,h,U,w,z,K,I=R(()=>{V=l(require("conf")),L=l(require("fs")),Y=l(require("path")),B="https://www.xtrasecurity.in/api",h=new V.default({projectName:"xtra-cli",defaults:{apiUrl:B}}),U=h.get("apiUrl");U&&!process.env.XTRA_API_URL&&(U.includes("localhost")||U.includes("xtra-security.vercel.app"))&&h.set("apiUrl",B);w=()=>({...h.store,apiUrl:process.env.XTRA_API_URL||h.get("apiUrl")||B}),z=()=>h.get("token"),K=()=>{let e={};try{let t=Y.default.join(process.cwd(),".xtrarc");L.default.existsSync(t)&&(e=JSON.parse(L.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||h.get("project")||"",env:e.env||h.get("env")||"development",branch:e.branch||h.get("branch")||"main"}}});var X,W,Z,$e,o,b,O=R(()=>{X=l(require("axios"));I();W=l(require("fs")),Z=l(require("path")),$e=JSON.parse(W.readFileSync(Z.join(__dirname,"../../package.json"),"utf-8")),o=()=>{let{apiUrl:e}=w(),t=z();return X.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":$e.version,...t?{Authorization:`Bearer ${t}`}:{}}})},b={login:async(e,t,s)=>(await o().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,n,r="main")=>(await o().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:n,branch:r})).data,getSecretDetails:async(e,t,s,n="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${n}`)).data,syncLogs:async e=>(await o().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,n,r,c)=>(await o().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:r,sourceKey:c})).data,rotateSecret:async(e,t,s,n,r)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:r})).data,promoteSecret:async(e,t,s)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await o().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,n)=>{let r={format:e};return t&&(r.startDate=t),s&&(r.endDate=s),n&&(r.projectId=n),(await o().post("/audit/export",r,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,n)=>(await o().post("/access/request",{projectId:e,secretId:n,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await o().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=w(),s=t?`&workspaceId=${t}`:"";return(await o().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await o().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=w(),t=e?`/project?workspaceId=${e}`:"/project";return(await o().get(t)).data},getBranches:async e=>(await o().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await o().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await o().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await o().put("/branch",{id:e,...t})).data,getRoles:async()=>(await o().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await o().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await o().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await o().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await o().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await o().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await o().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await o().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,n)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(e,t,s,n,r)=>(await o().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:n,branch:r})).data,generateJitLink:async e=>(await o().post("/jit/generate",e)).data,claimJitLink:async e=>(await o().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await o().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await o().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await o().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await o().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await o().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,n)=>(await o().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(e,t,s)=>(await o().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await o().post(e,t)).data}});function ne(){let e=Q.get("masterKey");e||(e=x.default.randomBytes(32).toString("hex"),Q.set("masterKey",e));let t=(0,te.machineIdSync)();return x.default.createHash("sha256").update(e+t).digest()}var x,ee,te,se,Q,re,oe,ae=R(()=>{x=l(require("crypto")),ee=l(require("conf")),te=require("node-machine-id"),se="aes-256-gcm",Q=new ee.default({projectName:"xtra-cli-crypto"});re=e=>{let t=x.default.randomBytes(16),s=ne(),n=x.default.createCipheriv(se,s,t),r=n.update(e,"utf8","hex");r+=n.final("hex");let c=n.getAuthTag();return{iv:t.toString("hex"),content:r,tag:c.toString("hex")}},oe=e=>{let t=ne(),s=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),r=x.default.createDecipheriv(se,t,s);r.setAuthTag(n);let c=r.update(e.content,"hex","utf8");return c+=r.final("utf8"),c}});var pe={};G(pe,{loadAuditLogs:()=>E,logAudit:()=>xe,saveAuditLogs:()=>C,syncAuditLogs:()=>je});function we(e){if(!e||typeof e!="object")return e;let t={...e},s=["password","token","secret","value","apiKey","secretValue"];for(let n of Object.keys(t))s.some(r=>n.toLowerCase().includes(r))&&(t[n]="[REDACTED]");return t}async function ie(e){try{if(!w().token)return!1;let s={action:e.action,entity:"cli-project",entityId:e.projectId||"global",details:we(e.details),timestamp:e.timestamp,projectId:e.projectId};return await b.post("/audit/cli-logs",{logs:[s]}),!0}catch(t){return process.env.DEBUG&&console.error("Failed to send audit log to backend:",t),!1}}function xe(e,t,s,n){let r={id:(0,ce.v4)(),timestamp:new Date().toISOString(),action:e,projectId:t,environment:s,details:n,synced:!1},c=E();c.push(r),C(c),ie(r).then(d=>{if(d){r.synced=!0;let u=E(),i=u.findIndex(p=>p.id===r.id);i!==-1&&(u[i].synced=!0,C(u))}}).catch(()=>{})}function E(){if(!j.default.existsSync(F))return[];try{let e=j.default.readFileSync(F,"utf-8"),t=JSON.parse(e),s=oe(t);return JSON.parse(s)}catch{return[]}}function C(e){j.default.existsSync(_)||j.default.mkdirSync(_,{recursive:!0});let t=JSON.stringify(e),s=re(t);j.default.writeFileSync(F,JSON.stringify(s),"utf-8")}async function je(){let e=E(),t=e.filter(n=>!n.synced);if(t.length===0)return 0;let s=0;for(let n of t)await ie(n)&&(n.synced=!0,s++);return s>0&&C(e),s}var j,N,ce,_,F,le=R(()=>{j=l(require("fs")),N=l(require("path")),ce=require("uuid");ae();I();O();_=N.default.join(process.cwd(),".xtra"),F=N.default.join(_,"audit.enc")});var Se={};G(Se,{templateCommand:()=>D});module.exports=H(Se);var ge=require("commander");O();I();var a=l(require("chalk")),J=l(require("ora")),m=l(require("fs")),$=l(require("path")),P=/\{\{\s*(secrets|env)\.([A-Z0-9_a-z]+)(?:\s*\|\s*([^}]*?))?\s*\}\}/g;function de(e,t,s){let n=[],r=[],c=0;return{output:e.replace(P,(u,i,p,S)=>{let g;if(i==="secrets"?g=t[p]:i==="env"&&(g=s[p]),g!==void 0&&g!=="")return c++,g;if(S!==void 0){let f=S.trim();return r.push(`${i}.${p} \xE2\u2020\u2019 "${f}"`),c++,f}return n.push(`${i}.${p}`),`{{ ${i}.${p} }}`}),replacedCount:c,missingKeys:n,usedDefaults:r}}var D=new ge.Command("template").description("Secret templating engine \xE2\u20AC\u201D inject secrets into config file templates").addHelpText("after",`
1
+ var fe=Object.create;var k=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,ve=Object.prototype.hasOwnProperty;var R=(e,t)=>()=>(e&&(t=e(e=0)),t);var q=(e,t)=>{for(var s in t)k(e,s,{get:t[s],enumerable:!0})},G=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ye(t))!ve.call(e,r)&&r!==s&&k(e,r,{get:()=>t[r],enumerable:!(n=me(t,r))||n.enumerable});return e};var l=(e,t,s)=>(s=e!=null?fe(he(e)):{},G(t||!e||!e.__esModule?k(s,"default",{value:e,enumerable:!0}):s,e)),M=e=>G(k({},"__esModule",{value:!0}),e);var V,U,Y,L,h,H,w,z,B,I=R(()=>{V=l(require("conf")),U=l(require("fs")),Y=l(require("path")),L="https://www.xtrasecurity.in/api",h=new V.default({projectName:"xtra-cli",defaults:{apiUrl:L}}),H=h.get("apiUrl");H&&!process.env.XTRA_API_URL&&H.includes("xtra-security.vercel.app")&&h.set("apiUrl",L);w=()=>({...h.store,apiUrl:process.env.XTRA_API_URL||h.get("apiUrl")||L}),z=()=>h.get("token"),B=()=>{let e={};try{let t=Y.default.join(process.cwd(),".xtrarc");U.default.existsSync(t)&&(e=JSON.parse(U.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||h.get("project")||"",env:e.env||h.get("env")||"development",branch:e.branch||h.get("branch")||"main"}}});var X,W,Z,$e,o,b,K=R(()=>{X=l(require("axios"));I();W=l(require("fs")),Z=l(require("path")),$e=JSON.parse(W.readFileSync(Z.join(__dirname,"../../package.json"),"utf-8")),o=()=>{let{apiUrl:e}=w(),t=z();return X.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":$e.version,...t?{Authorization:`Bearer ${t}`}:{}}})},b={login:async(e,t,s)=>(await o().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,n,r="main")=>(await o().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:n,branch:r})).data,getSecretDetails:async(e,t,s,n="main")=>(await o().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${n}`)).data,syncLogs:async e=>(await o().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,n,r,c)=>(await o().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:r,sourceKey:c})).data,rotateSecret:async(e,t,s,n,r)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:r})).data,promoteSecret:async(e,t,s)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await o().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,n)=>{let r={format:e};return t&&(r.startDate=t),s&&(r.endDate=s),n&&(r.projectId=n),(await o().post("/audit/export",r,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,n)=>(await o().post("/access/request",{projectId:e,secretId:n,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await o().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=w(),s=t?`&workspaceId=${t}`:"";return(await o().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await o().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=w(),t=e?`/project?workspaceId=${e}`:"/project";return(await o().get(t)).data},getBranches:async e=>(await o().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await o().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await o().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await o().put("/branch",{id:e,...t})).data,getRoles:async()=>(await o().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await o().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await o().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await o().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await o().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await o().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await o().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await o().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,n)=>(await o().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(e,t,s,n,r)=>(await o().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:n,branch:r})).data,generateJitLink:async e=>(await o().post("/jit/generate",e)).data,claimJitLink:async e=>(await o().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await o().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await o().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await o().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await o().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await o().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,n)=>(await o().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(e,t,s)=>(await o().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await o().post(e,t)).data}});function ne(){let e=Q.get("masterKey");e||(e=x.default.randomBytes(32).toString("hex"),Q.set("masterKey",e));let t=(0,te.machineIdSync)();return x.default.createHash("sha256").update(e+t).digest()}var x,ee,te,se,Q,re,oe,ae=R(()=>{x=l(require("crypto")),ee=l(require("conf")),te=require("node-machine-id"),se="aes-256-gcm",Q=new ee.default({projectName:"xtra-cli-crypto"});re=e=>{let t=x.default.randomBytes(16),s=ne(),n=x.default.createCipheriv(se,s,t),r=n.update(e,"utf8","hex");r+=n.final("hex");let c=n.getAuthTag();return{iv:t.toString("hex"),content:r,tag:c.toString("hex")}},oe=e=>{let t=ne(),s=Buffer.from(e.iv,"hex"),n=Buffer.from(e.tag,"hex"),r=x.default.createDecipheriv(se,t,s);r.setAuthTag(n);let c=r.update(e.content,"hex","utf8");return c+=r.final("utf8"),c}});var pe={};q(pe,{loadAuditLogs:()=>E,logAudit:()=>xe,saveAuditLogs:()=>C,syncAuditLogs:()=>je});function we(e){if(!e||typeof e!="object")return e;let t={...e},s=["password","token","secret","value","apiKey","secretValue"];for(let n of Object.keys(t))s.some(r=>n.toLowerCase().includes(r))&&(t[n]="[REDACTED]");return t}async function ie(e){try{if(!w().token)return!1;let s={action:e.action,entity:"cli-project",entityId:e.projectId||"global",details:we(e.details),timestamp:e.timestamp,projectId:e.projectId};return await b.post("/audit/cli-logs",{logs:[s]}),!0}catch(t){return process.env.DEBUG&&console.error("Failed to send audit log to backend:",t),!1}}function xe(e,t,s,n){let r={id:(0,ce.v4)(),timestamp:new Date().toISOString(),action:e,projectId:t,environment:s,details:n,synced:!1},c=E();c.push(r),C(c),ie(r).then(d=>{if(d){r.synced=!0;let u=E(),i=u.findIndex(p=>p.id===r.id);i!==-1&&(u[i].synced=!0,C(u))}}).catch(()=>{})}function E(){if(!j.default.existsSync(_))return[];try{let e=j.default.readFileSync(_,"utf-8"),t=JSON.parse(e),s=oe(t);return JSON.parse(s)}catch{return[]}}function C(e){j.default.existsSync(O)||j.default.mkdirSync(O,{recursive:!0});let t=JSON.stringify(e),s=re(t);j.default.writeFileSync(_,JSON.stringify(s),"utf-8")}async function je(){let e=E(),t=e.filter(n=>!n.synced);if(t.length===0)return 0;let s=0;for(let n of t)await ie(n)&&(n.synced=!0,s++);return s>0&&C(e),s}var j,F,ce,O,_,le=R(()=>{j=l(require("fs")),F=l(require("path")),ce=require("uuid");ae();I();K();O=F.default.join(process.cwd(),".xtra"),_=F.default.join(O,"audit.enc")});var Se={};q(Se,{templateCommand:()=>D});module.exports=M(Se);var ge=require("commander");K();I();var a=l(require("chalk")),N=l(require("ora")),m=l(require("fs")),$=l(require("path")),P=/\{\{\s*(secrets|env)\.([A-Z0-9_a-z]+)(?:\s*\|\s*([^}]*?))?\s*\}\}/g;function de(e,t,s){let n=[],r=[],c=0;return{output:e.replace(P,(u,i,p,S)=>{let g;if(i==="secrets"?g=t[p]:i==="env"&&(g=s[p]),g!==void 0&&g!=="")return c++,g;if(S!==void 0){let f=S.trim();return r.push(`${i}.${p} \xE2\u2020\u2019 "${f}"`),c++,f}return n.push(`${i}.${p}`),`{{ ${i}.${p} }}`}),replacedCount:c,missingKeys:n,usedDefaults:r}}var D=new ge.Command("template").description("Secret templating engine \xE2\u20AC\u201D inject secrets into config file templates").addHelpText("after",`
2
2
  Template Syntax:
3
3
  {{ secrets.KEY }} Replace with secret value
4
4
  {{ secrets.KEY | default }} Replace with secret value, fall back to "default"
@@ -10,7 +10,7 @@ Examples:
10
10
  $ xtra template render nginx.conf.tpl -p proj123 -e production | sudo tee /etc/nginx/nginx.conf
11
11
  $ xtra template check config.yaml.tpl -p proj123 -e production
12
12
  $ xtra template list config.yaml.tpl
13
- `);D.command("render <templateFile>").description("Render a template file by injecting secrets and environment variables").option("-p, --project <id>","Project ID").option("-e, --env <environment>","Environment (default: development)","development").option("-b, --branch <branch>","Branch name","main").option("-o, --output <file>","Output file (default: stdout)").option("--strict","Exit with error if any placeholder is unresolved",!1).action(async(e,t)=>{let{project:s,env:n,branch:r,output:c,strict:d}=t;n={dev:"development",stg:"staging",prod:"production"}[n]||n,s||(s=K().project),s||(console.error(a.default.red("Error: Project ID required. Use -p <id> or run 'xtra project set'.")),process.exit(1));let i=$.resolve(process.cwd(),e);m.existsSync(i)||(console.error(a.default.red(`Error: Template file not found: ${i}`)),process.exit(1));let p=m.readFileSync(i,"utf8");[...p.matchAll(P)].length===0&&console.warn(a.default.yellow("Warning: No {{ secrets.* }} or {{ env.* }} placeholders found in template."));let g=(0,J.default)(`Fetching secrets for ${s}/${n}...`).start(),f={};try{f=await b.getSecrets(s,n,r),g.succeed(`Loaded ${Object.keys(f).length} secrets.`)}catch(y){g.fail("Failed to fetch secrets.");let ue=y?.response?.data?.error||y?.response?.data?.error||"An unexpected error occurred";console.error(a.default.red(ue)),process.exit(1)}let{output:A,replacedCount:v,missingKeys:T,usedDefaults:q}=de(p,f,process.env);if(console.log(a.default.green(`\u2705 Replaced ${v} placeholder(s).`)),q.length>0&&console.log(a.default.yellow(`\u26A0 Used defaults for: ${q.join(", ")}`)),T.length>0&&(console.log(a.default.red(`\u2717 Unresolved placeholders: ${T.join(", ")}`)),d&&(console.error(a.default.red("Aborting due to --strict mode.")),process.exit(1))),c){let y=$.resolve(process.cwd(),c);m.writeFileSync(y,A,"utf8"),console.log(a.default.blue(`\xE2\u2020\u2019 Written to: ${y}`))}else process.stdout.write(A);try{let{logAudit:y}=(le(),H(pe));y("TEMPLATE_RENDERED",s,n,{template:e,output:c||"stdout",replacedCount:v,missingKeys:T})}catch{}});D.command("check <templateFile>").description("Validate that all template placeholders have matching secrets (dry-run)").option("-p, --project <id>","Project ID").option("-e, --env <environment>","Environment","development").option("-b, --branch <branch>","Branch name","main").action(async(e,t)=>{let{project:s,env:n,branch:r}=t;n={dev:"development",stg:"staging",prod:"production"}[n]||n,s||(s=K().project),s||(console.error(a.default.red("Error: Project ID required.")),process.exit(1));let d=$.resolve(process.cwd(),e);m.existsSync(d)||(console.error(a.default.red(`Template file not found: ${d}`)),process.exit(1));let u=m.readFileSync(d,"utf8"),i=(0,J.default)("Fetching secrets for check...").start(),p={};try{p=await b.getSecrets(s,n,r),i.stop()}catch{i.fail("Failed to fetch secrets."),process.exit(1)}let{replacedCount:S,missingKeys:g,usedDefaults:f}=de(u,p,process.env),A=[...u.matchAll(P)].length;console.log(a.default.bold(`
13
+ `);D.command("render <templateFile>").description("Render a template file by injecting secrets and environment variables").option("-p, --project <id>","Project ID").option("-e, --env <environment>","Environment (default: development)","development").option("-b, --branch <branch>","Branch name","main").option("-o, --output <file>","Output file (default: stdout)").option("--strict","Exit with error if any placeholder is unresolved",!1).action(async(e,t)=>{let{project:s,env:n,branch:r,output:c,strict:d}=t;n={dev:"development",stg:"staging",prod:"production"}[n]||n,s||(s=B().project),s||(console.error(a.default.red("Error: Project ID required. Use -p <id> or run 'xtra project set'.")),process.exit(1));let i=$.resolve(process.cwd(),e);m.existsSync(i)||(console.error(a.default.red(`Error: Template file not found: ${i}`)),process.exit(1));let p=m.readFileSync(i,"utf8");[...p.matchAll(P)].length===0&&console.warn(a.default.yellow("Warning: No {{ secrets.* }} or {{ env.* }} placeholders found in template."));let g=(0,N.default)(`Fetching secrets for ${s}/${n}...`).start(),f={};try{f=await b.getSecrets(s,n,r),g.succeed(`Loaded ${Object.keys(f).length} secrets.`)}catch(y){g.fail("Failed to fetch secrets.");let ue=y?.response?.data?.error||y?.response?.data?.error||"An unexpected error occurred";console.error(a.default.red(ue)),process.exit(1)}let{output:A,replacedCount:v,missingKeys:T,usedDefaults:J}=de(p,f,process.env);if(console.log(a.default.green(`\u2705 Replaced ${v} placeholder(s).`)),J.length>0&&console.log(a.default.yellow(`\u26A0 Used defaults for: ${J.join(", ")}`)),T.length>0&&(console.log(a.default.red(`\u2717 Unresolved placeholders: ${T.join(", ")}`)),d&&(console.error(a.default.red("Aborting due to --strict mode.")),process.exit(1))),c){let y=$.resolve(process.cwd(),c);m.writeFileSync(y,A,"utf8"),console.log(a.default.blue(`\xE2\u2020\u2019 Written to: ${y}`))}else process.stdout.write(A);try{let{logAudit:y}=(le(),M(pe));y("TEMPLATE_RENDERED",s,n,{template:e,output:c||"stdout",replacedCount:v,missingKeys:T})}catch{}});D.command("check <templateFile>").description("Validate that all template placeholders have matching secrets (dry-run)").option("-p, --project <id>","Project ID").option("-e, --env <environment>","Environment","development").option("-b, --branch <branch>","Branch name","main").action(async(e,t)=>{let{project:s,env:n,branch:r}=t;n={dev:"development",stg:"staging",prod:"production"}[n]||n,s||(s=B().project),s||(console.error(a.default.red("Error: Project ID required.")),process.exit(1));let d=$.resolve(process.cwd(),e);m.existsSync(d)||(console.error(a.default.red(`Template file not found: ${d}`)),process.exit(1));let u=m.readFileSync(d,"utf8"),i=(0,N.default)("Fetching secrets for check...").start(),p={};try{p=await b.getSecrets(s,n,r),i.stop()}catch{i.fail("Failed to fetch secrets."),process.exit(1)}let{replacedCount:S,missingKeys:g,usedDefaults:f}=de(u,p,process.env),A=[...u.matchAll(P)].length;console.log(a.default.bold(`
14
14
  Template Check: ${e}
15
15
  `)),console.log(` Total placeholders : ${A}`),console.log(` Resolved : ${a.default.green(S)}`),console.log(` Using defaults : ${a.default.yellow(f.length)}`),console.log(` Unresolved : ${a.default.red(g.length)}`),f.length>0&&(console.log(a.default.yellow(`
16
16
  Defaults used:`)),f.forEach(v=>console.log(` - ${v}`))),g.length>0?(console.log(a.default.red(`
@@ -1,2 +1,2 @@
1
- var le=Object.create;var T=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,me=Object.prototype.hasOwnProperty;var ye=(e,t)=>{for(var s in t)T(e,s,{get:t[s],enumerable:!0})},H=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ue(t))!me.call(e,o)&&o!==s&&T(e,o,{get:()=>t[o],enumerable:!(r=de(t,o))||r.enumerable});return e};var b=(e,t,s)=>(s=e!=null?le(he(e)):{},H(t||!e||!e.__esModule?T(s,"default",{value:e,enumerable:!0}):s,e)),fe=e=>H(T({},"__esModule",{value:!0}),e);var ve={};ye(ve,{uiCommand:()=>xe});module.exports=fe(ve);var ee=require("commander"),n=b(require("chalk")),te=b(require("readline"));var X=b(require("axios"));var K=b(require("conf")),M=b(require("fs")),F=b(require("path")),O="https://www.xtrasecurity.in/api",x=new K.default({projectName:"xtra-cli",defaults:{apiUrl:O}}),_=x.get("apiUrl");_&&!process.env.XTRA_API_URL&&(_.includes("localhost")||_.includes("xtra-security.vercel.app"))&&x.set("apiUrl",O);var P=()=>({...x.store,apiUrl:process.env.XTRA_API_URL||x.get("apiUrl")||O});var W=()=>x.get("token");var Q=()=>{let e={};try{let t=F.default.join(process.cwd(),".xtrarc");M.default.existsSync(t)&&(e=JSON.parse(M.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||x.get("project")||"",env:e.env||x.get("env")||"development",branch:e.branch||x.get("branch")||"main"}};var Y=b(require("fs")),z=b(require("path")),we=JSON.parse(Y.readFileSync(z.join(__dirname,"../../package.json"),"utf-8")),a=()=>{let{apiUrl:e}=P(),t=W();return X.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":we.version,...t?{Authorization:`Bearer ${t}`}:{}}})},V={login:async(e,t,s)=>(await a().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await a().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await a().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,r,o="main")=>(await a().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:r,branch:o})).data,getSecretDetails:async(e,t,s,r="main")=>(await a().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${r}`)).data,syncLogs:async e=>(await a().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,r,o,c)=>(await a().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:r,sourceEnv:o,sourceKey:c})).data,rotateSecret:async(e,t,s,r,o)=>(await a().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:r,parsedNewValue:o})).data,promoteSecret:async(e,t,s)=>(await a().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await a().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,r)=>{let o={format:e};return t&&(o.startDate=t),s&&(o.endDate=s),r&&(o.projectId=r),(await a().post("/audit/export",o,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,r)=>(await a().post("/access/request",{projectId:e,secretId:r,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await a().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=P(),s=t?`&workspaceId=${t}`:"";return(await a().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await a().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=P(),t=e?`/project?workspaceId=${e}`:"/project";return(await a().get(t)).data},getBranches:async e=>(await a().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await a().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await a().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await a().put("/branch",{id:e,...t})).data,getRoles:async()=>(await a().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await a().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await a().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await a().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await a().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await a().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await a().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await a().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,r)=>(await a().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:r})).data,cloneEnvironment:async(e,t,s,r,o)=>(await a().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:r,branch:o})).data,generateJitLink:async e=>(await a().post("/jit/generate",e)).data,claimJitLink:async e=>(await a().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await a().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await a().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await a().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await a().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await a().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,r)=>(await a().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:r})).data,deleteServiceAccountKey:async(e,t,s)=>(await a().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await a().post(e,t)).data};var u=["development","staging","production"],U={development:n.default.green,staging:n.default.yellow,production:n.default.red},D=process.stdout.columns||120,$={tl:"\u256D",tr:"\u256E",bl:"\u2570",br:"\u256F",h:"\u2500",v:"\u2502",x:"\u253C",lt:"\u251C",rt:"\u2524",tt:"\u252C",bt:"\u2534"};function j(e,t=$.h){return t.repeat(e)}function G(e,t,s,r){let o=r?n.default.cyan:n.default.hex("#2d3a4d"),c=s-2,h=g=>g.padEnd(c).slice(0,c),k=r?n.default.bold.cyan(` ${e} `):n.default.hex("#4a5568")(` ${e} `),S=o($.tl)+k+o(j(c-e.length-2))+o($.tr),B=t.map(g=>o($.v)+g.slice(0,c).padEnd(c)+o($.v)),E=o($.bl)+o(j(c))+o($.br);return[S,...B,E]}function Z(){process.stdout.write("\x1B[H\x1B[2J\x1B[3J")}async function be(){let e="projects",t=[],s=0,r=0,o=[],c=0,h="Loading\u2026",k=!1,S=!1;async function B(){h="Loading projects\u2026",g();try{let l=await V.getProjects();t=Array.isArray(l)?l:l.projects??[],h=t.length>0?`${t.length} project(s) found \xB7 \u2191\u2193 navigate \xB7 Enter to load secrets`:"No projects found. Run `xtra login` first."}catch(l){h=n.default.red(`\u2717 ${l?.response?.data?.error||"An unexpected error occurred"}`)}g()}async function E(){if(t[s]){k=!0,h=`Fetching secrets for ${n.default.cyan(t[s].name)} / ${U[u[r]](u[r])}\u2026`,g();try{let p=Q().branch||"main",f=await V.getSecrets(t[s].id,u[r],p);f&&typeof f=="object"&&!Array.isArray(f)?o=Object.entries(f).map(([m,v])=>({id:m,key:m,value:String(v),updatedAt:new Date().toISOString()})):Array.isArray(f)?o=f:o=[],c=0,h=o.length>0?`${o.length} secret(s) \xB7 V toggle values \xB7 Tab switch panel \xB7 Q quit`:"No secrets in this environment."}catch(l){o=[],h=n.default.red(`\u2717 ${l?.response?.data?.error||"An unexpected error occurred"}`)}k=!1,g()}}function g(){Z();let l=n.default.bold.cyan(" \u{1F512} XtraSecurity")+n.default.hex("#4a5a6b")(" \u2014 Interactive Secrets Shell"),p=U[u[r]]?U[u[r]](u[r]):n.default.white(u[r]),f=t[s]?n.default.hex("#4a5568")(` ${t[s].name} `)+n.default.hex("#4a5568")("/")+n.default.hex("#4a5568")(` ${u[r]}`):n.default.hex("#4a5568")(" No project selected");console.log(),console.log(l+n.default.hex("#2d3a4d")(" \u2502")+f),console.log(n.default.hex("#1e293b")(j(D))),console.log();let m=26,v=D-m-3,se=(t.length>0?t:[{id:"",name:"(loading\u2026)"}]).map((i,y)=>{let d=y===s,A=d?n.default.cyan("\u25B6 "):" ",I=d&&e==="projects"?n.default.bold.bgCyan.black(` ${i.name} `.padEnd(m-4)):d?n.default.bold.cyan(i.name):n.default.hex("#6b7c93")(i.name);return` ${A}${I}`}),ne=G("PROJECTS",se,m,e==="projects"),re=u.map((i,y)=>{let d=y===r,A=d?n.default.cyan("\u25B6 "):" ",I=U[i]??n.default.white,L=d&&e==="env"?n.default.bold.bgCyan.black(` ${i} `.padEnd(m-4)):d?I.bold(i):n.default.hex("#6b7c93")(i);return` ${A}${L}`}),oe=G("ENVIRONMENT",re,m,e==="env"),R=Math.floor((v-3)*.45),w=Math.floor((v-3)*.35),N=v-R-w-4,ae=n.default.bold.hex("#64748b")("KEY".padEnd(R))+" "+n.default.bold.hex("#64748b")("VALUE".padEnd(w))+" "+n.default.bold.hex("#64748b")("UPDATED".padEnd(N)),ce=n.default.hex("#1e293b")(j(R)+" "+j(w)+" "+j(N)),C;k?C=[` ${n.default.cyan("\u280B")} Loading\u2026`]:o.length===0?C=[` ${n.default.hex("#4a5568")("No secrets in this environment.")}`]:C=[" "+ae," "+ce,...o.map((i,y)=>{let d=y===c&&e==="secrets",A=i.key.padEnd(R).slice(0,R),I=S?i.value.padEnd(w).slice(0,w):"\u25CF".repeat(Math.min(8,w)).padEnd(w).slice(0,w),L=new Date(i.updatedAt).toLocaleDateString("en-GB",{day:"2-digit",month:"short"}).padEnd(N);return d?n.default.bold.bgHex("#0e243e")(" \u25B6 "+n.default.cyan(A)+" "+n.default.greenBright(I)+" "+n.default.hex("#4a9eff")(L)+" "):" "+n.default.white(A)+" "+n.default.hex("#4a5568")(I)+" "+n.default.hex("#374151")(L)})];let q=G(`SECRETS (${o.length})`,C,v,e==="secrets"),J=[...ne,"","",...oe],ie=Math.max(J.length,q.length),pe=n.default.hex("#1e293b")(" \u2502 ");for(let i=0;i<ie;i++){let y=J[i]??" ".repeat(m),d=q[i]??" ".repeat(v);console.log(y+pe+d)}console.log(),console.log(n.default.hex("#1e293b")(j(D)));let ge=[[n.default.hex("#64748b")("\u2191\u2193"),"Navigate"],[n.default.hex("#64748b")("Enter"),"Select"],[n.default.hex("#64748b")("Tab"),"Switch Panel"],[n.default.hex("#64748b")("V"),S?n.default.green("Hide values"):n.default.yellow("Show values")],[n.default.hex("#64748b")("Q"),"Quit"]].map(([i,y])=>`${i} ${n.default.hex("#374151")(y)}`).join(n.default.hex("#1e293b")(" \xB7 "));console.log(" "+ge),console.log(),console.log(" "+(h||""))}te.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("keypress",async(l,p)=>{if(p){if((p.name==="q"||p.ctrl&&p.name==="c")&&(process.stdin.isTTY&&process.stdin.setRawMode(!1),Z(),console.log(n.default.cyan(` Goodbye! \u{1F44B}
1
+ var de=Object.create;var T=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,me=Object.prototype.hasOwnProperty;var ye=(e,t)=>{for(var s in t)T(e,s,{get:t[s],enumerable:!0})},J=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ue(t))!me.call(e,o)&&o!==s&&T(e,o,{get:()=>t[o],enumerable:!(r=le(t,o))||r.enumerable});return e};var b=(e,t,s)=>(s=e!=null?de(he(e)):{},J(t||!e||!e.__esModule?T(s,"default",{value:e,enumerable:!0}):s,e)),fe=e=>J(T({},"__esModule",{value:!0}),e);var ve={};ye(ve,{uiCommand:()=>xe});module.exports=fe(ve);var ee=require("commander"),n=b(require("chalk")),te=b(require("readline"));var X=b(require("axios"));var K=b(require("conf")),_=b(require("fs")),F=b(require("path")),M="https://www.xtrasecurity.in/api",x=new K.default({projectName:"xtra-cli",defaults:{apiUrl:M}}),H=x.get("apiUrl");H&&!process.env.XTRA_API_URL&&H.includes("xtra-security.vercel.app")&&x.set("apiUrl",M);var P=()=>({...x.store,apiUrl:process.env.XTRA_API_URL||x.get("apiUrl")||M});var W=()=>x.get("token");var Q=()=>{let e={};try{let t=F.default.join(process.cwd(),".xtrarc");_.default.existsSync(t)&&(e=JSON.parse(_.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||x.get("project")||"",env:e.env||x.get("env")||"development",branch:e.branch||x.get("branch")||"main"}};var Y=b(require("fs")),z=b(require("path")),we=JSON.parse(Y.readFileSync(z.join(__dirname,"../../package.json"),"utf-8")),a=()=>{let{apiUrl:e}=P(),t=W();return X.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":we.version,...t?{Authorization:`Bearer ${t}`}:{}}})},O={login:async(e,t,s)=>(await a().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await a().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await a().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,r,o="main")=>(await a().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:r,branch:o})).data,getSecretDetails:async(e,t,s,r="main")=>(await a().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${r}`)).data,syncLogs:async e=>(await a().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,r,o,c)=>(await a().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:r,sourceEnv:o,sourceKey:c})).data,rotateSecret:async(e,t,s,r,o)=>(await a().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:r,parsedNewValue:o})).data,promoteSecret:async(e,t,s)=>(await a().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await a().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,r)=>{let o={format:e};return t&&(o.startDate=t),s&&(o.endDate=s),r&&(o.projectId=r),(await a().post("/audit/export",o,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,r)=>(await a().post("/access/request",{projectId:e,secretId:r,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await a().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=P(),s=t?`&workspaceId=${t}`:"";return(await a().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await a().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=P(),t=e?`/project?workspaceId=${e}`:"/project";return(await a().get(t)).data},getBranches:async e=>(await a().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await a().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await a().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await a().put("/branch",{id:e,...t})).data,getRoles:async()=>(await a().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await a().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await a().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await a().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await a().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await a().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await a().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await a().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,r)=>(await a().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:r})).data,cloneEnvironment:async(e,t,s,r,o)=>(await a().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:r,branch:o})).data,generateJitLink:async e=>(await a().post("/jit/generate",e)).data,claimJitLink:async e=>(await a().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await a().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await a().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await a().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await a().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await a().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,r)=>(await a().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:r})).data,deleteServiceAccountKey:async(e,t,s)=>(await a().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await a().post(e,t)).data};var u=["development","staging","production"],U={development:n.default.green,staging:n.default.yellow,production:n.default.red},V=process.stdout.columns||120,$={tl:"\u256D",tr:"\u256E",bl:"\u2570",br:"\u256F",h:"\u2500",v:"\u2502",x:"\u253C",lt:"\u251C",rt:"\u2524",tt:"\u252C",bt:"\u2534"};function j(e,t=$.h){return t.repeat(e)}function D(e,t,s,r){let o=r?n.default.cyan:n.default.hex("#2d3a4d"),c=s-2,h=g=>g.padEnd(c).slice(0,c),k=r?n.default.bold.cyan(` ${e} `):n.default.hex("#4a5568")(` ${e} `),S=o($.tl)+k+o(j(c-e.length-2))+o($.tr),B=t.map(g=>o($.v)+g.slice(0,c).padEnd(c)+o($.v)),E=o($.bl)+o(j(c))+o($.br);return[S,...B,E]}function Z(){process.stdout.write("\x1B[H\x1B[2J\x1B[3J")}async function be(){let e="projects",t=[],s=0,r=0,o=[],c=0,h="Loading\u2026",k=!1,S=!1;async function B(){h="Loading projects\u2026",g();try{let d=await O.getProjects();t=Array.isArray(d)?d:d.projects??[],h=t.length>0?`${t.length} project(s) found \xB7 \u2191\u2193 navigate \xB7 Enter to load secrets`:"No projects found. Run `xtra login` first."}catch(d){h=n.default.red(`\u2717 ${d?.response?.data?.error||"An unexpected error occurred"}`)}g()}async function E(){if(t[s]){k=!0,h=`Fetching secrets for ${n.default.cyan(t[s].name)} / ${U[u[r]](u[r])}\u2026`,g();try{let p=Q().branch||"main",f=await O.getSecrets(t[s].id,u[r],p);f&&typeof f=="object"&&!Array.isArray(f)?o=Object.entries(f).map(([m,v])=>({id:m,key:m,value:String(v),updatedAt:new Date().toISOString()})):Array.isArray(f)?o=f:o=[],c=0,h=o.length>0?`${o.length} secret(s) \xB7 V toggle values \xB7 Tab switch panel \xB7 Q quit`:"No secrets in this environment."}catch(d){o=[],h=n.default.red(`\u2717 ${d?.response?.data?.error||"An unexpected error occurred"}`)}k=!1,g()}}function g(){Z();let d=n.default.bold.cyan(" \u{1F512} XtraSecurity")+n.default.hex("#4a5a6b")(" \u2014 Interactive Secrets Shell"),p=U[u[r]]?U[u[r]](u[r]):n.default.white(u[r]),f=t[s]?n.default.hex("#4a5568")(` ${t[s].name} `)+n.default.hex("#4a5568")("/")+n.default.hex("#4a5568")(` ${u[r]}`):n.default.hex("#4a5568")(" No project selected");console.log(),console.log(d+n.default.hex("#2d3a4d")(" \u2502")+f),console.log(n.default.hex("#1e293b")(j(V))),console.log();let m=26,v=V-m-3,se=(t.length>0?t:[{id:"",name:"(loading\u2026)"}]).map((i,y)=>{let l=y===s,A=l?n.default.cyan("\u25B6 "):" ",I=l&&e==="projects"?n.default.bold.bgCyan.black(` ${i.name} `.padEnd(m-4)):l?n.default.bold.cyan(i.name):n.default.hex("#6b7c93")(i.name);return` ${A}${I}`}),ne=D("PROJECTS",se,m,e==="projects"),re=u.map((i,y)=>{let l=y===r,A=l?n.default.cyan("\u25B6 "):" ",I=U[i]??n.default.white,L=l&&e==="env"?n.default.bold.bgCyan.black(` ${i} `.padEnd(m-4)):l?I.bold(i):n.default.hex("#6b7c93")(i);return` ${A}${L}`}),oe=D("ENVIRONMENT",re,m,e==="env"),R=Math.floor((v-3)*.45),w=Math.floor((v-3)*.35),N=v-R-w-4,ae=n.default.bold.hex("#64748b")("KEY".padEnd(R))+" "+n.default.bold.hex("#64748b")("VALUE".padEnd(w))+" "+n.default.bold.hex("#64748b")("UPDATED".padEnd(N)),ce=n.default.hex("#1e293b")(j(R)+" "+j(w)+" "+j(N)),C;k?C=[` ${n.default.cyan("\u280B")} Loading\u2026`]:o.length===0?C=[` ${n.default.hex("#4a5568")("No secrets in this environment.")}`]:C=[" "+ae," "+ce,...o.map((i,y)=>{let l=y===c&&e==="secrets",A=i.key.padEnd(R).slice(0,R),I=S?i.value.padEnd(w).slice(0,w):"\u25CF".repeat(Math.min(8,w)).padEnd(w).slice(0,w),L=new Date(i.updatedAt).toLocaleDateString("en-GB",{day:"2-digit",month:"short"}).padEnd(N);return l?n.default.bold.bgHex("#0e243e")(" \u25B6 "+n.default.cyan(A)+" "+n.default.greenBright(I)+" "+n.default.hex("#4a9eff")(L)+" "):" "+n.default.white(A)+" "+n.default.hex("#4a5568")(I)+" "+n.default.hex("#374151")(L)})];let G=D(`SECRETS (${o.length})`,C,v,e==="secrets"),q=[...ne,"","",...oe],ie=Math.max(q.length,G.length),pe=n.default.hex("#1e293b")(" \u2502 ");for(let i=0;i<ie;i++){let y=q[i]??" ".repeat(m),l=G[i]??" ".repeat(v);console.log(y+pe+l)}console.log(),console.log(n.default.hex("#1e293b")(j(V)));let ge=[[n.default.hex("#64748b")("\u2191\u2193"),"Navigate"],[n.default.hex("#64748b")("Enter"),"Select"],[n.default.hex("#64748b")("Tab"),"Switch Panel"],[n.default.hex("#64748b")("V"),S?n.default.green("Hide values"):n.default.yellow("Show values")],[n.default.hex("#64748b")("Q"),"Quit"]].map(([i,y])=>`${i} ${n.default.hex("#374151")(y)}`).join(n.default.hex("#1e293b")(" \xB7 "));console.log(" "+ge),console.log(),console.log(" "+(h||""))}te.emitKeypressEvents(process.stdin),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.on("keypress",async(d,p)=>{if(p){if((p.name==="q"||p.ctrl&&p.name==="c")&&(process.stdin.isTTY&&process.stdin.setRawMode(!1),Z(),console.log(n.default.cyan(` Goodbye! \u{1F44B}
2
2
  `)),process.exit(0)),p.name==="v"){S=!S,g();return}if(p.name==="tab"){e=e==="projects"?"env":e==="env"?"secrets":"projects",g();return}if(e==="projects"&&(p.name==="up"&&(s=Math.max(0,s-1)),p.name==="down"&&(s=Math.min(t.length-1,s+1)),p.name==="return")){e="env",g();return}if(e==="env"&&(p.name==="up"&&(r=Math.max(0,r-1)),p.name==="down"&&(r=Math.min(u.length-1,r+1)),p.name==="return")){e="secrets",await E();return}e==="secrets"&&(p.name==="up"&&(c=Math.max(0,c-1)),p.name==="down"&&(c=Math.min(o.length-1,c+1))),g()}}),await B(),t.length>0?await E():g()}var xe=new ee.Command("ui").description("Launch interactive TUI secrets dashboard (arrow keys, Tab, Q to quit)").action(async()=>{await be()});0&&(module.exports={uiCommand});
@@ -1,4 +1,4 @@
1
- var N=Object.create;var l=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var E=(e,t)=>{for(var s in t)l(e,s,{get:t[s],enumerable:!0})},S=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of D(t))!J.call(e,o)&&o!==s&&l(e,o,{get:()=>t[o],enumerable:!(n=B(t,o))||n.enumerable});return e};var d=(e,t,s)=>(s=e!=null?N(q(e)):{},S(t||!e||!e.__esModule?l(s,"default",{value:e,enumerable:!0}):s,e)),M=e=>S(l({},"__esModule",{value:!0}),e);var H={};E(H,{watchCommand:()=>F});module.exports=M(H);var T=require("commander");var C=d(require("axios"));var x=d(require("conf")),h=d(require("fs")),k=d(require("path")),m="https://www.xtrasecurity.in/api",g=new x.default({projectName:"xtra-cli",defaults:{apiUrl:m}}),w=g.get("apiUrl");w&&!process.env.XTRA_API_URL&&(w.includes("localhost")||w.includes("xtra-security.vercel.app"))&&g.set("apiUrl",m);var u=()=>({...g.store,apiUrl:process.env.XTRA_API_URL||g.get("apiUrl")||m});var b=()=>g.get("token");var I=()=>{let e={};try{let t=k.default.join(process.cwd(),".xtrarc");h.default.existsSync(t)&&(e=JSON.parse(h.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||g.get("project")||"",env:e.env||g.get("env")||"development",branch:e.branch||g.get("branch")||"main"}};var A=d(require("fs")),P=d(require("path")),V=JSON.parse(A.readFileSync(P.join(__dirname,"../../package.json"),"utf-8")),r=()=>{let{apiUrl:e}=u(),t=b();return C.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":V.version,...t?{Authorization:`Bearer ${t}`}:{}}})},f={login:async(e,t,s)=>(await r().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,n,o="main")=>(await r().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:n,branch:o})).data,getSecretDetails:async(e,t,s,n="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${n}`)).data,syncLogs:async e=>(await r().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,n,o,c)=>(await r().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:o,sourceKey:c})).data,rotateSecret:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:o})).data,promoteSecret:async(e,t,s)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await r().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,n)=>{let o={format:e};return t&&(o.startDate=t),s&&(o.endDate=s),n&&(o.projectId=n),(await r().post("/audit/export",o,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,n)=>(await r().post("/access/request",{projectId:e,secretId:n,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await r().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=u(),s=t?`&workspaceId=${t}`:"";return(await r().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await r().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=u(),t=e?`/project?workspaceId=${e}`:"/project";return(await r().get(t)).data},getBranches:async e=>(await r().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await r().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await r().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await r().put("/branch",{id:e,...t})).data,getRoles:async()=>(await r().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await r().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await r().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await r().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await r().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await r().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await r().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,n)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:n,branch:o})).data,generateJitLink:async e=>(await r().post("/jit/generate",e)).data,claimJitLink:async e=>(await r().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await r().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await r().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await r().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await r().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await r().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,n)=>(await r().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(e,t,s)=>(await r().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await r().post(e,t)).data};var a=d(require("chalk")),L=require("child_process"),p=null,v="";function R(e){return JSON.stringify(Object.keys(e).sort().map(t=>`${t}=${e[t]}`))}async function U(e,t,s,n){p&&(process.stdout.write(a.default.cyan(`
1
+ var N=Object.create;var l=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,J=Object.prototype.hasOwnProperty;var E=(e,t)=>{for(var s in t)l(e,s,{get:t[s],enumerable:!0})},j=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of D(t))!J.call(e,o)&&o!==s&&l(e,o,{get:()=>t[o],enumerable:!(n=B(t,o))||n.enumerable});return e};var d=(e,t,s)=>(s=e!=null?N(q(e)):{},j(t||!e||!e.__esModule?l(s,"default",{value:e,enumerable:!0}):s,e)),M=e=>j(l({},"__esModule",{value:!0}),e);var H={};E(H,{watchCommand:()=>F});module.exports=M(H);var T=require("commander");var C=d(require("axios"));var x=d(require("conf")),w=d(require("fs")),k=d(require("path")),h="https://www.xtrasecurity.in/api",g=new x.default({projectName:"xtra-cli",defaults:{apiUrl:h}}),S=g.get("apiUrl");S&&!process.env.XTRA_API_URL&&S.includes("xtra-security.vercel.app")&&g.set("apiUrl",h);var u=()=>({...g.store,apiUrl:process.env.XTRA_API_URL||g.get("apiUrl")||h});var b=()=>g.get("token");var I=()=>{let e={};try{let t=k.default.join(process.cwd(),".xtrarc");w.default.existsSync(t)&&(e=JSON.parse(w.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||g.get("project")||"",env:e.env||g.get("env")||"development",branch:e.branch||g.get("branch")||"main"}};var A=d(require("fs")),P=d(require("path")),V=JSON.parse(A.readFileSync(P.join(__dirname,"../../package.json"),"utf-8")),r=()=>{let{apiUrl:e}=u(),t=b();return C.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":V.version,...t?{Authorization:`Bearer ${t}`}:{}}})},m={login:async(e,t,s)=>(await r().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,n,o="main")=>(await r().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:n,branch:o})).data,getSecretDetails:async(e,t,s,n="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${n}`)).data,syncLogs:async e=>(await r().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,n,o,c)=>(await r().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:o,sourceKey:c})).data,rotateSecret:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:o})).data,promoteSecret:async(e,t,s)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await r().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,n)=>{let o={format:e};return t&&(o.startDate=t),s&&(o.endDate=s),n&&(o.projectId=n),(await r().post("/audit/export",o,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,n)=>(await r().post("/access/request",{projectId:e,secretId:n,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await r().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=u(),s=t?`&workspaceId=${t}`:"";return(await r().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await r().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=u(),t=e?`/project?workspaceId=${e}`:"/project";return(await r().get(t)).data},getBranches:async e=>(await r().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await r().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await r().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await r().put("/branch",{id:e,...t})).data,getRoles:async()=>(await r().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await r().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await r().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await r().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await r().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await r().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await r().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,n)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:n,branch:o})).data,generateJitLink:async e=>(await r().post("/jit/generate",e)).data,claimJitLink:async e=>(await r().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await r().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await r().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await r().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await r().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await r().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,n)=>(await r().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(e,t,s)=>(await r().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await r().post(e,t)).data};var a=d(require("chalk")),L=require("child_process"),p=null,f="";function R(e){return JSON.stringify(Object.keys(e).sort().map(t=>`${t}=${e[t]}`))}async function U(e,t,s,n){p&&(process.stdout.write(a.default.cyan(`
2
2
  [watch] `)+a.default.yellow(`Secret change detected \u2014 restarting...
3
3
  `)),p.kill("SIGTERM"),await new Promise(c=>setTimeout(c,500)));let o={...process.env,...s};process.stdout.write(a.default.cyan(" [watch] ")+a.default.green(`Starting: ${e} ${t.join(" ")}
4
4
  `)),p=(0,L.spawn)(e,t,{env:o,stdio:"inherit",shell:n}),p.on("exit",c=>{c!==null&&c!==0&&process.stdout.write(a.default.cyan(" [watch] ")+a.default.red(`Process exited with code ${c}
@@ -8,10 +8,10 @@ Examples:
8
8
  $ xtra watch -p proj123 -e dev node app.js
9
9
  $ xtra watch -p proj123 -e dev --interval 10 --shell npm run dev
10
10
  $ xtra watch -p proj123 -e dev -- node -r dotenv/config server.js
11
- `).action(async(e,t,s)=>{let{project:n,env:o,branch:c,interval:y,shell:_}=s;o={dev:"development",stg:"staging",prod:"production"}[o]||o,n||(n=I().project),n||(console.error(a.default.red("Error: Project ID required. Use -p <id> or run 'xtra project set'.")),process.exit(1)),o==="production"&&(console.error(a.default.red("\u26A0 xtra watch is not allowed in PRODUCTION for safety reasons.")),console.error(a.default.gray(" Use 'xtra run' for one-shot production injection.")),process.exit(1));let G=Math.max(3,parseInt(y))*1e3,O=process.platform==="win32",$=_||O;console.log(a.default.bold.cyan(`
11
+ `).action(async(e,t,s)=>{let{project:n,env:o,branch:c,interval:y,shell:_}=s;o={dev:"development",stg:"staging",prod:"production"}[o]||o,n||(n=I().project),n||(console.error(a.default.red("Error: Project ID required. Use -p <id> or run 'xtra project set'.")),process.exit(1)),o==="production"&&(console.error(a.default.red("\u26A0 xtra watch is not allowed in PRODUCTION for safety reasons.")),console.error(a.default.gray(" Use 'xtra run' for one-shot production injection.")),process.exit(1));let G=Math.max(3,parseInt(y))*1e3,O=process.platform==="win32",v=_||O;console.log(a.default.bold.cyan(`
12
12
  \u25CF xtra watch`)+a.default.bold(` \u2014 watching ${o}/${c} (every ${y}s)
13
13
  `)),console.log(a.default.gray(` Press Ctrl+C to stop.
14
14
  `)),process.on("SIGINT",()=>{p&&p.kill("SIGTERM"),console.log(a.default.cyan(`
15
- [watch] `)+a.default.gray("Stopped.")),process.exit(0)});try{let i=await f.getSecrets(n,o,c);v=R(i),await U(e,t,i,$)}catch(i){console.error(a.default.red("Failed to fetch secrets: "+(i?.response?.data?.error||i?.response?.data?.error||"An unexpected error occurred"))),process.exit(1)}setInterval(async()=>{try{let i=await f.getSecrets(n,o,c),j=R(i);j!==v?(v=j,await U(e,t,i,$)):process.stdout.write(a.default.cyan(" [watch] ")+a.default.gray(`${new Date().toLocaleTimeString()} \u2014 no changes \r`))}catch(i){process.stdout.write(a.default.cyan(`
15
+ [watch] `)+a.default.gray("Stopped.")),process.exit(0)});try{let i=await m.getSecrets(n,o,c);f=R(i),await U(e,t,i,v)}catch(i){console.error(a.default.red("Failed to fetch secrets: "+(i?.response?.data?.error||i?.response?.data?.error||"An unexpected error occurred"))),process.exit(1)}setInterval(async()=>{try{let i=await m.getSecrets(n,o,c),$=R(i);$!==f?(f=$,await U(e,t,i,v)):process.stdout.write(a.default.cyan(" [watch] ")+a.default.gray(`${new Date().toLocaleTimeString()} \u2014 no changes \r`))}catch(i){process.stdout.write(a.default.cyan(`
16
16
  [watch] `)+a.default.yellow(`Poll failed: ${i?.response?.data?.error||"An unexpected error occurred"}
17
17
  `))}},G)});0&&(module.exports={watchCommand});
package/dist/lib/api.js CHANGED
@@ -1 +1 @@
1
- var h=Object.create;var i=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var k=(s,e)=>{for(var t in e)i(s,t,{get:e[t],enumerable:!0})},y=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of j(e))!b.call(s,a)&&a!==t&&i(s,a,{get:()=>e[a],enumerable:!(r=v(e,a))||r.enumerable});return s};var p=(s,e,t)=>(t=s!=null?h(S(s)):{},y(e||!s||!s.__esModule?i(t,"default",{value:s,enumerable:!0}):t,s)),x=s=>y(i({},"__esModule",{value:!0}),s);var U={};k(U,{api:()=>I});module.exports=x(U);var m=p(require("axios"));var l=p(require("conf"));var d="https://www.xtrasecurity.in/api",c=new l.default({projectName:"xtra-cli",defaults:{apiUrl:d}}),u=c.get("apiUrl");u&&!process.env.XTRA_API_URL&&(u.includes("localhost")||u.includes("xtra-security.vercel.app"))&&c.set("apiUrl",d);var g=()=>({...c.store,apiUrl:process.env.XTRA_API_URL||c.get("apiUrl")||d});var w=()=>c.get("token");var $=p(require("fs")),f=p(require("path")),A=JSON.parse($.readFileSync(f.join(__dirname,"../../package.json"),"utf-8")),n=()=>{let{apiUrl:s}=g(),e=w();return m.default.create({baseURL:s,headers:{"Content-Type":"application/json","X-CLI-Version":A.version,...e?{Authorization:`Bearer ${e}`}:{}}})},I={login:async(s,e,t)=>(await n().post("/auth/cli-login",{email:s,password:e,apiKey:t})).data,getSecrets:async(s,e,t="main")=>(await n().get(`/projects/${s}/envs/${e}/secrets?branch=${t}`)).data,getSecretVersions:async(s,e,t="main")=>(await n().get(`/projects/${s}/envs/${e}/secrets?includeVersions=true&branch=${t}`)).data,setSecrets:async(s,e,t,r,a="main")=>(await n().post(`/projects/${s}/envs/${e}/secrets`,{secrets:t,expectedVersions:r,branch:a})).data,getSecretDetails:async(s,e,t,r="main")=>(await n().get(`/projects/${s}/envs/${e}/secrets/${t}?branch=${r}`)).data,syncLogs:async s=>(await n().post("/audit/cli-logs",{logs:s})).data,linkSecret:async(s,e,t,r,a,o)=>(await n().post(`/projects/${s}/envs/${e}/secrets/link`,{key:t,sourceProjectId:r,sourceEnv:a,sourceKey:o})).data,rotateSecret:async(s,e,t,r,a)=>(await n().post(`/projects/${s}/envs/${e}/secrets/${t}/rotate`,{strategy:r,parsedNewValue:a})).data,promoteSecret:async(s,e,t)=>(await n().post(`/projects/${s}/envs/${e}/secrets/${t}/promote`,{})).data,verifyAuditLogs:async()=>(await n().get("/audit/verify")).data,exportAuditLogs:async(s,e,t,r)=>{let a={format:s};return e&&(a.startDate=e),t&&(a.endDate=t),r&&(a.projectId=r),(await n().post("/audit/export",a,{responseType:s==="csv"?"text":"json"})).data},requestAccess:async(s,e,t,r)=>(await n().post("/access/request",{projectId:s,secretId:r,reason:e,duration:t})).data,approveAccess:async(s,e)=>(await n().post("/access/approve",{requestId:s,decision:e})).data,listAccessRequests:async s=>{let{workspace:e}=g(),t=e?`&workspaceId=${e}`:"";return(await n().get(`/access/list?mode=${s}${t}`)).data},getAccessRequestStatus:async s=>(await n().get(`/access/request?id=${s}`)).data,getProjects:async()=>{let{workspace:s}=g(),e=s?`/project?workspaceId=${s}`:"/project";return(await n().get(e)).data},getBranches:async s=>(await n().get(`/branch?projectId=${s}`)).data,createBranch:async(s,e,t)=>(await n().post("/branch",{projectId:s,name:e,description:t})).data,deleteBranch:async s=>(await n().delete(`/branch/${s}`)).data,updateBranch:async(s,e)=>(await n().put("/branch",{id:s,...e})).data,getRoles:async()=>(await n().get("/admin/roles")).data,getUsers:async s=>{let e=s?`?teamId=${s}`:"";return(await n().get(`/admin/users${e}`)).data},setUserRole:async(s,e,t)=>(await n().put("/admin/users/role",{email:s,role:e,teamId:t})).data,getIntegrationStatus:async s=>(await n().get(`/integrations/${s}`)).data,getIntegrationRepos:async s=>(await n().get(`/integrations/${s}/sync`)).data.repos,syncSecretsToGithub:async s=>(await n().post("/integrations/github/sync",s)).data,exportKubernetesSecret:async(s,e)=>{let t=new URLSearchParams(e).toString();return(await n().get(`/projects/${s}/kubernetes?${t}`)).data},getSecretHistory:async(s,e,t)=>(await n().get(`/projects/${s}/envs/${e}/secrets/${t}/history`)).data,rollbackSecret:async(s,e,t,r)=>(await n().post(`/projects/${s}/envs/${e}/secrets/${t}/history`,{version:r})).data,cloneEnvironment:async(s,e,t,r,a)=>(await n().post(`/projects/${s}/envs/clone`,{fromEnv:e,toEnv:t,overwrite:r,branch:a})).data,generateJitLink:async s=>(await n().post("/jit/generate",s)).data,claimJitLink:async s=>(await n().post("/jit/claim",{token:s})).data,getJitInfo:async s=>(await n().get(`/jit/${s}`)).data,getServiceAccounts:async s=>(await n().get(`/projects/${s}/service-accounts`)).data,createServiceAccount:async(s,e)=>(await n().post(`/projects/${s}/service-accounts`,e)).data,deleteServiceAccount:async(s,e)=>(await n().delete(`/projects/${s}/service-accounts/${e}`)).data,getServiceAccountKeys:async(s,e)=>(await n().get(`/projects/${s}/service-accounts/${e}/keys`)).data,createServiceAccountKey:async(s,e,t,r)=>(await n().post(`/projects/${s}/service-accounts/${e}/keys`,{label:t,expiresAt:r})).data,deleteServiceAccountKey:async(s,e,t)=>(await n().delete(`/projects/${s}/service-accounts/${e}/keys/${t}`)).data,post:async(s,e)=>(await n().post(s,e)).data};0&&(module.exports={api});
1
+ var v=Object.create;var i=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var k=(s,e)=>{for(var t in e)i(s,t,{get:e[t],enumerable:!0})},d=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of j(e))!b.call(s,a)&&a!==t&&i(s,a,{get:()=>e[a],enumerable:!(r=h(e,a))||r.enumerable});return s};var p=(s,e,t)=>(t=s!=null?v(S(s)):{},d(e||!s||!s.__esModule?i(t,"default",{value:s,enumerable:!0}):t,s)),x=s=>d(i({},"__esModule",{value:!0}),s);var U={};k(U,{api:()=>I});module.exports=x(U);var m=p(require("axios"));var l=p(require("conf"));var u="https://www.xtrasecurity.in/api",c=new l.default({projectName:"xtra-cli",defaults:{apiUrl:u}}),y=c.get("apiUrl");y&&!process.env.XTRA_API_URL&&y.includes("xtra-security.vercel.app")&&c.set("apiUrl",u);var g=()=>({...c.store,apiUrl:process.env.XTRA_API_URL||c.get("apiUrl")||u});var w=()=>c.get("token");var $=p(require("fs")),f=p(require("path")),A=JSON.parse($.readFileSync(f.join(__dirname,"../../package.json"),"utf-8")),n=()=>{let{apiUrl:s}=g(),e=w();return m.default.create({baseURL:s,headers:{"Content-Type":"application/json","X-CLI-Version":A.version,...e?{Authorization:`Bearer ${e}`}:{}}})},I={login:async(s,e,t)=>(await n().post("/auth/cli-login",{email:s,password:e,apiKey:t})).data,getSecrets:async(s,e,t="main")=>(await n().get(`/projects/${s}/envs/${e}/secrets?branch=${t}`)).data,getSecretVersions:async(s,e,t="main")=>(await n().get(`/projects/${s}/envs/${e}/secrets?includeVersions=true&branch=${t}`)).data,setSecrets:async(s,e,t,r,a="main")=>(await n().post(`/projects/${s}/envs/${e}/secrets`,{secrets:t,expectedVersions:r,branch:a})).data,getSecretDetails:async(s,e,t,r="main")=>(await n().get(`/projects/${s}/envs/${e}/secrets/${t}?branch=${r}`)).data,syncLogs:async s=>(await n().post("/audit/cli-logs",{logs:s})).data,linkSecret:async(s,e,t,r,a,o)=>(await n().post(`/projects/${s}/envs/${e}/secrets/link`,{key:t,sourceProjectId:r,sourceEnv:a,sourceKey:o})).data,rotateSecret:async(s,e,t,r,a)=>(await n().post(`/projects/${s}/envs/${e}/secrets/${t}/rotate`,{strategy:r,parsedNewValue:a})).data,promoteSecret:async(s,e,t)=>(await n().post(`/projects/${s}/envs/${e}/secrets/${t}/promote`,{})).data,verifyAuditLogs:async()=>(await n().get("/audit/verify")).data,exportAuditLogs:async(s,e,t,r)=>{let a={format:s};return e&&(a.startDate=e),t&&(a.endDate=t),r&&(a.projectId=r),(await n().post("/audit/export",a,{responseType:s==="csv"?"text":"json"})).data},requestAccess:async(s,e,t,r)=>(await n().post("/access/request",{projectId:s,secretId:r,reason:e,duration:t})).data,approveAccess:async(s,e)=>(await n().post("/access/approve",{requestId:s,decision:e})).data,listAccessRequests:async s=>{let{workspace:e}=g(),t=e?`&workspaceId=${e}`:"";return(await n().get(`/access/list?mode=${s}${t}`)).data},getAccessRequestStatus:async s=>(await n().get(`/access/request?id=${s}`)).data,getProjects:async()=>{let{workspace:s}=g(),e=s?`/project?workspaceId=${s}`:"/project";return(await n().get(e)).data},getBranches:async s=>(await n().get(`/branch?projectId=${s}`)).data,createBranch:async(s,e,t)=>(await n().post("/branch",{projectId:s,name:e,description:t})).data,deleteBranch:async s=>(await n().delete(`/branch/${s}`)).data,updateBranch:async(s,e)=>(await n().put("/branch",{id:s,...e})).data,getRoles:async()=>(await n().get("/admin/roles")).data,getUsers:async s=>{let e=s?`?teamId=${s}`:"";return(await n().get(`/admin/users${e}`)).data},setUserRole:async(s,e,t)=>(await n().put("/admin/users/role",{email:s,role:e,teamId:t})).data,getIntegrationStatus:async s=>(await n().get(`/integrations/${s}`)).data,getIntegrationRepos:async s=>(await n().get(`/integrations/${s}/sync`)).data.repos,syncSecretsToGithub:async s=>(await n().post("/integrations/github/sync",s)).data,exportKubernetesSecret:async(s,e)=>{let t=new URLSearchParams(e).toString();return(await n().get(`/projects/${s}/kubernetes?${t}`)).data},getSecretHistory:async(s,e,t)=>(await n().get(`/projects/${s}/envs/${e}/secrets/${t}/history`)).data,rollbackSecret:async(s,e,t,r)=>(await n().post(`/projects/${s}/envs/${e}/secrets/${t}/history`,{version:r})).data,cloneEnvironment:async(s,e,t,r,a)=>(await n().post(`/projects/${s}/envs/clone`,{fromEnv:e,toEnv:t,overwrite:r,branch:a})).data,generateJitLink:async s=>(await n().post("/jit/generate",s)).data,claimJitLink:async s=>(await n().post("/jit/claim",{token:s})).data,getJitInfo:async s=>(await n().get(`/jit/${s}`)).data,getServiceAccounts:async s=>(await n().get(`/projects/${s}/service-accounts`)).data,createServiceAccount:async(s,e)=>(await n().post(`/projects/${s}/service-accounts`,e)).data,deleteServiceAccount:async(s,e)=>(await n().delete(`/projects/${s}/service-accounts/${e}`)).data,getServiceAccountKeys:async(s,e)=>(await n().get(`/projects/${s}/service-accounts/${e}/keys`)).data,createServiceAccountKey:async(s,e,t,r)=>(await n().post(`/projects/${s}/service-accounts/${e}/keys`,{label:t,expiresAt:r})).data,deleteServiceAccountKey:async(s,e,t)=>(await n().delete(`/projects/${s}/service-accounts/${e}/keys/${t}`)).data,post:async(s,e)=>(await n().post(s,e)).data};0&&(module.exports={api});
@@ -1 +1 @@
1
- var v=Object.create;var y=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var b=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $(t))!x.call(e,o)&&o!==s&&y(e,o,{get:()=>t[o],enumerable:!(n=j(t,o))||n.enumerable});return e};var p=(e,t,s)=>(s=e!=null?v(S(e)):{},b(t||!e||!e.__esModule?y(s,"default",{value:e,enumerable:!0}):s,e));var w=p(require("axios"));var m=p(require("conf"));var l="https://www.xtrasecurity.in/api",g=new m.default({projectName:"xtra-cli",defaults:{apiUrl:l}}),d=g.get("apiUrl");d&&!process.env.XTRA_API_URL&&(d.includes("localhost")||d.includes("xtra-security.vercel.app"))&&g.set("apiUrl",l);var c=()=>({...g.store,apiUrl:process.env.XTRA_API_URL||g.get("apiUrl")||l});var u=()=>g.get("token");var h=p(require("fs")),f=p(require("path")),A=JSON.parse(h.readFileSync(f.join(__dirname,"../../package.json"),"utf-8")),r=()=>{let{apiUrl:e}=c(),t=u();return w.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":A.version,...t?{Authorization:`Bearer ${t}`}:{}}})},a={login:async(e,t,s)=>(await r().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,n,o="main")=>(await r().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:n,branch:o})).data,getSecretDetails:async(e,t,s,n="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${n}`)).data,syncLogs:async e=>(await r().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,n,o,i)=>(await r().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:o,sourceKey:i})).data,rotateSecret:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:o})).data,promoteSecret:async(e,t,s)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await r().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,n)=>{let o={format:e};return t&&(o.startDate=t),s&&(o.endDate=s),n&&(o.projectId=n),(await r().post("/audit/export",o,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,n)=>(await r().post("/access/request",{projectId:e,secretId:n,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await r().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=c(),s=t?`&workspaceId=${t}`:"";return(await r().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await r().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=c(),t=e?`/project?workspaceId=${e}`:"/project";return(await r().get(t)).data},getBranches:async e=>(await r().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await r().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await r().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await r().put("/branch",{id:e,...t})).data,getRoles:async()=>(await r().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await r().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await r().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await r().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await r().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await r().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await r().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,n)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:n,branch:o})).data,generateJitLink:async e=>(await r().post("/jit/generate",e)).data,claimJitLink:async e=>(await r().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await r().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await r().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await r().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await r().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await r().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,n)=>(await r().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(e,t,s)=>(await r().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await r().post(e,t)).data};var k=p(require("axios"));jest.mock("axios");jest.mock("./config");var R=k.default;describe("API Client",()=>{let e=jest.fn(),t=jest.fn(),s=jest.fn();beforeAll(()=>{R.create=e,c.mockReturnValue({apiUrl:"http://localhost:3000/api"}),u.mockReturnValue("test-token-123"),e.mockReturnValue({get:t,post:s})}),beforeEach(()=>{jest.clearAllMocks()}),describe("login",()=>{it("should send login request with email and password",async()=>{s.mockResolvedValue({data:{token:"new-token"}});let n=await a.login("user@example.com","password123");expect(s).toHaveBeenCalledWith("/auth/cli-login",{email:"user@example.com",password:"password123",apiKey:void 0}),expect(n).toEqual({token:"new-token"})}),it("should send login request with API key",async()=>{s.mockResolvedValue({data:{token:"api-key-token"}});let n=await a.login(void 0,void 0,"xtra_key_abc123");expect(s).toHaveBeenCalledWith("/auth/cli-login",{email:void 0,password:void 0,apiKey:"xtra_key_abc123"}),expect(n).toEqual({token:"api-key-token"})})}),describe("getSecrets",()=>{it("should fetch secrets for project and environment",async()=>{let n={secrets:[{key:"DB_URL",value:"postgres://..."}]};t.mockResolvedValue({data:n});let o=await a.getSecrets("proj-123","production","main");expect(t).toHaveBeenCalledWith("/projects/proj-123/envs/production/secrets?branch=main"),expect(o).toEqual(n)}),it("should use default branch if not specified",async()=>{t.mockResolvedValue({data:{secrets:[]}}),await a.getSecrets("proj-123","dev"),expect(t).toHaveBeenCalledWith("/projects/proj-123/envs/dev/secrets?branch=main")})}),describe("setSecrets",()=>{it("should post secrets to API",async()=>{let n={DB_URL:"postgres://new",API_KEY:"key123"};s.mockResolvedValue({data:{success:!0}});let o=await a.setSecrets("proj-123","staging",n);expect(s).toHaveBeenCalledWith("/projects/proj-123/envs/staging/secrets",{secrets:n,expectedVersions:void 0,branch:"main"}),expect(o).toEqual({success:!0})})}),describe("rotateSecret",()=>{it("should rotate secret with strategy",async()=>{s.mockResolvedValue({data:{newValue:"rotated-value"}});let n=await a.rotateSecret("proj-123","prod","API_KEY","regenerate");expect(s).toHaveBeenCalledWith("/projects/proj-123/envs/prod/secrets/API_KEY/rotate",{strategy:"regenerate",parsedNewValue:void 0}),expect(n).toEqual({newValue:"rotated-value"})})})});
1
+ var v=Object.create;var l=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var b=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $(t))!x.call(e,o)&&o!==s&&l(e,o,{get:()=>t[o],enumerable:!(n=j(t,o))||n.enumerable});return e};var p=(e,t,s)=>(s=e!=null?v(S(e)):{},b(t||!e||!e.__esModule?l(s,"default",{value:e,enumerable:!0}):s,e));var w=p(require("axios"));var m=p(require("conf"));var d="https://www.xtrasecurity.in/api",g=new m.default({projectName:"xtra-cli",defaults:{apiUrl:d}}),y=g.get("apiUrl");y&&!process.env.XTRA_API_URL&&y.includes("xtra-security.vercel.app")&&g.set("apiUrl",d);var c=()=>({...g.store,apiUrl:process.env.XTRA_API_URL||g.get("apiUrl")||d});var u=()=>g.get("token");var h=p(require("fs")),f=p(require("path")),A=JSON.parse(h.readFileSync(f.join(__dirname,"../../package.json"),"utf-8")),r=()=>{let{apiUrl:e}=c(),t=u();return w.default.create({baseURL:e,headers:{"Content-Type":"application/json","X-CLI-Version":A.version,...t?{Authorization:`Bearer ${t}`}:{}}})},a={login:async(e,t,s)=>(await r().post("/auth/cli-login",{email:e,password:t,apiKey:s})).data,getSecrets:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?branch=${s}`)).data,getSecretVersions:async(e,t,s="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(e,t,s,n,o="main")=>(await r().post(`/projects/${e}/envs/${t}/secrets`,{secrets:s,expectedVersions:n,branch:o})).data,getSecretDetails:async(e,t,s,n="main")=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}?branch=${n}`)).data,syncLogs:async e=>(await r().post("/audit/cli-logs",{logs:e})).data,linkSecret:async(e,t,s,n,o,i)=>(await r().post(`/projects/${e}/envs/${t}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:o,sourceKey:i})).data,rotateSecret:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:o})).data,promoteSecret:async(e,t,s)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await r().get("/audit/verify")).data,exportAuditLogs:async(e,t,s,n)=>{let o={format:e};return t&&(o.startDate=t),s&&(o.endDate=s),n&&(o.projectId=n),(await r().post("/audit/export",o,{responseType:e==="csv"?"text":"json"})).data},requestAccess:async(e,t,s,n)=>(await r().post("/access/request",{projectId:e,secretId:n,reason:t,duration:s})).data,approveAccess:async(e,t)=>(await r().post("/access/approve",{requestId:e,decision:t})).data,listAccessRequests:async e=>{let{workspace:t}=c(),s=t?`&workspaceId=${t}`:"";return(await r().get(`/access/list?mode=${e}${s}`)).data},getAccessRequestStatus:async e=>(await r().get(`/access/request?id=${e}`)).data,getProjects:async()=>{let{workspace:e}=c(),t=e?`/project?workspaceId=${e}`:"/project";return(await r().get(t)).data},getBranches:async e=>(await r().get(`/branch?projectId=${e}`)).data,createBranch:async(e,t,s)=>(await r().post("/branch",{projectId:e,name:t,description:s})).data,deleteBranch:async e=>(await r().delete(`/branch/${e}`)).data,updateBranch:async(e,t)=>(await r().put("/branch",{id:e,...t})).data,getRoles:async()=>(await r().get("/admin/roles")).data,getUsers:async e=>{let t=e?`?teamId=${e}`:"";return(await r().get(`/admin/users${t}`)).data},setUserRole:async(e,t,s)=>(await r().put("/admin/users/role",{email:e,role:t,teamId:s})).data,getIntegrationStatus:async e=>(await r().get(`/integrations/${e}`)).data,getIntegrationRepos:async e=>(await r().get(`/integrations/${e}/sync`)).data.repos,syncSecretsToGithub:async e=>(await r().post("/integrations/github/sync",e)).data,exportKubernetesSecret:async(e,t)=>{let s=new URLSearchParams(t).toString();return(await r().get(`/projects/${e}/kubernetes?${s}`)).data},getSecretHistory:async(e,t,s)=>(await r().get(`/projects/${e}/envs/${t}/secrets/${s}/history`)).data,rollbackSecret:async(e,t,s,n)=>(await r().post(`/projects/${e}/envs/${t}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(e,t,s,n,o)=>(await r().post(`/projects/${e}/envs/clone`,{fromEnv:t,toEnv:s,overwrite:n,branch:o})).data,generateJitLink:async e=>(await r().post("/jit/generate",e)).data,claimJitLink:async e=>(await r().post("/jit/claim",{token:e})).data,getJitInfo:async e=>(await r().get(`/jit/${e}`)).data,getServiceAccounts:async e=>(await r().get(`/projects/${e}/service-accounts`)).data,createServiceAccount:async(e,t)=>(await r().post(`/projects/${e}/service-accounts`,t)).data,deleteServiceAccount:async(e,t)=>(await r().delete(`/projects/${e}/service-accounts/${t}`)).data,getServiceAccountKeys:async(e,t)=>(await r().get(`/projects/${e}/service-accounts/${t}/keys`)).data,createServiceAccountKey:async(e,t,s,n)=>(await r().post(`/projects/${e}/service-accounts/${t}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(e,t,s)=>(await r().delete(`/projects/${e}/service-accounts/${t}/keys/${s}`)).data,post:async(e,t)=>(await r().post(e,t)).data};var k=p(require("axios"));jest.mock("axios");jest.mock("./config");var R=k.default;describe("API Client",()=>{let e=jest.fn(),t=jest.fn(),s=jest.fn();beforeAll(()=>{R.create=e,c.mockReturnValue({apiUrl:"http://localhost:3000/api"}),u.mockReturnValue("test-token-123"),e.mockReturnValue({get:t,post:s})}),beforeEach(()=>{jest.clearAllMocks()}),describe("login",()=>{it("should send login request with email and password",async()=>{s.mockResolvedValue({data:{token:"new-token"}});let n=await a.login("user@example.com","password123");expect(s).toHaveBeenCalledWith("/auth/cli-login",{email:"user@example.com",password:"password123",apiKey:void 0}),expect(n).toEqual({token:"new-token"})}),it("should send login request with API key",async()=>{s.mockResolvedValue({data:{token:"api-key-token"}});let n=await a.login(void 0,void 0,"xtra_key_abc123");expect(s).toHaveBeenCalledWith("/auth/cli-login",{email:void 0,password:void 0,apiKey:"xtra_key_abc123"}),expect(n).toEqual({token:"api-key-token"})})}),describe("getSecrets",()=>{it("should fetch secrets for project and environment",async()=>{let n={secrets:[{key:"DB_URL",value:"postgres://..."}]};t.mockResolvedValue({data:n});let o=await a.getSecrets("proj-123","production","main");expect(t).toHaveBeenCalledWith("/projects/proj-123/envs/production/secrets?branch=main"),expect(o).toEqual(n)}),it("should use default branch if not specified",async()=>{t.mockResolvedValue({data:{secrets:[]}}),await a.getSecrets("proj-123","dev"),expect(t).toHaveBeenCalledWith("/projects/proj-123/envs/dev/secrets?branch=main")})}),describe("setSecrets",()=>{it("should post secrets to API",async()=>{let n={DB_URL:"postgres://new",API_KEY:"key123"};s.mockResolvedValue({data:{success:!0}});let o=await a.setSecrets("proj-123","staging",n);expect(s).toHaveBeenCalledWith("/projects/proj-123/envs/staging/secrets",{secrets:n,expectedVersions:void 0,branch:"main"}),expect(o).toEqual({success:!0})})}),describe("rotateSecret",()=>{it("should rotate secret with strategy",async()=>{s.mockResolvedValue({data:{newValue:"rotated-value"}});let n=await a.rotateSecret("proj-123","prod","API_KEY","regenerate");expect(s).toHaveBeenCalledWith("/projects/proj-123/envs/prod/secrets/API_KEY/rotate",{strategy:"regenerate",parsedNewValue:void 0}),expect(n).toEqual({newValue:"rotated-value"})})})});