@reddb-io/red-skills 2.22.0 → 2.22.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dev.bundle.min.mjs
CHANGED
|
@@ -520,7 +520,7 @@ ${d}`)}return r.write(`\u{1F680} fleet launched (supervisor pid=${l}, target=${n
|
|
|
520
520
|
`);return(t===-1?e:e.slice(0,t)).trim()}function Uar(e){let t=e.trim();if(!t)throw new Error("--scout requires a non-empty question");let r=`/scout: ${Lar(t).slice(0,70)||"investigate"}`,n=["## Question","",t,"","---","","\u{1F50D} Disposable `/go --scout` investigation issue \u2014 minted in the isolated","`lane:scout` lane. The scout worker runs in **read-only mode**: it must","NOT commit, push, or modify any files. The agent reads the codebase and","produces a markdown report as its final output before emitting DONE.","The orchestrator posts that report as a comment, then closes this issue.","Nothing lands on main."].join(`
|
|
521
521
|
`);return{title:r,body:n,labels:[DC]}}function $ar(e){if(!Number.isInteger(e.issue)||e.issue<=0)throw new Error(`buildScoutEngineArgs: invalid issue ${e.issue}`);let t=["--once","--issues",String(e.issue),"--origin",Bge,"--lane",DC,"--run-mode",Far];return e.runner&&t.push("--runner",e.runner),t}async function dat(e,t,r={}){let n=Uar(t);await e.ensureLabel(DC);let o=await e.createIssue(n),i=await e.runEngine($ar({issue:o,runner:r.runner}));return{issue:o,engineExit:i}}var Har=/^[a-z0-9-]+$/,War=/^[A-Za-z0-9._-]+$/,jar=/^[0-9]+$/,Gar=/^afk(-attempts)?\/[A-Za-z0-9._-]+\/[0-9]+-[a-z0-9-]+$/;function rR(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40).replace(/-+$/g,"")}function qar(e){return Gar.test(e)}function nR(e,t,r,n){if(e!=="afk"&&e!=="afk-attempts"||!War.test(t))return null;let o=typeof r=="number"?String(r):r;if(!jar.test(o)||!Har.test(n))return null;let i=`${e}/${t}/${o}-${n}`;return qar(i)?i:null}function fat(e,t,r,n){return nR(e,t,r,rR(n))}function zar(e,t){return["-C",e,"push","origin","--delete",t]}function Var(e,t,r){return["-C",e,"push","origin",`${t}:refs/heads/${r}`]}var uhn=["#!/usr/bin/env bash","# AFK continuous-push hook (issue #191)","# Fire-and-forget: push the worker branch to origin after every commit so a","# SIGKILL of the orchestrator at any point preserves the diff on the remote.","git push origin HEAD --force-with-lease || true",""].join(`
|
|
522
522
|
`);async function E4(e,t,r){if(!r)return{ok:!0,ran:!1,warn:"delete_remote called with empty branch \u2014 skipping"};let{code:n}=await e(zar(t,r));return n!==0?{ok:!0,ran:!0,warn:`failed to delete remote ${r} after close, branch survives on origin for cleanup later`}:{ok:!0,ran:!0}}async function fg(e,t,r,n){if(!r||!n)return{ok:!1,ran:!1,warn:"push_attempt called with empty branch or remote \u2014 skipping"};let{code:o}=await e(Var(t,r,n));return o!==0?{ok:!1,ran:!0,warn:`failed to push attempt branch to origin/${n}`}:{ok:!0,ran:!0}}import{existsSync as gat,readdirSync as Yar}from"node:fs";import{join as pat}from"node:path";var b4=["pre_session","pre_pick","post_pick","pre_worktree","pre_attempt","post_attempt","pre_feedback","on_baseline_probe","on_feedback_classify","post_feedback","pre_merge","post_merge","on_attempt_error","on_attempt_timeout","on_recovery_decision","on_blocked","on_reconcile","on_idle","on_heartbeat","post_session","on_session_error"],Aat={pre_worktree:["cargo","gradle"],post_attempt:["heartbeat","envelope"],post_merge:["validation"]},phn=Object.values(Aat).flat(),_ge=class extends Error{constructor(r){super(`unknown hook name '${r}'`);this.hookName=r;this.name="UnknownHookError"}},Jar=new Set(b4);function Kar(e){return Jar.has(e)}var mat="afk.hooks.",Zar="afk.hooks.defaults.";function hat(e){let t=/^(\d+)/.exec(e);return t?parseInt(t[1],10):1/0}function Xar(e,t){let r=hat(e)-hat(t);return r!==0?r:e.localeCompare(t)}function Tge(e,t,r,n,o){let i=l=>{let d=new Map;if(!l)return d;let f=pat(l,e);if(!o(f))return d;for(let p of n(f))p.startsWith(".")||d.set(p,pat(f,p));return d},s=i(t),a=i(r),c=new Map([...s,...a]);return[...c.keys()].sort(Xar).map(l=>c.get(l))}function hC(e,t){let{defaultCommand:r}=t,n=new Map;for(let[u,l]of Object.entries(e)){if(!u.startsWith(mat)||u.startsWith(Zar))continue;let d=u.slice(mat.length);if(!Kar(d))throw new _ge(d);let f=l.split(`
|
|
523
|
-
`).map(p=>p.trim()).filter(p=>p.length>0);n.set(d,f)}let{libraryHooksDir:o,projectHooksDir:i}=t,s=t.listFiles??(u=>Yar(u)),a=t.dirExists??gat,c={};for(let u of b4){let l=[],d=Aat[u];if(d)for(let p of d){let m=r(p);m!==void 0&&l.push(m)}(o!==void 0||i!==void 0)&&l.push(...Tge(u,o,i,s,a));let f=n.get(u);f&&l.push(...f),c[u]=l}return c}function yat(e,t,r=gat){let n={cargo:"red-cargo",gradle:"red-gradle",heartbeat:"red-heartbeat",envelope:"red-envelope",validation:"red-validation"};return o=>{let i=n[o];if(t){let a=`${t}/${i}`;if(r(a))return a}let s=`${e}/${i}`;return r(s)?s:void 0}}var ecr={pre_session:"abort",pre_pick:"abort",post_pick:"continue",pre_worktree:"abort",pre_attempt:"abort",post_attempt:"continue",pre_feedback:"abort",on_baseline_probe:"continue",on_feedback_classify:"continue",post_feedback:"continue",pre_merge:"abort",post_merge:"continue",on_attempt_error:"continue",on_attempt_timeout:"continue",on_recovery_decision:"continue",on_blocked:"continue",on_reconcile:"continue",on_idle:"continue",on_heartbeat:"continue",post_session:"continue",on_session_error:"continue"},tcr=new Set(b4),Dge=class extends Error{constructor(r){super(`unknown lifecycle point '${r}'`);this.name=r;this.name="UnknownLifecyclePointError"}},rcr=65;function ncr(e){if(e.length===0||e[0]!=="{")return!1;try{let t=JSON.parse(e);return typeof t=="object"&&t!==null&&!Array.isArray(t)}catch{return!1}}function ocr(e,t){let r={...e},n;try{n=JSON.parse(t)}catch{return r}if(typeof n!="object"||n===null||Array.isArray(n))return r;let o=n,i=(d,f)=>{typeof f=="string"?f.length>0&&(r[d]=f):typeof f=="number"&&Number.isFinite(f)&&(r[d]=String(f))},s=d=>typeof d=="object"&&d!==null&&!Array.isArray(d)?d:void 0;i("RED_AFK_ISSUE",s(o.issue)?.number),i("RED_AFK_WORKSPACE",o.workspace),i("RED_AFK_RUNNER",o.runner),i("RED_AFK_ATTEMPT_N",o.attempt_n),i("RED_AFK_MERGE_BASE",o.merge_base),i("RED_AFK_ITER_LOG",o.iter_log),i("RED_AFK_STATE_FILE",o.state_file);let a=s(o.result);a&&(i("RED_AFK_RESULT_STATUS",a.status),i("RED_AFK_RESULT_OUTCOME",a.outcome));let c=s(o.error);c&&(i("RED_AFK_ERROR_CLASS",c.class),i("RED_AFK_ERROR_MESSAGE",c.message));let u=s(o.merge_commit);u&&(i("RED_AFK_MERGE_COMMIT",u.sha),i("RED_AFK_MERGE_SHA",u.short)),i("RED_AFK_RECOVERY_DECISION",o.decision),i("RED_AFK_RECOVERY_REASON",o.reason),i("RED_AFK_BLOCKED_LABEL",o.blocked_label),i("RED_AFK_FEEDBACK_CLASS",o.class),i("RED_AFK_RECONCILE_OUTCOME",o.outcome);let l=s(o.vitals);if(l)for(let[d,f]of Object.entries(l))typeof f=="number"&&Number.isFinite(f)&&(r[`RED_AFK_VITAL_${d.toUpperCase()}`]=String(f));return r}async function hP(e,t,r,n,o={}){if(!tcr.has(e))throw new Dge(e);let i=ocr(o.env??{},r),s=o.log??(()=>{}),a=ecr[e],c=[],u=r;for(let l of t){if(l.length===0)continue;s(`[afk:hooks] ${e}: enter: ${l}`);let{code:d,stdout:f}=await n(l,i,u);if(c.push({name:e,command:l,rc:d}),s(`[afk:hooks] ${e}: exit rc=${d}: ${l}`),d!==0){if(a==="abort")return s(`[afk:hooks] ${e}: command failed (rc=${d}): ${l}`),{context:u,aborted:!0,rc:d,executions:c};s(`[afk:hooks] ${e}: command failed (rc=${d}), continuing: ${l}`);continue}let p=f.trim();if(p.length!==0){if(ncr(p)){u=p;continue}if(a==="abort")return s(`[afk:hooks] ${e}: non-JSON stdout (parse failure) from: ${l}`),{context:u,aborted:!0,rc:rcr,executions:c};s(`[afk:hooks] ${e}: non-JSON stdout, ignoring (parse failure): ${l}`)}}return{context:u,aborted:!1,rc:0,executions:c}}cn();var Qge="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";function Eat(e,t=()=>!1){for(;;){let r="w";for(let n=0;n<4;n++){let o=Math.min(Qge.length-1,Math.floor(e()*Qge.length));r+=Qge[o]}if(!t(r))return r}}function oR(e,t){return e.labels.includes(t)}function icr(e,t){return oR(e,`spec:${t}`)?!0:new RegExp(`spec:\\s*#?${t}\\b`).test(e.body??"")}function xat(e){return[...e].sort((t,r)=>{let n=oR(t,IY)?0:1,o=oR(r,IY)?0:1;return n!==o?n-o:t.number-r.number})}var Oge=class extends Error{constructor(r,n){super(r);this.numbers=n;this.name="IssueSelectionError"}};function scr(e,t){let r=e.filter(c=>!oR(c,WP)),n=r.filter(c=>oR(c,SR)).sort((c,u)=>c.number-u.number),o=r.filter(c=>!oR(c,SR)),i;switch(t.kind){case"issues":{let c=new Map(
|
|
523
|
+
`).map(p=>p.trim()).filter(p=>p.length>0);n.set(d,f)}let{libraryHooksDir:o,projectHooksDir:i}=t,s=t.listFiles??(u=>Yar(u)),a=t.dirExists??gat,c={};for(let u of b4){let l=[],d=Aat[u];if(d)for(let p of d){let m=r(p);m!==void 0&&l.push(m)}(o!==void 0||i!==void 0)&&l.push(...Tge(u,o,i,s,a));let f=n.get(u);f&&l.push(...f),c[u]=l}return c}function yat(e,t,r=gat){let n={cargo:"red-cargo",gradle:"red-gradle",heartbeat:"red-heartbeat",envelope:"red-envelope",validation:"red-validation"};return o=>{let i=n[o];if(t){let a=`${t}/${i}`;if(r(a))return a}let s=`${e}/${i}`;return r(s)?s:void 0}}var ecr={pre_session:"abort",pre_pick:"abort",post_pick:"continue",pre_worktree:"abort",pre_attempt:"abort",post_attempt:"continue",pre_feedback:"abort",on_baseline_probe:"continue",on_feedback_classify:"continue",post_feedback:"continue",pre_merge:"abort",post_merge:"continue",on_attempt_error:"continue",on_attempt_timeout:"continue",on_recovery_decision:"continue",on_blocked:"continue",on_reconcile:"continue",on_idle:"continue",on_heartbeat:"continue",post_session:"continue",on_session_error:"continue"},tcr=new Set(b4),Dge=class extends Error{constructor(r){super(`unknown lifecycle point '${r}'`);this.name=r;this.name="UnknownLifecyclePointError"}},rcr=65;function ncr(e){if(e.length===0||e[0]!=="{")return!1;try{let t=JSON.parse(e);return typeof t=="object"&&t!==null&&!Array.isArray(t)}catch{return!1}}function ocr(e,t){let r={...e},n;try{n=JSON.parse(t)}catch{return r}if(typeof n!="object"||n===null||Array.isArray(n))return r;let o=n,i=(d,f)=>{typeof f=="string"?f.length>0&&(r[d]=f):typeof f=="number"&&Number.isFinite(f)&&(r[d]=String(f))},s=d=>typeof d=="object"&&d!==null&&!Array.isArray(d)?d:void 0;i("RED_AFK_ISSUE",s(o.issue)?.number),i("RED_AFK_WORKSPACE",o.workspace),i("RED_AFK_RUNNER",o.runner),i("RED_AFK_ATTEMPT_N",o.attempt_n),i("RED_AFK_MERGE_BASE",o.merge_base),i("RED_AFK_ITER_LOG",o.iter_log),i("RED_AFK_STATE_FILE",o.state_file);let a=s(o.result);a&&(i("RED_AFK_RESULT_STATUS",a.status),i("RED_AFK_RESULT_OUTCOME",a.outcome));let c=s(o.error);c&&(i("RED_AFK_ERROR_CLASS",c.class),i("RED_AFK_ERROR_MESSAGE",c.message));let u=s(o.merge_commit);u&&(i("RED_AFK_MERGE_COMMIT",u.sha),i("RED_AFK_MERGE_SHA",u.short)),i("RED_AFK_RECOVERY_DECISION",o.decision),i("RED_AFK_RECOVERY_REASON",o.reason),i("RED_AFK_BLOCKED_LABEL",o.blocked_label),i("RED_AFK_FEEDBACK_CLASS",o.class),i("RED_AFK_RECONCILE_OUTCOME",o.outcome);let l=s(o.vitals);if(l)for(let[d,f]of Object.entries(l))typeof f=="number"&&Number.isFinite(f)&&(r[`RED_AFK_VITAL_${d.toUpperCase()}`]=String(f));return r}async function hP(e,t,r,n,o={}){if(!tcr.has(e))throw new Dge(e);let i=ocr(o.env??{},r),s=o.log??(()=>{}),a=ecr[e],c=[],u=r;for(let l of t){if(l.length===0)continue;s(`[afk:hooks] ${e}: enter: ${l}`);let{code:d,stdout:f}=await n(l,i,u);if(c.push({name:e,command:l,rc:d}),s(`[afk:hooks] ${e}: exit rc=${d}: ${l}`),d!==0){if(a==="abort")return s(`[afk:hooks] ${e}: command failed (rc=${d}): ${l}`),{context:u,aborted:!0,rc:d,executions:c};s(`[afk:hooks] ${e}: command failed (rc=${d}), continuing: ${l}`);continue}let p=f.trim();if(p.length!==0){if(ncr(p)){u=p;continue}if(a==="abort")return s(`[afk:hooks] ${e}: non-JSON stdout (parse failure) from: ${l}`),{context:u,aborted:!0,rc:rcr,executions:c};s(`[afk:hooks] ${e}: non-JSON stdout, ignoring (parse failure): ${l}`)}}return{context:u,aborted:!1,rc:0,executions:c}}cn();var Qge="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";function Eat(e,t=()=>!1){for(;;){let r="w";for(let n=0;n<4;n++){let o=Math.min(Qge.length-1,Math.floor(e()*Qge.length));r+=Qge[o]}if(!t(r))return r}}function oR(e,t){return e.labels.includes(t)}function icr(e,t){return oR(e,`spec:${t}`)?!0:new RegExp(`spec:\\s*#?${t}\\b`).test(e.body??"")}function xat(e){return[...e].sort((t,r)=>{let n=oR(t,IY)?0:1,o=oR(r,IY)?0:1;return n!==o?n-o:t.number-r.number})}var Oge=class extends Error{constructor(r,n){super(r);this.numbers=n;this.name="IssueSelectionError"}};function scr(e,t){let r=e.filter(c=>!oR(c,WP)),n=r.filter(c=>oR(c,SR)).sort((c,u)=>c.number-u.number),o=r.filter(c=>!oR(c,SR)),i;switch(t.kind){case"issues":{let c=new Map(r.map(d=>[d.number,d])),u=[],l=[];for(let d of t.numbers){let f=c.get(d);f?u.push(f):l.push(d)}if(l.length>0)throw new Oge(`requested issue(s) missing from the ready-for-agent queue: ${l.map(d=>`#${d}`).join(", ")}`,l);i=u;break}case"spec":i=xat(o.filter(c=>icr(c,t.spec)));break;case"all":default:i=xat(o);break}let s=new Set(n.map(c=>c.number)),a=i.filter(c=>!s.has(c.number));return[...n,...a]}function bat(e,t){if(t!==void 0)return t;if(e.labels.includes(Sye))return"scout"}function acr(e,t){return e!==t?t:t==="claude-minimax"?"claude":t==="claude"?"codex":"claude"}var ccr="<promise>NO MORE TASKS</promise>";function ucr(e){switch(e){case"done":return"done";case"claim-lost":case"hook-aborted":return"failed";default:return"blocked"}}async function Sat(e,t){let r=[],n=e.hooks?hC(e.hooks.config,e.hooks.resolveOptions):void 0,o=async(c,u)=>!e.hooks||!n?!0:(r.push(c),!(await hP(c,n[c],u,e.hooks.exec,{env:e.hooks.env??{},log:e.emit})).aborted),i=(c,u,l)=>JSON.stringify({runner:t.runner,worker_id:t.workerId,stats:{done:c,blocked:u,total:l}}),s={runner:t.runner,workerId:t.workerId,done:0,blocked:0,failed:0,total:0,boot:{precheck:{ok:!0,warnings:[]}},processed:[],drained:!1,exhausted:!1,runnerTransient:!1,sessionHooksFired:r},a=await e.runBoot(e.bootDeps,e.bootOptions);if(s.boot=a,!a.precheck.ok)return s;if(t.bootOnly)return e.emit(t.sweepsSkipped?"boot complete (--boot-only): sweeps skipped (supervisor-owned), no issues processed":"boot complete (--boot-only): sweeps ran, no issues processed"),{...s,boot:a};try{if(!await o("pre_session",i(0,0,0)))return{...s,boot:a};await o("pre_pick",JSON.stringify({filter:t.filter}));let c=await e.gh.listCandidates(),u=scr(c,t.filter),l=u.length;if(await o("post_pick",JSON.stringify({issues:u.map(b=>b.number)})),l===0)return await o("on_idle",i(0,0,0)),e.emit(ccr),await o("post_session",i(0,0,0)),{...s,boot:a,total:0,drained:!0};let d=t.iterCap&&t.iterCap>0?t.iterCap:l,f=[],p=0,m=0,g=0,y=!1,E=!1,A=t.runner;for(let b=0;b<u.length&&!(b>=d);b++){let I=u[b],w=t.alternate?A:t.runner;if(e.runnerCircuit&&await e.runnerCircuit.isOpen(w)){E=!0,e.emit(`runner ${w} circuit open \u2014 stopping before claiming more issues`);break}let v=e.buildProcessInput(I,t),k=t.alternate?{...v,runner:w}:v,R=await e.processIssue(e.processDeps,k),T=ucr(R.outcome);T==="done"?p++:T==="blocked"?m++:g++,f.push({issue:I.number,outcome:R.outcome});let U=b+1,D=Math.floor(U*100/l),ee=l-U;if(e.emit(`progress: ${U}/${l} (${D}%) \u2014 ${ee} remaining`),R.outcome==="exhausted"){y=!0;break}if(R.outcome==="runner-transient"){E=!0;break}if(t.once&&R.outcome!=="claim-lost")break;t.alternate&&(A=acr(A,t.runner))}return await o("post_session",i(p,m,l)),{runner:t.runner,workerId:t.workerId,done:p,blocked:m,failed:g,total:l,boot:a,processed:f,drained:!1,exhausted:y,runnerTransient:E,sessionHooksFired:r}}catch(c){throw await o("on_session_error",JSON.stringify({runner:t.runner,worker_id:t.workerId,error:{message:c instanceof Error?c.message:String(c)}})),c}}Pv();cn();gP();var fcr=/^## Blocked by[ \t]*$/,pcr=/^## /,mcr=/#[0-9]+/g;function hcr(e){let t=!1,r=new Set;for(let n of e.split(`
|
|
524
524
|
`)){if(t){if(pcr.test(n)){t=!1;continue}let o=n.match(mcr);if(o)for(let i of o)r.add(i);continue}fcr.test(n)&&(t=!0)}return[...r].sort()}function Iat(e){let t=/^#?([0-9]+)$/.exec(e.trim());return t?Number(t[1]):null}var gcr=/^req:([0-9]+)$/;function AP(e){let t=new Set;for(let r of e){let n=gcr.exec(r.trim());n&&t.add(Number(n[1]))}return[...t].sort((r,n)=>r-n)}function Pge(e){return e.length===0?!1:e.every(t=>t==="CLOSED")}function Acr(e){return`\u{1F916} /afk promoted to ready-for-agent: all blockers closed (${e.join(", ")}).`}function wat(e){return`\u{1F916} /afk unblocked: all dependencies closed (${e.map(t=>`#${t}`).join(", ")}).`}async function yP(e,t){let r=await Nge(e,t);return`\u{1F916} /afk unblocked: all dependencies closed (${Cat(e.map(n=>r.get(n)??{number:n}))}).`}function I4(e,t){let r=[];for(let n of t){let o=n.reqs.map(s=>s.closed?"CLOSED":"open-or-unknown");if(!Pge(o))continue;let i=n.reqs.map(s=>s.n).sort((s,a)=>s-a);r.push({number:n.number,refs:i.map(s=>`#${s}`),reqLabels:i.map(s=>`req:${s}`),comment:wat(i)})}return r}async function ycr(e,t){let r=[];for(let n of e){let o=n.labels??[];if(!o.includes(ic))continue;let i=AP(o);if(i.length>0){let c=[];for(let u of i){let l=await t(u);c.push(l==="CLOSED"?"CLOSED":"open-or-unknown")}Pge(c)&&r.push({number:n.number,refs:i.map(u=>`#${u}`),reqLabels:i.map(u=>`req:${u}`),comment:wat(i)});continue}let s=hcr(n.body);if(s.length===0)continue;let a=[];for(let c of s){let u=Iat(c),l=u===null?void 0:await t(u);a.push(l==="CLOSED"?"CLOSED":"open-or-unknown")}Pge(a)&&r.push({number:n.number,refs:s,reqLabels:[],comment:Acr(s)})}return r}async function w4(e,t,r){let n=await ycr(e,t),o=new Map;for(let s of e)o.set(s.number,s.labels??[]);let i=[];for(let s of n){let c=(o.get(s.number)??[]).includes(ic)?ic:rt;await r.editLabels(s.number,[c,...s.reqLabels],[Ye]);let u=s.refs.map(Iat).filter(d=>d!==null),l=s.reqLabels.length>0&&u.length>0?await yP(u,r.issueReference):s.comment;await r.comment(s.number,l),i.push(s.number)}return i}async function kat(e){let t=r=>Number.isFinite(r)&&r>0?Math.floor(r):0;return{unlabeled:t(await e.unlabeled()),needsTriage:t(await e.needsTriage()),needsInfo:t(await e.needsInfo())}}function vat(e){return e.unlabeled>0||e.needsTriage>0||e.needsInfo>0}var xcr=/^afk\/[A-Za-z0-9._-]+\/([0-9]+)-[a-z0-9-]+$/;function Ecr(e){let t=xcr.exec(e);return t?Number(t[1]):null}function Mge(e,t){for(let r of e)if(Ecr(r)===t)return r;return null}var bcr=new Set([_x,Tx,ou]);function Scr(e){return e.some(t=>bcr.has(t))}function k4(e,t){let r=[];for(let n of e){if(!Scr(n.labels))continue;let o=Mge(t,n.number);o&&r.push({number:n.number,title:n.title,body:n.body,labels:n.labels,branch:o})}return r}var Rat={refreshCadenceS:270,tolerance:3},Bat=270,_at=2700,Lge={...Rat,claimGraceS:Bat,recentCommitProtectionS:_at};function Ccr(e=Rat){return e.refreshCadenceS*(e.tolerance+1)}function Icr(e){if(!e.createdAt)return null;let t=Date.parse(e.createdAt);return Number.isNaN(t)?null:Math.floor(t/1e3)}function wcr(e,t,r=Lge){let n=Icr(e);if(n===null)return"fresh";let o=t-n;return"claimGraceS"in r&&o<=r.claimGraceS||o<=Ccr(r)?"fresh":"stale"}function Uge(e,t=Lge){return r=>wcr(r,e,t)==="stale"}function kcr(e,t){let r=new Map;for(let s of e){if(!Number.isFinite(s.commentId)||s.worker==="")continue;let a=r.get(s.worker);if(a===void 0){r.set(s.worker,{earliestClaimId:s.kind==="claim"?s.commentId:null,latestId:s.commentId,latestKind:s.kind,latestRecord:s});continue}s.kind==="claim"&&(a.earliestClaimId===null||s.commentId<a.earliestClaimId)&&(a.earliestClaimId=s.commentId),s.commentId>=a.latestId&&(a.latestId=s.commentId,a.latestKind=s.kind,a.latestRecord=s)}let n=null,o=1/0,i=[];for(let[s,a]of r)if(a.latestKind!=="concede"&&a.earliestClaimId!==null){if(t(a.latestRecord)){i.push(s);continue}a.earliestClaimId<o&&(o=a.earliestClaimId,n=s)}return i.sort(),{liveOwner:n,staleOwners:i}}function Tat(e){let t=e.map(r=>`\`${r}\``).join(", ");return`\u{1F916} AFK cross-host stale-claim sweep: released this issue back to \`ready-for-agent\` \u2014 ${e.length===1?"the claim":"the claims"} held by ${t} stopped refreshing past the staleness window (owner presumed dead on another host).`}function Dat(e){let t=e.map(r=>`\`${r}\``).join(", ");return`\u{1F916} AFK same-host ghost-claim sweep: released this issue back to \`ready-for-agent\` \u2014 ${e.length===1?"the claim":"the claims"} held by ${t} had a dead \`worker.pid\`.`}function Qat(e,t,r=Lge){let n=Uge(t,r),o=[];for(let i of e){let s=new Set(i.deadOwners??[]),a=kcr(i.records,c=>s.has(c.worker)||n(c));if(a.liveOwner===null&&a.staleOwners.length>0){if(!a.staleOwners.some(u=>s.has(u))&&vcr(i.attemptBranchCommitS,t,r.recentCommitProtectionS))continue;o.push({issue:i.issue,staleOwners:a.staleOwners})}}return o}function vcr(e,t,r){return Number.isFinite(e)?t-e<=r:!1}var Oat=/^[0-9]+$/;function gC(e,t){if(e!==void 0&&Oat.test(e)){let r=Number(e);if(r>0)return r}return t}function Fge(e,t){return e!==void 0&&Oat.test(e)?Number(e):t}function Nat(e=process.env){return{refreshCadenceS:gC(e.RED_AFK_CLAIM_REFRESH_S,270),tolerance:Fge(e.RED_AFK_CLAIM_STALE_TOLERANCE,3)}}function Pat(e=process.env,t=()=>""){return{refreshCadenceS:gC(e.RED_AFK_CLAIM_REFRESH_S,0)||gC(t("afk.claim_reaper.refresh_s"),270),tolerance:Fge(e.RED_AFK_CLAIM_STALE_TOLERANCE,Fge(t("afk.claim_reaper.stale_tolerance"),3)),claimGraceS:gC(e.RED_AFK_CLAIM_REAPER_GRACE_S,0)||gC(t("afk.claim_reaper.grace_s"),Bat),recentCommitProtectionS:gC(e.RED_AFK_CLAIM_REAPER_RECENT_COMMIT_S,0)||gC(t("afk.claim_reaper.recent_commit_s"),_at)}}cn();function Rcr(e){if(!e.ghInstalled)return{ok:!1,failed:"gh-missing"};if(!e.ghAuthenticated)return{ok:!1,failed:"gh-unauthenticated"};if(!e.isGitRepo)return{ok:!1,failed:"not-a-git-repo"};if(!e.allowHttpsRemote){for(let n of e.remoteUrls)if(n.startsWith("https://"))return{ok:!1,failed:"https-remote-forbidden",detail:n}}if(!e.hasMainBranch)return{ok:!1,failed:"no-main-branch"};let t=e.lockedBranch??"main";if(e.currentBranch!==t)return{ok:!1,failed:"not-on-main",detail:e.currentBranch};let r=[];return e.pnpmInstalled||r.push("pnpm not on PATH; feedback loops will be skipped"),{ok:!0,warnings:r}}async function v4(e,t){let r=Rcr(t.precheck);if(!r.ok)return{precheck:r};let n=t.bootstrap;if(await e.fs.ensureDir(n.tmpDir),await e.fs.ensureDir(n.stateDir),await e.fs.ensureGitignoreLine(n.gitignorePath,".red/tmp/"),await e.fs.ensureGitignoreLine(n.gitignorePath,".red/state/"),await e.fs.ensureDir(n.workerDir),await e.fs.writeWorkerPid(n.workerPidFile,n.workerPid),t.skipSweeps)return{precheck:r,bootstrap:{ok:!0}};let o=await _cr(e,t),i=await Tcr(e,t.attemptCap),s=await Dcr(e,t.branches),a=await Qcr(e,t.unblockCandidates),c=await Bcr(e),u=await Ocr(e,t),l=await Ncr(e);return{precheck:r,bootstrap:{ok:!0},orphanCleanup:o,attemptCap:i,branchCleanup:s,unblockSweep:a,staleClaimSweep:c,reconcileSweep:u,straggler:l}}async function Bcr(e){if(!e.lookups.claimedIssues)return{released:[]};let t;try{t=await e.lookups.claimedIssues()}catch{return{released:[]}}let r=Pat(e.env??process.env,i=>e.config?.[i]??""),n=Qat(t,e.nowS,r),o=[];for(let i of n)try{let s=await e.gh.viewLabels(i.issue);if(!s.includes(et)){o.push(i.issue);continue}let a=s.includes(rt)?[]:[Ye];await e.gh.editLabels(i.issue,[et],a);let c=t.find(d=>d.issue===i.issue),u=new Set(c?.deadOwners??[]),l=i.staleOwners.some(d=>u.has(d))?Dat(i.staleOwners):Tat(i.staleOwners);await e.gh.comment(i.issue,l),o.push(i.issue)}catch{}return{released:o}}async function _cr(e,t){let r=t.orphans,n=[],o=[],i=[],s=[],a=[];for(let c of t.legacyWorkDirs??[])await e.fs.removeDir(c),s.push(c);for(let c of r){let u=c.issue!==null,l="OPEN",d=null,f=!1,p=!0;if(u&&c.issue!==null){let g=await e.lookups.orphanState(c.issue);p=g.ghOk,l=g.state,d=g.label,f=g.envelopePosted}let m=Bst({issueState:l,label:d,envelopePosted:f,hasStateFile:u,ageS:c.ageS,ghOk:p});m.kind==="remove"?(await e.fs.removeDir(c.path),n.push(c.path)):m.kind==="restore-and-remove"?await e.lookups.claimHolderAlive?.(c.issue).catch(()=>!1)??!1?(await e.fs.removeDir(c.path),n.push(c.path)):(await e.gh.editLabels(c.issue,[et],[Ye]),await e.gh.comment(c.issue,"\u{1F916} /afk orchestrator died mid-issue; restoring ready-for-agent."),o.push(c.issue),await e.fs.removeDir(c.path),n.push(c.path)):c.ageS>m.ttlS?(await e.fs.removeDir(c.path),n.push(c.path)):i.push(c.path)}for(let c of t.staleClaimDirs??[])await e.fs.removeDir(c.path),a.push(c.path);return await e.fs.reapDeadEmptyWorkerShells?.(t.bootstrap.tmpDir).catch(()=>{}),{removed:n,restored:o,kept:i,legacyWiped:s,claimsReleased:a}}async function Tcr(e,t){let r=Qst(e.env),n=Ost(e.env),o=[];for(let[,i]of t.byIssue){let s=_st(i,{ttlS:r,keep:n,nowS:e.nowS});for(let a of s)await e.fs.removeDir(a.path),o.push(a.path)}return{reclaimed:o}}async function Dcr(e,t){let r=WN(e.env),n=jN(t.snapshotRefs,e.lookups.branchIssue,e.nowS,r),o=[];for(let u of tg(n))await e.git.deleteRemoteBranch(u.branch),o.push(u.branch);let i=Nv(t.remoteLiveRefs,e.lookups.branchIssue,e.nowS),s=[];for(let u of tg(i))await e.git.deleteRemoteBranch(u.branch),s.push(u.branch);let a=GN(t.localLiveRefs,e.lookups.branchIssue,e.nowS),c=[];for(let u of tg(a))await e.git.deleteLocalBranch(u.branch),c.push(u.branch);return{snapshotReaped:o,remoteLiveReaped:s,localLiveReaped:c}}async function Qcr(e,t){return{promoted:await w4(t,e.lookups.blockerState,e.gh)}}async function Ocr(e,t){let r={landed:[],parked:[],skipped:[]};if(!e.reconcileRunner)return r;let n=t.reconcileSweepCandidates??[];if(n.length===0)return r;let o=t.branches.remoteLiveRefs.map(s=>s.branch),i=k4(n,o);for(let s of i)try{let{outcome:a}=await e.reconcileRunner(s);a==="landed"?r.landed.push(s.number):a==="parked"?r.parked.push(s.number):r.skipped.push(s.number)}catch{r.skipped.push(s.number)}return r}async function Ncr(e){let t=await kat(e.lookups.straggler);return{counts:t,warn:vat(t)}}var xP=class extends Error{constructor(t){super(t),this.name="QuarantineConfigError"}};function Mat(e){for(let t=0;t<e.length;t++){let r=e[t];if(!r.issue.trim())throw new xP(`quarantine entry ${t} (pattern: "${r.pattern}") has no issue reference \u2014 every quarantine entry must link to a tracker issue`)}}function Fat(e,t){let r=[],n=t==="."?"":`${t}/`;for(let o of e)if(t==="."||o.pattern.startsWith(n)){let i=t==="."?o.pattern:o.pattern.slice(n.length);r.push("--exclude",i)}return r}function Lat(e,t){let r=t==="."?"":`${t}/`;return e.filter(n=>t==="."||n.pattern.startsWith(r))}var Pcr=["APPDATA","CI","COLORTERM","ComSpec","COREPACK_HOME","FORCE_COLOR","HOME","LANG","LOCALAPPDATA","LOGNAME","NO_COLOR","NPM_CONFIG_USERCONFIG","PATH","PATHEXT","PNPM_HOME","SHELL","SystemRoot","TEMP","TERM","TMP","TMPDIR","USER","USERPROFILE","TZ","npm_config_userconfig"],Mcr=["COREPACK_","LC_","NPM_CONFIG_","PNPM_","XDG_","YARN_","npm_config_"],Fcr=["ANTHROPIC_API_KEY","GITHUB_TOKEN","GH_TOKEN","MINIMAX_API_KEY","NODE_AUTH_TOKEN","NPM_TOKEN","OPENAI_API_KEY","OPENROUTER_API_KEY","RED_AFK_WORKERS_NAMESPACE"],Lcr=["ANTHROPIC_","CLAUDE_","CODEX_","MINIMAX_","OPENAI_","OPENROUTER_","RED_AFK_","RED_SKILLS_"];function Uat(e,t,r){return t.includes(e)||r.some(n=>e.startsWith(n))}function Hge(e=process.env){let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&(Uat(r,Fcr,Lcr)||Uat(r,Pcr,Mcr)&&(t[r]=n));return t}var Ucr=["test","typecheck","lint","build"],$cr="red.afk.validation.v1";function Hcr(e,t){let r=new Set(t),n=new Set,o=[],i=[];for(let s of e)n.has(s)||(n.add(s),r.has(s)?i.push(s):o.push(s));return{shouldBlock:o.length>0,blockingFailures:o,preExistingFailures:i}}function Wcr(e){return e.startsWith("./")?e.slice(2):e}function jcr(e,t){if(t==="")return;let r=Wcr(t),n=r.includes("/")?r.slice(0,r.lastIndexOf("/")):".";for(;n!==""&&n!=="."&&n!=="/";){if(e.hasPackage(n))return n;n=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"."}return e.hasPackage(".")?".":void 0}function _4(e,t){let r=new Set;for(let n of t){if(n==="")continue;let o=jcr(e,n);o!==void 0&&r.add(o)}return r.size===0&&e.hasPackage(".")&&r.add("."),[...r].sort()}function Gcr(e){return e==="."?"root":e}function $ge(e,t){return t==="."?e:`${e}/${t}`}function pg(e){let t={schema:$cr,name:e.name,status:e.status};return e.command!==void 0&&e.command!==""&&(t.command=e.command),e.exitCode!==void 0&&Number.isFinite(e.exitCode)&&(t.exitCode=Math.trunc(e.exitCode)),e.durationMs!==void 0&&(t.durationMs=e.durationMs),e.summary!==void 0&&e.summary!==""&&(t.summary=e.summary),t}function R4(e){return JSON.stringify(e)}function T4(e){if(e.ok)return!1;for(let t of e.checks){if(t.status!=="failed")continue;let r=t.record.exitCode;if(r===0)continue;if(r===137)return!0;let n=t.record.summary??"";if(n.includes("feedback worktree setup failed")||n.includes("feedback worktree submodule init failed")||n.includes("feedback worktree install failed")||n.includes("SIGKILL")||/\b137\b/.test(n)||n.includes("maxBuffer length exceeded"))return!0}return!1}function B4(e,t){if(e==="passed")return"command exited 0";let r=t.replace(/\n+$/,"");return r===""?"command exited non-zero":r.split(`
|
|
525
525
|
`).slice(-20).join(" ").slice(0,1e3)}async function qcr(e,t,r,n,o,i){let s=new Map;for(let{name:a,script:c,scope:u}of r){if(!n.hasScript(u,c))continue;let l=$ge(t,u),d=await e(["pnpm","-C",l,c],{env:i});s.set(a,d.code===0?"passed":"failed")}return s}async function D4(e,t){let{worktree:r,scopes:n,layout:o,now:i,baselineWorktree:s,validationScope:a}=t,c=Hge(),u=t.quarantine??[],l=[],d=[],f=!1,p=m=>{l.push(m),d.push(R4(m.record))};try{Mat(u)}catch(m){if(m instanceof xP){let y={name:"quarantine:config-error",script:"test",label:"quarantine",scope:"",status:"failed",record:pg({name:"quarantine:config-error",status:"failed",summary:m.message})};return p(y),{ok:!1,checks:l,sidecar:d,baselineDowngraded:[],quarantined:[]}}throw m}for(let m of Ucr){if(n.length===0){let g=`${m}:no-package`,y=pg({name:g,status:"skipped",summary:"no package.json"});p({name:g,script:m,label:"no-package",scope:"",status:"skipped",record:y});continue}for(let g of n){let y=Gcr(g),E=`${m}:${y}`;if(!o.hasScript(g,m)){let L=pg({name:E,status:"skipped",summary:"script missing"});p({name:E,script:m,label:y,scope:g,status:"skipped",record:L});continue}let A=m==="test"?Fat(u,g):[];if(m==="test"&&A.length>0)for(let L of Lat(u,g)){let B=`quarantined:${L.pattern}`,P=pg({name:B,status:"skipped",summary:`quarantined \u2014 ${L.issue} (since ${L.since})`});p({name:B,script:"test",label:y,scope:g,status:"skipped",record:P})}let b=$ge(r,g),I=["pnpm","-C",b,m],w=A.length>0?[...I,"--",...A]:I,v=A.length>0?`pnpm -C ${b} ${m} -- ${A.join(" ")}`:`pnpm -C ${b} ${m}`,k=i(),R=await e(w,{env:c}),T=i()-k,U=R.code===0?"passed":"failed";U==="failed"&&(f=!0);let D=B4(U,`${R.stdout}${R.stderr}`),ee=pg({name:E,status:U,command:v,exitCode:R.code,durationMs:T,summary:D});p({name:E,script:m,label:y,scope:g,status:U,record:ee})}}if(n.length>0&&!n.includes(".")&&o.hasScript(".","typecheck")){let m="typecheck:workspace",g="workspace",y=".",E=$ge(r,"."),A=`pnpm -C ${E} typecheck`,b=i(),I=await e(["pnpm","-C",E,"typecheck"],{env:c}),w=i()-b,v=I.code===0?"passed":"failed";v==="failed"&&(f=!0);let k=B4(v,`${I.stdout}${I.stderr}`),R=pg({name:m,status:v,command:A,exitCode:I.code,durationMs:w,summary:k});p({name:m,script:"typecheck",label:g,scope:y,status:v,record:R})}if(f&&s){let m=l.filter(I=>I.status==="failed").map(I=>({name:I.name,script:I.script,scope:I.scope})),y=[...(await qcr(e,s,m,o,i,c)).entries()].filter(([,I])=>I==="failed").map(([I])=>I),E=Hcr(m.map(I=>I.name),y),A=new Set(E.preExistingFailures),b=[];for(let I=0;I<l.length;I+=1){let w=l[I];if(w.status==="failed"&&A.has(w.name)){let v=pg({name:w.name,status:"skipped",command:w.record.command,summary:"pre-existing failure on baseline"});l[I]={...w,status:"skipped",record:v},d[I]=R4(v),b.push(w.name)}}return f=E.shouldBlock,{ok:!f,checks:l,sidecar:d,baselineDowngraded:b,baselineProbeRan:!0,baselineFailures:E.preExistingFailures,quarantined:u,validationScope:a}}return{ok:!f,checks:l,sidecar:d,baselineDowngraded:[],quarantined:u,validationScope:a}}gx();async function Hat(e,t){let{repo:r,remote:n,branch:o,stillBehind:i,inSync:s}=t,a=`${n}/${o}`;return s?{ok:!0,action:"in-sync"}:i?{ok:(await e(["git","-C",r,"merge","--ff-only",a])).code===0,action:"fast-forward"}:(await e(["git","-C",r,"rebase",a])).code!==0?(await e(["git","-C",r,"rebase","--abort"]),{ok:!1,action:"rebase"}):{ok:!0,action:"rebase"}}async function Wat(e,t){let{repo:r,remote:n,base:o,branch:i}=t,s=t.maxPushRetries??2,a=`${n}/${o}`,c=async()=>(await e(["git","-C",r,"fetch",n,o,"--quiet"])).code!==0?{ok:!1,reason:"fetch-failed"}:(await e(["git","-C",r,"merge-base","--is-ancestor",a,"HEAD"])).code===0?{ok:!0,alreadyIntegrated:!0}:(await e(["git","-C",r,"rebase",a])).code!==0?t.resolveMechanical&&await t.resolveMechanical(r)?{ok:!0}:(await e(["git","-C",r,"rebase","--abort"]),{ok:!1,reason:"conflict"}):{ok:!0},u=await c();if(!u.ok)return u;if(u.alreadyIntegrated)return{ok:!0};for(let l=0;l<=s;l++){if((await e(["git","-C",r,"push",n,`HEAD:refs/heads/${i}`,"--force-with-lease"])).code===0)return{ok:!0};if(l<s){let f=await c();if(!f.ok)return f}}return{ok:!1,reason:"push-rejected"}}async function jat(e,t){let{repo:r,remote:n,branch:o,target:i,n:s,title:a,preMergeSha:c}=t,u=t.mergeTitle??`merge: #${s} ${a}`;return(await e(["git","-C",r,"merge","--no-ff","--no-verify",o,"-m",u])).code!==0?{ok:!1,rolledBack:!1}:(await e(["git","-C",r,"push",n,`HEAD:refs/heads/${i}`])).code!==0?(await e(["git","-C",r,"reset","--hard",c]),{ok:!1,rolledBack:!0}):{ok:!0,rolledBack:!1}}function zcr(e){let t=e.trim();if(t==="")return[];try{let r=JSON.parse(t);return Array.isArray(r)?r.flatMap(n=>{if(typeof n!="object"||n===null)return[];let o=n.name,i=n.state;return typeof o!="string"?[]:[{name:o,state:typeof i=="string"?i:""}]}):[]}catch{return[]}}function Vcr(e){let t=e.trim().toUpperCase();return t!==""&&t!=="PENDING"}async function Ycr(e,t,r,n){let o=n.maxPolls??30,i=n.intervalMs??1e4,s=n.check.trim().toLowerCase(),a=!1;for(let c=0;c<o;c++){let u=await e(["gh","-R",t,"pr","checks",String(r),"--json","name,state"]),l=zcr(u.stdout).find(d=>d.name.toLowerCase().includes(s));if(l!==void 0&&(a=!0,Vcr(l.state)))return"concluded";c+1<o&&await n.sleep(i)}return a?"timeout":"absent"}var iR=e=>typeof e=="string"?e.trim().toUpperCase():"";function Jcr(e){let t=iR(e.conclusion),r=iR(e.state);return["FAILURE","TIMED_OUT","CANCELLED","ACTION_REQUIRED","STARTUP_FAILURE","STALE"].includes(t)?!0:["FAILURE","ERROR"].includes(r)}function Kcr(e){let t=iR(e.status),r=iR(e.state),n=iR(e.conclusion);return!!(t!==""&&t!=="COMPLETED"||["PENDING","EXPECTED"].includes(r)||t==="COMPLETED"&&n==="")}function Zcr(e){let t=e.trim();if(t==="")return{mergeStateStatus:"",anyFailed:!1,anyPending:!1};try{let r=JSON.parse(t);if(typeof r!="object"||r===null)return{mergeStateStatus:"",anyFailed:!1,anyPending:!1};let n=r.mergeStateStatus,o=r.statusCheckRollup,i=Array.isArray(o)?o.filter(s=>typeof s=="object"&&s!==null):[];return{mergeStateStatus:typeof n=="string"?n:"",anyFailed:i.some(Jcr),anyPending:i.some(Kcr)}}catch{return{mergeStateStatus:"",anyFailed:!1,anyPending:!1}}}function Xcr(e){let t=iR(e.mergeStateStatus);return t==="DIRTY"||t==="BEHIND"?"conflict":e.anyFailed?"ci-failed":t==="CLEAN"?"merge":e.anyPending?"pending":t==="BLOCKED"||t==="UNSTABLE"||t==="HAS_HOOKS"?"merge":"pending"}async function eur(e,t,r,n){let o=n.maxPolls??60,i=n.intervalMs??1e4;for(let s=0;s<o;s++){let a=await e(["gh","-R",t,"pr","view",String(r),"--json","mergeStateStatus,statusCheckRollup"]),c=Xcr(Zcr(a.stdout));if(c!=="pending")return c;s+1<o&&await n.sleep(i)}return"pending"}var tur="Automated AFK landing for #";async function Q4(e,t){let{gitRepo:r,remote:n,target:o}=t,i=await e(["git","-C",r,"symbolic-ref","--short","HEAD"]);if(i.code!==0||i.stdout.trim()!==o)return;let s=await e(["git","-C",r,"status","--porcelain"]);s.code!==0||s.stdout.trim()!==""||(await e(["git","-C",r,"fetch",n,o,"--quiet"]),(await e(["git","-C",r,"merge-base","--is-ancestor",o,`${n}/${o}`])).code!==0)||await e(["git","-C",r,"merge","--ff-only",`${n}/${o}`])}async function Gat(e,t){let{repo:r,gitRepo:n,remote:o,branch:i,target:s,n:a,title:c,mergeTitle:u,worktree:l,waitForReview:d,ciAwait:f,onPrResolved:p,mergeQueue:m}=t;if(l&&(await e(["git","-C",l,"push",o,`HEAD:refs/heads/${i}`,"--force-with-lease"])).code!==0)return{ok:!1,reason:"push-failed"};let g=await Wge(e,{repo:r,branch:i,target:s,n:a,title:c,mergeTitle:u});if(g===void 0)return{ok:!1,reason:"no-pr"};if(p)try{await p(g)}catch{}if(d&&await Ycr(e,r,g,d),f){let A=await eur(e,r,g,f);if(A==="conflict")return{ok:!1,prNumber:g,reason:"conflict"};if(A==="ci-failed")return{ok:!1,prNumber:g,reason:"ci-failed"};if(A==="pending")return{ok:!1,prNumber:g,reason:"ci-pending"}}let y=["gh","-R",r,"pr","merge",String(g),"--merge"];return m&&y.push("--auto"),u&&y.push("--subject",u),(await e(y)).code!==0?{ok:!1,prNumber:g,reason:"merge-failed"}:m?{ok:!0,prNumber:g}:(await Q4(e,{gitRepo:n,remote:o,target:s}),{ok:!0,prNumber:g})}async function Wge(e,t){let{repo:r,branch:n,target:o,n:i,title:s}=t,a=t.mergeTitle??`merge: #${i} ${s}`,c=await $at(e,r,n,o);if(c===void 0){if((await e(["gh","-R",r,"pr","create","--base",o,"--head",n,"--title",Hr(a),"--body",Hr(`${tur}${i}. Per-attempt history lives in the issue Envelopes, the JSONL logs, and the \`afk-attempts/*\` snapshot branches.
|
|
526
526
|
|
|
@@ -824,7 +824,7 @@ requeued to ready-for-agent${e.activeBlocker?` (cleared active blocker: ${e.acti
|
|
|
824
824
|
`);let n;try{let i=await Tt("git",["branch","--show-current"],{cwd:t});n=i.code===0&&i.stdout.trim()||void 0}catch{}let o=aAr(e)??(n?sY(n):void 0);return!o||!n?(process.stderr.write(`[afk] /ship alias: could not infer issue or branch.
|
|
825
825
|
Run manually: red-skills-dev requeue #ISSUE --adopt-branch BRANCH --guidance 'reason'
|
|
826
826
|
`),1):(process.stderr.write(`[afk] /ship alias: routing to requeue #${o} --adopt-branch ${n}
|
|
827
|
-
`),iY([String(o),"--adopt-branch",n,"--guidance","Adopted via deprecated /ship alias (ADR 0081). Update guidance if needed."],t,r))}import{existsSync as LAr,statSync as UAr}from"node:fs";import{join as aft,basename as $Ar}from"node:path";function dY(e){let t={app:e,version:cAr(yR("__RED_BUILD_VERSION__",()=>"2.22.
|
|
827
|
+
`),iY([String(o),"--adopt-branch",n,"--guidance","Adopted via deprecated /ship alias (ADR 0081). Update guidance if needed."],t,r))}import{existsSync as LAr,statSync as UAr}from"node:fs";import{join as aft,basename as $Ar}from"node:path";function dY(e){let t={app:e,version:cAr(yR("__RED_BUILD_VERSION__",()=>"2.22.2")??"0.0.0-dev"),gitSha:yR("__RED_BUILD_GIT_SHA__",()=>"c2f9358445da0dccc39df2a5ff2596ded0b150f0")??"unknown",buildTime:yR("__RED_BUILD_TIME__",()=>"2026-07-09T14:45:33-03:00")??"unknown",bundleAsset:yR("__RED_BUNDLE_ASSET__",()=>"dev.bundle.min.mjs")??"unknown"},r=yR("__REDDB_SDK_VERSION__",()=>""),n=yR("__REDDB_BINARY_TAG__",()=>"");return r&&(t.reddbSdkVersion=r),n&&(t.reddbBinaryTag=n),t}function cAr(e){return e.startsWith("v")?e.slice(1):e}function Ydt(e){return`${e.app} ${e.version} ${e.gitSha}`}function yR(e,t){try{let r=t();return typeof r=="string"&&r.length>0?r:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}function fY(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.floor(e/1e3)}k`:String(e)}function Jdt(e){let t=(r,n)=>{let o=(Math.round(r*10)/10).toFixed(1);return`${o.endsWith(".0")?o.slice(0,-2):o}${n}`};return e>=1e9?t(e/1e9,"B"):e>=1e6?t(e/1e6,"M"):e>=1e3?t(e/1e3,"k"):String(e>0?e:0)}function Kdt(e){let t=e.toLowerCase();for(let r of["opus","sonnet","haiku","fable"])if(t.includes(r))return r;return e}function uAr(e){let t=Math.max(0,Math.floor(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60);if(r<60)return`${r}m${t%60}s`;let n=Math.floor(r/60);return n<24?`${n}h${r%60}m`:`${Math.floor(n/24)}d${n%24}h`}function pY(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m`;let r=Math.floor(t/60),n=t%60;return n>0?`${r}h${n}m`:`${r}h`}function lAr(e){let t=e.basename;if(e.branch){let r=e.branch;return r.length>28&&(r=`${r.slice(0,27)}\u2026`),`${t} (${r})`}return e.detachedSha?`${t} (detached ${e.detachedSha})`:t}function dAr(e){return!e||!e.model?null:e.effort?`${e.model}\xB7${e.effort}`:e.model}function fAr(e){if(!e)return null;let t=e.contextTokens;if(t===void 0||t===0)return null;let r=fY(t);return e.contextPercent===void 0?r:`${r} ${Math.round(e.contextPercent)}%`}function pAr(e){if(!e||e.workers<=0)return[];let t=[],r=(i,s)=>{t.push({label:i,value:s,suffix:""})};if(e.workers>0&&r("wrk=",String(e.workers)),e.sourceCounts&&e.sourceCounts.length>0)for(let{origin:i,count:s}of e.sourceCounts)r(`${i}=`,String(s));let n=e.cacheAgeS!==void 0?` (${pY(e.cacheAgeS)})`:"";if(e.queue>0&&t.push({label:"rdy=",value:String(e.queue),suffix:n}),e.human>0){let i=n&&e.queue===0?n:"";t.push({label:"hmn=",value:String(e.human),suffix:i})}e.blocked>0&&r("blk=",String(e.blocked));let o=[];return e.added>0&&o.push(`+${e.added}`),e.removed>0&&o.push(`-${e.removed}`),o.length&&r("loc=",e.locIsPeak?`~${o.join(" ")}`:o.join(" ")),e.waiting!==void 0&&e.waiting>0&&r("wai=",String(e.waiting)),e.tokens!==void 0&&e.tokens>0&&r("tok=",fY(e.tokens)),e.costUsd!==void 0&&e.costUsd>0&&r("usd=",e.costUsd.toFixed(2)),e.issues.forEach((i,s)=>{let a=e.stages?.[s],c=e.aliveMs?.[s],u=a?`\xB7${a}`:"";c!==void 0&&c>0&&(u+=`\xB7${uAr(c)}`),t.push({label:"#",value:String(i),suffix:u})}),t}function mAr(e){if(!e)return null;let t=[];return e.usage5h!==void 0&&t.push(`5h=${Math.round(e.usage5h)}%`),e.usage7d!==void 0&&t.push(`7d=${Math.round(e.usage7d)}%`),t.length?t.join(" "):null}function hAr(e){if(!e)return null;let t=[],r=e.cacheAgeS!==void 0?` (${pY(e.cacheAgeS)})`:"";if(e.openPrs&&e.openPrs>0&&t.push(`prs=${e.openPrs}${r}`),e.todayPrs&&e.todayPrs>0){let o=r&&(!e.openPrs||e.openPrs===0)?r:"";t.push(`cpr=${e.todayPrs}${o}`)}if(e.openIssues&&e.openIssues>0){let o=r&&(!e.openPrs||e.openPrs===0)&&(!e.todayPrs||e.todayPrs===0)?r:"";t.push(`iss=${e.openIssues}${o}`)}let n=[];return e.localAdded&&e.localAdded>0&&n.push(`+${e.localAdded}`),e.localRemoved&&e.localRemoved>0&&n.push(`-${e.localRemoved}`),n.length&&t.push(`loc=${n.join(" ")}`),t.length?t.join(" "):null}function gAr(e){let t=pAr(e);return t.length===0?null:t.map(r=>`${r.label}${r.value}${r.suffix}`).join(" ")}function Zdt(e){let t=[lAr(e.project)],r=dAr(e.claude);r!==null&&t.push(r);let n=fAr(e.claude);n!==null&&t.push(n);let o=mAr(e.claude);o!==null&&t.push(o);let i=hAr(e.repo);i!==null&&t.push(i);let s=gAr(e.afk);return s!==null&&t.push(s),t.join(" \xB7 ")}var AAr="\x1B[48;2;114;47;55m",yAr="\x1B[48;2;88;36;42m",Xdt="\x1B[49m",wC="\x1B[38;2;255;255;255m",eft="\x1B[38;2;255;214;214m",tft="\x1B[39m",hY="\x1B[38;2;224;138;148m",mY="\x1B[38;2;201;150;158m",xAr="\x1B[38;2;240;200;120m",rft="\x1B[1m",nft="\x1B[22m",oft="\x1B[0m",EAr=28,bAr=" ",WAe=["workerId","run","org","iss","stage","elapsed","loc","tks","tls","rsn","txt"],SAr=new Set(["requeue"]),CAr=e=>e.replace(/\x1b\[[0-9;]*m/g,"");function ift(e){return CAr(e).length}function IAr(e,t){return e+" ".repeat(Math.max(0,t-ift(e)))}var kC=(e,t)=>`${eft}${e}=${tft}${t}${hY}`;function wAr(e,t){let r=[];return e&&e>0&&r.push(`+${e}`),t&&t>0&&r.push(`-${t}`),r.length?r.join(" "):null}function kAr(e){let t="";if(e.branch){let n=e.branch.length>EAr?`${e.branch.slice(0,27)}\u2026`:e.branch;t=` ${mY}(${n})${wC}`}else e.detachedSha&&(t=` ${mY}(detached ${e.detachedSha})${wC}`);let r=e.version?` ${mY}v${e.version}${wC}`:"";return`${xAr}\xBB${wC} ${rft}${e.basename}${nft}${t}${r}`}function vAr(e){return!e||!e.model?null:e.effort?`${e.model}${mY}\xB7${wC}${e.effort}`:e.model}function RAr(e){if(!e||!e.contextTokens)return null;let t=fY(e.contextTokens),r=e.contextPercent===void 0?t:`${t} ${Math.round(e.contextPercent)}%`;return kC("ctx",r)}function BAr(e){if(!e)return[];let t=[];return e.usage5h!==void 0&&t.push(kC("5h",`${Math.round(e.usage5h)}%`)),e.usage7d!==void 0&&t.push(kC("7d",`${Math.round(e.usage7d)}%`)),t}function _Ar(e){if(!e)return[];let t=[],r=e.cacheAgeS!==void 0?` (${pY(e.cacheAgeS)})`:"";if(e.openPrs&&e.openPrs>0&&t.push(kC("prs",String(e.openPrs))+r),e.todayPrs&&e.todayPrs>0){let n=r&&(!e.openPrs||e.openPrs===0)?r:"";t.push(kC("cpr",String(e.todayPrs))+n)}if(e.openIssues&&e.openIssues>0){let n=r&&(!e.openPrs||e.openPrs===0)&&(!e.todayPrs||e.todayPrs===0)?r:"";t.push(kC("iss",String(e.openIssues))+n)}return t}function TAr(e){if(!e)return[];let t=wAr(e.localAdded,e.localRemoved);return t?[kC("loc",t)]:[]}function DAr(e,t,r){let n=`${yAr}${wC} ${kAr(e)} `,o=vAr(t);o!==null&&(n+=`${AAr}${wC} ${o} `),n+=`${Xdt}${hY}`;let i=[RAr(t),...BAr(t),..._Ar(r),...TAr(r)].filter(s=>s!==null);return i.length&&(n+=` ${i.join(" ")}`),`${n}${oft}`}function QAr(e,t){let r=Zlt(e,t),n=[r.runner,r.model?Kdt(r.model):void 0,r.effort].filter(i=>!!i).join(" "),o=r.origin!==void 0&&SAr.has(r.origin);return{workerId:r.workerId,run:`run=${n}`,org:`org=${r.origin||"afk"}`,iss:r.issue===null?"":`iss=${String(r.issue)}`,stage:r.issue===null?"":r.stage,elapsed:r.elapsed,loc:o?"":`loc=${rY(r.added,r.removed)}`,tks:o?"":`tks=${Jdt(r.tokens)}`,tls:o?"":`tls=${String(r.tools)}`,rsn:o?"":`rsn=${String(r.reasoning)}`,txt:o?"":`txt=${String(r.text)}`}}function OAr(e){let t=Object.fromEntries(WAe.map(r=>[r,0]));for(let r of e)for(let n of WAe)t[n]=Math.max(t[n],ift(r[n]));return t}function NAr(e,t){if(e==="workerId")return`${rft}${t}${nft}`;let r=t.indexOf("=");return r>0?`${eft}${t.slice(0,r+1)}${tft}${t.slice(r+1)}${hY}`:t}function PAr(e,t){let r=WAe.map(n=>NAr(n,IAr(e[n],t[n])));return`${Xdt}${hY}${r.join(bAr)}${oft}`}function MAr(e,t){let r=e.map(o=>QAr(o,t)),n=OAr(r);return r.map(o=>PAr(o,n))}function FAr(e,t={}){let r=[DAr(e.project,e.claude,e.repo)],n=t.now??0;return r.push(...MAr(t.workers??[],n)),r.join(`
|
|
828
828
|
`)}function sft(e,t,r={}){return t?FAr(e,r):Zdt(e)}Mo();function HAr(e){return new Promise(t=>{if(e.isTTY){t("");return}let r="",n=!1,o=()=>{n||(n=!0,t(r))};e.setEncoding("utf8"),e.on("data",i=>{r+=i}),e.on("end",o),e.on("error",o),e.on("close",o)})}function WAr(e){if(!e.trim())return{};try{let t=JSON.parse(e);return typeof t=="object"&&t!==null?t:{}}catch{return{}}}function jAr(e){try{return UAr(e).isDirectory()}catch{return!1}}function GAr(e,t,r){if(e&&jAr(e))return e;let n=t.workspace?.project_dir||t.workspace?.current_dir||t.cwd;return n||r}function qAr(e){let t=aft(e,".red","config.yaml");if(!LAr(t))return!0;let r=Cr(t,{warn:()=>{}});return!(Ze(r,"statusline")==="false"||Ze(r,"afk.statusline")==="false")}async function zAr(e){let t={cwd:e},r=dY("dev").version,n={basename:$Ar(e),version:r},o=await KN(t);if(o)return{...n,branch:o};let i=await ig(t);return i?{...n,detachedSha:i}:n}function VAr(e){let t=e.model?.display_name,r=e.effort?.level,n=e.context_window?.total_input_tokens,o=e.context_window?.used_percentage,i=e.rate_limits?.five_hour?.used_percentage,s=e.rate_limits?.seven_day?.used_percentage;if(!(t===void 0&&n===void 0&&i===void 0&&s===void 0))return{model:t||void 0,effort:r||void 0,contextTokens:n,contextPercent:o,usage5h:i,usage7d:s}}async function cft(e,t=process.cwd(),r=process.stdout,n=process.stdin){if(e.includes("--legend"))return r.write(`${nY()}
|
|
829
829
|
`),0;let o=e[0],i=await HAr(n),s=WAr(i),a=GAr(o,s,t);if(!qAr(a))return 0;let c=await zAr(a),u=VAr(s),l={root:a,repo:Zv(a),remote:"origin"},d=Cr(aft(a,".red","config.yaml"),{warn:()=>{}}),f=u4(process.env,I=>Ze(d,I)),[p,m,g]=await Promise.all([Xst(l,f),Kst(l,f).then(I=>I??void 0),Zst(l)]),y=!process.env.NO_COLOR,E=Number.parseInt(process.env.COLUMNS??"",10),A=Math.floor(Date.now()/1e3),b=sft({project:c,claude:u,repo:p,afk:m},y,{columns:Number.isFinite(E)&&E>0?E:void 0,workers:g,now:A});return r.write(`${b}
|
|
830
830
|
`),0}async function uft(e,t=process.cwd()){let r=e[0]??t,n="",o="";for(let i=1;i<e.length;i+=1){let s=e[i];s==="--repo"?n=e[++i]??"":s==="--lock"&&(o=e[++i]??"")}return await Jst(r,n||Zv(r),o||void 0),0}NC();import{spawn as Ift}from"node:child_process";import{existsSync as GAe,openSync as kft,closeSync as nyr,writeFileSync as vft,writeSync as oyr,rmSync as qAe,renameSync as iyr}from"node:fs";import{join as vC}from"node:path";import{existsSync as YAr,readdirSync as FP,readFileSync as gY,statSync as pft}from"node:fs";import{join as cs}from"node:path";eu();Gd();function JAr(e,t){return cs(e,`afk-supervisor-slot-${t}.log`)}function KAr(e){let t;try{t=gY(e,"utf8")}catch{return[]}let r=[],n=new Set;for(let o of t.split(`
|
|
@@ -6515,7 +6515,7 @@ Usage:
|
|
|
6515
6515
|
${r} archive --candidate <json> [--root <dir>] [--archive-dir <rel>]
|
|
6516
6516
|
${r} restore <name> [--root <dir>] [--archive-dir <rel>]`}function nL(r){return ygr(typeof r.root=="string"?r.root:process.cwd())}function Dct(r){return typeof r["archive-dir"]=="string"?r["archive-dir"]:void 0}async function YW(r){let s=await Mu(r);return s?s.mode!=="graph"?{ok:!1,message:`curate: skill telemetry needs graph mode (this project is "${s.mode}") \u2014 run \`${_De}\``}:uh(s)?{ok:!0}:{ok:!1,message:`curate: skill telemetry is not enabled here \u2014 run \`${_De}\``}:{ok:!1,message:`curate: memory is not initialized here \u2014 run \`${_De}\``}}function bgr(){let r=hgr(vgr(import.meta.url));return r.includes("dist/curate-skill")||r.endsWith("dist/curate-skill")?Ect(r,"..","cli.js"):Ect(r,"..","cli.ts")}async function Sgr(r,s){let l=["curate","skills","--json"];s!==void 0&&l.push("--stale-days",String(s));let f=bgr(),v=f.endsWith(".ts")?Cct(process.execPath,["--import","tsx",f,...l,"--root",r],{encoding:"utf8"}):Cct(process.execPath,[f,...l,"--root",r],{encoding:"utf8"}),T=v.status??1;if(T!==0)throw new Error(`memory curate skills exited ${T}`);return kct(v.stdout??"")}function xgr(r){return typeof r.flags["stale-days"]=="string"?Number(r.flags["stale-days"]):void 0}async function Act(r,s){return(s.loadCuratorReport??Sgr)(nL(r.flags),xgr(r))}async function kgr(r){let s=nL(r.flags),l=await YW(s);return l.ok?(console.log("curate: skill telemetry is enabled \u2014 ready to curate"),0):(console.error(l.message),2)}async function wgr(r,s){let l=nL(r.flags),f=await YW(l);if(!f.ok)return console.error(f.message),2;let _;try{_=await Act(r,s)}catch(B){return console.error(`curate: ${B.message}`),1}let{candidates:v,byCategory:T,filtered:N}=fDe(_);return console.log(JSON.stringify({candidates:v,byCategory:T,filtered:N,totals:{totalSkills:_.totalSkills,curatableSkills:_.curatableSkills,readOnlySkills:_.readOnlySkills}},null,2)),0}async function Tgr(r,s){let l=nL(r.flags),f=await YW(l);if(!f.ok)return console.error(f.message),2;let _;try{_=await Act(r,s)}catch(B){return console.error(`curate: ${B.message}`),1}let{byCategory:v}=fDe(_);if(pDe(v)===0)return console.error("curate: no candidates \u2014 no issue filed"),0;let T=typeof r.flags.label=="string"?r.flags.label:void 0,N=await Tct({byCategory:v,totals:{totalSkills:_.totalSkills,curatableSkills:_.curatableSkills,readOnlySkills:_.readOnlySkills},generatedAt:_.generatedAt},{cwd:l,label:T});return console.log(`curate: filed background issue \u2014 ${N.output||N.title}`),0}async function Cgr(r){let s=nL(r.flags),l=await YW(s);if(!l.ok)return console.error(l.message),2;let f=r.flags.candidate;if(typeof f!="string")return console.error("curate archive: --candidate <json> is required"),2;let _;try{_=JSON.parse(f)}catch(T){return console.error(`curate archive: invalid --candidate JSON: ${T.message}`),2}let v=await Sct(_,{rootDir:s,archiveDir:Dct(r.flags)});return v.ok?(console.log(`curate: archived "${v.receipt.name}" \u2192 ${v.receipt.archiveRoot} (${v.receipt.files.length} file(s), manifest at ${v.receipt.manifestPath})`),0):(console.error(`curate archive: refused \u2014 ${v.rejection.reason}: ${v.rejection.detail}`),3)}async function Egr(r){let s=nL(r.flags),l=await YW(s);if(!l.ok)return console.error(l.message),2;let f=r.positional[0];if(!f)return console.error("curate restore: skill name is required"),2;let _=await xct(f,{rootDir:s,archiveDir:Dct(r.flags)});return console.log(`curate: restored "${_.name}" \u2192 ${_.restoredRoot} (${_.files.length} file(s) hash-verified)`),0}async function Nct(r,s={}){switch(r.command){case"check":return kgr(r);case"list":return wgr(r,s);case"background":return Tgr(r,s);case"archive":return Cgr(r);case"restore":return Egr(r);case void 0:case"--help":case"-h":return console.log(Pct(s.usageCommand)),0;default:return console.error(`unknown curate subcommand: ${r.command}
|
|
6517
6517
|
|
|
6518
|
-
${Pct(s.usageCommand)}`),2}}function Ict(r){let s={app:r,version:Pgr(iL("__RED_BUILD_VERSION__",()=>"2.22.
|
|
6518
|
+
${Pct(s.usageCommand)}`),2}}function Ict(r){let s={app:r,version:Pgr(iL("__RED_BUILD_VERSION__",()=>"2.22.2")??"0.0.0-dev"),gitSha:iL("__RED_BUILD_GIT_SHA__",()=>"c2f9358445da0dccc39df2a5ff2596ded0b150f0")??"unknown",buildTime:iL("__RED_BUILD_TIME__",()=>"2026-07-09T14:45:33-03:00")??"unknown",bundleAsset:iL("__RED_BUNDLE_ASSET__",()=>"memory.bundle.min.mjs")??"unknown"},l=iL("__REDDB_SDK_VERSION__",()=>"1.7.0"),f=iL("__REDDB_BINARY_TAG__",()=>"v1.7.0");return l&&(s.reddbSdkVersion=l),f&&(s.reddbBinaryTag=f),s}function Pgr(r){return r.startsWith("v")?r.slice(1):r}function Rct(r){return`${r.app} ${r.version} ${r.gitSha}`}function iL(r,s){try{let l=s();return typeof l=="string"&&l.length>0?l:void 0}catch{return process.env[r.replace(/^__|__$/g,"")]}}var Oct=`memory \u2014 governed operational memory for code agents
|
|
6519
6519
|
|
|
6520
6520
|
Common workflows:
|
|
6521
6521
|
remember one fact memory store "Decision: ..."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reddb-io/red-skills",
|
|
3
|
-
"version": "2.22.
|
|
3
|
+
"version": "2.22.2",
|
|
4
4
|
"description": "RedSkills plugin runtime bundles (dev, memory, brain) distributed over npm — the v2 client transport (ADR 0091). Carries the platform-independent JS bundles inside the tarball plus thin bin shims; no postinstall download.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|