@giteeteam/apps-cli 1.0.0-alpha.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var cr=Object.create;var ie=Object.defineProperty;var pr=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,ur=Object.prototype.hasOwnProperty;var fr=(e,t)=>()=>(e&&(t=e(e=0)),t);var dr=(e,t)=>{for(var r in t)ie(e,r,{get:t[r],enumerable:!0})},gr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of lr(t))!ur.call(e,n)&&n!==r&&ie(e,n,{get:()=>t[n],enumerable:!(o=pr(t,n))||o.enumerable});return e};var c=(e,t,r)=>(r=e!=null?cr(mr(e)):{},gr(t||!e||!e.__esModule?ie(r,"default",{value:e,enumerable:!0}):r,e));var qe={};dr(qe,{default:()=>Pr});function Pr({environment:e,appKey:t,distOutputPath:r="dist"}){let o=e==="production",n=e==="development",s=kr(),a=Be.default.existsSync(C.default.resolve("locales")),i=T=>T?{filename:"js/[name].[chunkhash].min.js",path:C.default.resolve(r),publicPath:"./",library:{type:"umd",name:t},clean:!0}:{filename:"main.js",path:C.default.resolve(r),publicPath:"/",library:{type:"umd",name:t}},p=({resourcePath:T},U,w)=>w===t||/\.global\.(css|less)$/.test(T)||/node_modules/.test(T)?w:`${w}__${(0,Ve.default)(`${T}${w}`,{algorithm:"md5"}).slice(0,8)}`,m={loader:"@ecomfe/class-names-loader",options:{classNamesModule:require.resolve("classnames")}},l=o?_.rspack.CssExtractRspackPlugin.loader:"style-loader",u={loader:"postcss-loader",options:{postcssOptions:{plugins:[Ke.default]}}},f={loader:"css-loader",options:{modules:{getLocalIdent:p},importLoaders:1}},y={loader:"less-loader",options:{lessOptions:{javascriptEnabled:!0,modifyVars:{"ant-prefix":t}}}};return{mode:e,entry:"./src/index.tsx",output:i(o),devtool:o?!1:"source-map",resolve:{alias:{"@":C.default.join(process.cwd(),"src/")},extensions:[".js",".ts",".jsx",".tsx",".css",".less"]},optimization:{minimize:o},plugins:[new _.rspack.DefinePlugin({"process.env":JSON.stringify(process.env),"process.env.appKey":JSON.stringify(t)}),new _.rspack.HtmlRspackPlugin({template:C.default.resolve("public/index.html"),filename:"index.html",inject:!0,appKey:t}),o&&new _.rspack.CssExtractRspackPlugin({filename:"[name].[contenthash].css",chunkFilename:"[name].[contenthash].chunk.css"}),n&&new _.rspack.HotModuleReplacementPlugin,n&&new Ge.default({overlay:!1})].filter(Boolean),module:{rules:[{oneOf:[{test:/\.(js|mjs|jsx|ts|tsx)$/,exclude:/node_modules/,loader:"builtin:swc-loader",options:{sourceMaps:br,jsc:{parser:{syntax:"typescript",tsx:!0},transform:{react:{runtime:"automatic",development:!o,refresh:!o}}},env:{targets:"chrome >= 72",mode:"usage",coreJs:"3.38"}},type:"javascript/auto"},s&&a&&{test:/locales/,loader:s,include:[C.default.resolve("locales")]},{test:/\.css$/,use:[m,l,"css-loader",u]},{test:/\.less$/,use:[m,l,f,u,y]},{test:/\.(png|jpg|gif)$/i,type:"asset",parser:{dataUrlCondition:{maxSize:2400}},generator:{filename:"[name]_[hash][ext]"}},{test:/\.svg$/i,use:["@svgr/webpack"]}]}]}}}var Be,C,_,Ge,Ke,Ve,br,kr,He=fr(()=>{"use strict";Be=c(require("fs")),C=c(require("path")),_=require("@rspack/core"),Ge=c(require("@rspack/plugin-react-refresh")),Ke=c(require("autoprefixer")),Ve=c(require("hasha")),br=process.env.GENERATE_SOURCEMAP==="true",kr=()=>{try{return require.resolve("@alienfast/i18next-loader")}catch{return null}}});var ts=require("dotenv/config"),xe=c(require("chalk")),or=require("commander");var E="1.0.0-alpha.3";var me=c(require("path"));var G=["manifest.yml","locales"],De=Buffer.from(process.env.ONE_AUTH_IV||"ABCDEFGHIJKLM_iv","utf-8"),Re=Buffer.from(process.env.ONE_AUTH_SECRET_KEY||"ABCDEFGHIJKL_key","utf-8"),je=process.env.ONE_AUTH_ALGORITHM||"aes-128-cbc";var z=c(require("chalk")),nt=c(require("fs-extra"));var Ae=c(require("fs")),ce=c(require("path")),$e=c(require("@rollup/plugin-commonjs")),Ne=require("rollup");var L=require("fs"),v=require("path"),Le=require("esbuild"),yr={treeShaking:!0,format:"esm",loader:"tsx"};var wr=({source:e,dirPath:t,mode:r})=>{let o="";if(r==="development")try{return o=require.resolve(e+"/src/index.ts",{paths:[t]}),o}catch{}try{return o=require.resolve(e,{paths:[t]}),o}catch{}return o};function ae({mode:e,...t}){return t={...yr,...t},{name:"esbuild",resolveId(r,o,n){if(!o)return r;let s=(0,v.dirname)(o),a;if((0,L.existsSync)(a=(0,v.resolve)(s,r,"index.ts")))return a;if((0,L.existsSync)(a=(0,v.resolve)(s,r,"index.tsx")))return a;if((0,L.existsSync)(a=(0,v.resolve)(s,r+".ts")))return a;if((0,L.existsSync)(a=(0,v.resolve)(s,r+".tsx")))return a;{let i=wr({source:r,dirPath:s,mode:e});if((0,L.existsSync)(i))return i;throw console.error({source:r,importer:o,options:n}),a=(0,v.relative)(".",(0,v.resolve)(o,r)),new Error(`ENOENT: ${a.replace(/\\/g,"/")}`)}},async transform(r,o){t.sourcefile=o,t.loader=o.endsWith(".json")?"json":t.loader;let{code:n,map:s}=await(0,Le.transform)(r,t);return s?{code:n,map:s}:n}}}function vr(e,t,r="development"){let o=[(0,$e.default)()];o.push(ae({mode:r,sourcemap:r==="development",minify:r!=="development",target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"}));let n={input:e,plugins:o},s={file:t,format:"es",sourcemap:r==="development"};return{inputOptions:n,outputOptions:s}}async function K(e){let{fileName:t,inputDir:r,outputDir:o,mode:n="development"}=e,s=ce.default.join(r,`${t}.ts`);try{await Ae.default.promises.access(s)}catch{console.error(`${s} is not exist`);return}let a=ce.default.join(o,`${t}.js`),{inputOptions:i,outputOptions:p}=vr(s,a,n);await(await(0,Ne.rollup)(i)).write(p)}var Ie=c(require("ora")),d=async(e,t)=>{var o,n;let r=(0,Ie.default)(e.start).start();try{let s=await t();return r.succeed(e.succeed),s}catch(s){throw r.fail(`${e.error}: ${((n=(o=s==null?void 0:s.response)==null?void 0:o.data)==null?void 0:n.message)||s.message}`),s}};var Fe=c(require("path")),Me=require("@giteeteam/apps-manifest"),Ue=c(require("fs-extra")),O=async()=>{let e=Fe.default.resolve("manifest.yml"),t=await Ue.default.readFile(e);return new Me.Manifest(t.toString())};var Je=c(require("path")),We=require("@rspack/core");var V=async()=>(await Promise.resolve().then(()=>(He(),qe))).default;var ze=e=>Object.prototype.toString.call(e)==="[object Object]",I=(e,t)=>{if(t===void 0)return e;if(Array.isArray(e)&&Array.isArray(t))return[...e,...t];if(ze(e)&&ze(t)){let r={...e};for(let[o,n]of Object.entries(t))r[o]=o in r?I(r[o],n):n;return r}return t};var Qe=async({appKey:e,rspackConfig:t})=>{let r=await V();return new Promise((o,n)=>{let s=r({environment:"production",appKey:e});if(t){let i=require(Je.default.resolve(t));s=I(s,i)}(0,We.rspack)(s).run((i,p)=>{if(i)return console.error(i),n(i);if(console.info(p==null?void 0:p.toString()),p!=null&&p.hasErrors())return n(new Error("build-ui-error"));o()})})};var Ye=c(require("path")),Xe=c(require("archiver")),pe=c(require("fs-extra")),Ze=async(e,t)=>{let r=Ye.default.resolve(t);return await pe.default.remove(r),new Promise((o,n)=>{let s=pe.default.createWriteStream(r),a=(0,Xe.default)("zip",{zlib:{level:9}});s.on("close",function(){o()}),a.on("warning",function(i){console.info(i),i.code==="ENOENT"||n(i)}),a.on("error",function(i){console.info(i),n(i)}),a.pipe(s),a.directory(e,!1),a.finalize()})};var et=async e=>{let{manifest:t,mode:r,outputDir:o,inputDir:n}=e,a=t.getFunctionFiles().map(async i=>{await K({inputDir:n,fileName:i,outputDir:o,mode:r})});await Promise.all(a)};var H=c(require("path")),rt=c(require("fs-extra"));var le=c(require("path")),tt=c(require("fs-extra")),q=async(e,t)=>{for(let r of t)try{let o=le.default.resolve(r),n=le.default.join(e,r);await tt.default.copy(o,n)}catch(o){if(o.code==="ENOENT"&&r==="locales")continue;throw o}};var ot=async({outputDir:e,manifest:t,filesToCopy:r})=>{let{resources:o}=t;if(o)for(let{key:n,path:s}of o){let a=H.default.resolve(H.default.join("./",s)),i=H.default.join(e,n);await rt.default.copy(a,i)}await q(e,r)};var st=async({outputDir:e,inputDir:t,prod:r,filesToCopy:o,zip:n,ui:s,rspackConfig:a})=>{let i=await O(),{version:p,key:m}=i.app;if(!m){console.error("manifest app key is required");return}if(!p){console.error("manifest app version is required");return}console.info(`App key: ${z.default.bold.green(m)}`),console.info(`App version: ${z.default.bold.green(p)}
3
- `);let{pass:l,errors:u}=i.validate();if(!l){if(u!=null&&u.length){let{message:f,path:y}=u[0];console.error(`Manifest valid error: Path '${y}', ${f}`)}else console.error("Manifest valid error");return}if(await nt.default.emptyDir(e),s&&await d({start:"start build ui",error:"build ui failed",succeed:"build ui success"},()=>Qe({appKey:m,rspackConfig:a})),await d({start:"start bundle",error:"bundle failed",succeed:"bundle success"},()=>et({outputDir:e,inputDir:t,manifest:i,mode:r?"production":"development"})),await d({start:"start package",error:"package failed",succeed:"package success"},()=>ot({outputDir:e,manifest:i,filesToCopy:o})),n){let f=`${m}_${p}.zip`;await d({start:"start archive",error:"archive failed",succeed:"archive success"},()=>Ze(e,f)),console.info(`
4
- The output file of the build is ${z.default.bold.green(f)}`)}};var it=async e=>{let{input:t="functions",output:r="package",prod:o,dev:n,copy:s=[],zip:a,ui:i,rspack:p}=e;await st({outputDir:me.default.resolve(r),inputDir:me.default.resolve(t),prod:o??!n,filesToCopy:[...G,...s],zip:a,ui:!!i,rspackConfig:p}).catch(()=>{})};var yt=c(require("fs")),wt=c(require("chalk"));var at=c(require("path")),ct=c(require("lowdb")),pt=c(require("lowdb/adapters/FileSync"));var ue,fe=()=>{if(!ue){let e=at.default.join(__dirname,"user.json"),t=new pt.default(e);ue=(0,ct.default)(t)}return ue},lt=()=>{let e=fe(),t=e.get("version").value();(!t||t!==E)&&e.defaults({version:E,user:{}}).write()},de=e=>{lt(),fe().set("user",e).write()},A=()=>(lt(),fe().get("user").value());var ut=c(require("fs")),ft=c(require("path")),dt=c(require("form-data"));var mt=c(require("axios"));var k={GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE"},D=async({url:e,method:t,data:r,headers:o})=>{let{domain:n,cookie:s}=A();return(await(0,mt.default)({method:t,baseURL:n,url:e,data:r,headers:{...o,cookie:s}})).data};var gt=async(e,t)=>{let r=new dt.default;r.append("environmentKey",t),r.append("package",ut.default.createReadStream(ft.default.resolve(e))),await D({method:k.POST,url:"/apps/api/v1/apps/deploy",data:r,headers:{...r.getHeaders()}})};var ht=c(require("chalk")),xr=ht.default.bold.red,g={error:e=>{console.info(xr(e))}};var vt=(o=>(o.DEVELOPMENT="development",o.STAGING="staging",o.PRODUCTION="production",o))(vt||{}),bt=async(e,t)=>{let{domain:r}=A(),{environment:o="development"}=t;if(!Object.values(vt).includes(o)){g.error("Only support development, staging, production environment.");return}if(!r){g.error("Please login in first!");return}if(!yt.default.existsSync(e)){g.error(`File:${e} is not exist`);return}console.info(`Deploying to ${wt.default.bold.green(r)}`),await d({start:"start deploy",error:"deploy failed",succeed:"deploy success"},()=>gt(e,o)).catch(()=>{})};var N=c(require("path")),F=c(require("fs-extra")),we=c(require("inquirer"));var kt=c(require("readline")),Pt=require("chalk"),xt=c(require("execa")),Er=e=>{if(!Pt.supportsColor){e.write("\r");return}kt.default.cursorTo(e,0)},Or=(e,t)=>{let r=Math.min(Math.max(e/t,0),1),o=` ${e}/${t}`,n=Math.max(0,process.stderr.columns-o.length-3),s=Math.min(t,n),a=Math.round(s*r),i="#".repeat(a),p="-".repeat(s-a);Er(process.stderr),process.stderr.write(`[${i}${p}]${o}`)},Tr=(e,t,r,o)=>new Promise((n,s)=>{var i;let a=(0,xt.default)(e,t,{cwd:r,stdio:["inherit","inherit","pipe"],env:o});(i=a.stderr)==null||i.on("data",p=>{let m=p.toString();if(/warning/.test(m))return;let l=m.match(/\[.*] (\d+)\/(\d+)/);if(l){Or(parseFloat(l[1]),parseFloat(l[2]));return}process.stderr.write(p)}),a.on("close",p=>{if(p!==0){s(new Error(`command failed: ${e} ${t.join(" ")}`));return}n()})}),Et={executeCommand:Tr};var ge=c(require("fs-extra")),he=c(require("simple-git")),Ot=async e=>{await(0,he.default)(e).init()},J=async(e,t,r)=>{await ge.default.pathExists(t)||await ge.default.mkdir(t);let o=(0,he.default)(t),n=[];r!=null&&r.branch&&n.push("--branch",r.branch),r!=null&&r.singleBranch&&n.push("--single-branch"),await o.clone(e,t,n)};var P=c(require("path")),R=c(require("fs-extra"));var W=c(require("fs-extra")),Tt=process.env.APPS_TEMPLATE_REPO||"https://github.com/moriahq/apps-template.git",ye=(r=>(r.micro="micro",r.uikit="uikit",r))(ye||{}),Q=async(e,t)=>{if(!await W.default.pathExists(e))return;let r=await W.default.readFile(e,{encoding:"utf-8"});await W.default.writeFile(e,r.replace(/{{(\w+)}}/g,(o,n)=>typeof t[n]=="string"?t[n]:o))};var Cr=async()=>{let e=[P.default.resolve(__dirname,"templates/skill"),P.default.resolve(__dirname,"../templates/skill")];for(let t of e)if(await R.default.pathExists(t))return t;return""},St=async(e,t)=>{let r=await R.default.readdir(e,{withFileTypes:!0});return(await Promise.all(r.map(async n=>{let s=P.default.join(e,n.name);return n.isDirectory()?St(s,t):n.isFile()?[P.default.relative(t,s)]:[]}))).flat()},$=async(e,t)=>{let{appName:r,appKey:o,overwrite:n=!1}=t,s=await Cr();if(!s||!await R.default.pathExists(s))throw new Error(`skill templates not found: ${s}`);let a=await St(s,s);for(let i of a){let p=P.default.join(s,i),m=i==="SKILL.md"||i.startsWith("skill/")?i:P.default.join("skill",i),l=P.default.join(e,m);!n&&await R.default.pathExists(l)||(await R.default.ensureDir(P.default.dirname(l)),await R.default.copy(p,l),l.endsWith(".md")&&await Q(l,{appName:r,appKey:o}))}};var Dr=async()=>(await we.default.createPromptModule()({type:"input",name:"App Name",message:"Please enter an app name",validate:r=>!!r}))["App Name"],Rr=async()=>(await we.default.createPromptModule()({type:"input",name:"App key",message:"Please enter a valid app key",validate:r=>/^[a-z][a-z0-9_]*$/.test(r)?!0:(console.info(""),console.info("only supports letters, numbers, underscores and starts with letters"),!1)}))["App key"],jr=()=>{if(Number(E.split(".")[0])>=1)return"v1"},Lr=async(e,t)=>{let r=jr();if(!r){await d({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>J(e,t));return}try{await d({start:`Start clone repository (branch: ${r})`,error:"Clone repository failed!",succeed:"Clone repository success!"},()=>J(e,t,{branch:r,singleBranch:!0}))}catch{console.info(`Template branch '${r}' not found, fallback to default branch.`),await d({start:"Start clone repository (default branch)",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>J(e,t))}},_r=async e=>{await d({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},()=>Et.executeCommand("pnpm",["install"],e))},Ct=async e=>{let{cwd:t}=e,r="micro",o=await Dr(),n=await Rr(),s=N.default.join(t,n);if(await F.default.pathExists(s)){console.error(`Project path already exists: ${s}`);return}await Lr(Tt,s),await F.default.copy(N.default.join(s,r),s),await Promise.all(Object.values(ye).map(i=>F.default.remove(N.default.join(s,i)))),await F.default.remove(N.default.join(s,"./.git"));let a=["./manifest.yml","./package.json","./rspack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx","./static/App.tsx","./static/index.tsx","./SKILL.md"];await Promise.all(a.map(i=>Q(N.default.join(s,i),{appName:o,appKey:n}))),await $(s,{appName:o,appKey:n}),await _r(s),await Ot(s),console.info("Project init success!"),console.info("Project path:"+s)};var Dt=async()=>{let e=process.cwd();await Ct({cwd:e})};var Y=c(require("inquirer"));var ve=c(require("axios"));var Rt=async({baseUrl:e,username:t,password:r})=>{var o;try{return{cookie:(o=(await(0,ve.default)({method:k.POST,url:`${e}/api/gateway/login`,data:{username:t,password:r}})).headers)==null?void 0:o["set-cookie"]}}catch(n){return console.error("Login error:",n==null?void 0:n.message),{cookie:""}}},jt=async e=>{try{return await(0,ve.default)({method:k.GET,url:`${e}/apps/api/v1/tenants`}),!1}catch{return!0}};var Lt=e=>{try{return new URL(e).origin}catch{return e}};var _t=c(require("crypto"));var At=e=>{try{let t=_t.default.createCipheriv(je,Re,De),r=t.update(e,"utf8","base64");return r+=t.final("base64"),r.toString()}catch(t){return console.error(`Encryption error: ${t}`),null}};var Ar=async()=>(await Y.default.createPromptModule()({type:"input",name:"Domain",message:"Please enter the domain address",validate:r=>{try{return new URL(r),!0}catch{return"Please enter a valid domain name"}}})).Domain,$r=async()=>(await Y.default.createPromptModule()({type:"input",name:"Username",message:"Please enter username",validate:r=>!!r})).Username,Nr=async()=>(await Y.default.createPromptModule()({type:"password",name:"Password",message:"Please enter password",validate:r=>!!r})).Password,$t=async({domain:e,username:t,password:r})=>{if(e||(e=await Ar()),e=Lt(e),await jt(e)){t||(t=await $r()),r||(r=await Nr());let{cookie:n}=await Rt({baseUrl:e,username:t,password:At(r)||r});n?(de({domain:e,username:t,cookie:n}),console.info("Login success!")):console.error("Login failed!")}else de({domain:e}),console.info("Login success!")};var Nt=async e=>{await $t(e)};var X=c(require("path")),Z=c(require("fs-extra"));var Ir=async e=>{var i,p,m,l;let t=X.default.join(e,"manifest.yml"),r=X.default.basename(e),o=r;if(!await Z.default.pathExists(t))return{appName:r,appKey:o};let n=await Z.default.readFile(t,"utf8"),s=((p=(i=n.match(/^\s*name:\s*(.+)\s*$/m))==null?void 0:i[1])==null?void 0:p.trim())||r,a=((l=(m=n.match(/^\s*key:\s*(.+)\s*$/m))==null?void 0:m[1])==null?void 0:l.trim())||o;return{appName:s,appKey:a}},It=async e=>{let t=X.default.resolve(e||process.cwd());if(!await Z.default.pathExists(t)){g.error(`project path not found: ${t}`);return}let{appName:r,appKey:o}=await Ir(t);await $(t,{appName:r,appKey:o,overwrite:!0}),console.info("sync-skill finished."),console.info(`Project path: ${t}`)};var oe=c(require("path"));var Qt=c(require("path")),re=c(require("chalk")),Yt=c(require("debug")),ke=c(require("fs-extra"));var Ft=async()=>{var t;return((t=(await D({method:k.GET,url:"/apps/api/v1/config"}).catch(r=>{var o,n;console.info(`getRuntimeConfig error ${((n=(o=r==null?void 0:r.response)==null?void 0:o.data)==null?void 0:n.message)||(r==null?void 0:r.message)}`)})).data)==null?void 0:t.runtime)||{}};var ee=require("child_process"),M=class{constructor(t,r){this.imageName=t,this.containerName=r}async downloadImage(){console.info(`Downloading image(${this.imageName}) ...`),await this.execPromise(`docker pull ${this.imageName}`),console.info(`Download image(${this.imageName}) success!`)}async runContainer({port:t,env:r,volume:o=[]}){await this.removeContainer();let n=Object.keys(r).filter(i=>r[i]!==void 0).map(i=>`-e ${i}=${r[i]}`).join(" "),s=o==null?void 0:o.map(i=>`-v ${i}`).join(" "),a=`docker run -d -p ${t}:${t} ${n} ${s} --name ${this.containerName} ${this.imageName}`;await this.execPromise(a)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch(()=>{})}logs(){let t=(0,ee.spawn)("docker",["logs","-f",this.containerName]);t.stdout.on("data",r=>{console.info(`${r}`)}),t.stderr.on("data",r=>{console.info(`${r}`)})}execPromise(t){return new Promise((r,o)=>{(0,ee.exec)(t,(n,s,a)=>{if(n)return o(n);r({stdout:s,stderr:a})})})}};var Mt=c(require("localtunnel"));var Ut=async({appKey:e,runtimeHost:t,resources:r,resourcePort:o})=>{r!=null&&r.length&&r.forEach(n=>{n.path=`http://127.0.0.1:${o}`}),await D({method:k.POST,url:`/apps/api/v1/apps/tunnel/${e}`,data:{resources:r,runtimeHost:t}}).catch(n=>{var s,a;console.info(`addTunnel error ${((a=(s=n==null?void 0:n.response)==null?void 0:s.data)==null?void 0:a.message)||(n==null?void 0:n.message)}`)})},Bt=async e=>{await D({method:"DELETE",url:`/apps/api/v1/apps/tunnel/${e}`}).catch(()=>{})},Gt=async e=>{var t,r;try{return(await(0,Mt.default)({port:e,host:((t=process.env)==null?void 0:t.TUNNEL_HOST)==="OFFICIAL"?void 0:((r=process.env)==null?void 0:r.TUNNEL_HOST)||"http://tunnel.gitee.work:1777"})).url}catch(o){return console.info("runTunnel error",o==null?void 0:o.message),""}};var be=c(require("path")),Kt=require("@rspack/core"),Vt=require("@rspack/dev-middleware"),qt=c(require("cors")),Ht=c(require("express"));var te=async({appKey:e,rspackConfig:t})=>{let o=(await V())({environment:"development",appKey:e});if(t){let p=require(be.default.resolve(t));o=I(o,p)}let n=(0,Kt.rspack)(o),s=(0,Ht.default)(),a=Number(process.env.UI_PORT)||8e3,i=(0,Vt.devMiddleware)(n);s.use((0,qt.default)()),s.use(i),s.get("*",(p,m)=>{var l,u;(u=n.outputFileSystem)==null||u.readFile(be.default.join(((l=o.output)==null?void 0:l.path)||"","index.html"),(f,y)=>{if(f||!y){m.sendStatus(404);return}m.send(y.toString())})}),s.listen(a,"0.0.0.0",()=>{console.info(`The React app is listening on port ${a}!
5
- `)})};var Jt=c(require("chokidar"));var zt=(e,t,r)=>{for(let o of e)K({inputDir:t,outputDir:r,fileName:o,mode:"development"})},Wt=async e=>{let{inputDir:t,outputDir:r,watchFilePaths:o}=e,s=(await O()).getFunctionFiles();zt(s,t,r);let a,i=[t,...o],p=Jt.default.watch(i);console.info(`watch: ${i.join(", ")}`),p.on("change",m=>{clearTimeout(a),a=setTimeout(()=>{console.info(`${m} has change`),zt(s,t,r)},1e3)})};var Fr=(0,Yt.default)("cli:tunnel"),Mr=async()=>{let e=await Ft(),t=process.env.RUNTIME_IMAGE||e.image||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:4.4.0-alpha-86",r=Number(process.env.CONTAINER_PORT)||8455,o=process.env.CONTAINER_NAME||"cli-dev-apps-runtime-server",n=process.env.PULL_IMAGE!=="false",s={PORT:r,APPS_DIR:"/usr/src/app/apps",LRU_TTL:1,FS_MODE:"local",DEBUG:process.env.DEBUG||"runtime*",LOG_LEVEL:process.env.LOG_LEVEL,APPS_DEFAULT_LOCALE:process.env.APPS_DEFAULT_LOCALE||"zh-CN",PARSE_PUBLIC_SERVER_URL:process.env.PARSE_PUBLIC_SERVER_URL||e.parsePublicServerUrl,PARSE_SERVER_MASTER_KEY:process.env.PARSE_SERVER_MASTER_KEY||e.parseServerMasterKey,PROXIMA_CORE_URL:process.env.PROXIMA_CORE_URL||e.proximaCoreUrl,APPS_SERVER_URL:process.env.APPS_SERVER_URL||e.appsServerUrl,APPS_PARSE_SERVER_URL:process.env.APPS_PARSE_SERVER_URL||e.appsParseServerUrl,PGSQL_CLIENT_HOST:process.env.PGSQL_CLIENT_HOST,PGSQL_CLIENT_PORT:process.env.PGSQL_CLIENT_PORT,PGSQL_CLIENT_USER:process.env.PGSQL_CLIENT_USER,PGSQL_CLIENT_PASSWORD:process.env.PGSQL_CLIENT_PASSWORD,APPS_RUNTIME_IOREDIS_OPTIONS:process.env.APPS_RUNTIME_IOREDIS_OPTIONS?`'${process.env.APPS_RUNTIME_IOREDIS_OPTIONS}'`:void 0};return{runtimeImage:t,containerPort:r,containerName:o,containerEnv:s,pullImage:n}},Xt=async e=>{var Te,Se,Ce;let{inputDir:t,outputDir:r,server:o,filesToCopy:n,resourcePort:s,ui:a,rspackConfig:i,noProxy:p,watchFilePaths:m=[]}=e;await ke.default.emptyDir(r);let l=await O(),u=l.app.key,f=l.app.version,y=l.getFunctionFiles(),T=l.resources||[];if(!u){g.error("appKey is required!");return}if(!f){g.error("version is required!");return}console.info(`App key: ${re.default.bold.green(u)}`),console.info(`App version: ${re.default.bold.green(f)}
6
- `);let{domain:U}=A();if(!U){g.error("Please login in first!");return}console.info(`Tunneling to ${re.default.bold.green(U)}`);let w=[],ne=async j=>{j instanceof Error&&console.error(j);try{await Promise.all(w.map(S=>S()))}catch(S){console.error("other error:",S)}process.exit()};process.on("SIGINT",ne),process.on("uncaughtException",ne),process.on("unhandledRejection",ne),a&&te({appKey:u,rspackConfig:i});let nr=`${`/${u}/development/${f}`}/server-side`,Ee=Qt.default.join(r,nr);await q(Ee,n),await Wt({inputDir:t,outputDir:Ee,watchFilePaths:m}),w.push(()=>ke.default.remove(r));let se="",Oe;if(o&&y.length>0){let{runtimeImage:j,containerPort:S,containerEnv:sr,containerName:ir,pullImage:ar}=await Mr();Oe=S;let B=new M(j,ir);ar&&await B.downloadImage(),await B.runContainer({port:S,env:sr,volume:[`${r}:/usr/src/app/apps`]}),w.push(()=>B.removeContainer()),p||(se=await d({start:"start tunnel",error:"tunnel failed",succeed:"tunnel success"},()=>Gt(S)),Fr("runtimeHost",se)),B.logs()}if(p){console.info(`\u4EE3\u7406\u5173\u95ED \u274C\uFF1A\u8BF7\u628A\u8BF7\u6C42\u6307\u5411localhost:${Oe}`);return}if(await Ut({appKey:u,runtimeHost:se,resources:T,resourcePort:s}),w.push(()=>Bt(u)),o&&((Ce=(Se=(Te=l.getManifest())==null?void 0:Te.modules)==null?void 0:Se.webtrigger)!=null&&Ce.length)){console.info("You can use this url for test:");let j=`${U}/apps/api/v1/:tenant/apps/${u}/environments/development/webtriggers/:webtriggerKey`;console.info(`POST ${j}`)}};var Zt=async e=>{let{copy:t=[],input:r="functions",output:o="cache",server:n=!0,resourcePort:s,ui:a,rspack:i,proxy:p,watch:m=[]}=e;await Xt({outputDir:oe.default.resolve(o),inputDir:oe.default.resolve(r),filesToCopy:[...G,...t],server:n,resourcePort:Number(s)||8e3,ui:!!a,rspackConfig:i,noProxy:!p,watchFilePaths:m.map(l=>oe.default.resolve(l))})};var Ur=async({rspackConfig:e})=>{let t=await O(),{key:r}=t.app;if(!r){g.error("manifest app key is required");return}te({appKey:r,rspackConfig:e})},er=Ur;var tr=async e=>{let{rspack:t}=e;await er({rspackConfig:t})};var x=c(require("path")),h=c(require("fs-extra"));var Br=["@ant-design/compatible","@giteeteam/apps-team-theme","webpack","webpack-cli","webpack-dev-server","webpack-merge","webpack-bundle-analyzer"],Gr={"@rspack/core":"^2.0.0","@rspack/plugin-react-refresh":"^1.4.2",deepmerge:"^4.3.1"},Kr=["webpack.config.js","webpack.config.cjs","webpack.config.mjs","webpack.config.ts"],Pe=e=>Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r))),Vr=e=>{let t=e.peerDependencies;if(!t||typeof t!="object")return!1;let r=!1;for(let o of["@ant-design/compatible","@giteeteam/apps-team-theme"])o in t&&(delete t[o],r=!0);return r&&(e.peerDependencies=Pe(t)),r},qr=e=>{let t=["dependencies","devDependencies"],r=!1;for(let o of t){let n=e[o];if(!(!n||typeof n!="object"))for(let s of Br)s in n&&(delete n[s],r=!0)}(!e.dependencies||typeof e.dependencies!="object")&&(e.dependencies={},r=!0);for(let[o,n]of Object.entries(Gr))e.dependencies[o]||(e.dependencies[o]=n,r=!0);return e.dependencies&&typeof e.dependencies=="object"&&(e.dependencies=Pe(e.dependencies)),e.devDependencies&&typeof e.devDependencies=="object"&&(e.devDependencies=Pe(e.devDependencies)),r},Hr=e=>{if(!e.scripts||typeof e.scripts!="object")return!1;let t=!1;for(let[r,o]of Object.entries(e.scripts)){let n=o;n=n.replace(/\byarn\b/g,"pnpm"),n=n.replace(/\bwebpack-dev-server\b/g,"rspack serve"),n=n.replace(/\bwebpack serve\b/g,"rspack serve"),n=n.replace(/\bwebpack\b/g,"rspack"),n=n.replace(/--webpack\b/g,"--rspack"),n=n.replace(/(^|\s)-w(\s+)/g,"$1-r$2"),n=n.replace(/webpack\.config\.(js|cjs|mjs|ts)\b/g,"rspack.config.$1"),n!==o&&(e.scripts[r]=n,t=!0)}return t},zr=async e=>{let t=x.default.join(e,"yarn.lock");return await h.default.pathExists(t)?(await h.default.remove(t),!0):!1},Jr=async e=>{let t=!1;for(let r of Kr){let o=x.default.join(e,r);if(!await h.default.pathExists(o))continue;let n=r.replace(/^webpack\.config/,"rspack.config"),s=x.default.join(e,n);await h.default.pathExists(s)||(await h.default.move(o,s),t=!0);let a=await h.default.readFile(s,"utf8"),i=a.replace(/webpack配置/g,"rspack\u914D\u7F6E").replace(/import\s+\{\s*themeConfig\s*\}\s+from\s+['"]@giteeteam\/apps-team-theme['"];?\n?/g,"").replace(/import\s+\{\s*convertLegacyToken\s*\}\s+from\s+['"]@ant-design\/compatible['"];?\n?/g,"").replace(/const\s+mapToken\s*=\s*defaultAlgorithm\(\{\s*\.\.\.defaultSeed\s*,\s*\.\.\.themeConfig\.token\s*\}\);?/g,"const mapToken = defaultAlgorithm({ ...defaultSeed });").replace(/const\s+v4Token\s*=\s*convertLegacyToken\(\{\s*\.\.\.mapToken\s*\}\);?\n?/g,"").replace(/\n([ \t]*)\.\.\.v4Token,\n/g,`
7
- `).replace(/import\s+\{\s*merge\s*\}\s+from\s+['"]webpack-merge['"];?/g,"import merge from 'deepmerge';").replace(/const\s+\{\s*merge\s*\}\s*=\s*require\((['"])webpack-merge\1\);?/g,"const merge = require('deepmerge');").replace(/(['"])webpack-merge\1/g,"$1deepmerge$1").replace(/^.*(rspack-bundle-analyzer|webpack-bundle-analyzer).*\n?/gm,"").replace(/^.*ANALYZER_PACKAGE.*\n?/gm,"").replace(/(['"])webpack\1/g,"$1@rspack/core$1");i!==a&&(await h.default.writeFile(s,i),t=!0)}return t},Wr=async e=>{var i,p,m,l;let t=x.default.join(e,"manifest.yml"),r=x.default.basename(e),o=r;if(!await h.default.pathExists(t))return{appName:r,appKey:o};let n=await h.default.readFile(t,"utf8"),s=((p=(i=n.match(/^\s*name:\s*(.+)\s*$/m))==null?void 0:i[1])==null?void 0:p.trim())||r,a=((l=(m=n.match(/^\s*key:\s*(.+)\s*$/m))==null?void 0:m[1])==null?void 0:l.trim())||o;return{appName:s,appKey:a}},rr=async e=>{let t=x.default.resolve(e||process.cwd()),r=x.default.join(t,"package.json");if(!await h.default.pathExists(r)){g.error(`package.json not found in ${t}`);return}let o=await h.default.readFile(r,"utf8"),n=JSON.parse(o),s=qr(n),a=Vr(n),i=Hr(n),p=await zr(t),m=await Jr(t),{appName:l,appKey:u}=await Wr(t),f=await h.default.pathExists(x.default.join(t,"SKILL.md"));await $(t,{appName:l,appKey:u});let y=!f;if((s||a||i)&&await h.default.writeFile(r,`${JSON.stringify(n,null,2)}
8
- `),!s&&!a&&!i&&!p&&!m&&!y){console.info("Nothing to upgrade. Project already uses rspack settings.");return}console.info("upgrade-v1 finished."),console.info(`Project path: ${t}`),console.info("Please run: pnpm install")};var Qr=`v${E}`;console.info(`GiteeTeam Apps Cli ${xe.default.bold.green(Qr)}`);console.info(`Node.js ${xe.default.bold.green(process.version)}
9
- `);var b=new or.Command;b.version(E,"-v -V --vers").description("Giteeteam Apps Cli");b.command("build").option("--prod","build in production").option("--dev","build in development").option("--no-zip","no archive").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir").option("--ui","build ui").option("-r --rspack [file]","build ui rspack config file").action(it);b.command("init").action(Dt);b.command("sync-skill [projectPath]").description("sync builtin skill files to project").action(It);b.command("upgrade-v1 [projectPath]").description("upgrade webpack project to rspack").action(rr);b.command("login").option("--domain [domain]","login domain").option("-u --username [username]","login username").option("-p --password [password]","login user password").action(Nt);b.command("tunnel").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir,default cache").option("--no-server","no server").option("--resourcePort [number]","resource port").option("--ui","build ui").option("-r --rspack [file]","build ui rspack config file").option("--no-proxy","no proxy").option("-w --watch [paths...]","watch files change").action(Zt);b.command("deploy [filename]").option("-e --environment [environment]","app environment").action(bt);b.command("ui-dev").option("-r --rspack [file]","build ui rspack config file").action(tr);b.parse(process.argv);
2
+ "use strict";var fr=Object.create;var pe=Object.defineProperty;var dr=Object.getOwnPropertyDescriptor;var gr=Object.getOwnPropertyNames;var yr=Object.getPrototypeOf,hr=Object.prototype.hasOwnProperty;var vr=(e,t)=>()=>(e&&(t=e(e=0)),t);var wr=(e,t)=>{for(var r in t)pe(e,r,{get:t[r],enumerable:!0})},br=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of gr(t))!hr.call(e,o)&&o!==r&&pe(e,o,{get:()=>t[o],enumerable:!(n=dr(t,o))||n.enumerable});return e};var c=(e,t,r)=>(r=e!=null?fr(yr(e)):{},br(t||!e||!e.__esModule?pe(r,"default",{value:e,enumerable:!0}):r,e));var We={};wr(We,{default:()=>Sr});function Sr({environment:e,appKey:t,distOutputPath:r="dist"}){let n=e==="production",o=e==="development",s=Tr(),i=Ve.default.existsSync(R.default.resolve("locales")),a=D=>D?{filename:"js/[name].[chunkhash].min.js",path:R.default.resolve(r),publicPath:"./",library:{type:"umd",name:t},clean:!0}:{filename:"main.js",path:R.default.resolve(r),publicPath:"/",library:{type:"umd",name:t}},p=({resourcePath:D},U,w)=>w===t||/\.global\.(css|less)$/.test(D)||/node_modules/.test(D)?w:`${w}__${(0,He.default)(`${D}${w}`,{algorithm:"md5"}).slice(0,8)}`,m={loader:"@ecomfe/class-names-loader",options:{classNamesModule:require.resolve("classnames")}},l=n?L.rspack.CssExtractRspackPlugin.loader:"style-loader",u={loader:"postcss-loader",options:{postcssOptions:{plugins:[ze.default]}}},g={loader:"css-loader",options:{modules:{getLocalIdent:p},importLoaders:1}},v={loader:"less-loader",options:{lessOptions:{javascriptEnabled:!0,modifyVars:{"ant-prefix":t}}}};return{mode:e,entry:"./src/index.tsx",output:a(n),devtool:n?!1:"source-map",resolve:{alias:{"@":R.default.join(process.cwd(),"src/")},extensions:[".js",".ts",".jsx",".tsx",".css",".less"]},optimization:{minimize:n},plugins:[new L.rspack.DefinePlugin({"process.env":JSON.stringify(process.env),"process.env.appKey":JSON.stringify(t)}),new L.rspack.HtmlRspackPlugin({template:R.default.resolve("public/index.html"),filename:"index.html",inject:!0,appKey:t}),n&&new L.rspack.CssExtractRspackPlugin({filename:"[name].[contenthash].css",chunkFilename:"[name].[contenthash].chunk.css"}),o&&new L.rspack.HotModuleReplacementPlugin,o&&new qe.default({overlay:!1})].filter(Boolean),module:{rules:[{oneOf:[{test:/\.(js|mjs|jsx|ts|tsx)$/,exclude:/node_modules/,loader:"builtin:swc-loader",options:{sourceMaps:Or,jsc:{parser:{syntax:"typescript",tsx:!0},transform:{react:{runtime:"automatic",development:!n,refresh:!n}}},env:{targets:"chrome >= 72",mode:"usage",coreJs:"3.38"}},type:"javascript/auto"},s&&i&&{test:/locales/,loader:s,include:[R.default.resolve("locales")]},{test:/\.css$/,use:[m,l,"css-loader",u]},{test:/\.less$/,use:[m,l,g,u,v]},{test:/\.(png|jpg|gif)$/i,type:"asset",parser:{dataUrlCondition:{maxSize:2400}},generator:{filename:"[name]_[hash][ext]"}},{test:/\.svg$/i,use:["@svgr/webpack"]}]}]}}}var Ve,R,L,qe,ze,He,Or,Tr,Je=vr(()=>{"use strict";Ve=c(require("fs")),R=c(require("path")),L=require("@rspack/core"),qe=c(require("@rspack/plugin-react-refresh")),ze=c(require("autoprefixer")),He=c(require("hasha")),Or=process.env.GENERATE_SOURCEMAP==="true",Tr=()=>{try{return require.resolve("@alienfast/i18next-loader")}catch{return null}}});var ys=require("dotenv/config"),Te=c(require("chalk")),cr=require("commander");var E="1.0.0";var de=c(require("path"));var B=["manifest.yml","locales"],je=Buffer.from(process.env.ONE_AUTH_IV||"ABCDEFGHIJKLM_iv","utf-8"),_e=Buffer.from(process.env.ONE_AUTH_SECRET_KEY||"ABCDEFGHIJKL_key","utf-8"),Le=process.env.ONE_AUTH_ALGORITHM||"aes-128-cbc";var H=c(require("chalk")),at=c(require("fs-extra"));var Ie=c(require("fs")),me=c(require("path")),Me=c(require("@rollup/plugin-commonjs")),Fe=require("rollup");var _=require("fs"),b=require("path"),$e=require("esbuild"),Pr={treeShaking:!0,format:"esm",loader:"tsx"};var xr=({source:e,dirPath:t,mode:r})=>{let n="";if(r==="development")try{return n=require.resolve(e+"/src/index.ts",{paths:[t]}),n}catch{}try{return n=require.resolve(e,{paths:[t]}),n}catch{}return n};function le({mode:e,...t}){return t={...Pr,...t},{name:"esbuild",resolveId(r,n,o){if(!n)return r;let s=(0,b.dirname)(n),i;if((0,_.existsSync)(i=(0,b.resolve)(s,r,"index.ts")))return i;if((0,_.existsSync)(i=(0,b.resolve)(s,r,"index.tsx")))return i;if((0,_.existsSync)(i=(0,b.resolve)(s,r+".ts")))return i;if((0,_.existsSync)(i=(0,b.resolve)(s,r+".tsx")))return i;{let a=xr({source:r,dirPath:s,mode:e});if((0,_.existsSync)(a))return a;throw console.error({source:r,importer:n,options:o}),i=(0,b.relative)(".",(0,b.resolve)(n,r)),new Error(`ENOENT: ${i.replace(/\\/g,"/")}`)}},async transform(r,n){t.sourcefile=n,t.loader=n.endsWith(".json")?"json":t.loader;let{code:o,map:s}=await(0,$e.transform)(r,t);return s?{code:o,map:s}:o}}}function Er(e,t,r="development"){let n=[(0,Me.default)()];n.push(le({mode:r,sourcemap:r==="development",minify:r!=="development",target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"}));let o={input:e,plugins:n},s={file:t,format:"es",sourcemap:r==="development"};return{inputOptions:o,outputOptions:s}}async function G(e){let{fileName:t,inputDir:r,outputDir:n,mode:o="development"}=e,s=me.default.join(r,`${t}.ts`);try{await Ie.default.promises.access(s)}catch{console.error(`${s} is not exist`);return}let i=me.default.join(n,`${t}.js`),{inputOptions:a,outputOptions:p}=Er(s,i,o);await(await(0,Fe.rollup)(a)).write(p)}var Ue=c(require("ora")),d=async(e,t)=>{var n,o;let r=(0,Ue.default)(e.start).start();try{let s=await t();return r.succeed(e.succeed),s}catch(s){throw r.fail(`${e.error}: ${((o=(n=s==null?void 0:s.response)==null?void 0:n.data)==null?void 0:o.message)||s.message}`),s}};var Ke=c(require("path")),Be=require("@giteeteam/apps-manifest"),Ge=c(require("fs-extra")),O=async()=>{let e=Ke.default.resolve("manifest.yml"),t=await Ge.default.readFile(e);return new Be.Manifest(t.toString())};var Ye=c(require("path")),Xe=require("@rspack/core");var V=async()=>(await Promise.resolve().then(()=>(Je(),We))).default;var Qe=e=>Object.prototype.toString.call(e)==="[object Object]",I=(e,t)=>{if(t===void 0)return e;if(Array.isArray(e)&&Array.isArray(t))return[...e,...t];if(Qe(e)&&Qe(t)){let r={...e};for(let[n,o]of Object.entries(t))r[n]=n in r?I(r[n],o):o;return r}return t};var Ze=async({appKey:e,rspackConfig:t})=>{let r=await V();return new Promise((n,o)=>{let s=r({environment:"production",appKey:e});if(t){let a=require(Ye.default.resolve(t));s=I(s,a)}(0,Xe.rspack)(s).run((a,p)=>{if(a)return console.error(a),o(a);if(console.info(p==null?void 0:p.toString()),p!=null&&p.hasErrors())return o(new Error("build-ui-error"));n()})})};var et=c(require("path")),tt=c(require("archiver")),ue=c(require("fs-extra")),rt=async(e,t)=>{let r=et.default.resolve(t);return await ue.default.remove(r),new Promise((n,o)=>{let s=ue.default.createWriteStream(r),i=(0,tt.default)("zip",{zlib:{level:9}});s.on("close",function(){n()}),i.on("warning",function(a){console.info(a),a.code==="ENOENT"||o(a)}),i.on("error",function(a){console.info(a),o(a)}),i.pipe(s),i.directory(e,!1),i.finalize()})};var nt=async e=>{let{manifest:t,mode:r,outputDir:n,inputDir:o}=e,i=t.getFunctionFiles().map(async a=>{await G({inputDir:o,fileName:a,outputDir:n,mode:r})});await Promise.all(i)};var z=c(require("path")),st=c(require("fs-extra"));var fe=c(require("path")),ot=c(require("fs-extra")),q=async(e,t)=>{for(let r of t)try{let n=fe.default.resolve(r),o=fe.default.join(e,r);await ot.default.copy(n,o)}catch(n){if(n.code==="ENOENT"&&r==="locales")continue;throw n}};var it=async({outputDir:e,manifest:t,filesToCopy:r})=>{let{resources:n}=t;if(n)for(let{key:o,path:s}of n){let i=z.default.resolve(z.default.join("./",s)),a=z.default.join(e,o);await st.default.copy(i,a)}await q(e,r)};var ct=async({outputDir:e,inputDir:t,prod:r,filesToCopy:n,zip:o,ui:s,rspackConfig:i})=>{let a=await O(),{version:p,key:m}=a.app;if(!m){console.error("manifest app key is required");return}if(!p){console.error("manifest app version is required");return}console.info(`App key: ${H.default.bold.green(m)}`),console.info(`App version: ${H.default.bold.green(p)}
3
+ `);let{pass:l,errors:u}=a.validate();if(!l){if(u!=null&&u.length){let{message:g,path:v}=u[0];console.error(`Manifest valid error: Path '${v}', ${g}`)}else console.error("Manifest valid error");return}if(await at.default.emptyDir(e),s&&await d({start:"start build ui",error:"build ui failed",succeed:"build ui success"},()=>Ze({appKey:m,rspackConfig:i})),await d({start:"start bundle",error:"bundle failed",succeed:"bundle success"},()=>nt({outputDir:e,inputDir:t,manifest:a,mode:r?"production":"development"})),await d({start:"start package",error:"package failed",succeed:"package success"},()=>it({outputDir:e,manifest:a,filesToCopy:n})),o){let g=`${m}_${p}.zip`;await d({start:"start archive",error:"archive failed",succeed:"archive success"},()=>rt(e,g)),console.info(`
4
+ The output file of the build is ${H.default.bold.green(g)}`)}};var pt=async e=>{let{input:t="functions",output:r="package",prod:n,dev:o,copy:s=[],zip:i,ui:a,rspack:p}=e;await ct({outputDir:de.default.resolve(r),inputDir:de.default.resolve(t),prod:n??!o,filesToCopy:[...B,...s],zip:i,ui:!!a,rspackConfig:p}).catch(()=>{})};var bt=c(require("fs")),kt=c(require("path")),J=c(require("chalk"));var lt=c(require("path")),mt=c(require("lowdb")),ut=c(require("lowdb/adapters/FileSync"));var ge,ye=()=>{if(!ge){let e=lt.default.join(__dirname,"user.json"),t=new ut.default(e);ge=(0,mt.default)(t)}return ge},ft=()=>{let e=ye(),t=e.get("version").value();(!t||t!==E)&&e.defaults({version:E,user:{}}).write()},he=e=>{ft(),ye().set("user",e).write()},T=()=>(ft(),ye().get("user").value());var gt=c(require("fs")),yt=c(require("path")),ht=c(require("form-data"));var dt=c(require("axios"));var k={GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE"},S=async({url:e,method:t,data:r,headers:n})=>{let{domain:o,cookie:s}=T();return(await(0,dt.default)({method:t,baseURL:o,url:e,data:r,headers:{...n,cookie:s}})).data};var vt=async(e,t)=>{let r=new ht.default;return r.append("environmentKey",t),r.append("package",gt.default.createReadStream(yt.default.resolve(e))),S({method:k.POST,url:"/apps/api/v1/apps/deploy",data:r,headers:{...r.getHeaders()}})},W=async({tenants:e,environmentKey:t,appKey:r,versionKey:n})=>S({method:k.POST,url:"/apps/api/v1/apps/install/batch",data:{tenants:e,environmentKey:t,appKey:r,versionKey:n,subscriptionSource:"manual"}});var wt=c(require("chalk")),Dr=wt.default.bold.red,f={error:e=>{console.info(Dr(e))}};var Q=(n=>(n.DEVELOPMENT="development",n.STAGING="staging",n.PRODUCTION="production",n))(Q||{}),Cr=e=>e?(Array.isArray(e)?e:[e]).flatMap(r=>r.split(",")).map(r=>r.trim()).filter(Boolean):[],Rr=e=>{let t=kt.default.basename(e,".zip"),r=t.lastIndexOf("_");return r<=0||r===t.length-1?null:{appKey:t.slice(0,r),versionKey:t.slice(r+1)}},Pt=async(e,t)=>{let{domain:r}=T(),{environment:n="development",subscribe:o,appKey:s,versionKey:i}=t,a=Cr(o);if(!Object.values(Q).includes(n)){f.error("Only support development, staging, production environment.");return}if(!r){f.error("Please login in first!");return}if(!bt.default.existsSync(e)){f.error(`File:${e} is not exist`);return}if(console.info(`Deploying to ${J.default.bold.green(r)}`),await d({start:"start deploy",error:"deploy failed",succeed:"deploy success"},()=>vt(e,n)).catch(()=>{}),a.length===0)return;let p=Rr(e),m=s||(p==null?void 0:p.appKey),l=i||(p==null?void 0:p.versionKey);if(!m||!l){f.error("subscribe needs appKey and versionKey. please pass --app-key and --version-key, or use zip name <appKey>_<versionKey>.zip");return}console.info(`Subscribing app ${J.default.bold.green(m)}:${J.default.bold.green(l)}`),await d({start:"start subscribe",error:"subscribe failed",succeed:"subscribe success"},()=>W({tenants:a,environmentKey:n,appKey:m,versionKey:l})).catch(()=>{})};var N=c(require("path")),M=c(require("fs-extra")),ke=c(require("inquirer"));var xt=c(require("readline")),Et=require("chalk"),Ot=c(require("execa")),Ar=e=>{if(!Et.supportsColor){e.write("\r");return}xt.default.cursorTo(e,0)},jr=(e,t)=>{let r=Math.min(Math.max(e/t,0),1),n=` ${e}/${t}`,o=Math.max(0,process.stderr.columns-n.length-3),s=Math.min(t,o),i=Math.round(s*r),a="#".repeat(i),p="-".repeat(s-i);Ar(process.stderr),process.stderr.write(`[${a}${p}]${n}`)},_r=(e,t,r,n)=>new Promise((o,s)=>{var a;let i=(0,Ot.default)(e,t,{cwd:r,stdio:["inherit","inherit","pipe"],env:n});(a=i.stderr)==null||a.on("data",p=>{let m=p.toString();if(/warning/.test(m))return;let l=m.match(/\[.*] (\d+)\/(\d+)/);if(l){jr(parseFloat(l[1]),parseFloat(l[2]));return}process.stderr.write(p)}),i.on("close",p=>{if(p!==0){s(new Error(`command failed: ${e} ${t.join(" ")}`));return}o()})}),Tt={executeCommand:_r};var ve=c(require("fs-extra")),we=c(require("simple-git")),St=async e=>{await(0,we.default)(e).init()},Y=async(e,t,r)=>{await ve.default.pathExists(t)||await ve.default.mkdir(t);let n=(0,we.default)(t),o=[];r!=null&&r.branch&&o.push("--branch",r.branch),r!=null&&r.singleBranch&&o.push("--single-branch"),await n.clone(e,t,o)};var P=c(require("path")),A=c(require("fs-extra"));var X=c(require("fs-extra")),Dt=process.env.APPS_TEMPLATE_REPO||"https://github.com/moriahq/apps-template.git",be=(r=>(r.micro="micro",r.uikit="uikit",r))(be||{}),Z=async(e,t)=>{if(!await X.default.pathExists(e))return;let r=await X.default.readFile(e,{encoding:"utf-8"});await X.default.writeFile(e,r.replace(/{{(\w+)}}/g,(n,o)=>typeof t[o]=="string"?t[o]:n))};var $r=async()=>{let e=[P.default.resolve(__dirname,"templates/skill"),P.default.resolve(__dirname,"../templates/skill")];for(let t of e)if(await A.default.pathExists(t))return t;return""},Ct=async(e,t)=>{let r=await A.default.readdir(e,{withFileTypes:!0});return(await Promise.all(r.map(async o=>{let s=P.default.join(e,o.name);return o.isDirectory()?Ct(s,t):o.isFile()?[P.default.relative(t,s)]:[]}))).flat()},$=async(e,t)=>{let{appName:r,appKey:n,overwrite:o=!1}=t,s=await $r();if(!s||!await A.default.pathExists(s))throw new Error(`skill templates not found: ${s}`);let i=await Ct(s,s);for(let a of i){let p=P.default.join(s,a),m=a==="SKILL.md"||a.startsWith("skill/")?a:P.default.join("skill",a),l=P.default.join(e,m);!o&&await A.default.pathExists(l)||(await A.default.ensureDir(P.default.dirname(l)),await A.default.copy(p,l),l.endsWith(".md")&&await Z(l,{appName:r,appKey:n}))}};var Nr=async()=>(await ke.default.createPromptModule()({type:"input",name:"App Name",message:"Please enter an app name",validate:r=>!!r}))["App Name"],Ir=async()=>(await ke.default.createPromptModule()({type:"input",name:"App key",message:"Please enter a valid app key",validate:r=>/^[a-z][a-z0-9_]*$/.test(r)?!0:(console.info(""),console.info("only supports letters, numbers, underscores and starts with letters"),!1)}))["App key"],Mr=()=>{if(Number(E.split(".")[0])>=1)return"v1"},Fr=async(e,t)=>{let r=Mr();if(!r){await d({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t));return}try{await d({start:`Start clone repository (branch: ${r})`,error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t,{branch:r,singleBranch:!0}))}catch{console.info(`Template branch '${r}' not found, fallback to default branch.`),await d({start:"Start clone repository (default branch)",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Y(e,t))}},Ur=async e=>{await d({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},()=>Tt.executeCommand("pnpm",["install"],e))},Rt=async e=>{let{cwd:t}=e,r="micro",n=await Nr(),o=await Ir(),s=N.default.join(t,o);if(await M.default.pathExists(s)){console.error(`Project path already exists: ${s}`);return}await Fr(Dt,s),await M.default.copy(N.default.join(s,r),s),await Promise.all(Object.values(be).map(a=>M.default.remove(N.default.join(s,a)))),await M.default.remove(N.default.join(s,"./.git"));let i=["./manifest.yml","./package.json","./rspack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx","./static/App.tsx","./static/index.tsx","./SKILL.md"];await Promise.all(i.map(a=>Z(N.default.join(s,a),{appName:n,appKey:o}))),await $(s,{appName:n,appKey:o}),await Ur(s),await St(s),console.info("Project init success!"),console.info("Project path:"+s)};var At=async()=>{let e=process.cwd();await Rt({cwd:e})};var ee=c(require("inquirer"));var Pe=c(require("axios"));var jt=["/api/gateway/login","/login"],Kr=e=>{var n;let t=(n=e==null?void 0:e.response)==null?void 0:n.status,r=e==null?void 0:e.code;return[404,405,502,503,504].includes(t)||["ECONNREFUSED","ENOTFOUND","ECONNABORTED"].includes(r)},_t=async({baseUrl:e,username:t,password:r})=>{var o;let n;for(let s of jt)try{let i=await(0,Pe.default)({method:k.POST,url:`${e}${s}`,data:{username:t,password:r}});return console.info(`Login endpoint: ${s}`),{cookie:(o=i.headers)==null?void 0:o["set-cookie"]}}catch(i){if(n=i,!Kr(i))return console.error(`Login error (${s}):`,i==null?void 0:i.message),{cookie:""}}return console.error(`Login error: all endpoints failed (${jt.join(", ")})`,(n==null?void 0:n.message)||""),{cookie:""}},Lt=async e=>{try{return await(0,Pe.default)({method:k.GET,url:`${e}/apps/api/v1/tenants`}),!1}catch{return!0}};var $t=e=>{try{return new URL(e).origin}catch{return e}};var Nt=c(require("crypto"));var It=e=>{try{let t=Nt.default.createCipheriv(Le,_e,je),r=t.update(e,"utf8","base64");return r+=t.final("base64"),r.toString()}catch(t){return console.error(`Encryption error: ${t}`),null}};var Br=async()=>(await ee.default.createPromptModule()({type:"input",name:"Domain",message:"Please enter the domain address",validate:r=>{try{return new URL(r),!0}catch{return"Please enter a valid domain name"}}})).Domain,Gr=async()=>(await ee.default.createPromptModule()({type:"input",name:"Username",message:"Please enter username",validate:r=>!!r})).Username,Vr=async()=>(await ee.default.createPromptModule()({type:"password",name:"Password",message:"Please enter password",validate:r=>!!r})).Password,Mt=async({domain:e,username:t,password:r})=>{if(e||(e=await Br()),e=$t(e),await Lt(e)){t||(t=await Gr()),r||(r=await Vr());let{cookie:o}=await _t({baseUrl:e,username:t,password:It(r)||r});o?(he({domain:e,username:t,cookie:o}),console.info("Login success!")):console.error("Login failed!")}else he({domain:e}),console.info("Login success!")};var Ft=async e=>{await Mt(e)};var Ut=c(require("chalk"));var qr=e=>e?(Array.isArray(e)?e:[e]).flatMap(r=>r.split(",")).map(r=>r.trim()).filter(Boolean):[],Kt=async(e,t,r)=>{let{domain:n}=T(),{environment:o="development",tenants:s}=r,i=qr(s);if(!n){f.error("Please login in first!");return}if(!Object.values(Q).includes(o)){f.error("Only support development, staging, production environment.");return}if(!e||!t){f.error("Please provide appKey and versionKey.");return}if(i.length===0){f.error("Please provide subscribe tenants by -t/--tenants.");return}console.info(`Subscribing to ${Ut.default.bold.green(n)}`),await d({start:"start subscribe",error:"subscribe failed",succeed:"subscribe success"},()=>W({tenants:i,environmentKey:o,appKey:e,versionKey:t})).catch(()=>{})};var te=c(require("path")),re=c(require("fs-extra"));var zr=async e=>{var a,p,m,l;let t=te.default.join(e,"manifest.yml"),r=te.default.basename(e),n=r;if(!await re.default.pathExists(t))return{appName:r,appKey:n};let o=await re.default.readFile(t,"utf8"),s=((p=(a=o.match(/^\s*name:\s*(.+)\s*$/m))==null?void 0:a[1])==null?void 0:p.trim())||r,i=((l=(m=o.match(/^\s*key:\s*(.+)\s*$/m))==null?void 0:m[1])==null?void 0:l.trim())||n;return{appName:s,appKey:i}},Bt=async e=>{let t=te.default.resolve(e||process.cwd());if(!await re.default.pathExists(t)){f.error(`project path not found: ${t}`);return}let{appName:r,appKey:n}=await zr(t);await $(t,{appName:r,appKey:n,overwrite:!0}),console.info("sync-skill finished."),console.info(`Project path: ${t}`)};var ie=c(require("path"));var tr=c(require("path")),se=c(require("chalk")),rr=c(require("debug")),Ee=c(require("fs-extra"));var Gt=async()=>{var t;return((t=(await S({method:k.GET,url:"/apps/api/v1/config"}).catch(r=>{var n,o;console.info(`getRuntimeConfig error ${((o=(n=r==null?void 0:r.response)==null?void 0:n.data)==null?void 0:o.message)||(r==null?void 0:r.message)}`)})).data)==null?void 0:t.runtime)||{}};var ne=require("child_process"),F=class{constructor(t,r){this.imageName=t,this.containerName=r}async downloadImage(){console.info(`Downloading image(${this.imageName}) ...`),await this.execPromise(`docker pull ${this.imageName}`),console.info(`Download image(${this.imageName}) success!`)}async runContainer({port:t,env:r,volume:n=[]}){await this.removeContainer();let o=Object.keys(r).filter(a=>r[a]!==void 0).map(a=>`-e ${a}=${r[a]}`).join(" "),s=n==null?void 0:n.map(a=>`-v ${a}`).join(" "),i=`docker run -d -p ${t}:${t} ${o} ${s} --name ${this.containerName} ${this.imageName}`;await this.execPromise(i)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch(()=>{})}logs(){let t=(0,ne.spawn)("docker",["logs","-f",this.containerName]);t.stdout.on("data",r=>{console.info(`${r}`)}),t.stderr.on("data",r=>{console.info(`${r}`)})}execPromise(t){return new Promise((r,n)=>{(0,ne.exec)(t,(o,s,i)=>{if(o)return n(o);r({stdout:s,stderr:i})})})}};var Vt=c(require("localtunnel"));var qt=async({appKey:e,runtimeHost:t,resources:r,resourcePort:n})=>{r!=null&&r.length&&r.forEach(o=>{o.path=`http://127.0.0.1:${n}`}),await S({method:k.POST,url:`/apps/api/v1/apps/tunnel/${e}`,data:{resources:r,runtimeHost:t}}).catch(o=>{var s,i;console.info(`addTunnel error ${((i=(s=o==null?void 0:o.response)==null?void 0:s.data)==null?void 0:i.message)||(o==null?void 0:o.message)}`)})},zt=async e=>{await S({method:"DELETE",url:`/apps/api/v1/apps/tunnel/${e}`}).catch(()=>{})},Ht=async e=>{var t,r;try{return(await(0,Vt.default)({port:e,host:((t=process.env)==null?void 0:t.TUNNEL_HOST)==="OFFICIAL"?void 0:((r=process.env)==null?void 0:r.TUNNEL_HOST)||"http://tunnel.gitee.work:1777"})).url}catch(n){return console.info("runTunnel error",n==null?void 0:n.message),""}};var xe=c(require("path")),Wt=require("@rspack/core"),Jt=require("@rspack/dev-middleware"),Qt=c(require("cors")),Yt=c(require("express"));var oe=async({appKey:e,rspackConfig:t})=>{let n=(await V())({environment:"development",appKey:e});if(t){let p=require(xe.default.resolve(t));n=I(n,p)}let o=(0,Wt.rspack)(n),s=(0,Yt.default)(),i=Number(process.env.UI_PORT)||8e3,a=(0,Jt.devMiddleware)(o);s.use((0,Qt.default)()),s.use(a),s.get("*",(p,m)=>{var l,u;(u=o.outputFileSystem)==null||u.readFile(xe.default.join(((l=n.output)==null?void 0:l.path)||"","index.html"),(g,v)=>{if(g||!v){m.sendStatus(404);return}m.send(v.toString())})}),s.listen(i,"0.0.0.0",()=>{console.info(`The React app is listening on port ${i}!
5
+ `)})};var Zt=c(require("chokidar"));var Xt=(e,t,r)=>{for(let n of e)G({inputDir:t,outputDir:r,fileName:n,mode:"development"})},er=async e=>{let{inputDir:t,outputDir:r,watchFilePaths:n}=e,s=(await O()).getFunctionFiles();Xt(s,t,r);let i,a=[t,...n],p=Zt.default.watch(a);console.info(`watch: ${a.join(", ")}`),p.on("change",m=>{clearTimeout(i),i=setTimeout(()=>{console.info(`${m} has change`),Xt(s,t,r)},1e3)})};var Hr=(0,rr.default)("cli:tunnel"),Wr=async()=>{let e=await Gt(),t=process.env.RUNTIME_IMAGE||e.image||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:4.4.0-alpha-86",r=Number(process.env.CONTAINER_PORT)||8455,n=process.env.CONTAINER_NAME||"cli-dev-apps-runtime-server",o=process.env.PULL_IMAGE!=="false",s={PORT:r,APPS_DIR:"/usr/src/app/apps",LRU_TTL:1,FS_MODE:"local",DEBUG:process.env.DEBUG||"runtime*",LOG_LEVEL:process.env.LOG_LEVEL,APPS_DEFAULT_LOCALE:process.env.APPS_DEFAULT_LOCALE||"zh-CN",PARSE_PUBLIC_SERVER_URL:process.env.PARSE_PUBLIC_SERVER_URL||e.parsePublicServerUrl,PARSE_SERVER_MASTER_KEY:process.env.PARSE_SERVER_MASTER_KEY||e.parseServerMasterKey,PROXIMA_CORE_URL:process.env.PROXIMA_CORE_URL||e.proximaCoreUrl,APPS_SERVER_URL:process.env.APPS_SERVER_URL||e.appsServerUrl,APPS_PARSE_SERVER_URL:process.env.APPS_PARSE_SERVER_URL||e.appsParseServerUrl,PGSQL_CLIENT_HOST:process.env.PGSQL_CLIENT_HOST,PGSQL_CLIENT_PORT:process.env.PGSQL_CLIENT_PORT,PGSQL_CLIENT_USER:process.env.PGSQL_CLIENT_USER,PGSQL_CLIENT_PASSWORD:process.env.PGSQL_CLIENT_PASSWORD,APPS_RUNTIME_IOREDIS_OPTIONS:process.env.APPS_RUNTIME_IOREDIS_OPTIONS?`'${process.env.APPS_RUNTIME_IOREDIS_OPTIONS}'`:void 0};return{runtimeImage:t,containerPort:r,containerName:n,containerEnv:s,pullImage:o}},nr=async e=>{var Ce,Re,Ae;let{inputDir:t,outputDir:r,server:n,filesToCopy:o,resourcePort:s,ui:i,rspackConfig:a,noProxy:p,watchFilePaths:m=[]}=e;await Ee.default.emptyDir(r);let l=await O(),u=l.app.key,g=l.app.version,v=l.getFunctionFiles(),D=l.resources||[];if(!u){f.error("appKey is required!");return}if(!g){f.error("version is required!");return}console.info(`App key: ${se.default.bold.green(u)}`),console.info(`App version: ${se.default.bold.green(g)}
6
+ `);let{domain:U}=T();if(!U){f.error("Please login in first!");return}console.info(`Tunneling to ${se.default.bold.green(U)}`);let w=[],ae=async j=>{j instanceof Error&&console.error(j);try{await Promise.all(w.map(C=>C()))}catch(C){console.error("other error:",C)}process.exit()};process.on("SIGINT",ae),process.on("uncaughtException",ae),process.on("unhandledRejection",ae),i&&oe({appKey:u,rspackConfig:a});let pr=`${`/${u}/development/${g}`}/server-side`,Se=tr.default.join(r,pr);await q(Se,o),await er({inputDir:t,outputDir:Se,watchFilePaths:m}),w.push(()=>Ee.default.remove(r));let ce="",De;if(n&&v.length>0){let{runtimeImage:j,containerPort:C,containerEnv:lr,containerName:mr,pullImage:ur}=await Wr();De=C;let K=new F(j,mr);ur&&await K.downloadImage(),await K.runContainer({port:C,env:lr,volume:[`${r}:/usr/src/app/apps`]}),w.push(()=>K.removeContainer()),p||(ce=await d({start:"start tunnel",error:"tunnel failed",succeed:"tunnel success"},()=>Ht(C)),Hr("runtimeHost",ce)),K.logs()}if(p){console.info(`\u4EE3\u7406\u5173\u95ED \u274C\uFF1A\u8BF7\u628A\u8BF7\u6C42\u6307\u5411localhost:${De}`);return}if(await qt({appKey:u,runtimeHost:ce,resources:D,resourcePort:s}),w.push(()=>zt(u)),n&&((Ae=(Re=(Ce=l.getManifest())==null?void 0:Ce.modules)==null?void 0:Re.webtrigger)!=null&&Ae.length)){console.info("You can use this url for test:");let j=`${U}/apps/api/v1/:tenant/apps/${u}/environments/development/webtriggers/:webtriggerKey`;console.info(`POST ${j}`)}};var or=async e=>{let{copy:t=[],input:r="functions",output:n="cache",server:o=!0,resourcePort:s,ui:i,rspack:a,proxy:p,watch:m=[]}=e;await nr({outputDir:ie.default.resolve(n),inputDir:ie.default.resolve(r),filesToCopy:[...B,...t],server:o,resourcePort:Number(s)||8e3,ui:!!i,rspackConfig:a,noProxy:!p,watchFilePaths:m.map(l=>ie.default.resolve(l))})};var Jr=async({rspackConfig:e})=>{let t=await O(),{key:r}=t.app;if(!r){f.error("manifest app key is required");return}oe({appKey:r,rspackConfig:e})},sr=Jr;var ir=async e=>{let{rspack:t}=e;await sr({rspackConfig:t})};var x=c(require("path")),y=c(require("fs-extra"));var Qr=["@ant-design/compatible","@giteeteam/apps-team-theme","webpack","webpack-cli","webpack-dev-server","webpack-merge","webpack-bundle-analyzer"],Yr={"@rspack/core":"^2.0.0","@rspack/plugin-react-refresh":"^1.4.2",deepmerge:"^4.3.1"},Xr=["webpack.config.js","webpack.config.cjs","webpack.config.mjs","webpack.config.ts"],Oe=e=>Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r))),Zr=e=>{let t=e.peerDependencies;if(!t||typeof t!="object")return!1;let r=!1;for(let n of["@ant-design/compatible","@giteeteam/apps-team-theme"])n in t&&(delete t[n],r=!0);return r&&(e.peerDependencies=Oe(t)),r},en=e=>{let t=["dependencies","devDependencies"],r=!1;for(let n of t){let o=e[n];if(!(!o||typeof o!="object"))for(let s of Qr)s in o&&(delete o[s],r=!0)}(!e.dependencies||typeof e.dependencies!="object")&&(e.dependencies={},r=!0);for(let[n,o]of Object.entries(Yr))e.dependencies[n]||(e.dependencies[n]=o,r=!0);return e.dependencies&&typeof e.dependencies=="object"&&(e.dependencies=Oe(e.dependencies)),e.devDependencies&&typeof e.devDependencies=="object"&&(e.devDependencies=Oe(e.devDependencies)),r},tn=e=>{if(!e.scripts||typeof e.scripts!="object")return!1;let t=!1;for(let[r,n]of Object.entries(e.scripts)){let o=n;o=o.replace(/\byarn\b/g,"pnpm"),o=o.replace(/\bwebpack-dev-server\b/g,"rspack serve"),o=o.replace(/\bwebpack serve\b/g,"rspack serve"),o=o.replace(/\bwebpack\b/g,"rspack"),o=o.replace(/--webpack\b/g,"--rspack"),o=o.replace(/(^|\s)-w(\s+)/g,"$1-r$2"),o=o.replace(/webpack\.config\.(js|cjs|mjs|ts)\b/g,"rspack.config.$1"),o!==n&&(e.scripts[r]=o,t=!0)}return t},rn=async e=>{let t=x.default.join(e,"yarn.lock");return await y.default.pathExists(t)?(await y.default.remove(t),!0):!1},nn=async e=>{let t=!1;for(let r of Xr){let n=x.default.join(e,r);if(!await y.default.pathExists(n))continue;let o=r.replace(/^webpack\.config/,"rspack.config"),s=x.default.join(e,o);await y.default.pathExists(s)||(await y.default.move(n,s),t=!0);let i=await y.default.readFile(s,"utf8"),a=i.replace(/webpack配置/g,"rspack\u914D\u7F6E").replace(/import\s+\{\s*themeConfig\s*\}\s+from\s+['"]@giteeteam\/apps-team-theme['"];?\n?/g,"").replace(/import\s+\{\s*convertLegacyToken\s*\}\s+from\s+['"]@ant-design\/compatible['"];?\n?/g,"").replace(/const\s+mapToken\s*=\s*defaultAlgorithm\(\{\s*\.\.\.defaultSeed\s*,\s*\.\.\.themeConfig\.token\s*\}\);?/g,"const mapToken = defaultAlgorithm({ ...defaultSeed });").replace(/const\s+v4Token\s*=\s*convertLegacyToken\(\{\s*\.\.\.mapToken\s*\}\);?\n?/g,"").replace(/\n([ \t]*)\.\.\.v4Token,\n/g,`
7
+ `).replace(/import\s+\{\s*merge\s*\}\s+from\s+['"]webpack-merge['"];?/g,"import merge from 'deepmerge';").replace(/const\s+\{\s*merge\s*\}\s*=\s*require\((['"])webpack-merge\1\);?/g,"const merge = require('deepmerge');").replace(/(['"])webpack-merge\1/g,"$1deepmerge$1").replace(/^.*(rspack-bundle-analyzer|webpack-bundle-analyzer).*\n?/gm,"").replace(/^.*ANALYZER_PACKAGE.*\n?/gm,"").replace(/(['"])webpack\1/g,"$1@rspack/core$1");a!==i&&(await y.default.writeFile(s,a),t=!0)}return t},on=async e=>{var a,p,m,l;let t=x.default.join(e,"manifest.yml"),r=x.default.basename(e),n=r;if(!await y.default.pathExists(t))return{appName:r,appKey:n};let o=await y.default.readFile(t,"utf8"),s=((p=(a=o.match(/^\s*name:\s*(.+)\s*$/m))==null?void 0:a[1])==null?void 0:p.trim())||r,i=((l=(m=o.match(/^\s*key:\s*(.+)\s*$/m))==null?void 0:m[1])==null?void 0:l.trim())||n;return{appName:s,appKey:i}},ar=async e=>{let t=x.default.resolve(e||process.cwd()),r=x.default.join(t,"package.json");if(!await y.default.pathExists(r)){f.error(`package.json not found in ${t}`);return}let n=await y.default.readFile(r,"utf8"),o=JSON.parse(n),s=en(o),i=Zr(o),a=tn(o),p=await rn(t),m=await nn(t),{appName:l,appKey:u}=await on(t),g=await y.default.pathExists(x.default.join(t,"SKILL.md"));await $(t,{appName:l,appKey:u});let v=!g;if((s||i||a)&&await y.default.writeFile(r,`${JSON.stringify(o,null,2)}
8
+ `),!s&&!i&&!a&&!p&&!m&&!v){console.info("Nothing to upgrade. Project already uses rspack settings.");return}console.info("upgrade-v1 finished."),console.info(`Project path: ${t}`),console.info("Please run: pnpm install")};var sn=`v${E}`;console.info(`GiteeTeam Apps Cli ${Te.default.bold.green(sn)}`);console.info(`Node.js ${Te.default.bold.green(process.version)}
9
+ `);var h=new cr.Command;h.version(E,"-v -V --vers").description("Giteeteam Apps Cli");h.command("build").option("--prod","build in production").option("--dev","build in development").option("--no-zip","no archive").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir").option("--ui","build ui").option("-r --rspack [file]","build ui rspack config file").action(pt);h.command("init").action(At);h.command("sync-skill [projectPath]").description("sync builtin skill files to project").action(Bt);h.command("upgrade-v1 [projectPath]").description("upgrade webpack project to rspack").action(ar);h.command("login").option("--domain [domain]","login domain").option("-u --username [username]","login username").option("-p --password [password]","login user password").action(Ft);h.command("tunnel").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir,default cache").option("--no-server","no server").option("--resourcePort [number]","resource port").option("--ui","build ui").option("-r --rspack [file]","build ui rspack config file").option("--no-proxy","no proxy").option("-w --watch [paths...]","watch files change").action(or);h.command("deploy [filename]").option("-e --environment [environment]","app environment").option("-s --subscribe [tenants...]","subscribe tenants after deploy").option("--app-key [appKey]","app key used for subscribe").option("--version-key [versionKey]","version key used for subscribe").action(Pt);h.command("subscribe <appKey> <versionKey>").option("-t --tenants [tenants...]","subscribe tenants, support comma split").option("-e --environment [environment]","app environment").action(Kt);h.command("ui-dev").option("-r --rspack [file]","build ui rspack config file").action(ir);h.parse(process.argv);
@@ -4,24 +4,29 @@
4
4
 
5
5
  - 功能实现(前端模块、trigger、webtrigger)
6
6
  - API 适配(`/forge/` 到运行时路径的转换)
7
- - 打包与发布(上传应用包、订阅到租户)
7
+ - 打包、发布与订阅(CLI 一体化)
8
8
 
9
9
  ## 目录
10
10
 
11
11
  - `skill/guides/01-overview.md`:插件开发总览与实现约束
12
12
  - `skill/guides/02-extension-points.md`:常见扩展点和模块声明方式
13
13
  - `skill/guides/03-api-routing-rules.md`:`/forge/` 接口转换规则
14
- - `skill/guides/04-deploy-and-subscribe.md`:上传与订阅流程(含 curl 模板)
14
+ - `skill/guides/04-deploy-and-subscribe.md`:CLI 发布与订阅流程(登录、打包、部署、订阅)
15
15
  - `skill/guides/05-agent-prompt-template.md`:给 Agent 的标准提问模板
16
16
  - `skill/references/README.md`:平台文档全集参考
17
17
 
18
18
  ## 使用方式
19
19
 
20
20
  1. 先阅读 `01-overview` 和 `02-extension-points`,明确本次插件能力边界。
21
- 2. 涉及接口调用时,严格执行 `03-api-routing-rules`。
21
+ 2. 涉及接口调用时,先从 `https://team.gitee.cn/llms-full.txt` 定位接口原始路径,再执行 `03-api-routing-rules`。
22
22
  3. 需要发布验证时,按 `04-deploy-and-subscribe` 执行。
23
23
  4. 需要让 Agent 批量生成代码时,使用 `05-agent-prompt-template`。
24
24
 
25
+ ## 接口文档唯一来源
26
+
27
+ - 唯一可信接口文档来源:`https://team.gitee.cn/llms-full.txt`
28
+ - 禁止用其它页面(包括 OpenAPI 页面、历史笔记、二手转述)替代接口事实来源
29
+
25
30
  ## 项目标识
26
31
 
27
32
  - 插件名称:`{{appName}}`
@@ -7,7 +7,7 @@
7
7
  - `manifest.yml` 能力声明完整
8
8
  - 前端入口与路由可运行
9
9
  - 后端 trigger/webtrigger 代码可调用
10
- - 打包产物可上传并可被目标租户订阅
10
+ - 打包产物可通过 CLI 上传发布并订阅到目标租户
11
11
 
12
12
  ## 默认技术约束
13
13
 
@@ -15,6 +15,13 @@
15
15
  - 后端:`trigger/*.ts` 与 `functions/*.ts` 按 manifest 声明
16
16
  - 构建:`giteeteam-apps` + `rspack`(通过 `rspack.config.js` 扩展)
17
17
 
18
+ ## 接口检索流程(强制)
19
+
20
+ 1. 接口来源约束遵循 `SKILL.md` 的“接口文档唯一来源”。
21
+ 2. 先定位“请求链接”原文,再提取 `/forge/...` 原始路径。
22
+ 3. 前端接口先做 `isInOne` 环境判断,再按 `03-api-routing-rules` 执行路径转换;后端接口不做该判断。
23
+ 4. 提交说明写清楚“原始路径”和“转换后路径”。
24
+
18
25
  ## 目录建议
19
26
 
20
27
  - `manifest.yml`:插件能力声明
@@ -1,6 +1,6 @@
1
1
  # /forge/ 接口转换规则
2
2
 
3
- `llms-full.txt` 中大量接口以 `/forge/` 开头。插件实现时必须按调用场景转换:
3
+ 接口来源约束遵循 `SKILL.md` 的“接口文档唯一来源”。路径按调用场景转换:
4
4
 
5
5
  ## 前端调用(浏览器)
6
6
 
@@ -10,13 +10,48 @@
10
10
 
11
11
  前端实际请求必须改为:
12
12
 
13
- - `/api/team/parse/forge/xxx`
13
+ - `/api/team/parse/xxx`
14
+
15
+ 示例:
16
+
17
+ - 文档 `/forge/api/search` => 前端 `/api/team/parse/api/search`
18
+
19
+ 环境分支(仅前端,按 `isInOne`):
20
+
21
+ - 集成环境(`isInOne === true`)优先:`/parse/xxx`
22
+ - 开发环境(`isInOne === false`)优先:`/api/team/parse/xxx`
23
+ - 为兼容历史网关差异,可保留另一条路径作为回退
14
24
 
15
25
  ## Trigger 调用(服务端)
16
26
 
17
27
  当在 trigger/webtrigger 里调用同类接口时,省略 `/api/team` 前缀:
18
28
 
19
- - `/parse/forge/xxx` 或直接走项目内 parse client 对应能力
29
+ - `/parse/xxx` 或直接走项目内 parse client 对应能力
30
+ - 后端不使用 `isInOne` 做路径分支
31
+
32
+ 示例:
33
+
34
+ - 文档 `/forge/api/search` => 后端 `/parse/api/search`
35
+
36
+ ## isInOne 判断示例(可直接复用)
37
+
38
+ ```ts
39
+ export const isInOne = (gateway: string): boolean => {
40
+ if (!gateway) return false;
41
+ try {
42
+ const gatewayURL = new URL(gateway);
43
+ return gatewayURL.pathname.startsWith('/api');
44
+ } catch {
45
+ return false;
46
+ }
47
+ };
48
+ ```
49
+
50
+ 示例输入:
51
+
52
+ - `https://osc.gitee.work/api/team` => `true`(集成环境)
53
+ - `https://osc.gitee.work` => `false`(开发环境)
54
+ - `''` 或非法 URL => `false`
20
55
 
21
56
  ## 统一约束
22
57
 
@@ -1,28 +1,43 @@
1
- # 插件上传与订阅
1
+ # 插件发布与订阅(CLI)
2
2
 
3
- 以下流程用于将本地构建产物上传到某环境,并订阅到指定租户。
3
+ 以下流程用于通过 `giteeteam-apps` 完成登录、构建、上传发布和租户订阅。
4
4
 
5
- ## 1) 上传插件包到环境
5
+ ## 0) 先登录(必须)
6
6
 
7
7
  ```bash
8
- curl 'http://<host>/apps/api/v1/apps/deploy' \
9
- -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxxxx' \
10
- -b 'auth_session=<session>; team_tenant=<tenant>; sessionToken=<token>' \
11
- --data-raw $'------WebKitFormBoundaryxxxx\r\nContent-Disposition: form-data; name="package"; filename="<appKey>_<version>.zip"\r\nContent-Type: application/zip\r\n\r\n\r\n------WebKitFormBoundaryxxxx\r\nContent-Disposition: form-data; name="environmentKey"\r\n\r\nproduction\r\n------WebKitFormBoundaryxxxx\r\nContent-Disposition: form-data; name="category"\r\n\r\nUser installed\r\n------WebKitFormBoundaryxxxx\r\nContent-Disposition: form-data; name="subscriptionSource"\r\n\r\nmanual\r\n------WebKitFormBoundaryxxxx--\r\n' \
12
- --insecure
8
+ giteeteam-apps login --domain http://<host> -u <username> -p <password>
13
9
  ```
14
10
 
15
- ## 2) 订阅到租户(例如 osc)
11
+ ## 1) 构建插件包
16
12
 
17
13
  ```bash
18
- curl 'http://<host>/apps/api/v1/apps/install/batch' \
19
- -H 'Content-Type: application/json' \
20
- -b 'auth_session=<session>; team_tenant=<tenant>; sessionToken=<token>' \
21
- --data-raw '{"tenants":["osc"],"environmentKey":"production","appKey":"<appKey>","versionKey":"<version>","subscriptionSource":"manual"}' \
22
- --insecure
14
+ giteeteam-apps build --prod
23
15
  ```
24
16
 
25
- ## 安全说明
17
+ ## 2) 上传到目标环境
26
18
 
27
- 1. 不要提交真实 cookie/token 到仓库。
28
- 2. 通过环境变量注入认证信息,避免硬编码到脚本。
19
+ ```bash
20
+ giteeteam-apps deploy <zip-file> -e production
21
+ ```
22
+
23
+ ## 3) 订阅到租户
24
+
25
+ 方式 A:单独订阅
26
+
27
+ ```bash
28
+ giteeteam-apps subscribe <appKey> <versionKey> -t osc -e production
29
+ ```
30
+
31
+ 方式 B:部署后自动订阅
32
+
33
+ ```bash
34
+ giteeteam-apps deploy <zip-file> -e production --subscribe osc --app-key <appKey> --version-key <versionKey>
35
+ ```
36
+
37
+ 说明:
38
+
39
+ 1. `<zip-file>` 使用 `build` 产出的压缩包路径。
40
+ 2. `-e` 支持 `development`、`staging`、`production`,默认 `development`。
41
+ 3. `subscribe` 与 `deploy --subscribe` 的 `-t/--subscribe` 支持逗号分隔,例如 `osc,test`。
42
+ 4. 若 zip 命名为 `<appKey>_<versionKey>.zip`,`deploy --subscribe` 可省略 `--app-key/--version-key`。
43
+ 5. 整个发布订阅流程不需要再手动调用 `curl` 接口。
@@ -11,8 +11,12 @@
11
11
  3. <功能 3>
12
12
 
13
13
  约束:
14
+ - 接口来源与检索流程遵循 `SKILL.md`(接口文档唯一来源 + 先定位请求链接原文)
15
+ - 仅前端接口使用 `isInOne` 判断环境(集成/开发);后端接口不使用该判断
16
+ - `isInOne` 实现以 `03-api-routing-rules.md` 内示例为准(无需外部仓库)
14
17
  - manifest.yml 定义完整且可校验
15
18
  - 前端接口遵循 /forge/ 路径转换规则
19
+ - 路径映射必须满足:前端 `/forge/xxx` => `/api/team/parse/xxx`;后端 `/forge/xxx` => `/parse/xxx`
16
20
  - trigger 与 webtrigger 的 function 声明完整
17
21
  - 保留最小可运行骨架并补充必要注释
18
22
  ```
@@ -2,4 +2,4 @@
2
2
 
3
3
  - `llms-full.txt`:平台官方文档全集(单文件版)
4
4
  - 来源:`https://team.gitee.cn/llms-full.txt`
5
- - 更新策略:按需人工同步,更新时记录日期与来源
5
+ - 使用策略:接口事实以该链接在线内容为准,不使用其它来源替代
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@giteeteam/apps-cli",
3
- "version": "1.0.0-alpha.3",
3
+ "version": "1.0.0",
4
4
  "description": "Giteeteam Apps cli",
5
5
  "keywords": [
6
6
  "typescript",
@@ -4,24 +4,29 @@
4
4
 
5
5
  - 功能实现(前端模块、trigger、webtrigger)
6
6
  - API 适配(`/forge/` 到运行时路径的转换)
7
- - 打包与发布(上传应用包、订阅到租户)
7
+ - 打包、发布与订阅(CLI 一体化)
8
8
 
9
9
  ## 目录
10
10
 
11
11
  - `skill/guides/01-overview.md`:插件开发总览与实现约束
12
12
  - `skill/guides/02-extension-points.md`:常见扩展点和模块声明方式
13
13
  - `skill/guides/03-api-routing-rules.md`:`/forge/` 接口转换规则
14
- - `skill/guides/04-deploy-and-subscribe.md`:上传与订阅流程(含 curl 模板)
14
+ - `skill/guides/04-deploy-and-subscribe.md`:CLI 发布与订阅流程(登录、打包、部署、订阅)
15
15
  - `skill/guides/05-agent-prompt-template.md`:给 Agent 的标准提问模板
16
16
  - `skill/references/README.md`:平台文档全集参考
17
17
 
18
18
  ## 使用方式
19
19
 
20
20
  1. 先阅读 `01-overview` 和 `02-extension-points`,明确本次插件能力边界。
21
- 2. 涉及接口调用时,严格执行 `03-api-routing-rules`。
21
+ 2. 涉及接口调用时,先从 `https://team.gitee.cn/llms-full.txt` 定位接口原始路径,再执行 `03-api-routing-rules`。
22
22
  3. 需要发布验证时,按 `04-deploy-and-subscribe` 执行。
23
23
  4. 需要让 Agent 批量生成代码时,使用 `05-agent-prompt-template`。
24
24
 
25
+ ## 接口文档唯一来源
26
+
27
+ - 唯一可信接口文档来源:`https://team.gitee.cn/llms-full.txt`
28
+ - 禁止用其它页面(包括 OpenAPI 页面、历史笔记、二手转述)替代接口事实来源
29
+
25
30
  ## 项目标识
26
31
 
27
32
  - 插件名称:`{{appName}}`
@@ -7,7 +7,7 @@
7
7
  - `manifest.yml` 能力声明完整
8
8
  - 前端入口与路由可运行
9
9
  - 后端 trigger/webtrigger 代码可调用
10
- - 打包产物可上传并可被目标租户订阅
10
+ - 打包产物可通过 CLI 上传发布并订阅到目标租户
11
11
 
12
12
  ## 默认技术约束
13
13
 
@@ -15,6 +15,13 @@
15
15
  - 后端:`trigger/*.ts` 与 `functions/*.ts` 按 manifest 声明
16
16
  - 构建:`giteeteam-apps` + `rspack`(通过 `rspack.config.js` 扩展)
17
17
 
18
+ ## 接口检索流程(强制)
19
+
20
+ 1. 接口来源约束遵循 `SKILL.md` 的“接口文档唯一来源”。
21
+ 2. 先定位“请求链接”原文,再提取 `/forge/...` 原始路径。
22
+ 3. 前端接口先做 `isInOne` 环境判断,再按 `03-api-routing-rules` 执行路径转换;后端接口不做该判断。
23
+ 4. 提交说明写清楚“原始路径”和“转换后路径”。
24
+
18
25
  ## 目录建议
19
26
 
20
27
  - `manifest.yml`:插件能力声明
@@ -1,6 +1,6 @@
1
1
  # /forge/ 接口转换规则
2
2
 
3
- `llms-full.txt` 中大量接口以 `/forge/` 开头。插件实现时必须按调用场景转换:
3
+ 接口来源约束遵循 `SKILL.md` 的“接口文档唯一来源”。路径按调用场景转换:
4
4
 
5
5
  ## 前端调用(浏览器)
6
6
 
@@ -10,13 +10,48 @@
10
10
 
11
11
  前端实际请求必须改为:
12
12
 
13
- - `/api/team/parse/forge/xxx`
13
+ - `/api/team/parse/xxx`
14
+
15
+ 示例:
16
+
17
+ - 文档 `/forge/api/search` => 前端 `/api/team/parse/api/search`
18
+
19
+ 环境分支(仅前端,按 `isInOne`):
20
+
21
+ - 集成环境(`isInOne === true`)优先:`/parse/xxx`
22
+ - 开发环境(`isInOne === false`)优先:`/api/team/parse/xxx`
23
+ - 为兼容历史网关差异,可保留另一条路径作为回退
14
24
 
15
25
  ## Trigger 调用(服务端)
16
26
 
17
27
  当在 trigger/webtrigger 里调用同类接口时,省略 `/api/team` 前缀:
18
28
 
19
- - `/parse/forge/xxx` 或直接走项目内 parse client 对应能力
29
+ - `/parse/xxx` 或直接走项目内 parse client 对应能力
30
+ - 后端不使用 `isInOne` 做路径分支
31
+
32
+ 示例:
33
+
34
+ - 文档 `/forge/api/search` => 后端 `/parse/api/search`
35
+
36
+ ## isInOne 判断示例(可直接复用)
37
+
38
+ ```ts
39
+ export const isInOne = (gateway: string): boolean => {
40
+ if (!gateway) return false;
41
+ try {
42
+ const gatewayURL = new URL(gateway);
43
+ return gatewayURL.pathname.startsWith('/api');
44
+ } catch {
45
+ return false;
46
+ }
47
+ };
48
+ ```
49
+
50
+ 示例输入:
51
+
52
+ - `https://osc.gitee.work/api/team` => `true`(集成环境)
53
+ - `https://osc.gitee.work` => `false`(开发环境)
54
+ - `''` 或非法 URL => `false`
20
55
 
21
56
  ## 统一约束
22
57
 
@@ -1,28 +1,43 @@
1
- # 插件上传与订阅
1
+ # 插件发布与订阅(CLI)
2
2
 
3
- 以下流程用于将本地构建产物上传到某环境,并订阅到指定租户。
3
+ 以下流程用于通过 `giteeteam-apps` 完成登录、构建、上传发布和租户订阅。
4
4
 
5
- ## 1) 上传插件包到环境
5
+ ## 0) 先登录(必须)
6
6
 
7
7
  ```bash
8
- curl 'http://<host>/apps/api/v1/apps/deploy' \
9
- -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxxxx' \
10
- -b 'auth_session=<session>; team_tenant=<tenant>; sessionToken=<token>' \
11
- --data-raw $'------WebKitFormBoundaryxxxx\r\nContent-Disposition: form-data; name="package"; filename="<appKey>_<version>.zip"\r\nContent-Type: application/zip\r\n\r\n\r\n------WebKitFormBoundaryxxxx\r\nContent-Disposition: form-data; name="environmentKey"\r\n\r\nproduction\r\n------WebKitFormBoundaryxxxx\r\nContent-Disposition: form-data; name="category"\r\n\r\nUser installed\r\n------WebKitFormBoundaryxxxx\r\nContent-Disposition: form-data; name="subscriptionSource"\r\n\r\nmanual\r\n------WebKitFormBoundaryxxxx--\r\n' \
12
- --insecure
8
+ giteeteam-apps login --domain http://<host> -u <username> -p <password>
13
9
  ```
14
10
 
15
- ## 2) 订阅到租户(例如 osc)
11
+ ## 1) 构建插件包
16
12
 
17
13
  ```bash
18
- curl 'http://<host>/apps/api/v1/apps/install/batch' \
19
- -H 'Content-Type: application/json' \
20
- -b 'auth_session=<session>; team_tenant=<tenant>; sessionToken=<token>' \
21
- --data-raw '{"tenants":["osc"],"environmentKey":"production","appKey":"<appKey>","versionKey":"<version>","subscriptionSource":"manual"}' \
22
- --insecure
14
+ giteeteam-apps build --prod
23
15
  ```
24
16
 
25
- ## 安全说明
17
+ ## 2) 上传到目标环境
26
18
 
27
- 1. 不要提交真实 cookie/token 到仓库。
28
- 2. 通过环境变量注入认证信息,避免硬编码到脚本。
19
+ ```bash
20
+ giteeteam-apps deploy <zip-file> -e production
21
+ ```
22
+
23
+ ## 3) 订阅到租户
24
+
25
+ 方式 A:单独订阅
26
+
27
+ ```bash
28
+ giteeteam-apps subscribe <appKey> <versionKey> -t osc -e production
29
+ ```
30
+
31
+ 方式 B:部署后自动订阅
32
+
33
+ ```bash
34
+ giteeteam-apps deploy <zip-file> -e production --subscribe osc --app-key <appKey> --version-key <versionKey>
35
+ ```
36
+
37
+ 说明:
38
+
39
+ 1. `<zip-file>` 使用 `build` 产出的压缩包路径。
40
+ 2. `-e` 支持 `development`、`staging`、`production`,默认 `development`。
41
+ 3. `subscribe` 与 `deploy --subscribe` 的 `-t/--subscribe` 支持逗号分隔,例如 `osc,test`。
42
+ 4. 若 zip 命名为 `<appKey>_<versionKey>.zip`,`deploy --subscribe` 可省略 `--app-key/--version-key`。
43
+ 5. 整个发布订阅流程不需要再手动调用 `curl` 接口。
@@ -11,8 +11,12 @@
11
11
  3. <功能 3>
12
12
 
13
13
  约束:
14
+ - 接口来源与检索流程遵循 `SKILL.md`(接口文档唯一来源 + 先定位请求链接原文)
15
+ - 仅前端接口使用 `isInOne` 判断环境(集成/开发);后端接口不使用该判断
16
+ - `isInOne` 实现以 `03-api-routing-rules.md` 内示例为准(无需外部仓库)
14
17
  - manifest.yml 定义完整且可校验
15
18
  - 前端接口遵循 /forge/ 路径转换规则
19
+ - 路径映射必须满足:前端 `/forge/xxx` => `/api/team/parse/xxx`;后端 `/forge/xxx` => `/parse/xxx`
16
20
  - trigger 与 webtrigger 的 function 声明完整
17
21
  - 保留最小可运行骨架并补充必要注释
18
22
  ```
@@ -2,4 +2,4 @@
2
2
 
3
3
  - `llms-full.txt`:平台官方文档全集(单文件版)
4
4
  - 来源:`https://team.gitee.cn/llms-full.txt`
5
- - 更新策略:按需人工同步,更新时记录日期与来源
5
+ - 使用策略:接口事实以该链接在线内容为准,不使用其它来源替代