oh-my-agent 4.16.0 → 4.17.1
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/bin/cli.js +2 -2
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -344,7 +344,7 @@ ${u$}`:b;if(B.output_format_flag&&B.output_format)A.push(B.output_format_flag,B.
|
|
|
344
344
|
${_}
|
|
345
345
|
\`\`\`
|
|
346
346
|
|
|
347
|
-
${$}`}catch{return`Review the latest committed changes. ${$}`}}function oj($,I,U,_,u){let g=I.command||$;if($==="codex")return _?[g,"review","--uncommitted"]:[g,"review"];let z=pj(U,_,u),v=I.prompt_flag||"-p",J=[g,v,z];if(I.model_flag&&I.default_model)J.push(I.model_flag,I.default_model);if(I.auto_approve_flag)J.push(I.auto_approve_flag);else{let X={gemini:"--approval-mode=yolo",qwen:"--yolo"}[$];if(X)J.push(X)}if($==="claude")J.push("--output-format","text");return J}async function E7($){let I=hj(),U=$.prompt||"Review for bugs, security vulnerabilities, performance issues, and code quality. Report findings with severity levels.",_="review",u=$.workspace||".",g=I$.resolve(u),{vendor:z,config:v}=s3("review",$.model),J=dj.includes(z)?z:cj;if(J!==z)console.log(n.default.yellow(`[review] "${z}" has no review mode, falling back to ${J}`));let N=v?.vendors?.[J]||{},X=$.uncommitted??!0,G=oj(J,N,U,X,g),q
|
|
347
|
+
${$}`}catch{return`Review the latest committed changes. ${$}`}}function oj($,I,U,_,u){let g=I.command||$;if($==="codex")return _?[g,"review","--uncommitted"]:[g,"review"];let z=pj(U,_,u),v=I.prompt_flag||"-p",J=[g,v,z];if(I.model_flag&&I.default_model)J.push(I.model_flag,I.default_model);if(I.auto_approve_flag)J.push(I.auto_approve_flag);else{let X={gemini:"--approval-mode=yolo",qwen:"--yolo"}[$];if(X)J.push(X)}if($==="claude")J.push("--output-format","text");return J}async function E7($){let I=hj(),U=$.prompt||"Review for bugs, security vulnerabilities, performance issues, and code quality. Report findings with severity levels.",_="review",u=$.workspace||".",g=I$.resolve(u),{vendor:z,config:v}=s3("review",$.model),J=dj.includes(z)?z:cj;if(J!==z)console.log(n.default.yellow(`[review] "${z}" has no review mode, falling back to ${J}`));let N=v?.vendors?.[J]||{},X=$.uncommitted??!0,G=oj(J,N,U,X,g),[q,...T]=G,H=I$.join(W_(),`review-${I}.log`),Q=I$.join(W_(),`review-${I}.pid`);console.log(n.default.dim(` Session: ${I}`)),console.log(n.default.blue("[review] Starting review...")),console.log(n.default.dim(` Vendor: ${J}`)),console.log(n.default.dim(` Command: ${q} ${T.slice(0,2).join(" ")}...`));let Y=y.openSync(H,"w"),R=a3(q,T,{cwd:g,stdio:["ignore",Y,Y],detached:!1});if(!R.pid)console.error(n.default.red("[review] Failed to spawn process")),process.exit(1);y.writeFileSync(Q,R.pid.toString()),console.log(n.default.green(`[review] Started with PID ${R.pid}`));let K=()=>{try{if(y.existsSync(Q))y.unlinkSync(Q);if(y.existsSync(H))y.unlinkSync(H)}catch(O){}},W=()=>{if(R.pid&&Z_(R.pid))process.kill(R.pid);K(),process.exit()};process.on("SIGINT",W),process.on("SIGTERM",W),R.on("exit",(O)=>{if(y.existsSync(H)){let V=y.readFileSync(H,"utf-8").trim();if(V)console.log(""),console.log(V)}console.log(O===0?n.default.green("[review] Done"):n.default.red(`[review] Exited with code ${O}`)),K(),process.exit(O??0)})}e$();var v1=q$(b$(),1);import{execSync as QS}from"node:child_process";import{existsSync as jG,readFileSync as FG}from"node:fs";import{homedir as SG}from"node:os";import{join as wG}from"node:path";import{execSync as PG}from"node:child_process";import NT from"node:https";function cF(){try{let $=PG("pgrep -fl language_server",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]});for(let I of $.split(`
|
|
348
348
|
`))if(I.includes("antigravity")||I.includes("language_server")){let U=I.trim().split(" ")[0];if(!U)continue;let _=Number.parseInt(U,10);if(!Number.isNaN(_))return _}}catch{}return null}function dF($){try{return PG(`ps -p ${$} -ww -o args`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).match(/--csrf_token\s+([a-zA-Z0-9-]+)/)?.[1]??null}catch{}return null}function pF($){try{let I=PG(`lsof -nP -a -iTCP -sTCP:LISTEN -p ${$}`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}),U=[];for(let _ of I.split(`
|
|
349
349
|
`).slice(1)){let u=_.match(/:(\d+)\s+\(LISTEN\)/);if(u?.[1])U.push(Number.parseInt(u[1],10))}return U}catch{}return[]}function GT($,I,U,_){return new Promise((u,g)=>{let z=JSON.stringify(_),v=NT.request({hostname:"127.0.0.1",port:$,path:I,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(z),"Connect-Protocol-Version":"1","X-Codeium-Csrf-Token":U},rejectUnauthorized:!1,timeout:5000},(J)=>{let N="";J.on("data",(X)=>{N+=X}),J.on("end",()=>{if(J.statusCode&&J.statusCode>=200&&J.statusCode<300)try{u(JSON.parse(N))}catch{g(Error("Invalid JSON response"))}else g(Error(`Request failed: ${J.statusCode}`))})});v.on("error",g),v.on("timeout",()=>{v.destroy(),g(Error("Request timeout"))}),v.write(z),v.end()})}function oF($,I){return new Promise((U)=>{let _=NT.request({hostname:"127.0.0.1",port:$,path:"/exa.language_server_pb.LanguageServerService/GetUnleashData",method:"POST",headers:{"Content-Type":"application/json","X-Codeium-Csrf-Token":I,"Connect-Protocol-Version":"1"},rejectUnauthorized:!1,timeout:5000},(u)=>{let g="";u.on("data",(z)=>{g+=z}),u.on("end",()=>{if(u.statusCode===200)try{JSON.parse(g),U(!0)}catch{U(!1)}else U(!1)})});_.on("error",()=>U(!1)),_.on("timeout",()=>{_.destroy(),U(!1)}),_.write(JSON.stringify({wrapper_data:{}})),_.end()})}function tF($){if($<=0)return"Ready";let I=Math.ceil($/60000);if(I<60)return`${I}m`;return`${Math.floor(I/60)}h ${I%60}m`}function JT($,I){if(!$||I===void 0)return;let U=Number($),_=Number(I);if(U<=0)return;return{available:_,monthly:U,usedPercent:(U-_)/U*100,remainingPercent:_/U*100}}function aF($){let I=$.userStatus??{},U=I.planStatus?.planInfo??{},_=JT(U.monthlyPromptCredits,I.planStatus?.availablePromptCredits),u=JT(U.monthlyFlowCredits,I.planStatus?.availableFlowCredits),z=(I.cascadeModelConfigData?.clientModelConfigs??[]).filter((J)=>J.quotaInfo!==void 0).map((J)=>{let N=J.quotaInfo.resetTime?new Date(J.quotaInfo.resetTime):null,X=N?N.getTime()-Date.now():0,G=J.quotaInfo.remainingFraction,q=0;if(G!==void 0&&G!==null)q=G*100;else if(J.quotaInfo.allowed)q=100;return{label:J.label||"Unknown",modelId:J.modelOrAlias?.model||"unknown",remainingPercent:q,isExhausted:J.quotaInfo.remainingFraction===0,resetTime:N,timeUntilReset:tF(X),supportsImages:J.supportsImages??!1}}),v=I.cascadeModelConfigData?.defaultOverrideModelConfig?.modelOrAlias?.model??null;return{userName:I.name||"Unknown",email:I.email||"",planName:U.planName||"Free",tierName:I.userTier?.name||"",promptCredits:_,flowCredits:u,models:z,defaultModel:v,timestamp:new Date}}async function XT(){let $=cF();if(!$)return null;let I=dF($);if(!I)return null;let U=pF($);for(let _ of U)if(await oF(_,I))return{pid:$,csrfToken:I,port:_};return null}async function eF($){try{let I=await GT($.port,"/exa.language_server_pb.LanguageServerService/GetUserStatus",$.csrfToken,{metadata:{ideName:"antigravity",extensionName:"antigravity",locale:"en"}});return aF(I)}catch{return null}}async function qT(){let $=await XT();if(!$)return null;try{return await GT($.port,"/exa.language_server_pb.LanguageServerService/GetUserStatus",$.csrfToken,{metadata:{ideName:"antigravity",extensionName:"antigravity",locale:"en"}})}catch{return null}}async function w0(){let $=await XT();if(!$)return null;return eF($)}JI();function EG(){try{let $=QS("claude auth status",{stdio:["pipe","pipe","ignore"],encoding:"utf-8"});return JSON.parse($).loggedIn===!0}catch{return!1}}function CG(){let $=wG(SG(),".gemini","oauth_creds.json");if(!jG($))return!1;try{let I=JSON.parse(FG($,"utf-8"));return!!(I.access_token&&I.refresh_token)}catch{return!1}}function fG(){let $=wG(SG(),".codex","auth.json");if(!jG($))return!1;try{return!!JSON.parse(FG($,"utf-8")).tokens?.access_token}catch{return!1}}function xG(){let $=wG(SG(),".qwen","settings.json");if(!jG($))return!1;try{return!!JSON.parse(FG($,"utf-8")).security?.auth?.selectedType}catch{return!1}}async function WT($=!1){let[I,U]=await Promise.all([y4(),w0().then((G)=>!!G)]),_=CG(),u=EG(),g=fG(),z=xG(),v={github:I,gemini:_,claude:u,codex:g,qwen:z,antigravity:U};if($){console.log(JSON.stringify(v,null,2));return}D$(v1.default.bgMagenta(v1.default.white(" \uD83D\uDD10 oh-my-agent auth status ")));let J=(G)=>G?"✅":"❌",N=(G)=>G?v1.default.green("Authenticated"):v1.default.red("Not Authenticated");k([["GitHub",I],["Gemini CLI",_],["Claude CLI",u],["Codex CLI",g],["Qwen CLI",z],["Antigravity",U]].map(([G,q])=>`${J(q)} ${G.padEnd(12)} ${N(q)}`).join(`
|
|
350
350
|
`),"Authentication Status"),d(`Use ${v1.default.cyan("gemini auth")}, ${v1.default.cyan("claude auth")}, etc. to login.`)}import{spawn as TS}from"node:child_process";import{existsSync as ZT,readFileSync as AT,writeFileSync as HS}from"node:fs";import YS from"node:http";import OS from"node:https";import{homedir as DS}from"node:os";import{join as bT}from"node:path";var VS="http://localhost:12341/mcp",jT=1000,BS=Number.parseInt(process.env.OH_MY_AG_BRIDGE_PROBE_TIMEOUT_MS??"2000",10),MS=Number.parseInt(process.env.OH_MY_AG_BRIDGE_STARTUP_TIMEOUT_MS??"120000",10),Z6={};function FT(){if(Z6.stdinData)process.stdin.off("data",Z6.stdinData);if(Z6.sigint)process.off("SIGINT",Z6.sigint);if(Z6.sigterm)process.off("SIGTERM",Z6.sigterm);Z6={}}function RS(){let $=bT(DS(),".serena","serena_config.yml");if(!ZT($))return;try{let U=AT($,"utf8").match(/^projects:\s*\n((?:\s*-\s*.+\n?)*)/m);if(!U)return;let u=((U[1]??"").match(/^\s*-\s*(.+)$/gm)||[]).map((g)=>g.replace(/^\s*-\s*/,"").trim());for(let g of u){let z=bT(g,".serena","project.yml");if(!ZT(z))continue;let v=AT(z,"utf8");if(!/^languages:/m.test(v)){console.error(`[Bridge] Missing 'languages' key in ${z}, adding default...`);let J=v.search(/\n(?=\w)/);if(J!==-1){let N=`${v.slice(0,J)}
|
|
@@ -490,7 +490,7 @@ Co-Authored-By: First Fluke <our.first.fluke@gmail.com>`,pr:"Generated with [oh-
|
|
|
490
490
|
</html>`;function KO(){let $=Jf();if(!_f($))gf($,{recursive:!0});let I=vf((z,v)=>{if(z.url==="/api/state")v.writeHead(200,{"Content-Type":"application/json"}),v.end(JSON.stringify(x9($)));else v.writeHead(200,{"Content-Type":"text/html"}),v.end(Tf)}),U=new f9.default({server:I}),_=null;function u(z,v){if(_)clearTimeout(_);_=setTimeout(()=>{let J=JSON.stringify({type:"update",event:z,file:v,data:x9($)});U.clients.forEach((N)=>{if(N.readyState===C9.default.OPEN)N.send(J)})},100)}let g=V2($,{persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:200,pollInterval:50}});g.on("all",(z,v)=>u(z,RO(v))),U.on("connection",(z)=>{z.send(JSON.stringify({type:"full",data:x9($)})),z.on("error",()=>z.terminate())}),process.on("SIGINT",()=>{console.log(`
|
|
491
491
|
Shutting down...`),g.close(),U.clients.forEach((z)=>{z.terminate()}),U.close(()=>I.close(()=>process.exit(0))),setTimeout(()=>process.exit(1),3000).unref()}),process.on("SIGTERM",()=>process.emit("SIGINT")),I.listen(MO,()=>{console.log(BI.magenta(`
|
|
492
492
|
\uD83D\uDEF8 Serena Memory Dashboard`)),console.log(BI.white(` http://localhost:${MO}`)),console.log(BI.dim(` Watching: ${$}
|
|
493
|
-
`))})}var LO={name:"oh-my-agent",version:"4.
|
|
493
|
+
`))})}var LO={name:"oh-my-agent",version:"4.17.1",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-ag":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing","gemini"],author:"our.first.fluke <our.first.fluke@gmail.com>",contributors:["gracefullight <gracefullight.dev@gmail.com>","gahyun-git <go4it.gh@gmail.com>"],license:"MIT",funding:[{type:"github",url:"https://github.com/sponsors/first-fluke"},{type:"buymeacoffee",url:"https://buymeacoffee.com/firstfluke"}],scripts:{"sync:readme":"node ./scripts/sync-readme.mjs",build:"bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify",dev:"bun run cli.ts",lint:"biome check --write --unsafe .",test:"vitest run",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0",chokidar:"^5.0.0",commander:"^14.0.3","p-map":"^7.0.4",picocolors:"^1.1.1",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/bun":"^1.3.10","@types/ws":"^8.18.1",vitest:"^4.0.18"},peerDependencies:{typescript:"^6"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["oma-brainstorm","oma-coordination","oma-pm","oma-frontend","oma-backend","oma-db","oma-mobile","oma-qa","oma-debug","oma-orchestrator","oma-dev-workflow","oma-tf-infra","oma-commit"]}};import{existsSync as Yf,mkdirSync as Of,readdirSync as o0,readFileSync as Df,statSync as n9}from"node:fs";import{basename as Vf,join as A4}from"node:path";var i$=q$(b$(),1),Bf="●",Mf="✓",Rf="✗",Kf="○",Lf="◌";function Pf(){if(process.env.MEMORIES_DIR)return process.env.MEMORIES_DIR;let $=process.argv[3];if($)return A4($,".serena","memories");return A4(process.cwd(),".serena","memories")}function t0($){try{return Df($,"utf-8")}catch{return""}}function Wf($){try{let I=o0($);if(I.includes("orchestrator-session.md"))return A4($,"orchestrator-session.md");let U=I.filter((_)=>/^session-.*\.md$/.test(_)).map((_)=>({name:_,mtime:n9(A4($,_)).mtimeMs})).sort((_,u)=>u.mtime-_.mtime);if(U.length>0&&U[0])return A4($,U[0].name)}catch{}return null}function Zf($){let I=Wf($);if(!I)return{id:"N/A",status:"UNKNOWN"};let U=t0(I);if(!U)return{id:"N/A",status:"UNKNOWN"};let _=(U.match(/session-id:\s*(.+)/i)||[])[1]||(U.match(/# Session:\s*(.+)/i)||[])[1]||U.match(/(session-\d{8}-\d{6})/)?.[1]||Vf(I,".md"),u="UNKNOWN";if(/IN PROGRESS|RUNNING|## Active|\[IN PROGRESS\]/i.test(U))u="RUNNING";else if(/COMPLETED|DONE|## Completed|\[COMPLETED\]/i.test(U))u="COMPLETED";else if(/FAILED|ERROR|## Failed|\[FAILED\]/i.test(U))u="FAILED";else if(/Step \d+:.*\[/i.test(U))u="RUNNING";return{id:(_||"N/A").trim(),status:u}}function Af($){let I=t0(A4($,"task-board.md"));if(!I)return[];let U=[],_=I.split(`
|
|
494
494
|
`);for(let u of _){if(!u.startsWith("|")||/^\|\s*-+/.test(u))continue;let g=u.split("|").map((N)=>N.trim()).filter(Boolean),z=g[0];if(g.length<2||!z||/^agent$/i.test(z))continue;let v=g[1],J=g[2];U.push({agent:z,status:v||"pending",task:J||""})}return U}function i9($,I){try{let U=o0($).filter((g)=>g.startsWith(`progress-${I}`)&&g.endsWith(".md")).sort().reverse();if(U.length===0||!U[0])return null;let u=t0(A4($,U[0])).match(/turn[:\s]*(\d+)/i);return u?.[1]?parseInt(u[1],10):null}catch{return null}}function bf($){try{let I=o0($).filter((_)=>_.endsWith(".md")&&_!==".gitkeep").map((_)=>({name:_,mtime:n9(A4($,_)).mtimeMs})).sort((_,u)=>u.mtime-_.mtime).slice(0,5),U=[];for(let _ of I){let u=_.name.replace(/^(progress|result|session|debug|task)-?/,"").replace(/[-_]agent/,"").replace(/[-_]completion/,"").replace(/\.md$/,"").replace(/[-_]/g," ").trim()||_.name.replace(/\.md$/,""),z=t0(A4($,_.name)).split(`
|
|
495
495
|
`).map((J)=>J.trim()).filter((J)=>J&&!J.startsWith("---")&&J.length>3),v="";for(let J=z.length-1;J>=0;J--){let N=z[J];if(!N)continue;if(/^\*\*|^#+|^-|^\d+\.|Status|Result|Action|Step/i.test(N)){if(v=N.replace(/^[#*\-\d.]+\s*/,"").replace(/\*\*/g,"").trim(),v.length>5)break}}if(v.length>52)v=`${v.substring(0,49)}...`;if(v)U.push({agent:u,message:v})}return U}catch{return[]}}function jf($){let I=[],U=new Set;try{let _=o0($).filter((u)=>u.endsWith(".md")&&u!==".gitkeep").map((u)=>({name:u,mtime:n9(A4($,u)).mtimeMs})).sort((u,g)=>g.mtime-u.mtime);for(let u of _){let g=t0(A4($,u.name)),z=g.match(/\*\*Agent\*\*:\s*(.+)/i)||g.match(/Agent:\s*(.+)/i)||g.match(/^#+\s*(.+?)\s*Agent/im),v=null;if(z?.[1])v=z[1].trim();else if(/_agent|agent_|-agent/i.test(u.name))v=u.name.replace(/\.md$/,"").replace(/[-_]completion|[-_]progress|[-_]result/gi,"").replace(/[-_]/g," ").trim();if(v&&!U.has(v.toLowerCase())){U.add(v.toLowerCase());let J="unknown";if(/\[COMPLETED\]|## Completed|## Results/i.test(g))J="completed";else if(/\[IN PROGRESS\]|## Progress|IN PROGRESS/i.test(g))J="running";else if(/\[FAILED\]|## Failed|ERROR/i.test(g))J="failed";let N=g.match(/## Task\s*\n+(.+)/i)||g.match(/\*\*Task\*\*:\s*(.+)/i),X=N?.[1]?N[1].trim().substring(0,20):"";I.push({agent:v,status:J,task:X,turn:i9($,v)})}}}catch{}return I}function Ff($){let I=$.toLowerCase();if(["running","active","in_progress","in-progress"].includes(I))return`${i$.default.green(Bf)} running`;else if(["completed","done","finished"].includes(I))return`${i$.default.cyan(Mf)} completed`;else if(["failed","error"].includes(I))return`${i$.default.red(Rf)} failed`;else if(["blocked","waiting"].includes(I))return`${i$.default.yellow(Kf)} blocked`;return`${i$.default.dim(Lf)} pending`}function PO($){console.clear();let I=Zf($),_=Af($).map((Q)=>({...Q,turn:i9($,Q.agent)}));if(_.length===0)_=jf($);if(_.length===0)try{let Q=o0($).filter((Y)=>Y.startsWith("progress-")&&Y.endsWith(".md"));for(let Y of Q){let R=Y.replace(/^progress-/,"").replace(/\.md$/,"");_.push({agent:R,status:"running",task:"",turn:i9($,R)})}}catch{}let u=56,g="═".repeat(u),z=(Q)=>" ".repeat(Math.max(0,Q)),v=(Q)=>i$.default.magenta(Q),J=(Q)=>i$.default.bold(Q),N=(Q)=>i$.default.dim(Q),X=i$.default.yellow;if(I.status==="RUNNING")X=i$.default.green;else if(I.status==="COMPLETED")X=i$.default.cyan;else if(I.status==="FAILED")X=i$.default.red;console.log(`${v(`╔${g}╗`)}`),console.log(`${v("║")} ${J(v("Serena Memory Dashboard"))}${z(u-25)}${v("║")}`);let G=`Session: ${J(I.id.padEnd(20))} [${X(I.status)}]`;if(console.log(`${v("║")} ${G}${z(u-4-G.length-9)}${v("║")}`),console.log(`${v(`╠${g}╣`)}`),console.log(`${v("║")} ${J(`${"Agent".padEnd(12)} ${"Status".padEnd(12)} ${"Turn".padEnd(6)} ${"Task".padEnd(20)}`)} ${v("║")}`),console.log(`${v("║")} ${N(`${"──────────".padEnd(12)} ${"──────────".padEnd(12)} ${"────".padEnd(6)} ${"──────────────────".padEnd(20)}`)} ${v("║")}`),_.length===0)console.log(`${v("║")} ${N(`No agents detected yet${z(32)}`)}${v("║")}`);else for(let Q of _){let Y=Ff(Q.status),R=Q.turn!=null?String(Q.turn):"-",K=Q.task.substring(0,20);console.log(`${v("║")} ${Q.agent.padEnd(12)} ${Y.padEnd(22)} ${R.padEnd(6)} ${K.padEnd(20)}${v("║")}`)}console.log(`${v(`╠${g}╣`)}`),console.log(`${v("║")} ${J("Latest Activity:")}${z(u-18)}${v("║")}`);let q=bf($);if(q.length===0)console.log(`${v("║")} ${N(`No activity yet${z(38)}`)}${v("║")}`);else for(let Q of q){let Y=`[${Q.agent}] ${Q.message}`;console.log(`${v("║")} ${N(Y.substring(0,52).padEnd(52))}${v("║")}`)}console.log(`${v(`╠${g}╣`)}`);let H=`Updated: ${new Date().toLocaleString("en-US",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})} | Ctrl+C to exit`;console.log(`${v("║")} ${N(H)}${z(u-4-H.length)}${v("║")}`),console.log(`${v(`╚${g}╝`)}`)}async function WO(){let $=Pf();if(!Yf($))Of($,{recursive:!0}),console.log(i$.default.yellow(`Created ${$} — waiting for memory files...`));console.log(i$.default.magenta(`
|
|
496
496
|
\uD83D\uDEF8 Serena Terminal Dashboard`)),console.log(i$.default.dim(` Watching: ${$}
|
package/package.json
CHANGED