@viberaven/cli 1.6.0 → 1.6.2
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/AGENTS.md +64 -64
- package/LICENSE +21 -21
- package/README.md +113 -113
- package/SECURITY.md +59 -59
- package/dist/cli.js +45 -15
- package/dist/console/app.js +251 -251
- package/dist/console/index.html +46 -46
- package/dist/console/styles.css +267 -267
- package/dist/playbooks/_stack-default.json +11 -11
- package/dist/playbooks/auth-supabase.json +31 -31
- package/dist/playbooks/stripe.json +66 -66
- package/dist/playbooks/supabase.json +51 -51
- package/dist/playbooks/vercel.json +42 -42
- package/dist/report/assets/provider-authjs.svg +5 -5
- package/dist/report/assets/provider-aws.svg +5 -5
- package/dist/report/assets/provider-logrocket.svg +4 -4
- package/dist/report/report-cli.css +1466 -1466
- package/dist/report/station.css +11854 -11854
- package/dist/report/station.js +8319 -8319
- package/dist/stack/app.js +1 -1
- package/dist/stack/stack.css +1008 -1008
- package/dist/vendor/anime.umd.min.js +7 -7
- package/package.json +84 -84
- package/playbooks/_stack-default.json +11 -11
- package/playbooks/auth-supabase.json +31 -31
- package/playbooks/stripe.json +66 -66
- package/playbooks/supabase.json +51 -51
- package/playbooks/vercel.json +42 -42
- package/schemas/permissions-matrix.schema.json +90 -90
- package/templates/AGENTS.snippet.md +56 -56
- package/templates/CLAUDE.snippet.md +14 -14
- package/templates/CURSOR.snippet.md +14 -14
package/dist/stack/app.js
CHANGED
|
@@ -16,4 +16,4 @@ ${l.map((d,h)=>`${h+1}. ${d.title}`).join(`
|
|
|
16
16
|
`)}
|
|
17
17
|
After each, note the files touched. Do not claim production-ready; I will re-check.`},`Fix all ${l.length} repo blockers`,{label:"Re-check to update the score",action:"recheck"})},focusBlockers(r){if(!S(e.get()).available.findings)return;e.set(d=>({section:"findings",drawer:null,contextProviderId:r,setup:{...d.setup,open:!1},flow:{...d.flow,step:"findings"}}));let l=Array.from(document.querySelectorAll(".finding")).find(d=>d.dataset.provider===r)??document.getElementById("stage-heading");l?.focus({preventScroll:!0}),l?.scrollIntoView?.({behavior:"smooth",block:"center"})},async compare(r,l){if(!r.trim()||!l.trim()){e.set({compare:{...e.get().compare,error:"Both refs are required."}});return}e.set({busy:{...e.get().busy,compare:!0},compare:{...e.get().compare,from:r,to:l,error:null}});try{let d=await k.compare(r.trim(),l.trim());e.set({compare:{from:r,to:l,result:d,error:null}})}catch(d){e.set({compare:{from:r,to:l,result:null,error:C(d)}})}finally{e.set({busy:{...e.get().busy,compare:!1}})}},async explainDiff(r,l){e.get().setup.running||await c({...o(),taskKind:"diff",release:{id:`${r.trim()}..${l.trim()}`,label:`${r.trim()} \u2192 ${l.trim()}`},prompt:`Explain what changed between ${r.trim()} and ${l.trim()} in this repo, in plain words. Call out anything risky for production: auth, database writes, webhooks, env, payments.`},`Explain ${r.trim()} \u2192 ${l.trim()}`)},goToStep(r){let l=S(e.get());l.available[r]&&(r==="fix"&&!l.current&&e.flow({fixId:l.fixable[0]?.id??null,handoff:null}),e.flow({step:r}),u())},async checkMyApp(){let r=e.get();if(!(r.busy.scan||r.setup.running)){e.set({busy:{...r.busy,scan:!0}});try{await k.scan(),await a();let l=S(e.get());e.flow({step:ie(l),fixId:null,handoff:null,recheck:null}),u()}catch(l){e.toast(`The check did not finish: ${C(l)}`,"err")}finally{e.set({busy:{...e.get().busy,scan:!1}})}}},fixFinding(r){let l=S(e.get()),d=r?l.fixable.find(h=>h.id===r):l.fixable[0];d&&(e.flow({step:"fix",fixId:d.id,handoff:e.get().flow.handoff?.findingId===d.id?e.get().flow.handoff:null}),u())},async sendFix(){let r=e.get(),l=S(r).current;if(!l||r.busy.chat||r.setup.running||!r.probes[r.cliId]?.ready&&(await p.testConnection(r.cliId),!e.get().probes[r.cliId]?.ready))return;let d=e.get().cliId,h=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;e.set({busy:{...e.get().busy,chat:!0},workingSince:Date.now(),runId:h}),e.flow({handoff:{findingId:l.id,cliId:d,status:"running",output:""}}),e.push({role:"me",text:`Fix: ${l.title}`});try{let g=(await k.chat({...o(),runId:h,taskKind:"fix",prompt:l.prompt,displayPrompt:`Fix: ${l.title}`,provider:l.service?{id:l.service.id,name:l.service.name,area:""}:void 0})).agentRun,m=/Stopped by user/.test(g.stderr??""),M=g.timedOut||m||g.exitCode!==null&&g.exitCode!==0||!g.output?.trim(),w=g.output?.trim()||(m?"Stopped.":g.timedOut?`${d} did not finish in time and was stopped.`:`${d} exited with code ${g.exitCode??"unknown"} and no answer.
|
|
18
18
|
|
|
19
|
-
${Ge(g.stderr,1200)}`);e.flow({handoff:{findingId:l.id,cliId:d,status:M?"failed":"done",output:w}}),e.push({role:M?"error":"agent",text:w,cliId:d})}catch(y){e.flow({handoff:{findingId:l.id,cliId:d,status:"failed",output:C(y)}})}finally{e.set({busy:{...e.get().busy,chat:!1},workingSince:null,runId:null})}},async copyFix(){let r=S(e.get()).current;if(r)try{await navigator.clipboard.writeText(r.prompt),e.toast("Prompt copied. Paste it into your coding agent.")}catch{e.toast("Could not copy. Select the prompt and copy it by hand.","err")}},async checkAgain(){let r=e.get(),l=S(r).current;if(!l||r.busy.scan)return;let d=r.project.gate?.score;e.flow({step:"recheck",recheck:{findingId:l.id,title:l.title,status:"running",scoreBefore:d}}),e.set({busy:{...e.get().busy,scan:!0}}),u();try{await k.scan(),await a();let h=S(e.get()),y=h.findings.find(M=>M.id===l.id),g=e.get().project.gate?.score;if(y){e.flow({recheck:{findingId:l.id,title:l.title,status:"open",message:y.summary,scoreBefore:d,scoreAfter:g}});return}let m=h.fixable[0]??null;e.flow({recheck:{findingId:l.id,title:l.title,status:"fixed",nextId:m?.id??null,scoreBefore:d,scoreAfter:g}}),window.setTimeout(()=>{let M=e.get().flow;if(M.step!=="recheck"||M.recheck?.findingId!==l.id||M.recheck.status!=="fixed")return;let w=S(e.get());m&&w.fixable.some(D=>D.id===m.id)?e.flow({step:"fix",fixId:m.id,handoff:null}):e.flow({step:"ready",fixId:null,handoff:null}),u()},1600)}catch(h){e.flow({recheck:{findingId:l.id,title:l.title,status:"error",message:C(h),scoreBefore:d}})}finally{e.set({busy:{...e.get().busy,scan:!1}})}},toggleChecklistItem(r){let l={...e.get().flow.checklist,[r]:!e.get().flow.checklist[r]};e.flow({checklist:l})},togglePrChecks(r){let l=r??!e.get().prChecks.open;e.set(d=>({prChecks:{...d.prChecks,open:l,error:null}})),l?queueMicrotask(()=>document.getElementById("pr-checks-action")?.focus({preventScroll:!0})):document.getElementById("pr-checks-button")?.focus({preventScroll:!0})},async addPrChecks(){if(!e.get().prChecks.busy){e.set(r=>({prChecks:{...r.prChecks,busy:!0,error:null}}));try{let r=await k.addGithubWorkflow();e.set(l=>({prChecks:{...l.prChecks,status:r.status,written:r.written,busy:!1}})),queueMicrotask(()=>document.getElementById("pr-checks-copy")?.focus({preventScroll:!0}))}catch(r){e.set(l=>({prChecks:{...l.prChecks,busy:!1,error:C(r)}}))}}},async copyPrCommit(){let r=e.get().prChecks.status?.path??".github/workflows/viberaven.yml";try{await navigator.clipboard.writeText(`git add ${r} && git commit -m "Check pull requests with VibeRaven"`),e.toast("Copied. Run it, then push.")}catch{e.toast("Could not copy. Select the command and copy it by hand.","err")}},toggleMore(r){let l=r??!e.get().moreOpen;e.set({moreOpen:l}),l?queueMicrotask(()=>document.querySelector('#more-menu [role="menuitem"]')?.focus({preventScroll:!0})):document.getElementById("open-more")?.focus({preventScroll:!0})},openMore(r){if(e.set({moreOpen:!1}),r==="chat"){s();return}if(r==="services"){e.set({drawer:"services",agentOpen:!1}),queueMicrotask(()=>document.getElementById("drawer-close")?.focus({preventScroll:!0}));return}e.set({drawer:r,agentOpen:!1}),queueMicrotask(()=>document.getElementById("drawer-close")?.focus({preventScroll:!0}))}};return p}function Kt(){let e=document.getElementById("app");if(!e)return;let i=be(Wt()),n=qt(i),s=()=>He(e,i,n);i.subscribe(s),s(),document.addEventListener("keydown",u=>{let o=i.get().fullCheck.step;if(u.key==="Escape"&&o!=="closed"){o!=="running"&&n.closeFullCheck();return}if(u.key==="Escape"&&i.get().moreOpen){n.toggleMore(!1);return}if(u.key==="Escape"&&i.get().prChecks.open){n.togglePrChecks(!1);return}if(u.key==="Escape"&&i.get().agentOpen){n.toggleAgent();return}u.key==="Escape"&&i.get().drawer&&n.toggleDrawer(null)}),document.addEventListener("pointerdown",u=>{!i.get().moreOpen||u.target?.closest("#more-menu, #open-more")||i.set({moreOpen:!1})});let a=()=>{let u=i.get();if(!u.catalog.length||u.setup.running||u.busy.chat)return;let o=Qe(window.location.hash,u.catalog.map(p=>p.id));o!==null&&(i.set({section:"stack",agentOpen:!
|
|
19
|
+
${Ge(g.stderr,1200)}`);e.flow({handoff:{findingId:l.id,cliId:d,status:M?"failed":"done",output:w}}),e.push({role:M?"error":"agent",text:w,cliId:d})}catch(y){e.flow({handoff:{findingId:l.id,cliId:d,status:"failed",output:C(y)}})}finally{e.set({busy:{...e.get().busy,chat:!1},workingSince:null,runId:null})}},async copyFix(){let r=S(e.get()).current;if(r)try{await navigator.clipboard.writeText(r.prompt),e.toast("Prompt copied. Paste it into your coding agent.")}catch{e.toast("Could not copy. Select the prompt and copy it by hand.","err")}},async checkAgain(){let r=e.get(),l=S(r).current;if(!l||r.busy.scan)return;let d=r.project.gate?.score;e.flow({step:"recheck",recheck:{findingId:l.id,title:l.title,status:"running",scoreBefore:d}}),e.set({busy:{...e.get().busy,scan:!0}}),u();try{await k.scan(),await a();let h=S(e.get()),y=h.findings.find(M=>M.id===l.id),g=e.get().project.gate?.score;if(y){e.flow({recheck:{findingId:l.id,title:l.title,status:"open",message:y.summary,scoreBefore:d,scoreAfter:g}});return}let m=h.fixable[0]??null;e.flow({recheck:{findingId:l.id,title:l.title,status:"fixed",nextId:m?.id??null,scoreBefore:d,scoreAfter:g}}),window.setTimeout(()=>{let M=e.get().flow;if(M.step!=="recheck"||M.recheck?.findingId!==l.id||M.recheck.status!=="fixed")return;let w=S(e.get());m&&w.fixable.some(D=>D.id===m.id)?e.flow({step:"fix",fixId:m.id,handoff:null}):e.flow({step:"ready",fixId:null,handoff:null}),u()},1600)}catch(h){e.flow({recheck:{findingId:l.id,title:l.title,status:"error",message:C(h),scoreBefore:d}})}finally{e.set({busy:{...e.get().busy,scan:!1}})}},toggleChecklistItem(r){let l={...e.get().flow.checklist,[r]:!e.get().flow.checklist[r]};e.flow({checklist:l})},togglePrChecks(r){let l=r??!e.get().prChecks.open;e.set(d=>({prChecks:{...d.prChecks,open:l,error:null}})),l?queueMicrotask(()=>document.getElementById("pr-checks-action")?.focus({preventScroll:!0})):document.getElementById("pr-checks-button")?.focus({preventScroll:!0})},async addPrChecks(){if(!e.get().prChecks.busy){e.set(r=>({prChecks:{...r.prChecks,busy:!0,error:null}}));try{let r=await k.addGithubWorkflow();e.set(l=>({prChecks:{...l.prChecks,status:r.status,written:r.written,busy:!1}})),queueMicrotask(()=>document.getElementById("pr-checks-copy")?.focus({preventScroll:!0}))}catch(r){e.set(l=>({prChecks:{...l.prChecks,busy:!1,error:C(r)}}))}}},async copyPrCommit(){let r=e.get().prChecks.status?.path??".github/workflows/viberaven.yml";try{await navigator.clipboard.writeText(`git add ${r} && git commit -m "Check pull requests with VibeRaven"`),e.toast("Copied. Run it, then push.")}catch{e.toast("Could not copy. Select the command and copy it by hand.","err")}},toggleMore(r){let l=r??!e.get().moreOpen;e.set({moreOpen:l}),l?queueMicrotask(()=>document.querySelector('#more-menu [role="menuitem"]')?.focus({preventScroll:!0})):document.getElementById("open-more")?.focus({preventScroll:!0})},openMore(r){if(e.set({moreOpen:!1}),r==="chat"){s();return}if(r==="services"){e.set({drawer:"services",agentOpen:!1}),queueMicrotask(()=>document.getElementById("drawer-close")?.focus({preventScroll:!0}));return}e.set({drawer:r,agentOpen:!1}),queueMicrotask(()=>document.getElementById("drawer-close")?.focus({preventScroll:!0}))}};return p}function Kt(){let e=document.getElementById("app");if(!e)return;let i=be(Wt()),n=qt(i),s=()=>He(e,i,n);i.subscribe(s),s(),document.addEventListener("keydown",u=>{let o=i.get().fullCheck.step;if(u.key==="Escape"&&o!=="closed"){o!=="running"&&n.closeFullCheck();return}if(u.key==="Escape"&&i.get().moreOpen){n.toggleMore(!1);return}if(u.key==="Escape"&&i.get().prChecks.open){n.togglePrChecks(!1);return}if(u.key==="Escape"&&i.get().agentOpen){n.toggleAgent();return}u.key==="Escape"&&i.get().drawer&&n.toggleDrawer(null)}),document.addEventListener("pointerdown",u=>{!i.get().moreOpen||u.target?.closest("#more-menu, #open-more")||i.set({moreOpen:!1})});let a=()=>{let u=i.get();if(!u.catalog.length||u.setup.running||u.busy.chat)return;let o=Qe(window.location.hash,u.catalog.map(p=>p.id));o!==null&&(i.set({section:"stack",drawer:"services",agentOpen:!1,moreOpen:!1,setup:{...u.setup,open:!0,initialized:!0,selected:o,progress:[],error:null}}),history.replaceState(null,"",window.location.pathname+window.location.search),document.getElementById("stack-setup-heading")?.focus())};window.addEventListener("hashchange",a),k.catalog().then(u=>{i.set(o=>({catalog:u.providers,setup:o.setup.open&&!o.setup.initialized?{...o.setup,initialized:!0,selected:pe(u.providers)}:o.setup})),a()}).catch(()=>{}),k.verified().then(u=>i.set({verified:u.verified})).catch(()=>{}),k.githubWorkflow().then(u=>i.set(o=>({prChecks:{...o.prChecks,status:u}}))).catch(()=>{}),k.agents().then(u=>{i.set({agents:u.agents.filter(p=>p.id==="codex"||p.id==="claude"||p.id==="gemini")});let o=u.agents.find(p=>p.id===i.get().cliId);if(o&&!o.installed){let p=u.agents.find(r=>r.installed);p&&i.set({cliId:p.id})}n.testConnection(i.get().cliId,{silent:!0})}).catch(()=>{});let c=async()=>{try{let u=await k.scanStatus();if(i.set({scan:u}),u.state==="running")window.setTimeout(c,1500);else if(u.state==="done"&&i.get().project.empty){let o=await k.project();i.set({project:o}),i.get().flow.step==="app"&&i.flow({step:ie(S(i.get()))})}}catch{}};c(),window.setInterval(()=>{Ye(document,i.get().workingSince)},1e3)}Kt();})();
|