makecoder 4.0.70 → 4.0.72
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/cc.mjs +4 -4
- package/dist/coder.js +82 -111
- package/dist/darwin-arm64/cc.js +5 -5
- package/dist/darwin-x64/cc.js +5 -5
- package/dist/linux-x64/cc.js +5 -5
- package/dist/win32-x64/cc.js +5 -5
- package/package.json +4 -5
- package/packages/mcp-channel/wecom/.mcp.json +0 -8
- package/packages/mcp-channel/wecom/package-lock.json +0 -1313
- package/packages/mcp-channel/wecom/package.json +0 -14
- package/packages/mcp-channel/wecom/server.js +0 -371
package/dist/coder.js
CHANGED
|
@@ -1,114 +1,84 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var it=Object.create;var ge=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,dt=Object.prototype.hasOwnProperty;var _=(c,e)=>()=>(e||c((e={exports:{}}).exports,e),e.exports);var ut=(c,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ct(e))!dt.call(c,r)&&r!==t&&ge(c,r,{get:()=>e[r],enumerable:!(o=at(e,r))||o.enumerable});return c};var mt=(c,e,t)=>(t=c!=null?it(lt(c)):{},ut(e||!c||!c.__esModule?ge(t,"default",{value:c,enumerable:!0}):t,c));var j=_((io,pt)=>{pt.exports={name:"makecoder",version:"4.0.72",description:"MakeCoder: Unified AI agent CLI tool integrating Claude Code, Codex and Gemini CLI",main:"./dist/coder.js",bin:{coder:"./dist/coder.js"},scripts:{test:'echo "Error: no test specified" && exit 1',start:"node ./src/coder.js",build:"node scripts/build.js","build:clean":"node scripts/build.js --clean","build:dev":"node scripts/build.js --no-minify --sourcemap",postinstall:"node scripts/postinstall.js"},keywords:["cli","ai","claude","gemini","codex","agent"],author:"makecoder",license:"MIT",repository:{type:"git",url:"https://github.com/makecoderai/coder.git"},homepage:"https://github.com/makecoderai/coder",dependencies:{bun:">=1.3.12","node-fetch":"^3.3.2",open:"^10.1.0",zod:"^3.25.76"},engines:{node:">=20.0.0"},devDependencies:{chokidar:"^4.0.3"},files:["dist","scripts/postinstall.js"]}});var we=_((ao,Ie)=>{var A=require("fs"),ye=require("path"),ft=require("os"),ht=new Set(["auth","skills","wiki","team"]),be=new Set(["claude","gemini","codex"]),gt=new Set(["pub","auth","update","skills","wiki","team"]),z=class{constructor(){let e=process.env.CODER_PROFILE,t=e?`.coder.${e}`:".coder";this.configPath=ye.join(ft.homedir(),t,"config.json"),this.defaultConfig={agent:"claude",auth:{apikey:null}}}loadConfig(){let e=ye.dirname(this.configPath);try{return A.existsSync(e)||A.mkdirSync(e,{recursive:!0}),A.existsSync(this.configPath)||A.writeFileSync(this.configPath,JSON.stringify(this.defaultConfig,null,2)),JSON.parse(A.readFileSync(this.configPath,"utf8"))}catch{return{...this.defaultConfig}}}getApiKeyFromConfig(e){return e.auth?.apikey?e.auth.apikey:e.auth?.ak&&e.auth?.sk?`${e.auth.ak}.${e.auth.sk}`:null}saveAuthToConfig(e){let t=this.loadConfig();t.auth={apikey:e};try{return A.writeFileSync(this.configPath,JSON.stringify(t,null,2)),!0}catch{return!1}}clearAuthFromConfig(){let e=this.loadConfig();e.auth={apikey:null};try{return A.writeFileSync(this.configPath,JSON.stringify(e,null,2)),!0}catch{return!1}}getTeam(){return this.loadConfig().team||null}setTeam(e,t){let o=this.loadConfig();e==null?delete o.team:o.team={id:e,name:t||""};try{return A.writeFileSync(this.configPath,JSON.stringify(o,null,2)),!0}catch{return!1}}getTeamManual(){return!!this.loadConfig().team_manual}setTeamManual(e){let t=this.loadConfig();e?t.team_manual=!0:delete t.team_manual;try{return A.writeFileSync(this.configPath,JSON.stringify(t,null,2)),!0}catch{return!1}}async parse(e=process.argv.slice(2)){let t=this.loadConfig(),o={agent:t.agent||"claude",remainingArgs:[]},r=0;if(e.length>0){if(be.has(e[0]))o.agent=e[0],o.agentSetBySubcommand=!0,r=1;else if(gt.has(e[0])){if(o.command=e[0],r=1,e[0]==="auth"){let n=e[1];n==="--help"||n==="-h"?o.authSubcommand="--help":(o.authSubcommand=n,o.authRemainingArgs=e.slice(2)),r=e.length}else if(e[0]==="skills"){let n=e[1];o.skillsSubcommand=n==="--help"||n==="-h"?void 0:n,o.skillsArg=e[2],o.skillsRemainingArgs=e.slice(2),r=e.length}else if(e[0]==="wiki"){let n=e[1];o.wikiSubcommand=n==="--help"||n==="-h"?void 0:n,o.wikiArg=e[2],o.wikiRemainingArgs=e.slice(2),r=e.length}else if(e[0]==="team"){let n=e[1];o.teamSubcommand=n==="--help"||n==="-h"?void 0:n,o.teamArg=e[2],o.teamRemainingArgs=e.slice(2),r=e.length}}}for(;r<e.length;){let n=e[r];if(n==="--agent"){if(o.agentSetBySubcommand)throw new Error(`\u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u5B50\u547D\u4EE4 '${o.agent}' \u548C --agent\uFF0C\u8BF7\u9009\u62E9\u5176\u4E00`);let i=e[r+1];if(!i||!be.has(i))throw new Error("--agent \u9700\u8981\u6307\u5B9A\u4EE3\u7406\u7C7B\u578B\uFF08claude|gemini|codex\uFF09");o.agent=i,r+=2}else if(n==="--apikey"){let i=e[r+1];if(!i||i.startsWith("--"))throw new Error("--apikey \u9700\u8981\u63D0\u4F9B API Key \u503C");if(i.indexOf(".")===-1)throw new Error("API Key \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <ak>.<sk>");o.apikey=i,r+=2}else if(n==="--name"){let i=e[r+1];i&&!i.startsWith("--")?(o.pubName=i,r+=2):r+=1}else if(n==="--allow-clone")o.allowClone=!0,r+=1;else if(n==="--meta-data"){let i=e[r+1];if(!i||i.startsWith("--"))throw new Error("--meta-data \u9700\u8981\u4E00\u4E2A JSON \u5B57\u7B26\u4E32\u503C");try{JSON.parse(i)}catch(a){throw new Error(`--meta-data \u4E0D\u662F\u5408\u6CD5\u7684 JSON\uFF1A${a.message}`)}o.pubMetaData=i,r+=2}else{o.remainingArgs=e.slice(r);break}}if(o.command!=="auth"&&!o.apikey){let n=this.getApiKeyFromConfig(t);o.apikey=n||process.env.CODER_APIKEY||null}o.codevServer=process.env.CODEV_SERVER||t.codevServer||"https://makecoder.com/bigapis/codev/v1";let s=o.remainingArgs.includes("--version")||o.remainingArgs.includes("-v")||o.remainingArgs.includes("--help")||o.remainingArgs.includes("-h");return!ht.has(o.command)&&!s&&!o.apikey&&await this._oauthLogin(o),o}async _oauthLogin(e){console.log(`\u274C \u5C1A\u672A\u767B\u5F55
|
|
3
3
|
`),console.log("\u8BF7\u5148\u767B\u5F55:"),console.log(` coder auth login
|
|
4
4
|
`),console.log("\u6216\u76F4\u63A5\u63D0\u4F9B API Key:"),console.log(` coder auth login --apikey <your-api-key>
|
|
5
5
|
`),console.log(`\u83B7\u53D6 API Key: https://makecoder.com/my/apikeys
|
|
6
|
-
`),process.exit(1)}showHelp(){let{version:e}=
|
|
7
|
-
`))}};
|
|
8
|
-
`))}_getBunPlatformPackage(){let e=process.platform,t=process.arch;return{"darwin-arm64":"@oven-sh/bun-darwin-aarch64","darwin-x64":"@oven-sh/bun-darwin-x64","linux-arm64":"@oven-sh/bun-linux-aarch64","linux-x64":"@oven-sh/bun-linux-x64","win32-x64":"@oven-sh/bun-windows-x64"}[`${e}-${t}`]||null}async launch(e={}){let{remainingArgs:t=[],codevServer:o,apikey:r=null,extraEnv:s={}}=e,n=this.findExecutablePath(),i=this._resolveBunPath();return process.env.CODEV_DEBUG&&(console.log(`executablePath (bun): ${n}`),console.log(`bunPath: ${i}`)),new Promise((
|
|
9
|
-
`).map(
|
|
10
|
-
\u{1F4C2} [allow-clone] \u67E5\u627E JSONL \u6587\u4EF6...`),console.log(` \u9879\u76EE\u76EE\u5F55: ${e}`),console.log(` Claude \u9879\u76EE\u540D: ${o}`),console.log(` Claude \u9879\u76EE\u76EE\u5F55: ${r}`)),!E.existsSync(r))return t&&console.log(" \u274C Claude \u9879\u76EE\u76EE\u5F55\u4E0D\u5B58\u5728"),null;t&&console.log(" \u2713 Claude \u9879\u76EE\u76EE\u5F55\u5B58\u5728");try{let s=E.readdirSync(r).filter(n=>n.endsWith(".jsonl")).map(n=>({name:n,path:
|
|
11
|
-
\u{1F504} [allow-clone] \u5F00\u59CB\u5904\u7406 AI \u751F\u6210\u8BB0\u5F55...`);let
|
|
12
|
-
\u{1F4E6} [allow-clone] \u6253\u5305 JSONL \u6587\u4EF6...`),console.log(` \u6E90\u6587\u4EF6: ${
|
|
6
|
+
`),process.exit(1)}showHelp(){let{version:e}=j(),t=[`Coder v${e} - \u7EDF\u4E00 AI \u4EE3\u7406 CLI`,"","Usage: coder [options] [command] [arguments]","","Arguments:"," prompt \u60A8\u7684\u63D0\u793A\u8BCD","","Commands:"," claude \u542F\u52A8 Claude Code \u4EE3\u7406\uFF08\u9ED8\u8BA4\uFF09"," gemini \u542F\u52A8 Gemini \u4EE3\u7406"," codex \u542F\u52A8 OpenAI Codex \u4EE3\u7406"," auth \u7BA1\u7406\u8EAB\u4EFD\u9A8C\u8BC1\u51ED\u8BC1"," update \u5347\u7EA7 Coder \u5230\u6700\u65B0\u7248\u672C"," pub \u53D1\u5E03\u5F53\u524D\u76EE\u5F55\u4E3A MakeCoder \u7F51\u9875\u5E94\u7528"," skills \u7BA1\u7406 Claude Code skills"," wiki \u7BA1\u7406 MakeCoder \u77E5\u8BC6\u5E93"," team \u7BA1\u7406\u56E2\u961F\u4E0E\u6210\u5458\uFF08\u9762\u5411 AI\uFF09","","Options:"," --agent <agent> \u6307\u5B9A\u4F7F\u7528\u7684 AI \u4EE3\u7406\uFF08claude|gemini|codex\uFF09"," --apikey <key> \u4E34\u65F6\u63D0\u4F9B API Key\uFF08\u683C\u5F0F: <ak>.<sk>\uFF09"," --version, -v \u663E\u793A\u7248\u672C\u53F7"," --help, -h \u663E\u793A\u6B64\u5E2E\u52A9\u4FE1\u606F","","Examples:"," coder claude \u542F\u52A8 Claude Code \u4EE3\u7406"," coder gemini \u542F\u52A8 Gemini \u4EE3\u7406"," coder auth login \u767B\u5F55\uFF08\u6D4F\u89C8\u5668\u6216\u7EC8\u7AEF\u8F93\u5165 API Key\uFF09"," coder auth login --apikey <key> \u76F4\u63A5\u4FDD\u5B58 API Key"," coder auth logout \u9000\u51FA\u767B\u5F55"," coder auth status \u67E5\u770B\u767B\u5F55\u72B6\u6001"," coder pub --name myproject \u53D1\u5E03\u5F53\u524D\u76EE\u5F55\u4E3A MakeCoder \u7F51\u9875\u5E94\u7528"," coder skills --help \u67E5\u770B skills \u5B50\u547D\u4EE4\u5E2E\u52A9"," coder wiki --help \u67E5\u770B wiki \u5B50\u547D\u4EE4\u5E2E\u52A9"," coder team --help \u67E5\u770B team \u5B50\u547D\u4EE4\u5E2E\u52A9","",`\u914D\u7F6E\u6587\u4EF6: ${this.configPath}`];console.log(t.join(`
|
|
7
|
+
`))}};Ie.exports=z});var U=_((co,xe)=>{var{spawn:yt}=require("child_process"),B=require("path"),$e=require("fs"),W=class{constructor(e){this.config=e}findExecutablePath(){let e=B.dirname(require.main.filename);for(let t of this.config.executablePaths){let o=B.resolve(e,t);if($e.existsSync(o))return o}if(this.config.globalSubPath){let t=this._findGlobalMakecoderPath(this.config.globalSubPath);if(t)return t}throw new Error(`Could not find ${this.config.name||"executable"} in any of the configured paths: ${this.config.executablePaths.join(", ")}`)}_findGlobalMakecoderPath(e){let t=B.dirname(process.execPath),o=[B.join(t,"..","lib","node_modules","makecoder","dist",e),B.join(t,"node_modules","makecoder","dist",e)];for(let r of o)if($e.existsSync(r))return r;return null}async launch(e={}){let{remainingArgs:t=[],codevServer:o,apikey:r=null,extraEnv:s={}}=e;try{let n=this.findExecutablePath();return process.env.CODEV_DEBUG&&console.log(`executablePath: ${n}`),new Promise((i,a)=>{let l={...process.env,...this.config.environmentVariables(o),...s};r&&(l.CODER_APIKEY=r);let d=["--no-warnings"];process.env.CODEV_INSPECT_BRK==="True"&&d.push("--inspect-brk"),d.push(n,...t);let u=yt("node",d,{env:l,stdio:"inherit"});u.on("error",m=>{console.error(`Failed to start: ${m.message}`),a(m)}),u.on("exit",m=>i(m)),process.on("SIGINT",()=>{}),process.on("SIGTERM",()=>{u.kill("SIGTERM"),setTimeout(()=>{u.killed||u.kill("SIGKILL")},8e3)})})}catch(n){throw n}}};xe.exports=W});var _e=_((lo,ke)=>{var bt=U(),Y=class extends bt{constructor(){super({name:"Claude Code (node)",executablePaths:["cc.mjs","../dist/cc.mjs","/tmp/claude-code/package/cc.mjs"],globalSubPath:"cc.mjs",environmentVariables:e=>({ANTHROPIC_BASE_URL:`${e}/claude`,ANTHROPIC_API_KEY:"null",DISABLE_TELEMETRY:!0,CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:!0,DISABLE_COST_WARNINGS:!0,DISABLE_NON_ESSENTIAL_MODEL_CALLS:!0,CODEV_SERVER:e,CLAUDE_CODE_ATTRIBUTION_HEADER:"0",DISABLE_AUTOUPDATER:"1"})})}};ke.exports=Y});var Se=_((uo,ve)=>{var It=U(),{spawn:wt,execFileSync:$t}=require("child_process"),G=require("path"),L=require("fs"),X=class extends It{constructor(){let e=`${process.platform}-${process.arch}`;super({name:"Claude Code (bun)",executablePaths:[`${e}/cc.js`,`../dist/${e}/cc.js`,`/tmp/claude-code-${e}/package/extracted/src/entrypoints/cc.js`],globalSubPath:`${e}/cc.js`,environmentVariables:t=>({ANTHROPIC_BASE_URL:`${t}/claude`,ANTHROPIC_API_KEY:"null",DISABLE_TELEMETRY:!0,CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:!0,DISABLE_COST_WARNINGS:!0,DISABLE_NON_ESSENTIAL_MODEL_CALLS:!0,CODEV_SERVER:t,CLAUDE_CODE_ATTRIBUTION_HEADER:"0",DISABLE_INSTALLATION_CHECKS:"1",DISABLE_AUTOUPDATER:"1",ANTHROPIC_DEFAULT_HAIKU_MODEL:"claude-haiku-4-5"})})}_resolveBunPath(){let e=process.platform==="win32",t=e?"bun.exe":"bun",o=process.env.HOME||process.env.USERPROFILE||"";try{return $t(t,["--version"],{stdio:"ignore"}),t}catch{}if(o){let s=G.join(o,".bun","bin",t);if(L.existsSync(s))return s}if(o){let s=G.join(o,".local","bin",t);if(L.existsSync(s))return s}try{let s=require.resolve(`bun/${e?"bin/bun.exe":"bin/bun"}`);if(L.existsSync(s))return s}catch{}let r=this._getBunPlatformPackage();if(r)try{let s=G.dirname(require.resolve(`${r}/package.json`)),n=G.join(s,"bin",t);if(L.existsSync(n))return n}catch{}throw new Error(["bun is not installed.","","Tried (in order):"," 1. `bun` on PATH"," 2. ~/.bun/bin/bun"," 3. ~/.local/bin/bun"," 4. require.resolve('bun/bin/bun') \u2014 npm-installed bun package"," 5. @oven-sh/bun-<platform> tarball \u2014 npm platform package","","Fixes:"," - npm install -g bun"," - curl -fsSL https://bun.sh/install | bash (then open a new shell)"," - re-run `npm install -g makecoder` with --verbose to see why the"," bundled bun postinstall failed (network / proxy / mirror issues"," silently skip optionalDependencies)."].join(`
|
|
8
|
+
`))}_getBunPlatformPackage(){let e=process.platform,t=process.arch;return{"darwin-arm64":"@oven-sh/bun-darwin-aarch64","darwin-x64":"@oven-sh/bun-darwin-x64","linux-arm64":"@oven-sh/bun-linux-aarch64","linux-x64":"@oven-sh/bun-linux-x64","win32-x64":"@oven-sh/bun-windows-x64"}[`${e}-${t}`]||null}async launch(e={}){let{remainingArgs:t=[],codevServer:o,apikey:r=null,extraEnv:s={}}=e,n=this.findExecutablePath(),i=this._resolveBunPath();return process.env.CODEV_DEBUG&&(console.log(`executablePath (bun): ${n}`),console.log(`bunPath: ${i}`)),new Promise((a,l)=>{let d={...process.env,...this.config.environmentVariables(o),CODER_EXECPATH:L.realpathSync(process.argv[1]),...s};r&&(d.CODER_APIKEY=r);let u=wt(i,[n,...t],{env:d,stdio:"inherit"});u.on("error",m=>{m.code==="ENOENT"?console.error("bun binary not found. Install it with: npm install -g bun or curl -fsSL https://bun.sh/install | bash"):console.error(`Failed to start bun: ${m.message}`),l(m)}),u.on("exit",m=>a(m)),process.on("SIGINT",()=>{}),process.on("SIGTERM",()=>{u.kill("SIGTERM"),setTimeout(()=>{u.killed||u.kill("SIGKILL")},8e3)})})}};ve.exports=X});var Ee=_((mo,Ce)=>{var xt=U(),Z=class extends xt{constructor(){super({name:"Gemini",executablePaths:["gemini/gemini.js","../dist/gemini/gemini.js"],globalSubPath:"gemini/gemini.js",environmentVariables:e=>({GOOGLE_GEMINI_BASE_URL:`${e}/gemini`,GEMINI_API_KEY:"null",GOOGLE_API_KEY:"null",GOOGLE_CLOUD_PROJECT:"coder",GOOGLE_CLOUD_LOCATION:"coder",USE_VERTEX:!0,GEMINI_TELEMETRY_ENABLED:"false",GEMINI_TELEMETRY_LOG_PROMPTS:"false"})})}};Ce.exports=Z});var Te=_((po,Ae)=>{var{execFileSync:De}=require("child_process"),N=require("path"),Oe=require("fs"),kt=U(),_t={"linux-x64":"makecoder-codex-linux-x64","darwin-arm64":"makecoder-codex-darwin-arm64","win32-x64":"makecoder-codex-win32-x64"},vt=5e3,Q=class extends kt{constructor(){super({name:"Codex",executablePaths:["codex.mjs","../dist/codex.mjs"],globalSubPath:"codex.mjs",environmentVariables:()=>({CODEX_DISABLE_WEBSOCKET:"1"})})}async launch(e={}){let{remainingArgs:t=[],codevServer:o,apikey:r=null}=e,s=["-c",`openai_base_url="${o}/codex"`,"-c","analytics.enabled=false","-c","feedback.enabled=false","-c","check_for_update_on_startup=false","-c",'otel.exporter="none"',"-c",'otel.trace_exporter="none"',"-c",'otel.metrics_exporter="none"'],n=this._injectDesktopEnv(t,r);try{return await super.launch({...e,remainingArgs:[...s,...t]})}finally{n&&(await new Promise(i=>setTimeout(i,vt)),this._removeDesktopEnv(n))}}_isAppSubcommand(e){for(let t=0;t<e.length;t++){let o=e[t];if(o==="-c"||o==="--config"){t++;continue}if(!o.startsWith("-"))return o==="app"}return!1}_findCodexBinaryPath(){let{platform:e,arch:t}=process,o=_t[`${e}-${t}`],r=e==="win32"?"codex.exe":"codex";if(o)try{let s=require.resolve(`${o}/package.json`),n=N.join(N.dirname(s),"bin",r);if(Oe.existsSync(n))return n}catch{}try{let s=N.dirname(this.findExecutablePath()),n=[N.join(s,r)];o&&n.push(N.join(s,"..","node_modules",o,"bin",r));for(let i of n)if(Oe.existsSync(i))return i}catch{}return null}_injectDesktopEnv(e,t){if(process.platform!=="darwin"||!this._isAppSubcommand(e))return null;let o=this._findCodexBinaryPath();if(!o)return process.env.CODEV_DEBUG&&console.log("[codex app] \u672A\u627E\u5230 fork codex \u4E8C\u8FDB\u5236\uFF0C\u8DF3\u8FC7 CODEX_CLI_PATH \u6CE8\u5165\uFF1B\u684C\u9762 App \u5C06\u4F7F\u7528\u81EA\u5E26 codex\uFF08\u4E0D\u8D70\u4EE3\u7406\uFF09"),null;let r={CODEX_CLI_PATH:o};t&&(r.CODER_APIKEY=t);let s=[];for(let[n,i]of Object.entries(r))try{De("launchctl",["setenv",n,i],{stdio:"ignore"}),s.push(n)}catch(a){process.env.CODEV_DEBUG&&console.log(`[codex app] launchctl setenv ${n} \u5931\u8D25: ${a.message}`)}return process.env.CODEV_DEBUG&&s.length&&console.log(`[codex app] \u5DF2\u6CE8\u5165 launchd \u73AF\u5883\u53D8\u91CF: ${s.join(", ")} (binary: ${o})`),s.length?s:null}_removeDesktopEnv(e){for(let t of e)try{De("launchctl",["unsetenv",t],{stdio:"ignore"})}catch(o){process.env.CODEV_DEBUG&&console.log(`[codex app] launchctl unsetenv ${t} \u5931\u8D25: ${o.message}`)}}};Ae.exports=Q});var Be=_((fo,je)=>{var R=require("fs"),Pe=require("path"),{spawn:qe}=require("child_process"),ee=class{constructor(){this.extensionId="codev.codev-background";let e=require.main?Pe.dirname(require.main.filename):__dirname;this.extensionPath=Pe.resolve(e,"vendor/claude-code.vsix"),this._codeCommand=null}async resolveCodeCommand(){if(this._codeCommand)return this._codeCommand;if(process.env.IS_AISTUDIO==="True"){let e="/usr/lib/aistudio/lib/vscode/bin/remote-cli/aistudio";if(R.existsSync(e))try{return R.accessSync(e,R.constants.F_OK|R.constants.X_OK),this._codeCommand=e,process.env.CODEV_DEBUG&&console.log(`Using AI Studio VSCode path: ${e}`),this._codeCommand}catch(t){process.env.CODEV_DEBUG&&console.log(`AI Studio path exists but not executable: ${t.message}`)}else process.env.CODEV_DEBUG&&console.log(`AI Studio path not found: ${e}`)}try{let{spawn:e}=require("child_process");return new Promise(t=>{let o=e("which",["code"],{stdio:["ignore","pipe","ignore"]}),r="";o.stdout.on("data",s=>{r+=s.toString().trim()}),o.on("close",s=>{s===0&&r?(this._codeCommand=r,process.env.CODEV_DEBUG&&console.log(`Resolved code command path: ${r}`),t(this._codeCommand)):(this._codeCommand="code",t(this._codeCommand))}),o.on("error",()=>{this._codeCommand="code",t(this._codeCommand)}),setTimeout(()=>{o.kill(),this._codeCommand="code",t(this._codeCommand)},3e3)})}catch{return this._codeCommand="code",this._codeCommand}}async shouldInstallExtension(){try{return process.env.IS_AISTUDIO!=="True"?(process.env.CODEV_DEBUG&&console.log("Not in AI Studio environment (IS_AISTUDIO!=True), skipping extension installation"),!1):await this.isVSCodeAvailable()?await this.isExtensionInstalled()?(process.env.CODEV_DEBUG&&console.log(`Extension ${this.extensionId} already installed`),!1):!!R.existsSync(this.extensionPath):(process.env.CODEV_DEBUG&&console.log("VSCode not available, skipping extension installation"),!1)}catch(e){return process.env.CODEV_DEBUG&&console.error(`Error checking extension installation status: ${e.message}`),!1}}async installExtension(){try{return console.log("Installing Codev VSCode extension..."),await this.executeVSCodeCommand(["--install-extension",this.extensionPath])?(console.log("\u2705 Codev VSCode extension installed successfully"),!0):(console.warn("\u274C Failed to install Codev VSCode extension"),!1)}catch(e){return console.warn(`Error installing VSCode extension: ${e.message}`),!1}}async isVSCodeAvailable(){try{let e=process.env.IS_AISTUDIO==="True"?["--help"]:["--version"],t=await this.executeVSCodeCommand(e,{timeout:1e4});if(process.env.CODEV_DEBUG&&(console.log(`VSCode availability check (${e.join(" ")}): ${t?"available":"unavailable"}`),process.env.IS_AISTUDIO==="True")){let{spawn:o}=require("child_process");try{o("which",["code"],{stdio:["ignore","pipe","ignore"]}).stdout.on("data",s=>{console.log("which code:",s.toString().trim())})}catch(r){console.log("which command failed:",r.message)}}return t}catch(e){return process.env.CODEV_DEBUG&&console.error("VSCode availability check error:",e.message),!1}}async isExtensionInstalled(){let e=await this.resolveCodeCommand();try{return new Promise(t=>{try{let o={stdio:["ignore","pipe","ignore"],shell:!1,env:{...process.env,PATH:process.env.PATH,HOME:process.env.HOME,USER:process.env.USER}};process.env.CODEV_DEBUG&&console.log(`Spawning: ${e} --list-extensions`);let r=qe(e,["--list-extensions"],o),s="";r.stdout.on("data",n=>{s+=n.toString()}),r.on("close",n=>{if(n===0){let i=s.split(`
|
|
9
|
+
`).map(a=>a.trim());t(i.includes(this.extensionId))}else t(!1)}),r.on("error",n=>{process.env.CODEV_DEBUG&&(console.error("VSCode list extensions error:",n.message),console.error("Error code:",n.code),console.error("Error errno:",n.errno),console.error("Error syscall:",n.syscall)),t(!1)}),setTimeout(()=>{try{r.kill()}catch{}t(!1)},1e4)}catch(o){process.env.CODEV_DEBUG&&console.error("Failed to spawn VSCode list extensions:",o.message),t(!1)}})}catch{return!1}}async executeVSCodeCommand(e,t={}){let o=await this.resolveCodeCommand();return new Promise(r=>{try{let s={stdio:"ignore",shell:!1,env:{...process.env,PATH:process.env.PATH,HOME:process.env.HOME,USER:process.env.USER}};process.env.CODEV_DEBUG&&console.log(`Spawning: ${o} ${e.join(" ")}`);let n=qe(o,e,s);n.on("close",a=>{r(a===0)}),n.on("error",a=>{process.env.CODEV_DEBUG&&(console.error("VSCode command error:",a.message),console.error("Error code:",a.code),console.error("Error errno:",a.errno),console.error("Error syscall:",a.syscall)),r(!1)});let i=t.timeout||3e4;setTimeout(()=>{try{n.kill()}catch{}r(!1)},i)}catch(s){process.env.CODEV_DEBUG&&console.error("Failed to spawn VSCode command:",s.message),r(!1)}})}async ensureExtensionInstalled(){try{process.env.CODEV_DEBUG&&console.log("VSCode Extension Service: Checking extension status..."),await this.shouldInstallExtension()&&await this.installExtension()}catch(e){process.env.CODEV_DEBUG&&console.error("VSCode Extension Service Error:",e)}}};je.exports=ee});var Ne=_((ho,Le)=>{var E=require("fs"),T=require("path"),St=require("readline"),{execSync:H}=require("child_process"),Ue=require("os"),te=class{constructor(){this.serverUrl="https://makecoder.com/bigapis/codev/v1/coderpub"}getClaudeJsonlPath(e,t=!1){let o=e.replace(/[/_]/g,"-"),r=T.join(Ue.homedir(),".claude","projects",o);if(t&&(console.log(`
|
|
10
|
+
\u{1F4C2} [allow-clone] \u67E5\u627E JSONL \u6587\u4EF6...`),console.log(` \u9879\u76EE\u76EE\u5F55: ${e}`),console.log(` Claude \u9879\u76EE\u540D: ${o}`),console.log(` Claude \u9879\u76EE\u76EE\u5F55: ${r}`)),!E.existsSync(r))return t&&console.log(" \u274C Claude \u9879\u76EE\u76EE\u5F55\u4E0D\u5B58\u5728"),null;t&&console.log(" \u2713 Claude \u9879\u76EE\u76EE\u5F55\u5B58\u5728");try{let s=E.readdirSync(r).filter(n=>n.endsWith(".jsonl")).map(n=>({name:n,path:T.join(r,n),mtime:E.statSync(T.join(r,n)).mtime,size:E.statSync(T.join(r,n)).size})).sort((n,i)=>i.mtime-n.mtime);return t&&(console.log(` \u627E\u5230 ${s.length} \u4E2A JSONL \u6587\u4EF6:`),s.forEach((n,i)=>{let a=(n.size/1024).toFixed(2),l=n.mtime.toLocaleString(),d=i===0?" <- \u6700\u65B0":"";console.log(` ${i+1}. ${n.name} (${a} KB, ${l})${d}`)})),s.length>0?(t&&console.log(` \u2713 \u9009\u62E9\u6700\u65B0\u6587\u4EF6: ${s[0].name}`),s[0].path):(t&&console.log(" \u274C \u76EE\u5F55\u4E2D\u6CA1\u6709 JSONL \u6587\u4EF6"),null)}catch(s){return t&&console.log(` \u274C \u8BFB\u53D6\u76EE\u5F55\u5931\u8D25: ${s.message}`),null}}async promptForName(){let e=St.createInterface({input:process.stdin,output:process.stdout});return new Promise((t,o)=>{e.question("\u8BF7\u8F93\u5165\u9879\u76EE\u540D\u79F0 (name): ",r=>{e.close();let s=r.trim();if(!s){o(new Error("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"));return}if(!/^[a-zA-Z0-9_-]+$/.test(s)){o(new Error("\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"));return}t(s)})})}async createZip(e,t={}){let{allowClone:o=!1}=t,r=Ue.tmpdir(),s=`coder-pub-${Date.now()}.zip`,n=T.join(r,s);try{let i=!1;if(E.existsSync(T.join(e,".git")))try{H(`git archive -o "${n}" HEAD`,{cwd:e,stdio:"pipe"}),console.log("\u{1F4E6} \u4F7F\u7528 git archive \u521B\u5EFA\u538B\u7F29\u5305\uFF08\u5DF2\u6392\u9664 .gitignore \u4E2D\u7684\u6587\u4EF6\uFF09"),i=!0}catch{console.log("\u26A0\uFE0F git archive \u5931\u8D25\uFF0C\u4F7F\u7528\u666E\u901A zip \u547D\u4EE4")}if(!i){let l=[".git/*","node_modules/*",".env",".env.*","*.log",".DS_Store"].map(d=>`-x "${d}"`).join(" ");H(`zip -r "${n}" . ${l}`,{cwd:e,stdio:"pipe"}),console.log("\u{1F4E6} \u5DF2\u521B\u5EFA\u538B\u7F29\u5305")}if(o){console.log(`
|
|
11
|
+
\u{1F504} [allow-clone] \u5F00\u59CB\u5904\u7406 AI \u751F\u6210\u8BB0\u5F55...`);let a=this.getClaudeJsonlPath(e,!0);if(a){let l=T.join(r,"coder.pub.jsonl"),u=(E.statSync(a).size/1024).toFixed(2);console.log(`
|
|
12
|
+
\u{1F4E6} [allow-clone] \u6253\u5305 JSONL \u6587\u4EF6...`),console.log(` \u6E90\u6587\u4EF6: ${a}`),console.log(` \u6587\u4EF6\u5927\u5C0F: ${u} KB`),console.log(` \u4E34\u65F6\u6587\u4EF6: ${l}`),E.copyFileSync(a,l),console.log(" \u2713 \u5DF2\u590D\u5236\u5230\u4E34\u65F6\u76EE\u5F55"),console.log(` \u76EE\u6807 ZIP: ${n}`),console.log(" \u76EE\u6807\u6587\u4EF6\u540D: coder.pub.jsonl"),H(`zip -j "${n}" "${l}"`,{stdio:"pipe"}),console.log(" \u2713 \u5DF2\u6DFB\u52A0\u5230 ZIP \u5305"),E.unlinkSync(l),console.log(" \u2713 \u5DF2\u6E05\u7406\u4E34\u65F6\u6587\u4EF6"),console.log(`\u{1F4CB} [allow-clone] AI \u751F\u6210\u8BB0\u5F55\u5904\u7406\u5B8C\u6210 (coder.pub.jsonl)
|
|
13
13
|
`)}else console.log(`\u26A0\uFE0F [allow-clone] \u672A\u627E\u5230 Claude Code \u751F\u6210\u8BB0\u5F55
|
|
14
|
-
`)}return n}catch(i){throw new Error(`\u521B\u5EFA\u538B\u7F29\u5305\u5931\u8D25: ${i.message}`)}}async upload(e,t,o,r,s=!1){let n=r?`${r}/coderpub`:this.serverUrl,i=o;console.log("\u{1F4E4} \u6B63\u5728\u4E0A\u4F20\u5230\u670D\u52A1\u5668..."),s&&(console.log(` \u670D\u52A1\u5668\u5730\u5740: ${n}`),console.log(` \u9879\u76EE\u540D\u79F0: ${t}`),console.log(` ZIP \u6587\u4EF6: ${e}`));try{let
|
|
15
|
-
\u{1F680} \u6B63\u5728\u53D1\u5E03\u9879\u76EE: ${s}`),console.log(`\u{1F4C1} \u76EE\u5F55: ${process.cwd()}`),r&&console.log("\u{1F513} allow-clone: \u542F\u7528 (\u5C06\u5305\u542B AI \u751F\u6210\u8BB0\u5F55)"),console.log(),n=await this.createZip(process.cwd(),{allowClone:r});let
|
|
14
|
+
`)}return n}catch(i){throw new Error(`\u521B\u5EFA\u538B\u7F29\u5305\u5931\u8D25: ${i.message}`)}}async upload(e,t,o,r,s=!1){let n=r?`${r}/coderpub`:this.serverUrl,i=o;console.log("\u{1F4E4} \u6B63\u5728\u4E0A\u4F20\u5230\u670D\u52A1\u5668..."),s&&(console.log(` \u670D\u52A1\u5668\u5730\u5740: ${n}`),console.log(` \u9879\u76EE\u540D\u79F0: ${t}`),console.log(` ZIP \u6587\u4EF6: ${e}`));try{let a=`curl -s -X POST "${n}" -H "Authorization: Bearer ${i}" -F "name=${t}" -F "zip_file=@${e}"`;s&&console.log(" \u6267\u884C\u4E0A\u4F20\u547D\u4EE4...");let l=H(a,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return s&&console.log(" \u2713 \u4E0A\u4F20\u5B8C\u6210\uFF0C\u89E3\u6790\u54CD\u5E94..."),JSON.parse(l)}catch(a){if(a.stdout)try{return JSON.parse(a.stdout)}catch{throw new Error(`\u4E0A\u4F20\u5931\u8D25: ${a.message}`)}throw new Error(`\u4E0A\u4F20\u5931\u8D25: ${a.message}`)}}cleanup(e){try{E.existsSync(e)&&E.unlinkSync(e)}catch{}}async publish(e){let{apikey:t,serverBaseUrl:o,allowClone:r}=e,{name:s}=e,n=null;try{s||(s=await this.promptForName()),console.log(`
|
|
15
|
+
\u{1F680} \u6B63\u5728\u53D1\u5E03\u9879\u76EE: ${s}`),console.log(`\u{1F4C1} \u76EE\u5F55: ${process.cwd()}`),r&&console.log("\u{1F513} allow-clone: \u542F\u7528 (\u5C06\u5305\u542B AI \u751F\u6210\u8BB0\u5F55)"),console.log(),n=await this.createZip(process.cwd(),{allowClone:r});let a=(E.statSync(n).size/(1024*1024)).toFixed(2);console.log(`\u{1F4CA} \u538B\u7F29\u5305\u5927\u5C0F: ${a} MB`),r&&console.log(`
|
|
16
16
|
\u{1F310} [allow-clone] \u5F00\u59CB\u4E0A\u4F20\u5230\u670D\u52A1\u5668...`);let l=await this.upload(n,s,t,o,r);return l.code===0?(console.log(`
|
|
17
17
|
\u2705 \u53D1\u5E03\u6210\u529F!`),console.log(`\u{1F4CC} \u7248\u672C: ${l.data.version}`),console.log(`\u{1F310} \u8BBF\u95EE\u5730\u5740: https://${s}.coder.pub/`),0):(console.error(`
|
|
18
18
|
\u274C \u53D1\u5E03\u5931\u8D25: ${l.message||l.reason}`),1)}catch(i){return console.error(`
|
|
19
19
|
\u274C ${i.message}`),1}finally{n&&this.cleanup(n)}}showHelp(){console.log(["Usage: coder pub [options]","","\u53D1\u5E03\u5F53\u524D\u76EE\u5F55\u4E3A MakeCoder \u7F51\u9875\u5E94\u7528","","Options:"," --name <name> \u5E94\u7528\u540D\u79F0\uFF08\u5FC5\u9700\uFF09"," --allow-clone \u5305\u542B Claude Code \u751F\u6210\u8BB0\u5F55\uFF0C\u5141\u8BB8\u4ED6\u4EBA\u514B\u9686"," --help, -h \u663E\u793A\u6B64\u5E2E\u52A9\u4FE1\u606F","","Description:"," \u5C06\u5F53\u524D\u76EE\u5F55\u7684\u4EE3\u7801\u53D1\u5E03\u4E3A MakeCoder \u5E73\u53F0\u4E0A\u7684\u7F51\u9875\u5E94\u7528\u3002"," \u5E94\u7528\u5C06\u5728 https://<name>.coder.pub/ \u4E0A\u53EF\u8BBF\u95EE\u3002","","Examples:"," coder pub --name myapp \u53D1\u5E03\u5E94\u7528\uFF0C\u8BBF\u95EE\u5730\u5740: https://myapp.coder.pub/"," coder pub --name myapp --allow-clone \u53D1\u5E03\u5E94\u7528\u5E76\u5305\u542B\u751F\u6210\u8BB0\u5F55","","Notes:"," - \u5E94\u7528\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"," - \u4F7F\u7528 git archive \u521B\u5EFA\u538B\u7F29\u5305\uFF08\u81EA\u52A8\u6392\u9664 .gitignore \u4E2D\u7684\u6587\u4EF6\uFF09"," - \u5982\u679C\u4E0D\u662F git \u4ED3\u5E93\uFF0C\u5C06\u4F7F\u7528\u666E\u901A zip \u547D\u4EE4"].join(`
|
|
20
|
-
`))}};
|
|
20
|
+
`))}};Le.exports=te});var oe=_((go,Re)=>{function Ct(){return process.env.CODER_NESTED==="1"||!process.stdout.isTTY}Re.exports={shouldSuppressUpdateNotice:Ct}});var Me=_((yo,Fe)=>{var re=require("https"),x=require("fs"),C=require("path"),V=require("os"),{shouldSuppressUpdateNotice:Et}=oe(),P="https://makecoder.com/skillhub",ne=class{constructor(e,t){this.argParser=e||null,this.teamService=t||null}_defaultNamespace(){let e=this.argParser?this.argParser.getTeam():null;return e&&e.id?e.id.slice(0,8):null}_resolveNamespace(e){let t=e||this._defaultNamespace()||"global",o=t.startsWith("@")?t.slice(1):t;return o.length>8&&o.includes("-")?o.slice(0,8):o}getSkillDirs(){let e=V.homedir();return[C.join(e,".agents","skills")]}_request(e,t,o){return new Promise((r,s)=>{let n=new URL(`${P}${t}`),i={hostname:n.hostname,port:n.port||443,path:n.pathname+n.search,method:e,headers:o?{Authorization:`Bearer ${o}`}:{}},a=re.request(i,l=>{if(l.statusCode>=300&&l.statusCode<400&&l.headers.location)return this._request(e,l.headers.location,o).then(r).catch(s);let d="";l.on("data",u=>d+=u),l.on("end",()=>r({status:l.statusCode,body:d}))});a.on("error",s),a.end()})}fetchWithAuth(e,t){return new Promise((o,r)=>{let s=new URL(e),n={hostname:s.hostname,port:s.port||443,path:s.pathname+s.search,method:"GET",headers:t?{Authorization:`Bearer ${t}`}:{}};re.get(n,i=>{if(i.statusCode>=300&&i.statusCode<400&&i.headers.location)return this.fetchWithAuth(i.headers.location,t).then(o).catch(r);let a="";i.on("data",l=>{a+=l}),i.on("end",()=>o({status:i.statusCode,body:a}))}).on("error",r)})}async handle({skillsSubcommand:e,skillsArg:t,skillsRemainingArgs:o,apikey:r}){if(!e||e==="--help"||e==="-h")return this.showHelp(),0;if(e==="publish")return await this.publish(o||[],r);if(e==="unpublish")return await this.unpublish(t,r);if(e==="list")return await this.listTeamSkills(o||[],r);if(e==="my-skills")return await this.listMySkills(o||[],r);if(e==="check-updates"){let s=this.getInstalledSkills();if(s.length===0)return console.log("\u6CA1\u6709\u5DF2\u5B89\u88C5\u7684 skill"),0;console.log(`\u{1F50D} \u68C0\u67E5 ${s.length} \u4E2A skill \u7684\u66F4\u65B0...`);let n=await this.checkUpdates(r);if(n.length===0)console.log("\u2705 \u6240\u6709 skill \u5747\u4E3A\u6700\u65B0\u7248\u672C");else{console.log(`
|
|
21
21
|
\u53D1\u73B0 ${n.length} \u4E2A\u53EF\u66F4\u65B0\u7684 skill:
|
|
22
22
|
`);for(let i of n)console.log(` ${i.name.padEnd(24)} ${i.localVersion} \u2192 ${i.remoteVersion}`);console.log("\n\u8FD0\u884C `coder skills update` \u66F4\u65B0\u5168\u90E8")}return 0}if(t&&e!=="search"&&!/^[@a-zA-Z0-9_\-/.]+$/.test(t))return console.error("\u274C skill \u540D\u79F0\u5305\u542B\u975E\u6CD5\u5B57\u7B26"),1;if(e==="search")return t?await this.search(t):(console.error("\u274C \u8BF7\u6307\u5B9A\u641C\u7D22\u5173\u952E\u8BCD"),1);if(e==="remove")return t?this.remove(t):(console.error("\u274C \u8BF7\u6307\u5B9A skill \u540D\u79F0"),1);if(e==="add")return t?r?await this.install(t,r):(console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder auth login"),1):(console.error("\u274C \u8BF7\u6307\u5B9A skill \u540D\u79F0"),1);if(e==="update"){if(!r)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder auth login"),1;if(t)return await this.install(t,r);console.log("\u{1F50D} \u68C0\u67E5\u53EF\u66F4\u65B0\u7684 skill...");let s=await this.checkUpdates(r);if(s.length===0)return console.log("\u2705 \u6240\u6709 skill \u5747\u4E3A\u6700\u65B0\u7248\u672C"),0;console.log(`\u{1F4E6} \u53D1\u73B0 ${s.length} \u4E2A\u53EF\u66F4\u65B0\u7684 skill\uFF0C\u5F00\u59CB\u66F4\u65B0...
|
|
23
|
-
`);let n=0,i=0,
|
|
24
|
-
\u66F4\u65B0\u5B8C\u6210: ${n} \u6210\u529F, ${i} \u5931\u8D25`);try{let l=C.join(
|
|
23
|
+
`);let n=0,i=0,a=!1;for(let l of s){let d=await this.install(l.name,r);d==="EACCES"?(a=!0,i++):d!==0?i++:n++}console.log(`
|
|
24
|
+
\u66F4\u65B0\u5B8C\u6210: ${n} \u6210\u529F, ${i} \u5931\u8D25`);try{let l=C.join(V.homedir(),".agents","skills",".update-cache.json");x.existsSync(l)&&x.unlinkSync(l)}catch{}if(a){let l=this.getSkillDirs()[0];console.error(`
|
|
25
25
|
\u26A0\uFE0F \u90E8\u5206 skill \u6743\u9650\u4E0D\u8DB3\uFF0C\u8BF7\u5148\u8FD0\u884C:
|
|
26
|
-
sudo chown -R $(whoami) "${l}"`)}return i>0?1:0}return console.error(`\u274C \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),1}async install(e,t){let o=
|
|
27
|
-
`);for(let
|
|
26
|
+
sudo chown -R $(whoami) "${l}"`)}return i>0?1:0}return console.error(`\u274C \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),1}async install(e,t){let o=P.replace(/\/$/,"");console.log(`\u{1F50D} \u6B63\u5728\u4ECE ${P} \u67E5\u627E skill...`);let r;try{let u=await this.fetchWithAuth(`${o}/.well-known/agent-skills/index.json?skill=${encodeURIComponent(e)}`,t);if(u.status===404)return console.error(`\u274C \u672A\u627E\u5230 skill: ${e}`),1;if(u.status!==200)return console.error(`\u274C \u65E0\u6CD5\u83B7\u53D6 skill \u4FE1\u606F (HTTP ${u.status})`),1;r=JSON.parse(u.body)}catch(u){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${u.message}`),1}let s=(r.skills||[])[0];if(!s)return console.error(`\u274C \u672A\u627E\u5230 skill: ${e}`),1;let n=Array.from(new Set(["SKILL.md",...s.files||[]])),i=`${o}/.well-known/agent-skills/${s.name}`,a={};for(let u of n)try{let m=await this.fetchWithAuth(`${i}/${u}`,t);if(m.status!==200){console.warn(`\u26A0\uFE0F \u8DF3\u8FC7 ${u} (HTTP ${m.status})`);continue}a[u]=m.body}catch(m){console.warn(`\u26A0\uFE0F \u4E0B\u8F7D ${u} \u5931\u8D25: ${m.message}`)}console.log(`\u{1F4E6} \u6B63\u5728\u5B89\u88C5 ${s.name}...`);let l={name:s.name,version:s.version||null,installedAt:new Date().toISOString()};for(let u of this.getSkillDirs()){let m=C.join(u,s.name);x.mkdirSync(m,{recursive:!0});try{for(let[p,f]of Object.entries(a)){let h=C.join(m,p);x.mkdirSync(C.dirname(h),{recursive:!0}),x.writeFileSync(h,f,"utf8")}x.writeFileSync(C.join(m,".skill-meta.json"),JSON.stringify(l,null,2),"utf8")}catch(p){if(p.code==="EACCES")return"EACCES";throw p}}let d=s.version?` (v${s.version})`:"";return console.log(`\u2705 ${s.name}${d} \u5B89\u88C5\u5B8C\u6210`),this.cleanLegacySkill(s.name),0}cleanLegacySkill(e){let t=V.homedir(),o=[".claude",".codex",".gemini"].map(r=>C.join(t,r,"skills",e));for(let r of o)if(x.existsSync(r))try{x.rmSync(r,{recursive:!0,force:!0})}catch{}}getInstalledSkills(){let e=[];for(let t of this.getSkillDirs())if(x.existsSync(t))for(let o of x.readdirSync(t,{withFileTypes:!0})){if(!o.isDirectory()||o.name.startsWith("."))continue;let r=C.join(t,o.name),s=C.join(r,".skill-meta.json"),n=null;if(x.existsSync(s))try{n=JSON.parse(x.readFileSync(s,"utf8"))}catch{}e.push({name:o.name,dir:r,meta:n})}return e}async checkUpdates(e){let t=this.getInstalledSkills();if(t.length===0)return[];let o=P.replace(/\/$/,""),r=[];for(let s of t){let n=s.meta?.version||"0.0.1";try{let i=await this.fetchWithAuth(`${o}/.well-known/agent-skills/index.json?skill=${encodeURIComponent(s.name)}`,e);if(i.status===404||i.status!==200)continue;let l=(JSON.parse(i.body).skills||[])[0];if(!l?.version)continue;l.version!==n&&r.push({name:s.name,localVersion:n,remoteVersion:l.version})}catch{}}return r}notifyAndRefreshUpdates(e){let t=C.join(V.homedir(),".agents","skills",".update-cache.json");if(!Et())try{if(x.existsSync(t)){let n=JSON.parse(x.readFileSync(t,"utf8"));if(Array.isArray(n.updates)&&n.updates.length>0){let a=n.updates.length,l;if(a<=3)l=n.updates.map(d=>`${d.name} (${d.localVersion} \u2192 ${d.remoteVersion})`).join(", ");else{let d=n.updates[0];l=`${d.name} (${d.localVersion} \u2192 ${d.remoteVersion}) \u7B49 ${a} \u4E2A skill \u8981\u66F4\u65B0`}console.error(`\x1B[33m\u26A1 ${l}\uFF0C\u8FD0\u884C \`coder skills update\` \u5347\u7EA7\x1B[0m`),a>3&&console.error("\x1B[33m \u8FD0\u884C `coder skills check-updates` \u67E5\u770B\u5B8C\u6574\u5217\u8868\x1B[0m"),console.error()}}}catch{}let o=3600*1e3,r=0;try{r=JSON.parse(x.readFileSync(t,"utf8")).checkedAt||0}catch{}!this.getInstalledSkills().some(n=>!n.meta?.version)&&Date.now()-r<o||setImmediate(async()=>{try{let n=await this.checkUpdates(e);x.mkdirSync(C.dirname(t),{recursive:!0}),x.writeFileSync(t,JSON.stringify({checkedAt:Date.now(),updates:n},null,2),"utf8")}catch{}})}remove(e){let t=!1;for(let o of this.getSkillDirs()){let r=C.join(o,e);x.existsSync(r)&&(x.rmSync(r,{recursive:!0,force:!0}),console.log(` \u{1F5D1}\uFE0F ${r}`),t=!0)}return t?(console.log(`\u2705 ${e} \u5DF2\u5220\u9664`),0):(console.error(`\u274C \u672A\u627E\u5230\u5DF2\u5B89\u88C5\u7684 skill: ${e}`),1)}async search(e){let t=`${P}/api/web/skills?q=${encodeURIComponent(e)}&sort=relevance&page=0&size=12`;return new Promise(o=>{re.get(t,r=>{let s="";r.on("data",n=>{s+=n}),r.on("end",()=>{try{let n=JSON.parse(s);if(n.code!==0)return console.error(`\u274C \u67E5\u8BE2\u5931\u8D25: ${n.msg}`),o(1);let i=n.data.items;if(i.length===0)return console.log(`\u6CA1\u6709\u627E\u5230\u4E0E "${e}" \u76F8\u5173\u7684 skill`),o(0);console.log(`\u627E\u5230 ${n.data.total} \u4E2A\u7ED3\u679C:
|
|
27
|
+
`);for(let a of i)console.log(` ${a.slug.padEnd(20)} ${a.summary}`);o(0)}catch(n){console.error(`\u274C \u89E3\u6790\u54CD\u5E94\u5931\u8D25: ${n.message}`),o(1)}})}).on("error",r=>{console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${r.message}`),o(1)})})}async publish(e,t){let{execSync:o}=require("child_process"),r=require("os"),s=null,n="PUBLIC",i=null,a=null,l=null,d=null;for(let y=0;y<e.length;y++)if(e[y]==="--team"||e[y]==="-t"||e[y]==="--namespace"||e[y]==="-n")s=e[++y];else if(e[y]==="--visibility"||e[y]==="-v")n=e[++y];else if(e[y]==="--meta-data"){let b=e[++y];try{JSON.parse(b)}catch(g){return console.error(`\u274C --meta-data \u4E0D\u662F\u5408\u6CD5\u7684 JSON\uFF1A${g.message}`),1}i=b}else if(!e[y].startsWith("-")){let b=e[y];x.existsSync(b)&&x.statSync(b).isDirectory()?d=b:a=b}let u=this._resolveNamespace(s),m=u==="global";if(!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder auth login"),1;m||(n="NAMESPACE_ONLY");let p=["PUBLIC","NAMESPACE_ONLY","PRIVATE"];if(!p.includes(n))return console.error(`\u274C visibility \u5FC5\u987B\u662F: ${p.join(", ")}`),1;if(a){if(!x.existsSync(a))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${a}`),1}else{let y=d?C.resolve(d):process.cwd();l=C.join(r.tmpdir(),`skill-pub-${Date.now()}.zip`),console.log(`\u{1F4E6} \u6B63\u5728\u6253\u5305 ${y}...`);try{x.existsSync(C.join(y,".git"))?(o(`git archive -o "${l}" HEAD`,{cwd:y,stdio:"pipe"}),console.log(" \u4F7F\u7528 git archive\uFF08\u5DF2\u6392\u9664 .gitignore \u6587\u4EF6\uFF09")):o(`zip -r "${l}" . -x ".git/*" -x "node_modules/*" -x ".env" -x "*.log"`,{cwd:y,stdio:"pipe"})}catch(b){return console.error(`\u274C \u6253\u5305\u5931\u8D25: ${b.message}`),1}a=l}let f=`${P}/api/v1/skills/${encodeURIComponent(u)}/publish?visibility=${encodeURIComponent(n)}`,h=t;console.log(`\u{1F680} \u6B63\u5728\u53D1\u5E03\u5230 ${P}`),console.log(` team: ${u}`),console.log(` visibility: ${n}`);try{let y=i?` -F "meta_data=${i.replace(/"/g,'\\"')}"`:"",b=`curl -s -X POST "${f}" -H "Authorization: Bearer ${h}" -F "file=@${a}"${y}`,g=o(b,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),I=JSON.parse(g);if(I.code===0){let $=I.data,k=$.namespace==="global"?`https://makecoder.com/skillhub/${$.slug}`:`https://makecoder.com/skillhub/space/${$.namespace}/${$.slug}`;return console.log(`
|
|
28
28
|
\u2705 \u53D1\u5E03\u6210\u529F!`),console.log(` ${$.namespace}--${$.slug}@${$.version}`),console.log(` ${k}`),$.status==="PUBLISHED"?console.log(" \u72B6\u6001: \u5DF2\u53D1\u5E03"):console.log(" \u72B6\u6001: \u5F85\u5BA1\u6838"),0}else return console.error(`
|
|
29
29
|
\u274C \u53D1\u5E03\u5931\u8D25: ${I.msg||JSON.stringify(I)}`),1}catch(y){let b=y.stdout;if(b)try{let g=JSON.parse(b);return console.error(`
|
|
30
|
-
\u274C \u53D1\u5E03\u5931\u8D25: ${g.msg||b}`),1}catch{}return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${y.message}`),1}finally{l&&x.existsSync(l)&&x.unlinkSync(l)}}async unpublish(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A skill: coder skills unpublish <slug> \u6216 coder skills unpublish <teamId>--<slug>"),1;if(!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder auth login"),1;let o,r;if(e.includes("--")){let n=e.split("--");if(n.length!==2||!n[0]||!n[1])return console.error("\u274C \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <slug> \u6216 <teamId>--<slug>\uFF0C\u4F8B\u5982: my-skill \u6216 12680de5--my-skill"),1;o=this._resolveNamespace(n[0]),r=n[1]}else o=this._resolveNamespace(null),r=e;let s=`/api/v1/skills/${encodeURIComponent(o)}/${encodeURIComponent(r)}`;console.log(`\u{1F5D1}\uFE0F \u6B63\u5728\u4E0B\u67B6 ${o}--${r}`);try{let n=await this._request("DELETE",s,t),i=JSON.parse(n.body);return i.code===0?(console.log(`\u2705 \u5DF2\u4E0B\u67B6 ${o}--${r}`),0):(console.error(`\u274C \u4E0B\u67B6\u5931\u8D25: ${i.msg||JSON.stringify(i)}`),1)}catch(n){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${n.message}`),1}}async listTeamSkills(e,t){let o=0,r=20,s=null;for(let d=0;d<e.length;d++)(e[d]==="--page"||e[d]==="-p")&&e[d+1]?o=parseInt(e[++d],10):(e[d]==="--size"||e[d]==="-s")&&e[d+1]?r=parseInt(e[++d],10):(e[d]==="--team"||e[d]==="-t")&&e[d+1]&&(s=e[++d]);let n=this._resolveNamespace(s),i=n==="global",
|
|
31
|
-
`);for(let
|
|
32
|
-
\u4E0B\u4E00\u9875: coder skills list --page ${o+1}`),0}catch(d){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${d.message}`),1}}async listMySkills(e,t){let o=0,r=50;for(let s=0;s<e.length;s++)(e[s]==="--page"||e[s]==="-p")&&e[s+1]?o=parseInt(e[++s],10):(e[s]==="--size"||e[s]==="-s")&&e[s+1]&&(r=parseInt(e[++s],10));if(!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder auth login"),1;try{let s=await this._request("GET",`/api/web/me/skills?page=${o}&size=${r}`,t),n=JSON.parse(s.body);if(n.code!==0)return console.error(`\u274C \u83B7\u53D6\u5931\u8D25: ${n.msg}`),1;let i=n.data?.items||[],
|
|
30
|
+
\u274C \u53D1\u5E03\u5931\u8D25: ${g.msg||b}`),1}catch{}return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${y.message}`),1}finally{l&&x.existsSync(l)&&x.unlinkSync(l)}}async unpublish(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A skill: coder skills unpublish <slug> \u6216 coder skills unpublish <teamId>--<slug>"),1;if(!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder auth login"),1;let o,r;if(e.includes("--")){let n=e.split("--");if(n.length!==2||!n[0]||!n[1])return console.error("\u274C \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <slug> \u6216 <teamId>--<slug>\uFF0C\u4F8B\u5982: my-skill \u6216 12680de5--my-skill"),1;o=this._resolveNamespace(n[0]),r=n[1]}else o=this._resolveNamespace(null),r=e;let s=`/api/v1/skills/${encodeURIComponent(o)}/${encodeURIComponent(r)}`;console.log(`\u{1F5D1}\uFE0F \u6B63\u5728\u4E0B\u67B6 ${o}--${r}`);try{let n=await this._request("DELETE",s,t),i=JSON.parse(n.body);return i.code===0?(console.log(`\u2705 \u5DF2\u4E0B\u67B6 ${o}--${r}`),0):(console.error(`\u274C \u4E0B\u67B6\u5931\u8D25: ${i.msg||JSON.stringify(i)}`),1)}catch(n){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${n.message}`),1}}async listTeamSkills(e,t){let o=0,r=20,s=null;for(let d=0;d<e.length;d++)(e[d]==="--page"||e[d]==="-p")&&e[d+1]?o=parseInt(e[++d],10):(e[d]==="--size"||e[d]==="-s")&&e[d+1]?r=parseInt(e[++d],10):(e[d]==="--team"||e[d]==="-t")&&e[d+1]&&(s=e[++d]);let n=this._resolveNamespace(s),i=n==="global",a=i?"":`&namespace=${encodeURIComponent(n)}`,l=`/api/web/skills?sort=newest&page=${o}&size=${r}${a}`;try{let d=await this._request("GET",l,t),u=JSON.parse(d.body);if(u.code!==0)return console.error(`\u274C \u83B7\u53D6\u5931\u8D25: ${u.msg}`),1;let m=u.data?.items||[],p=u.data?.total||0,f=i?"\u516C\u5171":`\u56E2\u961F ${n}`;if(m.length===0)return console.log(`${f} \u4E0B\u6682\u65E0 skill`),0;console.log(`${f} \u5171 ${p} \u4E2A skill\uFF08\u7B2C ${o+1} \u9875\uFF09:
|
|
31
|
+
`);for(let h of m){let y=`${h.slug}`.padEnd(28),b=`\u2B50 ${h.starCount??0}`.padEnd(8),g=`\u2193 ${h.downloadCount??0}`.padEnd(10);console.log(` ${y} ${b} ${g} ${h.summary||""}`)}return(o+1)*r<p&&console.log(`
|
|
32
|
+
\u4E0B\u4E00\u9875: coder skills list --page ${o+1}`),0}catch(d){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${d.message}`),1}}async listMySkills(e,t){let o=0,r=50;for(let s=0;s<e.length;s++)(e[s]==="--page"||e[s]==="-p")&&e[s+1]?o=parseInt(e[++s],10):(e[s]==="--size"||e[s]==="-s")&&e[s+1]&&(r=parseInt(e[++s],10));if(!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder auth login"),1;try{let s=await this._request("GET",`/api/web/me/skills?page=${o}&size=${r}`,t),n=JSON.parse(s.body);if(n.code!==0)return console.error(`\u274C \u83B7\u53D6\u5931\u8D25: ${n.msg}`),1;let i=n.data?.items||[],a=n.data?.total||0;if(i.length===0)return console.log("\u6682\u65E0\u5DF2\u53D1\u5E03\u7684 skill"),0;console.log(`\u5171 ${a} \u4E2A skill:
|
|
33
33
|
`);for(let l of i){let d=`${l.namespace==="global"?"":"--"}${l.slug}`.padEnd(36),u=`\u2B50 ${l.starCount??0}`.padEnd(8),m=`\u2193 ${l.downloadCount??0}`.padEnd(10);console.log(` ${d} ${u} ${m} [${l.status}]`),l.displayName&&l.displayName!==l.slug&&console.log(` ${"".padEnd(36)} ${l.displayName}`)}return 0}catch(s){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${s.message}`),1}}showHelp(){console.log(["Usage: coder skills [subcommand] [options]","","\u2139\uFE0F Skill \u540D\u79F0\u683C\u5F0F:"," \u516C\u5171 skill \u76F4\u63A5\u7528 slug\uFF0C\u4F8B\u5982: vue"," \u56E2\u961F\u79C1\u6709 skill \u9700\u52A0\u56E2\u961F\u524D\u7F00: <teamId>--<slug>\uFF0C\u4F8B\u5982: 12680de5--my-skill"," teamId \u4E3A\u56E2\u961F ID \u524D 8 \u4F4D\uFF0C\u8FD0\u884C `coder team list` \u67E5\u770B","","Global Options:"," --team <teamId> \u6307\u5B9A\u56E2\u961F\uFF08\u9ED8\u8BA4\u4F7F\u7528 coder team use \u8BBE\u7F6E\u7684\u56E2\u961F\uFF09","","Subcommands:"," add <name> \u5B89\u88C5 skill"," remove <name> \u5378\u8F7D skill"," update [name] \u66F4\u65B0 skill\uFF08\u4E0D\u6307\u5B9A\u540D\u79F0\u5219\u66F4\u65B0\u5168\u90E8\uFF09"," check-updates \u68C0\u67E5\u5DF2\u5B89\u88C5 skill \u662F\u5426\u6709\u65B0\u7248\u672C"," search <keyword> \u641C\u7D22 skill"," list [--page <n>] [--size <n>] [--team <id>] \u5217\u51FA\u5F53\u524D\u56E2\u961F\u4E0B\u7684 skill"," my-skills [--page <n>] [--size <n>] \u67E5\u770B\u6211\u53D1\u5E03\u7684 skill"," publish [options] [<dir-or-zip>] \u53D1\u5E03 skill \u5230 skillhub"," unpublish <slug> \u4E0B\u67B6 skill\uFF08\u4F7F\u7528\u9ED8\u8BA4\u56E2\u961F\uFF09","","Publish Options:"," --team <teamId> \u76EE\u6807\u56E2\u961F\uFF08\u9ED8\u8BA4: \u5F53\u524D\u56E2\u961F\uFF0C\u65E0\u56E2\u961F\u65F6\u53D1\u5E03\u5230\u516C\u5171\uFF09"," --visibility <v> \u53EF\u89C1\u6027: PUBLIC | NAMESPACE_ONLY | PRIVATE"," \uFF08\u9ED8\u8BA4: PUBLIC\uFF0C\u56E2\u961F skill \u81EA\u52A8\u9501\u5B9A\u4E3A NAMESPACE_ONLY\uFF09"," --meta-data <json> \u9644\u52A0\u81EA\u5B9A\u4E49\u5143\u6570\u636E JSON","","Examples:"," coder skills add vue \u5B89\u88C5\u516C\u5171 skill"," coder skills add 12680de5--my-skill \u5B89\u88C5\u56E2\u961F\u79C1\u6709 skill"," coder skills search react \u641C\u7D22 skill"," coder skills list \u5217\u51FA\u5F53\u524D\u56E2\u961F\u7684 skill"," coder skills list --page 1 \u7B2C\u4E8C\u9875"," coder skills my-skills \u67E5\u770B\u6211\u53D1\u5E03\u7684 skill"," coder skills publish ./my-skill-dir \u53D1\u5E03\uFF08\u81EA\u52A8\u4F7F\u7528\u9ED8\u8BA4\u56E2\u961F\uFF09"," coder skills publish --team 12680de5 ./my-skill-dir \u53D1\u5E03\u5230\u6307\u5B9A\u56E2\u961F"," coder skills publish --visibility PRIVATE my-skill.zip",` coder skills publish --meta-data '{"category":"tool"}' ./my-skill-dir`," coder skills unpublish my-skill \u4E0B\u67B6\uFF08\u4F7F\u7528\u9ED8\u8BA4\u56E2\u961F\uFF09"," coder skills unpublish 12680de5--my-skill \u4E0B\u67B6\u6307\u5B9A\u56E2\u961F\u7684 skill"].join(`
|
|
34
|
-
`))}};
|
|
34
|
+
`))}};Fe.exports=ne});var Ge=_((bo,Je)=>{var Dt=require("https"),K="https://makecoder.com/wiki",Ot=`${K}/api`,D=c=>`${K}/doc/${c}`,se=c=>`${K}/collection/${c}`;function At(c){return c.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}var Tt={"collection-info":{endpoint:"collections.info",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",buildBody:c=>({id:c}),print:c=>{let e=c.data;console.log(`ID: ${e.id}
|
|
35
35
|
\u540D\u79F0: ${e.name}
|
|
36
36
|
\u63CF\u8FF0: ${e.description||""}
|
|
37
|
-
\u6743\u9650: ${e.permission||"null"}`)}},"collection-members":{endpoint:"collections.memberships",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",buildBody:(
|
|
37
|
+
\u6743\u9650: ${e.permission||"null"}`)}},"collection-members":{endpoint:"collections.memberships",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",buildBody:(c,e)=>{let t={id:c},o=e.indexOf("--query");o!==-1&&(t.query=e[o+1]);let r=e.indexOf("--permission");return r!==-1&&(t.permission=e[r+1]),t},print:(c,e)=>{let t=c.data?.memberships||c.data||[];if(!t.length){console.log("\u6682\u65E0\u6210\u5458");return}e.printTable(t.map(o=>({userId:o.userId||"",\u59D3\u540D:o.user?.name||"",\u6743\u9650:o.permission||""})))}},"collection-add-user":{endpoint:"collections.add_user",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>{let t={id:c,userId:e[1]},o=e.indexOf("--permission");return o!==-1&&(t.permission=e[o+1]),t},print:()=>console.log("\u2705 \u5DF2\u6DFB\u52A0\u7528\u6237\u5230\u96C6\u5408")},"collection-remove-user":{endpoint:"collections.remove_user",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>({id:c,userId:e[1]}),expectOk:!0,print:()=>console.log("\u2705 \u5DF2\u4ECE\u96C6\u5408\u79FB\u9664\u7528\u6237")},"collection-add-group":{endpoint:"collections.add_group",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>{let t={id:c,groupId:e[1]},o=e.indexOf("--permission");return o!==-1&&(t.permission=e[o+1]),t},print:()=>console.log("\u2705 \u5DF2\u6DFB\u52A0\u7FA4\u7EC4\u5230\u96C6\u5408")},"collection-remove-group":{endpoint:"collections.remove_group",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>({id:c,groupId:e[1]}),expectOk:!0,print:()=>console.log("\u2705 \u5DF2\u4ECE\u96C6\u5408\u79FB\u9664\u7FA4\u7EC4")},"collection-group-members":{endpoint:"collections.group_memberships",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",buildBody:c=>({id:c}),print:(c,e)=>{let t=c.data?.groupMemberships||c.data||[];if(!t.length){console.log("\u6682\u65E0\u7FA4\u7EC4\u6210\u5458");return}e.printTable(t.map(o=>({groupId:o.groupId||"",\u7FA4\u7EC4\u540D:o.group?.name||"",\u6743\u9650:o.permission||""})))}},"collection-export":{endpoint:"collections.export",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",buildBody:(c,e)=>{let t={id:c},o=e.indexOf("--format");return o!==-1&&(t.format=e[o+1]),t},print:c=>console.log(`\u2705 \u5BFC\u51FA\u4EFB\u52A1\u5DF2\u521B\u5EFA: ${c.data?.id||""}`)},"export-all":{endpoint:"collections.export_all",buildBody:(c,e)=>{let t={},o=e.indexOf("--format");return o!==-1&&(t.format=e[o+1]),t},print:c=>console.log(`\u2705 \u5168\u91CF\u5BFC\u51FA\u4EFB\u52A1\u5DF2\u521B\u5EFA: ${c.data?.id||""}`)},"collection-move":{endpoint:"collections.move",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u76EE\u6807 index\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>({id:c,index:e[1]}),print:()=>console.log("\u2705 \u96C6\u5408\u5DF2\u79FB\u52A8")},archived:{endpoint:"documents.archived",buildBody:(c,e)=>{let t={},o=e.indexOf("--collection");o!==-1&&(t.collectionId=e[o+1]);let r=e.indexOf("--sort");r!==-1&&(t.sort=e[r+1]);let s=e.indexOf("--direction");return s!==-1&&(t.direction=e[s+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u5DF2\u5F52\u6863\u6587\u6863");return}e.printTable(t.map(o=>({"ID(UUID,\u7528\u4E8EAPI)":o.id,\u6807\u9898:o.title,"URL(\u542BurlId,\u52FF\u7528\u4E8EAPI)":D(o.urlId||o.id)})))}},deleted:{endpoint:"documents.deleted",buildBody:(c,e)=>{let t={},o=e.indexOf("--sort");o!==-1&&(t.sort=e[o+1]);let r=e.indexOf("--direction");return r!==-1&&(t.direction=e[r+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u5DF2\u5220\u9664\u6587\u6863");return}e.printTable(t.map(o=>({ID:o.id,\u6807\u9898:o.title,\u5220\u9664\u65F6\u95F4:o.deletedAt||""})))}},insights:{endpoint:"documents.insights",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:(c,e)=>{let t={id:c},o=e.indexOf("--start-date");o!==-1&&(t.startDate=e[o+1]);let r=e.indexOf("--end-date");return r!==-1&&(t.endDate=e[r+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u8BBF\u95EE\u6570\u636E");return}e.printTable(t.map(o=>({userId:o.userId||"",\u59D3\u540D:o.user?.name||"",\u65F6\u95F4:o.createdAt||""})))}},export:{endpoint:"documents.export",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:(c,e)=>({id:c,includeChildDocuments:e.includes("--include-children")}),print:c=>{let e=c.data;console.log(typeof e=="string"?e:JSON.stringify(e,null,2))}},"search-titles":{endpoint:"documents.search_titles",requireId:"\u274C \u8BF7\u6307\u5B9A\u641C\u7D22\u5173\u952E\u8BCD",buildBody:(c,e)=>({query:[c,...e.slice(1)].join(" ")}),print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u672A\u627E\u5230\u5339\u914D\u6807\u9898");return}e.printTable(t.map(o=>({"ID(UUID,\u7528\u4E8EAPI)":o.id,\u6807\u9898:o.title,"URL(\u542BurlId,\u52FF\u7528\u4E8EAPI)":D(o.urlId||o.id)})))}},duplicate:{endpoint:"documents.duplicate",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:(c,e)=>{let t={id:c},o=e.indexOf("--title");o!==-1&&(t.title=e[o+1]);let r=e.indexOf("--collection");r!==-1&&(t.collectionId=e[r+1]);let s=e.indexOf("--parent");return s!==-1&&(t.parentDocumentId=e[s+1]),e.includes("--recursive")&&(t.recursive=!0),e.includes("--publish")&&(t.publish=!0),t},print:c=>{let t=(c.data?.documents||[])[0];console.log(t?`\u2705 \u6587\u6863\u5DF2\u590D\u5236: ${t.id} \u2014 ${t.title}`:"\u2705 \u6587\u6863\u5DF2\u590D\u5236")}},unpublish:{endpoint:"documents.unpublish",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:c=>({id:c}),print:()=>console.log("\u2705 \u6587\u6863\u5DF2\u53D6\u6D88\u53D1\u5E03")},templatize:{endpoint:"documents.templatize",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:(c,e)=>{let t={id:c,publish:!0},o=e.indexOf("--collection");return o!==-1&&(t.collectionId=e[o+1]),t},print:c=>console.log(`\u2705 \u5DF2\u8F6C\u4E3A\u6A21\u677F: ${c.data.id}`)},"doc-members":{endpoint:"documents.memberships",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:c=>({id:c}),print:(c,e)=>{let t=c.data?.memberships||c.data||[];if(!t.length){console.log("\u6682\u65E0\u6210\u5458");return}e.printTable(t.map(o=>({userId:o.userId||"",\u59D3\u540D:o.user?.name||"",\u6743\u9650:o.permission||""})))}},"doc-add-user":{endpoint:"documents.add_user",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>{let t={id:c,userId:e[1]},o=e.indexOf("--permission");return o!==-1&&(t.permission=e[o+1]),t},print:()=>console.log("\u2705 \u5DF2\u6DFB\u52A0\u7528\u6237\u5230\u6587\u6863")},"doc-remove-user":{endpoint:"documents.remove_user",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>({id:c,userId:e[1]}),expectOk:!0,print:()=>console.log("\u2705 \u5DF2\u4ECE\u6587\u6863\u79FB\u9664\u7528\u6237")},"doc-add-group":{endpoint:"documents.add_group",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>{let t={id:c,groupId:e[1]},o=e.indexOf("--permission");return o!==-1&&(t.permission=e[o+1]),t},print:()=>console.log("\u2705 \u5DF2\u6DFB\u52A0\u7FA4\u7EC4\u5230\u6587\u6863")},"doc-remove-group":{endpoint:"documents.remove_group",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>({id:c,groupId:e[1]}),expectOk:!0,print:()=>console.log("\u2705 \u5DF2\u4ECE\u6587\u6863\u79FB\u9664\u7FA4\u7EC4")},"doc-group-members":{endpoint:"documents.group_memberships",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:c=>({id:c}),print:(c,e)=>{let t=c.data?.groupMemberships||c.data||[];if(!t.length){console.log("\u6682\u65E0\u7FA4\u7EC4\u6210\u5458");return}e.printTable(t.map(o=>({groupId:o.groupId||"",\u7FA4\u7EC4\u540D:o.group?.name||"",\u6743\u9650:o.permission||""})))}},"empty-trash":{endpoint:"documents.empty_trash",buildBody:()=>({}),expectOk:!0,print:()=>console.log("\u2705 \u56DE\u6536\u7AD9\u5DF2\u6E05\u7A7A")},"sub-docs":{endpoint:"documents.documents",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:c=>({id:c}),print:(c,e)=>{let t=c.data?.children||[];if(!t.length){console.log("\u6682\u65E0\u5B50\u6587\u6863");return}e.printTree(t,"",1/0,0)}},shares:{endpoint:"shares.list",buildBody:(c,e)=>{let t={},o=e.indexOf("--document");return o!==-1&&(t.documentId=e[o+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u5206\u4EAB");return}e.printTable(t.map(o=>({shareId:o.id,\u6587\u6863:o.documentTitle||o.documentId||"",\u5DF2\u53D1\u5E03:o.published?"\u662F":"\u5426",URL:o.url||""})))}},"share-info":{endpoint:"shares.info",requireId:"\u274C \u8BF7\u6307\u5B9A\u5206\u4EAB ID",buildBody:c=>({id:c}),print:c=>{let e=c.data;console.log(`ID: ${e.id}
|
|
38
38
|
\u6587\u6863: ${e.documentTitle||e.documentId||""}
|
|
39
39
|
\u5DF2\u53D1\u5E03: ${e.published?"\u662F":"\u5426"}
|
|
40
|
-
URL: ${e.url||""}`)}},share:{endpoint:"shares.create",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:(
|
|
41
|
-
${
|
|
40
|
+
URL: ${e.url||""}`)}},share:{endpoint:"shares.create",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:(c,e)=>({documentId:c,published:e.includes("--published"),includeChildDocuments:e.includes("--include-children")}),print:c=>console.log(`\u2705 \u5206\u4EAB\u5DF2\u521B\u5EFA: ${c.data.id}
|
|
41
|
+
${c.data.url||""}`)},"share-update":{endpoint:"shares.update",requireId:"\u274C \u8BF7\u6307\u5B9A\u5206\u4EAB ID",buildBody:(c,e)=>{let t={id:c};return e.includes("--published")&&(t.published=!0),e.includes("--no-published")&&(t.published=!1),e.includes("--include-children")&&(t.includeChildDocuments=!0),t},print:()=>console.log("\u2705 \u5206\u4EAB\u5DF2\u66F4\u65B0")},unshare:{endpoint:"shares.revoke",requireId:"\u274C \u8BF7\u6307\u5B9A\u5206\u4EAB ID",buildBody:c=>({id:c}),expectOk:!0,print:()=>console.log("\u2705 \u5206\u4EAB\u5DF2\u64A4\u9500")},users:{endpoint:"users.list",buildBody:(c,e)=>{let t={},o=e.indexOf("--query");o!==-1&&(t.query=e[o+1]);let r=e.indexOf("--filter");return r!==-1&&(t.filter=e[r+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u7528\u6237");return}e.printTable(t.map(o=>({ID:o.id,\u59D3\u540D:o.name,\u90AE\u7BB1:o.email||"",\u89D2\u8272:o.role||""})))}},"user-info":{endpoint:"users.info",requireId:"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID",buildBody:c=>({id:c}),print:c=>{let e=c.data;console.log(`ID: ${e.id}
|
|
42
42
|
\u59D3\u540D: ${e.name}
|
|
43
43
|
\u90AE\u7BB1: ${e.email||""}
|
|
44
|
-
\u89D2\u8272: ${e.role||""}`)}},invite:{endpoint:"users.invite",buildBody:(
|
|
44
|
+
\u89D2\u8272: ${e.role||""}`)}},invite:{endpoint:"users.invite",buildBody:(c,e)=>{let t=e.indexOf("--email"),o=e.indexOf("--name"),r=e.indexOf("--role"),s=t!==-1?e[t+1]:c||e[0],n=o!==-1?e[o+1]:e[1],i=r!==-1?e[r+1]:e[2];return{invites:[{email:s,name:n,role:i}]}},requireArgs:(c,e)=>{let t=e.indexOf("--email");return!(t!==-1?e[t+1]:c||e[0])&&"\u274C \u8BF7\u6307\u5B9A\u90AE\u7BB1\uFF08\u7B2C\u4E00\u4E2A\u53C2\u6570\u6216 --email\uFF09"},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u2705 \u9080\u8BF7\u5DF2\u53D1\u9001");return}e.printTable(t.map(o=>({ID:o.id,\u90AE\u7BB1:o.email||"",\u59D3\u540D:o.name||""})))}},"user-update-role":{endpoint:"users.update_role",requireId:"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u89D2\u8272\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF1Aadmin|member|viewer\uFF09",buildBody:(c,e)=>({id:c,role:e[1]}),print:()=>console.log("\u2705 \u7528\u6237\u89D2\u8272\u5DF2\u66F4\u65B0")},"user-suspend":{endpoint:"users.suspend",requireId:"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID",buildBody:c=>({id:c}),print:()=>console.log("\u2705 \u7528\u6237\u5DF2\u6682\u505C")},"user-activate":{endpoint:"users.activate",requireId:"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID",buildBody:c=>({id:c}),print:()=>console.log("\u2705 \u7528\u6237\u5DF2\u6FC0\u6D3B")},groups:{endpoint:"groups.list",buildBody:(c,e)=>{let t={},o=e.indexOf("--query");return o!==-1&&(t.query=e[o+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u7FA4\u7EC4");return}e.printTable(t.map(o=>({ID:o.id,\u540D\u79F0:o.name,\u6210\u5458\u6570:o.memberCount??""})))}},"group-info":{endpoint:"groups.info",requireId:"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID",buildBody:c=>({id:c}),print:c=>{let e=c.data;console.log(`ID: ${e.id}
|
|
45
45
|
\u540D\u79F0: ${e.name}
|
|
46
|
-
\u6210\u5458: ${e.memberCount??""}`)}},"create-group":{endpoint:"groups.create",requireId:"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4\u540D\u79F0",buildBody:(
|
|
46
|
+
\u6210\u5458: ${e.memberCount??""}`)}},"create-group":{endpoint:"groups.create",requireId:"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4\u540D\u79F0",buildBody:(c,e)=>({name:[c,...e.slice(1)].join(" ")}),print:c=>console.log(`\u2705 \u7FA4\u7EC4\u5DF2\u521B\u5EFA: ${c.data.id} \u2014 ${c.data.name}`)},"update-group":{endpoint:"groups.update",requireId:"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID",buildBody:(c,e)=>{let t={id:c},o=e.indexOf("--name");return o!==-1&&(t.name=e[o+1]),t},print:()=>console.log("\u2705 \u7FA4\u7EC4\u5DF2\u66F4\u65B0")},"delete-group":{endpoint:"groups.delete",requireId:"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID",buildBody:c=>({id:c}),expectOk:!0,print:()=>console.log("\u2705 \u7FA4\u7EC4\u5DF2\u5220\u9664")},"group-members":{endpoint:"groups.memberships",requireId:"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID",buildBody:c=>({id:c}),print:(c,e)=>{let t=c.data?.groupMemberships||c.data||[];if(!t.length){console.log("\u6682\u65E0\u6210\u5458");return}e.printTable(t.map(o=>({userId:o.userId||o.user?.id||"",\u59D3\u540D:o.user?.name||""})))}},"group-add-user":{endpoint:"groups.add_user",requireId:"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>({id:c,userId:e[1]}),print:()=>console.log("\u2705 \u5DF2\u6DFB\u52A0\u7528\u6237\u5230\u7FA4\u7EC4")},"group-remove-user":{endpoint:"groups.remove_user",requireId:"\u274C \u8BF7\u6307\u5B9A\u7FA4\u7EC4 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u7528\u6237 ID\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>({id:c,userId:e[1]}),expectOk:!0,print:()=>console.log("\u2705 \u5DF2\u4ECE\u7FA4\u7EC4\u79FB\u9664\u7528\u6237")},views:{endpoint:"views.list",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:c=>({documentId:c}),print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u6D4F\u89C8\u8BB0\u5F55");return}e.printTable(t.map(o=>({userId:o.userId||"",\u59D3\u540D:o.user?.name||"",\u6B21\u6570:o.count??"",\u6700\u8FD1:o.updatedAt||""})))}},view:{endpoint:"views.create",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:c=>({documentId:c}),print:()=>console.log("\u2705 \u6D4F\u89C8\u5DF2\u8BB0\u5F55")},subscriptions:{endpoint:"subscriptions.list",buildBody:(c,e)=>{let t={event:"documents.update"};c&&(t.documentId=c);let o=e.indexOf("--collection");return o!==-1&&(t.collectionId=e[o+1]),t},requireArgs:(c,e)=>!c&&e.indexOf("--collection")===-1&&"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID \u6216 --collection <collectionId>",print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u8BA2\u9605");return}e.printTable(t.map(o=>({ID:o.id,\u6587\u6863:o.documentId||"",\u4E8B\u4EF6:o.event||""})))}},subscribe:{endpoint:"subscriptions.create",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID",buildBody:c=>({documentId:c,event:"documents.update"}),print:c=>console.log(`\u2705 \u5DF2\u8BA2\u9605: ${c.data.id}`)},unsubscribe:{endpoint:"subscriptions.delete",requireId:"\u274C \u8BF7\u6307\u5B9A\u8BA2\u9605 ID",buildBody:c=>({id:c}),expectOk:!0,print:()=>console.log("\u2705 \u5DF2\u53D6\u6D88\u8BA2\u9605")},events:{endpoint:"events.list",buildBody:(c,e)=>{let t={},o=e.indexOf("--actor");o!==-1&&(t.actorId=e[o+1]);let r=e.indexOf("--document");r!==-1&&(t.documentId=e[r+1]);let s=e.indexOf("--collection");s!==-1&&(t.collectionId=e[s+1]);let n=e.indexOf("--type");return n!==-1&&(t.name=e[n+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u4E8B\u4EF6");return}e.printTable(t.map(o=>({\u4E8B\u4EF6:o.name||"",actorId:o.actorId||"",\u65F6\u95F4:o.createdAt||""})))}},templates:{endpoint:"templates.list",buildBody:(c,e)=>{let t={},o=e.indexOf("--collection");return o!==-1&&(t.collectionId=e[o+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u6A21\u677F");return}e.printTable(t.map(o=>({ID:o.id,\u6807\u9898:o.title,\u96C6\u5408:o.collectionId||""})))}},"template-info":{endpoint:"templates.info",requireId:"\u274C \u8BF7\u6307\u5B9A\u6A21\u677F ID",buildBody:c=>({id:c}),print:c=>{let e=c.data;console.log(`ID: ${e.id}
|
|
47
47
|
\u6807\u9898: ${e.title}
|
|
48
|
-
\u96C6\u5408: ${e.collectionId||""}`)}},"create-template":{endpoint:"templates.create",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",requireArgs:(
|
|
48
|
+
\u96C6\u5408: ${e.collectionId||""}`)}},"create-template":{endpoint:"templates.create",requireId:"\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID",requireArgs:(c,e)=>!e[1]&&"\u274C \u8BF7\u6307\u5B9A\u6A21\u677F\u6807\u9898\uFF08\u7B2C\u4E8C\u4E2A\u53C2\u6570\uFF09",buildBody:(c,e)=>{let t=e.indexOf("--text"),o=t!==-1?e[t+1]:"";return{collectionId:c,title:e[1],data:{type:"doc",content:o?[{type:"paragraph",content:[{type:"text",text:o}]}]:[]}}},print:c=>console.log(`\u2705 \u6A21\u677F\u5DF2\u521B\u5EFA: ${c.data.id} \u2014 ${c.data.title}`)},"update-template":{endpoint:"templates.update",requireId:"\u274C \u8BF7\u6307\u5B9A\u6A21\u677F ID",buildBody:(c,e)=>{let t={id:c},o=e.indexOf("--title");o!==-1&&(t.title=e[o+1]);let r=e.indexOf("--text");return r!==-1&&(t.data={type:"doc",content:[{type:"paragraph",content:[{type:"text",text:e[r+1]}]}]}),t},print:()=>console.log("\u2705 \u6A21\u677F\u5DF2\u66F4\u65B0")},"delete-template":{endpoint:"templates.delete",requireId:"\u274C \u8BF7\u6307\u5B9A\u6A21\u677F ID",buildBody:c=>({id:c}),expectOk:!0,print:()=>console.log("\u2705 \u6A21\u677F\u5DF2\u5220\u9664")},"duplicate-template":{endpoint:"templates.duplicate",requireId:"\u274C \u8BF7\u6307\u5B9A\u6A21\u677F ID",buildBody:(c,e)=>{let t={id:c},o=e.indexOf("--title");return o!==-1&&(t.title=e[o+1]),t},print:c=>console.log(`\u2705 \u6A21\u677F\u5DF2\u590D\u5236: ${c.data.id} \u2014 ${c.data.title}`)},"file-ops":{endpoint:"fileOperations.list",buildBody:(c,e)=>{let t={},o=e.indexOf("--type");return o!==-1&&(t.type=e[o+1]),t},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u6587\u4EF6\u64CD\u4F5C\u8BB0\u5F55");return}e.printTable(t.map(o=>({ID:o.id,\u7C7B\u578B:o.type||"",\u72B6\u6001:o.state||"",\u65F6\u95F4:o.createdAt||""})))}},"file-op-info":{endpoint:"fileOperations.info",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u4EF6\u64CD\u4F5C ID",buildBody:c=>({id:c}),print:c=>{let e=c.data;console.log(`ID: ${e.id}
|
|
49
49
|
\u7C7B\u578B: ${e.type||""}
|
|
50
50
|
\u72B6\u6001: ${e.state||""}
|
|
51
|
-
\u65F6\u95F4: ${e.createdAt||""}`)}},"file-op-delete":{endpoint:"fileOperations.delete",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u4EF6\u64CD\u4F5C ID",buildBody:
|
|
52
|
-
${
|
|
51
|
+
\u65F6\u95F4: ${e.createdAt||""}`)}},"file-op-delete":{endpoint:"fileOperations.delete",requireId:"\u274C \u8BF7\u6307\u5B9A\u6587\u4EF6\u64CD\u4F5C ID",buildBody:c=>({id:c}),expectOk:!0,print:()=>console.log("\u2705 \u6587\u4EF6\u64CD\u4F5C\u8BB0\u5F55\u5DF2\u5220\u9664")},reactions:{endpoint:"reactions.list",requireId:"\u274C \u8BF7\u6307\u5B9A\u8BC4\u8BBA ID",buildBody:c=>({commentId:c}),print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u53CD\u5E94");return}e.printTable(t.map(o=>({emoji:o.emoji||"",userId:o.userId||"",\u59D3\u540D:o.user?.name||""})))}},attachments:{endpoint:"attachments.list",buildBody:c=>c?{documentId:c}:{},print:(c,e)=>{let t=c.data||[];if(!t.length){console.log("\u6682\u65E0\u9644\u4EF6");return}e.printTable(t.map(o=>({ID:o.id,\u6587\u4EF6\u540D:o.name,\u7C7B\u578B:o.contentType||"",\u5927\u5C0F:o.size?`${Math.round(o.size/1024)}KB`:"",URL:o.url||""})))}},"delete-attachment":{endpoint:"attachments.delete",requireId:"\u274C \u8BF7\u6307\u5B9A\u9644\u4EF6 ID",buildBody:c=>({id:c}),expectOk:!0,print:()=>console.log("\u2705 \u9644\u4EF6\u5DF2\u5220\u9664")}},ie=class{constructor(e){this.argParser=e||null}post(e,t,o,r){return new Promise((s,n)=>{let i=JSON.stringify(t),a=new URL(`${Ot}/${e}`),l={"Content-Type":"application/json","Content-Length":Buffer.byteLength(i),Authorization:`Bearer ${o}`};r&&(l["X-Team-Id"]=r);let d={hostname:a.hostname,port:a.port||443,path:a.pathname,method:"POST",headers:l},u=Dt.request(d,m=>{let p="";m.on("data",f=>p+=f),m.on("end",()=>s({status:m.statusCode,body:p}))});u.on("error",n),u.write(i),u.end()})}parseJson(e){try{return JSON.parse(e)}catch{return null}}extractTeamFlag(e){let t=e.indexOf("--team");if(t!==-1&&e[t+1]){let o=e[t+1],r=[...e.slice(0,t),...e.slice(t+2)];return{teamId:o,remaining:r}}return{teamId:null,remaining:e}}resolveTeamId(e){let{teamId:t}=this.extractTeamFlag(e);if(t)return t;let o=this.argParser?this.argParser.getTeam():null;return o&&o.id?o.id:null}async handle({wikiSubcommand:e,wikiArg:t,wikiRemainingArgs:o,apikey:r}){if(!e||e==="--help"||e==="-h")return this.showHelp(),0;let s=r;if(!s)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder auth login"),1;let n=o||[],{teamId:i,remaining:a}=this.extractTeamFlag(n);if(!i&&this.argParser&&this.teamService&&!this.argParser.getTeamManual()){let m=this.argParser.getTeam();if(!m||!m.id)try{let p=encodeURIComponent(JSON.stringify({filter_is_joined:!0})),f=await this.teamService.request("GET",`/team?constraints=${p}&page=1&size=200`,s);if(f.status===200){let h=this.teamService.parseJson(f.body),y=h&&h.data&&h.data.items||[];y.length>0&&this.argParser.setTeam(y[0].id,y[0].name||"")}}catch{}}let l=i||(this.argParser?(()=>{let m=this.argParser.getTeam();return m&&m.id?m.id:null})():null),d=At(e);if(typeof this[d]=="function")return await this[d](t,a,s,l);let u=Tt[e];return u?await this._runCommand(u,t,a,s,l):(console.error(`\u274C \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),this.showHelp(),1)}async _runCommand(e,t,o,r,s){if(e.requireId&&!t)return console.error(e.requireId),1;if(e.requireArgs){let l=e.requireArgs(t,o);if(l)return console.error(l),1}let n=e.buildBody(t,o),i=await this.post(e.endpoint,n,r,s),a=this.parseJson(i.body);return e.expectOk?a?.ok===!1||i.status>=400?(console.error("\u274C \u64CD\u4F5C\u5931\u8D25:",i.body),1):(e.print?e.print(a,this):console.log("\u2705 \u64CD\u4F5C\u6210\u529F"),0):a?.data?(e.print(a,this),0):(console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",i.body),1)}async list(e,t,o,r){let s=t.indexOf("-d"),n=s!==-1?parseInt(t[s+1],10):null;if(!e){let d=await this.post("collections.list",{},o,r),u=this.parseJson(d.body);if(!u?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",d.body),1;let m=u.data||[];return m.length?(this.printTable(m.map(p=>({"collectionId(UUID,\u7528\u4E8EAPI)":p.id,\u96C6\u5408\u540D\u79F0:p.name,\u63CF\u8FF0:p.description||"","URL(\u542BurlId,\u52FF\u7528\u4E8EAPI)":se(p.urlId||p.id)}))),0):(console.log("\u6682\u65E0\u96C6\u5408"),0)}if(n===null){let d=await this.post("documents.list",{collectionId:e,sort:"updatedAt",direction:"DESC"},o,r),u=this.parseJson(d.body);if(!u?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",d.body),1;let m=u.data||[];return m.length?(this.printTable(m.map(p=>({"docId(UUID,\u7528\u4E8EAPI)":p.id,\u6807\u9898:p.title,"URL(\u542BurlId,\u52FF\u7528\u4E8EAPI)":D(p.urlId||p.id)}))),0):(console.log("\u6682\u65E0\u6587\u6863"),0)}let i=await this.post("collections.documents",{id:e},o,r),a=this.parseJson(i.body);if(!a?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",i.body),1;let l=n===-1?1/0:n;return this.printTree(a.data,"",l,0),0}async createCollection(e,t,o,r){let s=t.indexOf("--permission"),n="read_write";s!==-1&&(n=t[s+1]||"read_write",t.splice(s,2));let i=t.indexOf("--icon"),a;i!==-1&&(a=t[i+1],t.splice(i,2));let l=t.indexOf("--color"),d;l!==-1&&(d=t[l+1],t.splice(l,2));let u=t.indexOf("--sort-field"),m;u!==-1&&(m=t[u+1],t.splice(u,2));let p=t.indexOf("--sort-direction"),f;p!==-1&&(f=t[p+1],t.splice(p,2));let h=t.indexOf("--index"),y;h!==-1&&(y=t[h+1],t.splice(h,2));let b=e||t[0];if(!b)return console.error("\u274C \u8BF7\u6307\u5B9A\u96C6\u5408\u540D\u79F0"),1;let I=t.slice(1).filter(O=>!O.startsWith("--")).join(" "),$={name:b,description:I,sharing:!0};$.permission=n==="null"||n==="none"?null:n,a&&($.icon=a),d&&($.color=d),(m||f)&&($.sort={field:m||"index",direction:f||"asc"}),y&&($.index=y);let w=await this.post("collections.create",$,o,r),k=this.parseJson(w.body);return k?.data?(console.log(`\u2705 \u96C6\u5408\u5DF2\u521B\u5EFA: ${k.data.id} \u2014 ${k.data.name}
|
|
52
|
+
${se(k.data.urlId||k.data.id)}`),0):(console.error("\u274C \u521B\u5EFA\u5931\u8D25:",w.body),1)}async updateCollection(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID"),1;let s={id:e},n=t.indexOf("--name");n!==-1&&(s.name=t[n+1]);let i=t.indexOf("--description");i!==-1&&(s.description=t[i+1]);let a=t.indexOf("--permission");if(a!==-1){let p=t[a+1];s.permission=p==="null"||p==="none"?null:p}let l=t.indexOf("--color");l!==-1&&(s.color=t[l+1]);let d=t.indexOf("--sharing");if(d!==-1&&(s.sharing=t[d+1]==="true"),Object.keys(s).length<=1)return console.error("\u274C \u8BF7\u81F3\u5C11\u6307\u5B9A\u4E00\u4E2A\u8981\u66F4\u65B0\u7684\u5B57\u6BB5\uFF08--name, --description, --permission, --color, --sharing\uFF09"),1;let u=await this.post("collections.update",s,o,r),m=this.parseJson(u.body);return m?.data?(console.log(`\u2705 \u96C6\u5408\u5DF2\u66F4\u65B0: ${m.data.id} \u2014 ${m.data.name}`),0):(console.error("\u274C \u66F4\u65B0\u96C6\u5408\u5931\u8D25:",u.body),1)}async deleteCollection(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID"),1;let s=await this.post("collections.delete",{id:e},o,r);return this.parseJson(s.body)?.ok===!1||s.status>=400?(console.error("\u274C \u5220\u9664\u96C6\u5408\u5931\u8D25:",s.body),1):(console.log("\u2705 \u96C6\u5408\u5DF2\u5220\u9664"),0)}async archiveCollection(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID"),1;let s=await this.post("collections.archive",{id:e},o,r);return this.parseJson(s.body)?.data?(console.log("\u2705 \u96C6\u5408\u5DF2\u5F52\u6863"),0):(console.error("\u274C \u5F52\u6863\u96C6\u5408\u5931\u8D25:",s.body),1)}async restoreCollection(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u96C6\u5408 ID"),1;let s=await this.post("collections.restore",{id:e},o,r);return this.parseJson(s.body)?.data?(console.log("\u2705 \u96C6\u5408\u5DF2\u6062\u590D"),0):(console.error("\u274C \u6062\u590D\u96C6\u5408\u5931\u8D25:",s.body),1)}async get(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("documents.info",{id:e},o,r),n=this.parseJson(s.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let i=n.data;return console.log(`\u6807\u9898: ${i.title}
|
|
53
53
|
ID: ${i.id}
|
|
54
54
|
\u96C6\u5408: ${i.collectionId}
|
|
55
55
|
\u66F4\u65B0: ${i.updatedAt}`),i.text&&console.log(`
|
|
56
56
|
${i.text}`),0}_findDocPositionInTree(e,t,o=null){for(let r=0;r<e.length;r++){if(e[r].id===t)return{index:r,parentDocumentId:o};if(e[r].children?.length){let s=this._findDocPositionInTree(e[r].children,t,e[r].id);if(s)return s}}return null}async publish(e,t,o,r){let s=require("fs"),n=require("path");if(!e)return console.error(`\u274C \u7528\u6CD5: wiki publish <collectionId> <title> [text]
|
|
57
|
-
wiki publish <collectionId> --file <path> [--parent <parentDocId>] [--index <n>] [--after <docId>]`),1;let i,
|
|
58
|
-
${D($.data.urlId||g)}`),0):(console.error("\u274C \u66F4\u65B0\u5185\u5BB9\u5931\u8D25:",I.body),1)}async update(e,t,o,r){let s=require("fs"),n=require("path");if(!e)return console.error("\u274C \u7528\u6CD5: wiki update <docId> <title> [text] | <docId> --file <path>"),1;let i,
|
|
57
|
+
wiki publish <collectionId> --file <path> [--parent <parentDocId>] [--index <n>] [--after <docId>]`),1;let i,a,l,d=t.indexOf("--file"),u=t.indexOf("--parent");u!==-1&&(l=t[u+1]);let m=t.indexOf("--index"),p=m!==-1?parseInt(t[m+1],10):void 0,f=t.indexOf("--after");if(f!==-1){let w=t[f+1];if(!w)return console.error("\u274C \u8BF7\u6307\u5B9A --after \u7684\u6587\u6863 UUID"),1;let k=await this.post("collections.documents",{id:e},o,r),O=this.parseJson(k.body);if(!O?.data)return console.error("\u274C \u83B7\u53D6\u96C6\u5408\u7ED3\u6784\u5931\u8D25:",k.body),1;let J=this._findDocPositionInTree(O.data,w);if(!J)return console.error(`\u274C \u5728\u96C6\u5408\u4E2D\u672A\u627E\u5230\u6587\u6863 ${w}\uFF0C\u8BF7\u786E\u8BA4 UUID \u6B63\u786E\u4E14\u6587\u6863\u5C5E\u4E8E\u8BE5\u96C6\u5408`),1;p=J.index+1,J.parentDocumentId&&!l&&(l=J.parentDocumentId)}if(d!==-1){let w=t[d+1];if(!w)return console.error("\u274C \u8BF7\u6307\u5B9A --file \u8DEF\u5F84"),1;let k=n.resolve(w);if(!s.existsSync(k))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${k}`),1;a=s.readFileSync(k,"utf8");let O=a.match(/^#\s+(.+)/m);if(!O)return console.error("\u274C \u6587\u4EF6\u7F3A\u5C11 H1 \u6807\u9898\uFF08# \u6807\u9898\uFF09\uFF0C\u8BF7\u6DFB\u52A0\u540E\u91CD\u8BD5"),1;i=O[1].trim(),a=a.replace(/^#\s+.+\n?/,"").trimStart()}else if(i=t[1],a=t.slice(2).join(" "),!i)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6807\u9898"),1;let h={collectionId:e,title:i,text:"",publish:!0};l&&(h.parentDocumentId=l),p!==void 0&&!isNaN(p)&&(h.index=p);let y=await this.post("documents.create",h,o,r),b=this.parseJson(y.body);if(!b?.data)return console.error("\u274C \u521B\u5EFA\u6587\u6863\u5931\u8D25:",y.body),1;let g=b.data.id;console.log(` \u521B\u5EFA\u6587\u6863: ${g}`);let I=await this.post("documents.update",{id:g,title:i,text:a,publish:!0},o,r),$=this.parseJson(I.body);return $?.data?(console.log(`\u2705 \u6587\u6863\u5DF2\u53D1\u5E03: ${$.data.title}
|
|
58
|
+
${D($.data.urlId||g)}`),0):(console.error("\u274C \u66F4\u65B0\u5185\u5BB9\u5931\u8D25:",I.body),1)}async update(e,t,o,r){let s=require("fs"),n=require("path");if(!e)return console.error("\u274C \u7528\u6CD5: wiki update <docId> <title> [text] | <docId> --file <path>"),1;let i,a,l=t.indexOf("--file");if(l!==-1){let p=t[l+1];if(!p)return console.error("\u274C \u8BF7\u6307\u5B9A --file \u8DEF\u5F84"),1;let f=n.resolve(p);if(!s.existsSync(f))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${f}`),1;a=s.readFileSync(f,"utf8");let h=a.match(/^#\s+(.+)/m);if(!h)return console.error("\u274C \u6587\u4EF6\u7F3A\u5C11 H1 \u6807\u9898\uFF08# \u6807\u9898\uFF09\uFF0C\u8BF7\u6DFB\u52A0\u540E\u91CD\u8BD5"),1;i=h[1].trim(),a=a.replace(/^#\s+.+\n?/,"").trimStart()}else if(i=t[1],a=t.slice(2).join(" "),!i)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6807\u9898"),1;let d={id:e,title:i,publish:!0};a&&(d.text=a);let u=await this.post("documents.update",d,o,r),m=this.parseJson(u.body);return m?.data?(console.log(`\u2705 \u6587\u6863\u5DF2\u66F4\u65B0: ${m.data.title}`),0):(console.error("\u274C \u66F4\u65B0\u5931\u8D25:",u.body),1)}async delete(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=t.includes("--permanent"),n=await this.post("documents.delete",{id:e,...s?{permanent:!0}:{}},o,r);return this.parseJson(n.body)?.ok===!1||n.status>=400?(console.error("\u274C \u5220\u9664\u5931\u8D25:",n.body),1):(console.log(`\u2705 \u6587\u6863\u5DF2${s?"\u6C38\u4E45":""}\u5220\u9664`),0)}async move(e,t,o,r){if(!e)return console.error("\u274C \u7528\u6CD5: wiki move <docId> [collectionId] [parentDocId]"),1;let s={id:e,index:0};t[1]&&(s.collectionId=t[1]),t[2]&&(s.parentDocumentId=t[2]);let n=await this.post("documents.move",s,o,r);return this.parseJson(n.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u79FB\u52A8"),0):(console.error("\u274C \u79FB\u52A8\u5931\u8D25:",n.body),1)}async archive(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("documents.archive",{id:e},o,r);return this.parseJson(s.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u5F52\u6863"),0):(console.error("\u274C \u5F52\u6863\u5931\u8D25:",s.body),1)}async restore(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s={id:e},n=t.indexOf("--revision");n!==-1&&t[n+1]&&(s.revisionId=t[n+1]);let i=t.indexOf("--collection");i!==-1&&t[i+1]&&(s.collectionId=t[i+1]);let a=await this.post("documents.restore",s,o,r);return this.parseJson(a.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u6062\u590D"),0):(console.error("\u274C \u6062\u590D\u5931\u8D25:",a.body),1)}async revisions(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("revisions.list",{documentId:e,sort:"createdAt",direction:"DESC"},o,r),n=this.parseJson(s.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let i=n.data||[];return i.length?(this.printTable(i.map(a=>({revisionId:a.id,\u7248\u672C\u540D:a.name||"",\u521B\u5EFA\u65F6\u95F4:a.createdAt}))),0):(console.log("\u6682\u65E0\u5386\u53F2\u7248\u672C"),0)}async revision(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u7248\u672C ID"),1;let s=await this.post("revisions.info",{id:e},o,r),n=this.parseJson(s.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let i=n.data;return console.log(`\u7248\u672C ID: ${i.id}
|
|
59
59
|
\u7248\u672C\u540D: ${i.name||""}
|
|
60
60
|
\u6587\u6863 ID: ${i.documentId}
|
|
61
61
|
\u521B\u5EFA\u65F6\u95F4: ${i.createdAt}`),i.text&&console.log(`
|
|
62
|
-
${i.text}`),0}async drafts(e,t,o,r){let s=await this.post("documents.drafts",{sort:"updatedAt",direction:"DESC"},o,r),n=this.parseJson(s.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let i=n.data||[];return i.length?(this.printTable(i.map(
|
|
63
|
-
`),this.printTable(
|
|
62
|
+
${i.text}`),0}async drafts(e,t,o,r){let s=await this.post("documents.drafts",{sort:"updatedAt",direction:"DESC"},o,r),n=this.parseJson(s.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let i=n.data||[];return i.length?(this.printTable(i.map(a=>({"ID(UUID,\u7528\u4E8EAPI)":a.id,\u6807\u9898:a.title,"URL(\u542BurlId,\u52FF\u7528\u4E8EAPI)":D(a.urlId||a.id)}))),0):(console.log("\u6682\u65E0\u8349\u7A3F"),0)}async recent(e,t,o,r){let s=await this.post("documents.viewed",{sort:"updatedAt",direction:"DESC"},o,r),n=this.parseJson(s.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let i=n.data||[];return i.length?(this.printTable(i.map(a=>({"ID(UUID,\u7528\u4E8EAPI)":a.id,\u6807\u9898:a.title,"URL(\u542BurlId,\u52FF\u7528\u4E8EAPI)":D(a.urlId||a.id)}))),0):(console.log("\u6682\u65E0\u6D4F\u89C8\u8BB0\u5F55"),0)}async search(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u641C\u7D22\u5173\u952E\u8BCD"),1;let s=[e,...t.slice(1)].join(" "),n=await this.post("documents.search",{query:s,snippetMinWords:20,snippetMaxWords:30},o,r),i=this.parseJson(n.body);if(!i?.data)return console.error("\u274C \u641C\u7D22\u5931\u8D25:",n.body),1;let a=i.data||[];return a.length?(console.log(`\u627E\u5230 ${a.length} \u4E2A\u7ED3\u679C:
|
|
63
|
+
`),this.printTable(a.map(l=>{let d=l.document||l;return{"docId(UUID,\u7528\u4E8EAPI)":d.id,\u6807\u9898:d.title,"URL(\u542BurlId,\u52FF\u7528\u4E8EAPI)":D(d.urlId||d.id)}})),0):(console.log(`\u6CA1\u6709\u627E\u5230\u4E0E "${s}" \u76F8\u5173\u7684\u6587\u6863`),0)}async stars(e,t,o,r){let s=await this.post("stars.list",{},o,r),n=this.parseJson(s.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let i=n.data.stars||[];if(!i.length)return console.log("\u6682\u65E0\u6536\u85CF"),0;let a={};for(let l of n.data.documents||[])a[l.id]=l;return this.printTable(i.map(l=>{let d=l.documentId?a[l.documentId]:null,u=l.collectionId?{urlId:l.collectionId}:null;return{starId:l.id,\u6807\u9898:d?.title||l.collectionId||l.documentId||"",URL:d?D(d.urlId||d.id):u?se(u.urlId):l.documentId?D(l.documentId):""}})),0}async star(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6216\u96C6\u5408 ID"),1;let n=t.includes("--collection")?{collectionId:e}:{documentId:e},i=await this.post("stars.create",n,o,r);return this.parseJson(i.body)?.data?(console.log("\u2705 \u5DF2\u6536\u85CF"),0):(console.error("\u274C \u6536\u85CF\u5931\u8D25:",i.body),1)}async unstar(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6536\u85CF ID"),1;let s=await this.post("stars.delete",{id:e},o,r);return s.status>=400?(console.error("\u274C \u53D6\u6D88\u6536\u85CF\u5931\u8D25:",s.body),1):(console.log("\u2705 \u5DF2\u53D6\u6D88\u6536\u85CF"),0)}async pins(e,t,o,r){let s=e?{collectionId:e}:{},n=await this.post("pins.list",s,o,r),i=this.parseJson(n.body);if(!i?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",n.body),1;let a=i.data.pins||[];if(!a.length)return console.log("\u6682\u65E0\u7F6E\u9876"),0;let l={};for(let d of i.data.documents||[])l[d.id]=d;return this.printTable(a.map(d=>{let u=d.documentId?l[d.documentId]:null;return{pinId:d.id,\u6807\u9898:u?.title||d.documentId,URL:D(u?.urlId||d.documentId)}})),0}async pin(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s={documentId:e,...t[1]?{collectionId:t[1]}:{}},n=await this.post("pins.create",s,o,r),i=this.parseJson(n.body);return i?.data?(console.log(`\u2705 \u5DF2\u7F6E\u9876: ${i.data.id}`),0):(console.error("\u274C \u7F6E\u9876\u5931\u8D25:",n.body),1)}async unpin(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u7F6E\u9876 ID"),1;let s=await this.post("pins.delete",{id:e},o,r);return s.status>=400?(console.error("\u274C \u53D6\u6D88\u7F6E\u9876\u5931\u8D25:",s.body),1):(console.log("\u2705 \u5DF2\u53D6\u6D88\u7F6E\u9876"),0)}async comments(e,t,o,r){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("comments.list",{documentId:e,sort:"createdAt",direction:"ASC"},o,r),n=this.parseJson(s.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let i=n.data||[];if(!i.length)return console.log("\u6682\u65E0\u8BC4\u8BBA"),0;for(let a of i){let l=this.extractCommentText(a.data);console.log(` [${a.id}] ${a.createdBy?.name||"?"}: ${l}`)}return 0}async comment(e,t,o,r){let s=t.slice(1).join(" ");if(!e||!s)return console.error("\u274C \u7528\u6CD5: wiki comment <docId> <text>"),1;let n=await this.post("comments.create",{documentId:e,text:s},o,r),i=this.parseJson(n.body);return i?.data?(console.log(`\u2705 \u8BC4\u8BBA\u5DF2\u53D1\u5E03: ${i.data.id}`),0):(console.error("\u274C \u8BC4\u8BBA\u5931\u8D25:",n.body),1)}printTree(e,t,o,r){if(Array.isArray(e))for(let s=0;s<e.length;s++){let n=e[s],i=s===e.length-1,a=i?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",l=n.url?`${K}${n.url}`:D(n.id);console.log(`${t}${a}${n.title||n.id} \x1B[90m${l}\x1B[0m`),n.children?.length&&r+1<o&&this.printTree(n.children,t+(i?" ":"\u2502 "),o,r+1)}}printTable(e){if(!e.length)return;let t=Object.keys(e[0]),o=i=>[...String(i)].reduce((a,l)=>a+(l.charCodeAt(0)>127?2:1),0),r=(i,a)=>i+" ".repeat(Math.max(0,a-o(i))),s=t.map(i=>Math.max(o(i),...e.map(a=>o(a[i]||"")))),n=s.map(i=>"-".repeat(i)).join("-+-");console.log(t.map((i,a)=>r(i,s[a])).join(" | ")),console.log(n);for(let i of e)console.log(t.map((a,l)=>r(String(i[a]||""),s[l])).join(" | "))}icons(e,t){let o=[{name:"academicCap",keywords:"\u5B66\u4E60 \u6559\u5B66 \u8BFE\u7A0B \u6307\u5357 \u6559\u7A0B \u57F9\u8BAD \u5165\u95E8"},{name:"beaker",keywords:"\u5B9E\u9A8C\u5BA4 \u7814\u7A76 \u5B9E\u9A8C \u6D4B\u8BD5"},{name:"bicycle",keywords:"\u81EA\u884C\u8F66 \u9A91\u884C"},{name:"bookmark",keywords:"\u4E66\u7B7E \u6536\u85CF"},{name:"browser",keywords:"\u6D4F\u89C8\u5668 \u7F51\u9875 \u5E94\u7528"},{name:"buildingBlocks",keywords:"\u79EF\u6728 \u6A21\u5757 \u4EA7\u54C1 \u539F\u578B"},{name:"camera",keywords:"\u76F8\u673A \u7167\u7247 \u56FE\u7247"},{name:"carrot",keywords:"\u98DF\u7269 \u852C\u83DC \u519C\u4EA7\u54C1"},{name:"clock",keywords:"\u65F6\u949F \u65F6\u95F4"},{name:"cloud",keywords:"\u4E91 \u4E91\u670D\u52A1 \u57FA\u7840\u8BBE\u65BD"},{name:"code",keywords:"\u4EE3\u7801 \u5F00\u53D1 \u7F16\u7A0B \u5DE5\u7A0B API"},{name:"coins",keywords:"\u91D1\u5E01 \u91D1\u94B1 \u8D22\u52A1 \u9500\u552E \u6536\u5165 \u73B0\u91D1"},{name:"collection",keywords:"\u96C6\u5408 \u6587\u4EF6\u5939"},{name:"database",keywords:"\u6570\u636E\u5E93 \u670D\u52A1\u5668 \u8FD0\u7EF4"},{name:"done",keywords:"\u5B8C\u6210 \u6210\u529F \u52FE\u9009 \u7ED3\u675F"},{name:"email",keywords:"\u90AE\u4EF6 \u90AE\u7BB1"},{name:"eye",keywords:"\u773C\u775B \u67E5\u770B \u9884\u89C8"},{name:"feedback",keywords:"\u53CD\u9988 \u5E2E\u52A9 \u652F\u6301 FAQ"},{name:"flame",keywords:"\u706B\u7130 \u70ED\u95E8"},{name:"globe",keywords:"\u5730\u7403 \u7FFB\u8BD1 \u56FD\u9645\u5316"},{name:"graph",keywords:"\u56FE\u8868 \u5206\u6790 \u6570\u636E \u7EDF\u8BA1"},{name:"hashtag",keywords:"\u6807\u7B7E \u8BDD\u9898 \u793E\u4EA4\u5A92\u4F53"},{name:"icecream",keywords:"\u51B0\u6DC7\u6DCB \u751C\u70B9 \u98DF\u7269"},{name:"image",keywords:"\u56FE\u7247 \u56FE\u50CF \u7167\u7247"},{name:"info",keywords:"\u4FE1\u606F \u8BF4\u660E"},{name:"internet",keywords:"\u7F51\u7EDC \u5168\u7403 \u4E92\u8054\u7F51"},{name:"leaf",keywords:"\u53F6\u5B50 \u690D\u7269 \u81EA\u7136 \u751F\u6001 \u73AF\u5883"},{name:"letter",keywords:"\u5B57\u6BCD \u4FE1\u4EF6"},{name:"library",keywords:"\u56FE\u4E66\u9986 \u6587\u5E93 \u5F52\u6863"},{name:"lightbulb",keywords:"\u706F\u6CE1 \u60F3\u6CD5 \u521B\u610F"},{name:"lightning",keywords:"\u95EA\u7535 \u5FEB\u901F"},{name:"math",keywords:"\u6570\u5B66 \u516C\u5F0F"},{name:"moon",keywords:"\u6708\u4EAE \u591C\u665A \u6697\u8272"},{name:"notepad",keywords:"\u8BB0\u4E8B\u672C \u7B14\u8BB0 \u65E5\u5FD7 \u5199\u4F5C"},{name:"padlock",keywords:"\u9501 \u79C1\u5BC6 \u5B89\u5168 \u8BA4\u8BC1 \u6743\u9650"},{name:"palette",keywords:"\u8C03\u8272\u677F \u8BBE\u8BA1 \u827A\u672F \u54C1\u724C"},{name:"pencil",keywords:"\u94C5\u7B14 \u5199\u4F5C \u535A\u5BA2 \u6587\u7AE0"},{name:"plane",keywords:"\u98DE\u673A \u65C5\u884C \u51FA\u884C \u5047\u671F"},{name:"promote",keywords:"\u63A8\u5E7F \u8425\u9500 \u5BA3\u4F20"},{name:"question",keywords:"\u95EE\u9898 \u5E2E\u52A9 \u652F\u6301 FAQ"},{name:"ramen",keywords:"\u62C9\u9762 \u6C64 \u98DF\u7269 \u9910\u996E"},{name:"server",keywords:"\u670D\u52A1\u5668 \u8FD0\u7EF4 \u57FA\u7840\u8BBE\u65BD"},{name:"shapes",keywords:"\u5F62\u72B6 \u79EF\u6728 \u73A9\u5177"},{name:"smiley",keywords:"\u7B11\u8138 \u8868\u60C5 \u5F00\u5FC3"},{name:"sport",keywords:"\u8FD0\u52A8 \u6237\u5916 \u6E38\u620F"},{name:"sun",keywords:"\u592A\u9633 \u767D\u5929 \u5929\u6C14"},{name:"target",keywords:"\u76EE\u6807 \u9500\u552E \u6307\u6807"},{name:"team",keywords:"\u56E2\u961F \u7EC4\u7EC7 \u529E\u516C\u5BA4"},{name:"terminal",keywords:"\u7EC8\u7AEF \u547D\u4EE4\u884C \u4EE3\u7801"},{name:"thumbsup",keywords:"\u70B9\u8D5E \u6536\u85CF \u793E\u4EA4 \u6295\u7968"},{name:"tools",keywords:"\u5DE5\u5177 \u8BBE\u7F6E \u914D\u7F6E"},{name:"truck",keywords:"\u5361\u8F66 \u8FD0\u8F93 \u7269\u6D41"},{name:"vehicle",keywords:"\u8F66\u8F86 \u4EA4\u901A \u51FA\u884C"},{name:"warning",keywords:"\u8B66\u544A \u63D0\u793A \u9519\u8BEF"}],r=t.indexOf("--query"),s=r!==-1?t[r+1]:e||"",n=s?o.filter(i=>i.name.toLowerCase().includes(s.toLowerCase())||i.keywords.toLowerCase().includes(s.toLowerCase())):o;return n.length?(console.log(`\u5171 ${n.length} \u4E2A\u56FE\u6807${s?`\uFF08\u5173\u952E\u8BCD: "${s}"\uFF09`:""}:
|
|
64
64
|
`),this.printTable(n.map(i=>({\u56FE\u6807\u540D:i.name,\u5173\u952E\u8BCD:i.keywords}))),console.log(`
|
|
65
65
|
\u7528\u6CD5\u793A\u4F8B:`),console.log(` coder wiki create-collection "\u6211\u7684\u96C6\u5408" --icon ${n[0].name}`),console.log(` coder wiki update-collection <id> --icon ${n[0].name}`),console.log(`
|
|
66
|
-
\u63D0\u793A: \u4E5F\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 emoji\uFF0C\u5982 --icon \u{1F4DA}`),0):(console.log(`\u6CA1\u6709\u627E\u5230\u4E0E "${s}" \u76F8\u5173\u7684\u56FE\u6807`),0)}async upload(e,t,o,r){let s=require("fs"),n=require("path"),i=t[1];if(!e||!i)return console.error("\u274C \u7528\u6CD5: wiki upload <docId> <filePath>"),1;let
|
|
66
|
+
\u63D0\u793A: \u4E5F\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 emoji\uFF0C\u5982 --icon \u{1F4DA}`),0):(console.log(`\u6CA1\u6709\u627E\u5230\u4E0E "${s}" \u76F8\u5173\u7684\u56FE\u6807`),0)}async upload(e,t,o,r){let s=require("fs"),n=require("path"),i=t[1];if(!e||!i)return console.error("\u274C \u7528\u6CD5: wiki upload <docId> <filePath>"),1;let a=n.resolve(i);if(!s.existsSync(a))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${a}`),1;let l=s.readFileSync(a),d=n.basename(a),u=l.length,m=this._getContentType(a),p=await this.post("attachments.create",{name:d,documentId:e,size:u,contentType:m,preset:"documentAttachment"},o,r),f=this.parseJson(p.body);if(!f?.data)return console.error("\u274C \u521B\u5EFA\u9644\u4EF6\u5931\u8D25:",p.body),1;let{uploadUrl:h,form:y,attachment:b}=f.data;console.log(` \u4E0A\u4F20\u4E2D: ${d} (${Math.round(u/1024)}KB)`);let g=await this._uploadToS3(h,y,l,d,m);if(g.status>=300)return console.error(`\u274C \u4E0A\u4F20\u5931\u8D25 (HTTP ${g.status}):`,g.body.slice(0,300)),1;console.log(`\u2705 \u6587\u4EF6\u5DF2\u4E0A\u4F20: ${b.name}`),console.log(` ID: ${b.id}`),console.log(` URL: ${b.url}`);let I=m.startsWith("image/")?``:`[${b.name}](${b.url})`;return console.log(`
|
|
67
67
|
\u5728 Markdown \u4E2D\u4F7F\u7528:
|
|
68
|
-
${I}`),0}async uploadUrl(e,t,o,r){let s=t[1];if(!e||!s)return console.error("\u274C \u7528\u6CD5: wiki upload-url <docId> <url>"),1;let n=await this.post("attachments.createFromUrl",{url:s,documentId:e,preset:"documentAttachment"},o,r),i=this.parseJson(n.body);if(!i?.data)return console.error("\u274C \u4ECE URL \u521B\u5EFA\u9644\u4EF6\u5931\u8D25:",n.body),1;let
|
|
68
|
+
${I}`),0}async uploadUrl(e,t,o,r){let s=t[1];if(!e||!s)return console.error("\u274C \u7528\u6CD5: wiki upload-url <docId> <url>"),1;let n=await this.post("attachments.createFromUrl",{url:s,documentId:e,preset:"documentAttachment"},o,r),i=this.parseJson(n.body);if(!i?.data)return console.error("\u274C \u4ECE URL \u521B\u5EFA\u9644\u4EF6\u5931\u8D25:",n.body),1;let a=i.data;console.log(`\u2705 \u9644\u4EF6\u5DF2\u521B\u5EFA: ${a.name}`),console.log(` ID: ${a.id}`),console.log(` URL: ${a.url}`);let l=a.contentType?.startsWith("image/")?``:`[${a.name}](${a.url})`;return console.log(`
|
|
69
69
|
\u5728 Markdown \u4E2D\u4F7F\u7528:
|
|
70
|
-
${l}`),0}_getContentType(e){let t=e.split(".").pop().toLowerCase();return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",bmp:"image/bmp",ico:"image/x-icon",pdf:"application/pdf",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",txt:"text/plain",md:"text/markdown",csv:"text/csv",zip:"application/zip",tar:"application/x-tar",gz:"application/gzip",mp4:"video/mp4",mov:"video/quicktime",avi:"video/x-msvideo",mp3:"audio/mpeg",wav:"audio/wav",json:"application/json",xml:"application/xml"}[t]||"application/octet-stream"}_uploadToS3(e,t,o,r,s){return new Promise((n,i)=>{let
|
|
70
|
+
${l}`),0}_getContentType(e){let t=e.split(".").pop().toLowerCase();return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",bmp:"image/bmp",ico:"image/x-icon",pdf:"application/pdf",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",txt:"text/plain",md:"text/markdown",csv:"text/csv",zip:"application/zip",tar:"application/x-tar",gz:"application/gzip",mp4:"video/mp4",mov:"video/quicktime",avi:"video/x-msvideo",mp3:"audio/mpeg",wav:"audio/wav",json:"application/json",xml:"application/xml"}[t]||"application/octet-stream"}_uploadToS3(e,t,o,r,s){return new Promise((n,i)=>{let a=`----FormBoundary${Math.random().toString(36).slice(2)}${Date.now()}`,l=[];for(let[b,g]of Object.entries(t))l.push(Buffer.from(`--${a}\r
|
|
71
71
|
Content-Disposition: form-data; name="${b}"\r
|
|
72
72
|
\r
|
|
73
73
|
${g}\r
|
|
74
|
-
`));let d=Buffer.from(`--${
|
|
74
|
+
`));let d=Buffer.from(`--${a}\r
|
|
75
75
|
Content-Disposition: form-data; name="file"; filename="${r}"\r
|
|
76
76
|
Content-Type: ${s}\r
|
|
77
77
|
\r
|
|
78
78
|
`),u=Buffer.from(`\r
|
|
79
|
-
--${
|
|
80
|
-
`),m=Buffer.concat([...l,d,o,u]),p=new URL(e),h=p.protocol==="https:"?require("https"):require("http"),f={hostname:p.hostname,port:p.port||(p.protocol==="https:"?443:80),path:p.pathname+p.search,method:"POST",headers:{"Content-Type":`multipart/form-data; boundary=${c}`,"Content-Length":m.length}},y=h.request(f,b=>{let g="";b.on("data",I=>g+=I),b.on("end",()=>n({status:b.statusCode,body:g}))});y.on("error",i),y.write(m),y.end()})}extractCommentText(e){return e?.content?e.content.flatMap(t=>t.content||[]).filter(t=>t.type==="text").map(t=>t.text).join(""):""}showHelp(){console.log(["Usage: coder wiki [subcommand] [options]","","\u26A0\uFE0F ID \u4F7F\u7528\u89C4\u5219\uFF08\u91CD\u8981\uFF09:"," \u6240\u6709\u547D\u4EE4\u7684 <id> \u53C2\u6570\u5FC5\u987B\u4F7F\u7528 UUID\uFF08\u683C\u5F0F: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\uFF09\u3002"," \u6D4F\u89C8\u5668 URL \u4E2D\u7684\u77ED ID\uFF08urlId\uFF0C\u5982 https://makecoder.com/wiki/doc/kTI1eTPs7o \u4E2D\u7684 kTI1eTPs7o"," \u4EC5\u4EE5\u4E0B\u4E24\u4E2A\u547D\u4EE4\u652F\u6301 urlId\uFF1Aget\u3001collection-info\u3002"," \u5176\u4ED6\u6240\u6709\u547D\u4EE4\uFF08update\u3001delete\u3001move\u3001publish\u3001revisions \u7B49\uFF09\u4F20\u5165 urlId \u4F1A\u62A5\u9519\u3002",' \u5982\u679C\u53EA\u6709 URL\uFF0C\u5148\u7528 "coder wiki get <urlId>" \u67E5\u51FA\u6587\u6863 UUID\uFF0C\u518D\u6267\u884C\u540E\u7EED\u64CD\u4F5C\u3002'," list \u8F93\u51FA\u8868\u683C\u4E2D docId/collectionId \u5217\u7684\u503C\u5373\u4E3A UUID\uFF0C\u53EF\u76F4\u63A5\u4F7F\u7528\u3002","","Global Options:"," --team <teamId> \u6307\u5B9A\u56E2\u961F\u4E0A\u4E0B\u6587\uFF08X-Team-Id\uFF09\uFF0C\u9ED8\u8BA4\u4F7F\u7528 coder team use \u8BBE\u7F6E\u7684\u56E2\u961F","","Collection Management:"," list \u5217\u51FA\u6240\u6709\u96C6\u5408"," list <collectionId> \u5217\u51FA\u96C6\u5408\u4E0B\u7684\u6839\u6587\u6863\uFF08\u8868\u683C\uFF09"," list <collectionId> -d <depth> \u5C55\u5F00\u6587\u6863\u6811\uFF08-d -1 \u5168\u90E8\u5C55\u5F00\uFF09"," create-collection <name> [desc] [--permission <perm>] [--icon <icon>] [--color <color>] [--sort-field title|index] [--sort-direction asc|desc] [--index <fractional-index>]"," \u521B\u5EFA\u96C6\u5408 (perm: read_write|read|null; icon: emoji \u6216\u56FE\u6807\u540D; color: \u5341\u516D\u8FDB\u5236\u989C\u8272\u5982 #4A90E2; sort-field: \u96C6\u5408\u5185\u6587\u6863\u9ED8\u8BA4\u6392\u5E8F\u5B57\u6BB5; index: \u96C6\u5408\u5728\u4FA7\u8FB9\u680F\u4E2D\u7684\u4F4D\u7F6E)"," icons [keyword] \u5217\u51FA\u6240\u6709\u652F\u6301\u7684\u56FE\u6807\u540D\uFF08\u53EF\u6309\u5173\u952E\u8BCD\u8FC7\u6EE4\uFF09"," update-collection <id> [--name <n>] [--description <d>] [--permission <p>] [--color <c>] [--sharing <bool>]"," \u66F4\u65B0\u96C6\u5408"," archive-collection <id> \u5F52\u6863\u96C6\u5408"," restore-collection <id> \u6062\u590D\u5DF2\u5F52\u6863\u96C6\u5408"," delete-collection <id> \u5220\u9664\u96C6\u5408"," collection-info <id> \u67E5\u770B\u96C6\u5408\u8BE6\u60C5"," collection-members <id> [--query <q>] [--permission <p>] \u96C6\u5408\u6210\u5458\u5217\u8868"," collection-add-user <id> <userId> [--permission <p>] \u6DFB\u52A0\u7528\u6237\u5230\u96C6\u5408"," collection-remove-user <id> <userId> \u4ECE\u96C6\u5408\u79FB\u9664\u7528\u6237"," collection-add-group <id> <groupId> [--permission <p>] \u6DFB\u52A0\u7FA4\u7EC4\u5230\u96C6\u5408"," collection-remove-group <id> <groupId> \u4ECE\u96C6\u5408\u79FB\u9664\u7FA4\u7EC4"," collection-group-members <id> \u96C6\u5408\u7FA4\u7EC4\u6210\u5458\u5217\u8868"," collection-export <id> [--format outline|markdown_zip] \u5BFC\u51FA\u96C6\u5408"," export-all [--format outline|markdown_zip] \u5BFC\u51FA\u6240\u6709\u96C6\u5408"," collection-move <id> <index> \u79FB\u52A8\u96C6\u5408\u4F4D\u7F6E","","Document Management:"," get <docId> \u67E5\u770B\u6587\u6863"," publish <collectionId> <title> [text] \u521B\u5EFA\u5E76\u53D1\u5E03\u6587\u6863"," publish <collectionId> --file <path> [--parent <parentDocId>] [--index <n>] [--after <docId>]"," \u4ECE Markdown \u6587\u4EF6\u53D1\u5E03\uFF08\u9700\u542B H1 \u6807\u9898\uFF1B--index \u6307\u5B9A\u4F4D\u7F6E\uFF0C0 \u4E3A\u6700\u524D\uFF1B--after <docId> \u63D2\u5165\u5230\u6307\u5B9A\u6587\u6863\u4E4B\u540E\uFF0C\u81EA\u52A8\u7EE7\u627F\u540C\u7EA7\u7236\u6587\u6863\uFF09"," update <docId> <title> [text] \u66F4\u65B0\u6587\u6863"," update <docId> --file <path> \u4ECE Markdown \u6587\u4EF6\u66F4\u65B0\u6587\u6863"," delete <docId> [--permanent] \u5220\u9664\u6587\u6863"," move <docId> [collectionId] [parentId] \u79FB\u52A8\u6587\u6863"," archive <docId> \u5F52\u6863\u6587\u6863"," restore <docId> [--revision <revisionId>] [--collection <collectionId>]"," \u6062\u590D\u6587\u6863"," archived [--collection <id>] \u5DF2\u5F52\u6863\u6587\u6863\u5217\u8868"," deleted \u5DF2\u5220\u9664\u6587\u6863\u5217\u8868"," insights <id> [--start-date <d>] [--end-date <d>] \u6587\u6863\u8BBF\u95EE\u7EDF\u8BA1"," export <id> [--include-children] \u5BFC\u51FA\u6587\u6863"," search-titles <query> \u6309\u6807\u9898\u641C\u7D22"," duplicate <id> [--title <t>] [--recursive] [--publish] [--collection <id>] [--parent <id>]"," \u590D\u5236\u6587\u6863"," unpublish <id> \u53D6\u6D88\u53D1\u5E03"," templatize <id> [--collection <collectionId>] \u8F6C\u4E3A\u6A21\u677F\uFF08\u9700\u6307\u5B9A\u96C6\u5408\u6216\u7BA1\u7406\u5458\u6743\u9650\uFF09"," doc-members <id> \u6587\u6863\u6210\u5458\u5217\u8868"," doc-add-user <id> <userId> [--permission <p>] \u6DFB\u52A0\u7528\u6237\u5230\u6587\u6863"," doc-remove-user <id> <userId> \u4ECE\u6587\u6863\u79FB\u9664\u7528\u6237"," doc-add-group <id> <groupId> [--permission <p>] \u6DFB\u52A0\u7FA4\u7EC4\u5230\u6587\u6863"," doc-remove-group <id> <groupId> \u4ECE\u6587\u6863\u79FB\u9664\u7FA4\u7EC4"," doc-group-members <id> \u6587\u6863\u7FA4\u7EC4\u6210\u5458\u5217\u8868"," empty-trash \u6E05\u7A7A\u56DE\u6536\u7AD9"," sub-docs <id> \u5B50\u6587\u6863\u5217\u8868","","Revision History:"," revisions <docId> \u5217\u51FA\u6587\u6863\u5386\u53F2\u7248\u672C"," revision <revisionId> \u67E5\u770B\u6307\u5B9A\u5386\u53F2\u7248\u672C\u5185\u5BB9","","Discovery:"," drafts \u8349\u7A3F\u5217\u8868"," recent \u6700\u8FD1\u6D4F\u89C8"," search <keyword> \u5168\u6587\u641C\u7D22","","Favorites & Pins:"," stars \u6536\u85CF\u5217\u8868"," star <id> [--collection] \u6536\u85CF\u6587\u6863\u6216\u96C6\u5408"," unstar <starId> \u53D6\u6D88\u6536\u85CF"," pins [collectionId] \u7F6E\u9876\u5217\u8868"," pin <docId> [collectionId] \u7F6E\u9876\u6587\u6863"," unpin <pinId> \u53D6\u6D88\u7F6E\u9876","","Comments:"," comments <docId> \u67E5\u770B\u8BC4\u8BBA"," comment <docId> <text> \u53D1\u8868\u8BC4\u8BBA","","Shares:"," shares [--document <id>] \u5206\u4EAB\u5217\u8868"," share-info <id> \u67E5\u770B\u5206\u4EAB\u8BE6\u60C5"," share <documentId> [--published] [--include-children] \u521B\u5EFA\u5206\u4EAB"," share-update <id> [--published] [--no-published] [--include-children] \u66F4\u65B0\u5206\u4EAB"," unshare <id> \u64A4\u9500\u5206\u4EAB","","Users:"," users [--query <q>] [--filter invited|viewers|admins|members|active|all|suspended]"," \u7528\u6237\u5217\u8868"," user-info <id> \u67E5\u770B\u7528\u6237\u8BE6\u60C5"," invite <email> <name> <role> \u9080\u8BF7\u7528\u6237"," user-update-role <id> <role> \u66F4\u65B0\u7528\u6237\u89D2\u8272 (admin|member|viewer)"," user-suspend <id> \u6682\u505C\u7528\u6237"," user-activate <id> \u6FC0\u6D3B\u7528\u6237","","Groups:"," groups [--query <q>] \u7FA4\u7EC4\u5217\u8868"," group-info <id> \u67E5\u770B\u7FA4\u7EC4\u8BE6\u60C5"," create-group <name> \u521B\u5EFA\u7FA4\u7EC4"," update-group <id> --name <name> \u66F4\u65B0\u7FA4\u7EC4"," delete-group <id> \u5220\u9664\u7FA4\u7EC4"," group-members <id> \u7FA4\u7EC4\u6210\u5458\u5217\u8868"," group-add-user <id> <userId> \u6DFB\u52A0\u7528\u6237\u5230\u7FA4\u7EC4"," group-remove-user <id> <userId> \u4ECE\u7FA4\u7EC4\u79FB\u9664\u7528\u6237","","Views / Subscriptions / Events:"," views <documentId> \u6587\u6863\u6D4F\u89C8\u8BB0\u5F55"," view <documentId> \u8BB0\u5F55\u6587\u6863\u6D4F\u89C8"," subscriptions <documentId> \u8BA2\u9605\u5217\u8868\uFF08\u6216 --collection <id>\uFF09"," subscribe <documentId> \u8BA2\u9605\u6587\u6863\u66F4\u65B0"," unsubscribe <subscriptionId> \u53D6\u6D88\u8BA2\u9605"," events [--actor <id>] [--document <id>] [--collection <id>] [--type <t>]"," \u4E8B\u4EF6\u5217\u8868","","Templates:"," templates [--collection <id>] \u6A21\u677F\u5217\u8868"," template-info <id> \u67E5\u770B\u6A21\u677F\u8BE6\u60C5"," create-template <collectionId> <title> [--text <t>] \u521B\u5EFA\u6A21\u677F"," update-template <id> [--title <t>] [--text <t>] \u66F4\u65B0\u6A21\u677F"," delete-template <id> \u5220\u9664\u6A21\u677F"," duplicate-template <id> [--title <t>] \u590D\u5236\u6A21\u677F","","File Operations:"," file-ops [--type import|export] \u6587\u4EF6\u64CD\u4F5C\u5217\u8868"," file-op-info <id> \u67E5\u770B\u6587\u4EF6\u64CD\u4F5C\u8BE6\u60C5"," file-op-delete <id> \u5220\u9664\u6587\u4EF6\u64CD\u4F5C\u8BB0\u5F55","","Reactions:"," reactions <commentId> \u67E5\u770B\u8BC4\u8BBA\u53CD\u5E94\u5217\u8868","","Attachments:"," attachments [docId] \u9644\u4EF6\u5217\u8868\uFF08\u53EF\u6309\u6587\u6863\u8FC7\u6EE4\uFF09"," upload <docId> <filePath> \u4E0A\u4F20\u672C\u5730\u6587\u4EF6\uFF08\u56FE\u7247/PDF/PPT \u7B49\uFF09\u5230\u6587\u6863"," upload-url <docId> <url> \u4ECE\u8FDC\u7A0B URL \u521B\u5EFA\u9644\u4EF6"," delete-attachment <id> \u5220\u9664\u9644\u4EF6","","Examples:"," coder wiki list \u5217\u51FA\u9ED8\u8BA4\u56E2\u961F\u7684\u6240\u6709\u96C6\u5408"," coder wiki list --team <teamId> \u5217\u51FA\u6307\u5B9A\u56E2\u961F\u7684\u96C6\u5408"," coder wiki list <collectionId> -d -1 \u5C55\u5F00\u5B8C\u6574\u6811",' coder wiki publish <collectionId> "\u6807\u9898" "\u5185\u5BB9"'," coder wiki publish <collectionId> --file ./doc.md",' coder wiki search "\u5173\u952E\u8BCD"',' coder wiki comment <docId> "\u5F88\u6709\u5E2E\u52A9\uFF01"'," coder wiki upload <docId> ./screenshot.png \u4E0A\u4F20\u56FE\u7247\u5E76\u83B7\u53D6 Markdown \u94FE\u63A5"," coder wiki upload <docId> ./report.pptx \u4E0A\u4F20 PPT \u6587\u4EF6"].join(`
|
|
81
|
-
`))}};
|
|
82
|
-
`)}getChannels(){return this.load().channels??[]}saveChannels(e){let t=this.load();t.channels=e,this.save(t)}async handle({channelSubcommand:e,channelArg:t,channelRemainingArgs:o,remainingArgs:r,claudeLauncher:s,parsedArgs:n}){return e?e==="--help"||e==="-h"?(this.showHelp(),0):e==="list"?this.list(t):e==="show"?this.show(t):e==="add"?this.add(t,o||[]):e==="remove"?this.remove(t):e==="update"?this.update(t,o||[]):(console.error(`\u274C \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),this.showHelp(),1):this.launch(o||[],s,n)}async launch(e,t,o){let r=this.getChannels().filter(p=>p.enabled!==!1);if(!r.length&&(console.log(`\u5C1A\u672A\u7ED1\u5B9A\u4EFB\u4F55\u6E20\u9053\uFF0C\u5F00\u59CB\u5F15\u5BFC\u914D\u7F6E...
|
|
83
|
-
`),!await this.promptSetupChannel()||(r=this.getChannels().filter(h=>h.enabled!==!1),!r.length)))return 1;let s=null,n=e.indexOf("--channel-id");n!==-1&&(s=e[n+1],e=e.filter((p,h)=>h!==n&&h!==n+1));let i;if(s){if(i=r.find(p=>p.id===s),!i)return console.error(`\u274C \u6E20\u9053\u4E0D\u5B58\u5728: ${s}`),1}else if(r.length===1)i=r[0];else if(i=await this.promptSelectChannel(r),!i)return 1;let c=O.join(Xe,i.type);if(!P.existsSync(c))return console.error(`\u274C MCP \u76EE\u5F55\u4E0D\u5B58\u5728: ${c}`),1;let l=["--plugin-dir",c,"--dangerously-load-development-channels",`plugin:${i.type}@${i.type}`],d={WECOM_CHANNEL_FILE:Y,WECOM_CHANNEL_KEY:i.id};i.botId&&(d.WECOM_BOT_ID=i.botId),i.secret&&(d.WECOM_BOT_SECRET=i.secret),o.remainingArgs=[...l,...e,...o.remainingArgs||[]],o.extraEnv={...o.extraEnv||{},...d};let u=i.name||i.id,m=i.botId?X(i.botId):"(\u672A\u914D\u7F6E)";return console.log(`
|
|
84
|
-
\u6E20\u9053\u5DF2\u5C31\u7EEA: [${i.type}] ${u} Bot ID: ${m}`),console.log(`\u6B63\u5728\u542F\u52A8 Claude\uFF0C\u7B49\u5F85\u4F01\u4E1A\u5FAE\u4FE1\u6D88\u606F...
|
|
85
|
-
`),await t.launch(o)}async promptSetupChannel(){let e=Jt.createInterface({input:process.stdin,output:process.stdout}),t=o=>new Promise(r=>e.question(o,r));try{for(;;){console.log(`\u8BF7\u914D\u7F6E\u4F01\u4E1A\u5FAE\u4FE1 AI Bot \u6E20\u9053\uFF1A
|
|
86
|
-
`);let o=(await t(" 1. \u8BF7\u7C98\u8D34 Bot ID: ")).trim();if(!o){console.error(`\u274C Bot ID \u4E0D\u80FD\u4E3A\u7A7A
|
|
87
|
-
`);continue}let r=(await t(" 2. \u8BF7\u7C98\u8D34 Secret: ")).trim();if(!r){console.error(`\u274C Secret \u4E0D\u80FD\u4E3A\u7A7A
|
|
88
|
-
`);continue}if(process.stdout.write(`\x1B[1A\x1B[2K 2. \u8BF7\u7C98\u8D34 Secret: ${X(r)}
|
|
89
|
-
`),console.log(`
|
|
90
|
-
\u6B63\u5728\u9A8C\u8BC1\u8FDE\u63A5...`),!await this.testWecomConnection(o,r)){console.error(`\u274C \u8FDE\u63A5\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Bot ID \u548C Secret \u662F\u5426\u6B63\u786E\uFF0C\u91CD\u65B0\u8F93\u5165\u3002
|
|
91
|
-
`);continue}let n=`wecom-${Date.now()}`,i={id:n,type:"wecom",enabled:!0,botId:o,secret:r,createdAt:new Date().toISOString()},c=this.getChannels();return c.push(i),this.saveChannels(c),console.log(`\u2705 \u6E20\u9053\u7ED1\u5B9A\u6210\u529F: ${n}
|
|
92
|
-
`),i}}finally{e.close()}}async testWecomConnection(e,t){let o=O.join(Xe,"wecom"),r=O.join(o,"node_modules","@wecom","aibot-node-sdk");if(!P.existsSync(r))return!0;let s;try{({WSClient:s}=require(r))}catch{return this._testWecomConnectionSubprocess(e,t,r)}return this._runWecomClient(s,e,t)}_runWecomClient(e,t,o){return new Promise(r=>{let s=setTimeout(()=>{try{n.disconnect()}catch{}r(!1)},1e4),n=new e({botId:t,secret:o,maxReconnectAttempts:0,maxAuthFailureAttempts:0,logger:{debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}}});n.on("authenticated",()=>{clearTimeout(s);try{n.disconnect()}catch{}r(!0)}),n.on("error",()=>{clearTimeout(s);try{n.disconnect()}catch{}r(!1)}),n.connect()})}_testWecomConnectionSubprocess(e,t,o){let{execSync:r,spawn:s}=require("child_process"),n;try{n=r("which node",{encoding:"utf8"}).trim()}catch{}if(!n)try{n=r("which bun",{encoding:"utf8"}).trim()}catch{}if(!n)return!0;let i=`
|
|
93
|
-
const { WSClient } = require(${JSON.stringify(o)});
|
|
94
|
-
const client = new WSClient({
|
|
95
|
-
botId: ${JSON.stringify(e)}, secret: ${JSON.stringify(t)},
|
|
96
|
-
maxReconnectAttempts: 0, maxAuthFailureAttempts: 0,
|
|
97
|
-
logger: { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} },
|
|
98
|
-
});
|
|
99
|
-
const t = setTimeout(() => { try { client.disconnect(); } catch {} process.exit(1); }, 10000);
|
|
100
|
-
client.on("authenticated", () => { clearTimeout(t); try { client.disconnect(); } catch {} process.exit(0); });
|
|
101
|
-
client.on("error", () => { clearTimeout(t); try { client.disconnect(); } catch {} process.exit(1); });
|
|
102
|
-
client.connect();
|
|
103
|
-
`;return new Promise(c=>{let l=s(n,["-e",i],{stdio:"ignore"}),d=setTimeout(()=>{l.kill(),c(!1)},12e3);l.on("close",u=>{clearTimeout(d),c(u===0)}),l.on("error",()=>{clearTimeout(d),c(!1)})})}async promptSelectChannel(e){return new Promise(t=>{let o=0,r=()=>{process.stdout.write("\x1B[?25l"),process.stdout.write(`
|
|
104
|
-
\u8BF7\u9009\u62E9\u8981\u542F\u52A8\u7684\u6E20\u9053 (\u2191\u2193 \u79FB\u52A8, Enter \u786E\u8BA4):
|
|
105
|
-
|
|
106
|
-
`),e.forEach((i,c)=>{let l=i.botId?X(i.botId):"(\u672A\u914D\u7F6E)",d=`[${i.type}] ${i.name||i.id} botId: ${l}`;c===o?process.stdout.write(` \x1B[38;2;231;76;60m\u276F ${d}\x1B[0m
|
|
107
|
-
`):process.stdout.write(` ${d}
|
|
108
|
-
`)}),process.stdout.write(`
|
|
109
|
-
`)},s=()=>{let i=e.length+4;process.stdout.write(`\x1B[${i}A\x1B[0J`)};r(),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let n=i=>{i==="\x1B[A"||i==="\x1B[D"?(o=(o-1+e.length)%e.length,s(),r()):i==="\x1B[B"||i==="\x1B[C"?(o=(o+1)%e.length,s(),r()):i==="\r"||i===`
|
|
110
|
-
`?(process.stdin.setRawMode(!1),process.stdin.pause(),process.stdin.removeListener("data",n),process.stdout.write("\x1B[?25h"),t(e[o])):i===""&&(process.stdin.setRawMode(!1),process.stdin.pause(),process.stdin.removeListener("data",n),process.stdout.write("\x1B[?25h"),t(null))};process.stdin.on("data",n)})}list(e){let t=this.getChannels();return e&&(t=t.filter(o=>o.type===e)),t.length?(this.printTable(t.map(o=>({id:o.id,type:o.type,name:o.name||"",enabled:o.enabled!==!1?"\u2713":"\u2717",botId:o.botId?X(o.botId):"",allowFrom:(o.allowFrom??[]).join(", "),updatedAt:o.updatedAt||o.createdAt||""}))),0):(console.log(e?`\u6682\u65E0 ${e} \u6E20\u9053`:"\u6682\u65E0\u6E20\u9053\u7ED1\u5B9A"),0)}show(e){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6E20\u9053 ID"),1;let t=this.getChannels().find(o=>o.id===e);return t?(console.log(JSON.stringify(t,null,2)),0):(console.error(`\u274C \u6E20\u9053\u4E0D\u5B58\u5728: ${e}`),1)}add(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6E20\u9053\u7C7B\u578B\uFF0C\u4F8B\u5982: coder channel add wecom --bot-id xxx --secret yyy"),1;if(!Ye.includes(e))return console.error(`\u274C \u4E0D\u652F\u6301\u7684\u6E20\u9053\u7C7B\u578B: ${e}\uFF0C\u652F\u6301: ${Ye.join(", ")}`),1;let o=t.indexOf("--id"),r=(o!==-1?t[o+1]:void 0)||`${e}-${Date.now()}`,s=this.getChannels();if(s.find(i=>i.id===r))return console.error(`\u274C \u6E20\u9053 ID \u5DF2\u5B58\u5728: ${r}`),1;let n={id:r,type:e,enabled:!0,createdAt:new Date().toISOString()};return this._applyArgs(n,t),s.push(n),this.saveChannels(s),console.log(`\u2705 \u6E20\u9053\u5DF2\u6DFB\u52A0: ${r} (${e})`),0}remove(e){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6E20\u9053 ID"),1;let t=this.getChannels(),o=t.findIndex(r=>r.id===e);return o===-1?(console.error(`\u274C \u6E20\u9053\u4E0D\u5B58\u5728: ${e}`),1):(t.splice(o,1),this.saveChannels(t),console.log(`\u2705 \u6E20\u9053\u5DF2\u5220\u9664: ${e}`),0)}update(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6E20\u9053 ID"),1;let o=this.getChannels(),r=o.find(s=>s.id===e);return r?(t.includes("--enable")&&(r.enabled=!0),t.includes("--disable")&&(r.enabled=!1),this._applyArgs(r,t),r.updatedAt=new Date().toISOString(),this.saveChannels(o),console.log(`\u2705 \u6E20\u9053\u5DF2\u66F4\u65B0: ${e}`),0):(console.error(`\u274C \u6E20\u9053\u4E0D\u5B58\u5728: ${e}`),1)}_applyArgs(e,t){let o=n=>{let i=t.indexOf(n);return i!==-1?t[i+1]:void 0},r=n=>{if(n&&n.startsWith("@")){let i=n.slice(1);try{return P.readFileSync(i,"utf8").trim()}catch{console.error(`\u274C \u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6: ${i}`);return}}return n},s=o("--name");if(s!==void 0&&(e.name=s),e.type==="wecom"){let n=r(o("--bot-id"));n!==void 0&&(e.botId=n);let i=r(o("--secret"));i!==void 0&&(e.secret=i);let c=o("--allow");c!==void 0&&(e.allowFrom=e.allowFrom??[],e.allowFrom.includes(c)||e.allowFrom.push(c));let l=o("--deny");l!==void 0&&(e.allowFrom=(e.allowFrom??[]).filter(d=>d!==l))}}printTable(e){if(!e.length)return;let t=Object.keys(e[0]),o=i=>[...String(i)].reduce((c,l)=>c+(l.charCodeAt(0)>127?2:1),0),r=(i,c)=>i+" ".repeat(Math.max(0,c-o(i))),s=t.map(i=>Math.max(o(i),...e.map(c=>o(String(c[i]||""))))),n=s.map(i=>"-".repeat(i)).join("-+-");console.log(t.map((i,c)=>r(i,s[c])).join(" | ")),console.log(n);for(let i of e)console.log(t.map((c,l)=>r(String(i[c]||""),s[l])).join(" | "))}showHelp(){console.log(["Usage: coder channel [subcommand] [options]","","Subcommands:"," (no subcommand) \u542F\u52A8 Claude\uFF08\u81EA\u52A8\u9009\u62E9\u6216\u4EA4\u4E92\u9009\u62E9\u6E20\u9053\uFF09"," --channel-id <id> \u542F\u52A8\u6307\u5B9A\u6E20\u9053"," list [type] \u5217\u51FA\u6E20\u9053"," show <id> \u67E5\u770B\u6E20\u9053\u8BE6\u60C5"," add <type> [options] \u6DFB\u52A0\u6E20\u9053"," update <id> [options] \u66F4\u65B0\u6E20\u9053"," remove <id> \u5220\u9664\u6E20\u9053","","Supported Channel Types:"," wecom \u4F01\u4E1A\u5FAE\u4FE1 AI Bot","","WeChat Work Options:"," --bot-id <botId> \u4F01\u4E1A\u5FAE\u4FE1 AI Bot ID"," --secret <secret> \u4F01\u4E1A\u5FAE\u4FE1 AI Bot Secret\uFF08\u660E\u6587\uFF0C\u4F1A\u8BB0\u5F55\u5230 shell \u5386\u53F2\uFF09"," --secret @<file> \u4ECE\u6587\u4EF6\u8BFB\u53D6 Secret\uFF0C\u907F\u514D\u6CC4\u9732\u5230 shell \u5386\u53F2"," --allow <userId> \u5C06\u7528\u6237\u52A0\u5165\u767D\u540D\u5355"," --deny <userId> \u5C06\u7528\u6237\u79FB\u51FA\u767D\u540D\u5355"," --enable / --disable \u542F\u7528\u6216\u7981\u7528\u6E20\u9053"," --id <id> \u81EA\u5B9A\u4E49\u6E20\u9053 ID\uFF08add \u65F6\u4F7F\u7528\uFF09"," --name <name> \u6E20\u9053\u663E\u793A\u540D\u79F0","","Examples:",' coder channel add wecom --bot-id xxx --secret yyy --name "\u4E3B\u6E20\u9053"'," coder channel add wecom --bot-id xxx --secret @~/.coder/secret.txt",' coder channel add wecom --bot-id zzz --secret www --name "\u5907\u7528\u6E20\u9053"'," coder channel update wecom-xxx --allow zhangsan"," coder channel list \u5217\u51FA\u6240\u6709\u6E20\u9053"," coder channel \u591A\u6E20\u9053\u65F6\u4EA4\u4E92\u9009\u62E9"," coder channel --channel-id wecom-xxx \u76F4\u63A5\u542F\u52A8\u6307\u5B9A\u6E20\u9053","","\u914D\u7F6E\u6587\u4EF6: ~/.coder/config.json"].join(`
|
|
111
|
-
`))}};Ze.exports=ue});var tt=_((Po,et)=>{var Ht=require("http"),me=class{constructor(e={}){this.port=e.port||9380,this.timeout=e.timeout||300*1e3,this.server=null,this.timeoutId=null}validateTokenFormat(e){if(!e||typeof e!="string")return!1;let t=e.split(".");if(t.length!==2)return!1;let[o,r]=t;return o&&o.length>0&&r&&r.length>0}async waitForCallback(e){return new Promise((t,o)=>{let r=!1;this.server=Ht.createServer((s,n)=>{let i=new URL(s.url,`http://localhost:${this.port}`);if(i.pathname==="/callback"){let c=i.searchParams.get("token"),l=i.searchParams.get("state"),d=i.searchParams.get("error");if(d){n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
|
|
79
|
+
--${a}--\r
|
|
80
|
+
`),m=Buffer.concat([...l,d,o,u]),p=new URL(e),f=p.protocol==="https:"?require("https"):require("http"),h={hostname:p.hostname,port:p.port||(p.protocol==="https:"?443:80),path:p.pathname+p.search,method:"POST",headers:{"Content-Type":`multipart/form-data; boundary=${a}`,"Content-Length":m.length}},y=f.request(h,b=>{let g="";b.on("data",I=>g+=I),b.on("end",()=>n({status:b.statusCode,body:g}))});y.on("error",i),y.write(m),y.end()})}extractCommentText(e){return e?.content?e.content.flatMap(t=>t.content||[]).filter(t=>t.type==="text").map(t=>t.text).join(""):""}showHelp(){console.log(["Usage: coder wiki [subcommand] [options]","","\u26A0\uFE0F ID \u4F7F\u7528\u89C4\u5219\uFF08\u91CD\u8981\uFF09:"," \u6240\u6709\u547D\u4EE4\u7684 <id> \u53C2\u6570\u5FC5\u987B\u4F7F\u7528 UUID\uFF08\u683C\u5F0F: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\uFF09\u3002"," \u6D4F\u89C8\u5668 URL \u4E2D\u7684\u77ED ID\uFF08urlId\uFF0C\u5982 https://makecoder.com/wiki/doc/kTI1eTPs7o \u4E2D\u7684 kTI1eTPs7o"," \u4EC5\u4EE5\u4E0B\u4E24\u4E2A\u547D\u4EE4\u652F\u6301 urlId\uFF1Aget\u3001collection-info\u3002"," \u5176\u4ED6\u6240\u6709\u547D\u4EE4\uFF08update\u3001delete\u3001move\u3001publish\u3001revisions \u7B49\uFF09\u4F20\u5165 urlId \u4F1A\u62A5\u9519\u3002",' \u5982\u679C\u53EA\u6709 URL\uFF0C\u5148\u7528 "coder wiki get <urlId>" \u67E5\u51FA\u6587\u6863 UUID\uFF0C\u518D\u6267\u884C\u540E\u7EED\u64CD\u4F5C\u3002'," list \u8F93\u51FA\u8868\u683C\u4E2D docId/collectionId \u5217\u7684\u503C\u5373\u4E3A UUID\uFF0C\u53EF\u76F4\u63A5\u4F7F\u7528\u3002","","Global Options:"," --team <teamId> \u6307\u5B9A\u56E2\u961F\u4E0A\u4E0B\u6587\uFF08X-Team-Id\uFF09\uFF0C\u9ED8\u8BA4\u4F7F\u7528 coder team use \u8BBE\u7F6E\u7684\u56E2\u961F","","Collection Management:"," list \u5217\u51FA\u6240\u6709\u96C6\u5408"," list <collectionId> \u5217\u51FA\u96C6\u5408\u4E0B\u7684\u6839\u6587\u6863\uFF08\u8868\u683C\uFF09"," list <collectionId> -d <depth> \u5C55\u5F00\u6587\u6863\u6811\uFF08-d -1 \u5168\u90E8\u5C55\u5F00\uFF09"," create-collection <name> [desc] [--permission <perm>] [--icon <icon>] [--color <color>] [--sort-field title|index] [--sort-direction asc|desc] [--index <fractional-index>]"," \u521B\u5EFA\u96C6\u5408 (perm: read_write|read|null; icon: emoji \u6216\u56FE\u6807\u540D; color: \u5341\u516D\u8FDB\u5236\u989C\u8272\u5982 #4A90E2; sort-field: \u96C6\u5408\u5185\u6587\u6863\u9ED8\u8BA4\u6392\u5E8F\u5B57\u6BB5; index: \u96C6\u5408\u5728\u4FA7\u8FB9\u680F\u4E2D\u7684\u4F4D\u7F6E)"," icons [keyword] \u5217\u51FA\u6240\u6709\u652F\u6301\u7684\u56FE\u6807\u540D\uFF08\u53EF\u6309\u5173\u952E\u8BCD\u8FC7\u6EE4\uFF09"," update-collection <id> [--name <n>] [--description <d>] [--permission <p>] [--color <c>] [--sharing <bool>]"," \u66F4\u65B0\u96C6\u5408"," archive-collection <id> \u5F52\u6863\u96C6\u5408"," restore-collection <id> \u6062\u590D\u5DF2\u5F52\u6863\u96C6\u5408"," delete-collection <id> \u5220\u9664\u96C6\u5408"," collection-info <id> \u67E5\u770B\u96C6\u5408\u8BE6\u60C5"," collection-members <id> [--query <q>] [--permission <p>] \u96C6\u5408\u6210\u5458\u5217\u8868"," collection-add-user <id> <userId> [--permission <p>] \u6DFB\u52A0\u7528\u6237\u5230\u96C6\u5408"," collection-remove-user <id> <userId> \u4ECE\u96C6\u5408\u79FB\u9664\u7528\u6237"," collection-add-group <id> <groupId> [--permission <p>] \u6DFB\u52A0\u7FA4\u7EC4\u5230\u96C6\u5408"," collection-remove-group <id> <groupId> \u4ECE\u96C6\u5408\u79FB\u9664\u7FA4\u7EC4"," collection-group-members <id> \u96C6\u5408\u7FA4\u7EC4\u6210\u5458\u5217\u8868"," collection-export <id> [--format outline|markdown_zip] \u5BFC\u51FA\u96C6\u5408"," export-all [--format outline|markdown_zip] \u5BFC\u51FA\u6240\u6709\u96C6\u5408"," collection-move <id> <index> \u79FB\u52A8\u96C6\u5408\u4F4D\u7F6E","","Document Management:"," get <docId> \u67E5\u770B\u6587\u6863"," publish <collectionId> <title> [text] \u521B\u5EFA\u5E76\u53D1\u5E03\u6587\u6863"," publish <collectionId> --file <path> [--parent <parentDocId>] [--index <n>] [--after <docId>]"," \u4ECE Markdown \u6587\u4EF6\u53D1\u5E03\uFF08\u9700\u542B H1 \u6807\u9898\uFF1B--index \u6307\u5B9A\u4F4D\u7F6E\uFF0C0 \u4E3A\u6700\u524D\uFF1B--after <docId> \u63D2\u5165\u5230\u6307\u5B9A\u6587\u6863\u4E4B\u540E\uFF0C\u81EA\u52A8\u7EE7\u627F\u540C\u7EA7\u7236\u6587\u6863\uFF09"," update <docId> <title> [text] \u66F4\u65B0\u6587\u6863"," update <docId> --file <path> \u4ECE Markdown \u6587\u4EF6\u66F4\u65B0\u6587\u6863"," delete <docId> [--permanent] \u5220\u9664\u6587\u6863"," move <docId> [collectionId] [parentId] \u79FB\u52A8\u6587\u6863"," archive <docId> \u5F52\u6863\u6587\u6863"," restore <docId> [--revision <revisionId>] [--collection <collectionId>]"," \u6062\u590D\u6587\u6863"," archived [--collection <id>] \u5DF2\u5F52\u6863\u6587\u6863\u5217\u8868"," deleted \u5DF2\u5220\u9664\u6587\u6863\u5217\u8868"," insights <id> [--start-date <d>] [--end-date <d>] \u6587\u6863\u8BBF\u95EE\u7EDF\u8BA1"," export <id> [--include-children] \u5BFC\u51FA\u6587\u6863"," search-titles <query> \u6309\u6807\u9898\u641C\u7D22"," duplicate <id> [--title <t>] [--recursive] [--publish] [--collection <id>] [--parent <id>]"," \u590D\u5236\u6587\u6863"," unpublish <id> \u53D6\u6D88\u53D1\u5E03"," templatize <id> [--collection <collectionId>] \u8F6C\u4E3A\u6A21\u677F\uFF08\u9700\u6307\u5B9A\u96C6\u5408\u6216\u7BA1\u7406\u5458\u6743\u9650\uFF09"," doc-members <id> \u6587\u6863\u6210\u5458\u5217\u8868"," doc-add-user <id> <userId> [--permission <p>] \u6DFB\u52A0\u7528\u6237\u5230\u6587\u6863"," doc-remove-user <id> <userId> \u4ECE\u6587\u6863\u79FB\u9664\u7528\u6237"," doc-add-group <id> <groupId> [--permission <p>] \u6DFB\u52A0\u7FA4\u7EC4\u5230\u6587\u6863"," doc-remove-group <id> <groupId> \u4ECE\u6587\u6863\u79FB\u9664\u7FA4\u7EC4"," doc-group-members <id> \u6587\u6863\u7FA4\u7EC4\u6210\u5458\u5217\u8868"," empty-trash \u6E05\u7A7A\u56DE\u6536\u7AD9"," sub-docs <id> \u5B50\u6587\u6863\u5217\u8868","","Revision History:"," revisions <docId> \u5217\u51FA\u6587\u6863\u5386\u53F2\u7248\u672C"," revision <revisionId> \u67E5\u770B\u6307\u5B9A\u5386\u53F2\u7248\u672C\u5185\u5BB9","","Discovery:"," drafts \u8349\u7A3F\u5217\u8868"," recent \u6700\u8FD1\u6D4F\u89C8"," search <keyword> \u5168\u6587\u641C\u7D22","","Favorites & Pins:"," stars \u6536\u85CF\u5217\u8868"," star <id> [--collection] \u6536\u85CF\u6587\u6863\u6216\u96C6\u5408"," unstar <starId> \u53D6\u6D88\u6536\u85CF"," pins [collectionId] \u7F6E\u9876\u5217\u8868"," pin <docId> [collectionId] \u7F6E\u9876\u6587\u6863"," unpin <pinId> \u53D6\u6D88\u7F6E\u9876","","Comments:"," comments <docId> \u67E5\u770B\u8BC4\u8BBA"," comment <docId> <text> \u53D1\u8868\u8BC4\u8BBA","","Shares:"," shares [--document <id>] \u5206\u4EAB\u5217\u8868"," share-info <id> \u67E5\u770B\u5206\u4EAB\u8BE6\u60C5"," share <documentId> [--published] [--include-children] \u521B\u5EFA\u5206\u4EAB"," share-update <id> [--published] [--no-published] [--include-children] \u66F4\u65B0\u5206\u4EAB"," unshare <id> \u64A4\u9500\u5206\u4EAB","","Users:"," users [--query <q>] [--filter invited|viewers|admins|members|active|all|suspended]"," \u7528\u6237\u5217\u8868"," user-info <id> \u67E5\u770B\u7528\u6237\u8BE6\u60C5"," invite <email> <name> <role> \u9080\u8BF7\u7528\u6237"," user-update-role <id> <role> \u66F4\u65B0\u7528\u6237\u89D2\u8272 (admin|member|viewer)"," user-suspend <id> \u6682\u505C\u7528\u6237"," user-activate <id> \u6FC0\u6D3B\u7528\u6237","","Groups:"," groups [--query <q>] \u7FA4\u7EC4\u5217\u8868"," group-info <id> \u67E5\u770B\u7FA4\u7EC4\u8BE6\u60C5"," create-group <name> \u521B\u5EFA\u7FA4\u7EC4"," update-group <id> --name <name> \u66F4\u65B0\u7FA4\u7EC4"," delete-group <id> \u5220\u9664\u7FA4\u7EC4"," group-members <id> \u7FA4\u7EC4\u6210\u5458\u5217\u8868"," group-add-user <id> <userId> \u6DFB\u52A0\u7528\u6237\u5230\u7FA4\u7EC4"," group-remove-user <id> <userId> \u4ECE\u7FA4\u7EC4\u79FB\u9664\u7528\u6237","","Views / Subscriptions / Events:"," views <documentId> \u6587\u6863\u6D4F\u89C8\u8BB0\u5F55"," view <documentId> \u8BB0\u5F55\u6587\u6863\u6D4F\u89C8"," subscriptions <documentId> \u8BA2\u9605\u5217\u8868\uFF08\u6216 --collection <id>\uFF09"," subscribe <documentId> \u8BA2\u9605\u6587\u6863\u66F4\u65B0"," unsubscribe <subscriptionId> \u53D6\u6D88\u8BA2\u9605"," events [--actor <id>] [--document <id>] [--collection <id>] [--type <t>]"," \u4E8B\u4EF6\u5217\u8868","","Templates:"," templates [--collection <id>] \u6A21\u677F\u5217\u8868"," template-info <id> \u67E5\u770B\u6A21\u677F\u8BE6\u60C5"," create-template <collectionId> <title> [--text <t>] \u521B\u5EFA\u6A21\u677F"," update-template <id> [--title <t>] [--text <t>] \u66F4\u65B0\u6A21\u677F"," delete-template <id> \u5220\u9664\u6A21\u677F"," duplicate-template <id> [--title <t>] \u590D\u5236\u6A21\u677F","","File Operations:"," file-ops [--type import|export] \u6587\u4EF6\u64CD\u4F5C\u5217\u8868"," file-op-info <id> \u67E5\u770B\u6587\u4EF6\u64CD\u4F5C\u8BE6\u60C5"," file-op-delete <id> \u5220\u9664\u6587\u4EF6\u64CD\u4F5C\u8BB0\u5F55","","Reactions:"," reactions <commentId> \u67E5\u770B\u8BC4\u8BBA\u53CD\u5E94\u5217\u8868","","Attachments:"," attachments [docId] \u9644\u4EF6\u5217\u8868\uFF08\u53EF\u6309\u6587\u6863\u8FC7\u6EE4\uFF09"," upload <docId> <filePath> \u4E0A\u4F20\u672C\u5730\u6587\u4EF6\uFF08\u56FE\u7247/PDF/PPT \u7B49\uFF09\u5230\u6587\u6863"," upload-url <docId> <url> \u4ECE\u8FDC\u7A0B URL \u521B\u5EFA\u9644\u4EF6"," delete-attachment <id> \u5220\u9664\u9644\u4EF6","","Examples:"," coder wiki list \u5217\u51FA\u9ED8\u8BA4\u56E2\u961F\u7684\u6240\u6709\u96C6\u5408"," coder wiki list --team <teamId> \u5217\u51FA\u6307\u5B9A\u56E2\u961F\u7684\u96C6\u5408"," coder wiki list <collectionId> -d -1 \u5C55\u5F00\u5B8C\u6574\u6811",' coder wiki publish <collectionId> "\u6807\u9898" "\u5185\u5BB9"'," coder wiki publish <collectionId> --file ./doc.md",' coder wiki search "\u5173\u952E\u8BCD"',' coder wiki comment <docId> "\u5F88\u6709\u5E2E\u52A9\uFF01"'," coder wiki upload <docId> ./screenshot.png \u4E0A\u4F20\u56FE\u7247\u5E76\u83B7\u53D6 Markdown \u94FE\u63A5"," coder wiki upload <docId> ./report.pptx \u4E0A\u4F20 PPT \u6587\u4EF6"].join(`
|
|
81
|
+
`))}};Je.exports=ie});var Ve=_((Io,He)=>{var Pt=require("http"),ae=class{constructor(e={}){this.port=e.port||9380,this.timeout=e.timeout||300*1e3,this.server=null,this.timeoutId=null}validateTokenFormat(e){if(!e||typeof e!="string")return!1;let t=e.split(".");if(t.length!==2)return!1;let[o,r]=t;return o&&o.length>0&&r&&r.length>0}async waitForCallback(e){return new Promise((t,o)=>{let r=!1;this.server=Pt.createServer((s,n)=>{let i=new URL(s.url,`http://localhost:${this.port}`);if(i.pathname==="/callback"){let a=i.searchParams.get("token"),l=i.searchParams.get("state"),d=i.searchParams.get("error");if(d){n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
|
|
112
82
|
<!DOCTYPE html>
|
|
113
83
|
<html>
|
|
114
84
|
<head>
|
|
@@ -155,7 +125,7 @@ client.connect();
|
|
|
155
125
|
</div>
|
|
156
126
|
</body>
|
|
157
127
|
</html>
|
|
158
|
-
`),r||(r=!0,this.cleanup(),o(new Error("Invalid state parameter - possible CSRF attack")));return}if(!
|
|
128
|
+
`),r||(r=!0,this.cleanup(),o(new Error("Invalid state parameter - possible CSRF attack")));return}if(!a){n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
|
|
159
129
|
<!DOCTYPE html>
|
|
160
130
|
<html>
|
|
161
131
|
<head>
|
|
@@ -177,7 +147,7 @@ client.connect();
|
|
|
177
147
|
</div>
|
|
178
148
|
</body>
|
|
179
149
|
</html>
|
|
180
|
-
`),r||(r=!0,this.cleanup(),o(new Error("No token received from OAuth callback")));return}if(!this.validateTokenFormat(
|
|
150
|
+
`),r||(r=!0,this.cleanup(),o(new Error("No token received from OAuth callback")));return}if(!this.validateTokenFormat(a)){n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
|
|
181
151
|
<!DOCTYPE html>
|
|
182
152
|
<html>
|
|
183
153
|
<head>
|
|
@@ -201,7 +171,7 @@ client.connect();
|
|
|
201
171
|
</div>
|
|
202
172
|
</body>
|
|
203
173
|
</html>
|
|
204
|
-
`),r||(r=!0,this.cleanup(),o(new Error("Invalid token format - expected ak.sk format")));return}let[u,m]=
|
|
174
|
+
`),r||(r=!0,this.cleanup(),o(new Error("Invalid token format - expected ak.sk format")));return}let[u,m]=a.split(".");n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
|
|
205
175
|
<!DOCTYPE html>
|
|
206
176
|
<html>
|
|
207
177
|
<head>
|
|
@@ -233,7 +203,7 @@ client.connect();
|
|
|
233
203
|
</script>
|
|
234
204
|
</body>
|
|
235
205
|
</html>
|
|
236
|
-
`),r||(r=!0,this.cleanup(),t({ak:u,sk:m}))}else n.writeHead(404,{"Content-Type":"text/plain"}),n.end("Not Found")}),this.server.on("error",s=>{if(s.code==="EADDRINUSE"){if(this.port++,this.port>9390){r||(r=!0,o(new Error("Could not find available port for OAuth callback server")));return}this.server.close(),this.server.listen(this.port)}else r||(r=!0,this.cleanup(),o(s))}),this.server.listen(this.port,()=>{process.env.CODEV_DEBUG&&console.log(`OAuth callback server listening on port ${this.port}`)}),this.timeoutId=setTimeout(()=>{r||(r=!0,this.cleanup(),o(new Error("OAuth login timeout - no response received within 5 minutes")))},this.timeout)})}getCallbackUrl(){return`http://localhost:${this.port}/callback`}cleanup(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.server&&(this.server.close(),this.server=null)}};
|
|
206
|
+
`),r||(r=!0,this.cleanup(),t({ak:u,sk:m}))}else n.writeHead(404,{"Content-Type":"text/plain"}),n.end("Not Found")}),this.server.on("error",s=>{if(s.code==="EADDRINUSE"){if(this.port++,this.port>9390){r||(r=!0,o(new Error("Could not find available port for OAuth callback server")));return}this.server.close(),this.server.listen(this.port)}else r||(r=!0,this.cleanup(),o(s))}),this.server.listen(this.port,()=>{process.env.CODEV_DEBUG&&console.log(`OAuth callback server listening on port ${this.port}`)}),this.timeoutId=setTimeout(()=>{r||(r=!0,this.cleanup(),o(new Error("OAuth login timeout - no response received within 5 minutes")))},this.timeout)})}getCallbackUrl(){return`http://localhost:${this.port}/callback`}cleanup(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.server&&(this.server.close(),this.server=null)}};He.exports=ae});var ze=_((wo,Ke)=>{var qt=require("crypto"),jt=Ve(),ce=class{constructor(e={}){this.baseUrl=e.baseUrl||"https://makecoder.com",this.callbackServer=null}generateState(){return qt.randomBytes(16).toString("hex")}buildAuthorizationUrl(e,t){let o=new URLSearchParams({redirect_uri:e,state:t,response_type:"token"});return`${this.baseUrl}/oauth/authorize?${o.toString()}`}async startOAuthFlow(){let e=this.generateState();this.callbackServer=new jt;let t=this.callbackServer.getCallbackUrl(),o=this.buildAuthorizationUrl(t,e),r=!1;try{let n=(await import("open")).default;await n(o),r=!0}catch(n){process.env.CODEV_DEBUG&&console.error("Browser open error:",n)}let s=this.callbackServer.waitForCallback(e);return{authUrl:o,waitPromise:s,browserOpened:r}}async login(){try{let{authUrl:e,waitPromise:t,browserOpened:o}=await this.startOAuthFlow();console.log(`
|
|
237
207
|
\u{1F510} \u5F00\u59CB OAuth \u767B\u5F55\u6D41\u7A0B...
|
|
238
208
|
`),console.log(`\u{1F4CB} \u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u5B8C\u6210\u767B\u5F55
|
|
239
209
|
`),console.log(`\u{1F310} \u6388\u6743\u5730\u5740: ${e}
|
|
@@ -241,19 +211,19 @@ client.connect();
|
|
|
241
211
|
`),o||console.warn("\u26A0\uFE0F \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668,\u8BF7\u624B\u52A8\u590D\u5236\u4E0A\u8FF0\u94FE\u63A5\u5230\u6D4F\u89C8\u5668\u6253\u5F00");let r=await t;return console.log(`\u2705 API Key \u83B7\u53D6\u6210\u529F!
|
|
242
212
|
`),r}catch(e){throw console.error(`
|
|
243
213
|
\u274C OAuth \u767B\u5F55\u5931\u8D25: ${e.message}
|
|
244
|
-
`),e}finally{this.callbackServer&&this.callbackServer.cleanup()}}cleanup(){this.callbackServer&&this.callbackServer.cleanup()}};
|
|
214
|
+
`),e}finally{this.callbackServer&&this.callbackServer.cleanup()}}cleanup(){this.callbackServer&&this.callbackServer.cleanup()}};Ke.exports=ce});var Xe=_(($o,Ye)=>{var We=require("readline"),Bt=ze(),le=class{constructor(e){this.argParser=e}async handle(e){let{authSubcommand:t,authRemainingArgs:o=[],codevServer:r}=e;if(t==="--help"||t===void 0)return this.showHelp(),0;switch(t){case"login":return await this.handleLogin(o,r);case"logout":return this.logout();case"status":return await this.status();default:return this.showHelp(),1}}async handleLogin(e,t){let o=null;for(let r=0;r<e.length;r++)if(e[r]==="--apikey"){o=e[r+1]||null;break}return o?this.loginWithApiKey(o):await this.dualLogin(t)}loginWithApiKey(e){let t=e.indexOf(".");if(t<=0||t===e.length-1)return console.error("\u274C API Key \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <ak>.<sk> \u683C\u5F0F"),1;let o=e.substring(0,t).trim(),r=e.substring(t+1).trim();return!o||!r?(console.error("\u274C API Key \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <ak>.<sk> \u683C\u5F0F"),1):this.argParser.saveAuthToConfig(e.trim())?(console.log(`\u2705 API Key \u5DF2\u4FDD\u5B58\u5230 ${this.argParser.configPath}`),0):(console.error("\u274C \u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u6743\u9650"),1)}async dualLogin(e){let t=new Bt({baseUrl:"https://makecoder.com"}),o,r,s;try{({authUrl:o,waitPromise:r,browserOpened:s}=await t.startOAuthFlow())}catch(l){return console.error(`\u274C \u542F\u52A8\u767B\u5F55\u6D41\u7A0B\u5931\u8D25: ${l.message}`),console.log(`
|
|
245
215
|
\u8BF7\u624B\u52A8\u8F93\u5165 API Key\uFF08\u83B7\u53D6\u5730\u5740: https://makecoder.com/my/apikeys\uFF09
|
|
246
216
|
`),await this.terminalOnlyLogin()}console.log(`
|
|
247
217
|
\u{1F510} \u767B\u5F55 MakeCoder
|
|
248
218
|
`),console.log(s?" \u65B9\u5F0F\u4E00\uFF1A\u6D4F\u89C8\u5668\u5DF2\u6253\u5F00\u6388\u6743\u9875\u9762\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u5B8C\u6210\u767B\u5F55":" \u65B9\u5F0F\u4E00\uFF1A\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u4EE5\u4E0B\u5730\u5740\u5B8C\u6210\u767B\u5F55"),console.log(` ${o}
|
|
249
219
|
`),console.log(` \u65B9\u5F0F\u4E8C\uFF1A\u7C98\u8D34 API Key\uFF08\u83B7\u53D6\u5730\u5740: https://makecoder.com/my/apikeys\uFF09
|
|
250
|
-
`);let n=
|
|
220
|
+
`);let n=We.createInterface({input:process.stdin,output:process.stdout}),i=new Promise((l,d)=>{n.question("\u8BF7\u8F93\u5165 API Key\uFF08\u7559\u7A7A\u5219\u7B49\u5F85\u6D4F\u89C8\u5668\u767B\u5F55\uFF09: ",u=>{let m=u.trim();if(!m){d(new Error("__empty_input__"));return}let p=m.indexOf(".");if(p<=0||p===m.length-1){d(new Error("API Key \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <ak>.<sk> \u683C\u5F0F"));return}l(m)})}),a;try{a=await Promise.race([r.then(l=>(n.close(),`${l.ak}.${l.sk}`)),i.then(l=>(t.cleanup(),l))])}catch(l){if(l.message==="__empty_input__"){console.log(`
|
|
251
221
|
\u23F3 \u7B49\u5F85\u6D4F\u89C8\u5668\u6388\u6743\u5B8C\u6210...\uFF08\u8D85\u65F6\u65F6\u95F4: 5\u5206\u949F\uFF09
|
|
252
|
-
`);try{let d=await r;
|
|
222
|
+
`);try{let d=await r;a=`${d.ak}.${d.sk}`}catch(d){return t.cleanup(),console.error(`
|
|
253
223
|
\u274C \u767B\u5F55\u5931\u8D25: ${d.message}`),1}}else return n.close(),t.cleanup(),console.error(`
|
|
254
|
-
\u274C ${l.message}`),1}return t.cleanup(),this.argParser.saveAuthToConfig(
|
|
224
|
+
\u274C ${l.message}`),1}return t.cleanup(),this.argParser.saveAuthToConfig(a)?(console.log(`
|
|
255
225
|
\u2705 \u767B\u5F55\u6210\u529F\uFF01API Key \u5DF2\u4FDD\u5B58\u5230 ${this.argParser.configPath}`),0):(console.error(`
|
|
256
|
-
\u26A0\uFE0F \u767B\u5F55\u6210\u529F\u4F46\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u6743\u9650`),1)}async terminalOnlyLogin(){let e=
|
|
226
|
+
\u26A0\uFE0F \u767B\u5F55\u6210\u529F\u4F46\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u6743\u9650`),1)}async terminalOnlyLogin(){let e=We.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question("\u8BF7\u8F93\u5165 API Key: ",o=>{e.close();let r=o.trim();if(!r){console.error("\u274C \u672A\u8F93\u5165 API Key"),t(1);return}let s=r.indexOf(".");if(s<=0||s===r.length-1){console.error("\u274C API Key \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <ak>.<sk> \u683C\u5F0F"),t(1);return}this.argParser.saveAuthToConfig(r)?(console.log(`\u2705 \u767B\u5F55\u6210\u529F\uFF01API Key \u5DF2\u4FDD\u5B58\u5230 ${this.argParser.configPath}`),t(0)):(console.error("\u274C \u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u6743\u9650"),t(1))})})}logout(){return this.argParser.clearAuthFromConfig()?(console.log("\u2705 \u5DF2\u9000\u51FA\u767B\u5F55\uFF0CAPI Key \u5DF2\u6E05\u9664"),0):(console.error("\u274C \u9000\u51FA\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u6743\u9650"),1)}async status(){let e=this.argParser.loadConfig(),t=this.argParser.getApiKeyFromConfig(e);if(!t)return console.log("\u274C \u672A\u767B\u5F55"),console.log(" \u8FD0\u884C coder auth login \u5F00\u59CB\u767B\u5F55"),0;let o=t.substring(0,4)+"****";console.log(`\u2705 \u5DF2\u767B\u5F55 (${o})`),console.log(` \u914D\u7F6E\u6587\u4EF6: ${this.argParser.configPath}`);try{let r=require("https"),s=require("http"),n=new URL("https://makecoder.com/bigapis/auth/v1/users/me"),i=n.protocol==="https:"?r:s,a=await new Promise((l,d)=>{let u=i.request(n,{method:"GET",headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},timeout:5e3},m=>{let p="";m.on("data",f=>{p+=f}),m.on("end",()=>{if(m.statusCode===200)try{l(JSON.parse(p))}catch{d(new Error("\u89E3\u6790\u54CD\u5E94\u5931\u8D25"))}else m.statusCode===401?d(new Error("unauthorized")):d(new Error(`HTTP ${m.statusCode}`))})});u.on("error",d),u.on("timeout",()=>{u.destroy(),d(new Error("\u8BF7\u6C42\u8D85\u65F6"))}),u.end()});a.data?.id&&console.log(` \u7528\u6237 ID: ${a.data.id}`),a.data?.username&&console.log(` \u7528\u6237\u540D: ${a.data.username}`)}catch(r){r.message==="unauthorized"&&console.log(" \u26A0\uFE0F API Key \u53EF\u80FD\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55: coder auth login")}return 0}showHelp(){console.log(`
|
|
257
227
|
\u7528\u6CD5:
|
|
258
228
|
coder auth <command>
|
|
259
229
|
|
|
@@ -272,56 +242,57 @@ client.connect();
|
|
|
272
242
|
coder auth status # \u67E5\u770B\u767B\u5F55\u72B6\u6001
|
|
273
243
|
|
|
274
244
|
\u83B7\u53D6 API Key: https://makecoder.com/my/apikeys
|
|
275
|
-
`)}};
|
|
245
|
+
`)}};Ye.exports=le});var Qe=_((xo,Ze)=>{var de=require("crypto"),{URL:Ut}=require("url"),ue=class{static generateSignature(e,t,o,r){try{let s=new Ut(e),n=Buffer.from(s.pathname),i=Buffer.from(n),a=t?typeof t=="string"?Buffer.from(t):Buffer.from(JSON.stringify(t)):Buffer.alloc(0),l=Buffer.concat([i,a,Buffer.from(r)]),d=de.createHmac("sha256",o);return d.update(l),d.digest("hex")}catch(s){throw new Error(`Failed to generate signature: ${s.message}`)}}static validateSignature(e,t,o,r,s){return this.generateSignature(e,t,o,r)===s}static generateTimestamp(){return Date.now().toString()}static generateStrongPassword(e=16){let t="abcdefghijkmnpqrstuvwxyz",o="ABCDEFGHJKLMNPQRSTUVWXYZ",r="23456789",s="!@#$%^&*-_=+",n=t+o+r+s;e<8&&(e=8);let i=l=>l[de.randomBytes(1)[0]%l.length],a=[i(t),i(o),i(r),i(s)];for(;a.length<e;)a.push(i(n));for(let l=a.length-1;l>0;l--){let d=de.randomBytes(1)[0]%(l+1);[a[l],a[d]]=[a[d],a[l]]}return a.join("")}};Ze.exports=ue});var tt=_((ko,et)=>{var Lt=require("https"),{URL:Nt}=require("url"),F=require("fs"),q=require("path"),Rt=Qe(),Ft="https://makecoder.com/bigapis/auth/v1",Mt="https://makecoder.com/bigapis/kbb2/v1",Jt="https://makecoder.com/wiki/api",fe=class{constructor(e){this.argParser=e||null}request(e,t,o,r,s){return new Promise((n,i)=>{let a=s||Ft,l=new Nt(`${a}${t}`),d={"Content-Type":"application/json",Authorization:`Bearer ${o}`},u=null;r!=null&&(u=JSON.stringify(r),d["Content-Length"]=Buffer.byteLength(u));let m={hostname:l.hostname,port:l.port||443,path:l.pathname+l.search,method:e,headers:d},p=Lt.request(m,f=>{let h="";f.on("data",y=>h+=y),f.on("end",()=>n({status:f.statusCode,body:h}))});p.on("error",i),u&&p.write(u),p.end()})}parseJson(e){try{return JSON.parse(e)}catch{return null}}exitCodeForStatus(e){return e===401?2:e===403?5:e===404?4:e===409?6:1}parseOutputFlags(e){let t={json:!1,quiet:!1,field:null},o=[];for(let r=0;r<e.length;r++){let s=e[r];if(s==="--json"){t.json=!0;continue}if(s==="--quiet"){t.quiet=!0;continue}if(s!=="--no-color"){if(s==="--field"){t.field=e[r+1],r++;continue}o.push(s)}}return{out:t,remaining:o}}async handle({teamSubcommand:e,teamArg:t,teamRemainingArgs:o,apikey:r}){if(!e||e==="--help"||e==="-h")return this.showHelp(),0;let s=r;if(!s)return console.error("\u274C 2: \u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u8FD0\u884C coder auth login"),2;let n=o||[];return e==="list"||e==="ls"?await this.list(n,s):e==="current"?await this.current(n,s):e==="use"?await this.use(t,n,s):e==="info"?await this.info(t,n,s):e==="members"?await this.members(t,n,s):e==="member-get"?await this.memberGet(t,n,s):e==="search-member"?await this.searchMember(t,n,s):e==="member-create"?await this.memberCreate(t,n,s):e==="member-delete"?await this.memberDelete(t,n,s):e==="member-update"?await this.memberUpdate(t,n,s):e==="set-points"?await this.setPoints(t,n,s):e==="groups"?await this.groupsList(t,n,s):e==="group-info"?await this.groupInfo(t,n,s):e==="group-create"?await this.groupCreate(t,n,s):e==="group-update"?await this.groupUpdate(t,n,s):e==="group-delete"?await this.groupDelete(t,n,s):e==="group-members"?await this.groupMembers(t,n,s):e==="group-add-members"?await this.groupAddMembers(t,n,s):e==="group-set-role"?await this.groupSetRole(t,n,s):e==="group-remove-member"?await this.groupRemoveMember(t,n,s):(console.error(`\u274C 3: \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),this.showHelp(),3)}async list(e,t){let{out:o}=this.parseOutputFlags(e),s=`/team?constraints=${encodeURIComponent(JSON.stringify({filter_is_joined:!0}))}&page=1&size=200`,n;try{n=await this.request("GET",s,t)}catch(d){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${d.message}`),1}if(n.status!==200)return console.error(`\u274C ${this.exitCodeForStatus(n.status)}: HTTP ${n.status}`),n.body&&console.error(n.body),this.exitCodeForStatus(n.status);let i=this.parseJson(n.body);if(!i||!i.data)return console.error("\u274C 1: \u54CD\u5E94\u89E3\u6790\u5931\u8D25"),1;let a=i.data.items||[];if(o.json){let d={items:a,total:i.data.total??a.length};if(o.field){let u=v(d,o.field);process.stdout.write(S(u)+`
|
|
276
246
|
`)}else process.stdout.write(JSON.stringify(d,null,2)+`
|
|
277
|
-
`);return 0}if(o.quiet){for(let d of
|
|
247
|
+
`);return 0}if(o.quiet){for(let d of a)console.log(d.id);return 0}if(!a.length)return console.log("\uFF08\u4F60\u8FD8\u6CA1\u6709\u52A0\u5165\u4EFB\u4F55\u56E2\u961F\uFF09"),0;let l=a.map(d=>({id:d.id||"",name:d.name||"",members:(d.members_count??d.member_count??"")+"",points:d.points!=null?String(d.points):""}));return M([["id","ID"],["name","\u540D\u79F0"],["members","\u6210\u5458\u6570"],["points","\u79EF\u5206"]],l),0}resolveTeamId(e,t){if(e&&!e.startsWith("--"))return e;let o=t.indexOf("--team");if(o>=0&&t[o+1])return t[o+1];let r=this.argParser?this.argParser.getTeam():null;return r&&r.id?r.id:null}async fetchTeam(e,t){let r=`/team?constraints=${encodeURIComponent(JSON.stringify({id__in:[e]}))}`,s=await this.request("GET",r,t);if(s.status!==200)return{error:{code:this.exitCodeForStatus(s.status),status:s.status,body:s.body}};let n=this.parseJson(s.body),i=n&&n.data&&n.data.items||[];return i.length?{team:i[0]}:{error:{code:4,status:404,body:`team ${e} not found`}}}filterMembersByType(e,t){return t?e.filter(o=>o.user_type===t):e}async info(e,t,o){let{out:r}=this.parseOutputFlags(t),s=this.resolveTeamId(e,t);if(!s)return console.error("\u274C 3: \u672A\u6307\u5B9A teamId \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F\u3002\u8FD0\u884C 'coder team use <id>' \u6216\u5E26 [teamId] \u53C2\u6570"),3;let n;try{n=await this.fetchTeam(s,o)}catch(u){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${u.message}`),1}if(n.error)return console.error(`\u274C ${n.error.code}: HTTP ${n.error.status}`),n.error.body&&console.error(n.error.body),n.error.code;let i=n.team,a=Array.isArray(i.members)?i.members:[],l=a.filter(u=>u.user_type==="ai").length,d=a.filter(u=>u.user_type==="human").length;if(r.json){let u={id:i.id,name:i.name,description:i.description||"",points:i.points,points_expire_at:i.points_expire_at||null,is_active:!!i.is_active,members_total:a.length,members_ai:l,members_human:d};return r.field?process.stdout.write(S(v(u,r.field))+`
|
|
278
248
|
`):process.stdout.write(JSON.stringify(u,null,2)+`
|
|
279
|
-
`),0}return r.quiet?(console.log(i.id),0):(console.log(`team: ${i.name} (${i.id})`),i.description&&console.log(`description: ${i.description}`),console.log(`points: ${i.points??""}`),i.points_expire_at&&console.log(`points_expire_at: ${i.points_expire_at}`),console.log(`active: ${i.is_active?"yes":"no"}`),console.log(`members: ${
|
|
280
|
-
`):process.stdout.write(JSON.stringify(
|
|
281
|
-
`),0}if(r.quiet){for(let
|
|
249
|
+
`),0}return r.quiet?(console.log(i.id),0):(console.log(`team: ${i.name} (${i.id})`),i.description&&console.log(`description: ${i.description}`),console.log(`points: ${i.points??""}`),i.points_expire_at&&console.log(`points_expire_at: ${i.points_expire_at}`),console.log(`active: ${i.is_active?"yes":"no"}`),console.log(`members: ${a.length} (ai=${l}, human=${d})`),0)}async members(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=null,i=[];for(let f=0;f<s.length;f++){if(s[f]==="--type"){n=s[f+1],f++;continue}i.push(s[f])}let a=this.resolveTeamId(e,i);if(!a)return console.error("\u274C 3: \u672A\u6307\u5B9A teamId \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F\u3002\u8FD0\u884C 'coder team use <id>' \u6216\u5E26 [teamId] \u53C2\u6570"),3;if(n&&n!=="human"&&n!=="ai")return console.error(`\u274C 3: --type \u4EC5\u652F\u6301 human \u6216 ai\uFF0C\u6536\u5230 '${n}'`),3;let l;try{l=await this.fetchTeam(a,o)}catch(f){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${f.message}`),1}if(l.error)return console.error(`\u274C ${l.error.code}: HTTP ${l.error.status}`),l.error.body&&console.error(l.error.body),l.error.code;let d=Array.isArray(l.team.members)?l.team.members:[],u=this.filterMembersByType(d,n);if(r.json){let f={team_id:l.team.id,team_name:l.team.name,items:u,total:u.length};return r.field?process.stdout.write(S(v(f,r.field))+`
|
|
250
|
+
`):process.stdout.write(JSON.stringify(f,null,2)+`
|
|
251
|
+
`),0}if(r.quiet){for(let f of u)console.log(f.user_id||f.id||"");return 0}if(!u.length)return console.log(n?`\uFF08\u65E0 ${n} \u7C7B\u578B\u6210\u5458\uFF09`:"\uFF08\u56E2\u961F\u6682\u65E0\u6210\u5458\uFF09"),0;let p=[...u].sort((f,h)=>{let y=f.user_type==="ai"?0:1,b=h.user_type==="ai"?0:1;return y!==b?y-b:(f.username||"").localeCompare(h.username||"")}).map(f=>({username:f.username||"",nickname:f.nickname||"",introduction:f.introduction||"",mentor:me(f,d),user_id:f.user_id||"",type:f.user_type||"",role:f.role||"",points:f.points==null?"\u221E":String(f.points),joined_at:(f.created_at||"").slice(0,10)}));return M([["username","\u7528\u6237\u540D"],["user_id","\u7528\u6237ID"],["type","\u7C7B\u578B"],["role","\u89D2\u8272"],["nickname","\u6635\u79F0"],["introduction","\u7B80\u4ECB"],["mentor","\u5BFC\u5E08"],["points","\u79EF\u5206"],["joined_at","\u52A0\u5165\u65F6\u95F4"]],p),0}async memberGet(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=[];for(let p=0;p<s.length;p++){if(s[p]==="--team"){p++;continue}n.push(s[p])}let i=n[0];if(!i)return console.error("\u274C 3: \u7F3A\u5C11 userId \u53C2\u6570\u3002\u7528\u6CD5: coder team member-get <userId> [teamId]"),3;let l=n[1]||this.resolveTeamId(void 0,s);if(!l)return console.error("\u274C 3: \u672A\u6307\u5B9A teamId \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F\u3002\u8FD0\u884C 'coder team use <id>' \u6216\u5E26 [teamId] \u53C2\u6570"),3;let d;try{d=await this.fetchTeam(l,o)}catch(p){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${p.message}`),1}if(d.error)return console.error(`\u274C ${d.error.code}: HTTP ${d.error.status}`),d.error.body&&console.error(d.error.body),d.error.code;let u=Array.isArray(d.team.members)?d.team.members:[],m=u.find(p=>p.user_id===i||p.id===i||p.username===i);return m?r.json?(r.field?process.stdout.write(S(v(m,r.field))+`
|
|
282
252
|
`):process.stdout.write(JSON.stringify(m,null,2)+`
|
|
283
|
-
`),0):r.quiet?(console.log(m.user_id||m.id),0):(console.log(`username: ${m.username||""}`),console.log(`user_id: ${m.user_id||""}`),console.log(`type: ${m.user_type||""}`),console.log(`role: ${m.role||""}`),console.log(`nickname: ${m.nickname||""}`),console.log(`introduction: ${m.introduction||""}`),console.log(`mentor: ${
|
|
253
|
+
`),0):r.quiet?(console.log(m.user_id||m.id),0):(console.log(`username: ${m.username||""}`),console.log(`user_id: ${m.user_id||""}`),console.log(`type: ${m.user_type||""}`),console.log(`role: ${m.role||""}`),console.log(`nickname: ${m.nickname||""}`),console.log(`introduction: ${m.introduction||""}`),console.log(`mentor: ${me(m,u)}`),console.log(`status: ${m.status||""}`),console.log(`points: ${m.points==null?"\u221E":m.points}`),console.log(`joined_at: ${m.created_at||""}`),m.im_bindings&&m.im_bindings.length&&console.log(`im_bindings: ${m.im_bindings.map(p=>p.channel).join(",")}`),0):(console.error(`\u274C 4: \u6210\u5458 '${i}' \u4E0D\u5728\u56E2\u961F '${d.team.name}' \u4E2D`),4)}async searchMember(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=[],i=null;for(let g=0;g<s.length;g++){if(s[g]==="--team"){g++;continue}if(s[g]==="--type"){i=s[g+1],g++;continue}n.push(s[g])}let a=n[0];if(!a)return console.error("\u274C 3: \u7F3A\u5C11 keyword \u53C2\u6570\u3002\u7528\u6CD5: coder team search-member <keyword> [teamId]"),3;let d=n[1]||this.resolveTeamId(void 0,s);if(!d)return console.error("\u274C 3: \u672A\u6307\u5B9A teamId \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;if(i&&i!=="human"&&i!=="ai")return console.error(`\u274C 3: --type \u4EC5\u652F\u6301 human \u6216 ai\uFF0C\u6536\u5230 '${i}'`),3;let u;try{u=await this.fetchTeam(d,o)}catch(g){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${g.message}`),1}if(u.error)return console.error(`\u274C ${u.error.code}: HTTP ${u.error.status}`),u.error.body&&console.error(u.error.body),u.error.code;let m=Array.isArray(u.team.members)?u.team.members:[],p=this.filterMembersByType(m,i),f=a.toLowerCase(),h=p.filter(g=>{let I=(g.username||"").toLowerCase(),$=(g.user_id||"").toLowerCase(),w=(g.id||"").toLowerCase(),k=(g.nickname||"").toLowerCase(),O=(g.introduction||"").toLowerCase();return I.includes(f)||$.includes(f)||w.includes(f)||k.includes(f)||O.includes(f)});if(r.json){let g={team_id:u.team.id,keyword:a,items:h,total:h.length};return r.field?process.stdout.write(S(v(g,r.field))+`
|
|
284
254
|
`):process.stdout.write(JSON.stringify(g,null,2)+`
|
|
285
|
-
`),0}if(r.quiet){for(let g of
|
|
255
|
+
`),0}if(r.quiet){for(let g of h)console.log(g.user_id||g.id||"");return 0}if(!h.length)return console.log(`\uFF08\u672A\u5339\u914D\u5230 '${a}'\uFF09`),0;let b=[...h].sort((g,I)=>{let $=g.user_type==="ai"?0:1,w=I.user_type==="ai"?0:1;return $!==w?$-w:(g.username||"").localeCompare(I.username||"")}).map(g=>({username:g.username||"",user_id:g.user_id||"",type:g.user_type||"",role:g.role||"",nickname:g.nickname||"",introduction:g.introduction||"",mentor:me(g,m)}));return M([["username","\u7528\u6237\u540D"],["user_id","\u7528\u6237ID"],["type","\u7C7B\u578B"],["role","\u89D2\u8272"],["nickname","\u6635\u79F0"],["introduction","\u7B80\u4ECB"],["mentor","\u5BFC\u5E08"]],b),0}parseMemberCreateFlags(e){let t=[],o={type:"human",password:null,phone:null,points:null,team:null,saveTo:null,nickname:null,mentor:null};for(let r=0;r<e.length;r++){let s=e[r];if(s==="--type"){o.type=e[++r];continue}if(s==="--password"){o.password=e[++r];continue}if(s==="--phone"){o.phone=e[++r];continue}if(s==="--points"){o.points=e[++r];continue}if(s==="--team"){o.team=e[++r];continue}if(s==="--save-to"){o.saveTo=e[++r];continue}if(s==="--nickname"){o.nickname=e[++r];continue}if(s==="--mentor"){o.mentor=e[++r];continue}t.push(s)}return o.type!=="human"&&o.type!=="ai"?{error:`--type \u4EC5\u652F\u6301 human \u6216 ai\uFF0C\u6536\u5230 '${o.type}'`}:{remaining:t,opts:o}}isInsideGitRepo(e){let t=q.resolve(e);for((!F.existsSync(t)||!F.statSync(t).isDirectory())&&(t=q.dirname(t));t&&t!==q.dirname(t);){if(F.existsSync(q.join(t,".git")))return!0;t=q.dirname(t)}return!1}async memberCreate(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=this.parseMemberCreateFlags(s);if(n.error)return console.error(`\u274C 3: ${n.error}`),3;let{remaining:i,opts:a}=n,l=i[0];if(!l)return console.error("\u274C 3: \u7F3A\u5C11 username \u53C2\u6570\u3002\u7528\u6CD5: coder team member-create <username> [...]"),3;let d=a.team||this.resolveTeamId(void 0,[]);if(!d)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F\u3002\u8FD0\u884C 'coder team use <id>' \u6216\u52A0 --team <id>"),3;if(a.type==="human"&&!a.phone)return console.error("\u274C 3: \u521B\u5EFA human \u6210\u5458\u5FC5\u987B\u63D0\u4F9B --phone <phone>"),3;if(a.saveTo){let I=q.resolve(a.saveTo);if(this.isInsideGitRepo(I))return console.error(`\u274C 3: --save-to \u8DEF\u5F84\u5728 git \u4ED3\u5E93\u5185\uFF08${I}\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165\u907F\u514D\u8BEF\u63D0\u4EA4`),3}let u=a.password||Rt.generateStrongPassword(16),m=!a.password,p=null;if(a.points!==null&&a.points!==void 0){let I=Number(a.points);if(!Number.isFinite(I))return console.error(`\u274C 3: --points \u5E94\u4E3A\u6570\u5B57\uFF0C\u6536\u5230 '${a.points}'`),3;p=I}let f={payload:{username:l,password:u,phone:a.phone||null,team_id:d,points:p,user_type:a.type,...a.nickname?{nickname:a.nickname}:{},...a.type==="ai"&&a.mentor?{config:{metadata:{created_by:a.mentor}}}:{}},auto_login:!1,auth_name:"UserPass"},h;try{h=await this.request("POST","/users",o,f)}catch(I){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${I.message}`),1}if(h.status<200||h.status>=300)return console.error(`\u274C ${this.exitCodeForStatus(h.status)}: HTTP ${h.status}`),h.body&&console.error(h.body),this.exitCodeForStatus(h.status);let y=this.parseJson(h.body),b=null;if(a.saveTo){let I=q.resolve(a.saveTo),$=`# Coder team member credentials
|
|
286
256
|
# Created: ${new Date().toISOString()}
|
|
287
257
|
username: ${l}
|
|
288
258
|
password: ${u}
|
|
289
259
|
team_id: ${d}
|
|
290
|
-
type: ${
|
|
291
|
-
`;try{
|
|
260
|
+
type: ${a.type}
|
|
261
|
+
`;try{F.writeFileSync(I,$,{mode:384});try{F.chmodSync(I,384)}catch{}b=I}catch(w){console.error(`\u26A0\uFE0F \u4FDD\u5B58\u51ED\u636E\u5931\u8D25: ${w.message}`)}}let g={username:l,password:u,team_id:d,user_type:a.type,nickname:a.nickname||null,mentor:a.mentor||null,saved_to:b,response:y&&y.data?y.data:y};return r.json?(r.field?process.stdout.write(S(v(g,r.field))+`
|
|
292
262
|
`):process.stdout.write(JSON.stringify(g,null,2)+`
|
|
293
|
-
`),0):r.quiet?(console.log(l),0):(console.log("\u2705 \u6210\u5458\u521B\u5EFA\u6210\u529F"),console.log(`username: ${l}`),console.log(`password: ${u} ${m?"(\u968F\u673A\u751F\u6210\uFF0C\u8BF7\u59A5\u5584\u4FDD\u7BA1)":""}`),console.log(`team_id: ${d}`),console.log(`type: ${
|
|
294
|
-
`):(console.log(`\u5C06\u5220\u9664\u6210\u5458 ${p.username} (user_id=${p.user_id}, role=${p.role})`),console.log(`\u4ECE\u56E2\u961F: ${u.team.name} (${d})`),console.log(`endpoint: DELETE /team/${d}/members/${p.id}`),console.log(`\u26A0\uFE0F ${
|
|
295
|
-
`),0):r.quiet?(console.log(p.user_id),0):(console.log(`\u2705 \u5DF2\u5220\u9664\u6210\u5458 ${p.username} (${p.user_id}) from ${u.team.name}`),0)}async memberUpdate(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=[],i={nickname:null,mentor:null,clearMentor:!1,team:null};for(let y=0;y<s.length;y++){let b=s[y];if(b==="--nickname"){i.nickname=s[++y];continue}if(b==="--mentor"){i.mentor=s[++y];continue}if(b==="--clear-mentor"){i.clearMentor=!0;continue}if(b==="--team"){i.team=s[++y];continue}n.push(b)}let
|
|
296
|
-
`):process.stdout.write(JSON.stringify(
|
|
297
|
-
`),0):r.quiet?(console.log(m.user_id),0):(console.log(`\u2705 \u5DF2\u66F4\u65B0\u6210\u5458 ${m.username} (${m.user_id})`),i.nickname!==null&&console.log(`nickname: ${i.nickname}`),i.clearMentor?console.log("mentor: (\u5DF2\u6E05\u9664)"):i.mentor!==null&&console.log(`mentor: ${i.mentor}`),0)}async setPoints(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=[],i={unlimited:!1,inherit:!1,points:null,team:null};for(let w=0;w<s.length;w++){let k=s[w];if(k==="--unlimited"){i.unlimited=!0;continue}if(k==="--inherit"){i.inherit=!0;continue}if(k==="--points"){i.points=s[++w];continue}if(k==="--team"){i.team=s[++w];continue}n.push(k)}let
|
|
263
|
+
`),0):r.quiet?(console.log(l),0):(console.log("\u2705 \u6210\u5458\u521B\u5EFA\u6210\u529F"),console.log(`username: ${l}`),console.log(`password: ${u} ${m?"(\u968F\u673A\u751F\u6210\uFF0C\u8BF7\u59A5\u5584\u4FDD\u7BA1)":""}`),console.log(`team_id: ${d}`),console.log(`type: ${a.type}`),a.nickname&&console.log(`nickname: ${a.nickname}`),a.mentor&&console.log(`mentor: ${a.mentor}`),console.log(b?`\u26A0\uFE0F \u51ED\u636E\u5DF2\u4FDD\u5B58\u5230 ${b} (mode 0600)\uFF0C\u8BF7\u59A5\u5584\u4FDD\u7BA1\uFF0C\u5EFA\u8BAE\u52A0\u5165 .gitignore`:"\u26A0\uFE0F \u4EE5\u4E0A\u51ED\u636E\u4EC5\u663E\u793A\u4E00\u6B21\uFF0C\u672A --save-to \u65F6\u8BF7\u7ACB\u5373\u8BB0\u5F55"),0)}async memberDelete(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=[],i=!1,a=null;for(let h=0;h<s.length;h++){if(s[h]==="--yes"||s[h]==="-y"){i=!0;continue}if(s[h]==="--team"){a=s[++h];continue}n.push(s[h])}let l=n[0];if(!l)return console.error("\u274C 3: \u7F3A\u5C11 userId \u53C2\u6570\u3002\u7528\u6CD5: coder team member-delete <userId> [--yes]"),3;let d=a||n[1]||this.resolveTeamId(void 0,[]);if(!d)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;let u;try{u=await this.fetchTeam(d,o)}catch(h){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${h.message}`),1}if(u.error)return console.error(`\u274C ${u.error.code}: HTTP ${u.error.status}`),u.error.body&&console.error(u.error.body),u.error.code;let p=(Array.isArray(u.team.members)?u.team.members:[]).find(h=>h.user_id===l||h.id===l||h.username===l);if(!p)return console.error(`\u274C 4: \u6210\u5458 '${l}' \u4E0D\u5728\u56E2\u961F '${u.team.name}' \u4E2D`),4;if(!i){let h="\u9AD8\u5F71\u54CD\u64CD\u4F5C\uFF0C\u5FC5\u987B\u52A0 --yes \u624D\u4F1A\u6267\u884C";return r.json?process.stdout.write(JSON.stringify({method:"DELETE",path:`/team/${d}/members/${p.id}`,target:{username:p.username,user_id:p.user_id,role:p.role},note:h},null,2)+`
|
|
264
|
+
`):(console.log(`\u5C06\u5220\u9664\u6210\u5458 ${p.username} (user_id=${p.user_id}, role=${p.role})`),console.log(`\u4ECE\u56E2\u961F: ${u.team.name} (${d})`),console.log(`endpoint: DELETE /team/${d}/members/${p.id}`),console.log(`\u26A0\uFE0F ${h}`)),10}let f;try{f=await this.request("DELETE",`/team/${d}/members/${p.id}`,o)}catch(h){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${h.message}`),1}return f.status<200||f.status>=300?(console.error(`\u274C ${this.exitCodeForStatus(f.status)}: HTTP ${f.status}`),f.body&&console.error(f.body),this.exitCodeForStatus(f.status)):r.json?(process.stdout.write(JSON.stringify({deleted:!0,username:p.username,user_id:p.user_id,team_id:d},null,2)+`
|
|
265
|
+
`),0):r.quiet?(console.log(p.user_id),0):(console.log(`\u2705 \u5DF2\u5220\u9664\u6210\u5458 ${p.username} (${p.user_id}) from ${u.team.name}`),0)}async memberUpdate(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=[],i={nickname:null,mentor:null,clearMentor:!1,team:null};for(let y=0;y<s.length;y++){let b=s[y];if(b==="--nickname"){i.nickname=s[++y];continue}if(b==="--mentor"){i.mentor=s[++y];continue}if(b==="--clear-mentor"){i.clearMentor=!0;continue}if(b==="--team"){i.team=s[++y];continue}n.push(b)}let a=n[0];if(!a)return console.error("\u274C 3: \u7F3A\u5C11 userId \u53C2\u6570\u3002\u7528\u6CD5: coder team member-update <userId> [--nickname <n>] [--mentor <userId>]"),3;if(i.nickname===null&&i.mentor===null&&!i.clearMentor)return console.error("\u274C 3: \u81F3\u5C11\u9700\u8981\u63D0\u4F9B --nickname \u6216 --mentor \u6216 --clear-mentor"),3;let l=i.team||n[1]||this.resolveTeamId(void 0,[]);if(!l)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F\u3002\u8FD0\u884C 'coder team use <id>' \u6216\u52A0 --team <id>"),3;let d;try{d=await this.fetchTeam(l,o)}catch(y){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${y.message}`),1}if(d.error)return console.error(`\u274C ${d.error.code}: HTTP ${d.error.status}`),d.error.body&&console.error(d.error.body),d.error.code;let u=Array.isArray(d.team.members)?d.team.members:[],m=u.find(y=>y.user_id===a||y.id===a||y.username===a);if(!m)return console.error(`\u274C 4: \u6210\u5458 '${a}' \u4E0D\u5728\u56E2\u961F '${d.team.name}' \u4E2D`),4;let p={};if(i.nickname!==null&&(p.nickname=i.nickname),i.clearMentor)p.created_by=null;else if(i.mentor!==null){let y=u.find(b=>b.user_id===i.mentor||b.username===i.mentor);if(!y)return console.error(`\u274C 4: mentor '${i.mentor}' \u4E0D\u5728\u56E2\u961F\u4E2D`),4;p.created_by=y.user_id}let f;try{f=await this.request("PATCH",`/team/${l}/ai_users/${m.user_id}`,o,p)}catch(y){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${y.message}`),1}if(f.status<200||f.status>=300)return console.error(`\u274C ${this.exitCodeForStatus(f.status)}: HTTP ${f.status}`),f.body&&console.error(f.body),this.exitCodeForStatus(f.status);let h={username:m.username,user_id:m.user_id,team_id:l,nickname:i.nickname!==null?i.nickname:m.nickname||null,mentor:i.clearMentor?null:i.mentor||p.created_by||null};return r.json?(r.field?process.stdout.write(S(v(h,r.field))+`
|
|
266
|
+
`):process.stdout.write(JSON.stringify(h,null,2)+`
|
|
267
|
+
`),0):r.quiet?(console.log(m.user_id),0):(console.log(`\u2705 \u5DF2\u66F4\u65B0\u6210\u5458 ${m.username} (${m.user_id})`),i.nickname!==null&&console.log(`nickname: ${i.nickname}`),i.clearMentor?console.log("mentor: (\u5DF2\u6E05\u9664)"):i.mentor!==null&&console.log(`mentor: ${i.mentor}`),0)}async setPoints(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=[],i={unlimited:!1,inherit:!1,points:null,team:null};for(let w=0;w<s.length;w++){let k=s[w];if(k==="--unlimited"){i.unlimited=!0;continue}if(k==="--inherit"){i.inherit=!0;continue}if(k==="--points"){i.points=s[++w];continue}if(k==="--team"){i.team=s[++w];continue}n.push(k)}let a=n[0];if(!a)return console.error("\u274C 3: \u7F3A\u5C11 userId \u53C2\u6570\u3002\u7528\u6CD5: coder team set-points <userId> --unlimited|--points <n>|--inherit"),3;let l=[i.unlimited,i.inherit,i.points!==null].filter(Boolean).length;if(l===0)return console.error("\u274C 3: \u5FC5\u987B\u63D0\u4F9B --unlimited\u3001--points <n> \u6216 --inherit \u4E2D\u7684\u4E00\u4E2A"),3;if(l>1)return console.error("\u274C 3: --unlimited / --points / --inherit \u4E92\u65A5\uFF0C\u53EA\u80FD\u9009\u4E00\u4E2A"),3;let d;if(i.unlimited||i.inherit)d=null;else{let w=Number(i.points);if(!Number.isFinite(w)||w<0)return console.error(`\u274C 3: --points \u5E94\u4E3A\u975E\u8D1F\u6570\u5B57\uFF0C\u6536\u5230 '${i.points}'`),3;d=w}let u=i.team||n[1]||this.resolveTeamId(void 0,[]);if(!u)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F\u3002\u8FD0\u884C 'coder team use <id>' \u6216\u52A0 --team <id>"),3;let m;try{m=await this.fetchTeam(u,o)}catch(w){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${w.message}`),1}if(m.error)return console.error(`\u274C ${m.error.code}: HTTP ${m.error.status}`),m.error.body&&console.error(m.error.body),m.error.code;let f=(Array.isArray(m.team.members)?m.team.members:[]).find(w=>w.user_id===a||w.id===a||w.username===a);if(!f)return console.error(`\u274C 4: \u6210\u5458 '${a}' \u4E0D\u5728\u56E2\u961F '${m.team.name}' \u4E2D`),4;let h=`/refactor/coder/teams/${u}/members/${f.user_id}/points`,y={points:d},b=d===null?"\u4E0D\u9650\u91CF\uFF08\u7EE7\u627F\u56E2\u961F\u6C60\uFF09":String(d),g;try{g=await this.request("POST",h,o,y,Mt)}catch(w){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${w.message}`),1}if(g.status<200||g.status>=300){let w=this.exitCodeForStatus(g.status);return console.error(`\u274C ${w}: HTTP ${g.status}`),g.body&&console.error(g.body),w}let I=this.parseJson(g.body);if(I&&I.code!==void 0&&I.code!==0&&I.code!==null)return console.error(`\u274C 1: \u540E\u7AEF\u8FD4\u56DE code=${I.code} message=${I.message||""}`),1;let $={username:f.username,user_id:f.user_id,team_id:u,points:d,quota:b};return r.json?(r.field?process.stdout.write(S(v($,r.field))+`
|
|
298
268
|
`):process.stdout.write(JSON.stringify($,null,2)+`
|
|
299
|
-
`),0):r.quiet?(console.log(
|
|
269
|
+
`),0):r.quiet?(console.log(f.user_id),0):(console.log(`\u2705 \u5DF2\u4E3A ${f.username} (${f.user_id}) \u8BBE\u7F6E\u79EF\u5206\u914D\u989D: ${b}`),0)}async wikiSync(e,t,o){try{let r=await this.request("POST",`/${e}`,o,t,Jt);(r.status<200||r.status>=300)&&console.warn(`\u26A0\uFE0F wiki ${e} \u540C\u6B65\u5931\u8D25: HTTP ${r.status} ${r.body||""}`)}catch(r){console.warn(`\u26A0\uFE0F wiki ${e} \u540C\u6B65\u5931\u8D25: ${r.message}`)}}toWikiGroupRole(e){return e==="mentor"?"admin":"member"}async groupsList(e,t,o){let{out:r}=this.parseOutputFlags(t),s=this.resolveTeamId(e,t);if(!s)return console.error("\u274C 3: \u672A\u6307\u5B9A teamId \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F\u3002\u8FD0\u884C 'coder team use <id>' \u6216\u5E26 [teamId] \u53C2\u6570"),3;let n;try{n=await this.request("GET",`/team/${s}/groups`,o)}catch(d){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${d.message}`),1}if(n.status<200||n.status>=300){let d=this.exitCodeForStatus(n.status);return console.error(`\u274C ${d}: HTTP ${n.status}`),n.body&&console.error(n.body),d}let i=this.parseJson(n.body),a=i&&(i.data||i)||[];if(r.json){let d={team_id:s,items:a,total:a.length};return r.field?process.stdout.write(S(v(d,r.field))+`
|
|
300
270
|
`):process.stdout.write(JSON.stringify(d,null,2)+`
|
|
301
|
-
`),0}if(r.quiet){for(let d of
|
|
302
|
-
`):process.stdout.write(JSON.stringify(h,null,2)+`
|
|
303
|
-
`),0}return s.quiet?(console.log(u.id),0):(console.log(`group: ${u.name} (${u.id})`),console.log(`description: ${u.description||""}`),console.log(`team_id: ${c}`),console.log(`members: ${p.length}`),0)}async groupCreate(e,t,o){let r=this.parseGroupArgs(t,!1),{out:s,positional:n,flags:i}=r,c=n[0];if(!c)return console.error("\u274C 3: \u7F3A\u5C11 name \u53C2\u6570\u3002\u7528\u6CD5: coder team group-create <name> [--description <d>] [--team <teamId>]"),3;let l=r.teamId;if(!l)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;let d={name:c};i.description&&(d.description=i.description);let u;try{u=await this.request("POST",`/team/${l}/groups`,o,d)}catch(f){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${f.message}`),1}if(u.status<200||u.status>=300){let f=this.exitCodeForStatus(u.status);return console.error(`\u274C ${f}: HTTP ${u.status}`),u.body&&console.error(u.body),f}let m=this.parseJson(u.body),h=(m&&m.data||m||{}).id;if(h&&await this.wikiSync("sync.upsertGroup",{teamId:l,externalGroupId:h,name:c,description:i.description||void 0},o),s.json){let f={id:h,team_id:l,name:c,description:i.description||null};return s.field?process.stdout.write(v(S(f,s.field))+`
|
|
271
|
+
`),0}if(r.quiet){for(let d of a)console.log(d.id);return 0}if(!a.length)return console.log("\uFF08\u6682\u65E0\u5C0F\u7EC4\uFF09"),0;let l=a.map(d=>({id:d.id||"",name:d.name||"",description:d.description||"",created_at:(d.created_at||"").slice(0,10)}));return M([["id","ID"],["name","\u540D\u79F0"],["description","\u63CF\u8FF0"],["created_at","\u521B\u5EFA\u65F6\u95F4"]],l),0}parseGroupArgs(e,t=!0){let{out:o,remaining:r}=this.parseOutputFlags(e),s=[],n={};for(let l=0;l<r.length;l++){let d=r[l];if(d==="--team"){n.team=r[++l];continue}if(d==="--name"){n.name=r[++l];continue}if(d==="--description"){n.description=r[++l];continue}if(d==="--role"){n.role=r[++l];continue}if(d==="--yes"||d==="-y"){n.yes=!0;continue}s.push(d)}let i=s[0];if(t&&!i)return{error:"missing groupId"};let a=n.team||this.resolveTeamId(void 0,[]);return{out:o,positional:s,flags:n,groupId:i,teamId:a}}async fetchGroupMembersRaw(e,t,o){let r;try{r=await this.request("GET",`/team/${e}/groups/${t}/members`,o)}catch(n){return{error:{code:1,status:0,body:n.message}}}if(r.status<200||r.status>=300)return{error:{code:this.exitCodeForStatus(r.status),status:r.status,body:r.body}};let s=this.parseJson(r.body);return{items:s&&(s.data||s)||[]}}async groupInfo(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-info <groupId> [teamId]"),3;let{out:s,groupId:n,positional:i}=r,a=i[1]||r.teamId;if(!a)return console.error("\u274C 3: \u672A\u6307\u5B9A teamId \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;let l;try{l=await this.request("GET",`/team/${a}/groups`,o)}catch(f){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${f.message}`),1}if(l.status<200||l.status>=300){let f=this.exitCodeForStatus(l.status);return console.error(`\u274C ${f}: HTTP ${l.status}`),l.body&&console.error(l.body),f}let u=(this.parseJson(l.body)?.data||[]).find(f=>f.id===n);if(!u)return console.error(`\u274C 4: \u5C0F\u7EC4 '${n}' \u4E0D\u5728\u56E2\u961F\u4E2D`),4;let m=await this.fetchGroupMembersRaw(a,n,o);if(m.error)return console.error(`\u274C ${m.error.code}: HTTP ${m.error.status}`),m.error.body&&console.error(m.error.body),m.error.code;let p=m.items;if(s.json){let f={id:u.id,name:u.name,description:u.description||"",team_id:a,members:p,members_total:p.length};return s.field?process.stdout.write(S(v(f,s.field))+`
|
|
304
272
|
`):process.stdout.write(JSON.stringify(f,null,2)+`
|
|
305
|
-
`),0}return s.quiet?(console.log(
|
|
273
|
+
`),0}return s.quiet?(console.log(u.id),0):(console.log(`group: ${u.name} (${u.id})`),console.log(`description: ${u.description||""}`),console.log(`team_id: ${a}`),console.log(`members: ${p.length}`),0)}async groupCreate(e,t,o){let r=this.parseGroupArgs(t,!1),{out:s,positional:n,flags:i}=r,a=n[0];if(!a)return console.error("\u274C 3: \u7F3A\u5C11 name \u53C2\u6570\u3002\u7528\u6CD5: coder team group-create <name> [--description <d>] [--team <teamId>]"),3;let l=r.teamId;if(!l)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;let d={name:a};i.description&&(d.description=i.description);let u;try{u=await this.request("POST",`/team/${l}/groups`,o,d)}catch(h){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${h.message}`),1}if(u.status<200||u.status>=300){let h=this.exitCodeForStatus(u.status);return console.error(`\u274C ${h}: HTTP ${u.status}`),u.body&&console.error(u.body),h}let m=this.parseJson(u.body),f=(m&&m.data||m||{}).id;if(f&&await this.wikiSync("sync.upsertGroup",{teamId:l,externalGroupId:f,name:a,description:i.description||void 0},o),s.json){let h={id:f,team_id:l,name:a,description:i.description||null};return s.field?process.stdout.write(S(v(h,s.field))+`
|
|
274
|
+
`):process.stdout.write(JSON.stringify(h,null,2)+`
|
|
275
|
+
`),0}return s.quiet?(console.log(f||""),0):(console.log(`\u2705 \u5DF2\u521B\u5EFA\u5C0F\u7EC4: ${a} (${f})`),0)}async groupUpdate(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-update <groupId> [--name <n>] [--description <d>]"),3;let{out:s,groupId:n,flags:i}=r,a=r.teamId;if(!a)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;if(i.name===void 0&&i.description===void 0)return console.error("\u274C 3: \u81F3\u5C11\u9700\u8981\u63D0\u4F9B --name \u6216 --description"),3;let l={};i.name!==void 0&&(l.name=i.name),i.description!==void 0&&(l.description=i.description);let d;try{d=await this.request("PATCH",`/team/${a}/groups/${n}`,o,l)}catch(p){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${p.message}`),1}if(d.status<200||d.status>=300){let p=this.exitCodeForStatus(d.status);return console.error(`\u274C ${p}: HTTP ${d.status}`),d.body&&console.error(d.body),p}let u=this.parseJson(d.body)?.data||{},m=i.name!==void 0?i.name:u.name;if(m&&await this.wikiSync("sync.upsertGroup",{teamId:a,externalGroupId:n,name:m,description:i.description!==void 0?i.description:u.description||void 0},o),s.json){let p={id:n,team_id:a,...l};return s.field?process.stdout.write(S(v(p,s.field))+`
|
|
306
276
|
`):process.stdout.write(JSON.stringify(p,null,2)+`
|
|
307
|
-
`),0}return s.quiet?(console.log(n),0):(console.log(`\u2705 \u5DF2\u66F4\u65B0\u5C0F\u7EC4 (${n})`),i.name!==void 0&&console.log(`name: ${i.name}`),i.description!==void 0&&console.log(`description: ${i.description}`),0)}async groupDelete(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-delete <groupId> [--yes]"),3;let{out:s,groupId:n,flags:i}=r,
|
|
308
|
-
`):(console.log(`\u5C06\u5220\u9664\u5C0F\u7EC4 ${n}`),console.log(`endpoint: DELETE /team/${
|
|
309
|
-
`),0):s.quiet?(console.log(n),0):(console.log(`\u2705 \u5DF2\u5220\u9664\u5C0F\u7EC4 ${n}`),0)}async groupMembers(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-members <groupId> [teamId]"),3;let{out:s,groupId:n,positional:i}=r,
|
|
310
|
-
`):process.stdout.write(JSON.stringify(
|
|
311
|
-
`),0}if(s.quiet){for(let
|
|
277
|
+
`),0}return s.quiet?(console.log(n),0):(console.log(`\u2705 \u5DF2\u66F4\u65B0\u5C0F\u7EC4 (${n})`),i.name!==void 0&&console.log(`name: ${i.name}`),i.description!==void 0&&console.log(`description: ${i.description}`),0)}async groupDelete(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-delete <groupId> [--yes]"),3;let{out:s,groupId:n,flags:i}=r,a=r.teamId;if(!a)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;if(!i.yes){let d="\u9AD8\u5F71\u54CD\u64CD\u4F5C\uFF08\u5C06\u6E05\u9664\u8BE5\u5C0F\u7EC4\u6240\u6709\u6210\u5458\u5173\u7CFB\uFF09\uFF0C\u5FC5\u987B\u52A0 --yes \u624D\u4F1A\u6267\u884C";return s.json?process.stdout.write(JSON.stringify({method:"DELETE",path:`/team/${a}/groups/${n}`,note:d},null,2)+`
|
|
278
|
+
`):(console.log(`\u5C06\u5220\u9664\u5C0F\u7EC4 ${n}`),console.log(`endpoint: DELETE /team/${a}/groups/${n}`),console.log(`\u26A0\uFE0F ${d}`)),10}let l;try{l=await this.request("DELETE",`/team/${a}/groups/${n}`,o)}catch(d){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${d.message}`),1}if(l.status<200||l.status>=300){let d=this.exitCodeForStatus(l.status);return console.error(`\u274C ${d}: HTTP ${l.status}`),l.body&&console.error(l.body),d}return await this.wikiSync("sync.deleteGroup",{teamId:a,externalGroupId:n},o),s.json?(process.stdout.write(JSON.stringify({deleted:!0,id:n,team_id:a},null,2)+`
|
|
279
|
+
`),0):s.quiet?(console.log(n),0):(console.log(`\u2705 \u5DF2\u5220\u9664\u5C0F\u7EC4 ${n}`),0)}async groupMembers(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-members <groupId> [teamId]"),3;let{out:s,groupId:n,positional:i}=r,a=i[1]||r.teamId;if(!a)return console.error("\u274C 3: \u672A\u6307\u5B9A teamId \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;let l=await this.fetchTeam(a,o);if(l.error)return console.error(`\u274C ${l.error.code}: HTTP ${l.error.status}`),l.error.body&&console.error(l.error.body),l.error.code;let d=Array.isArray(l.team.members)?l.team.members:[],u=new Map(d.map(h=>[h.user_id,h])),m=await this.fetchGroupMembersRaw(a,n,o);if(m.error)return console.error(`\u274C ${m.error.code}: HTTP ${m.error.status}`),m.error.body&&console.error(m.error.body),m.error.code;let p=m.items;if(s.json){let h={team_id:a,group_id:n,items:p,total:p.length};return s.field?process.stdout.write(S(v(h,s.field))+`
|
|
280
|
+
`):process.stdout.write(JSON.stringify(h,null,2)+`
|
|
281
|
+
`),0}if(s.quiet){for(let h of p)console.log(h.user_id);return 0}if(!p.length)return console.log("\uFF08\u5C0F\u7EC4\u6682\u65E0\u6210\u5458\uFF09"),0;let f=p.map(h=>{let y=u.get(h.user_id)||{};return{username:y.username||"",user_id:h.user_id||"",type:y.user_type||"",role:h.role||"",nickname:y.nickname||""}});return M([["username","\u7528\u6237\u540D"],["user_id","\u7528\u6237ID"],["type","\u7C7B\u578B"],["role","\u89D2\u8272"],["nickname","\u6635\u79F0"]],f),0}async groupAddMembers(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-add-members <groupId> <userIds> [--role member|mentor]"),3;let{out:s,groupId:n,positional:i,flags:a}=r,l=i[1];if(!l)return console.error("\u274C 3: \u7F3A\u5C11 userIds \u53C2\u6570\uFF08\u9017\u53F7\u5206\u9694\uFF0C\u652F\u6301 user_id / username\uFF09"),3;let d=r.teamId;if(!d)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;let u=a.role||"member";if(u!=="member"&&u!=="mentor")return console.error(`\u274C 3: --role \u4EC5\u652F\u6301 member|mentor\uFF0C\u6536\u5230 '${u}'`),3;let m=await this.fetchTeam(d,o);if(m.error)return console.error(`\u274C ${m.error.code}: HTTP ${m.error.status}`),m.error.body&&console.error(m.error.body),m.error.code;let p=Array.isArray(m.team.members)?m.team.members:[],f=l.split(",").map(g=>g.trim()).filter(Boolean),h=[];for(let g of f){let I=p.find($=>$.user_id===g||$.username===g||$.id===g);if(!I)return console.error(`\u274C 4: \u6210\u5458 '${g}' \u4E0D\u5728\u56E2\u961F\u4E2D`),4;h.push(I)}let y={user_ids:h.map(g=>g.user_id),role:u},b;try{b=await this.request("POST",`/team/${d}/groups/${n}/members`,o,y)}catch(g){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${g.message}`),1}if(b.status<200||b.status>=300){let g=this.exitCodeForStatus(b.status);return console.error(`\u274C ${g}: HTTP ${b.status}`),b.body&&console.error(b.body),g}if(await this.wikiSync("sync.upsertGroupMembers",{teamId:d,externalGroupId:n,members:h.map(g=>({externalUserId:g.user_id,username:g.username||g.user_id,role:this.toWikiGroupRole(u)}))},o),s.json){let g={team_id:d,group_id:n,added:h.map(I=>({user_id:I.user_id,username:I.username})),role:u};return s.field?process.stdout.write(S(v(g,s.field))+`
|
|
312
282
|
`):process.stdout.write(JSON.stringify(g,null,2)+`
|
|
313
|
-
`),0}if(s.quiet){for(let g of
|
|
283
|
+
`),0}if(s.quiet){for(let g of h)console.log(g.user_id);return 0}console.log(`\u2705 \u5DF2\u6DFB\u52A0 ${h.length} \u540D\u6210\u5458\u5230\u5C0F\u7EC4 ${n} (role=${u})`);for(let g of h)console.log(` - ${g.username} (${g.user_id})`);return 0}async groupSetRole(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-set-role <groupId> <userId> <member|mentor>"),3;let{out:s,groupId:n,positional:i,flags:a}=r,l=i[1],d=i[2]||a.role;if(!l||!d)return console.error("\u274C 3: \u7528\u6CD5: coder team group-set-role <groupId> <userId> <member|mentor>"),3;if(d!=="member"&&d!=="mentor")return console.error(`\u274C 3: role \u4EC5\u652F\u6301 member|mentor\uFF0C\u6536\u5230 '${d}'`),3;let u=r.teamId;if(!u)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;let m=await this.fetchTeam(u,o);if(m.error)return console.error(`\u274C ${m.error.code}: HTTP ${m.error.status}`),m.error.body&&console.error(m.error.body),m.error.code;let f=(Array.isArray(m.team.members)?m.team.members:[]).find(y=>y.user_id===l||y.username===l||y.id===l);if(!f)return console.error(`\u274C 4: \u6210\u5458 '${l}' \u4E0D\u5728\u56E2\u961F\u4E2D`),4;let h;try{h=await this.request("PATCH",`/team/${u}/groups/${n}/members/${f.user_id}`,o,{role:d})}catch(y){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${y.message}`),1}if(h.status<200||h.status>=300){let y=this.exitCodeForStatus(h.status);return console.error(`\u274C ${y}: HTTP ${h.status}`),h.body&&console.error(h.body),y}if(await this.wikiSync("sync.upsertGroupMembers",{teamId:u,externalGroupId:n,members:[{externalUserId:f.user_id,username:f.username||f.user_id,role:this.toWikiGroupRole(d)}]},o),s.json){let y={team_id:u,group_id:n,user_id:f.user_id,username:f.username,role:d};return s.field?process.stdout.write(S(v(y,s.field))+`
|
|
314
284
|
`):process.stdout.write(JSON.stringify(y,null,2)+`
|
|
315
|
-
`),0}return s.quiet?(console.log(
|
|
316
|
-
`):(console.log(`\u5C06\u4ECE\u5C0F\u7EC4 ${n} \u4E2D\u79FB\u9664 ${p.username} (${p.user_id})`),console.log(`endpoint: DELETE /team/${d}/groups/${n}/members/${p.user_id}`),console.log(`\u26A0\uFE0F ${
|
|
317
|
-
`),0):s.quiet?(console.log(p.user_id),0):(console.log(`\u2705 \u5DF2\u5C06 ${p.username} (${p.user_id}) \u4ECE\u5C0F\u7EC4 ${n} \u79FB\u9664`),0)}async current(e,t){let{out:o}=this.parseOutputFlags(e),r=this.argParser?this.argParser.getTeam():null;if(o.json){let s=r?{id:r.id,name:r.name||""}:null;return o.field?process.stdout.write(v(
|
|
285
|
+
`),0}return s.quiet?(console.log(f.user_id),0):(console.log(`\u2705 \u5DF2\u5C06 ${f.username} (${f.user_id}) \u5728\u5C0F\u7EC4 ${n} \u4E2D\u8BBE\u4E3A ${d}`),0)}async groupRemoveMember(e,t,o){let r=this.parseGroupArgs(t);if(r.error)return console.error("\u274C 3: \u7F3A\u5C11 groupId \u53C2\u6570\u3002\u7528\u6CD5: coder team group-remove-member <groupId> <userId> [--yes]"),3;let{out:s,groupId:n,positional:i,flags:a}=r,l=i[1];if(!l)return console.error("\u274C 3: \u7F3A\u5C11 userId \u53C2\u6570"),3;let d=r.teamId;if(!d)return console.error("\u274C 3: \u672A\u6307\u5B9A --team \u4E14\u65E0\u9ED8\u8BA4\u56E2\u961F"),3;let u=await this.fetchTeam(d,o);if(u.error)return console.error(`\u274C ${u.error.code}: HTTP ${u.error.status}`),u.error.body&&console.error(u.error.body),u.error.code;let p=(Array.isArray(u.team.members)?u.team.members:[]).find(h=>h.user_id===l||h.username===l||h.id===l);if(!p)return console.error(`\u274C 4: \u6210\u5458 '${l}' \u4E0D\u5728\u56E2\u961F\u4E2D`),4;if(!a.yes){let h="\u9AD8\u5F71\u54CD\u64CD\u4F5C\uFF0C\u5FC5\u987B\u52A0 --yes \u624D\u4F1A\u6267\u884C";return s.json?process.stdout.write(JSON.stringify({method:"DELETE",path:`/team/${d}/groups/${n}/members/${p.user_id}`,target:{username:p.username,user_id:p.user_id},note:h},null,2)+`
|
|
286
|
+
`):(console.log(`\u5C06\u4ECE\u5C0F\u7EC4 ${n} \u4E2D\u79FB\u9664 ${p.username} (${p.user_id})`),console.log(`endpoint: DELETE /team/${d}/groups/${n}/members/${p.user_id}`),console.log(`\u26A0\uFE0F ${h}`)),10}let f;try{f=await this.request("DELETE",`/team/${d}/groups/${n}/members/${p.user_id}`,o)}catch(h){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${h.message}`),1}if(f.status<200||f.status>=300){let h=this.exitCodeForStatus(f.status);return console.error(`\u274C ${h}: HTTP ${f.status}`),f.body&&console.error(f.body),h}return await this.wikiSync("sync.removeGroupMember",{teamId:d,externalGroupId:n,externalUserId:p.user_id},o),s.json?(process.stdout.write(JSON.stringify({removed:!0,user_id:p.user_id,username:p.username,group_id:n,team_id:d},null,2)+`
|
|
287
|
+
`),0):s.quiet?(console.log(p.user_id),0):(console.log(`\u2705 \u5DF2\u5C06 ${p.username} (${p.user_id}) \u4ECE\u5C0F\u7EC4 ${n} \u79FB\u9664`),0)}async current(e,t){let{out:o}=this.parseOutputFlags(e),r=this.argParser?this.argParser.getTeam():null;if(o.json){let s=r?{id:r.id,name:r.name||""}:null;return o.field?process.stdout.write(S(v(s,o.field))+`
|
|
318
288
|
`):process.stdout.write(JSON.stringify(s,null,2)+`
|
|
319
|
-
`),0}return o.quiet?(r&&r.id&&console.log(r.id),0):!r||!r.id?(console.log("\uFF08\u672A\u8BBE\u7F6E\u9ED8\u8BA4\u56E2\u961F\uFF0C\u8FD0\u884C 'coder team use <teamId>' \u6765\u8BBE\u7F6E\uFF09"),0):(console.log(`\u9ED8\u8BA4\u56E2\u961F: ${r.name||""} (${r.id})`),0)}async use(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=s[0];if(!n)return console.error("\u274C 3: \u7F3A\u5C11 teamId \u53C2\u6570\u3002\u7528\u6CD5: coder team use <teamId>"),3;if(!this.argParser)return console.error("\u274C 1: \u5185\u90E8\u9519\u8BEF\uFF1AargParser \u672A\u6CE8\u5165"),1;let i=encodeURIComponent(JSON.stringify({filter_is_joined:!0})),
|
|
289
|
+
`),0}return o.quiet?(r&&r.id&&console.log(r.id),0):!r||!r.id?(console.log("\uFF08\u672A\u8BBE\u7F6E\u9ED8\u8BA4\u56E2\u961F\uFF0C\u8FD0\u884C 'coder team use <teamId>' \u6765\u8BBE\u7F6E\uFF09"),0):(console.log(`\u9ED8\u8BA4\u56E2\u961F: ${r.name||""} (${r.id})`),0)}async use(e,t,o){let{out:r,remaining:s}=this.parseOutputFlags(t),n=s[0];if(!n)return console.error("\u274C 3: \u7F3A\u5C11 teamId \u53C2\u6570\u3002\u7528\u6CD5: coder team use <teamId>"),3;if(!this.argParser)return console.error("\u274C 1: \u5185\u90E8\u9519\u8BEF\uFF1AargParser \u672A\u6CE8\u5165"),1;let i=encodeURIComponent(JSON.stringify({filter_is_joined:!0})),a;try{a=await this.request("GET",`/team?constraints=${i}&page=1&size=200`,o)}catch(p){return console.error(`\u274C 1: \u7F51\u7EDC\u9519\u8BEF ${p.message}`),1}if(a.status!==200)return console.error(`\u274C ${this.exitCodeForStatus(a.status)}: HTTP ${a.status}`),a.body&&console.error(a.body),this.exitCodeForStatus(a.status);let l=this.parseJson(a.body),u=(l&&l.data&&l.data.items||[]).find(p=>p.id===n);if(!u)return console.error(`\u274C 4: \u56E2\u961F '${n}' \u4E0D\u5728\u4F60\u5DF2\u52A0\u5165\u7684\u5217\u8868\u4E2D\u3002\u8FD0\u884C 'coder team list' \u67E5\u770B\u53EF\u7528\u56E2\u961F`),4;if(!this.argParser.setTeam(u.id,u.name||""))return console.error("\u274C 1: \u5199\u5165\u914D\u7F6E\u5931\u8D25"),1;if(this.argParser.setTeamManual(!0),r.json){let p={id:u.id,name:u.name||""};return process.stdout.write(JSON.stringify(p,null,2)+`
|
|
320
290
|
`),0}return r.quiet?(console.log(u.id),0):(console.log(`\u2705 \u5DF2\u5207\u6362\u5230\u9ED8\u8BA4\u56E2\u961F: ${u.name||""} (${u.id})`),0)}showHelp(){console.log(["Usage: coder team <subcommand> [options]","","\u9762\u5411 AI \u4F18\u5148\u7684\u56E2\u961F\u4E0E\u6210\u5458\u7BA1\u7406\u3002","","Team Management:"," list \u5217\u51FA\u6211\u52A0\u5165\u7684\u56E2\u961F\uFF08\u522B\u540D: ls\uFF09"," current \u663E\u793A\u5F53\u524D\u9ED8\u8BA4\u56E2\u961F"," use <teamId> \u5207\u6362\u9ED8\u8BA4\u56E2\u961F\uFF08\u5199\u5165 ~/.coder/config.json\uFF09"," info [teamId] \u56E2\u961F\u8BE6\u60C5\uFF1A\u79EF\u5206\u3001\u6210\u5458\u6570\u3001\u6709\u6548\u671F\u7B49","","Members:"," members [teamId] \u6210\u5458\u5217\u8868"," member-get <userId> [teamId] \u5355\u4E2A\u6210\u5458\u8BE6\u60C5"," member-create <username> \u521B\u5EFA\u6210\u5458\uFF08\u9ED8\u8BA4 user_type=human\uFF09"," [--type human|ai]"," [--password <pwd>] \u7701\u7565 = \u968F\u673A\u751F\u6210 16 \u4F4D\u5F3A\u5BC6\u7801"," [--phone <phone>] human \u5FC5\u586B\uFF0Cai \u53EF\u7701"," [--nickname <nickname>] \u4E2D\u6587\u6635\u79F0"," [--mentor <userId>] AI \u6210\u5458\u7684 mentor\uFF08user_id \u6216 username\uFF09"," [--points <n>] \u79EF\u5206\u914D\u989D\uFF0C\u9ED8\u8BA4 null = \u7EE7\u627F\u56E2\u961F"," [--team <teamId>]"," [--save-to <path>] \u4FDD\u5B58\u51ED\u636E\u5230\u6587\u4EF6 (chmod 600)"," member-delete <userId> \u5220\u9664\u6210\u5458\uFF08\u9AD8\u5F71\u54CD\uFF0C\u9700 --yes\uFF09"," [--team <teamId>] [--yes]"," member-update <userId> \u66F4\u65B0\u6210\u5458\u6635\u79F0 / mentor"," [--nickname <nickname>]"," [--mentor <userId>] \u8BBE\u7F6E mentor\uFF08user_id \u6216 username\uFF09"," [--clear-mentor] \u6E05\u9664 mentor"," [--team <teamId>]"," set-points <userId> \u8BBE\u7F6E\u6210\u5458\u79EF\u5206\u914D\u989D\uFF08owner / manager \u53EF\u7528\uFF09"," --unlimited \u4E0D\u9650\u91CF\uFF08points = null\uFF09"," --points <n> \u6307\u5B9A\u6570\u503C"," --inherit \u7B49\u4EF7 --unlimited\uFF08\u8BED\u4E49\uFF1A\u7EE7\u627F\u56E2\u961F\u6C60\uFF09"," [--team <teamId>]","","Discovery:"," search-member <keyword> [teamId] \u6210\u5458\u4E2D\u641C\u7D22\uFF08\u672C\u5730\u8FC7\u6EE4\uFF09","","Groups (\u5C0F\u7EC4):"," groups [teamId] \u5217\u51FA\u5C0F\u7EC4"," group-info <groupId> [teamId] \u5C0F\u7EC4\u8BE6\u60C5\uFF08\u542B\u6210\u5458\u5217\u8868\uFF09"," group-create <name> \u521B\u5EFA\u5C0F\u7EC4"," [--description <d>] [--team <teamId>]"," group-update <groupId> \u66F4\u65B0\u5C0F\u7EC4"," [--name <n>] [--description <d>] [--team <teamId>]"," group-delete <groupId> \u5220\u9664\u5C0F\u7EC4\uFF08\u9AD8\u5F71\u54CD\uFF0C\u9700 --yes\uFF09"," [--team <teamId>] [--yes]"," group-members <groupId> [teamId] \u5C0F\u7EC4\u6210\u5458\u5217\u8868"," group-add-members <groupId> <userIds> \u6279\u91CF\u6DFB\u52A0\u6210\u5458\uFF08\u9017\u53F7\u5206\u9694\uFF0Cuser_id \u6216 username\uFF09"," [--role member|mentor] \u9ED8\u8BA4 member"," [--team <teamId>]"," group-set-role <groupId> <userId> <member|mentor>"," \u4FEE\u6539\u6210\u5458\u5728\u5C0F\u7EC4\u4E2D\u7684\u89D2\u8272"," [--team <teamId>]"," group-remove-member <groupId> <userId> \u4ECE\u5C0F\u7EC4\u79FB\u9664\u6210\u5458\uFF08\u9AD8\u5F71\u54CD\uFF0C\u9700 --yes\uFF09"," [--team <teamId>] [--yes]","","Output (AI-friendly):"," --json \u8F93\u51FA\u7ED3\u6784\u5316 JSON\uFF08\u53EF\u88AB jq \u89E3\u6790\uFF09"," --quiet \u53EA\u8F93\u51FA\u4E3B\u952E\uFF08id / username\uFF09\uFF0C\u6362\u884C\u5206\u9694"," --field <jq-path> \u4EC5\u8F93\u51FA\u6307\u5B9A\u5B57\u6BB5\uFF08dot path\uFF0C\u5982 items[0].id\uFF09","","Exit codes:"," 0 \u6210\u529F | 1 \u901A\u7528\u9519\u8BEF | 2 \u672A\u767B\u5F55 | 3 \u53C2\u6570\u9519\u8BEF | 4 \u8D44\u6E90\u4E0D\u5B58\u5728"," 5 \u6743\u9650\u4E0D\u8DB3 | 6 \u51B2\u7A81\uFF08\u5DF2\u5B58\u5728\uFF09 | 10 \u5F85\u786E\u8BA4\uFF08\u9AD8\u5F71\u54CD\u64CD\u4F5C\u672A\u52A0 --yes\uFF09","","Examples:"," coder team list"," coder team list --json | jq '.items[].id'"," coder team list --quiet"].join(`
|
|
321
|
-
`))}};function
|
|
322
|
-
`);try{e("npm install -g makecoder@latest",{stdio:"inherit"})}catch(
|
|
323
|
-
\u274C \u5347\u7EA7\u5931\u8D25:`,
|
|
324
|
-
\u2705 \u5347\u7EA7\u6210\u529F
|
|
291
|
+
`))}};function me(c,e){let t=c.config&&c.config.metadata&&c.config.metadata.created_by;if(!t)return"";let o=e.find(r=>r.user_id===t);return o?o.nickname?`${o.username}(${o.nickname})`:o.username:t}function v(c,e){if(!e)return c;let t=[],o=/[^.\[\]]+|\[(\d+)\]/g,r;for(;(r=o.exec(e))!==null;)t.push(r[1]!==void 0?Number(r[1]):r[0]);let s=c;for(let n of t){if(s==null)return;s=s[n]}return s}function S(c){return c==null?"":typeof c=="string"?c:typeof c=="number"||typeof c=="boolean"?String(c):JSON.stringify(c)}function M(c,e){let t=c.map(n=>Array.isArray(n)?n[0]:n),o=c.map(n=>Array.isArray(n)?n[1]:n),r=t.map((n,i)=>Math.max(pe(o[i]),...e.map(a=>pe(String(a[n]??""))))),s=(n,i)=>n+" ".repeat(Math.max(0,i-pe(n)));console.log(o.map((n,i)=>s(n,r[i])).join(" ")),console.log(r.map(n=>"-".repeat(n)).join(" "));for(let n of e)console.log(t.map((i,a)=>s(String(n[i]??""),r[a])).join(" "))}function pe(c){let e=0;for(let t of c){let o=t.codePointAt(0);o>=19968&&o<=40959||o>=12288&&o<=12351||o>=65280&&o<=65519?e+=2:e+=1}return e}et.exports=fe});var nt=_((vo,rt)=>{var _o=require("path"),Gt=we(),ot=_e(),Ht=Se(),Vt=Ee(),Kt=Te(),zt=Be(),Wt=Ne(),Yt=Me(),Xt=Ge(),Zt=Xe(),Qt=tt(),he=class{constructor(){this.argParser=new Gt,this.claudeLauncher=this._createClaudeLauncher(),this.geminiLauncher=new Vt,this.codexLauncher=new Kt,this.vscodeExtensionService=new zt,this.publishService=new Wt,this.skillsService=new Yt(this.argParser),this.wikiService=new Xt(this.argParser),this.authCommandService=new Zt(this.argParser),this.teamService=new Qt(this.argParser),this.wikiService.teamService=this.teamService,this.skillsService.teamService=this.teamService}_createClaudeLauncher(){let e=process.env.CODEV_DEBUG;if(process.env.CODEV_USE_NODE==="1")return e&&console.error("[DEBUG] CODEV_USE_NODE=1, forcing ClaudeLauncher (node fallback)"),new ot;try{let t=new Ht,o=t.findExecutablePath();return e&&console.error(`[DEBUG] ClaudeBunLauncher selected, executable: ${o}`),t}catch(t){return e&&console.error(`[DEBUG] ClaudeBunLauncher unavailable: ${t.message}, falling back to ClaudeLauncher (node)`),new ot}}async run(e=process.argv.slice(2)){try{try{await this.vscodeExtensionService.ensureExtensionInstalled()}catch(o){process.env.CODEV_DEBUG&&console.error("VSCode Extension Service Error:",o)}if(!e.includes("--agent")&&!e.includes("-a")){let o=e.length>0&&["claude","gemini","codex"].includes(e[0]),r=e.length>0&&["pub","auth","update","skills","wiki","team"].includes(e[0]);if(!o&&!r&&(e.includes("--help")||e.includes("-h")))return this.argParser.showHelp(),0;if(!o&&!r&&(e.includes("--version")||e.includes("-v")))return this.showVersion(),0}let t=await this.argParser.parse(e);return t.command==="auth"?await this.authCommandService.handle(t):t.command==="update"?this.handleUpdate():t.command==="skills"?await this.skillsService.handle(t):t.command==="wiki"?await this.wikiService.handle(t):t.command==="team"?await this.teamService.handle(t):t.command==="pub"?e.includes("--help")||e.includes("-h")?(this.publishService.showHelp(),0):await this.publishService.publish({name:t.pubName,apikey:t.apikey,serverBaseUrl:t.codevServer,allowClone:t.allowClone}):(t.apikey&&this.skillsService.notifyAndRefreshUpdates(t.apikey),await this.launchAgent(t))}catch(t){return console.error(`Error: ${t.message}`),process.env.CODEV_DEBUG&&console.error("Stack trace:",t.stack),1}}async launchAgent(e){let{agent:t}=e;return t==="claude"?await this.claudeLauncher.launch(e):t==="gemini"?await this.geminiLauncher.launch(e):t==="codex"?await this.codexLauncher.launch(e):1}handleUpdate(){let{execSync:e}=require("child_process"),t=j();console.log(`\u5F53\u524D\u7248\u672C: ${t.version}`),console.log(`\u6B63\u5728\u5347\u7EA7 Coder...
|
|
292
|
+
`);try{e("npm install -g makecoder@latest",{stdio:"inherit"})}catch(r){return console.error(`
|
|
293
|
+
\u274C \u5347\u7EA7\u5931\u8D25:`,r.message),1}this._ensurePlatformCodex();let o=this._getInstalledVersion();return console.log(o?`
|
|
294
|
+
\u2705 \u5347\u7EA7\u6210\u529F\uFF0C\u5F53\u524D\u7248\u672C: ${o}`:`
|
|
295
|
+
\u2705 \u5347\u7EA7\u6210\u529F`),0}_getInstalledVersion(){let{execSync:e}=require("child_process"),t=require("fs"),o=require("path");try{let r=e("npm root -g",{encoding:"utf8"}).trim(),s=o.join(r,"makecoder","package.json");if(t.existsSync(s))return JSON.parse(t.readFileSync(s,"utf8")).version}catch{}return null}_ensurePlatformCodex(){let{execSync:e}=require("child_process"),t=require("fs"),o=require("path"),r={"linux-x64":"makecoder-codex-linux-x64","darwin-arm64":"makecoder-codex-darwin-arm64","win32-x64":"makecoder-codex-win32-x64"},s=`${process.platform}-${process.arch}`,n=r[s];if(!n)return;let i;try{i=e("npm root -g",{encoding:"utf8"}).trim()}catch{return}if([o.join(i,"makecoder","node_modules",n,"package.json"),o.join(i,n,"package.json")].some(m=>t.existsSync(m)))return;console.log(`
|
|
325
296
|
\u26A0\uFE0F \u672A\u68C0\u6D4B\u5230 ${n}\uFF0C\u6B63\u5728\u8865\u88C5...`);let l;try{l=require(o.join(i,"makecoder","package.json")).optionalDependencies?.[n]}catch{}let d=m=>{try{return e(`npm install -g ${m}`,{stdio:"inherit"}),!0}catch{return!1}};l&&d(`${n}@${l}`)||d(`${n}@latest`)||console.warn(`
|
|
326
297
|
\u26A0\uFE0F \u81EA\u52A8\u8865\u88C5 ${n} \u5931\u8D25\uFF0Ccoder codex \u53EF\u80FD\u4E0D\u53EF\u7528\u3002
|
|
327
|
-
\u8BF7\u624B\u52A8\u6267\u884C: npm install -g ${n}@latest`)}showVersion(){let e=
|
|
298
|
+
\u8BF7\u624B\u52A8\u6267\u884C: npm install -g ${n}@latest`)}showVersion(){let e=j();console.log(`coder version: ${e.version}`)}};rt.exports=he});var st=process.env.CODER_ARGV0;if(st){let e={rg:"rg",ugrep:"ugrep",bfs:"bfs"}[st];if(e){let t=require("path").join(__dirname,"..","dist",`${process.platform}-${process.arch}`,e);require("fs").existsSync(t)||(console.error(`${e} is not available. Use system default command instead (grep, find, etc.)`),process.exit(1));let{spawnSync:o}=require("child_process"),r=o(t,process.argv.slice(2),{stdio:"inherit"});process.exit(r.status??1)}}var eo=nt(),{shouldSuppressUpdateNotice:to}=oe();process.on("unhandledRejection",(c,e)=>{console.error("Unhandled Promise Rejection:",c),process.exit(1)});process.on("uncaughtException",c=>{console.error("Uncaught Exception:",c.message),process.env.CODEV_DEBUG&&console.error(c.stack),process.exit(1)});function oo(c,e){let t=s=>s.replace(/^v/,"").split(".").map(Number),[o,r]=[t(c),t(e)];for(let s=0;s<3;s++){if((o[s]||0)>(r[s]||0))return!0;if((o[s]||0)<(r[s]||0))return!1}return!1}function ro(){if(to())return;let c=require("https"),{version:e}=j(),o=c.get("https://registry.npmmirror.com/makecoder/latest",{timeout:5e3},r=>{let s="";r.on("data",n=>{s+=n}),r.on("end",()=>{try{let n=JSON.parse(s).version;n&&oo(n,e)&&console.error(`\x1B[33m\u26A1 \u68C0\u6D4B\u5230\u65B0\u7248\u672C ${n}\uFF08\u5F53\u524D ${e}\uFF09\uFF0C\u8FD0\u884C coder update \u5347\u7EA7\x1B[0m`)}catch{}})});o.on("error",()=>{}),o.on("timeout",()=>o.destroy())}async function no(){let c=new Set(["pub","auth","update","skills","wiki","team"]),e=process.argv[2];(!e||!c.has(e))&&ro(),process.env.CODER_NESTED="1";let t=new eo;try{let o=await t.run();process.exit(o)}catch(o){console.error(`Fatal error: ${o.message}`),process.env.CODEV_DEBUG&&console.error(o.stack),process.exit(1)}}no().catch(c=>{console.error(`Startup error: ${c.message}`),process.exit(1)});
|