badgerclaw 0.2.25 → 0.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var ho=Object.create;var ge=Object.defineProperty;var wo=Object.getOwnPropertyDescriptor;var yo=Object.getOwnPropertyNames;var _o=Object.getPrototypeOf,bo=Object.prototype.hasOwnProperty;var $o=(e,t)=>()=>(e&&(t=e(e=0)),t);var So=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Co=(e,t)=>{for(var o in t)ge(e,o,{get:t[o],enumerable:!0})},dt=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of yo(t))!bo.call(e,s)&&s!==o&&ge(e,s,{get:()=>t[s],enumerable:!(n=wo(t,s))||n.enumerable});return e};var c=(e,t,o)=>(o=e!=null?ho(_o(e)):{},dt(t||!e||!e.__esModule?ge(o,"default",{value:e,enumerable:!0}):o,e)),ut=e=>dt(ge({},"__esModule",{value:!0}),e);var W=So((ss,Do)=>{Do.exports={name:"badgerclaw",version:"0.2.
|
|
2
|
+
"use strict";var ho=Object.create;var ge=Object.defineProperty;var wo=Object.getOwnPropertyDescriptor;var yo=Object.getOwnPropertyNames;var _o=Object.getPrototypeOf,bo=Object.prototype.hasOwnProperty;var $o=(e,t)=>()=>(e&&(t=e(e=0)),t);var So=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Co=(e,t)=>{for(var o in t)ge(e,o,{get:t[o],enumerable:!0})},dt=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of yo(t))!bo.call(e,s)&&s!==o&&ge(e,s,{get:()=>t[s],enumerable:!(n=wo(t,s))||n.enumerable});return e};var c=(e,t,o)=>(o=e!=null?ho(_o(e)):{},dt(t||!e||!e.__esModule?ge(o,"default",{value:e,enumerable:!0}):o,e)),ut=e=>dt(ge({},"__esModule",{value:!0}),e);var W=So((ss,Do)=>{Do.exports={name:"badgerclaw",version:"0.2.26",description:"BadgerClaw CLI \u2014 one-click bot provisioning",main:"dist/index.js",bin:{badgerclaw:"./dist/index.js"},files:["dist/","README.md"],scripts:{build:"node build.mjs",test:'echo "Error: no test specified" && exit 1'},keywords:[],author:"",license:"ISC",dependencies:{"@modelcontextprotocol/sdk":"^1.29.0",axios:"^1.6.0",chalk:"^4.1.2",commander:"^12.0.0",eventsource:"^1.1.2",open:"^8.4.2",ora:"^5.4.1"},devDependencies:{"@types/eventsource":"^1.1.15","@types/node":"^20.0.0",esbuild:"^0.28.0",typescript:"^5.3.0"}}});var nt={};Co(nt,{getActiveSessions:()=>ot,launchClaudeCode:()=>Ze,launchMCPServer:()=>Qe,recordSession:()=>et,stopSession:()=>tt});function ze(){try{if(I.default.existsSync(Je))return JSON.parse(I.default.readFileSync(Je,"utf-8"))}catch{}return[]}function Ke(e){I.default.mkdirSync(q,{recursive:!0}),I.default.writeFileSync(Je,JSON.stringify(e,null,2))}function xe(e){try{return process.kill(e,0),!0}catch{return!1}}function Fo(){if(process.env.TMUX)return"tmux";try{if((0,U.execSync)(`osascript -e 'tell application "System Events" to (name of processes) contains "iTerm2"'`,{stdio:"pipe",timeout:3e3}),I.default.existsSync("/Applications/iTerm.app"))return"iterm2"}catch{}return process.platform==="darwin"?"terminal":"direct"}function Ye(e,t){let o=E.default.join(q,`claude-launcher-${t}.exp`),n=E.default.join(q,`pending-input-${t}.txt`);I.default.writeFileSync(n,"","utf-8");let s=`#!/usr/bin/expect -f
|
|
3
3
|
set timeout -1
|
|
4
4
|
set msgfile "${n}"
|
|
5
5
|
|
|
@@ -113,7 +113,7 @@ Keep responses concise and helpful.
|
|
|
113
113
|
\u{1F5D1}\uFE0F Bot deleted: ${r} \u2014 removing from OpenClaw config...`));try{let i=await import("fs"),l=await import("path"),g=await import("os"),C=l.join(g.homedir(),".openclaw","openclaw.json"),f=JSON.parse(i.readFileSync(C,"utf-8")),O=!1;if(f.channels?.badgerclaw?.accounts?.[a]&&(delete f.channels.badgerclaw.accounts[a],O=!0),f.agents?.list){let P=f.agents.list.length;f.agents.list=f.agents.list.filter(N=>N.id!==a),f.agents.list.length!==P&&(O=!0)}if(O){i.writeFileSync(C,JSON.stringify(f,null,2)),console.log(m.default.green(` \u2705 Removed "${a}" from openclaw.json`));let{execSync:P}=await import("child_process");try{P("openclaw gateway restart",{stdio:"ignore"}),console.log(m.default.green(" \u2705 Gateway restarted"))}catch{console.log(m.default.dim(" Gateway restart failed \u2014 restart manually"))}}else console.log(m.default.dim(` "${a}" not found in openclaw.json \u2014 nothing to remove`))}catch(i){console.log(m.default.red(` Failed to update openclaw.json: ${i}`))}}else if(s.type==="claude_code.start"&&s.bot_id&&s.room_id){console.log(m.default.cyan(`
|
|
114
114
|
\u{1F916} Claude Code START received: bot=${s.bot_id} room=${s.room_id}`));try{let r=await M({id:s.command_id||`cc-start-${Date.now()}`,command_type:"start_claude_code",payload:{bot_id:s.bot_id,room_id:s.room_id,session_id:s.session_id}});if(console.log(r.success?m.default.green(` \u2705 ${r.message}`):m.default.red(` \u274C ${r.message}`)),s.command_id)try{await S().post(`/api/v1/dashboard/commands/${s.command_id}/result`,{status:r.success?"success":"failed",result:r.message})}catch{}try{await A()}catch{}}catch(r){console.log(m.default.red(` Claude Code start error: ${r.message}`))}}else if(s.type==="claude_code.stop"&&s.bot_id&&s.room_id){console.log(m.default.cyan(`
|
|
115
115
|
\u{1F916} Claude Code STOP received: bot=${s.bot_id} room=${s.room_id}`));try{let r=await M({id:s.command_id||`cc-stop-${Date.now()}`,command_type:"stop_claude_code",payload:{bot_id:s.bot_id,room_id:s.room_id,session_id:s.session_id}});if(console.log(r.success?m.default.green(` \u2705 ${r.message}`):m.default.red(` \u274C ${r.message}`)),s.command_id)try{await S().post(`/api/v1/dashboard/commands/${s.command_id}/result`,{status:r.success?"success":"failed",result:r.message})}catch{}try{await A()}catch{}}catch(r){console.log(m.default.red(` Claude Code stop error: ${r.message}`))}}else if(s.type==="command.execute"&&s.command_id){console.log(m.default.cyan(`
|
|
116
|
-
\u26A1 SSE command received: ${s.command_type} (${s.command_id})`));try{let r=S();await r.post(`/api/v1/dashboard/commands/${s.command_id}/ack`);let a=await M({id:s.command_id,command_type:s.command_type,payload:s.payload});console.log(a.success?m.default.green(` \u2705 ${a.message}`):m.default.red(` \u274C ${a.message}`)),await r.post(`/api/v1/dashboard/commands/${s.command_id}/result`,{status:a.success?"success":"failed",result:a.message,new_version:a.newVersion||null});try{await A()}catch{}s.command_type==="update_cli"&&a.success&&(console.log(m.default.cyan(" CLI updated \u2014 restarting in 2s...")),setTimeout(()=>process.exit(0),2e3))}catch(r){console.log(m.default.red(` Command ${s.command_id} error: ${r.message}`))}}}catch{}},o.onerror=()=>{console.log(m.default.dim(" Reconnecting..."))},await new Promise(()=>{})});var ao=require("commander"),w=c(require("chalk")),Q=require("child_process"),D=c(require("fs")),it=c(require("os")),ct=c(require("path"));var no=c(require("fs")),so=c(require("os")),De=c(require("path")),rt=require("child_process"),F=c(require("chalk"));var fn=`${k}/api/v1/dashboard/versions/latest`,hn=2500,wn=new Set(["setup","logout","help","--version","-V","--help","-h","heartbeat","watch","autopair"]),oo=De.default.join(so.default.homedir(),".openclaw/extensions/badgerclaw"),yn=[De.default.join(oo,"node_modules/@badgerclaw/connect/package.json"),De.default.join(oo,"package.json")];function at(){return"0.2.
|
|
116
|
+
\u26A1 SSE command received: ${s.command_type} (${s.command_id})`));try{let r=S();await r.post(`/api/v1/dashboard/commands/${s.command_id}/ack`);let a=await M({id:s.command_id,command_type:s.command_type,payload:s.payload});console.log(a.success?m.default.green(` \u2705 ${a.message}`):m.default.red(` \u274C ${a.message}`)),await r.post(`/api/v1/dashboard/commands/${s.command_id}/result`,{status:a.success?"success":"failed",result:a.message,new_version:a.newVersion||null});try{await A()}catch{}s.command_type==="update_cli"&&a.success&&(console.log(m.default.cyan(" CLI updated \u2014 restarting in 2s...")),setTimeout(()=>process.exit(0),2e3))}catch(r){console.log(m.default.red(` Command ${s.command_id} error: ${r.message}`))}}}catch{}},o.onerror=()=>{console.log(m.default.dim(" Reconnecting..."))},await new Promise(()=>{})});var ao=require("commander"),w=c(require("chalk")),Q=require("child_process"),D=c(require("fs")),it=c(require("os")),ct=c(require("path"));var no=c(require("fs")),so=c(require("os")),De=c(require("path")),rt=require("child_process"),F=c(require("chalk"));var fn=`${k}/api/v1/dashboard/versions/latest`,hn=2500,wn=new Set(["setup","logout","help","--version","-V","--help","-h","heartbeat","watch","autopair"]),oo=De.default.join(so.default.homedir(),".openclaw/extensions/badgerclaw"),yn=[De.default.join(oo,"node_modules/@badgerclaw/connect/package.json"),De.default.join(oo,"package.json")];function at(){return"0.2.26"}function _n(){for(let e of yn)try{let t=no.default.readFileSync(e,"utf-8"),o=JSON.parse(t);if(o.version&&(!o.name||o.name==="@badgerclaw/connect"||o.name==="badgerclaw")||o.version)return o.version}catch{}return null}function bn(e){let t=e.trim(),o=t.match(/\d+(?:\.\d+){1,3}/);return o?o[0]:t}function Oe(){if((0,rt.spawnSync)("which",["openclaw"],{encoding:"utf-8"}).status!==0)return null;let t=(0,rt.spawnSync)("openclaw",["--version"],{encoding:"utf-8",timeout:3e3});return t.status!==0||!t.stdout?null:bn(t.stdout)||null}async function $n(){let e=new AbortController,t=setTimeout(()=>e.abort(),hn);try{let o=await fetch(fn,{signal:e.signal});if(!o.ok)return null;let n=await o.json(),s=n.result&&typeof n.result=="object"?n.result:n;return{cli:s.cli??"unknown",plugin:s.plugin??"unknown",supported_openclaw:s.supported_openclaw??"unknown"}}catch{return null}finally{clearTimeout(t)}}function Sn(e){let t=[];if(e.cli&&e.cli!=="unknown"){let o=at();o!==e.cli&&t.push({component:"cli",current:o,approved:e.cli})}if(e.plugin&&e.plugin!=="unknown"){let o=_n();(o===null||o!==e.plugin)&&t.push({component:"plugin",current:o??"not installed",approved:e.plugin})}if(e.supported_openclaw&&e.supported_openclaw!=="unknown"){let o=Oe();(o===null||o!==e.supported_openclaw)&&t.push({component:"openclaw",current:o??"not installed",approved:e.supported_openclaw})}return t}function Cn(e){return e[2]}function vn(e){return!e||e.startsWith("-")?!0:wn.has(e)}function In(e){let t=[];t.push(""),t.push(F.default.red.bold("\u2717 Unsupported versions detected")),t.push("");for(let o of e){let n=o.component.padEnd(8);t.push(` ${n} ${F.default.yellow(o.current)} \u2192 ${F.default.green(o.approved)} ${F.default.dim("(supported)")}`)}return t.push(""),t.push("This command is blocked until your installation matches the supported versions."),t.push(""),t.push(F.default.green(" To fix, run:")),t.push(F.default.green.bold(" badgerclaw setup")),t.push(""),t.push(F.default.dim(" (bypass temporarily: BADGERCLAW_NO_VERSION_CHECK=1 badgerclaw <cmd>)")),t.push(""),t.join(`
|
|
117
117
|
`)}async function ro(e){if(process.env.BADGERCLAW_NO_VERSION_CHECK)return;let t=Cn(e);if(vn(t))return;let o=await $n();if(!o)return;let n=Sn(o);n.length!==0&&(process.stderr.write(In(n)),process.exit(1))}var Z=ct.default.join(it.default.homedir(),".openclaw","openclaw.json"),pe=Z+".badgerclaw-stash";async function xn(){try{let e=await fetch(`${k}/api/v1/dashboard/versions/latest`,{headers:{Accept:"application/json"}});if(!e.ok)return{cli:null,plugin:null,openclaw:null};let t=await e.json(),o=t.result&&typeof t.result=="object"?t.result:t,n=s=>typeof s!="string"||!s||s==="unknown"?null:s;return{cli:n(o.cli),plugin:n(o.plugin),openclaw:n(o.supported_openclaw)}}catch{return{cli:null,plugin:null,openclaw:null}}}function An(){if(!D.default.existsSync(Z))return null;try{let e=JSON.parse(D.default.readFileSync(Z,"utf-8")),t=e.channels?.badgerclaw;return t?(delete e.channels.badgerclaw,e.plugins?.entries?.badgerclaw&&delete e.plugins.entries.badgerclaw,D.default.writeFileSync(Z,JSON.stringify(e,null,2)),D.default.writeFileSync(pe,JSON.stringify(t,null,2)),t):null}catch{return null}}function kn(){if(D.default.existsSync(pe))try{let e=JSON.parse(D.default.readFileSync(pe,"utf-8")),t=JSON.parse(D.default.readFileSync(Z,"utf-8"));t.channels=t.channels||{},t.channels.badgerclaw=e,D.default.writeFileSync(Z,JSON.stringify(t,null,2)),D.default.unlinkSync(pe)}catch(e){console.log(w.default.yellow(` \u26A0\uFE0F Could not restore config: ${e.message}`)),console.log(w.default.yellow(` Your bot credentials are backed up at: ${pe}`))}}var io=new ao.Command("setup").description("Install or update the OpenClaw BadgerClaw plugin safely (handles config automatically)").action(async()=>{console.log(w.default.green(`
|
|
118
118
|
\u{1F9A1} BadgerClaw Setup
|
|
119
119
|
`));let e=await xn();if(e.cli){let a=at();a!==e.cli?(console.log(w.default.dim(` Updating CLI: ${a} \u2192 ${e.cli} (supported)...`)),(0,Q.spawnSync)("npm",["install","-g",`badgerclaw@${e.cli}`],{stdio:"inherit",shell:!0}).status!==0&&(console.log(w.default.red("\n\u274C CLI update failed. Fix the npm error above, then re-run `badgerclaw setup`.")),process.exit(1)),console.log(w.default.green(` \u2705 CLI updated to ${e.cli}`))):console.log(w.default.dim(` CLI already at approved version ${a}.`))}if(e.openclaw){let a=Oe();a!==e.openclaw?(console.log(a===null?w.default.dim(` Installing OpenClaw ${e.openclaw} (supported)...`):w.default.dim(` Updating OpenClaw: ${a} \u2192 ${e.openclaw} (supported)...`)),(0,Q.spawnSync)("npm",["install","-g",`openclaw@${e.openclaw}`],{stdio:"inherit",shell:!0}).status!==0&&(console.log(w.default.red("\n\u274C OpenClaw install/update failed. Fix the npm error above, then re-run `badgerclaw setup`.")),process.exit(1)),console.log(w.default.green(` \u2705 OpenClaw at ${e.openclaw}`))):console.log(w.default.dim(` OpenClaw already at approved version ${a}.`))}else Oe()===null&&(console.log(w.default.yellow(" \u26A0\uFE0F No approved OpenClaw version and none installed \u2014 installing latest from npm.")),(0,Q.spawnSync)("npm",["install","-g","openclaw"],{stdio:"inherit",shell:!0}).status!==0&&(console.log(w.default.red(`
|
|
@@ -124,4 +124,4 @@ Keep responses concise and helpful.
|
|
|
124
124
|
BadgerClaw Dashboard
|
|
125
125
|
`)),console.log(b.default.bold(" Instance")),console.log(` ID: ${de()}`),console.log(` CLI Version: ${t}`),console.log(` Plugin: ${n.pluginVersion}`),console.log(),console.log(b.default.bold(" Machine")),console.log(` Hostname: ${o.hostname}`),console.log(` OS: ${o.os} / ${o.arch}`),console.log(` Uptime: ${co(o.uptimeSeconds)}`),console.log(` Free Memory: ${o.memFreeMb} MB`),console.log();let s=n.status==="running"?b.default.green:n.status==="error"?b.default.red:b.default.yellow;if(console.log(b.default.bold(" Gateway")),console.log(` Status: ${s(n.status)}`),console.log(` PID: ${n.pid??"N/A"}`),console.log(` Last Restart: ${n.lastRestart??"N/A"}`),console.log(),n.bots.length===0)console.log(b.default.bold(" Bots")),console.log(b.default.dim(" No bots detected. Pair bots at https://badgerclaw.ai")),console.log();else{console.log(b.default.bold(` Bots (${n.bots.length})`)),console.log();for(let r of n.bots){let a=r.status==="running"?b.default.green:r.status==="error"?b.default.red:b.default.yellow;if(console.log(` ${b.default.bold(r.botUsername)} ${a(`[${r.status}]`)}`),console.log(` ID: ${r.botId}`),console.log(` Uptime: ${co(r.uptimeSeconds)}`),console.log(` Messages: ${r.messagesReceived} in / ${r.messagesSent} out`),r.chunkedMessages>0&&console.log(` Chunked: ${r.chunkedMessages} messages, ${r.totalChunksSent} chunks`),console.log(` Rooms: ${r.roomsActive} active`),console.log(` Errors: ${r.errors}`),r.lastError&&(console.log(` Last Error: ${b.default.red(r.lastError)}`),console.log(` Error At: ${r.lastErrorAt}`)),console.log(` Last Active: ${r.lastActivity??"N/A"}`),r.roomDetails&&r.roomDetails.length>0){console.log(b.default.dim(" Rooms:"));for(let i of r.roomDetails)console.log(b.default.dim(` ${i.roomName} \u2014 ${i.messagesInRoom} msgs, last: ${i.lastActivityInRoom??"N/A"}`))}console.log()}}console.log(b.default.dim(` Last checked: ${new Date().toISOString()}`)),console.log()});function co(e){if(e<60)return`${e}s`;if(e<3600)return`${Math.floor(e/60)}m ${e%60}s`;let t=Math.floor(e/3600),o=Math.floor(e%3600/60);return t<24?`${t}h ${o}m`:`${Math.floor(t/24)}d ${t%24}h ${o}m`}var lt=require("commander"),ee=c(require("chalk")),mo=c(require("ora"));var Rn=new lt.Command("restart").description("Restart the OpenClaw gateway via the plugin probe endpoint").action(async()=>{h()||(console.log(ee.default.yellow("Not logged in. Run `badgerclaw login` first.")),process.exit(1));let t=(0,mo.default)("Restarting gateway...").start(),o=await X();if(o.success){t.succeed(ee.default.green(`Gateway restarted: ${o.message}`));try{await A(),console.log(ee.default.dim(" Heartbeat pushed with updated status."))}catch{console.log(ee.default.dim(" Could not push heartbeat \u2014 daemon may not be running."))}}else t.fail(ee.default.red(`Gateway restart failed: ${o.message}`)),process.exit(1)}),po=new lt.Command("gateway").description("Manage the OpenClaw gateway").addCommand(Rn);var V=require("commander"),p=c(require("chalk")),z=c(require("ora")),G=c(require("axios"));ke();var J="http://localhost:7331",Pn=new V.Command("start").description("Start a Claude Code session for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").option("--session-id <id>","Session ID (default: auto-generated)").option("--port <port>","MCP server port (default: 7332)","7332").option("--project <dir>","Project directory",process.cwd()).action(async e=>{h()||(console.log(p.default.yellow("Not logged in. Run `badgerclaw login` first.")),process.exit(1));let o=e.sessionId||`session-${Date.now()}`,n=parseInt(e.port,10),s=e.project.replace(/^~/,process.env.HOME||""),r=(0,z.default)("Starting Claude Code session...").start();try{await G.default.post(`${J}/claude-code/toggle`,{botId:e.bot,roomId:e.room,enabled:!0,sessionId:o},{timeout:1e4}),r.text="Gateway toggled \u2014 launching MCP server...";let i=Qe({sessionId:o,port:n,projectDir:s}).pid||0;await new Promise(l=>setTimeout(l,1500)),r.text="MCP server running \u2014 launching Claude Code...",Ze({sessionId:o,port:n,projectDir:s}),et(o,0,i,n,s),r.succeed(p.default.green("Claude Code session started")+p.default.dim(` (session: ${o}, port: ${n})`)),console.log(p.default.dim(` Bot: ${e.bot}`)),console.log(p.default.dim(` Room: ${e.room}`)),console.log(p.default.dim(` Project: ${s}`)),console.log(p.default.dim(" Claude Code should open in a new terminal window."))}catch(a){let i=a.response?.data?.message||a.message||"Unknown error";r.fail(p.default.red(`Failed to start Claude Code: ${i}`)),process.exit(1)}}),En=new V.Command("stop").description("Stop a Claude Code session").option("--bot <botId>","Bot ID or username").option("--room <roomId>","Matrix room ID").option("--session-id <id>","Session ID to stop").action(async e=>{h()||(console.log(p.default.yellow("Not logged in. Run `badgerclaw login` first.")),process.exit(1));let o=(0,z.default)("Stopping Claude Code session...").start();try{e.bot&&e.room&&await G.default.post(`${J}/claude-code/toggle`,{botId:e.bot,roomId:e.room,enabled:!1},{timeout:1e4});let n=e.sessionId;if(!n)try{let a=((await G.default.get(`${J}/claude-code/status`,{timeout:5e3})).data?.rooms||[]).find(i=>i.botId===e.bot&&i.roomId===e.room);a&&(n=a.sessionId)}catch{}n?(tt(n),o.succeed(p.default.green(`Claude Code session stopped (${n})`))):(o.succeed(p.default.green("Claude Code toggled off at gateway")),console.log(p.default.dim(" No local session found to kill \u2014 may need to close Claude Code manually.")))}catch(n){let s=n.response?.data?.message||n.message||"Unknown error";o.fail(p.default.red(`Failed to stop Claude Code: ${s}`)),process.exit(1)}}),Dn=new V.Command("status").description("Show active Claude Code sessions").action(async()=>{h()||(console.log(p.default.yellow("Not logged in. Run `badgerclaw login` first.")),process.exit(1));let t=(0,z.default)("Fetching Claude Code status...").start();try{let o=[];try{o=(await G.default.get(`${J}/claude-code/status`,{timeout:5e3})).data?.rooms||[]}catch{}let n=ot();if(t.stop(),o.length===0&&n.length===0){console.log(p.default.dim("No active Claude Code sessions."));return}if(o.length>0){console.log(p.default.bold(`
|
|
126
126
|
Gateway Claude Code Rooms:`)),console.log(p.default.dim(" Bot".padEnd(30)+"Room".padEnd(30)+"Session".padEnd(20)+"Enabled")),console.log(p.default.dim(" "+"-".repeat(88)));for(let s of o){let r=s.enabled?p.default.green("ON"):p.default.dim("OFF");console.log(` ${(s.botId||"").padEnd(30)}${(s.roomName||s.roomId||"").padEnd(30)}${(s.sessionId||"-").padEnd(20)}${r}`)}}if(n.length>0){console.log(p.default.bold(`
|
|
127
|
-
Local Sessions:`)),console.log(p.default.dim(" Session".padEnd(25)+"Port".padEnd(8)+"MCP PID".padEnd(10)+"Project".padEnd(40)+"Started")),console.log(p.default.dim(" "+"-".repeat(90)));for(let s of n)console.log(` ${s.sessionId.padEnd(25)}${String(s.port).padEnd(8)}${String(s.mcpPid).padEnd(10)}${s.projectDir.padEnd(40)}${s.startedAt}`)}console.log("")}catch(o){t.fail(p.default.red(`Failed to get status: ${o.message}`)),process.exit(1)}}),On=new V.Command("group").description("Group bots/rooms into a shared Claude Code session").requiredOption("--session <id>","Session ID to group under").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").action(async e=>{let t=(0,z.default)("Grouping bot+room into session...").start();try{await G.default.post(`${J}/claude-code/toggle`,{botId:e.bot,roomId:e.room,enabled:!0,sessionId:e.session},{timeout:1e4}),t.succeed(p.default.green(`Grouped ${e.bot} + ${e.room} into session "${e.session}"`))}catch(o){let n=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to group: ${n}`)),process.exit(1)}}),Nn=new V.Command("allow").description("Add a user to the Claude Code allowlist for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").requiredOption("--user <userId>","Matrix user ID to allow (e.g. @alice:server)").action(async e=>{let t=(0,z.default)("Adding user to allowlist...").start();try{await G.default.post(`${J}/claude-code/allow`,{botId:e.bot,roomId:e.room,userId:e.user},{timeout:1e4}),t.succeed(p.default.green(`Added ${e.user} to allowlist for ${e.bot} in ${e.room}`))}catch(o){let n=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to add user: ${n}`)),process.exit(1)}}),Tn=new V.Command("revoke").description("Remove a user from the Claude Code allowlist for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").requiredOption("--user <userId>","Matrix user ID to revoke").action(async e=>{let t=(0,z.default)("Removing user from allowlist...").start();try{await G.default.post(`${J}/claude-code/revoke`,{botId:e.bot,roomId:e.room,userId:e.user},{timeout:1e4}),t.succeed(p.default.green(`Removed ${e.user} from allowlist for ${e.bot} in ${e.room}`))}catch(o){let n=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to revoke user: ${n}`)),process.exit(1)}}),go=new V.Command("claude-code").description("Manage Claude Code sessions (relay Matrix messages to local Claude Code)").addCommand(Pn).addCommand(En).addCommand(Dn).addCommand(On).addCommand(Nn).addCommand(Tn);async function Ln(){await ro(process.argv);let e=new fo.Command;e.name("badgerclaw").description("BadgerClaw CLI \u2014 one-click bot provisioning").version("0.2.
|
|
127
|
+
Local Sessions:`)),console.log(p.default.dim(" Session".padEnd(25)+"Port".padEnd(8)+"MCP PID".padEnd(10)+"Project".padEnd(40)+"Started")),console.log(p.default.dim(" "+"-".repeat(90)));for(let s of n)console.log(` ${s.sessionId.padEnd(25)}${String(s.port).padEnd(8)}${String(s.mcpPid).padEnd(10)}${s.projectDir.padEnd(40)}${s.startedAt}`)}console.log("")}catch(o){t.fail(p.default.red(`Failed to get status: ${o.message}`)),process.exit(1)}}),On=new V.Command("group").description("Group bots/rooms into a shared Claude Code session").requiredOption("--session <id>","Session ID to group under").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").action(async e=>{let t=(0,z.default)("Grouping bot+room into session...").start();try{await G.default.post(`${J}/claude-code/toggle`,{botId:e.bot,roomId:e.room,enabled:!0,sessionId:e.session},{timeout:1e4}),t.succeed(p.default.green(`Grouped ${e.bot} + ${e.room} into session "${e.session}"`))}catch(o){let n=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to group: ${n}`)),process.exit(1)}}),Nn=new V.Command("allow").description("Add a user to the Claude Code allowlist for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").requiredOption("--user <userId>","Matrix user ID to allow (e.g. @alice:server)").action(async e=>{let t=(0,z.default)("Adding user to allowlist...").start();try{await G.default.post(`${J}/claude-code/allow`,{botId:e.bot,roomId:e.room,userId:e.user},{timeout:1e4}),t.succeed(p.default.green(`Added ${e.user} to allowlist for ${e.bot} in ${e.room}`))}catch(o){let n=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to add user: ${n}`)),process.exit(1)}}),Tn=new V.Command("revoke").description("Remove a user from the Claude Code allowlist for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").requiredOption("--user <userId>","Matrix user ID to revoke").action(async e=>{let t=(0,z.default)("Removing user from allowlist...").start();try{await G.default.post(`${J}/claude-code/revoke`,{botId:e.bot,roomId:e.room,userId:e.user},{timeout:1e4}),t.succeed(p.default.green(`Removed ${e.user} from allowlist for ${e.bot} in ${e.room}`))}catch(o){let n=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to revoke user: ${n}`)),process.exit(1)}}),go=new V.Command("claude-code").description("Manage Claude Code sessions (relay Matrix messages to local Claude Code)").addCommand(Pn).addCommand(En).addCommand(Dn).addCommand(On).addCommand(Nn).addCommand(Tn);async function Ln(){await ro(process.argv);let e=new fo.Command;e.name("badgerclaw").description("BadgerClaw CLI \u2014 one-click bot provisioning").version("0.2.26"),e.addCommand(Lt),e.addCommand(Bt),e.addCommand(Mt),e.addCommand(Ft),e.addCommand(vt),e.addCommand(to),e.addCommand(io),e.addCommand(Qt),e.addCommand(uo),e.addCommand(po),e.addCommand(go),e.parse(process.argv)}Ln().catch(e=>{console.error(e),process.exit(1)});
|