nex-code 0.3.87 → 0.4.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/dist/nex-code.js +3 -3
- package/package.json +1 -1
package/dist/nex-code.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var G=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var On=G((uk,_m)=>{_m.exports={name:"nex-code",version:"0.
|
|
2
|
+
var G=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var On=G((uk,_m)=>{_m.exports={name:"nex-code",version:"0.4.1",description:"The open-source agentic coding CLI. Free with Ollama Cloud \u2014 switch to OpenAI, Anthropic or Gemini anytime. Alternative to Claude Code & Gemini CLI.",bin:{"nex-code":"./dist/nex-code.js"},files:["dist/","README.md","LICENSE"],engines:{node:">=18.0.0"},scripts:{start:"node dist/nex-code.js",build:"esbuild bin/nex-code.js --bundle --platform=node --target=node18 --outfile=dist/nex-code.js --minify --external:axios --external:dotenv --external:playwright",test:"jest --forceExit","test:orchestrator":"jest tests/orchestrator.test.js --forceExit",coverage:"jest --coverage --forceExit","test:watch":"jest --watch",format:"prettier --write .","install-hooks":"ln -sf ../../hooks/pre-push .git/hooks/pre-push && chmod +x .git/hooks/pre-push && ln -sf ../../hooks/post-merge .git/hooks/post-merge && chmod +x .git/hooks/post-merge && echo 'Hooks installed (pre-push, post-merge).'",prepublishOnly:"npm run build && npm test","merge-to-main":"bash scripts/merge-to-main.sh",release:"npm version patch && git push --follow-tags && npm publish"},keywords:["ai","cli","coding","agent","ollama","ollama-cloud","openai","anthropic","claude","gemini","llm","gpt","agentic","terminal","coding-assistant","claude-code-alternative","gemini-cli-alternative","open-source","free","qwen3","devstral","kimi-k2","deepseek","local-llm","mcp","model-context-protocol","multi-provider"],repository:{type:"git",url:"https://github.com/hybridpicker/nex-code.git"},bugs:{url:"https://github.com/hybridpicker/nex-code/issues"},homepage:"https://github.com/hybridpicker/nex-code#readme",license:"MIT",dependencies:{axios:"^1.7.0",dotenv:"^16.4.0"},devDependencies:{esbuild:"^0.27.3",jest:"^29.7.0",prettier:"^3.8.1"},jest:{coverageThreshold:{global:{lines:45,functions:30,branches:35},"./cli/sub-agent.js":{lines:70,functions:60,branches:55}}}}});var fn=G((dk,Ec)=>{"use strict";var bc="\x1B[0m",_c="\x1B[1m",Nn="\x1B[2m";function j(t,e,n){return`\x1B[38;2;${t};${e};${n}m`}function xm(){if(!process.stdout.isTTY)return null;try{let{execFileSync:t}=require("child_process"),e=["import sys,os,tty,termios,select","f=open('/dev/tty','r+b',buffering=0)","fd=f.fileno()","s=termios.tcgetattr(fd)","try:"," tty.setraw(fd)"," f.write(bytes([0x1b,0x5d,0x31,0x31,0x3b,0x3f,0x1b,0x5c]))"," r=select.select([fd],[],[],0.1)[0]"," d=b''"," if r:"," while True:"," r2=select.select([fd],[],[],0.05)[0]"," if not r2:break"," c=os.read(fd,1)"," d+=c"," if d[-1:]==bytes([0x07]) or d[-2:]==bytes([0x1b,0x5c]):break"," sys.stdout.buffer.write(d)","finally:"," termios.tcsetattr(fd,termios.TCSADRAIN,s)"," f.close()"].join(`
|
|
3
3
|
`),s=t("python3",["-c",e],{encoding:"buffer",timeout:400,stdio:["ignore","pipe","ignore"]}).toString("utf8").match(/rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)/);if(s){let r=parseInt(s[1].slice(0,2),16),i=parseInt(s[2].slice(0,2),16),a=parseInt(s[3].slice(0,2),16);return .299*r+.587*i+.114*a<128}}catch{}return null}function xc(){let t=require("os");return require("path").join(t.homedir(),".nex-code",".theme_cache.json")}function km(t){try{let n=require("fs").readFileSync(xc(),"utf8"),o=JSON.parse(n);if(o&&typeof o[t]=="boolean")return o[t]}catch{}return null}function vm(t,e){try{let n=require("fs"),o=require("path"),s=xc(),r=o.dirname(s),i={};try{i=JSON.parse(n.readFileSync(s,"utf8"))}catch{}i[t]=e;let a=Object.keys(i);a.length>50&&a.slice(0,a.length-50).forEach(l=>delete i[l]),n.existsSync(r)||n.mkdirSync(r,{recursive:!0}),n.writeFileSync(s,JSON.stringify(i),"utf8")}catch{}}function Sm(){let t=(process.env.NEX_THEME||"").toLowerCase();if(t==="light")return!1;if(t==="dark")return!0;let e=process.env.COLORFGBG;if(e){let i=e.split(";"),a=parseInt(i[i.length-1],10);if(!isNaN(a))return a<8}let n=process.env.TERM_SESSION_ID||"default",o=km(n);if(o!==null)return o;let s=xm(),r=s!==null?s:!0;return vm(n,r),r}var kc=Sm(),vc={reset:bc,bold:_c,dim:Nn,primary:j(80,190,255),secondary:j(60,170,190),success:j(80,210,120),warning:j(245,175,50),error:j(230,80,80),muted:Nn,subtle:j(130,130,145),tool_read:j(80,190,255),tool_write:j(245,165,55),tool_exec:j(185,100,235),tool_search:j(70,185,190),tool_git:j(90,210,100),tool_web:j(100,215,250),tool_sysadmin:j(225,150,75),tool_default:j(100,205,115),syn_keyword:j(185,100,235),syn_string:j(90,210,120),syn_number:j(245,175,50),syn_comment:Nn,syn_key:j(80,190,255),diff_add:j(80,210,120),diff_rem:j(230,80,80),banner_logo:j(80,200,255),banner_name:j(80,200,255),banner_version:Nn,banner_model:Nn,banner_yolo:j(245,175,50),footer_sep:Nn,footer_model:j(80,175,235),footer_branch:j(80,210,100),footer_project:j(130,130,145),footer_divider:j(80,80,95),footer_mode:j(210,150,50),white:"\x1B[37m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",diff_add_bg:"\x1B[48;2;10;46;20m",diff_rem_bg:"\x1B[48;2;58;16;16m",brightCyan:"\x1B[96m",brightMagenta:"\x1B[95m",brightBlue:"\x1B[94m"},Sc={reset:bc,bold:_c,dim:j(110,110,120),primary:j(0,110,190),secondary:j(0,125,148),success:j(0,148,62),warning:j(168,92,0),error:j(188,32,32),muted:j(110,110,120),subtle:j(155,155,165),tool_read:j(0,110,190),tool_write:j(168,92,0),tool_exec:j(128,42,188),tool_search:j(0,122,148),tool_git:j(0,138,62),tool_web:j(0,112,178),tool_sysadmin:j(168,82,0),tool_default:j(0,138,62),syn_keyword:j(128,42,188),syn_string:j(0,138,62),syn_number:j(168,92,0),syn_comment:j(135,135,148),syn_key:j(0,110,190),diff_add:j(0,148,62),diff_rem:j(188,32,32),banner_logo:j(0,122,205),banner_name:j(0,122,205),banner_version:j(100,100,118),banner_model:j(100,100,118),banner_yolo:j(168,62,0),footer_sep:j(168,168,178),footer_model:j(0,102,175),footer_branch:j(0,138,62),footer_project:j(135,135,148),footer_divider:j(168,168,178),footer_mode:j(148,88,0),white:j(40,40,52),red:j(188,32,32),green:j(0,148,62),yellow:j(168,92,0),blue:j(0,110,190),magenta:j(128,42,188),cyan:j(0,125,148),gray:j(132,132,142),bgRed:"\x1B[41m",bgGreen:"\x1B[42m",diff_add_bg:"\x1B[48;2;215;245;220m",diff_rem_bg:"\x1B[48;2;255;215;215m",brightCyan:j(0,158,182),brightMagenta:j(158,52,208),brightBlue:j(0,112,208)},Em=kc?vc:Sc;Ec.exports={T:Em,isDark:kc,DARK:vc,LIGHT:Sc}});var Pn=G((fk,Rc)=>{var{T:K}=fn(),po=5,Mn=(()=>{let t=[];for(let e=0;e<po;e++)t.push(e);for(let e=po-2;e>=1;e--)t.push(e);return t})(),Tc=["\u273D","\u2726","\u2727","\u2726"],Kr=class{constructor(e="Thinking..."){this.text=e,this.frame=0,this.interval=null,this.startTime=null}_render(){if(this._stopped)return;let e=Mn[this.frame%Mn.length],n="";for(let s=0;s<po;s++)n+=s===e?`${K.cyan}\u25CF${K.reset}`:" ";let o="";if(this.startTime){let s=Math.floor((Date.now()-this.startTime)/1e3);if(s>=60){let r=Math.floor(s/60),i=s%60;o=` ${K.dim}${r}m ${String(i).padStart(2,"0")}s${K.reset}`}else s>=1&&(o=` ${K.dim}${s}s${K.reset}`)}process.stderr.write(`\x1B[2K\r${n} ${K.dim}${this.text}${K.reset}${o}`),this.frame++}start(){this._stopped=!1,this.startTime=Date.now(),process.stderr.isTTY&&(process.stderr.write("\x1B[?25l"),this._render(),this.interval=setInterval(()=>this._render(),100))}update(e){this.text=e}stop(){this._stopped=!0,this.interval&&(clearInterval(this.interval),this.interval=null),process.stderr.isTTY&&process.stderr.write("\x1B[2K\r\x1B[?25h"),this.startTime=null}},Yr=class{constructor(e){this.labels=e,this.statuses=e.map(()=>"running"),this.frame=0,this.interval=null,this.startTime=null,this.lineCount=e.length}_formatElapsed(){if(!this.startTime)return"";let e=Math.floor((Date.now()-this.startTime)/1e3);if(e<1)return"";let n=Math.floor(e/60),o=e%60;return n>0?`${n}m ${String(o).padStart(2,"0")}s`:`${o}s`}_render(){if(this._stopped)return;let e=Mn[this.frame%Mn.length],n=`${K.cyan}\u25CF${K.reset}`,o=`${K.dim}\u25CB${K.reset}`,s=this._formatElapsed(),r=s?` ${K.dim}${s}${K.reset}`:"",i="";for(let a=0;a<this.labels.length;a++){let l,u;switch(this.statuses[a]){case"done":l=`${K.green}\u2713${K.reset}`,u=K.dim;break;case"error":l=`${K.red}\u2717${K.reset}`,u=K.dim;break;default:l=a===e?n:" ",u=""}let d=a===this.labels.length-1?r:"";i+=`\x1B[2K ${l} ${u}${this.labels[a]}${K.reset}${d}
|
|
4
4
|
`}this.lineCount>0&&(i+=`\x1B[${this.lineCount}A`),process.stderr.write(i),this.frame++}start(){this._stopped=!1,this.startTime=Date.now();let e="\x1B[?25l";for(let n=0;n<this.lineCount;n++)e+=`
|
|
5
5
|
`;this.lineCount>0&&(e+=`\x1B[${this.lineCount}A`),process.stderr.write(e),this._render(),this.interval=setInterval(()=>this._render(),100)}update(e,n){e>=0&&e<this.statuses.length&&(this.statuses[e]=n)}stop(e={}){if(this._stopped=!0,this.interval&&(clearInterval(this.interval),this.interval=null),!e.silent)this._renderFinal();else{let n="";for(let o=0;o<this.lineCount;o++)n+=`\x1B[2K
|
|
@@ -456,7 +456,7 @@ ${a}`),l&&l.length>0){let u=l.map(d=>` ${d.file}`).join(`
|
|
|
456
456
|
`);s.push(`MERGE CONFLICTS (resolve before editing these files):
|
|
457
457
|
${u}`)}try{let u=Tw();u&&s.push(u)}catch{}return s.join(`
|
|
458
458
|
|
|
459
|
-
`)}async function Lw(t){let e=et.join(t,"package.json"),n="";if(await sn(()=>Rt.access(e).then(()=>!0).catch(()=>!1)))try{let i=await Rt.readFile(e,"utf-8"),a=JSON.parse(i);n=`${a.name||"?"} v${a.version||"?"}`}catch{}let[s,r]=await Promise.all([sn(async()=>{let{stdout:i}=await er("git branch --show-current",{cwd:t,timeout:5e3});return i.trim()}),Ad()]);if(r&&r.length>0){console.log(`${Yn.red} \u26A0 ${r.length} unresolved merge conflict(s):${Yn.reset}`);for(let i of r)console.log(`${Yn.red} ${i.file}${Yn.reset}`);console.log(`${Yn.yellow} \u2192 Resolve conflicts before starting tasks${Yn.reset}`)}console.log()}Od.exports={gatherProjectContext:Iw,printContext:Lw,generateFileTree:Ow,_clearContextCache:()=>{ra.clear(),zn.clear(),tr=null}}});var At=G((rv,Pd)=>{var Ct=require("fs"),sr=require("path"),{atomicWrite:Dw}=Zt();function Ps(){return sr.join(process.cwd(),".nex","sessions")}function ia(){let t=Ps();Ct.existsSync(t)||Ct.mkdirSync(t,{recursive:!0})}function aa(t){let e=t.replace(/[^a-zA-Z0-9_-]/g,"_").substring(0,100);return sr.join(Ps(),`${e}.json`)}function ca(t,e,n={}){ia();let o=aa(t),s={name:t,createdAt:n.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString(),messageCount:e.length,model:n.model||null,provider:n.provider||null,messages:e};return Dw(o,JSON.stringify(s,null,2)),{path:o,name:t}}function Nd(t){let e=aa(t);if(!Ct.existsSync(e))return null;try{return JSON.parse(Ct.readFileSync(e,"utf-8"))}catch{return null}}function Md(){ia();let t=Ps(),e=Ct.readdirSync(t).filter(o=>o.endsWith(".json")),n=[];for(let o of e)try{let s=JSON.parse(Ct.readFileSync(sr.join(t,o),"utf-8"));n.push({name:s.name||o.replace(".json",""),createdAt:s.createdAt,updatedAt:s.updatedAt,messageCount:s.messageCount||0,model:s.model,provider:s.provider,score:s.score!=null?s.score:null,scoreGrade:s.scoreGrade||null})}catch{}return n.sort((o,s)=>(s.updatedAt||"").localeCompare(o.updatedAt||""))}function jw(t){let e=aa(t);return Ct.existsSync(e)?(Ct.unlinkSync(e),!0):!1}function qw(){let t=Md();return t.length===0?null:Nd(t[0].name)}var _n=null,Gt=null,Ms=null;function Fw(t,e={}){t.length!==0&&(_n&&clearTimeout(_n),Gt=t,Ms=e||{},_n=setTimeout(()=>{Gt&&Gt.length>0&&ca("_autosave",Gt,Ms),_n=null,Gt=null,Ms=null},5e3))}function Uw(){_n&&(clearTimeout(_n),_n=null),Gt&&Gt.length>0&&(ca("_autosave",Gt,Ms),Gt=null,Ms=null)}function Ww(){ia();let t=Ps(),e=Ct.readdirSync(t).filter(r=>r.endsWith(".json")),n=new Date,o=new Date(n.getTime()-720*60*60*1e3),s=0;for(let r of e){let i=sr.join(t,r);try{let a=Ct.statSync(i);new Date(a.mtime)<o&&(Ct.unlinkSync(i),s++)}catch{}}return s}Pd.exports={saveSession:ca,loadSession:Nd,listSessions:Md,deleteSession:jw,getLastSession:qw,autoSave:Fw,flushAutoSave:Uw,clearOldSessions:Ww,_getSessionsDir:Ps}});var or=G((iv,Wd)=>{"use strict";var Is=require("fs"),Id=require("path");function Ld(t){let e=[];return t.forEach((n,o)=>{n.role==="assistant"&&(Array.isArray(n.content)&&n.content.forEach(s=>{s&&s.type==="tool_use"&&e.push({name:s.name||"",input:s.input||{},index:o})}),Array.isArray(n.tool_calls)&&n.tool_calls.forEach(s=>{let r=s.function?.name||s.name||"",i={};try{i=typeof s.function?.arguments=="string"?JSON.parse(s.function.arguments):s.function?.arguments||s.input||{}}catch{}e.push({name:r,input:i,index:o})}))}),e}function Dd(t){let e=[];return t.forEach((n,o)=>{if(n.role==="user"&&Array.isArray(n.content)&&n.content.forEach(s=>{if(s&&s.type==="tool_result"){let r=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.map(i=>typeof i=="string"?i:i.text||"").join(""):JSON.stringify(s.content||"");e.push({content:r,index:o})}}),n.role==="tool"){let s=typeof n.content=="string"?n.content:JSON.stringify(n.content||"");e.push({content:s,index:o})}}),e}function jd(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.role==="assistant"){if(typeof n.content=="string")return n.content.trim();if(Array.isArray(n.content)){let o=n.content.filter(s=>s&&(s.type==="text"||typeof s=="string")).map(s=>typeof s=="string"?s:s.text||"").join("").trim();if(o)return o}}}return""}function qd(t,e){let n=[];for(let o=t.length-1;o>=0&&n.length<e;o--){let s=t[o];if(s.role!=="assistant")continue;let r="";typeof s.content=="string"?r=s.content.trim():Array.isArray(s.content)&&(r=s.content.filter(i=>i&&(i.type==="text"||typeof i=="string")).map(i=>typeof i=="string"?i:i.text||"").join("").trim()),r&&n.push(r)}return n}function Fd(t){let e=new Map;for(let n of t){let o;try{o=JSON.stringify(n.input)}catch{o=String(n.input)}let s=`${n.name}|${o}`;e.set(s,(e.get(s)||0)+1)}return e}function Ud(t){if(!Array.isArray(t)||t.length===0)return{score:0,issues:["Empty or invalid session \u2014 no messages to analyse"],summary:"No messages found"};let e=10,n=[],o=Ld(t),s=Dd(t),r=o.length;t.some(E=>E.role==="user"&&typeof E.content=="string"&&E.content.startsWith("[SYSTEM WARNING]")&&(E.content.includes("edited")||E.content.includes("bash command")||E.content.includes("grep pattern")||E.content.includes("re-read")||E.content.includes("already in your context")))&&(e-=2,n.push("Loop-warning was fired during session (repeated file edits, bash commands, or re-reads)"));let a=o.find(E=>{let M=E.input?.command||E.input?.cmd||"";return/\bsed\s+-n\b/.test(M)});if(a){let E=(a.input?.command||a.input?.cmd||"").slice(0,80);e-=1.5,n.push(`sed -n anti-pattern used: ${E}`)}o.find(E=>{if(E.name!=="grep"&&E.name!=="bash"&&E.name!=="ssh_exec")return!1;let M=E.input?.command||E.input?.cmd||"",W=E.input?.pattern||"",H=`${M} ${W}`;return/(?:-[CAB]|--context|--after|--before)\s*[=\s]?([2-9][1-9]|\d{3,})/.test(H)||/grep.*-[CAB]\s*([2-9][1-9]|\d{3,})/.test(H)})&&(e-=1,n.push("grep used with >20 context lines (context flood risk)"));let u=t.some(E=>E.role==="assistant"),d=jd(t),m=qd(t,3).some(E=>E.length>100&&!/^[^.!]{0,40}\?$/.test(E));if(u&&!m&&(d.length<50||/^[^.!]{0,40}\?$/.test(d))){e-=2;let E=d.length>0?`"${d.slice(0,60)}..."`:"(no assistant text found)";n.push(`Session ends without diagnosis \u2014 last response too short or is only a question: ${E}`)}r>40?(e-=1.5,n.push(`Excessive tool calls: ${r} (>40 threshold)`)):r>25&&(e-=.5,n.push(`High tool call count: ${r} (>25 threshold)`)),t.some(E=>{let M=typeof E.content=="string"?E.content:Array.isArray(E.content)?E.content.map(W=>typeof W=="string"?W:W.text||"").join(""):"";return/\[auto-compressed|context compacted|force-compressed/.test(M)})&&(e-=.5,n.push("Auto-compress triggered (context flood indicator)"));let g=Fd(o),y=0,w="";for(let[E,M]of g)M>y&&(y=M,w=E);if(y>=3){let[E]=w.split("|");e-=1,n.push(`Same tool call repeated ${y}\xD7 (tool: ${E})`)}let k=!1;for(let E of s)if(E.content&&E.content.includes('"valid":true')&&o.filter(W=>W.index>E.index).length>0){k=!0;break}k&&(e-=1.5,n.push('Stop-trigger ignored: tool result contained "valid":true but session continued with more tool calls'));let R=o.filter(E=>E.name==="ssh_exec");if(R.length>=8){let E=0,M=1;for(let W=1;W<R.length;W++)R[W].index<=R[W-1].index+2?M++:(E=Math.max(E,M),M=1);E=Math.max(E,M),E>=8&&(e-=.5,n.push(`SSH reconnect storm: ${E} consecutive SSH calls`))}let x=new Map;for(let E of o)if(E.name==="read_file"&&E.input?.path){let M=E.input.path;x.has(M)||x.set(M,{count:0,ranges:[]});let W=x.get(M);if(W.count++,E.input.line_start!=null){let H=E.input.line_start||1,ne=E.input.line_end||H+350;W.ranges.push([H,ne])}}function _(E,M,W){for(let[H,ne]of W){let I=Math.max(E,H),F=Math.min(M,ne);if(F>I){let se=F-I,z=M-E||1;if(se/z>=.7)return!0}}return!1}let b=0,A="";for(let[E,M]of x){if(M.count<3)continue;if(M.ranges.length===M.count){let H=!1,ne=[];for(let[I,F]of M.ranges){if(ne.length>0&&_(I,F,ne)){H=!0;break}ne.push([I,F])}if(!H)continue}M.count>b&&(b=M.count,A=E)}if(b>=3){e-=1;let E=A.split("/").slice(-2).join("/");n.push(`read_file loop: "${E}" read ${b}\xD7 (file already in context)`)}let O=0,P="";for(let[E,M]of x){if(M.ranges.length<4)continue;let W=[],H=!1;for(let[ne,I]of M.ranges){if(W.length>0&&_(ne,I,W)){H=!0;break}W.push([ne,I])}!H&&M.ranges.length>O&&(O=M.ranges.length,P=E)}if(O>=4){e-=.5;let E=P.split("/").slice(-2).join("/");n.push(`File-scroll pattern: "${E}" read in ${O} sequential sections \u2014 use grep instead`)}let D=new Map;for(let E of o)if(E.name==="grep"&&E.input?.path&&E.input?.pattern){let M=E.input.path;D.has(M)||D.set(M,new Set),D.get(M).add(E.input.pattern)}let Ce=0,xe="";for(let[E,M]of D)M.size>Ce&&(Ce=M.size,xe=E);if(Ce>=3){e-=.75;let E=xe.split("/").slice(-2).join("/");n.push(`grep flood on single file: "${E}" searched ${Ce}\xD7 with different patterns (file already in context)`)}{let E=new Set,M=new Set,W=/^(test_|demo_|temp_|tmp_|scratch_)/;for(let ne of o){if(ne.name==="write_file"&&ne.input?.path){let I=ne.input.path.split("/").pop(),F=ne.input.path.includes("/tests/");W.test(I)&&!F&&E.add(ne.input.path)}if((ne.name==="bash"||ne.name==="ssh_exec")&&ne.input?.command){let I=ne.input.command.match(/\brm\s+(?:-\w+\s+)?(\S+)/g);if(I)for(let F of I){let se=F.split(/\s+/),z=se[se.length-1];for(let Q of E)(Q.endsWith(z)||z.endsWith(Q.split("/").pop()))&&M.add(Q)}}}let H=M.size;if(H>=1){let ne=Math.min(H*.25,.5);e-=ne;let I=[...M].map(F=>F.split("/").pop()).join(", ");n.push(`Temp file write-then-delete: ${I} \u2014 write inline logic or use tests/ instead`)}}let de=s.filter(E=>E.content.startsWith("EXIT")).length;de>=10?(e-=1,n.push(`Bash exit-error storm: ${de} tool results started with EXIT (repeated failing commands)`)):de>=5&&(e-=.5,n.push(`Repeated bash errors: ${de} tool results with non-zero exit code`));for(let E of t){if(E.role!=="assistant")continue;let M="";if(typeof E.content=="string"?M=E.content:Array.isArray(E.content)&&(M=E.content.filter(z=>z&&(z.type==="text"||typeof z=="string")).map(z=>typeof z=="string"?z:z.text||"").join("")),M.length<=5e3)continue;let W=M.split(/(?<=\. )/).filter(z=>z.trim().length>0);if(W.length<6)continue;let H=new Map;for(let z=0;z<=W.length-3;z++){let Q=W.slice(z,z+3).join("").trim();Q.length>30&&H.set(Q,(H.get(Q)||0)+1)}let ne=0,I="";for(let[z,Q]of H)Q>ne&&(ne=Q,I=z);if(ne<3)continue;let se=I.length*ne/M.length;if(se>=.4||ne>=10){e-=1.5,n.push(`llm output loop: assistant message repeated content detected (${ne}\xD7 same paragraph, ${Math.round(se*100)}% repeated)`);break}}{let E=new Set(["read_file","list_directory","search_files","glob","grep"]),M=t.some(H=>Array.isArray(H.tool_calls)?H.tool_calls.some(ne=>E.has(ne.function?.name)):Array.isArray(H.content)?H.content.some(ne=>ne.type==="tool_use"&&E.has(ne.name)):!1);t.some(H=>H.role==="assistant"&&typeof H.content=="string"&&(H.content.includes("## Steps")||H.content.includes("/plan approve")))&&!M&&(e-=2,n.push("plan written without reading any files \u2014 LLM invented data structures from training knowledge (hallucination risk)"))}let fe=s.filter(E=>E.content.startsWith("BLOCKED:"));if(fe.length>0){let E=Math.min(fe.length*.5,1.5);e-=E,n.push(`${fe.length} tool call${fe.length===1?"":"s"} blocked (agent attempted denied actions)`)}let ae=t.filter(E=>{let M=typeof E.content=="string"?E.content:"";return/\[SYSTEM WARNING\] Context wiped \d+×/.test(M)}).length;if(ae>0){let E=Math.min(ae*1,2);e-=E,n.push(`Super-nuclear context wipe fired ${ae}\xD7 (context collapse \u2014 task too large or read loops)`)}{let E=!1,M=!1,W=!1;for(let ne of o){if(ne.name!=="bash")continue;let I=(ne.input?.command||ne.input?.cmd||"").trim();!(/cat\s*>/.test(I)||/<</.test(I))&&/\bcat\s+\S/.test(I)&&(E=!0),/^\s*ls(\s|$)/.test(I)&&!/npm|yarn|pnpm|make|git\b/.test(I)&&(M=!0),/\bfind\s+\S/.test(I)&&!/git\b|npm\b|-exec\b/.test(I)&&(W=!0)}let H=[E,M,W].filter(Boolean).length;if(H>0){let ne=Math.min(H*.25,.75);e-=ne;let I=[];E&&I.push("cat (use read_file)"),M&&I.push("ls (use list_directory)"),W&&I.push("find (use glob)"),n.push(`bash used instead of dedicated tool: ${I.join(", ")}`)}}e=Math.max(0,Math.min(10,e)),e=Math.round(e*10)/10;let be=e>=9?"A":e>=8?"B":e>=7?"C":e>=6?"D":"F",te=n.length===0?`Clean session \u2014 no quality issues detected (${r} tool calls)`:`${n.length} issue${n.length===1?"":"s"} found \u2014 ${r} tool calls`;return{score:e,grade:be,issues:n,summary:te}}function Bw(t){try{let{loadSession:e}=At(),n=e(t);return n?Ud(n.messages||[]):null}catch{return null}}function Hw(t,e=null){let{score:n,grade:o,issues:s,summary:r}=t,i=e?.dim||"",a=e?.reset||"",l=e?.green||"",u=e?.yellow||"",d=e?.red||"",f=e?.cyan||"",m=e?.bold||"",h=n>=8?l:n>=6?u:d,p=`
|
|
459
|
+
`)}async function Lw(t){let e=et.join(t,"package.json"),n="";if(await sn(()=>Rt.access(e).then(()=>!0).catch(()=>!1)))try{let i=await Rt.readFile(e,"utf-8"),a=JSON.parse(i);n=`${a.name||"?"} v${a.version||"?"}`}catch{}let[s,r]=await Promise.all([sn(async()=>{let{stdout:i}=await er("git branch --show-current",{cwd:t,timeout:5e3});return i.trim()}),Ad()]);if(r&&r.length>0){console.log(`${Yn.red} \u26A0 ${r.length} unresolved merge conflict(s):${Yn.reset}`);for(let i of r)console.log(`${Yn.red} ${i.file}${Yn.reset}`);console.log(`${Yn.yellow} \u2192 Resolve conflicts before starting tasks${Yn.reset}`)}console.log()}Od.exports={gatherProjectContext:Iw,printContext:Lw,generateFileTree:Ow,_clearContextCache:()=>{ra.clear(),zn.clear(),tr=null}}});var At=G((rv,Pd)=>{var Ct=require("fs"),sr=require("path"),{atomicWrite:Dw}=Zt();function Ps(){return sr.join(process.cwd(),".nex","sessions")}function ia(){let t=Ps();Ct.existsSync(t)||Ct.mkdirSync(t,{recursive:!0})}function aa(t){let e=t.replace(/[^a-zA-Z0-9_-]/g,"_").substring(0,100);return sr.join(Ps(),`${e}.json`)}function ca(t,e,n={}){ia();let o=aa(t),s={name:t,createdAt:n.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString(),messageCount:e.length,model:n.model||null,provider:n.provider||null,messages:e};return Dw(o,JSON.stringify(s,null,2)),{path:o,name:t}}function Nd(t){let e=aa(t);if(!Ct.existsSync(e))return null;try{return JSON.parse(Ct.readFileSync(e,"utf-8"))}catch{return null}}function Md(){ia();let t=Ps(),e=Ct.readdirSync(t).filter(o=>o.endsWith(".json")),n=[];for(let o of e)try{let s=JSON.parse(Ct.readFileSync(sr.join(t,o),"utf-8"));n.push({name:s.name||o.replace(".json",""),createdAt:s.createdAt,updatedAt:s.updatedAt,messageCount:s.messageCount||0,model:s.model,provider:s.provider,score:s.score!=null?s.score:null,scoreGrade:s.scoreGrade||null})}catch{}return n.sort((o,s)=>(s.updatedAt||"").localeCompare(o.updatedAt||""))}function jw(t){let e=aa(t);return Ct.existsSync(e)?(Ct.unlinkSync(e),!0):!1}function qw(){let t=Md();return t.length===0?null:Nd(t[0].name)}var _n=null,Gt=null,Ms=null;function Fw(t,e={}){t.length!==0&&(_n&&clearTimeout(_n),Gt=t,Ms=e||{},_n=setTimeout(()=>{Gt&&Gt.length>0&&ca("_autosave",Gt,Ms),_n=null,Gt=null,Ms=null},5e3))}function Uw(){_n&&(clearTimeout(_n),_n=null),Gt&&Gt.length>0&&(ca("_autosave",Gt,Ms),Gt=null,Ms=null)}function Ww(){ia();let t=Ps(),e=Ct.readdirSync(t).filter(r=>r.endsWith(".json")),n=new Date,o=new Date(n.getTime()-720*60*60*1e3),s=0;for(let r of e){let i=sr.join(t,r);try{let a=Ct.statSync(i);new Date(a.mtime)<o&&(Ct.unlinkSync(i),s++)}catch{}}return s}Pd.exports={saveSession:ca,loadSession:Nd,listSessions:Md,deleteSession:jw,getLastSession:qw,autoSave:Fw,flushAutoSave:Uw,clearOldSessions:Ww,_getSessionsDir:Ps}});var or=G((iv,Wd)=>{"use strict";var Is=require("fs"),Id=require("path");function Ld(t){let e=[];return t.forEach((n,o)=>{n.role==="assistant"&&(Array.isArray(n.content)&&n.content.forEach(s=>{s&&s.type==="tool_use"&&e.push({name:s.name||"",input:s.input||{},index:o})}),Array.isArray(n.tool_calls)&&n.tool_calls.forEach(s=>{let r=s.function?.name||s.name||"",i={};try{i=typeof s.function?.arguments=="string"?JSON.parse(s.function.arguments):s.function?.arguments||s.input||{}}catch{}e.push({name:r,input:i,index:o})}))}),e}function Dd(t){let e=[];return t.forEach((n,o)=>{if(n.role==="user"&&Array.isArray(n.content)&&n.content.forEach(s=>{if(s&&s.type==="tool_result"){let r=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.map(i=>typeof i=="string"?i:i.text||"").join(""):JSON.stringify(s.content||"");e.push({content:r,index:o})}}),n.role==="tool"){let s=typeof n.content=="string"?n.content:JSON.stringify(n.content||"");e.push({content:s,index:o})}}),e}function jd(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.role==="assistant"){if(typeof n.content=="string")return n.content.trim();if(Array.isArray(n.content)){let o=n.content.filter(s=>s&&(s.type==="text"||typeof s=="string")).map(s=>typeof s=="string"?s:s.text||"").join("").trim();if(o)return o}}}return""}function qd(t,e){let n=[];for(let o=t.length-1;o>=0&&n.length<e;o--){let s=t[o];if(s.role!=="assistant")continue;let r="";typeof s.content=="string"?r=s.content.trim():Array.isArray(s.content)&&(r=s.content.filter(i=>i&&(i.type==="text"||typeof i=="string")).map(i=>typeof i=="string"?i:i.text||"").join("").trim()),r&&n.push(r)}return n}function Fd(t){let e=new Map;for(let n of t){let o;try{o=JSON.stringify(n.input)}catch{o=String(n.input)}let s=`${n.name}|${o}`;e.set(s,(e.get(s)||0)+1)}return e}function Ud(t){if(!Array.isArray(t)||t.length===0)return{score:0,issues:["Empty or invalid session \u2014 no messages to analyse"],summary:"No messages found"};let e=10,n=[],o=Ld(t),s=Dd(t),r=o.length;t.some(E=>E.role==="user"&&typeof E.content=="string"&&E.content.startsWith("[SYSTEM WARNING]")&&(E.content.includes("edited")||E.content.includes("bash command")||E.content.includes("grep pattern")||E.content.includes("re-read")||E.content.includes("already in your context")))&&(e-=2,n.push("Loop-warning was fired during session (repeated file edits, bash commands, or re-reads)"));let a=o.find(E=>{let M=E.input?.command||E.input?.cmd||"";return/\bsed\s+-n\b/.test(M)});if(a){let E=(a.input?.command||a.input?.cmd||"").slice(0,80);e-=1.5,n.push(`sed -n anti-pattern used: ${E}`)}o.find(E=>{if(E.name!=="grep"&&E.name!=="bash"&&E.name!=="ssh_exec")return!1;let M=E.input?.command||E.input?.cmd||"",W=E.input?.pattern||"",H=`${M} ${W}`;return/(?:-[CAB]|--context|--after|--before)\s*[=\s]?([2-9][1-9]|\d{3,})/.test(H)||/grep.*-[CAB]\s*([2-9][1-9]|\d{3,})/.test(H)})&&(e-=1,n.push("grep used with >20 context lines (context flood risk)"));let u=t.some(E=>E.role==="assistant"),d=jd(t),m=qd(t,3).some(E=>E.length>100&&!/^[^.!]{0,40}\?$/.test(E));if(u&&!m&&(d.length<80||/^[^.!]{0,40}\?$/.test(d))){e-=2;let E=d.length>0?`"${d.slice(0,60)}..."`:"(no assistant text found)";n.push(`Session ends without diagnosis \u2014 last response too short or is only a question: ${E}`)}r>40?(e-=1.5,n.push(`Excessive tool calls: ${r} (>40 threshold)`)):r>25&&(e-=.5,n.push(`High tool call count: ${r} (>25 threshold)`)),t.some(E=>{let M=typeof E.content=="string"?E.content:Array.isArray(E.content)?E.content.map(W=>typeof W=="string"?W:W.text||"").join(""):"";return/\[auto-compressed|context compacted|force-compressed/.test(M)})&&(e-=.5,n.push("Auto-compress triggered (context flood indicator)"));let g=Fd(o),y=0,w="";for(let[E,M]of g)M>y&&(y=M,w=E);if(y>=3){let[E]=w.split("|");e-=1,n.push(`Same tool call repeated ${y}\xD7 (tool: ${E})`)}let k=!1;for(let E of s)if(E.content&&E.content.includes('"valid":true')&&o.filter(W=>W.index>E.index).length>0){k=!0;break}k&&(e-=1.5,n.push('Stop-trigger ignored: tool result contained "valid":true but session continued with more tool calls'));let R=o.filter(E=>E.name==="ssh_exec");if(R.length>=8){let E=0,M=1;for(let W=1;W<R.length;W++)R[W].index<=R[W-1].index+2?M++:(E=Math.max(E,M),M=1);E=Math.max(E,M),E>=8&&(e-=.5,n.push(`SSH reconnect storm: ${E} consecutive SSH calls`))}let x=new Map;for(let E of o)if(E.name==="read_file"&&E.input?.path){let M=E.input.path;x.has(M)||x.set(M,{count:0,ranges:[]});let W=x.get(M);if(W.count++,E.input.line_start!=null){let H=E.input.line_start||1,ne=E.input.line_end||H+350;W.ranges.push([H,ne])}}function _(E,M,W){for(let[H,ne]of W){let I=Math.max(E,H),F=Math.min(M,ne);if(F>I){let se=F-I,z=M-E||1;if(se/z>=.7)return!0}}return!1}let b=0,A="";for(let[E,M]of x){if(M.count<3)continue;if(M.ranges.length===M.count){let H=!1,ne=[];for(let[I,F]of M.ranges){if(ne.length>0&&_(I,F,ne)){H=!0;break}ne.push([I,F])}if(!H)continue}M.count>b&&(b=M.count,A=E)}if(b>=3){e-=1;let E=A.split("/").slice(-2).join("/");n.push(`read_file loop: "${E}" read ${b}\xD7 (file already in context)`)}let O=0,P="";for(let[E,M]of x){if(M.ranges.length<4)continue;let W=[],H=!1;for(let[ne,I]of M.ranges){if(W.length>0&&_(ne,I,W)){H=!0;break}W.push([ne,I])}!H&&M.ranges.length>O&&(O=M.ranges.length,P=E)}if(O>=4){e-=.5;let E=P.split("/").slice(-2).join("/");n.push(`File-scroll pattern: "${E}" read in ${O} sequential sections \u2014 use grep instead`)}let D=new Map;for(let E of o)if(E.name==="grep"&&E.input?.path&&E.input?.pattern){let M=E.input.path;D.has(M)||D.set(M,new Set),D.get(M).add(E.input.pattern)}let Ce=0,xe="";for(let[E,M]of D)M.size>Ce&&(Ce=M.size,xe=E);if(Ce>=3){e-=.75;let E=xe.split("/").slice(-2).join("/");n.push(`grep flood on single file: "${E}" searched ${Ce}\xD7 with different patterns (file already in context)`)}{let E=new Set,M=new Set,W=/^(test_|demo_|temp_|tmp_|scratch_)/;for(let ne of o){if(ne.name==="write_file"&&ne.input?.path){let I=ne.input.path.split("/").pop(),F=ne.input.path.includes("/tests/");W.test(I)&&!F&&E.add(ne.input.path)}if((ne.name==="bash"||ne.name==="ssh_exec")&&ne.input?.command){let I=ne.input.command.match(/\brm\s+(?:-\w+\s+)?(\S+)/g);if(I)for(let F of I){let se=F.split(/\s+/),z=se[se.length-1];for(let Q of E)(Q.endsWith(z)||z.endsWith(Q.split("/").pop()))&&M.add(Q)}}}let H=M.size;if(H>=1){let ne=Math.min(H*.25,.5);e-=ne;let I=[...M].map(F=>F.split("/").pop()).join(", ");n.push(`Temp file write-then-delete: ${I} \u2014 write inline logic or use tests/ instead`)}}let de=s.filter(E=>E.content.startsWith("EXIT")).length;de>=10?(e-=1,n.push(`Bash exit-error storm: ${de} tool results started with EXIT (repeated failing commands)`)):de>=5&&(e-=.5,n.push(`Repeated bash errors: ${de} tool results with non-zero exit code`));for(let E of t){if(E.role!=="assistant")continue;let M="";if(typeof E.content=="string"?M=E.content:Array.isArray(E.content)&&(M=E.content.filter(z=>z&&(z.type==="text"||typeof z=="string")).map(z=>typeof z=="string"?z:z.text||"").join("")),M.length<=5e3)continue;let W=M.split(/(?<=\. )/).filter(z=>z.trim().length>0);if(W.length<6)continue;let H=new Map;for(let z=0;z<=W.length-3;z++){let Q=W.slice(z,z+3).join("").trim();Q.length>30&&H.set(Q,(H.get(Q)||0)+1)}let ne=0,I="";for(let[z,Q]of H)Q>ne&&(ne=Q,I=z);if(ne<3)continue;let se=I.length*ne/M.length;if(se>=.4||ne>=10){e-=1.5,n.push(`llm output loop: assistant message repeated content detected (${ne}\xD7 same paragraph, ${Math.round(se*100)}% repeated)`);break}}{let E=new Set(["read_file","list_directory","search_files","glob","grep"]),M=t.some(H=>Array.isArray(H.tool_calls)?H.tool_calls.some(ne=>E.has(ne.function?.name)):Array.isArray(H.content)?H.content.some(ne=>ne.type==="tool_use"&&E.has(ne.name)):!1);t.some(H=>H.role==="assistant"&&typeof H.content=="string"&&(H.content.includes("## Steps")||H.content.includes("/plan approve")))&&!M&&(e-=2,n.push("plan written without reading any files \u2014 LLM invented data structures from training knowledge (hallucination risk)"))}let fe=s.filter(E=>E.content.startsWith("BLOCKED:"));if(fe.length>0){let E=Math.min(fe.length*.5,1.5);e-=E,n.push(`${fe.length} tool call${fe.length===1?"":"s"} blocked (agent attempted denied actions)`)}let ae=t.filter(E=>{let M=typeof E.content=="string"?E.content:"";return/\[SYSTEM WARNING\] Context wiped \d+×/.test(M)}).length;if(ae>0){let E=Math.min(ae*1,2);e-=E,n.push(`Super-nuclear context wipe fired ${ae}\xD7 (context collapse \u2014 task too large or read loops)`)}{let E=!1,M=!1,W=!1;for(let ne of o){if(ne.name!=="bash")continue;let I=(ne.input?.command||ne.input?.cmd||"").trim();!(/cat\s*>/.test(I)||/<</.test(I))&&/\bcat\s+\S/.test(I)&&(E=!0),/^\s*ls(\s|$)/.test(I)&&!/npm|yarn|pnpm|make|git\b/.test(I)&&(M=!0),/\bfind\s+\S/.test(I)&&!/git\b|npm\b|-exec\b/.test(I)&&(W=!0)}let H=[E,M,W].filter(Boolean).length;if(H>0){let ne=Math.min(H*.25,.75);e-=ne;let I=[];E&&I.push("cat (use read_file)"),M&&I.push("ls (use list_directory)"),W&&I.push("find (use glob)"),n.push(`bash used instead of dedicated tool: ${I.join(", ")}`)}}e=Math.max(0,Math.min(10,e)),e=Math.round(e*10)/10;let be=e>=9?"A":e>=8?"B":e>=7?"C":e>=6?"D":"F",te=n.length===0?`Clean session \u2014 no quality issues detected (${r} tool calls)`:`${n.length} issue${n.length===1?"":"s"} found \u2014 ${r} tool calls`;return{score:e,grade:be,issues:n,summary:te}}function Bw(t){try{let{loadSession:e}=At(),n=e(t);return n?Ud(n.messages||[]):null}catch{return null}}function Hw(t,e=null){let{score:n,grade:o,issues:s,summary:r}=t,i=e?.dim||"",a=e?.reset||"",l=e?.green||"",u=e?.yellow||"",d=e?.red||"",f=e?.cyan||"",m=e?.bold||"",h=n>=8?l:n>=6?u:d,p=`
|
|
460
460
|
${i} Session score: ${a}${m}${h}${n}/10 (${o})${a}`;if(r&&(p+=` ${i}${r}${a}`),s.length>0)for(let g of s)p+=`
|
|
461
461
|
${u}\u26A0${a} ${i}${g}${a}`;return p}function Gw(t,e={}){try{let n=Id.join(process.cwd(),".nex");Is.existsSync(n)||Is.mkdirSync(n,{recursive:!0});let o=Id.join(n,"benchmark-history.json"),s=[];if(Is.existsSync(o))try{s=JSON.parse(Is.readFileSync(o,"utf-8"))}catch{s=[]}Array.isArray(s)||(s=[]);let r=t>=9?"A":t>=8?"B":t>=7?"C":t>=6?"D":"F",i={date:new Date().toISOString(),version:e.version||null,model:e.model||null,score:t,grade:r,sessionName:e.sessionName||null,issues:Array.isArray(e.issues)?e.issues:[]};s.push(i),s.length>100&&(s=s.slice(s.length-100)),Is.writeFileSync(o,JSON.stringify(s,null,2))}catch{}}Wd.exports={scoreMessages:Ud,scoreSession:Bw,formatScore:Hw,appendScoreHistory:Gw,_extractToolCalls:Ld,_extractToolResults:Dd,_getLastAssistantText:jd,_getLastNAssistantTexts:qd,_countDuplicateToolCalls:Fd}});var rn=G((av,Xd)=>{var on=require("fs"),rr=require("path"),Kw=require("os"),{atomicWrite:Yw,withFileLockSync:Bd}=Zt();function la(){return rr.join(process.cwd(),".nex","memory")}function Ls(){return rr.join(la(),"memory.json")}function zw(){return rr.join(process.cwd(),"NEX.md")}function Hd(){return rr.join(Kw.homedir(),".nex","NEX.md")}function ua(){let t=la();on.existsSync(t)||on.mkdirSync(t,{recursive:!0})}function ir(){let t=Ls();if(!on.existsSync(t))return{};try{return JSON.parse(on.readFileSync(t,"utf-8"))}catch{return{}}}function Gd(t){ua(),Yw(Ls(),JSON.stringify(t,null,2))}function Xw(t,e){ua(),Bd(Ls(),()=>{let n=ir();n[t]={value:e,updatedAt:new Date().toISOString()},Gd(n)})}function Jw(t){let e=ir();return e[t]?e[t].value:null}function Vw(t){return ua(),Bd(Ls(),()=>{let e=ir();return t in e?(delete e[t],Gd(e),!0):!1})}function Kd(){let t=ir();return Object.entries(t).map(([e,n])=>({key:e,value:n.value,updatedAt:n.updatedAt}))}function Yd(){let t=Hd();if(!on.existsSync(t))return"";try{return on.readFileSync(t,"utf-8").trim()}catch{return""}}function zd(){let t=zw();if(!on.existsSync(t))return"";try{return on.readFileSync(t,"utf-8").trim()}catch{return""}}function Qw(){let t=[],e=Yd();e&&t.push(`GLOBAL INSTRUCTIONS (~/.nex/NEX.md):
|
|
462
462
|
${e}`);let n=zd();n&&t.push(`PROJECT INSTRUCTIONS (NEX.md):
|
|
@@ -791,7 +791,7 @@ After frontend_recon returns:
|
|
|
791
791
|
- Don't add docstrings/comments to code you didn't change.
|
|
792
792
|
- Don't create helpers or abstractions for one-time operations.
|
|
793
793
|
- Three similar lines of code is better than a premature abstraction.
|
|
794
|
-
- After completing work,
|
|
794
|
+
- After completing work, write a brief 2-3 sentence summary of what was done \u2014 what changed, why, and any key details. NEVER end with just "Done", "Done.", "Finished", or a single word/phrase. A closing like "Done." after a full explanation is fine only when preceded by a substantive response of at least a few sentences.
|
|
795
795
|
|
|
796
796
|
# Diagnose Before Build (Critical)
|
|
797
797
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nex-code",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "The open-source agentic coding CLI. Free with Ollama Cloud — switch to OpenAI, Anthropic or Gemini anytime. Alternative to Claude Code & Gemini CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"nex-code": "./dist/nex-code.js"
|