@cnbcool/cnb-cli 1.17.7 → 1.17.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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -122,7 +122,7 @@ ${s}
122
122
  CNB_PULL_REQUEST_IID - PR 编号(PR 相关快捷命令)
123
123
 
124
124
  默认只输出摘要信息,添加 --v 可输出全部信息
125
- `)}}function Ov(e,t){if(e==="skills")return{};let i=process.env.CNB_REPO_SLUG||"";if(t)return{repo:i};let r=e==="issues"?process.env.CNB_ISSUE_IID||"":process.env.CNB_PULL_REQUEST_IID||"";return{repo:i,number:r}}function Ev(e,t){if(!e||!t)return null;let i=e==="issues"?wr:e==="pulls"?qr:e==="skills"?Hv:null;if(!i)return null;let r=i.find((o)=>o.shortName===t);if(!r)return null;let s=r.realTool,p=Ov(e,!!r.repoOnly),n=r.autoData||null;if(e==="pulls"&&r.realTool==="post-pull-comment"&&process.env.CNB_REVIEW_ID)s="post-pull-request-review-reply",p.review_id=process.env.CNB_REVIEW_ID,n={...n||{},reply_to_comment_id:process.env.CNB_REVIEW_ID};return{module:e,tool:s,autoPath:p,autoData:n,upload:!!r.upload,kind:r.kind}}function Dv(e,t){if(!t)return e;for(let[i,r]of Object.entries(t.autoPath||{}))if(!e[i])e[i]=r;for(let[i,r]of Object.entries(t.autoData||{}))if(e[i]===void 0)e[i]=r;return e}});var Ny=d((Jt)=>{Object.defineProperty(Jt,"__esModule",{value:!0});Jt.handleIssueCreateUpload=r0;Jt.handleUpload=s0;var Nr=qy(require("fs")),wy=qy(require("path"));function qy(e){return e&&e.__esModule?e:{default:e}}var Cv={".txt":"text/plain",".html":"text/html",".htm":"text/html",".css":"text/css",".csv":"text/csv",".js":"application/javascript",".mjs":"application/javascript",".json":"application/json",".xml":"application/xml",".pdf":"application/pdf",".zip":"application/zip",".gz":"application/gzip",".gzip":"application/gzip",".tar":"application/x-tar",".7z":"application/x-7z-compressed",".rar":"application/vnd.rar",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".webp":"image/webp",".ico":"image/x-icon",".bmp":"image/bmp",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".mp4":"video/mp4",".webm":"video/webm",".avi":"video/x-msvideo",".mov":"video/quicktime",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".md":"text/markdown",".yaml":"text/yaml",".yml":"text/yaml",".sh":"application/x-sh",".py":"text/x-python",".rb":"text/x-ruby",".go":"text/x-go",".rs":"text/x-rust",".ts":"text/typescript",".tsx":"text/typescript",".jsx":"text/jsx",".java":"text/x-java-source",".c":"text/x-c",".h":"text/x-c",".cpp":"text/x-c++src",".hpp":"text/x-c++hdr",".log":"text/plain",".patch":"text/x-diff",".diff":"text/x-diff"};function xv(e){let t=wy.default.extname(e).toLowerCase();return Cv[t]||"application/octet-stream"}var zy=104857600;function ky(e){if(!e)return{ok:!1,result:{status:400,data:{error:`上传命令需要指定文件路径,如: --data '{"file":"./path/to/file"}'`}}};if(!Nr.default.existsSync(e))return{ok:!1,result:{status:400,data:{error:`文件不存在: ${e}`}}};let t=Nr.default.statSync(e);if(!t.isFile())return{ok:!1,result:{status:400,data:{error:`不是文件: ${e}`}}};let i=t.size;if(i===0)return{ok:!1,result:{status:400,data:{error:"文件为空"}}};if(i>zy)return{ok:!1,result:{status:400,data:{error:`文件过大 (${(i/1024/1024).toFixed(1)}MB),上限 ${zy/1024/1024}MB`}}};return{ok:!0,info:{filePath:e,fileName:wy.default.basename(e),fileSize:i,contentType:xv(e)}}}async function Uy(e,t,i,r){let s=Nr.default.createReadStream(e),p;try{p=await fetch(t,{method:"PUT",headers:{"Content-Type":i,"Content-Length":String(r)},body:s,duplex:"half"})}catch(n){throw s.destroy(),n}if(!p.ok){s.destroy();let n=await p.text().catch(()=>"");return{status:p.status,data:{error:`文件上传失败: ${p.statusText}`,detail:n}}}return}function e0(e){let t=e.indexOf("/-/");return t>0?e.slice(t):e}function t0(e){return e.replace(/[[\]()\\]/g,"\\$&").replace(/\r?\n/g," ")}function i0(e){return encodeURI(e).replace(/\(/g,"%28").replace(/\)/g,"%29")}async function r0(e,t,i,r){let s=ky(t);if(!s.ok)return s.result;let{filePath:p,fileName:n,fileSize:o,contentType:a}=s.info,c=e.kind==="image"?"image":"file",y={name:n,size:o,content_type:a},g=c==="image"?{image_assets:[y]}:{file_assets:[y]},m=await i(r.repo,g),h=m?.data,b=(c==="image"?h?.image_upload_urls:h?.file_upload_urls)?.[0],_=b?.upload_url;if(!_)return m;let f=await Uy(p,_,a,o);if(f)return f;return{status:200,data:{asset_link:b?.asset_link,name:b?.name||n,size:o,asset_group_id:h?.asset_group_id}}}async function s0(e,t,i,r){let s=ky(t);if(!s.ok)return s.result;let{filePath:p,fileName:n,fileSize:o,contentType:a}=s.info,c,y;if(e.module==="issues"){if(!r.number)return{status:400,data:{error:"缺少 issue number(请确认 CNB_ISSUE_IID 是否已设置)"}};let m=await i({repo:r.repo,number:r.number},{name:n,size:o,content_type:a}),h=m?.data;if(c=h?.upload_url,!c)return m;y={asset_link:h?.asset_link,name:h?.name||n,size:o}}else{let m=await i(r.repo,{name:n,size:o}),h=m?.data;if(c=h?.upload_url,!c)return m;let P=h?.assets?.path,b=h?.assets?.name||n,_=e.kind==="image"||e.tool==="upload-imgs";y={asset_link:P?`${_?"!":""}[${t0(b)}](${i0(e0(P))})`:void 0,name:b,size:o,token:h?.token}}let g=await Uy(p,c,a,o);if(g)return g;return{status:200,data:y}}});var Wy=d((Wr)=>{Object.defineProperty(Wr,"__esModule",{value:!0});Wr.getTokenEnvKey=n0;var p0="cnb-app";function n0(){return`WORKBUDDY_TOKEN_URL_${p0.toUpperCase().replace(/-/g,"_")}`}});var Ty=d((Tr)=>{Object.defineProperty(Tr,"__esModule",{value:!0});Tr.isWorkBuddySandbox=o0;function o0(){return!!process.env.AGENTOS_RUNTIME_ID}});var Ie=d((Ir)=>{Object.defineProperty(Ir,"__esModule",{value:!0});Ir.getTokenPath=c0;var a0=Iy(require("path")),d0=Iy(require("os"));function Iy(e){return e&&e.__esModule?e:{default:e}}function c0(){return a0.default.join(d0.default.homedir(),".cnb","token")}});var Ce=d((De)=>{Object.defineProperty(De,"__esModule",{value:!0});De.getGitRemoteHosts=Sy;De.normalizeTokenHost=Sr;De.resolvePlatformUrl=m0;var y0=require("node:child_process");function Sy(){try{let e=(0,y0.execSync)("git remote -v",{encoding:"utf8",stdio:["ignore","pipe","ignore"]}),t=new Set;for(let i of e.split(`
125
+ `)}}function Ov(e,t){if(e==="skills")return{};let i=process.env.CNB_REPO_SLUG||"";if(t)return{repo:i};let r=e==="issues"?process.env.CNB_ISSUE_IID||"":process.env.CNB_PULL_REQUEST_IID||"";return{repo:i,number:r}}function Ev(e,t){if(!e||!t)return null;let i=e==="issues"?wr:e==="pulls"?qr:e==="skills"?Hv:null;if(!i)return null;let r=i.find((o)=>o.shortName===t);if(!r)return null;let s=r.realTool,p=Ov(e,!!r.repoOnly),n=r.autoData||null;if(e==="pulls"&&r.realTool==="post-pull-comment"&&process.env.CNB_REVIEW_ID)s="post-pull-request-review-reply",p.review_id=process.env.CNB_REVIEW_ID,n={...n||{},reply_to_comment_id:process.env.CNB_COMMENT_ID};return{module:e,tool:s,autoPath:p,autoData:n,upload:!!r.upload,kind:r.kind}}function Dv(e,t){if(!t)return e;for(let[i,r]of Object.entries(t.autoPath||{}))if(!e[i])e[i]=r;for(let[i,r]of Object.entries(t.autoData||{}))if(e[i]===void 0)e[i]=r;return e}});var Ny=d((Jt)=>{Object.defineProperty(Jt,"__esModule",{value:!0});Jt.handleIssueCreateUpload=r0;Jt.handleUpload=s0;var Nr=qy(require("fs")),wy=qy(require("path"));function qy(e){return e&&e.__esModule?e:{default:e}}var Cv={".txt":"text/plain",".html":"text/html",".htm":"text/html",".css":"text/css",".csv":"text/csv",".js":"application/javascript",".mjs":"application/javascript",".json":"application/json",".xml":"application/xml",".pdf":"application/pdf",".zip":"application/zip",".gz":"application/gzip",".gzip":"application/gzip",".tar":"application/x-tar",".7z":"application/x-7z-compressed",".rar":"application/vnd.rar",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".webp":"image/webp",".ico":"image/x-icon",".bmp":"image/bmp",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".mp4":"video/mp4",".webm":"video/webm",".avi":"video/x-msvideo",".mov":"video/quicktime",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".md":"text/markdown",".yaml":"text/yaml",".yml":"text/yaml",".sh":"application/x-sh",".py":"text/x-python",".rb":"text/x-ruby",".go":"text/x-go",".rs":"text/x-rust",".ts":"text/typescript",".tsx":"text/typescript",".jsx":"text/jsx",".java":"text/x-java-source",".c":"text/x-c",".h":"text/x-c",".cpp":"text/x-c++src",".hpp":"text/x-c++hdr",".log":"text/plain",".patch":"text/x-diff",".diff":"text/x-diff"};function xv(e){let t=wy.default.extname(e).toLowerCase();return Cv[t]||"application/octet-stream"}var zy=104857600;function ky(e){if(!e)return{ok:!1,result:{status:400,data:{error:`上传命令需要指定文件路径,如: --data '{"file":"./path/to/file"}'`}}};if(!Nr.default.existsSync(e))return{ok:!1,result:{status:400,data:{error:`文件不存在: ${e}`}}};let t=Nr.default.statSync(e);if(!t.isFile())return{ok:!1,result:{status:400,data:{error:`不是文件: ${e}`}}};let i=t.size;if(i===0)return{ok:!1,result:{status:400,data:{error:"文件为空"}}};if(i>zy)return{ok:!1,result:{status:400,data:{error:`文件过大 (${(i/1024/1024).toFixed(1)}MB),上限 ${zy/1024/1024}MB`}}};return{ok:!0,info:{filePath:e,fileName:wy.default.basename(e),fileSize:i,contentType:xv(e)}}}async function Uy(e,t,i,r){let s=Nr.default.createReadStream(e),p;try{p=await fetch(t,{method:"PUT",headers:{"Content-Type":i,"Content-Length":String(r)},body:s,duplex:"half"})}catch(n){throw s.destroy(),n}if(!p.ok){s.destroy();let n=await p.text().catch(()=>"");return{status:p.status,data:{error:`文件上传失败: ${p.statusText}`,detail:n}}}return}function e0(e){let t=e.indexOf("/-/");return t>0?e.slice(t):e}function t0(e){return e.replace(/[[\]()\\]/g,"\\$&").replace(/\r?\n/g," ")}function i0(e){return encodeURI(e).replace(/\(/g,"%28").replace(/\)/g,"%29")}async function r0(e,t,i,r){let s=ky(t);if(!s.ok)return s.result;let{filePath:p,fileName:n,fileSize:o,contentType:a}=s.info,c=e.kind==="image"?"image":"file",y={name:n,size:o,content_type:a},g=c==="image"?{image_assets:[y]}:{file_assets:[y]},m=await i(r.repo,g),h=m?.data,b=(c==="image"?h?.image_upload_urls:h?.file_upload_urls)?.[0],_=b?.upload_url;if(!_)return m;let f=await Uy(p,_,a,o);if(f)return f;return{status:200,data:{asset_link:b?.asset_link,name:b?.name||n,size:o,asset_group_id:h?.asset_group_id}}}async function s0(e,t,i,r){let s=ky(t);if(!s.ok)return s.result;let{filePath:p,fileName:n,fileSize:o,contentType:a}=s.info,c,y;if(e.module==="issues"){if(!r.number)return{status:400,data:{error:"缺少 issue number(请确认 CNB_ISSUE_IID 是否已设置)"}};let m=await i({repo:r.repo,number:r.number},{name:n,size:o,content_type:a}),h=m?.data;if(c=h?.upload_url,!c)return m;y={asset_link:h?.asset_link,name:h?.name||n,size:o}}else{let m=await i(r.repo,{name:n,size:o}),h=m?.data;if(c=h?.upload_url,!c)return m;let P=h?.assets?.path,b=h?.assets?.name||n,_=e.kind==="image"||e.tool==="upload-imgs";y={asset_link:P?`${_?"!":""}[${t0(b)}](${i0(e0(P))})`:void 0,name:b,size:o,token:h?.token}}let g=await Uy(p,c,a,o);if(g)return g;return{status:200,data:y}}});var Wy=d((Wr)=>{Object.defineProperty(Wr,"__esModule",{value:!0});Wr.getTokenEnvKey=n0;var p0="cnb-app";function n0(){return`WORKBUDDY_TOKEN_URL_${p0.toUpperCase().replace(/-/g,"_")}`}});var Ty=d((Tr)=>{Object.defineProperty(Tr,"__esModule",{value:!0});Tr.isWorkBuddySandbox=o0;function o0(){return!!process.env.AGENTOS_RUNTIME_ID}});var Ie=d((Ir)=>{Object.defineProperty(Ir,"__esModule",{value:!0});Ir.getTokenPath=c0;var a0=Iy(require("path")),d0=Iy(require("os"));function Iy(e){return e&&e.__esModule?e:{default:e}}function c0(){return a0.default.join(d0.default.homedir(),".cnb","token")}});var Ce=d((De)=>{Object.defineProperty(De,"__esModule",{value:!0});De.getGitRemoteHosts=Sy;De.normalizeTokenHost=Sr;De.resolvePlatformUrl=m0;var y0=require("node:child_process");function Sy(){try{let e=(0,y0.execSync)("git remote -v",{encoding:"utf8",stdio:["ignore","pipe","ignore"]}),t=new Set;for(let i of e.split(`
126
126
  `)){let r=i.split(/\s+/)[1];if(!r)continue;let s=l0(r);if(s)t.add(s)}return[...t]}catch{return[]}}function l0(e){try{if(/^[^@/]+@[^:/]+:/.test(e)&&!/^[a-z]+:\/\//i.test(e))return e.slice(e.indexOf("@")+1,e.indexOf(":"))||null;return new URL(e).hostname||null}catch{return null}}function Sr(e){return e.trim().toLowerCase().replace(/^api\./,"")}function u0(e){let t=e.trim();if(!t)return null;if(/^[a-z][a-z0-9+.-]*:\/\//i.test(t))return null;if(!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(:\d{1,5})?$/i.test(t))return null;return`https://${Sr(t)}`}function g0(e){try{let t=new URL(e.trim());if(!t.host)return null;return`https://${Sr(t.host)}`}catch{return null}}function m0(e){let t=e?.trim()?u0(e.trim()):null;if(t)return t;let i=Sy()[0];if(i)return`https://${i}`;let r=process.env.CNB_API_ENDPOINT?.trim()?g0(process.env.CNB_API_ENDPOINT.trim()):null;if(r)return r;return"https://cnb.cool"}});var Se=d((et)=>{Object.defineProperty(et,"__esModule",{value:!0});et.hostOfStore=Fy;et.loadToken=P0;et.readTokenFile=Jy;var Ry=h0(require("fs")),b0=Ie(),xe=Ce();function h0(e){return e&&e.__esModule?e:{default:e}}function Fy(e){for(let t of[e.platform_url,e.login_host]){if(!t)continue;try{let i=new URL(t).host;if(i)return(0,xe.normalizeTokenHost)(i)}catch{}}return null}function Jy(){let e=(0,b0.getTokenPath)();if(!Ry.default.existsSync(e))return{auths:{}};try{let t=JSON.parse(Ry.default.readFileSync(e,"utf-8"));if(t?.auths&&typeof t.auths==="object")return t;let i=t?.access_token?Fy(t)??"cnb.cool":null;return i?{auths:{[i]:t}}:{auths:{}}}catch{return{auths:{}}}}var Vy;function _0(){return Vy??=(0,xe.getGitRemoteHosts)(),Vy}function f0(){let e=process.env.CNB_API_ENDPOINT?.trim();if(!e)return null;try{return(0,xe.normalizeTokenHost)(new URL(e).host)}catch{return null}}function P0(e){let{auths:t}=Jy();if(e)return t[(0,xe.normalizeTokenHost)(e)]??null;let i=[..._0(),f0()];for(let s of i){let p=s?t[(0,xe.normalizeTokenHost)(s)]:void 0;if(p)return p}let r=Object.keys(t);return r.length?t[r[r.length-1]]:null}});var Vr=d((Rr)=>{Object.defineProperty(Rr,"__esModule",{value:!0});Rr.resolveTokenSource=A0;var Ly=Wy(),v0=Ty(),j0=Se();async function A0(e){if((0,v0.isWorkBuddySandbox)()){let i=process.env[(0,Ly.getTokenEnvKey)()];if(!i)return{source:"none",reason:`未找到环境变量 ${(0,Ly.getTokenEnvKey)()},无法在 WorkBuddy 沙箱环境中获取 token。`};try{let r=await fetch(i,{method:"GET",headers:{Accept:"application/json"}});if(!r.ok)return{source:"none",reason:`从 WorkBuddy 获取 token 失败,HTTP 状态码: ${r.status} ${r.statusText}`};let s=await r.json();if(s?.code!==0||!s?.data?.access_token)return{source:"none",reason:`从 WorkBuddy 获取 token 失败,响应内容异常: ${JSON.stringify(s)}`};return{source:"workbuddy",access_token:s.data.access_token}}catch(r){return{source:"none",reason:`从 WorkBuddy 获取 token 失败: ${r?.message||r}`}}}if(process.env.CNB_TOKEN_FOR_CODEBUDDY){if(!process.env.CNB_NPC_SLUG&&process.env.CNB_NPC_NAME==="CodeBuddy")return{source:"codebuddy_env",access_token:process.env.CNB_TOKEN_FOR_CODEBUDDY}}if(process.env.CNB_TOKEN)return{source:"env",access_token:process.env.CNB_TOKEN};let t=(0,j0.loadToken)(e);if(!t||!t.access_token)return{source:"none"};return{source:"file",access_token:t.access_token,store:t}}});var Mt=d((Lt)=>{Object.defineProperty(Lt,"__esModule",{value:!0});Lt.removeToken=k0;Lt.saveToken=q0;var Fr=My(require("fs")),K0=My(require("path")),z0=Ie(),Jr=Se(),w0=Ce();function My(e){return e&&e.__esModule?e:{default:e}}function $y(e){let t=(0,z0.getTokenPath)(),i=K0.default.dirname(t);if(!Fr.default.existsSync(i))Fr.default.mkdirSync(i,{recursive:!0});Fr.default.writeFileSync(t,JSON.stringify(e,null,2),{mode:384})}function q0(e){let t=(0,Jr.hostOfStore)(e);if(!t)throw Error("无法从登录态推断所属 host(缺少有效的 platform_url)");let i=(0,Jr.readTokenFile)();delete i.auths[t],i.auths[t]=e,$y(i)}function k0(e){let t=(0,Jr.readTokenFile)(),i=(0,w0.normalizeTokenHost)(e);if(!t.auths[i])return!1;return delete t.auths[i],$y(t),!0}});var $t=d((Lr)=>{Object.defineProperty(Lr,"__esModule",{value:!0});Lr.refreshAccessToken=N0;var U0=Mt();async function N0(e){if(!e.refresh_token)throw Error("no refresh_token");let t=e.platform_url||"https://cnb.cool",i=e.client_id||process.env.OAUTH2_CLIENT_ID||"cnb_cli",r=`${t.replace(/\/+$/,"")}/oauth2/token`,s=new URLSearchParams;s.set("grant_type","refresh_token"),s.set("refresh_token",e.refresh_token),s.set("client_id",i);let p=Math.floor(Date.now()/1000),n=await fetch(r,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:s.toString()});if(n.status!==200){let c=await n.text();throw Error(`refresh token failed: status=${n.status} body=${c}`)}let o=await n.json(),a={access_token:o.access_token,expires_at:p+o.expires_in,refresh_token:o.refresh_token||e.refresh_token,platform_url:e.platform_url||t,client_id:e.client_id,login_host:e.login_host};return(0,U0.saveToken)(a),o.access_token}});var Zt=d((Mr)=>{Object.defineProperty(Mr,"__esModule",{value:!0});Mr.resolveToken=I0;var W0=Vr(),T0=$t();async function I0(e){let t=await(0,W0.resolveTokenSource)(e),i=e?`cnb login --host ${e}`:"cnb login";if(t.source==="none")console.error(t.reason||`未找到有效的登录凭证,请先执行 \`${i}\` 进行授权。`),process.exit(1);if(t.source==="workbuddy"||t.source==="codebuddy_env"||t.source==="env")return t.access_token;let r=t.store;if(Math.floor(Date.now()/1000)<r.expires_at)return t.access_token;if(r.refresh_token)try{return await(0,T0.refreshAccessToken)(r)}catch(p){console.error(`Token 已过期,刷新失败: ${p.message}`),console.error(`请重新执行 \`${i}\` 进行授权。`),process.exit(1)}console.error(`Token 已过期且无 refresh_token,请重新执行 \`${i}\` 进行授权。`),process.exit(1)}});var Xt=d(($r)=>{Object.defineProperty($r,"__esModule",{value:!0});$r.resolveApiDomain=R0;var S0=Se();function R0(){let e=process.env.CNB_API_ENDPOINT||"https://api.cnb.cool";if(process.env.CNB_TOKEN_FOR_CODEBUDDY||process.env.CNB_TOKEN)return e;let t=(0,S0.loadToken)();if(t?.login_host)return t.login_host;return e}});var Yr=d((O)=>{Object.defineProperty(O,"__esModule",{value:!0});O.SN_PATTERN=void 0;O.apiRequest=Xy;O.apiRequestText=J0;O.extractSnFromStatuses=Yy;O.extractSnFromUrl=Xr;O.invalidSnMessage=Zy;O.resolveBuildContext=L0;var V0=Zt(),F0=Xt(),Zr=O.SN_PATTERN=/^cnb-[a-z0-9]+-[a-z0-9]+$/i;function Zy(e){return[`参数 --sn 的值不是合法的构建号: "${e}"`,"","构建号(sn)格式应为 cnb-xxx-xxxxxxxxx,例如 cnb-9p9-1jnfh8rv5。","常见错误:把 `cnb pulls check-status` 返回的 context 字段(形如",'"cnb/pull_request/common-lint")当成 sn 传入,这是 CI 状态的检查项名,',"不是构建号。","","请去掉 --sn 参数重试,工具会自动从当前 PR 的 CI 状态中解析失败构建的 sn。"].join(`
127
127
  `)}async function Xy(e,t){let i=await fetch(e,{headers:t});if(!i.ok)throw Error(`请求失败: ${i.status} ${i.statusText} — ${e}`);return i.json()}async function J0(e,t){let i=await fetch(e,{headers:t});if(!i.ok)throw Error(`请求失败: ${i.status} ${i.statusText} — ${e}`);return i.text()}function Yy(e){let t=e?.statuses||e;if(!Array.isArray(t)||t.length===0)return null;let i=t.find((r)=>r.state==="error"||r.state==="failure");if(!i)return null;return Xr(i.target_url||"")}function Xr(e){if(!e)return null;let t=e.match(/\/-\/build\/logs\/([^/?#]+)/);if(t&&Zr.test(t[1]))return t[1];let i=e.match(/\/-\/build\/([^/?#]+)/);if(i&&Zr.test(i[1]))return i[1];return null}async function L0(e){let t=(0,F0.resolveApiDomain)(),{repo:i}=e,r=e.sn;if(r&&!Zr.test(r))return{ok:!1,message:Zy(r)};let p={Accept:"application/vnd.cnb.api+json",Authorization:`Bearer ${await(0,V0.resolveToken)()}`};if(!r&&e.prNumber)try{let n=`${t}/${i}/-/pulls/${e.prNumber}/commit-statuses`,o=await Xy(n,p);if(r=Yy(o)??void 0,!r&&e.fallbackToLatestStatus){let a=o?.statuses||o;if(Array.isArray(a))for(let c of a){let y=Xr(c?.target_url||"");if(y){r=y;break}}}}catch(n){return{ok:!1,message:`获取 PR CI 状态失败: ${n.message}`}}if(!r){if(e.prNumber)return{ok:!1,message:e.fallbackToLatestStatus?"未从 PR CI 状态中找到任何可分析的构建。":"未从 PR CI 状态中找到失败的构建,所有构建均为成功状态。"};return{ok:!1,message:"缺少构建号(sn):未传入 --sn 且未检测到 PR 上下文(CNB_PULL_REQUEST_IID)。"}}return{ok:!0,ctx:{sn:r,domain:t,baseUrl:`${t}/${i}`,headers:p}}}});var Qy=d((Qr)=>{Object.defineProperty(Qr,"__esModule",{value:!0});Qr.diagnoseBuild=$0;var Yt=Yr();async function M0(e,t,i){let r=await(0,Yt.apiRequestText)(`${e}/-/build/logs/${t}`,i);try{let s=JSON.parse(r);if(s.data&&typeof s.data==="string")return Buffer.from(s.data,"base64").toString("utf-8");if(s.data?.data&&typeof s.data.data==="string")return Buffer.from(s.data.data,"base64").toString("utf-8");return JSON.stringify(s,null,2)}catch{return r}}async function $0(e){let t=await(0,Yt.resolveBuildContext)(e);if(!t.ok)return t.message;let{sn:i,baseUrl:r,headers:s}=t.ctx,p=[];p.push(`查询构建 sn=${i} 的流水线状态...
128
128
  `);let n;try{n=await(0,Yt.apiRequest)(`${r}/-/build/status/${i}`,s)}catch(c){return`获取构建状态失败: ${c.message}`}if(!n.pipelinesStatus||typeof n.pipelinesStatus!=="object")return p.push("未找到流水线状态信息"),p.push("返回数据:"),p.push(JSON.stringify(n,null,2)),p.join(`
@@ -297,4 +297,4 @@ PR 页面路径: ${s}
297
297
  登录成功 \uD83C\uDF89`),i.debug){if(console.log(` token_type : ${n.token_type}`),console.log(` expires_in : ${n.expires_in}`),console.log(` scope : ${n.scope||""}`),console.log(` access_token : ${(0,_e.maskToken)(n.access_token)}`),n.refresh_token)console.log(` refresh_token : ${(0,_e.maskToken)(n.refresh_token)}`);if(n.id_token)console.log(` id_token : ${(0,_e.maskToken)(n.id_token)}`)}let o=Math.floor(Date.now()/1000),c=`https://api.${new URL(i.platformURL).host}`,y={access_token:n.access_token,expires_at:o+n.expires_in,platform_url:i.platformURL,client_id:i.clientID,login_host:c};if(n.refresh_token)y.refresh_token=n.refresh_token;if((0,_e.saveToken)(y),i.debug)console.log(`Token 已保存到 ${(0,_e.getTokenPath)()}`)}catch(s){console.error(`
298
298
  登录失败: ${s.message}`),process.exit(1)}})}});var uv=d((Oc)=>{Object.defineProperty(Oc,"__esModule",{value:!0});Oc.registerLogoutCommand=N$;var z$=U$(require("fs")),w$=Ie(),q$=Se(),k$=Mt();function U$(e){return e&&e.__esModule?e:{default:e}}function N$(e){e.command("logout").description("退出登录,删除本地保存的 access_token").option("--host <string>","只退出指定平台域名的登录态(如 cnb.cool),不传则退出全部域名的登录态").option("--debug","打印调试信息",!1).helpOption("-h, --help","显示帮助文档").action(async(t)=>{let i=(0,w$.getTokenPath)();if(t.host){if((0,k$.removeToken)(t.host))console.log(`已成功退出 ${t.host} 的登录。`);else console.log(`${t.host} 当前未登录,无需退出。`);return}let{auths:r}=(0,q$.readTokenFile)(),s=Object.keys(r);if(!s.length){console.log("当前未登录,无需退出。");return}if(t.debug){console.log(`Token 文件路径: ${i}`);for(let p of s)console.log(`${p}: Platform URL=${r[p].platform_url}, Client ID=${r[p].client_id}`)}try{z$.default.unlinkSync(i),console.log(`已成功退出全部登录(${s.join("、")})。`)}catch(p){console.error(`退出登录失败: ${p.message}`),process.exit(1)}})}});var gv=d((Ec)=>{Object.defineProperty(Ec,"__esModule",{value:!0});Ec.registerStatusCommand=R$;var W$=Vr(),T$=$t(),I$=Ie(),S$={workbuddy:"WorkBuddy 远程获取",codebuddy_env:"CNB_TOKEN_FOR_CODEBUDDY 环境变量",env:"CNB_TOKEN 环境变量"};function R$(e){e.command("status").description("检查当前登录状态(token 是否存在、是否过期)").option("--host <string>","查看指定平台域名的登录态(如 cnb.cool),不传则按当前仓库 git remote、CNB_API_ENDPOINT 的顺序推断,都没有对应登录态时取最近一次保存的").option("--debug","打印调试信息",!1).helpOption("-h, --help","显示帮助文档").action(async(t)=>{let i=await(0,W$.resolveTokenSource)(t.host);if(i.source==="none"){console.log(i.reason?`⚠️ ${i.reason}`:"⚠️ 未登录,请执行 `cnb login` 进行授权。");return}if(i.source!=="file"){if(console.log("✅ 已登录。"),t.debug)console.log(` Token 来源: ${S$[i.source]}`);return}let r=(0,I$.getTokenPath)(),s=i.store;if(t.debug)console.log(`Token 文件路径 : ${r}`),console.log(`Platform URL : ${s.platform_url||"未知"}`),console.log(`Client ID : ${s.client_id||"未知"}`),console.log(`Expires At : ${new Date(s.expires_at*1000).toLocaleString()}`);if(Math.floor(Date.now()/1000)>=s.expires_at)if(s.refresh_token){if(t.debug)console.log("Token 已过期,尝试使用 refresh_token 刷新...");try{if(await(0,T$.refreshAccessToken)(s),console.log("✅ 已登录。"),t.debug)console.log(" (Token 已自动刷新)")}catch(o){if(t.debug)console.log(`刷新失败: ${o.message}`);console.log("⚠️ 未登录,请执行 `cnb login` 重新授权。")}}else console.log("⚠️ 未登录,请执行 `cnb login` 重新授权。");else console.log("✅ 已登录。")})}});var mv=d((Dc)=>{Object.defineProperty(Dc,"__esModule",{value:!0});Dc.registerGitCredentialCommand=L$;var V$=Zt(),F$=Ce(),J$=8000;function L$(e){e.command("git-credential <action>").description("作为 git credential helper,向 git 提供 CNB 凭据(仅供 git 内部调用)").allowUnknownOption().allowExcessArguments().helpOption("-h, --help","显示帮助文档").action(async(t,i,r)=>{let s=r.args.slice(0,-1);if(s.length>0)console.error(`[git-credential]: custom args: ${s.join(" ")}`);if(t==="store"||t==="erase")console.error(`[git-credential]: ${t} ignored`),process.exit(0);if(t!=="get")console.error(`[git-credential]: unknown action: ${t}`),process.exit(1);try{let p=await X$(J$),n=Y$(p,"=");Z$(n),await M$(n),process.exit(0)}catch(p){console.error(p?.message?p.message:String(p)),process.exit(2)}})}async function M$(e){let{host:t}=e;console.error(`[git-credential]: for ${e.protocol}://${e.host}/${e.path??""}`);let i=(0,F$.getGitRemoteHosts)();if(!t||i.length===0||!i.includes(t))throw Error(`unknown host: ${t}`);let r=await $$(t);process.stdout.write(`username=${r.username}
299
299
  `),process.stdout.write(`password=${r.password}
300
- `),console.error("[git-credential]: done")}async function $$(e){return{username:"cnb",password:await(0,V$.resolveToken)(e)}}function Z$(e){if(!e.path)return;if(e.path.endsWith(".git"))e.path=e.path.slice(0,-4);else if(e.path.endsWith(".git/info/lfs"))e.path=e.path.slice(0,-13)}function X$(e){return new Promise((t,i)=>{let r=[],s=!1,p=()=>{if(s)return;s=!0,clearTimeout(n),t(Buffer.concat(r).toString("utf-8"))},n=setTimeout(()=>{if(s)return;s=!0,console.error("[git-credential]: timeout occurred"),i(Error("stdin timeout"))},e);process.stdin.on("data",(o)=>{if(r.push(o),o.length===1&&o[0]===10)p()}),process.stdin.on("end",()=>{p()}),process.stdin.on("error",(o)=>{if(s)return;s=!0,clearTimeout(n),i(o)})})}function Y$(e,t){return e.split(/(?:\r\n|\r|\n)/).filter(Boolean).map((i)=>{let r=i.indexOf(t),s=r>=0?i.substring(0,r).trim():i.trim(),p=r>=0?i.substring(r+1).trim():"";return{key:s,value:p}}).reduce((i,{key:r,value:s})=>{if(r)i[r]=s;return i},{})}});Object.defineProperty(exports,"__esModule",{value:!0});Object.defineProperty(exports,"parseArguments",{enumerable:!0,get:function(){return x$.parseUnknownOptions}});var Q$=vr(),H$=by(),B$=sv(),G$=pv(),O$=lv(),E$=uv(),D$=gv(),C$=mv(),x$=Gr(),fe=new Q$.Command;fe.name("cnb").description("CNB OpenAPI 命令行工具").version("1.17.7","--version","显示版本号").allowUnknownOption().allowExcessArguments().helpOption("-h, --help","显示帮助文档").option("-s, --short","显示当前仓库的快捷命令").addHelpText("after",(0,H$.getExtraHelpText)());(0,O$.registerLoginCommand)(fe);(0,E$.registerLogoutCommand)(fe);(0,D$.registerStatusCommand)(fe);(0,C$.registerGitCredentialCommand)(fe);(0,B$.registerModuleCommands)(fe);(0,G$.registerFallbackAction)(fe);fe.parseAsync(process.argv);
300
+ `),console.error("[git-credential]: done")}async function $$(e){return{username:"cnb",password:await(0,V$.resolveToken)(e)}}function Z$(e){if(!e.path)return;if(e.path.endsWith(".git"))e.path=e.path.slice(0,-4);else if(e.path.endsWith(".git/info/lfs"))e.path=e.path.slice(0,-13)}function X$(e){return new Promise((t,i)=>{let r=[],s=!1,p=()=>{if(s)return;s=!0,clearTimeout(n),t(Buffer.concat(r).toString("utf-8"))},n=setTimeout(()=>{if(s)return;s=!0,console.error("[git-credential]: timeout occurred"),i(Error("stdin timeout"))},e);process.stdin.on("data",(o)=>{if(r.push(o),o.length===1&&o[0]===10)p()}),process.stdin.on("end",()=>{p()}),process.stdin.on("error",(o)=>{if(s)return;s=!0,clearTimeout(n),i(o)})})}function Y$(e,t){return e.split(/(?:\r\n|\r|\n)/).filter(Boolean).map((i)=>{let r=i.indexOf(t),s=r>=0?i.substring(0,r).trim():i.trim(),p=r>=0?i.substring(r+1).trim():"";return{key:s,value:p}}).reduce((i,{key:r,value:s})=>{if(r)i[r]=s;return i},{})}});Object.defineProperty(exports,"__esModule",{value:!0});Object.defineProperty(exports,"parseArguments",{enumerable:!0,get:function(){return x$.parseUnknownOptions}});var Q$=vr(),H$=by(),B$=sv(),G$=pv(),O$=lv(),E$=uv(),D$=gv(),C$=mv(),x$=Gr(),fe=new Q$.Command;fe.name("cnb").description("CNB OpenAPI 命令行工具").version("1.17.8","--version","显示版本号").allowUnknownOption().allowExcessArguments().helpOption("-h, --help","显示帮助文档").option("-s, --short","显示当前仓库的快捷命令").addHelpText("after",(0,H$.getExtraHelpText)());(0,O$.registerLoginCommand)(fe);(0,E$.registerLogoutCommand)(fe);(0,D$.registerStatusCommand)(fe);(0,C$.registerGitCredentialCommand)(fe);(0,B$.registerModuleCommands)(fe);(0,G$.registerFallbackAction)(fe);fe.parseAsync(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cnbcool/cnb-cli",
3
- "version": "1.17.7",
3
+ "version": "1.17.8",
4
4
  "description": "CNB OpenAPI 命令行工具,基于 CNB 平台 Swagger 自动生成,支持 Issues、PR、Git、组织管理等全部 API 操作",
5
5
  "main": "skills/cnb-api/scripts/core/index.js",
6
6
  "bin": {