@burtson-labs/bandit-stealth-cli 1.7.471 → 1.7.472
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/cli.js +1 -1
- package/package.json +2 -3
package/dist/cli.js
CHANGED
|
@@ -2864,7 +2864,7 @@ p{color:#94a6bc;margin:0;line-height:1.6}</style></head><body>
|
|
|
2864
2864
|
`)),a}async function Lge(t,e){let i=Yun(t);if(i===null)return process.stdout.write(V.dim("No graph run to resume. Start one with: ")+V.cyan("BANDIT_GRAPH=1 bandit graph demo")+V.dim(" or ")+V.cyan('bandit graph plan "\u2026" --run')+`
|
|
2865
2865
|
`),null;if(!i.ok)return process.stdout.write(V.red(`Can't resume: ${i.error}
|
|
2866
2866
|
`)),null;let{spec:a,checkpoint:o,nodePrompts:u}=i.file,f=a.nodes.filter(h=>!u[h.id]).map(h=>h.id);if(f.length>0)return process.stdout.write(V.red(`Can't resume: run file has no prompts for: ${f.join(", ")}
|
|
2867
|
-
`)),null;let p=G7e(u,e);return UH({cwd:t,spec:a,executors:p,nodePrompts:u,resumeFrom:o})}var $H,xP,Kse=Cr(()=>{"use strict";$H=Ro(OC(),1);bb();xP=["read_file","list_files","ls","search_code","find_directory","glob","web_fetch","web_search","read_pdf","read_memory","list_artifacts","fetch_image"];n(Q7e,"graphRunPath");n(Kun,"saveRunFile");n(Yun,"loadRunFile");n(G7e,"executorsFromPrompts");n(UH,"runSpecLive");n(Lge,"resumeSpecLive")});var jge=Ut((Xmi,yRr)=>{yRr.exports={name:"@burtson-labs/bandit-stealth-cli",version:"1.7.
|
|
2867
|
+
`)),null;let p=G7e(u,e);return UH({cwd:t,spec:a,executors:p,nodePrompts:u,resumeFrom:o})}var $H,xP,Kse=Cr(()=>{"use strict";$H=Ro(OC(),1);bb();xP=["read_file","list_files","ls","search_code","find_directory","glob","web_fetch","web_search","read_pdf","read_memory","list_artifacts","fetch_image"];n(Q7e,"graphRunPath");n(Kun,"saveRunFile");n(Yun,"loadRunFile");n(G7e,"executorsFromPrompts");n(UH,"runSpecLive");n(Lge,"resumeSpecLive")});var jge=Ut((Xmi,yRr)=>{yRr.exports={name:"@burtson-labs/bandit-stealth-cli",version:"1.7.472",description:"Bandit \u2014 a local-first AI coding agent for your terminal. Same runtime as the Bandit Stealth VS Code / Cursor extension.",keywords:["ai","agent","cli","coding-agent","llm","ollama","local-first","bandit","burtson-labs","terminal","repl","developer-tools"],homepage:"https://burtson.ai",funding:"https://afsp.org/chapter/missouri",bugs:{url:"https://github.com/Burtson-Labs/bandit-stealth/issues",email:"team@burtson.ai"},license:"Apache-2.0",author:{name:"Burtson Labs",email:"team@burtson.ai",url:"https://burtson.ai"},repository:{type:"git",url:"git+https://github.com/Burtson-Labs/bandit-stealth.git",directory:"apps/bandit-cli"},type:"module",bin:{bandit:"./dist/cli.js"},main:"dist/cli.js",files:["dist/cli.js","README.md","LICENSE"],engines:{node:">=20"},publishConfig:{access:"public"},scripts:{test:"vitest run",typecheck:"tsc -p tsconfig.json --noEmit",build:"node build.mjs","build:publish":"node build.mjs --publish",dev:"node build.mjs --watch",start:"node dist/cli.js",smoke:"node build.mjs && node dist/__smoke__/smoke.js",integration:"node build.mjs && node dist/__integration__/ollama.js",eval:"node build.mjs && node dist/__eval__/eval.js",benchmark:"node build.mjs && node dist/__eval__/benchmark.js",brief:"node build.mjs && node dist/__eval__/brief.js",soak:"node build.mjs && node dist/__eval__/soak.js","soak:dry":"node build.mjs && node dist/__eval__/soak.js --dry-run","gen-logo":"node scripts/gen-logo.mjs","preview-banner":"node scripts/preview-banner.mjs",clean:"rm -rf dist",prepack:"node scripts/prepack.mjs",postpack:"node scripts/postpack.mjs",prepublishOnly:"pnpm run clean && pnpm run typecheck && pnpm run build:publish"},dependencies:{"markdown-it":"^14.3.2","pdf-parse":"^2.4.5"},devDependencies:{"@burtson-labs/agent-core":"^1.6.88","@burtson-labs/bandit-skills":"workspace:*","@burtson-labs/host-kit":"^0.4.70","@burtson-labs/stealth-core-runtime":"^1.4.81","@types/markdown-it":"^14.2.0","@types/node":"^20.11.0","@types/pdf-parse":"^1.1.5","@types/pngjs":"^6.0.5","@types/react":"^19.2.2",esbuild:"^0.28.0",ink:"^7.0.4","ink-text-input":"^6.0.0",pngjs:"^7.0.0",react:"^19.2.0",typescript:"^5.4.0",vitest:"^4.0.10"}}});import*as tY from"child_process";import*as pw from"fs";import*as H6 from"path";function bRr(t){let e=process.env.HOME||"";return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}function vRr(){return new Promise(t=>{let e=tY.spawn("npm",["view",J7e,"version"],{shell:!1,stdio:["ignore","pipe","pipe"]}),i="";e.stdout?.on("data",o=>{i+=o.toString()});let a=setTimeout(()=>{e.kill("SIGTERM"),t(null)},8e3);e.on("close",o=>{clearTimeout(a),t(o===0?i.trim():null)}),e.on("error",()=>{clearTimeout(a),t(null)})})}function wRr(t){return(t??"").trim().split(/\s+/).filter(Boolean).some(e=>ARr.has(e.toLowerCase()))}function SRr(t,e){let i=[...t].map(f=>f.role).lastIndexOf("user");if(i===-1)return null;let a=t[i],o=typeof a.content=="string"?a.content:"",u=e&&e.trim()?e.trim():o;return u?{prompt:u,trimmedConversation:t.slice(0,i)}:null}function CRr(t,e){let i=n(y=>y.replace(/[^0-9.]/g,"").split(".").map(b=>parseInt(b,10)||0),"parse"),[a,o,u]=i(t),[f,p,h]=i(e);return a!==f?a<f?-1:1:o!==p?o<p?-1:1:u!==h?u<h?-1:1:0}function ERr(t){return nY.find(e=>e.name===t)}function kRr(){let t=nY.map(e=>` ${V.cyan("/"+e.name.padEnd(14))} ${V.dim(e.description)}`);return[V.bold("All slash commands:"),...t,"",V.dim("Tip: prefix any file with @ to pin it, or run /help permissions for the permission model.")].join(`
|
|
2868
2868
|
`)}function TRr(){return[V.bold("Permission choices"),"",` ${V.accent("allow once")} ${V.dim("Run only this call.")}`,` ${V.accent("allow turn")} ${V.dim("Allow calls like this until the agent finishes the current turn.")}`,` ${V.dim(" ")}${V.dim("Best pick when the model is making a batch of similar edits.")}`,` ${V.accent("allow session")} ${V.dim("Allow them until you exit Bandit.")}`,` ${V.accent("always allow")} ${V.dim("Save the rule to .bandit/settings.json so it survives restarts.")}`,` ${V.accent("deny")} ${V.dim("Block the call. Bandit should not retry it.")}`,` ${V.accent("deny + note")} ${V.dim("Block it and tell Bandit what to do instead.")}`,"",V.dim(" The card shows the exact rule each choice stores, under the highlighted"),V.dim(" option. For shell commands the rule covers a command shape \u2014 approving"),V.dim(" `git status` grants `git status \u2026`, not every command."),"",V.bold("Permission modes")+V.dim(" \u2014 /auto to change"),` ${V.accent("ask")} ${V.dim("Every non-allowlisted call prompts. Default.")}`,` ${V.accent("auto")} ${V.dim("Routine work runs unprompted: reading, editing files in this")}`,` ${V.dim(" ")}${V.dim("project, running builds and tests. Everything else still asks.")}`,` ${V.accent("dangerous")} ${V.dim("Nothing prompts. CI and sandboxes only; not settable from /auto.")}`,"",V.bold("What auto mode never does without asking"),V.dim(" Deleting files \xB7 writing outside the project \xB7 force-push and history"),V.dim(" rewrites \xB7 global installs and publishes \xB7 touching credential files \xB7"),V.dim(" sending data off the machine \xB7 mutating a connected service."),V.dim(" That floor holds even if a saved allow rule would cover the call."),"",V.dim(" /permissions review what ran unattended and which grants are active"),V.dim(" /doctor explain the current setup and next best actions")].join(`
|
|
2869
2869
|
`)}function IRr(){let t=[V.bold("Bandit commands"),V.dim("Use /help all for the full list, /help permissions for approval choices."),""],e=new Set;for(let a of xRr){let o=a.names.map(u=>ERr(u)).filter(u=>!!u);if(o.length!==0){t.push(V.bold(a.title));for(let u of o)e.add(u.name),t.push(` ${V.cyan("/"+u.name.padEnd(14))} ${V.dim(u.description)}`);t.push("")}}let i=nY.filter(a=>!e.has(a.name)&&a.name!=="quit");return i.length>0&&(t.push(V.dim(`Also available: ${i.map(a=>"/"+a.name).join(", ")}`)),t.push("")),t.push(V.dim("Fast path: /doctor \u2192 /connect or /init \u2192 ask for the change \u2192 /review \u2192 /test \u2192 /commit")),t.join(`
|
|
2870
2870
|
`)}function DRr(t){let e=[],i=t.accomplishments,a=Math.max(1,Math.round((Date.now()-(t.firstSeenAt??Date.now()))/864e5)),o=t.ai?.storyline&&t.ai.storyline.length>0?t.ai.storyline:t.localStory;if(o.length>0){let y=Math.min(process.stdout.columns||80,100),b=Math.max(40,y-4);e.push(V.bold("Your story")+V.dim(` \xB7 ${t.ai?.storyline?.length?t.ai.modelLabel:"local synthesis"}`)),e.push("");for(let S of o){let w=S.replace(/\s+/g," ").trim().split(" "),k="";for(let D of w)k.length===0?k=D:k.length+1+D.length<=b?k+=" "+D:(e.push(" "+k),k=D);k&&e.push(" "+k),e.push("")}}if(e.push(V.bold("How you use Bandit")),e.push(""),e.push(` ${V.dim("sessions ")} ${V.accent(String(t.sessions.length))} ${V.dim("over "+a+" day"+(a===1?"":"s"))}`),e.push(` ${V.dim("prompts ")} ${V.accent(String(t.totalPrompts))} ${V.dim("~"+(t.totalApproxTokens>=1e3?(t.totalApproxTokens/1e3).toFixed(1)+"K":t.totalApproxTokens)+" tokens")}`),(t.streak.current>0||t.streak.longest>0)&&e.push(` ${V.dim("streak ")} ${V.accent(t.streak.current+" day"+(t.streak.current===1?"":"s"))} ${V.dim("(longest "+t.streak.longest+")")}`),t.peakDay&&e.push(` ${V.dim("peak day ")} ${V.accent(t.peakDay.date)} ${V.dim(t.peakDay.prompts+" prompts")}`),e.push(""),e.push(V.bold("What got done")),e.push(` ${V.dim("files touched ")} ${V.accent(String(i.filesTouched))} ${V.dim("("+i.filesWritten+" written, "+i.editsApplied+" edited)")}`),i.gitOperations>0&&e.push(` ${V.dim("git ops ")} ${V.accent(String(i.gitOperations))} ${V.dim("("+i.commitsMade+" commits)")}`),i.testsRun>0&&e.push(` ${V.dim("tests run ")} ${V.accent(String(i.testsRun))}`),i.subagentsSpawned>0&&e.push(` ${V.dim("subagents ")} ${V.accent(String(i.subagentsSpawned))}`),i.languages.length>0){let y=i.languages.slice(0,5).map(b=>`${b.label} ${V.dim("("+b.count+")")}`).join(V.dim(", "));e.push(` ${V.dim("languages ")} ${y}`)}if(t.work.themes.length>0){e.push(""),e.push(V.bold("Bigger arcs"));for(let y of t.work.themes.slice(0,4)){let b=[`${y.turns} turn${y.turns===1?"":"s"}`,y.filesTouched>0?`${y.filesTouched} files`:"",y.testsRun>0?`${y.testsRun} tests`:"",y.externalActions>0?`${y.externalActions} external`:"",y.subagentsSpawned>0?`${y.subagentsSpawned} subagents`:""].filter(Boolean).join(", ");e.push(` ${V.cyan(y.title)} ${V.dim(b?"\u2014 "+b:"")}`),y.outcomes.length>0&&e.push(V.dim(` ${y.outcomes[0]}`)),y.sampleTitles.length>0&&e.push(V.dim(` ${y.sampleTitles[0]}`))}}if(t.work.highlights.length>0){e.push(""),e.push(V.bold("Largest work highlights"));for(let y of t.work.highlights.slice(0,5))e.push(` ${V.cyan(y.date)} ${V.accent(y.area)} ${V.dim("\xB7 "+y.category)}`),e.push(V.dim(` ${y.title}`)),e.push(V.dim(` ${y.summary}`)),y.outcome&&e.push(V.dim(` ${y.outcome}`))}if(i.topFiles.length>0){e.push(""),e.push(V.bold("Most-touched files"));for(let y of i.topFiles.slice(0,5))e.push(` ${V.cyan(y.path)} ${V.dim("\xD7"+y.touches)}`)}let u=[...t.toolStats.entries()].map(([y,b])=>({name:y,calls:b.calls,errors:b.errors,rate:b.calls>0?b.errors/b.calls:0})).sort((y,b)=>b.calls-y.calls).slice(0,6);if(u.length>0){e.push(""),e.push(V.bold("Top tools"));for(let y of u){let b=Math.round(y.rate*100),S=y.calls>=5&&b>=25?" "+V.yellow("\u26A0 "+b+"% error rate"):"";e.push(` ${V.cyan(y.name.padEnd(16))} ${V.accent(String(y.calls).padStart(4))} ${V.dim("calls")}${S}`)}}let f=[...t.errorClusters.entries()].flatMap(([y,b])=>b.map(S=>({tool:y,error:S.error,count:S.count}))).sort((y,b)=>b.count-y.count);if(f.length>0){let y=f[0],b=y.error.replace(/\s+/g," ").slice(0,70);e.push(""),e.push(V.bold("Top friction")),e.push(` ${V.cyan(y.tool)} ${V.dim("\xD7"+y.count)} ${V.dim(b+(y.error.length>70?"\u2026":""))}`)}let p=t.sentiment;if(p.satisfied+p.happy+p.excited+p.frustrated+p.unsatisfied>0){let y=[];p.excited>0&&y.push(V.green("excited ")+V.bold(String(p.excited))),p.happy>0&&y.push(V.green("happy ")+V.bold(String(p.happy))),p.satisfied>0&&y.push(V.green("satisfied ")+V.bold(String(p.satisfied)));let b=[];if(p.unsatisfied>0&&b.push(V.yellow("unsatisfied ")+V.bold(String(p.unsatisfied))),p.frustrated>0&&b.push(V.red("frustrated ")+V.bold(String(p.frustrated))),e.push(""),e.push(V.bold("How you felt")),y.length>0&&e.push(` ${y.join(V.dim(" \xB7 "))}`),b.length>0&&e.push(` ${b.join(V.dim(" \xB7 "))}`),p.notable.length>0){e.push(V.dim(" Frustration moments:"));for(let S of p.notable.slice(0,3))e.push(V.dim(' "')+V.dim(S)+V.dim('"'))}}return e.push(""),e.push(V.dim(" Full report (HTML + AI summary): ")+V.cyan("/insights")),e.join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burtson-labs/bandit-stealth-cli",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.472",
|
|
4
4
|
"description": "Bandit — a local-first AI coding agent for your terminal. Same runtime as the Bandit Stealth VS Code / Cursor extension.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -49,7 +49,6 @@
|
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"markdown-it": "^14.3.2",
|
|
52
|
-
"pdf-parse": "^2.4.5"
|
|
53
|
-
"@burtson-labs/bandit-skills": "0.1.0"
|
|
52
|
+
"pdf-parse": "^2.4.5"
|
|
54
53
|
}
|
|
55
54
|
}
|