@sma1lboy/rove 0.9.258 → 0.9.262
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/{chunk-rx2604ry.js → chunk-06wk3r66.js} +1 -1
- package/dist/cli/chunk-0wy0w6jd.js +3 -0
- package/dist/cli/{chunk-wyt2vgjv.js → chunk-1bfcy0n9.js} +1 -1
- package/dist/cli/chunk-1dzr3fba.js +2 -0
- package/dist/cli/{chunk-mmc662x2.js → chunk-1pfsfpcg.js} +1 -1
- package/dist/cli/{chunk-jtpjdmb6.js → chunk-1x6yahf1.js} +1 -1
- package/dist/cli/{chunk-tq6pq1ws.js → chunk-2676cb62.js} +1 -1
- package/dist/cli/{chunk-ehb0hbrg.js → chunk-2cwzyxcs.js} +2 -2
- package/dist/cli/{chunk-r6f8h111.js → chunk-31h3d4re.js} +2 -2
- package/dist/cli/{chunk-68113ts1.js → chunk-36y93k92.js} +1 -1
- package/dist/cli/chunk-37v3752z.js +2 -0
- package/dist/cli/{chunk-0604fza5.js → chunk-3ds88mym.js} +1 -1
- package/dist/cli/{chunk-cewyvr3c.js → chunk-4ntrjm11.js} +1 -1
- package/dist/cli/{chunk-kgddz8pw.js → chunk-4t1dvw2h.js} +1 -1
- package/dist/cli/chunk-4tgz542w.js +3 -0
- package/dist/cli/chunk-53p99fe7.js +66 -0
- package/dist/cli/{chunk-sabpcket.js → chunk-5a3c9fnd.js} +1 -1
- package/dist/cli/{chunk-ke3t032y.js → chunk-5js4agdd.js} +1 -1
- package/dist/cli/{chunk-zqq3djrw.js → chunk-65kx9ksj.js} +3 -3
- package/dist/cli/{chunk-cb7hc2xm.js → chunk-68xcxsbg.js} +1 -1
- package/dist/cli/{chunk-pb5g6161.js → chunk-6an1v8vq.js} +1 -1
- package/dist/cli/{chunk-s0jbtyd9.js → chunk-6ks6s8b2.js} +3 -2
- package/dist/cli/{chunk-45thgqdr.js → chunk-6nw0s0ab.js} +1 -1
- package/dist/cli/{chunk-t25xke74.js → chunk-73fw8277.js} +1 -1
- package/dist/cli/{chunk-1xrbb7gf.js → chunk-74e3k701.js} +1 -1
- package/dist/cli/{chunk-stcvcsfm.js → chunk-7697syt8.js} +1 -1
- package/dist/cli/{chunk-3q1rv3rm.js → chunk-7nqzg7h6.js} +2 -2
- package/dist/cli/chunk-7t9q7k4d.js +4 -0
- package/dist/cli/{chunk-0d57z680.js → chunk-8e8y2m0b.js} +1 -1
- package/dist/cli/chunk-8k04kxqq.js +20 -0
- package/dist/cli/chunk-951xzbsm.js +3 -0
- package/dist/cli/{chunk-dqprpnd6.js → chunk-95gk3twe.js} +1 -1
- package/dist/cli/chunk-b7w3q5f1.js +2 -0
- package/dist/cli/chunk-c0gvp57p.js +3 -0
- package/dist/cli/{chunk-pwbtezsa.js → chunk-c3g1bfn6.js} +1 -1
- package/dist/cli/{chunk-yktnbb14.js → chunk-c7j05xps.js} +37 -37
- package/dist/cli/chunk-db61d8dz.js +3 -0
- package/dist/cli/{chunk-95jzkqp2.js → chunk-dc3n6nf7.js} +1 -1
- package/dist/cli/{chunk-x8rkpfqd.js → chunk-dq3m7rhj.js} +1 -1
- package/dist/cli/{chunk-hfvz23r6.js → chunk-edrw4tby.js} +1 -1
- package/dist/cli/chunk-ephcyh6v.js +3 -0
- package/dist/cli/{chunk-jd02zgwf.js → chunk-esk09jfb.js} +1 -1
- package/dist/cli/{chunk-cq5qv93a.js → chunk-fg55dc4s.js} +1 -1
- package/dist/cli/{chunk-278sc87n.js → chunk-fq3s9q62.js} +1 -1
- package/dist/cli/{chunk-1egwgg6p.js → chunk-gc3f7zbs.js} +1 -1
- package/dist/cli/{chunk-y0gybgba.js → chunk-gc78tfn9.js} +1 -1
- package/dist/cli/chunk-h0pg8e0g.js +70 -0
- package/dist/cli/{chunk-b47k0cnw.js → chunk-h5znx9v9.js} +1 -1
- package/dist/cli/chunk-hrgd7vws.js +2 -0
- package/dist/cli/chunk-jc2jwy0j.js +2 -0
- package/dist/cli/{chunk-8gjpnb83.js → chunk-k21hb0rj.js} +1 -1
- package/dist/cli/{chunk-rc2nwsdd.js → chunk-k71h719j.js} +1 -1
- package/dist/cli/chunk-karefnj8.js +11 -0
- package/dist/cli/chunk-kkzmdwfr.js +7 -0
- package/dist/cli/chunk-kqdq5g1x.js +3 -0
- package/dist/cli/{chunk-6x0trw81.js → chunk-m2qajv9v.js} +1 -1
- package/dist/cli/{chunk-1vwngrmf.js → chunk-m3773n9n.js} +1 -1
- package/dist/cli/chunk-m3nfbnxy.js +2 -0
- package/dist/cli/{chunk-edpbz0gz.js → chunk-m5kxc6m3.js} +3 -3
- package/dist/cli/chunk-mgx6w27b.js +2 -0
- package/dist/cli/{chunk-ebea569y.js → chunk-n8p8b9qd.js} +1 -1
- package/dist/cli/{chunk-9v18qy3s.js → chunk-nnda6138.js} +1 -1
- package/dist/cli/{chunk-edsm15ht.js → chunk-nwevnc6k.js} +1 -1
- package/dist/cli/{chunk-7cd1epfw.js → chunk-nxdm60xy.js} +1 -1
- package/dist/cli/{chunk-pw87thvf.js → chunk-p0ycfqw2.js} +1 -1
- package/dist/cli/{chunk-sma961wh.js → chunk-q07r6hf7.js} +1 -1
- package/dist/cli/{chunk-jf46jsdp.js → chunk-q55z079p.js} +1 -1
- package/dist/cli/{chunk-xnaehfby.js → chunk-qc376zm1.js} +1 -1
- package/dist/cli/chunk-qk9tgve2.js +2 -0
- package/dist/cli/{chunk-jv11f2c2.js → chunk-qwhajjyw.js} +3 -3
- package/dist/cli/chunk-r03m4san.js +2 -0
- package/dist/cli/{chunk-kqf371ff.js → chunk-r1epx453.js} +1 -1
- package/dist/cli/chunk-r3zkpbf5.js +9 -0
- package/dist/cli/{chunk-6p9yxt3q.js → chunk-r7p1dhrv.js} +1 -1
- package/dist/cli/{chunk-y8xb4ys7.js → chunk-rcqckj34.js} +1 -1
- package/dist/cli/{chunk-zam29b9x.js → chunk-rh5vxymy.js} +1 -1
- package/dist/cli/chunk-rrqjk4rn.js +16 -0
- package/dist/cli/chunk-s83qnstd.js +2 -0
- package/dist/cli/{chunk-rnxk3587.js → chunk-sp9cmc7p.js} +1 -1
- package/dist/cli/{chunk-yjyjg7sk.js → chunk-stng29vp.js} +2 -2
- package/dist/cli/{chunk-80zzjcvp.js → chunk-syqbc3a3.js} +1 -1
- package/dist/cli/chunk-t228jyth.js +4 -0
- package/dist/cli/{chunk-ya0h6hcd.js → chunk-tj1w7jb7.js} +5 -5
- package/dist/cli/{chunk-t60qcvcj.js → chunk-traxwyfz.js} +1 -1
- package/dist/cli/chunk-tx4b93j7.js +2 -0
- package/dist/cli/{chunk-c8anewjn.js → chunk-tykb6n4m.js} +1 -1
- package/dist/cli/{chunk-cqychwvw.js → chunk-vznz1yf0.js} +1 -1
- package/dist/cli/{chunk-v7prawj1.js → chunk-wqcs5mz0.js} +1 -1
- package/dist/cli/chunk-wv6d96t6.js +2 -0
- package/dist/cli/{chunk-tpt3fn1q.js → chunk-xwynw0t0.js} +1 -1
- package/dist/cli/{chunk-k2cnmb5q.js → chunk-xywr9nj6.js} +1 -1
- package/dist/cli/chunk-y5wt6c1s.js +3 -0
- package/dist/cli/{chunk-yaqkajw4.js → chunk-y7nkgnzn.js} +17 -17
- package/dist/cli/{chunk-qpc8bv02.js → chunk-yxsec1f1.js} +4 -4
- package/dist/cli/chunk-z3qhpthz.js +3 -0
- package/dist/cli/{chunk-8q1g1xq0.js → chunk-z5evzj1q.js} +1 -1
- package/dist/cli/{chunk-eyzjma6q.js → chunk-zqfvxz1g.js} +1 -1
- package/dist/cli/{chunk-1zqzqbek.js → chunk-zsth2jk6.js} +1 -1
- package/dist/cli/{chunk-hdnqq66w.js → chunk-zt0dmqn5.js} +1 -1
- package/dist/cli/index.js +4 -4
- package/dist/cli/pty-host-node.mjs +4 -0
- package/dist/cli/rove.js +1 -1
- package/dist/completions/rove.bash +2 -2
- package/dist/completions/rove.fish +2 -2
- package/dist/completions/rove.zsh +2 -2
- package/dist/skills/rove/SKILL.md +1 -1
- package/dist/skills/rove/references/api-flags.md +28 -11
- package/dist/web/assets/index-BLCf4p1g.js +109 -0
- package/dist/web/assets/index-CdjFB6v7.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +3 -3
- package/dist/cli/chunk-1378mh2w.js +0 -3
- package/dist/cli/chunk-1qge84t7.js +0 -3
- package/dist/cli/chunk-1vxykwb9.js +0 -3
- package/dist/cli/chunk-2yjpqb47.js +0 -3
- package/dist/cli/chunk-4ab8y1yp.js +0 -15
- package/dist/cli/chunk-4d4d59vp.js +0 -20
- package/dist/cli/chunk-658859k9.js +0 -31
- package/dist/cli/chunk-6t5d02s4.js +0 -2
- package/dist/cli/chunk-79r3wbhh.js +0 -2
- package/dist/cli/chunk-7nr405tr.js +0 -9
- package/dist/cli/chunk-82zpp3yx.js +0 -4
- package/dist/cli/chunk-8dggnfaf.js +0 -2
- package/dist/cli/chunk-csdne12x.js +0 -3
- package/dist/cli/chunk-dd0mtzje.js +0 -3
- package/dist/cli/chunk-fehxbwcb.js +0 -6
- package/dist/cli/chunk-g846fbp7.js +0 -52
- package/dist/cli/chunk-hkv6t5v9.js +0 -2
- package/dist/cli/chunk-jetsx9zr.js +0 -3
- package/dist/cli/chunk-q301ewyq.js +0 -2
- package/dist/cli/chunk-qn04z4zb.js +0 -2
- package/dist/cli/chunk-rmk69hvh.js +0 -2
- package/dist/cli/chunk-s1rg1zae.js +0 -3
- package/dist/cli/chunk-skpkscne.js +0 -11
- package/dist/cli/chunk-x7cv6deh.js +0 -2
- package/dist/cli/chunk-y85e24s9.js +0 -2
- package/dist/cli/chunk-yc9bytrj.js +0 -2
- package/dist/web/assets/index-BiUiNIOp.css +0 -1
- package/dist/web/assets/index-jy27XaL0.js +0 -109
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
2
|
+
import{hookConfigIssues}from"./chunk-zsth2jk6.js";import{readOutdatedCache}from"./chunk-sp9cmc7p.js";import{tightenPluginPermissions}from"./chunk-95gk3twe.js";import{DEFAULT_PREFIX_CONFIGURATION}from"./chunk-65v8ga90.js";import{AUTO_ROUTING_TIERS}from"./chunk-xwynw0t0.js";import{reloadPluginEngines}from"./chunk-traxwyfz.js";import{ENGINE_ACTIVITY_KINDS}from"./chunk-17e2tgyg.js";import{currentPluginPlatform,loadPluginRegistry,parsePluginManifest,pluginConfigDir,pluginLogPath,pluginManifestPath,qualifiedActionId,readPluginManifest,savePluginRegistry,supportsPlatform}from"./chunk-nwevnc6k.js";import{addTab,expandHome,setTabEngineCommand,setTabForkFrom,setTabInitialPrompt}from"./chunk-7nqzg7h6.js";import{engineCanFork,engineDisplayName,getEngineProtocol,protocolEntry}from"./chunk-kqdq5g1x.js";import{THEME_MODE_PREFERENCES,ensureContrast,inkAtHue,oklchCusp,relativeLuminance,toOklch}from"./chunk-951xzbsm.js";import{readFirstNonEmptyRepoFile}from"./chunk-catrr0z3.js";import{activityHookAdapters,engineEntry}from"./chunk-h5znx9v9.js";import{maybeStartScheduledRun,spawnCapture}from"./chunk-2tfnscxk.js";import{readOnlyGitProcessEnv}from"./chunk-6xppe9bj.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{ROVE_HOOK_VERSION}from"./chunk-7zyyvc3d.js";import{recordSpawn}from"./chunk-40dgv828.js";import{loadStateFile}from"./chunk-g4281a0g.js";import{promptAttachmentsDir}from"./chunk-prqeddy7.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import{OWNER_ONLY_DIR_MODE,OWNER_ONLY_FILE_MODE}from"./chunk-yt15y085.js";import{t}from"./chunk-2676cb62.js";import{LOCALES}from"./chunk-q07r6hf7.js";import{createStateCell}from"./chunk-cmp64q4j.js";import{readRoveEnv}from"./chunk-nc46gddg.js";var pluginPageErrorState=createStateCell([],"plugin-page-errors");function pluginPageErrors(){return pluginPageErrorState.get()}var WORKING_BORDER_KEY="appearance.workingBorder",WORKING_BORDERS=["flow","still"],DEFAULT_WORKING_BORDER="flow";function normalizeWorkingBorder(raw){return WORKING_BORDERS.includes(raw)?raw:"flow"}function relativeBuckets(absMs){let minutes=Math.floor(absMs/60000),hours=Math.floor(minutes/60);return{minutes,hours,days:Math.floor(hours/24)}}function relativeAge(ms,nowMs=Date.now()){let delta=Math.max(0,nowMs-ms),secs=Math.floor(delta/1000);if(secs<60)return`${secs}s`;let{minutes,hours,days}=relativeBuckets(delta);if(minutes<60)return`${minutes}m`;if(hours<24)return`${hours}h`;return`${days}d`}import{randomBytes}from"crypto";import{existsSync,mkdirSync,writeFileSync}from"fs";import{isAbsolute,join}from"path";var ATTACHMENT_EXTENSION_REGEX=/\.(png|jpe?g|gif|webp|pdf)$/i,PDF_EXTENSION_REGEX=/\.pdf$/i;function removeOuterQuotes(text){if(text.startsWith('"')&&text.endsWith('"')||text.startsWith("'")&&text.endsWith("'"))return text.slice(1,-1);return text}function stripBackslashEscapes(path){let placeholder=`__DOUBLE_BACKSLASH_${randomBytes(8).toString("hex")}__`;return path.replace(/\\\\/g,placeholder).replace(/\\(.)/g,"$1").replaceAll(placeholder,"\\")}function asAttachmentPath(text,exists=existsSync){let cleaned=stripBackslashEscapes(removeOuterQuotes(text.trim()));if(!ATTACHMENT_EXTENSION_REGEX.test(cleaned))return null;if(!isAbsolute(cleaned))return null;return exists(cleaned)?cleaned:null}function asAttachmentPaths(pasted,exists=existsSync){let lines=pasted.split(`
|
|
3
3
|
`).map((l)=>l.trim()).filter((l)=>l.length>0);if(lines.length===0)return null;let paths=[];for(let line of lines){let p=asAttachmentPath(line,exists);if(!p)return null;paths.push(p)}return paths}function attachmentLabel(path,index){return PDF_EXTENSION_REGEX.test(path)?`pdf[${index}]`:`images[${index}]`}function appendAttachmentRefs(prompt,attachments){if(attachments.length===0)return prompt;let refs=attachments.map((p,i)=>`${attachmentLabel(p,i)}: ${p}`).join(`
|
|
4
4
|
`);return`${prompt}
|
|
5
5
|
|
|
@@ -7,7 +7,7 @@ ${refs}`}async function capture(cmd){try{let proc=Bun.spawn(cmd,{stdin:"ignore",
|
|
|
7
7
|
`)}function issueProjectPrompt(issue,api){return[...promptHeader(issue),"You are working directly in the project checkout \u2014 no dedicated worktree or branch was created. Keep changes reviewable and do not switch branches unless asked.","Before finishing, verify the acceptance criteria implied by the story and summarize what changed plus any verification still needed.",`When the work lands, run: ${api} issue-update --repo . --id ${issue.id} --status done`].join(`
|
|
8
8
|
`)}function displayProductName(){return ROVE_PRODUCT_NAME.charAt(0).toUpperCase()+ROVE_PRODUCT_NAME.slice(1)}function nextPlaceholderIndex(body){let max=-1;for(let m of body.matchAll(/^(?:images|pdf)\[(\d+)\]:/gm)){let n=Number.parseInt(m[1],10);if(n>max)max=n}return max+1}function withImagePlaceholders(body,paths){let next=body.replace(/\s+$/,""),index=nextPlaceholderIndex(body);for(let path of paths){let line=`${attachmentLabel(path,index)}: ${path}`;next=next.length>0?`${next}
|
|
9
9
|
${line}`:line,index+=1}return next}var ISSUE_CHAT_PLACEMENTS=["worktree","projectWorktree","project"];function issueChatTaskTitle(issue){return`#${issue.id} ${issue.title}`}function issueWorktreePrompt2(issue,api="rove api"){return issueWorktreePrompt(issue,api,displayProductName())}function issueProjectPrompt2(issue,api="rove api"){return issueProjectPrompt(issue,api)}import{spawnSync}from"child_process";import*as fs from"fs";var DEFAULT_BASE_REF="main";function notAGitRepoReason(path){return`This folder isn't a git repository yet, and a task needs a git branch to work in. To fix it, turn ${path} into a repo: git init && git add -A && git commit -m "init" \u2014 then create the task again. (Working in non-git folders is coming soon.)`}function gitMissingReason(){return t("workspace.welcome.gitMissing")}function isBinaryMissing(out){return out.error!==void 0&&out.error.code==="ENOENT"}function git(repo,args){try{recordSpawn("tui.gitSnapshot",["git",...args],repo);let out=spawnSync("git",args,{cwd:repo,encoding:"utf-8",timeout:2000,stdio:["ignore","pipe","ignore"]});return{status:out.status??1,stdout:out.stdout??"",missing:isBinaryMissing(out),spawned:!0}}catch{return{status:1,stdout:"",missing:!1,spawned:!1}}}function noCommitsReason(path){return`This repository has no commits yet, and a task branches off an existing commit. To fix it, make one in ${path}: git add -A && git commit -m "init" \u2014 then create the task again.`}function hasNoCommits(repo){let out=git(repo,["rev-parse","--verify","HEAD"]);return out.spawned&&!out.missing&&out.status!==0}function validateRepoPath(repo){let trimmed=repo.trim();if(!trimmed)return"repo path is required";let stat;try{stat=fs.statSync(trimmed)}catch{return`path does not exist: ${trimmed}`}if(!stat.isDirectory())return`not a directory: ${trimmed}`;let repoCheck=git(trimmed,["rev-parse","--git-dir"]);if(repoCheck.missing)return gitMissingReason();if(repoCheck.status!==0)return notAGitRepoReason(trimmed);if(hasNoCommits(trimmed))return noCommitsReason(trimmed);return null}function getCurrentBranch(repo){if(!repo)return null;let out=git(repo,["rev-parse","--abbrev-ref","HEAD"]);if(out.status!==0)return null;let name=out.stdout.trim();return!name||name==="HEAD"?null:name}function listLocalBranches(repo){if(!repo)return[];let out=git(repo,["for-each-ref","--format=%(refname:short)","refs/heads/"]);if(out.status!==0)return[];return out.stdout.split(`
|
|
10
|
-
`).map((s)=>s.trim()).filter(Boolean).sort((a,b)=>{let score=(n)=>n==="main"?0:n==="master"?1:n==="develop"?2:3,sa=score(a),sb=score(b);if(sa!==sb)return sa-sb;return a.localeCompare(b)})}function truncateEnd(s,max){if(max<=0)return"";let points=[...s];if(points.length<=max)return s;return`${points.slice(0,Math.max(0,max-1)).join("")}\u2026`}function truncateEndCells(s,maxCells,cellsOf){if(maxCells<=0)return"";let total=0;for(let ch of s)total+=cellsOf(ch.codePointAt(0)??0);if(total<=maxCells)return s;let used=0,out="";for(let ch of s){let w=cellsOf(ch.codePointAt(0)??0);if(used+w>maxCells-1)break;used+=w,out+=ch}return`${out}\u2026`}function truncateStart(s,max){if(max<=0)return"";let points=[...s];if(points.length<=max)return s;return`\u2026${points.slice(points.length-Math.max(0,max-1)).join("")}`}function truncateStartCells(s,maxCells,cellsOf){if(maxCells<=0)return"";let points=[...s],total=0;for(let ch of points)total+=cellsOf(ch.codePointAt(0)??0);if(total<=maxCells)return s;let used=0,out="";for(let i=points.length-1;i>=0;i--){let ch=points[i],w=cellsOf(ch.codePointAt(0)??0);if(used+w>maxCells-1)break;used+=w,out=ch+out}return`\u2026${out}`}var EVENT_FEED_LIMIT=12,FRAGMENT_MAX=40;function str(value){return typeof value==="string"?value:""}function detailFragment(event){let detail=event.detail;if(!detail)return"";let{tool,compact,subagent}=detail,fragment=str(tool?.name)||str(compact?.trigger)||str(subagent?.type)||str(detail.note);return truncateEnd(fragment,FRAGMENT_MAX)}function eventRows(events,nowMs,limit=EVENT_FEED_LIMIT){return events.slice(-limit).reverse().map((event,index)=>{let tail=[detailFragment(event),str(event.vendor)].filter((part)=>part.length>0);return{key:`${event.at}:${index}`,age:relativeAge(event.at,nowMs),kind:event.kind,tail:tail.join(" \xB7 ")}})}var TASK_COLORS_KEY="appearance.taskColors",TASK_COLORS=["on","off"],DEFAULT_TASK_COLORS="on";function normalizeTaskColors(raw){return TASK_COLORS.includes(raw)?raw:"on"}var DARK_HUES=[[0,93],[139,157],[201,359]],LIGHT_HUES=[[195,330]],SEMANTIC_GUARD_DEG=25,GUARD_SLACK_DEG=2,GREY_CHROMA=0.03,GREY_ACCENT_CHROMA_SHARE=0.7,MIN_CHROMA=0.05,MAX_CHROMA=0.21,DARK_MIN_LIGHTNESS=0.65,DARK_MAX_LIGHTNESS=0.88,MIN_CONTRAST=3;function hueDistance(a,b){let d=Math.abs(a-b)%360;return Math.min(d,360-d)}function hueOf(color){if(color.intent!=="rgb")return;let{c,h}=toOklch(color);if(c<GREY_CHROMA)return;return(h*180/Math.PI%360+360)%360}function hash(text){let h=5381;for(let i=0;i<text.length;i++)h=((h<<5)+h^text.charCodeAt(i))>>>0;return h=Math.imul(h^h>>>16,2246822507),h=Math.imul(h^h>>>13,3266489909),(h^h>>>16)>>>0}function taskHue(taskId,arcs,semantic){let all=arcs.flatMap(([from,to])=>Array.from({length:to-from+1},(_,i)=>from+i)),clear=all.filter((h)=>semantic.every((s)=>hueDistance(h,s)>=SEMANTIC_GUARD_DEG+GUARD_SLACK_DEG)),hues=clear.length>0?clear:all;return hues[hash(taskId)%hues.length]??0}function computeTaskColor(taskId,theme){let accent=theme.accent,[r,g,b]=theme.background.toInts(),light=relativeLuminance([r,g,b])>0.5,semantic=[theme.success,theme.warning,theme.error].map(hueOf).filter((h)=>h!==void 0),hue=taskHue(taskId,light?LIGHT_HUES:DARK_HUES,semantic),target=oklchCusp(hue),accentHue=hueOf(accent),lightness=target.l,share=GREY_ACCENT_CHROMA_SHARE;if(accentHue!==void 0){let{l,c}=toOklch(accent),source=oklchCusp(accentHue);lightness=l<=source.l?l/source.l*target.l:target.l+(l-source.l)/(1-source.l)*(1-target.l),share=c/source.c}let chroma=Math.min(MAX_CHROMA,Math.max(MIN_CHROMA,share*target.c));if(!light)lightness=Math.min(DARK_MAX_LIGHTNESS,Math.max(DARK_MIN_LIGHTNESS,lightness));return ensureContrast(inkAtHue(hue,lightness,chroma,accent.toInts()[3]),theme.background,MIN_CONTRAST)}var cache=new Map,CACHE_LIMIT=256;function taskColor(taskId,theme){if(theme.accent.intent!=="rgb")return theme.accent;let key=[taskId,theme.accent,theme.background,theme.success,theme.warning,theme.error].map((part)=>typeof part==="string"?part:part.toInts().join()).join("|"),hit=cache.get(key);if(hit)return hit;let color=computeTaskColor(taskId,theme);if(cache.size>=CACHE_LIMIT)cache.clear();return cache.set(key,color),color}var
|
|
10
|
+
`).map((s)=>s.trim()).filter(Boolean).sort((a,b)=>{let score=(n)=>n==="main"?0:n==="master"?1:n==="develop"?2:3,sa=score(a),sb=score(b);if(sa!==sb)return sa-sb;return a.localeCompare(b)})}function truncateEnd(s,max){if(max<=0)return"";let points=[...s];if(points.length<=max)return s;return`${points.slice(0,Math.max(0,max-1)).join("")}\u2026`}function truncateEndCells(s,maxCells,cellsOf){if(maxCells<=0)return"";let total=0;for(let ch of s)total+=cellsOf(ch.codePointAt(0)??0);if(total<=maxCells)return s;let used=0,out="";for(let ch of s){let w=cellsOf(ch.codePointAt(0)??0);if(used+w>maxCells-1)break;used+=w,out+=ch}return`${out}\u2026`}function truncateStart(s,max){if(max<=0)return"";let points=[...s];if(points.length<=max)return s;return`\u2026${points.slice(points.length-Math.max(0,max-1)).join("")}`}function truncateStartCells(s,maxCells,cellsOf){if(maxCells<=0)return"";let points=[...s],total=0;for(let ch of points)total+=cellsOf(ch.codePointAt(0)??0);if(total<=maxCells)return s;let used=0,out="";for(let i=points.length-1;i>=0;i--){let ch=points[i],w=cellsOf(ch.codePointAt(0)??0);if(used+w>maxCells-1)break;used+=w,out=ch+out}return`\u2026${out}`}var EVENT_FEED_LIMIT=12,FRAGMENT_MAX=40;function str(value){return typeof value==="string"?value:""}function detailFragment(event){let detail=event.detail;if(!detail)return"";let{tool,compact,subagent}=detail,fragment=str(tool?.name)||str(compact?.trigger)||str(subagent?.type)||str(detail.note);return truncateEnd(fragment,FRAGMENT_MAX)}function eventRows(events,nowMs,limit=EVENT_FEED_LIMIT){return events.slice(-limit).reverse().map((event,index)=>{let tail=[detailFragment(event),str(event.vendor)].filter((part)=>part.length>0);return{key:`${event.at}:${index}`,age:relativeAge(event.at,nowMs),kind:event.kind,tail:tail.join(" \xB7 ")}})}var TASK_COLORS_KEY="appearance.taskColors",TASK_COLORS=["on","off"],DEFAULT_TASK_COLORS="on";function normalizeTaskColors(raw){return TASK_COLORS.includes(raw)?raw:"on"}var DARK_HUES=[[0,93],[139,157],[201,359]],LIGHT_HUES=[[195,330]],SEMANTIC_GUARD_DEG=25,GUARD_SLACK_DEG=2,GREY_CHROMA=0.03,GREY_ACCENT_CHROMA_SHARE=0.7,MIN_CHROMA=0.05,MAX_CHROMA=0.21,DARK_MIN_LIGHTNESS=0.65,DARK_MAX_LIGHTNESS=0.88,MIN_CONTRAST=3;function hueDistance(a,b){let d=Math.abs(a-b)%360;return Math.min(d,360-d)}function hueOf(color){if(color.intent!=="rgb")return;let{c,h}=toOklch(color);if(c<GREY_CHROMA)return;return(h*180/Math.PI%360+360)%360}function hash(text){let h=5381;for(let i=0;i<text.length;i++)h=((h<<5)+h^text.charCodeAt(i))>>>0;return h=Math.imul(h^h>>>16,2246822507),h=Math.imul(h^h>>>13,3266489909),(h^h>>>16)>>>0}function taskHue(taskId,arcs,semantic){let all=arcs.flatMap(([from,to])=>Array.from({length:to-from+1},(_,i)=>from+i)),clear=all.filter((h)=>semantic.every((s)=>hueDistance(h,s)>=SEMANTIC_GUARD_DEG+GUARD_SLACK_DEG)),hues=clear.length>0?clear:all;return hues[hash(taskId)%hues.length]??0}function computeTaskColor(taskId,theme){let accent=theme.accent,[r,g,b]=theme.background.toInts(),light=relativeLuminance([r,g,b])>0.5,semantic=[theme.success,theme.warning,theme.error].map(hueOf).filter((h)=>h!==void 0),hue=taskHue(taskId,light?LIGHT_HUES:DARK_HUES,semantic),target=oklchCusp(hue),accentHue=hueOf(accent),lightness=target.l,share=GREY_ACCENT_CHROMA_SHARE;if(accentHue!==void 0){let{l,c}=toOklch(accent),source=oklchCusp(accentHue);lightness=l<=source.l?l/source.l*target.l:target.l+(l-source.l)/(1-source.l)*(1-target.l),share=c/source.c}let chroma=Math.min(MAX_CHROMA,Math.max(MIN_CHROMA,share*target.c));if(!light)lightness=Math.min(DARK_MAX_LIGHTNESS,Math.max(DARK_MIN_LIGHTNESS,lightness));return ensureContrast(inkAtHue(hue,lightness,chroma,accent.toInts()[3]),theme.background,MIN_CONTRAST)}var cache=new Map,CACHE_LIMIT=256;function taskColor(taskId,theme){if(theme.accent.intent!=="rgb")return theme.accent;let key=[taskId,theme.accent,theme.background,theme.success,theme.warning,theme.error].map((part)=>typeof part==="string"?part:part.toInts().join()).join("|"),hit=cache.get(key);if(hit)return hit;let color=computeTaskColor(taskId,theme);if(cache.size>=CACHE_LIMIT)cache.clear();return cache.set(key,color),color}var SIDEBAR_COLLAPSED_KEY="sidebar.collapsed",RAIL_FOLD_STYLE_KEY="sidebar.foldStyle",SIDEBAR_WIDTH_KEY="sidebar.width";var ZEN_ACTIVE_KEY="zen.active",ZEN_DEFAULT=!0;import{spawn}from"child_process";import{existsSync as existsSync2}from"fs";import{basename,delimiter,isAbsolute as isAbsolute2,join as join2}from"path";var CLI_CANDIDATES=[{id:"code",label:"VS Code",command:"code"},{id:"cursor",label:"Cursor",command:"cursor"},{id:"windsurf",label:"Windsurf",command:"windsurf"},{id:"zed",label:"Zed",command:"zed"}],MAC_APP_CANDIDATES=[{id:"vscode.app",label:"VS Code",appName:"Visual Studio Code",paths:["/Applications/Visual Studio Code.app"]},{id:"cursor.app",label:"Cursor",appName:"Cursor",paths:["/Applications/Cursor.app","/System/Applications/Cursor.app"]},{id:"windsurf.app",label:"Windsurf",appName:"Windsurf",paths:["/Applications/Windsurf.app"]},{id:"zed.app",label:"Zed",appName:"Zed",paths:["/Applications/Zed.app"]}];function executableOnPath(command,env,exists){if(isAbsolute2(command))return exists(command);let pathEnv=env.PATH??"";for(let dir of pathEnv.split(delimiter)){if(!dir)continue;if(exists(join2(dir,command)))return!0}return!1}function labelForOverride(command){let name=basename(command);if(name==="code")return"VS Code";if(name==="cursor")return"Cursor";if(name==="windsurf")return"Windsurf";if(name==="zed")return"Zed";return name||command}function detectWorktreeOpener(deps={}){let env=deps.env??process.env,platform=deps.platform??process.platform,exists=deps.exists??existsSync2,override=readRoveEnv("OPEN_EDITOR",env)?.trim();if(override)return{id:"env",label:labelForOverride(override),command:override,args:[]};for(let c of CLI_CANDIDATES)if(executableOnPath(c.command,env,exists))return{id:c.id,label:c.label,command:c.command,args:[]};if(platform==="darwin"&&executableOnPath("open",env,exists)){for(let app of MAC_APP_CANDIDATES)if(app.paths.some((path)=>exists(path)))return{id:app.id,label:app.label,command:"open",args:["-a",app.appName]};return{id:"mac-open",label:"Finder",command:"open",args:[]}}if(platform==="linux"&&executableOnPath("xdg-open",env,exists))return{id:"xdg-open",label:"Open",command:"xdg-open",args:[]};return null}function buildOpenWorktreeCommand(worktreePath,opener){return[opener.command,[...opener.args,worktreePath]]}function openWorktree(worktreePath,opener,deps={}){if(!worktreePath)return!1;let spawnFn=deps.spawn??spawn,[command,args]=buildOpenWorktreeCommand(worktreePath,opener);try{let child=spawnFn(command,args,{detached:!0,stdio:"ignore"});if(child.pid===void 0)return!1;return child.unref(),!0}catch{return!1}}var changeListeners=new Set;function subscribeBackgroundPolls(listener){return changeListeners.add(listener),()=>{changeListeners.delete(listener)}}function notifyChanged(){for(let listener of changeListeners)try{listener()}catch{}}function createBackgroundPoller(cfg){let entries=new Map,equals=cfg.equals??((a,b)=>a===b);function entryFor(key){let entry=entries.get(key);if(!entry){let current=cfg.initial;entry={read:()=>current,write:(next)=>{if(equals(current,next))return;current=next,notifyChanged()},inFlight:!1,nextAllowedAt:0},entries.set(key,entry)}return entry}return{read(key){if(!key)return cfg.initial;return entryFor(key).read()},poll(key){if(!key)return;let entry=entryFor(key);maybeStartScheduledRun(entry,cfg,(signal)=>cfg.run(key,signal),(value)=>entry.write(value))},reset(){entries.clear()}}}var GIT_TIMEOUT_MS=5000,DEFAULT_PR_PROMPT_TEMPLATE=`The user likes the current state of the code.
|
|
11
11
|
|
|
12
12
|
{{dirtyCountSentence}}
|
|
13
13
|
The current branch is {{branch}}.
|
|
@@ -25,7 +25,7 @@ Follow these steps to create a PR:
|
|
|
25
25
|
- Use \`gh pr create --base {{targetBranch}}\` to create a PR onto the target branch. Keep the title under 80 characters. If the repository has a pull request template, fill it in. Describe every change since the branch diverged from the target, not only the ones made in this session.
|
|
26
26
|
|
|
27
27
|
If any of these steps fail, ask the user for help.`;async function git2(cwd,args){let controller=new AbortController,timer=setTimeout(()=>controller.abort(),GIT_TIMEOUT_MS);try{recordSpawn("tui.prPrompt",["git",...args],cwd);let out=await spawnCapture("git",args,{cwd,env:readOnlyGitProcessEnv(),signal:controller.signal});if(controller.signal.aborted)return null;if(out.status!==0)return null;return out.stdout.trim()}finally{clearTimeout(timer)}}async function currentBranch(cwd){return await git2(cwd,["rev-parse","--abbrev-ref","HEAD"])||"HEAD"}async function targetBranch(cwd){let out=await git2(cwd,["symbolic-ref","refs/remotes/origin/HEAD","--short"]);if(!out)return"main";return out.startsWith("origin/")?out.slice(7):out}async function hasUpstream(cwd){let out=await git2(cwd,["rev-parse","--abbrev-ref","@{u}"]);return out!==null&&out.length>0}async function dirtyCount(cwd){let out=await git2(cwd,["status","--porcelain"]);if(!out)return 0;return out.split(`
|
|
28
|
-
`).filter((line)=>line.length>0).length}async function gatherPRPromptState(worktree){let[branch,target,upstream,dirty]=await Promise.all([currentBranch(worktree),targetBranch(worktree),hasUpstream(worktree),dirtyCount(worktree)]);return{branch,targetBranch:target,hasUpstream:upstream,dirtyCount:dirty}}function dirtyCountSentence(n){if(n<=0)return"There are no uncommitted changes.";if(n===1)return"There is 1 uncommitted change.";return`There are ${n} uncommitted changes.`}function upstreamSentence(hasUpstreamValue){return hasUpstreamValue?"The current branch tracks an upstream.":"There is no upstream branch yet."}function renderPRPrompt(template,state){let replacements={branch:state.branch,targetBranch:state.targetBranch,dirtyCountSentence:dirtyCountSentence(state.dirtyCount),upstreamSentence:upstreamSentence(state.hasUpstream)};return template.replace(/\{\{([a-zA-Z][a-zA-Z0-9_]*)\}\}/g,(match,key)=>Object.hasOwn(replacements,key)?replacements[key]:match)}var PR_INSTRUCTION_FILENAME="pr-instructions.md";function loadTemplate(worktree){return readFirstNonEmptyRepoFile(worktree,PR_INSTRUCTION_FILENAME)??DEFAULT_PR_PROMPT_TEMPLATE}async function buildPRPrompt(worktree,state){let resolved=state??await gatherPRPromptState(worktree);return renderPRPrompt(loadTemplate(worktree),resolved)}var SCROLLBACK_ROWS_KEY="terminal.scrollbackRows",DEFAULT_SCROLLBACK_ROWS=1000,SCROLLBACK_ROWS_MIN=100,SCROLLBACK_ROWS_MAX=1e5;function normalizeScrollbackRows(value){let n=typeof value==="number"?Math.floor(value):typeof value==="string"?Number.parseInt(value.trim(),10):Number.NaN;if(!Number.isFinite(n))return DEFAULT_SCROLLBACK_ROWS;return Math.min(SCROLLBACK_ROWS_MAX,Math.max(SCROLLBACK_ROWS_MIN,n))}function persistedScrollbackRows(){return normalizeScrollbackRows(loadStateFile()[SCROLLBACK_ROWS_KEY])}var PREFIX_TAP_PRESENTATION_KEY="hints.keyboard.prefixTapPresentation",PREFIX_TAP_PRESENTATIONS=["local","guide"],DEFAULT_PREFIX_TAP_PRESENTATION="local";function normalizePrefixTapPresentation(raw){return raw==="guide"?"guide":"local"}var COLORBLIND_KEY="appearance.colorblind",COLORBLIND_MODES=["off","on"],DEFAULT_COLORBLIND="off";function normalizeColorblind(raw){return COLORBLIND_MODES.includes(raw)?raw:"off"}import{spawn as spawn2}from"child_process";function spawnDetached(cmd,args,opts={}){try{let child=spawn2(cmd,args,{detached:!0,stdio:"ignore"});return child.on("error",(err)=>opts.onError?.(err)),child.unref(),!0}catch(err){if(opts.onError&&err instanceof Error)opts.onError(err);return!1}}import{spawn as spawn3}from"child_process";import{existsSync as existsSync3}from"fs";import{platform}from"os";function openExternally(absPath){if(!absPath)return;let plat=platform();if(plat==="linux"){if(existsSync3("/proc/sys/fs/binfmt_misc/WSLInterop")||process.env.WSL_DISTRO_NAME){spawnDetachedWithFallback("wslview",[absPath],()=>{let child=spawn3("wslpath",["-w",absPath],{stdio:["ignore","pipe","ignore"]}),out="";child.stdout?.on("data",(b)=>{out+=b.toString()}),child.on("close",(code)=>{if(code===0)spawnDetachedWithFallback("explorer.exe",[out.trim()])})});return}spawnDetachedWithFallback("xdg-open",[absPath]);return}if(plat==="darwin"){spawnDetachedWithFallback("open",[absPath]);return}if(plat==="win32"){spawnDetachedWithFallback("cmd.exe",["/c","start","",absPath]);return}}function spawnDetachedWithFallback(cmd,args,onError){spawnDetached(cmd,args,{onError:onError?()=>onError():void 0})}import{readFileSync}from"fs";var VERB_ALTERNATION=ENGINE_ACTIVITY_KINDS.join("|"),HOOK_CALL=new RegExp(String.raw`\bhook\s+(?:${VERB_ALTERNATION})\b([^"'\n]*)`,"g"),VERSION_FLAG=/--hook-version[ =]+(\d+)/,EXTENSION_VERSION=/ROVE_HOOK_VERSION=(\d+)/,EXTENSION_BANNER=/Rove activity hook/;function readHookInstallState(text,current=ROVE_HOOK_VERSION){let stamped=EXTENSION_VERSION.exec(text);if(stamped)return Number(stamped[1])===current?"installed":"outdated";if(EXTENSION_BANNER.test(text))return"outdated";let found=!1;for(let match of text.matchAll(HOOK_CALL)){found=!0;let version=VERSION_FLAG.exec(match[1]??"");if(!version||Number(version[1])!==current)return"outdated"}return found?"installed":"not-installed"}function integrationFor(vendor,adapter,issues){let entry=engineEntry(vendor),hooksSupported=adapter!==void 0,hookFile=adapter?.globalSettingsPath()??"",hookState="not-installed";if(hookFile)try{hookState=readHookInstallState(readFileSync(hookFile,"utf8"))}catch{}let configIssue=hookFile?issues.get(hookFile):void 0;return{vendor,hooksSupported,...adapter?.setupCommand?{setupCommand:adapter.setupCommand}:{},hookState,hookFile,markers:entry.createTurnDetector().supportsCompletionMarkers(),screen:entry.screenManifest!==void 0,...configIssue?{configIssue}:{}}}function engineIntegrations(vendors){let issues=new Map(hookConfigIssues().map((issue)=>[issue.file,issue.reason])),adapters=new Map(activityHookAdapters().map((adapter)=>[adapter.vendor,adapter]));return vendors.map((vendor)=>integrationFor(vendor,adapters.get(vendor),issues))}function enginesNeedingHookInstall(rows){return rows.filter((row)=>row.hooksSupported&&row.hookState!=="installed").map((row)=>row.vendor)}function enginesWithHooksInstalled(rows){return rows.filter((row)=>row.hooksSupported&&row.hookState!=="not-installed").map((row)=>row.vendor)}var GLYPH_SET_KEY="appearance.glyphSet",GLYPH_SET_NAMES=["braille","starburst","ascii"],DEFAULT_GLYPH_SET="braille";function normalizeGlyphSet(raw){return GLYPH_SET_NAMES.includes(raw)?raw:"braille"}var RUNNING_TITLE_KEY="appearance.runningTitle",RUNNING_TITLES=["shimmer","still"],DEFAULT_RUNNING_TITLE="shimmer";function normalizeRunningTitle(raw){return RUNNING_TITLES.includes(raw)?raw:"shimmer"}var SPLIT_STYLE_KEY="appearance.splitStyle",SPLIT_STYLES=["box","line","rail","rule"];function normalizeSplitStyle(value){return SPLIT_STYLES.includes(value)?value:"line"}var APPEARANCE_SETTINGS=["theme","themeMode","transparent","focusAccent","splitStyle","railFold","tabRowHeight","workingBorder","taskColors","glyphSet","colorblind","runningTitle"];function appearanceChoices(setting,themes){switch(setting){case"theme":return themes.map((value)=>({kind:setting,value}));case"themeMode":return THEME_MODE_PREFERENCES.map((value)=>({kind:setting,value}));case"transparent":return[!1,!0].map((value)=>({kind:setting,value}));case"focusAccent":return["primary","success","info"].map((value)=>({kind:setting,value}));case"splitStyle":return SPLIT_STYLES.map((value)=>({kind:setting,value}));case"railFold":return["glyphs","initials","hairline"].map((value)=>({kind:setting,value}));case"tabRowHeight":return[1,2].map((value)=>({kind:setting,value}));case"workingBorder":return WORKING_BORDERS.map((value)=>({kind:setting,value}));case"taskColors":return TASK_COLORS.map((value)=>({kind:setting,value}));case"glyphSet":return GLYPH_SET_NAMES.map((value)=>({kind:setting,value}));case"colorblind":return COLORBLIND_MODES.map((value)=>({kind:setting,value}));case"runningTitle":return RUNNING_TITLES.map((value)=>({kind:setting,value}))}}function applyAppearanceChoice(current,choice){switch(choice.kind){case"theme":return{...current,themeName:choice.value};case"themeMode":return{...current,themeMode:choice.value};case"transparent":return{...current,transparentBackground:choice.value};case"focusAccent":return{...current,focusAccent:choice.value};case"splitStyle":return{...current,splitStyle:choice.value};case"railFold":return{...current,railFoldStyle:choice.value};case"tabRowHeight":return{...current,tabRowHeight:choice.value};case"workingBorder":return{...current,workingBorder:choice.value};case"taskColors":return{...current,taskColors:choice.value};case"glyphSet":return{...current,glyphSet:choice.value};case"colorblind":return{...current,colorblind:choice.value};case"runningTitle":return{...current,runningTitle:choice.value}}}function currentAppearanceChoice(current,setting){switch(setting){case"theme":return{kind:setting,value:current.themeName};case"themeMode":return{kind:setting,value:current.themeMode};case"transparent":return{kind:setting,value:current.transparentBackground};case"focusAccent":return{kind:setting,value:current.focusAccent};case"splitStyle":return{kind:setting,value:current.splitStyle};case"railFold":return{kind:setting,value:current.railFoldStyle};case"tabRowHeight":return{kind:setting,value:current.tabRowHeight};case"workingBorder":return{kind:setting,value:current.workingBorder};case"taskColors":return{kind:setting,value:current.taskColors};case"glyphSet":return{kind:setting,value:current.glyphSet};case"colorblind":return{kind:setting,value:current.colorblind};case"runningTitle":return{kind:setting,value:current.runningTitle}}}var SECTIONS=[{id:"general",label:"General"},{id:"engines",label:"Engines"},{id:"autoRouting",label:"Auto routing"},{id:"plugins",label:"Plugins"},{id:"marketplace",label:"Marketplace"},{id:"keys",label:"Keybindings"},{id:"feedback",label:"Feedback"},{id:"dev",label:"Dev"}];function languageRowId(locale){return`language:${locale}`}function engineRowId(vendor){return`engine:${vendor}`}function autoRoutingRowId(tier){return`auto-routing:${tier}`}function prefixTapPresentationRowId(presentation){return`prefix-tap:${presentation}`}function pluginRowId(pluginId){return`plugin:${pluginId}`}function pluginSettingRowId(pluginId,key){return`plugin:${pluginId}:${key}`}function marketplaceRowId(ref){return`market:${ref}`}function generalRows(){return[...LOCALES.map((l)=>({id:languageRowId(l.id),kind:"language",locale:l.id})),...APPEARANCE_SETTINGS.map((setting)=>({id:`appearance:${setting}`,kind:"appearance",setting})),{id:"toast",kind:"toast"},{id:"sound",kind:"sound"},{id:"sound-volume",kind:"soundVolume"},{id:"cross-task",kind:"crossTask"},{id:"key-hints",kind:"keyHints"},{id:"zen-default-on",kind:"zenDefaultOn"},{id:"update-channel",kind:"updateChannel"},{id:"update-try",kind:"updateTry"},{id:"editor-kind",kind:"editorKind"},{id:"editor-custom",kind:"editorCustom"},{id:"worktree-base",kind:"worktreeBase"},{id:"worktree-custom",kind:"worktreeCustom"},{id:"scrollback-rows",kind:"scrollbackRows"},{id:"tab-strip-hide-single",kind:"tabStripHideSingle"}]}function engineRows(engineList){return[...engineList.map((vendor)=>({id:engineRowId(vendor),kind:"engine",vendor})),{id:"add-engine",kind:"engineAdd"},{id:"install-hooks",kind:"engineHooksInstall"},{id:"uninstall-hooks",kind:"engineHooksUninstall"}]}function pluginRows(plugins){return plugins.flatMap(({id,settingKeys})=>[{id:pluginRowId(id),kind:"pluginToggle",pluginId:id},...settingKeys.map((key)=>({id:pluginSettingRowId(id,key),kind:"pluginSetting",pluginId:id,key}))])}function marketplaceRows(refs){return refs.map((ref)=>({id:marketplaceRowId(ref),kind:"pluginInstall",ref}))}function autoRoutingRows(){return[...AUTO_ROUTING_TIERS.map((tier)=>({id:autoRoutingRowId(tier),kind:"autoRoutingTier",tier})),{id:"auto-routing-classifier",kind:"autoRoutingClassifier"},{id:"auto-routing-endpoint",kind:"autoRoutingClassifierEndpoint"},{id:"auto-routing-threshold",kind:"autoRoutingClassifierThreshold"},{id:"auto-routing-key",kind:"autoRoutingClassifierKey"}]}function displayEndpoint(kind,storedMode,remembered){if(kind==="url")return storedMode||remembered;if(kind==="refused")return storedMode;return remembered}function feedbackRows(){return[{id:"feedback-title",kind:"feedbackTitle"},{id:"feedback-body",kind:"feedbackBody"},{id:"feedback-send",kind:"feedbackSend"}]}function keybindingRows(keybindingsFileExists){return[...PREFIX_TAP_PRESENTATIONS.map((presentation)=>({id:prefixTapPresentationRowId(presentation),kind:"prefixTapPresentation",presentation})),...keybindingsFileExists?[]:[{id:"keys-create",kind:"keysCreate"}]]}function devRows(hasDaemon){return[{id:"dev-reset",kind:"devReset"},...hasDaemon?[{id:"dev-restart",kind:"devRestartDaemon"}]:[],{id:"dev-reload",kind:"devReloadSettings"},{id:"remote-projects",kind:"devRemoteProjects"},{id:"auto-status",kind:"devAutoStatus"},{id:"dispatcher",kind:"devDispatcher"}]}function sectionRows(section,input){switch(section){case"general":return generalRows();case"engines":return engineRows(input.engineList);case"autoRouting":return autoRoutingRows();case"keys":return keybindingRows(input.keybindingsFileExists);case"plugins":return pluginRows(input.plugins);case"marketplace":return marketplaceRows(input.marketplace);case"feedback":return feedbackRows();case"dev":return devRows(input.hasDaemon)}}function rowIndex(rows,id){return rows.findIndex((row)=>row.id===id)}function rowAt(rows,index){return rows[index]}var SECTIONS_SIDEBAR_WIDTH=14,SECTIONS_COLUMN_GAP=2,ROW_PADDING_X=2,LABEL_COLUMN_MAX=30,LABEL_NATURAL_MAX=24,HINT_MIN_CELLS=18;function generalLabelLayout(width,dialogPadX){let rowCells=width-dialogPadX*2-SECTIONS_SIDEBAR_WIDTH-SECTIONS_COLUMN_GAP-ROW_PADDING_X;if(rowCells>=LABEL_COLUMN_MAX+HINT_MIN_CELLS)return{labelColumn:LABEL_COLUMN_MAX,showHint:!0};if(rowCells>=LABEL_NATURAL_MAX+HINT_MIN_CELLS)return{labelColumn:rowCells-HINT_MIN_CELLS,showHint:!0};return{labelColumn:0,showHint:!1}}import{existsSync as existsSync4,mkdirSync as mkdirSync2,writeFileSync as writeFileSync2}from"fs";import{dirname}from"path";var KEYBINDINGS_STARTER=`# Rove keybindings \u2014 every line below is an example, commented out.
|
|
28
|
+
`).filter((line)=>line.length>0).length}async function gatherPRPromptState(worktree){let[branch,target,upstream,dirty]=await Promise.all([currentBranch(worktree),targetBranch(worktree),hasUpstream(worktree),dirtyCount(worktree)]);return{branch,targetBranch:target,hasUpstream:upstream,dirtyCount:dirty}}function dirtyCountSentence(n){if(n<=0)return"There are no uncommitted changes.";if(n===1)return"There is 1 uncommitted change.";return`There are ${n} uncommitted changes.`}function upstreamSentence(hasUpstreamValue){return hasUpstreamValue?"The current branch tracks an upstream.":"There is no upstream branch yet."}function renderPRPrompt(template,state){let replacements={branch:state.branch,targetBranch:state.targetBranch,dirtyCountSentence:dirtyCountSentence(state.dirtyCount),upstreamSentence:upstreamSentence(state.hasUpstream)};return template.replace(/\{\{([a-zA-Z][a-zA-Z0-9_]*)\}\}/g,(match,key)=>Object.hasOwn(replacements,key)?replacements[key]:match)}var PR_INSTRUCTION_FILENAME="pr-instructions.md";function loadTemplate(worktree){return readFirstNonEmptyRepoFile(worktree,PR_INSTRUCTION_FILENAME)??DEFAULT_PR_PROMPT_TEMPLATE}async function buildPRPrompt(worktree,state){let resolved=state??await gatherPRPromptState(worktree);return renderPRPrompt(loadTemplate(worktree),resolved)}var SCROLLBACK_ROWS_KEY="terminal.scrollbackRows",DEFAULT_SCROLLBACK_ROWS=1000,SCROLLBACK_ROWS_MIN=100,SCROLLBACK_ROWS_MAX=1e5;function normalizeScrollbackRows(value){let n=typeof value==="number"?Math.floor(value):typeof value==="string"?Number.parseInt(value.trim(),10):Number.NaN;if(!Number.isFinite(n))return DEFAULT_SCROLLBACK_ROWS;return Math.min(SCROLLBACK_ROWS_MAX,Math.max(SCROLLBACK_ROWS_MIN,n))}function persistedScrollbackRows(){return normalizeScrollbackRows(loadStateFile()[SCROLLBACK_ROWS_KEY])}var PREFIX_TAP_PRESENTATION_KEY="hints.keyboard.prefixTapPresentation",PREFIX_TAP_PRESENTATIONS=["local","guide"],DEFAULT_PREFIX_TAP_PRESENTATION="local";function normalizePrefixTapPresentation(raw){return raw==="guide"?"guide":"local"}var DEFAULT_SPINNER_FRAMES=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];var GLYPH_SETS={braille:{spinner:DEFAULT_SPINNER_FRAMES,idle:"\u25CB",unseen:"\u25CF",needsInput:"?",attention:"!",running:"\u25CF",done:"\u2713",rateLimited:"\u25F7",dead:"\u2020",routineFailed:"\u21BB",subagent:"\u25C7",conflict:"\u2260",checksFailing:"\u2717",checksPassing:"\u2713"},starburst:{spinner:["\u273B","\u273C","\u2749","\u274A","\u273A","\u2739","\u2738","\u2736"],idle:"\u2727",unseen:"\u2726",needsInput:"?",attention:"\u2762",running:"\u273B",done:"\u2714",rateLimited:"\u25F7",dead:"\u271E",routineFailed:"\u21BB",subagent:"\u2756",conflict:"\u2260",checksFailing:"\u2718",checksPassing:"\u2714"},ascii:{spinner:["|","/","-","\\"],idle:"o",unseen:"*",needsInput:"?",attention:"!",running:"*",done:"+",rateLimited:"~",dead:"x",routineFailed:"@",subagent:"&",conflict:"#",checksFailing:"x",checksPassing:"+"}},DEFAULT_GLYPHS=GLYPH_SETS.braille;var COLORBLIND_KEY="appearance.colorblind",COLORBLIND_MODES=["off","on"],DEFAULT_COLORBLIND="off";function normalizeColorblind(raw){return COLORBLIND_MODES.includes(raw)?raw:"off"}import{spawn as spawn2}from"child_process";function spawnDetached(cmd,args,opts={}){try{let child=spawn2(cmd,args,{detached:!0,stdio:"ignore"});return child.on("error",(err)=>opts.onError?.(err)),child.unref(),!0}catch(err){if(opts.onError&&err instanceof Error)opts.onError(err);return!1}}import{spawn as spawn3}from"child_process";import{existsSync as existsSync3}from"fs";import{platform}from"os";function openExternally(absPath){if(!absPath)return;let plat=platform();if(plat==="linux"){if(existsSync3("/proc/sys/fs/binfmt_misc/WSLInterop")||process.env.WSL_DISTRO_NAME){spawnDetachedWithFallback("wslview",[absPath],()=>{let child=spawn3("wslpath",["-w",absPath],{stdio:["ignore","pipe","ignore"]}),out="";child.stdout?.on("data",(b)=>{out+=b.toString()}),child.on("close",(code)=>{if(code===0)spawnDetachedWithFallback("explorer.exe",[out.trim()])})});return}spawnDetachedWithFallback("xdg-open",[absPath]);return}if(plat==="darwin"){spawnDetachedWithFallback("open",[absPath]);return}if(plat==="win32"){spawnDetachedWithFallback("cmd.exe",["/c","start","",absPath]);return}}function spawnDetachedWithFallback(cmd,args,onError){spawnDetached(cmd,args,{onError:onError?()=>onError():void 0})}import{readFileSync}from"fs";var VERB_ALTERNATION=ENGINE_ACTIVITY_KINDS.join("|"),HOOK_CALL=new RegExp(String.raw`\bhook\s+(?:${VERB_ALTERNATION})\b([^"'\n]*)`,"g"),VERSION_FLAG=/--hook-version[ =]+(\d+)/,EXTENSION_VERSION=/ROVE_HOOK_VERSION=(\d+)/,EXTENSION_BANNER=/Rove activity hook/;function readHookInstallState(text,current=ROVE_HOOK_VERSION){let stamped=EXTENSION_VERSION.exec(text);if(stamped)return Number(stamped[1])===current?"installed":"outdated";if(EXTENSION_BANNER.test(text))return"outdated";let found=!1;for(let match of text.matchAll(HOOK_CALL)){found=!0;let version=VERSION_FLAG.exec(match[1]??"");if(!version||Number(version[1])!==current)return"outdated"}return found?"installed":"not-installed"}function integrationFor(vendor,adapter,issues){let entry=engineEntry(vendor),hooksSupported=adapter!==void 0,hookFile=adapter?.globalSettingsPath()??"",hookState="not-installed";if(hookFile)try{hookState=readHookInstallState(readFileSync(hookFile,"utf8"))}catch{}let configIssue=hookFile?issues.get(hookFile):void 0;return{vendor,hooksSupported,...adapter?.setupCommand?{setupCommand:adapter.setupCommand}:{},hookState,hookFile,markers:entry.createTurnDetector().supportsCompletionMarkers(),screen:entry.screenManifest!==void 0,...configIssue?{configIssue}:{}}}function engineIntegrations(vendors){let issues=new Map(hookConfigIssues().map((issue)=>[issue.file,issue.reason])),adapters=new Map(activityHookAdapters().map((adapter)=>[adapter.vendor,adapter]));return vendors.map((vendor)=>integrationFor(vendor,adapters.get(vendor),issues))}function enginesNeedingHookInstall(rows){return rows.filter((row)=>row.hooksSupported&&row.hookState!=="installed").map((row)=>row.vendor)}function enginesWithHooksInstalled(rows){return rows.filter((row)=>row.hooksSupported&&row.hookState!=="not-installed").map((row)=>row.vendor)}var GLYPH_SET_KEY="appearance.glyphSet",GLYPH_SET_NAMES=["braille","starburst","ascii"],DEFAULT_GLYPH_SET="braille";function normalizeGlyphSet(raw){return GLYPH_SET_NAMES.includes(raw)?raw:"braille"}var RUNNING_TITLE_KEY="appearance.runningTitle",RUNNING_TITLES=["shimmer","still"],DEFAULT_RUNNING_TITLE="shimmer";function normalizeRunningTitle(raw){return RUNNING_TITLES.includes(raw)?raw:"shimmer"}var SPLIT_STYLE_KEY="appearance.splitStyle",SPLIT_STYLES=["box","line","rail","rule"];function normalizeSplitStyle(value){return SPLIT_STYLES.includes(value)?value:"line"}var APPEARANCE_SETTINGS=["theme","themeMode","transparent","focusAccent","splitStyle","railFold","tabRowHeight","workingBorder","taskColors","glyphSet","colorblind","runningTitle"];function appearanceChoices(setting,themes){switch(setting){case"theme":return themes.map((value)=>({kind:setting,value}));case"themeMode":return THEME_MODE_PREFERENCES.map((value)=>({kind:setting,value}));case"transparent":return[!1,!0].map((value)=>({kind:setting,value}));case"focusAccent":return["primary","success","info"].map((value)=>({kind:setting,value}));case"splitStyle":return SPLIT_STYLES.map((value)=>({kind:setting,value}));case"railFold":return["glyphs","initials","hairline"].map((value)=>({kind:setting,value}));case"tabRowHeight":return[1,2].map((value)=>({kind:setting,value}));case"workingBorder":return WORKING_BORDERS.map((value)=>({kind:setting,value}));case"taskColors":return TASK_COLORS.map((value)=>({kind:setting,value}));case"glyphSet":return GLYPH_SET_NAMES.map((value)=>({kind:setting,value}));case"colorblind":return COLORBLIND_MODES.map((value)=>({kind:setting,value}));case"runningTitle":return RUNNING_TITLES.map((value)=>({kind:setting,value}))}}function applyAppearanceChoice(current,choice){switch(choice.kind){case"theme":return{...current,themeName:choice.value};case"themeMode":return{...current,themeMode:choice.value};case"transparent":return{...current,transparentBackground:choice.value};case"focusAccent":return{...current,focusAccent:choice.value};case"splitStyle":return{...current,splitStyle:choice.value};case"railFold":return{...current,railFoldStyle:choice.value};case"tabRowHeight":return{...current,tabRowHeight:choice.value};case"workingBorder":return{...current,workingBorder:choice.value};case"taskColors":return{...current,taskColors:choice.value};case"glyphSet":return{...current,glyphSet:choice.value};case"colorblind":return{...current,colorblind:choice.value};case"runningTitle":return{...current,runningTitle:choice.value}}}function currentAppearanceChoice(current,setting){switch(setting){case"theme":return{kind:setting,value:current.themeName};case"themeMode":return{kind:setting,value:current.themeMode};case"transparent":return{kind:setting,value:current.transparentBackground};case"focusAccent":return{kind:setting,value:current.focusAccent};case"splitStyle":return{kind:setting,value:current.splitStyle};case"railFold":return{kind:setting,value:current.railFoldStyle};case"tabRowHeight":return{kind:setting,value:current.tabRowHeight};case"workingBorder":return{kind:setting,value:current.workingBorder};case"taskColors":return{kind:setting,value:current.taskColors};case"glyphSet":return{kind:setting,value:current.glyphSet};case"colorblind":return{kind:setting,value:current.colorblind};case"runningTitle":return{kind:setting,value:current.runningTitle}}}var SECTIONS=[{id:"general",label:"General"},{id:"engines",label:"Engines"},{id:"autoRouting",label:"Auto routing"},{id:"plugins",label:"Plugins"},{id:"marketplace",label:"Marketplace"},{id:"keys",label:"Keybindings"},{id:"feedback",label:"Feedback"},{id:"dev",label:"Dev"}];function languageRowId(locale){return`language:${locale}`}function engineRowId(vendor){return`engine:${vendor}`}function autoRoutingRowId(tier){return`auto-routing:${tier}`}function prefixTapPresentationRowId(presentation){return`prefix-tap:${presentation}`}function pluginRowId(pluginId){return`plugin:${pluginId}`}function pluginSettingRowId(pluginId,key){return`plugin:${pluginId}:${key}`}function marketplaceRowId(ref){return`market:${ref}`}function generalRows(){return[...LOCALES.map((l)=>({id:languageRowId(l.id),kind:"language",locale:l.id})),...APPEARANCE_SETTINGS.map((setting)=>({id:`appearance:${setting}`,kind:"appearance",setting})),{id:"toast",kind:"toast"},{id:"sound",kind:"sound"},{id:"sound-volume",kind:"soundVolume"},{id:"cross-task",kind:"crossTask"},{id:"key-hints",kind:"keyHints"},{id:"zen-default-on",kind:"zenDefaultOn"},{id:"update-channel",kind:"updateChannel"},{id:"update-try",kind:"updateTry"},{id:"editor-kind",kind:"editorKind"},{id:"editor-custom",kind:"editorCustom"},{id:"worktree-base",kind:"worktreeBase"},{id:"worktree-custom",kind:"worktreeCustom"},{id:"scrollback-rows",kind:"scrollbackRows"},{id:"tab-strip-hide-single",kind:"tabStripHideSingle"}]}function engineRows(engineList){return[...engineList.map((vendor)=>({id:engineRowId(vendor),kind:"engine",vendor})),{id:"add-engine",kind:"engineAdd"},{id:"install-hooks",kind:"engineHooksInstall"},{id:"uninstall-hooks",kind:"engineHooksUninstall"}]}function pluginRows(plugins){return plugins.flatMap(({id,settingKeys})=>[{id:pluginRowId(id),kind:"pluginToggle",pluginId:id},...settingKeys.map((key)=>({id:pluginSettingRowId(id,key),kind:"pluginSetting",pluginId:id,key}))])}function marketplaceRows(refs){return refs.map((ref)=>({id:marketplaceRowId(ref),kind:"pluginInstall",ref}))}function autoRoutingRows(){return[...AUTO_ROUTING_TIERS.map((tier)=>({id:autoRoutingRowId(tier),kind:"autoRoutingTier",tier})),{id:"auto-routing-classifier",kind:"autoRoutingClassifier"},{id:"auto-routing-endpoint",kind:"autoRoutingClassifierEndpoint"},{id:"auto-routing-threshold",kind:"autoRoutingClassifierThreshold"},{id:"auto-routing-key",kind:"autoRoutingClassifierKey"}]}function displayEndpoint(kind,storedMode,remembered){if(kind==="url")return storedMode||remembered;if(kind==="refused")return storedMode;return remembered}function feedbackRows(){return[{id:"feedback-title",kind:"feedbackTitle"},{id:"feedback-body",kind:"feedbackBody"},{id:"feedback-send",kind:"feedbackSend"}]}function keybindingRows(keybindingsFileExists){return[...PREFIX_TAP_PRESENTATIONS.map((presentation)=>({id:prefixTapPresentationRowId(presentation),kind:"prefixTapPresentation",presentation})),...keybindingsFileExists?[]:[{id:"keys-create",kind:"keysCreate"}]]}function devRows(hasDaemon){return[{id:"dev-reset",kind:"devReset"},...hasDaemon?[{id:"dev-restart",kind:"devRestartDaemon"}]:[],{id:"dev-reload",kind:"devReloadSettings"},{id:"remote-projects",kind:"devRemoteProjects"},{id:"auto-status",kind:"devAutoStatus"},{id:"dispatcher",kind:"devDispatcher"}]}function sectionRows(section,input){switch(section){case"general":return generalRows();case"engines":return engineRows(input.engineList);case"autoRouting":return autoRoutingRows();case"keys":return keybindingRows(input.keybindingsFileExists);case"plugins":return pluginRows(input.plugins);case"marketplace":return marketplaceRows(input.marketplace);case"feedback":return feedbackRows();case"dev":return devRows(input.hasDaemon)}}function rowIndex(rows,id){return rows.findIndex((row)=>row.id===id)}function rowAt(rows,index){return rows[index]}var SECTIONS_SIDEBAR_WIDTH=14,SECTIONS_COLUMN_GAP=2,ROW_PADDING_X=2,LABEL_COLUMN_MAX=30,LABEL_NATURAL_MAX=24,HINT_MIN_CELLS=18;function generalLabelLayout(width,dialogPadX){let rowCells=width-dialogPadX*2-SECTIONS_SIDEBAR_WIDTH-SECTIONS_COLUMN_GAP-ROW_PADDING_X;if(rowCells>=LABEL_COLUMN_MAX+HINT_MIN_CELLS)return{labelColumn:LABEL_COLUMN_MAX,showHint:!0};if(rowCells>=LABEL_NATURAL_MAX+HINT_MIN_CELLS)return{labelColumn:rowCells-HINT_MIN_CELLS,showHint:!0};return{labelColumn:0,showHint:!1}}import{existsSync as existsSync4,mkdirSync as mkdirSync2,writeFileSync as writeFileSync2}from"fs";import{dirname}from"path";var KEYBINDINGS_STARTER=`# Rove keybindings \u2014 every line below is an example, commented out.
|
|
29
29
|
# Uncomment what you want; changes reload live, no restart.
|
|
30
30
|
# Press F1 in Rove for the live keymap with every binding id.
|
|
31
31
|
#
|
|
@@ -43,7 +43,7 @@ If any of these steps fail, ask the user for help.`;async function git2(cwd,args
|
|
|
43
43
|
# darwin: # platform overlay (also: linux)
|
|
44
44
|
# bindings:
|
|
45
45
|
# palette.open: [cmd+p, ctrl+p]
|
|
46
|
-
`;function createKeybindingsFile(path){if(existsSync4(path))return!1;return mkdirSync2(dirname(path),{recursive:!0}),writeFileSync2(path,KEYBINDINGS_STARTER),!0}import{randomUUID}from"crypto";import{existsSync as existsSync5}from"fs";import{join as join3}from"path";function formatDiffComment(c,stale=!1){let escaped=c.body.replace(/\\/g,"\\\\").replace(/"/g,"\\\"").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),location=c.startLine!==void 0&&c.startLine!==c.line?`Lines: ${c.startLine}-${c.line}`:`Line: ${c.line}`,staleNote=stale?["Note: this path is no longer in the branch \u2014 it was renamed or deleted after the note was written."]:[];return[`File: ${c.filePath}`,location,...staleNote,`User comment: "${escaped}"`].join(`
|
|
46
|
+
`;function createKeybindingsFile(path){if(existsSync4(path))return!1;return mkdirSync2(dirname(path),{recursive:!0}),writeFileSync2(path,KEYBINDINGS_STARTER),!0}function prChip(task,glyphs=DEFAULT_GLYPHS){let pr=task.prStatus;if(!pr)return null;let stale=pr.lastError!==void 0;if((pr.mergeable??"").toUpperCase()==="CONFLICTING")return{glyph:glyphs.conflict,tone:stale?"textMuted":"error"};if(pr.checkState==="failing")return{glyph:glyphs.checksFailing,tone:stale?"textMuted":"error"};if(pr.checkState==="passing")return{glyph:glyphs.checksPassing,tone:stale?"textMuted":"success"};return null}import{randomUUID}from"crypto";import{existsSync as existsSync5}from"fs";import{join as join3}from"path";function formatDiffComment(c,stale=!1){let escaped=c.body.replace(/\\/g,"\\\\").replace(/"/g,"\\\"").replace(/\r/g,"\\r").replace(/\n/g,"\\n"),location=c.startLine!==void 0&&c.startLine!==c.line?`Lines: ${c.startLine}-${c.line}`:`Line: ${c.line}`,staleNote=stale?["Note: this path is no longer in the branch \u2014 it was renamed or deleted after the note was written."]:[];return[`File: ${c.filePath}`,location,...staleNote,`User comment: "${escaped}"`].join(`
|
|
47
47
|
`)}function formatDiffComments(comments,worktreePath){return comments.map((c)=>formatDiffComment(c,worktreePath?!existsSync5(join3(worktreePath,c.filePath)):!1)).join(`
|
|
48
48
|
|
|
49
49
|
`)}function unsentComments(comments){return comments.filter((c)=>c.sentAt===void 0)}function markAllSent(comments,now){return comments.map((c)=>c.sentAt===void 0?{...c,sentAt:now}:c)}var HUNK_HEADER=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/;function unifiedDiffRows(diff){let rows=[],oldLine=0,newLine=0,inHunk=!1;for(let line of diff.split(`
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var TOP_LEVEL_SUBCOMMANDS=["completions","add","remove","adopt","export","repo","api","daemon","machine","weixin","doctor","config","reset","theme","skill","plugin","feedback","update"],SUBCOMMAND_VERBS={daemon:["status","start","stop","restart","relay"],machine:["add","doctor","remove","list"],plugin:["install","link","list","search","outdated","update","enable","disable","unlink","uninstall","config-dir","log","action","pane"],repo:["show","set","unset"],skill:["install","status","command","print"],theme:["list","add","remove"],weixin:["login","logout","status","allow","deny"]};
|
|
3
|
+
export{TOP_LEVEL_SUBCOMMANDS,SUBCOMMAND_VERBS};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{submitFeedback}from"./chunk-
|
|
2
|
+
import{submitFeedback}from"./chunk-fg55dc4s.js";import"./chunk-74e3k701.js";import"./chunk-prqeddy7.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-b39sdtt0.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";import{readFileSync}from"fs";var CLI_NAME=ROVE_PRODUCT_NAME,FEEDBACK_USAGE=[`Usage: ${CLI_NAME} feedback --title <text> (--body <text> | --body-file <path>) [--category <slug>]`,"","Create a GitHub Discussion in the Rove repository using the GitHub CLI.","","Requires:"," gh auth login","","Options:"," --title <text> Discussion title"," --body <text> Discussion body"," --body-file <path> Read the Discussion body from a file; use - for stdin"," --category <slug> Discussion category slug (default: feedback)"," -h, --help Print this help",""].join(`
|
|
3
3
|
`);function usageError(message){process.stderr.write(`${CLI_NAME} feedback: ${message}
|
|
4
4
|
|
|
5
5
|
${FEEDBACK_USAGE}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{deriveTitleFromPrompt}from"./chunk-cbc1h345.js";import{TaskDeletingError}from"./chunk-jjv7xem7.js";import{awaitEngineProcess,buildEngineSessionLaunch,deliverToHostedKey,enginePresence,ensureHostedEngine,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,killHostedSessions,listHostedSessions,openHostedSessionHost,pastePromptWhenEngineUp,trustEngineWorktree}from"./chunk-
|
|
2
|
+
import{deriveTitleFromPrompt}from"./chunk-cbc1h345.js";import{TaskDeletingError}from"./chunk-jjv7xem7.js";import{awaitEngineProcess,buildEngineSessionLaunch,deliverToHostedKey,enginePresence,ensureHostedEngine,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,killHostedSessions,listHostedSessions,openHostedSessionHost,pastePromptWhenEngineUp,trustEngineWorktree}from"./chunk-5a3c9fnd.js";import{engineLaunchArgv,protocolEntry}from"./chunk-kqdq5g1x.js";import{resolveLoginShell}from"./chunk-f5n0tgky.js";import{DEFAULT_TASK_VENDOR}from"./chunk-xy8be792.js";var MAX_SESSIONS_SCANNED=8;function titleFromMessages(messages){let firstUser=messages.find((m)=>m.role==="user");if(!firstUser)return"";let text=firstUser.blocks.filter((b)=>b.type==="text").map((b)=>b.text).join(" "),title=deriveTitleFromPrompt(text);return title.length>0?Buffer.from(title,"utf8").toString("utf8"):title}async function deriveTitleFromSession(worktree,vendor=DEFAULT_TASK_VENDOR){if(!worktree)return"";let{history}=protocolEntry(vendor),ids=await history.listSessionIdsForWorktree(worktree);for(let sessionId of ids.slice(0,MAX_SESSIONS_SCANNED)){let title=titleFromMessages(await history.readHistory(sessionId));if(title)return title}return""}async function deriveTitleFromSessionId(vendor,sessionId){if(!sessionId)return"";try{return titleFromMessages(await protocolEntry(vendor).history.readHistory(sessionId))}catch{return""}}async function getTask(link,taskId){let{task}=await link.request("task.get",{taskId});return task}async function ensureTaskWorktree(link,taskId){let task=await getTask(link,taskId);if(task.deletion)throw new TaskDeletingError(taskId);if(task.worktreePath)return{task,worktreePath:task.worktreePath};let{worktreePath}=await link.request("task.ensureWorktree",{taskId});if(!worktreePath)throw Error(`task ${taskId} has no worktree`);return{task,worktreePath}}async function ensureTaskSessionAdapter(link,taskId){let{task,worktreePath}=await ensureTaskWorktree(link,taskId),launch=taskEngineLaunch(task,worktreePath,{kind:"repo-init"}),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)throw Error(`failed to start hosted engine session for ${taskId}`);if(launch.firstMessage){let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model})[0];await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs}).catch(()=>!1)}}finally{host.close()}return{session:launch.key,worktreePath}}async function startTaskSessionWithPromptAdapter(link,taskId,prompt){let{task,worktreePath}=await ensureTaskWorktree(link,taskId);await link.request("task.observeLanguage",{taskId,text:prompt}).catch(()=>{});let launch=taskEngineLaunch(task,worktreePath,{kind:"new-task",prompt}),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)return{started:!1,error:"hosted session did not open"};let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model})[0],wait={initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs};if(launch.firstMessage){if(await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}if(await awaitEngineProcess(host.rpc,launch.key,engineBin,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}finally{host.close()}}async function startFailureReason(rpc,key){let tail=await hostedSessionFailureLine(rpc,key),base="engine process never started";return tail?`engine process never started; last session output: ${tail}`:"engine process never started"}function taskEngineLaunch(task,worktreePath,promptIntent){return trustEngineWorktree(task.vendor,worktreePath),buildEngineSessionLaunch({task:{id:task.id,kind:task.kind,vendor:task.vendor,repo:task.repo},worktreePath,shell:resolveLoginShell({fallback:"/bin/zsh"}),argv:engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort,model:task.model}),promptIntent})}async function deliverPromptToLiveEngineAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return!1;try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0]);if(!key)return!1;let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return!1;return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})!==null}catch{return!1}finally{host.close()}}function tabIdFromHostedKey(key){return key.split("::")[1]??"tab-1"}async function deliverPromptToLiveEngineDetailedAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0]);if(!key)return{outcome:"no-session"};let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:tabIdFromHostedKey(key)};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:tabIdFromHostedKey(key)}}catch{return{outcome:"no-session"}}finally{host.close()}}async function deliverPromptToLiveEngineTabDetailedAdapter(target,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let key=`${target.id}::${target.tabId}`,sessions;try{sessions=await listHostedSessions(host.rpc)}catch{return{outcome:"no-session"}}let session=sessions.find((candidate)=>candidate.alive&&candidate.key===key);if(!session)return{outcome:"no-session"};let engineArgv=engineLaunchArgv({command:target.command,vendor:target.vendor}),presence=await enginePresence(session.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:target.tabId};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:target.tabId}}finally{host.close()}}async function tearDownTaskSessionAdapter(taskId){let host=await openHostedSessionHost();if(!host)return;try{await killHostedSessions(host.rpc,hostedTaskKeys(await listHostedSessions(host.rpc),taskId),{wait:!0})}catch{}finally{host.close()}}
|
|
3
3
|
export{deriveTitleFromSession,deriveTitleFromSessionId,ensureTaskSessionAdapter,startTaskSessionWithPromptAdapter,deliverPromptToLiveEngineAdapter,deliverPromptToLiveEngineDetailedAdapter,deliverPromptToLiveEngineTabDetailedAdapter,tearDownTaskSessionAdapter};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{activityHookAdapters}from"./chunk-
|
|
2
|
+
import{activityHookAdapters}from"./chunk-h5znx9v9.js";import{readFileSync}from"fs";function hookConfigIssues(){let issues=[];for(let adapter of activityHookAdapters()){if(!adapter.hookConfigRefusal)continue;let file=adapter.globalSettingsPath();if(!file)continue;let raw;try{raw=readFileSync(file,"utf8")}catch{continue}let reason=adapter.hookConfigRefusal(raw);if(reason)issues.push({file,reason})}return issues}
|
|
3
3
|
export{hookConfigIssues};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{engineEntry,identifiableEngineIds}from"./chunk-
|
|
2
|
+
import{engineEntry,identifiableEngineIds}from"./chunk-h5znx9v9.js";import{recordSpawn}from"./chunk-40dgv828.js";import{loadStateFile}from"./chunk-g4281a0g.js";import{PsProbeUnavailableError}from"./chunk-pxk2c2vj.js";import{__require}from"./chunk-91sykzqq.js";import{basename}from"path";var WRAPPERS=new Set(["node","bun","npx","deno","sh","zsh","bash","env","script"]);function binaryName(token){return basename(token).replace(/\.(exe|js|mjs|cjs)$/,"")}function executableNameFromArgv(argv){for(let token of argv.slice(0,8)){if(/^[A-Za-z_][A-Za-z0-9_]*=/.test(token))continue;let name=binaryName(token);if(WRAPPERS.has(name))continue;return name||null}return null}function vendorFromArgv(commandLine){let name=executableNameFromArgv(commandLine.trim().split(/\s+/));if(!name)return null;return identifiableEngineIds().find((v)=>{let entry=engineEntry(v);return entry.defaultCommand[0]===name||entry.processNames?.includes(name)===!0})??null}function parsePsSnapshot(text){let rows=[];for(let line of text.split(`
|
|
3
3
|
`)){let m=/^\s*(\d+)\s+(\d+)\s+(\S.*)$/.exec(line);if(m)rows.push({pid:Number(m[1]),ppid:Number(m[2]),args:m[3]})}return rows}function childrenIndex(rows){let kids=new Map;for(let row of rows){let list=kids.get(row.ppid);if(list)list.push(row);else kids.set(row.ppid,[row])}return kids}function hasAncestor(rows,pid,ancestorPid){let parents=new Map(rows.map((r)=>[r.pid,r.ppid])),cur=pid;for(let hops=0;hops<=rows.length;hops++){if(cur===ancestorPid)return!0;let next=parents.get(cur);if(next===void 0||next<=1)return!1;cur=next}return!1}function customEngineBinaries(){let state=loadStateFile(),ids=state.customEngineIds,out=new Map;if(!Array.isArray(ids))return out;for(let id of ids){if(typeof id!=="string"||id.trim().length===0)continue;let command=state[`engineCommand.${id}`],argv=typeof command==="string"&&command.trim().length>0?command.trim().split(/\s+/):[id],name=executableNameFromArgv(argv);if(name)out.set(name,id)}return out}function findDescendant(rows,rootPid,pick){let kids=childrenIndex(rows),queue=[...kids.get(rootPid)??[]],visited=new Set;while(queue.length>0){let row=queue.shift();if(!row)break;if(visited.has(row.pid))continue;visited.add(row.pid);let hit=pick(row);if(hit!==null)return hit;queue.push(...kids.get(row.pid)??[])}return null}function walkDescendants(rows,rootPid,identify){return findDescendant(rows,rootPid,(row)=>{let vendor=identify(row.args);return vendor?{vendor,argv:row.args,pid:row.pid}:null})}function foregroundEngineIn(rows,rootPid){let builtin=walkDescendants(rows,rootPid,vendorFromArgv);if(builtin)return builtin;let custom=customEngineBinaries();if(custom.size===0)return null;return walkDescendants(rows,rootPid,(args)=>custom.get(executableNameFromArgv(args.trim().split(/\s+/))??"")??null)}function engineProcessIn(rows,rootPid,extraLaunch){if(foregroundEngineIn(rows,rootPid))return!0;let expected=extraLaunch?executableNameFromArgv(typeof extraLaunch==="string"?[extraLaunch]:extraLaunch):null;if(!expected)return!1;return findDescendant(rows,rootPid,(row)=>executableNameFromArgv(row.args.trim().split(/\s+/))===expected?!0:null)===!0}var PS_PROBE_TIMEOUT_MS=5000,bunPsSpawn=()=>{recordSpawn("engine.foregroundWalk",["ps","-A","-o","pid=,ppid=,args="]);let proc=Bun.spawn(["ps","-A","-o","pid=,ppid=,args="],{stdout:"pipe",stderr:"ignore"});return{text:new Response(proc.stdout).text(),kill:()=>proc.kill()}};async function psSnapshotWith(spawn,timeoutMs=PS_PROBE_TIMEOUT_MS){let proc=spawn(),timer;try{let text=await Promise.race([proc.text,new Promise((_resolve,reject)=>{timer=setTimeout(()=>{try{proc.kill()}catch{}reject(new PsProbeUnavailableError(`ps did not answer within ${timeoutMs}ms`))},timeoutMs)})]);if(parsePsSnapshot(text).length===0)throw new PsProbeUnavailableError("ps returned no usable rows");return text}finally{if(timer)clearTimeout(timer)}}var psSnapshot=async(anchors)=>{if(process.platform!=="win32")return psSnapshotWith(bunPsSpawn);let{defaultWinProcessProbe,winProcessSnapshot}=await import("./chunk-14f459aa.js");return winProcessSnapshot(anchors??[],defaultWinProcessProbe())};async function foregroundEngine(rootPid,snapshot=psSnapshot){try{return foregroundEngineIn(parsePsSnapshot(await snapshot([rootPid])),rootPid)}catch{return null}}
|
|
4
4
|
export{vendorFromArgv,parsePsSnapshot,hasAncestor,foregroundEngineIn,engineProcessIn,PS_PROBE_TIMEOUT_MS,psSnapshotWith,psSnapshot,foregroundEngine};
|
package/dist/cli/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
import{matchPathGlob}from"./chunk-kg11c1py.js";import{failureHint}from"./chunk-
|
|
3
|
+
import{matchPathGlob}from"./chunk-kg11c1py.js";import{failureHint}from"./chunk-wqcs5mz0.js";import{switchFlag}from"./chunk-zsfyj36g.js";import{connectIfRunning}from"./chunk-r1epx453.js";import"./chunk-m3773n9n.js";import"./chunk-c7j05xps.js";import{expandTilde}from"./chunk-ag3txfg2.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{BUILTIN_VENDORS,coerceVendorId,isBuiltinVendor}from"./chunk-h2m7em1e.js";import{CURRENT_VERSION}from"./chunk-74e3k701.js";import{rejectionReason}from"./chunk-3342qzve.js";import"./chunk-wqckm0k6.js";import"./chunk-prqeddy7.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-yt15y085.js";import"./chunk-2676cb62.js";import"./chunk-q07r6hf7.js";import"./chunk-cmp64q4j.js";import"./chunk-6ks6s8b2.js";import"./chunk-fq3s9q62.js";import"./chunk-gskbzgc3.js";import{pathSyntax}from"./chunk-pn5ygqn6.js";import"./chunk-n0rtj4z7.js";import"./chunk-b39sdtt0.js";import"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";import{resolve as resolve2}from"path";function debugEnabled(env){return env.ROVE_DEBUG==="1"||env.ROVE_DEBUG==="1"}function failureSubject(cliName,argv){let verb=argv[2];return verb&&!verb.startsWith("-")&&!verb.includes("/")?`${cliName} ${verb}`:cliName}function summarizeCliGitError(message,cwd){if(!/not a git repository/i.test(message))return null;return`${cwd} is not a git repository \u2014 run this inside one, or pass a repo path.`}function formatCliFailure(err,opts){let subject=failureSubject(opts.cliName,opts.argv);if(debugEnabled(opts.env))return`${subject}: ${String(err instanceof Error?err.stack??err:err)}
|
|
4
4
|
${failureHint(err,opts.cliName)}`;let raw=errorMessage(err),git=summarizeCliGitError(raw,opts.cwd);return`${subject}: ${git??`${raw}
|
|
5
|
-
${failureHint(err,opts.cliName)}`}`}var DYNAMIC_COMMANDS=new Map([["completions",async(args)=>{let{runCompletionsSubcommand}=await import("./chunk-
|
|
6
|
-
`),process.exit(1);let projectRoot=await projectRootFor(dir);await withDaemonOrLocal({daemon:async(client)=>{let taskId;if(projectRoot)taskId=(await client.request("task.ensureMain",{repo:projectRoot})).task.id;else taskId=(await client.request("task.openDir",{dir})).taskId;await client.request("task.setActive",{taskId})},local:async(orch)=>{let task=projectRoot?await orch.ensureMainTask(projectRoot):await orch.openDirectoryTask({dir}),{writeLastActiveTaskId}=await import("./chunk-z6y4cg73.js");writeLastActiveTaskId(String(task.id))}});let{publishRoveTerminalTitle}=await import("./chunk-g8wrdp7n.js");publishRoveTerminalTitle();let{launchTui}=await import("./chunk-
|
|
5
|
+
${failureHint(err,opts.cliName)}`}`}var DYNAMIC_COMMANDS=new Map([["completions",async(args)=>{let{runCompletionsSubcommand}=await import("./chunk-qwhajjyw.js");await runCompletionsSubcommand(args)}],["export",async(args)=>{let{runExportSubcommand}=await import("./chunk-3x0ryj15.js");await runExportSubcommand(args)}],["repo",async(args)=>{let{runRepoSubcommand}=await import("./chunk-dc3n6nf7.js");await runRepoSubcommand(args)}],["api",async(args)=>{let{runApiSubcommand}=await import("./chunk-mgx6w27b.js");await runApiSubcommand(args)}],["update",async(args)=>{let{runUpdateSubcommand}=await import("./chunk-31h3d4re.js");await runUpdateSubcommand(args)}],["theme",async(args)=>{let{runThemeSubcommand}=await import("./chunk-nxdm60xy.js");await runThemeSubcommand(args)}],["feedback",async(args)=>{let{runFeedbackSubcommand}=await import("./chunk-z5evzj1q.js");await runFeedbackSubcommand(args)}],["daemon",async(args)=>{let{runDaemonSubcommand}=await import("./chunk-karefnj8.js");await runDaemonSubcommand(args)}],["machine",async(args)=>{let{runMachineSubcommand}=await import("./chunk-53p99fe7.js");await runMachineSubcommand(args)}],["weixin",async(args)=>{let{runChannelCli}=await import("./chunk-edrw4tby.js");await runChannelCli("weixin",args)}],["doctor",async(args)=>{let{runDoctorSubcommand}=await import("./chunk-6an1v8vq.js");await runDoctorSubcommand(args)}],["config",async(args)=>{let{runConfigSubcommand}=await import("./chunk-wch6y5bd.js");await runConfigSubcommand(args)}],["reset",async(args)=>{let{runResetSubcommand}=await import("./chunk-rcqckj34.js");await runResetSubcommand(args)}],["pty-host",async(args)=>{let{runPtyHostSubcommand}=await import("./chunk-vznz1yf0.js");await runPtyHostSubcommand(args)}],["skill",async(args)=>{let{runSkillSubcommand}=await import("./chunk-m5kxc6m3.js");await runSkillSubcommand(args)}],["plugin",async(args)=>{let{runPluginSubcommand}=await import("./chunk-65kx9ksj.js");await runPluginSubcommand(args)}],["hook",async(args)=>{let{runHookSubcommand}=await import("./chunk-esk09jfb.js");await runHookSubcommand(args)}]]);import{statSync}from"fs";import{resolve}from"path";async function openLocalOrchestrator(){let{TaskIndexStore}=await import("./chunk-m86qk3za.js"),{GitWorktreeManager}=await import("./chunk-x2xk1hpy.js"),{Orchestrator}=await import("./chunk-rn3cyff1.js"),store=new TaskIndexStore;return await store.load(),new Orchestrator({store,worktrees:new GitWorktreeManager})}async function withDaemonOrLocal(bridge){let client=await connectIfRunning();if(client)try{return await bridge.daemon(client)}finally{client.close()}let orch=await openLocalOrchestrator();return bridge.local(orch)}function isPathLikeArg(arg){return arg==="."||arg===".."||arg.startsWith("./")||arg.startsWith("../")||arg.startsWith(".\\")||arg.startsWith("..\\")||pathSyntax(arg).isAbsolute(arg)||arg.startsWith("/")||arg==="~"||arg.startsWith("~/")||arg.startsWith("~\\")}async function projectRootFor(dir){let{isGitRepo,resolveRepoRoot}=await import("./chunk-zfyf3fdj.js"),{projectRejection}=await import("./chunk-4z01vg3t.js"),top=resolveRepoRoot(dir);if(top!==dir)return null;return projectRejection(top,isGitRepo,"explicit")?null:top}async function runOpenDirectory(arg){let dir=resolve(process.cwd(),expandTilde(arg)),isDir=!1;try{isDir=statSync(dir).isDirectory()}catch{isDir=!1}if(!isDir)process.stderr.write(`${ROVE_PRODUCT_NAME}: "${arg}" is not a directory (resolved to ${dir}).
|
|
6
|
+
`),process.exit(1);let projectRoot=await projectRootFor(dir);await withDaemonOrLocal({daemon:async(client)=>{let taskId;if(projectRoot)taskId=(await client.request("task.ensureMain",{repo:projectRoot})).task.id;else taskId=(await client.request("task.openDir",{dir})).taskId;await client.request("task.setActive",{taskId})},local:async(orch)=>{let task=projectRoot?await orch.ensureMainTask(projectRoot):await orch.openDirectoryTask({dir}),{writeLastActiveTaskId}=await import("./chunk-z6y4cg73.js");writeLastActiveTaskId(String(task.id))}});let{publishRoveTerminalTitle}=await import("./chunk-g8wrdp7n.js");publishRoveTerminalTitle();let{launchTui}=await import("./chunk-4t1dvw2h.js");await launchTui()}function topLevelUsage(cliName=ROVE_PRODUCT_NAME){return[`${cliName} ${CURRENT_VERSION}`,"",`Usage: ${cliName} [command] [options]`,"","Run with no command to launch PureTUI.",`Run \`${cliName} .\` (or \`${cliName} <path>\`) to open a directory as a standalone task.`,"","Commands:"," completions <shell> Generate shell completion script (bash/zsh/fish)"," add [path] Save a repo path for the new-task picker"," remove [path] Forget a saved project (inverse of add; non-destructive)"," adopt [glob] Import existing git worktrees as tasks"," export [--csv|--json] Print the task list (json/csv/table; daemon-free)"," repo <verb> Per-repo init script + first prompt (show|set|unset)",` api <verb> Scriptable RPC surface for agents (see \`${cliName} api --help\`)`," daemon <verb> Manage the daemon (start|stop|status|restart)"," machine <verb> Other computers running Rove (add|doctor|remove|list)"," weixin <verb> Talk to Rove from WeChat (login|logout|status|allow|deny)"," doctor [--report|--fix] Diagnose daemon/PTY/engines/git; --fix walks the remedies",` config [--path] Open ${cliName}'s config file (state.json) in your editor`," reset [--hard] Stop runtimes; optionally wipe task/UI state"," theme <verb> Manage user themes (list|add|remove)",` skill <verb> Install the ${cliName} agent skill (install|status|command|print)`," plugin <verb> Install and run plugins (install|link|list|action|\u2026)"," feedback Send feedback to GitHub Discussions",` update [version|channel|list] Self-update ${cliName}, switch channel, or list versions`,"","Options:"," -v, --version Print version"," -h, --help Print this help"," --skill Print the agent skill file and exit"," --web [bridge flags] Serve the browser client on 127.0.0.1 and print its link"].join(`
|
|
7
7
|
`)}var CLI_NAME=ROVE_PRODUCT_NAME,ADD_USAGE=[`Usage: ${CLI_NAME} add [path]`,` ${CLI_NAME} add --remote --host <host> --user <user> --path <basePath> [--port N] [--key [path] | --password]`,"","Save a repo for the new-task picker. With --remote, register an SSH-backed","project whose worktrees live on <host>; engine launch over SSH is pending.",""].join(`
|
|
8
8
|
`);async function runAddSubcommand(rest){let arg=rest[0];if(arg==="--help"||arg==="-h"||arg==="help"){process.stdout.write(ADD_USAGE);return}if(arg==="--remote"){let{runAddRemote}=await import("./chunk-vpj3gw8b.js");await runAddRemote(rest.slice(1));return}if(arg?.startsWith("-"))process.stderr.write(`${CLI_NAME} add: unknown flag "${arg}"
|
|
9
9
|
|
|
@@ -26,4 +26,4 @@ ${ADOPT_USAGE}
|
|
|
26
26
|
pass a path glob to adopt, e.g. ${CLI_NAME} adopt '${repo}/*' --yes`);return}let matched=worktrees.filter(isMatch);if(matched.length===0){console.log(`
|
|
27
27
|
no worktrees match glob ${JSON.stringify(glob)}`);return}if(!yes){console.log(`
|
|
28
28
|
${matched.length} worktree(s) match \u2014 re-run with --yes to adopt them`);return}await adoptWorktreesInto(orch,repo,matched,vendor),console.log(`done \u2014 adopted ${matched.length} worktree(s)`)}function printTopLevelUsage(out){out.write(`${topLevelUsage()}
|
|
29
|
-
`)}var COMMANDS=new Map([["add",runAddSubcommand],["remove",runRemoveSubcommand],["adopt",runAdoptSubcommand],...DYNAMIC_COMMANDS]);async function main(){let[,,...rawArgs]=process.argv,[subcommand,...rest]=rawArgs;if(subcommand==="--version"||subcommand==="-v"||subcommand==="version"){let{CURRENT_VERSION:CURRENT_VERSION2}=await import("./chunk-
|
|
29
|
+
`)}var COMMANDS=new Map([["add",runAddSubcommand],["remove",runRemoveSubcommand],["adopt",runAdoptSubcommand],...DYNAMIC_COMMANDS]);async function main(){let[,,...rawArgs]=process.argv,[subcommand,...rest]=rawArgs;if(subcommand==="--version"||subcommand==="-v"||subcommand==="version"){let{CURRENT_VERSION:CURRENT_VERSION2}=await import("./chunk-3ds88mym.js");console.log(`${CLI_NAME} ${CURRENT_VERSION2}`);return}if(subcommand==="--help"||subcommand==="-h"||subcommand==="help"){printTopLevelUsage(process.stdout);return}if(subcommand==="--skill"){let{runSkillSubcommand}=await import("./chunk-m5kxc6m3.js");await runSkillSubcommand(["print"]);return}if(subcommand==="--web"){let{runWebSubcommand}=await import("./chunk-1bfcy0n9.js");await runWebSubcommand(rest);return}let handler=subcommand!==void 0?COMMANDS.get(subcommand):void 0;if(handler){await handler(rest);return}if(subcommand!==void 0&&isPathLikeArg(subcommand)){await runOpenDirectory(subcommand);return}if(subcommand!==void 0)console.error(`${CLI_NAME}: unknown command '${subcommand}'`),printTopLevelUsage(process.stderr),process.exit(2);let{publishRoveTerminalTitle}=await import("./chunk-g8wrdp7n.js");publishRoveTerminalTitle();let{launchTui}=await import("./chunk-4t1dvw2h.js");await launchTui()}main().catch((err)=>{console.error(formatCliFailure(err,{cliName:CLI_NAME,argv:process.argv,cwd:process.cwd(),env:process.env})),process.exit(1)});
|
|
@@ -706,6 +706,9 @@ function ensureOwnerOnlyStateDir(homeDir) {
|
|
|
706
706
|
return ensureOwnerOnlyDir(join5(homeDir, ROVE_STATE_DIR_BASENAME));
|
|
707
707
|
}
|
|
708
708
|
|
|
709
|
+
// ../rove-daemon/src/repo-id.ts
|
|
710
|
+
var memo = new Map;
|
|
711
|
+
|
|
709
712
|
// ../rove-daemon/src/daemon/automation-contracts.ts
|
|
710
713
|
var ROUTINE_RESPONSE_WINDOW_MS = 2 * 60 * 60000;
|
|
711
714
|
// ../rove-daemon/src/daemon/delivery-contracts.ts
|
|
@@ -721,6 +724,7 @@ var ALLOWED = {
|
|
|
721
724
|
var DAEMON_CHANNELS = [
|
|
722
725
|
"task.snapshot",
|
|
723
726
|
"issue.snapshot",
|
|
727
|
+
"tabs.changed",
|
|
724
728
|
"active-task",
|
|
725
729
|
"update",
|
|
726
730
|
"engine-state",
|
package/dist/cli/rove.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{join as l}from"node:path";import{createInterface as a}from"node:readline/promises";import{pathToFileURL as ss}from"node:url";import{spawnSync as Q}from"node:child_process";import{constants as e,accessSync as V}from"node:fs";import{homedir as R}from"node:os";import{basename as o,delimiter as I,dirname as U,join as y}from"node:path";import{fileURLToPath as T}from"node:url";var H={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.
|
|
2
|
+
import{join as l}from"node:path";import{createInterface as a}from"node:readline/promises";import{pathToFileURL as ss}from"node:url";import{spawnSync as Q}from"node:child_process";import{constants as e,accessSync as V}from"node:fs";import{homedir as R}from"node:os";import{basename as o,delimiter as I,dirname as U,join as y}from"node:path";import{fileURLToPath as T}from"node:url";var H={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.262",description:"Rove — the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",keywords:["terminal","tui","cli","multiplexer","ai-agents","coding-agent","ai-coding-assistant","agentic-ai","parallel-agents","git-worktree","claude-code","codex","llm","developer-tools"],type:"module",packageManager:"bun@1.3.13",bin:{rove:"dist/cli/rove.js"},files:["dist/cli","dist/completions","dist/web","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://rove.run",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:mock":"ROVE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:rubric":"bun run scripts/build-tier-rubric.ts",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"ROVE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"ROVE_INCLUDE_SOCKET=1 ROVE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"ROVE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun scripts/render-track.mjs",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0",react:"^19.2.8","smol-toml":"^1.7.1",ws:"^8.21.3"},optionalDependencies:{"node-pty":"^1.1.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/rove-daemon":"0.7.22","@tsconfig/bun":"1.0.11","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","react-devtools-core":"^7.0.1","rove-bridge":"0.0.23","rove-weixin":"0.0.23",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var q="rove";var k=q;var z="ROVE_BUN",_="ROVE_NO_BUN_BOOTSTRAP",F="ROVE_SKIP_BUN_CHECK",$=H.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0",L=(s)=>{try{return V(s,e.X_OK),!0}catch{return!1}},B=(s)=>s==="win32"?"bun.exe":"bun",f=(s)=>{let t=Q(s,["--version"],{encoding:"utf8",timeout:5000});if(t.error||t.status!==0)return null;return t.stdout?.split(`
|
|
3
3
|
`)[0]?.trim()??""};function J(s){return s.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function X(s,t=$){let c=J(s),W=J(t);if(!c||!W)return!0;let b=c.split(".").map(Number),g=W.split(".").map(Number);for(let p=0;p<3;p++){let r=b[p]??0,i=g[p]??0;if(r!==i)return r>i}return!0}function Y(s=process.env){return s[F]==="1"}function A(s={}){let t=s.env??process.env,c=s.platform??process.platform,W=s.home??t.HOME??t.USERPROFILE??R(),b=B(c),g=[],p=t[z]?.trim();if(p)g.push(p);for(let G of(t.PATH??t.Path??"").split(I))if(G)g.push(y(G,b));let r=t.BUN_INSTALL?.trim();if(r)g.push(y(r,"bin",b));if(W)g.push(y(W,".bun","bin",b));let i=s.launcherDir;if(i)g.push(y(i,"..","..","node_modules","bun","bin",b)),g.push(y(i,"..","..","..","bun","bin",b));return g}function N(s={}){let t=s.isExecutable??L;return A(s).find((c)=>t(c))??null}function Z(s={}){let t=s.isExecutable??L,c=s.bunVersionOf??f;if(Y(s.env??process.env))return{bun:N(s),stale:null,unusable:null};let W=null,b=null;for(let g of A(s)){if(!t(g))continue;let p=c(g);if(p===null){b??=g;continue}if(X(p))return{bun:g,stale:W,unusable:b};W??={path:g,version:J(p)??p}}return{bun:null,stale:W,unusable:b}}function h(s){return U(T(s))}function C(s){return o(T(s)).replace(/\.[cm]?[jt]s$/,"")}function n(s=process.platform){return s==="win32"?["powershell","-NoProfile","-Command","irm bun.sh/install.ps1 | iex"]:["bash","-c","curl -fsSL https://bun.sh/install | bash"]}function D(s=k,t=process.platform){let c=t==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash";return[`${s}: Rove runs on the Bun runtime, and no Bun was found on this machine.`,"","Install Bun, then run this command again:",` ${c}`," npm install -g bun # any platform, if you already have npm","","Or install Bun and Rove together in one step:"," curl -fsSL https://rove.run/install.sh | sh","",`Already have Bun somewhere unusual? Point Rove at it: ${z}=/path/to/bun`,""].join(`
|
|
4
4
|
`)}function j(s,t,c=k){return[`${c}: this machine's Bun is too old for Rove — found ${t} at ${s}, need ${$} or newer.`,"","Rove's terminals are built on Bun's PTY API. An older Bun ignores it silently,","so every terminal and engine tab would open empty and stay empty.","","Upgrade Bun, then run this command again:"," bun upgrade # Bun installed itself (~/.bun)"," brew upgrade bun # Homebrew"," npm install -g bun@latest # npm-managed Bun","",`Have a newer Bun elsewhere? Point Rove at it: ${z}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${F}=1`,""].join(`
|
|
5
5
|
`)}function v(s,t=k){return[`${t}: the Bun at ${s} could not be run — \`${s} --version\` failed or never returned.`,"","Rove skipped it rather than starting through it, which would hang or fail","with a message from that binary instead of this one.","","Reinstall Bun, then run this command again:"," curl -fsSL https://bun.sh/install | bash","",`Have a working Bun elsewhere? Point Rove at it: ${z}=/path/to/bun`,""].join(`
|
|
@@ -12,8 +12,8 @@ _rove() {
|
|
|
12
12
|
fi
|
|
13
13
|
if [[ ${COMP_CWORD} -eq 2 ]]; then
|
|
14
14
|
case "${prev}" in
|
|
15
|
-
api) COMPREPLY=( $(compgen -W "schema engine-list list get-task pty-list collect context digest agent-turns inspect read-output watch worktree-files worktree-diff worktree-diff-file deliveries should-run add send dispatch interrupt note note-list note-delete pane-open pane-close pane-graphics tab-close tab-new tab-split notify prompt engine-report row-token set-active report attention-dismiss gate-raise gate-answer gate-withdraw gates feedback issue-list issue-create issue-update issue-delete routine-list routine-create routine-update routine-delete routine-run-now routine-respond routine-runs workitem-list workitem-start update land delete ensure-worktree remove-worktree discover-adoptable adopt" -- "${cur}") ) ;;
|
|
16
|
-
daemon) COMPREPLY=( $(compgen -W "status start stop restart" -- "${cur}") ) ;;
|
|
15
|
+
api) COMPREPLY=( $(compgen -W "schema engine-list list get-task pty-list collect context digest agent-turns inspect read-output watch worktree-files worktree-diff worktree-diff-file repo-match repo-list publish deliveries should-run add send dispatch interrupt note note-list note-delete pane-open pane-close pane-graphics tab-close tab-new tab-split notify prompt engine-report row-token set-active report attention-dismiss gate-raise gate-answer gate-withdraw gates feedback issue-list issue-create issue-update issue-delete routine-list routine-create routine-update routine-delete routine-run-now routine-respond routine-runs workitem-list workitem-start update land delete ensure-worktree remove-worktree discover-adoptable adopt" -- "${cur}") ) ;;
|
|
16
|
+
daemon) COMPREPLY=( $(compgen -W "status start stop restart relay" -- "${cur}") ) ;;
|
|
17
17
|
machine) COMPREPLY=( $(compgen -W "add doctor remove list" -- "${cur}") ) ;;
|
|
18
18
|
plugin) COMPREPLY=( $(compgen -W "install link list search outdated update enable disable unlink uninstall config-dir log action pane" -- "${cur}") ) ;;
|
|
19
19
|
repo) COMPREPLY=( $(compgen -W "show set unset" -- "${cur}") ) ;;
|
|
@@ -19,8 +19,8 @@ complete -c rove -f -n __fish_use_subcommand -a skill
|
|
|
19
19
|
complete -c rove -f -n __fish_use_subcommand -a plugin
|
|
20
20
|
complete -c rove -f -n __fish_use_subcommand -a feedback
|
|
21
21
|
complete -c rove -f -n __fish_use_subcommand -a update
|
|
22
|
-
complete -c rove -f -n "__fish_seen_subcommand_from api" -a "schema engine-list list get-task pty-list collect context digest agent-turns inspect read-output watch worktree-files worktree-diff worktree-diff-file deliveries should-run add send dispatch interrupt note note-list note-delete pane-open pane-close pane-graphics tab-close tab-new tab-split notify prompt engine-report row-token set-active report attention-dismiss gate-raise gate-answer gate-withdraw gates feedback issue-list issue-create issue-update issue-delete routine-list routine-create routine-update routine-delete routine-run-now routine-respond routine-runs workitem-list workitem-start update land delete ensure-worktree remove-worktree discover-adoptable adopt"
|
|
23
|
-
complete -c rove -f -n "__fish_seen_subcommand_from daemon" -a "status start stop restart"
|
|
22
|
+
complete -c rove -f -n "__fish_seen_subcommand_from api" -a "schema engine-list list get-task pty-list collect context digest agent-turns inspect read-output watch worktree-files worktree-diff worktree-diff-file repo-match repo-list publish deliveries should-run add send dispatch interrupt note note-list note-delete pane-open pane-close pane-graphics tab-close tab-new tab-split notify prompt engine-report row-token set-active report attention-dismiss gate-raise gate-answer gate-withdraw gates feedback issue-list issue-create issue-update issue-delete routine-list routine-create routine-update routine-delete routine-run-now routine-respond routine-runs workitem-list workitem-start update land delete ensure-worktree remove-worktree discover-adoptable adopt"
|
|
23
|
+
complete -c rove -f -n "__fish_seen_subcommand_from daemon" -a "status start stop restart relay"
|
|
24
24
|
complete -c rove -f -n "__fish_seen_subcommand_from machine" -a "add doctor remove list"
|
|
25
25
|
complete -c rove -f -n "__fish_seen_subcommand_from plugin" -a "install link list search outdated update enable disable unlink uninstall config-dir log action pane"
|
|
26
26
|
complete -c rove -f -n "__fish_seen_subcommand_from repo" -a "show set unset"
|
|
@@ -13,8 +13,8 @@ _rove() {
|
|
|
13
13
|
|
|
14
14
|
verbs=()
|
|
15
15
|
case "${words[2]}" in
|
|
16
|
-
api) verbs=("schema" "engine-list" "list" "get-task" "pty-list" "collect" "context" "digest" "agent-turns" "inspect" "read-output" "watch" "worktree-files" "worktree-diff" "worktree-diff-file" "deliveries" "should-run" "add" "send" "dispatch" "interrupt" "note" "note-list" "note-delete" "pane-open" "pane-close" "pane-graphics" "tab-close" "tab-new" "tab-split" "notify" "prompt" "engine-report" "row-token" "set-active" "report" "attention-dismiss" "gate-raise" "gate-answer" "gate-withdraw" "gates" "feedback" "issue-list" "issue-create" "issue-update" "issue-delete" "routine-list" "routine-create" "routine-update" "routine-delete" "routine-run-now" "routine-respond" "routine-runs" "workitem-list" "workitem-start" "update" "land" "delete" "ensure-worktree" "remove-worktree" "discover-adoptable" "adopt") ;;
|
|
17
|
-
daemon) verbs=("status" "start" "stop" "restart") ;;
|
|
16
|
+
api) verbs=("schema" "engine-list" "list" "get-task" "pty-list" "collect" "context" "digest" "agent-turns" "inspect" "read-output" "watch" "worktree-files" "worktree-diff" "worktree-diff-file" "repo-match" "repo-list" "publish" "deliveries" "should-run" "add" "send" "dispatch" "interrupt" "note" "note-list" "note-delete" "pane-open" "pane-close" "pane-graphics" "tab-close" "tab-new" "tab-split" "notify" "prompt" "engine-report" "row-token" "set-active" "report" "attention-dismiss" "gate-raise" "gate-answer" "gate-withdraw" "gates" "feedback" "issue-list" "issue-create" "issue-update" "issue-delete" "routine-list" "routine-create" "routine-update" "routine-delete" "routine-run-now" "routine-respond" "routine-runs" "workitem-list" "workitem-start" "update" "land" "delete" "ensure-worktree" "remove-worktree" "discover-adoptable" "adopt") ;;
|
|
17
|
+
daemon) verbs=("status" "start" "stop" "restart" "relay") ;;
|
|
18
18
|
machine) verbs=("add" "doctor" "remove" "list") ;;
|
|
19
19
|
plugin) verbs=("install" "link" "list" "search" "outdated" "update" "enable" "disable" "unlink" "uninstall" "config-dir" "log" "action" "pane") ;;
|
|
20
20
|
repo) verbs=("show" "set" "unset") ;;
|
|
@@ -3,7 +3,7 @@ name: rove
|
|
|
3
3
|
description: Use when controlling Rove tasks, parallel coding attempts, hosted agent sessions, task lifecycle, or the daemon-owned issue tracker from a shell. Also the ONLY channel for messaging another agent session on this machine — `rove api send`, never a peer/MCP side channel.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- rove-skill-version:
|
|
6
|
+
<!-- rove-skill-version: 69 — bump in lockstep with ROVE_SKILL_VERSION (src/lib/skill-install.ts). -->
|
|
7
7
|
|
|
8
8
|
# Rove shell control
|
|
9
9
|
|
|
@@ -223,17 +223,19 @@ clear the shared active task.
|
|
|
223
223
|
|
|
224
224
|
<!-- generated:begin create,edit,lifecycle -->
|
|
225
225
|
```text
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
226
|
+
publish --task-id(REQ) --remote
|
|
227
|
+
add --repo(REQ) --clone --allow-fork --title --branch --base-branch --worktree-name
|
|
228
|
+
--command --effort --tier{swift|standard|deep|auto} --model --count
|
|
229
|
+
--agents <claude:2,codex:1>
|
|
230
|
+
--status{backlog|in_progress|in_review|done|canceled|error}(backlog) --pin
|
|
231
|
+
--require-report --expect-report --activate(false) --prompt|--prompt-file
|
|
232
|
+
update --task-id(REQ) --title --tab --branch --command --model --effort --pinned
|
|
233
|
+
--require-report{on|off}
|
|
234
|
+
--status{backlog|in_progress|in_review|done|canceled|error} --report-branch
|
|
235
|
+
--report-pr --report-summary
|
|
236
|
+
land --task-id(REQ) --dry-run --strategy{merge|squash}(merge) --delete-branch
|
|
237
|
+
--remove-worktree(true)
|
|
238
|
+
delete --task-id --group --force --delete-branch --delete-remote --wait
|
|
237
239
|
```
|
|
238
240
|
<!-- generated:end -->
|
|
239
241
|
|
|
@@ -376,6 +378,8 @@ respawned — files kept, conversation did not), `skipped_precheck` (nothing to
|
|
|
376
378
|
```text
|
|
377
379
|
schema --verb --group --all
|
|
378
380
|
engine-list (none)
|
|
381
|
+
repo-match --origin --root --allow-fork
|
|
382
|
+
repo-list (none)
|
|
379
383
|
feedback --title(REQ) --body(REQ) --category(feedback)
|
|
380
384
|
```
|
|
381
385
|
<!-- generated:end -->
|
|
@@ -384,6 +388,17 @@ Bare `schema` is the compact index; `--verb <name>` drills into one verb,
|
|
|
384
388
|
`--group <g>` lists one group, `--all` dumps everything. `engine-list` is the
|
|
385
389
|
ids + RAW launch command + protocol.
|
|
386
390
|
|
|
391
|
+
`--repo` takes a repo id as well as a path: `owner/name` (GitHub),
|
|
392
|
+
`host/owner/name`, or a remote URL. An id resolves to the checkout on the
|
|
393
|
+
machine that runs the verb (its `rove machine primary`, else a clean one).
|
|
394
|
+
`add --repo <id> --clone` clones it into `~/.rove/repos/<host>/<owner>/<name>`
|
|
395
|
+
when that machine has none; `--allow-fork` accepts a checkout there under
|
|
396
|
+
another origin. Forwarded with `--machine`, a missing checkout is
|
|
397
|
+
`NO_REMOTE_CHECKOUT` and a fork-only one is `FORK_MATCH`. `repo-match` answers which checkout an `--origin`/`--root`
|
|
398
|
+
resolves to (`{ repo, fork?, checkouts, searched }`); `repo-list` lists a
|
|
399
|
+
machine's repos by id (`{ repos: [{ id, primary, checkouts }] }`) — pass
|
|
400
|
+
`--machine <alias>` to ask another machine.
|
|
401
|
+
|
|
387
402
|
`feedback` opens a GitHub Discussion in the Rove repo through `gh` — Rove's own
|
|
388
403
|
product feedback channel, not a way to file work for another project (that is
|
|
389
404
|
a `send` to their main task; see SKILL.md).
|
|
@@ -412,6 +427,8 @@ Errors go to stderr as `{"error":{"message","code",...}}`. Most carry `hint`
|
|
|
412
427
|
| `DAEMON_GONE` | the daemon died mid-`watch` | `rove daemon status`, then re-run the watch |
|
|
413
428
|
| `WORKTREE_NAME_TAKEN` | `add --worktree-name` names a directory already in use | pick another name, or omit the flag for a generated one |
|
|
414
429
|
| `INVALID_WORKTREE_NAME` | `--worktree-name` is not one plain path segment | letters/digits/`.`/`_`/`-`, not starting with `.` |
|
|
430
|
+
| `NO_LOCAL_CHECKOUT` | `add --repo <id>`, and this machine has no checkout of it | `--clone`, or `--repo` with a checkout's path |
|
|
431
|
+
| `CLONE_FAILED` | `--clone` could not `git clone` the repo | check `git ls-remote <url>` there, or clone by hand and pass the path |
|
|
415
432
|
|
|
416
433
|
Daemon-side refusals carry their OWN code (`DIRTY_WORKTREE`, `LAND_CONFLICT`,
|
|
417
434
|
`MISSING_REF`, `GIT_COMMAND_FAILED`, …), not `RPC_ERROR`. Match on `code`; the
|