noskills 4.1.49 → 4.1.53

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.
Files changed (101) hide show
  1. package/README.md +345 -890
  2. package/chunks/{anthropic-UTLWCK66.js → anthropic-LDUWIUPL.js} +1 -1
  3. package/chunks/approve-ZX62EG5U.js +1 -0
  4. package/chunks/{ask-KPIHJIJZ.js → ask-VGI3BFZW.js} +1 -1
  5. package/chunks/block-ERQESYMH.js +1 -0
  6. package/chunks/cancel-FOVCYBQY.js +1 -0
  7. package/chunks/{chunk-K223KAUB.js → chunk-2GF5IUQD.js} +1 -1
  8. package/chunks/chunk-5CNPFLE6.js +1 -0
  9. package/chunks/chunk-5P46WSNG.js +5 -0
  10. package/chunks/{chunk-AQWB2PVR.js → chunk-5URW6X3N.js} +93 -92
  11. package/chunks/{chunk-7OIAMA3E.js → chunk-6YHWLEJ4.js} +26 -26
  12. package/chunks/chunk-AP3YBNPX.js +1 -0
  13. package/chunks/{chunk-OCDUS26F.js → chunk-DEIZVYT6.js} +1 -1
  14. package/chunks/chunk-H77MLIL5.js +4 -0
  15. package/chunks/{chunk-TI4CLT2V.js → chunk-HNAHPI6V.js} +1 -1
  16. package/chunks/chunk-JVCVWI3B.js +3 -0
  17. package/chunks/{chunk-ESTTTPON.js → chunk-KYQ77E7T.js} +1 -1
  18. package/chunks/{chunk-JCIANZPY.js → chunk-LBPD4EIH.js} +1 -1
  19. package/chunks/chunk-OKM4FE4G.js +1 -0
  20. package/chunks/chunk-OVLGUKPG.js +1 -0
  21. package/chunks/chunk-PKYW3S5P.js +5 -0
  22. package/chunks/chunk-RGGYSKJY.js +5 -0
  23. package/chunks/chunk-RJX4ZXQ4.js +2 -0
  24. package/chunks/{chunk-WWPJMOT3.js → chunk-SVJVJDZR.js} +1 -1
  25. package/chunks/chunk-UG26APX2.js +3 -0
  26. package/chunks/{chunk-2X2U2VC5.js → chunk-UT6ZCLRA.js} +1 -1
  27. package/chunks/chunk-XNGHRJVK.js +1 -0
  28. package/chunks/{chunk-CLCZ7IO3.js → chunk-YSSDQJTT.js} +1 -1
  29. package/chunks/chunk-YTNM7A5Y.js +3 -0
  30. package/chunks/chunk-Z3O5HAIO.js +2 -0
  31. package/chunks/claude-code-BWCSAVK2.js +1 -0
  32. package/chunks/{cmd-NWSNAUKC.js → cmd-ZXO6KFK6.js} +1 -1
  33. package/chunks/concern-2PON4VPG.js +1 -0
  34. package/chunks/{config-EPT7NOOO.js → config-CZDLCSOC.js} +1 -1
  35. package/chunks/delegate-VRPCGUT2.js +1 -0
  36. package/chunks/diagrams-D5CYTTWA.js +1 -0
  37. package/chunks/diagrams-I2QKL7WR.js +1 -0
  38. package/chunks/done-WQDGQZ5D.js +1 -0
  39. package/chunks/followup-Q3RLSNNM.js +1 -0
  40. package/chunks/free-R4ZTZ76O.js +1 -0
  41. package/chunks/init-HTCNOWTZ.js +1 -0
  42. package/chunks/invoke-hook-675IUCLN.js +13 -0
  43. package/chunks/kiro-RGYUKJAX.js +3 -0
  44. package/chunks/learn-MWUFAR2G.js +7 -0
  45. package/chunks/{list-FWRKOILC.js → list-6EQP6VUL.js} +1 -1
  46. package/chunks/manager-Q7DRXNNO.js +6 -0
  47. package/chunks/{mod-LORCBZWH.js → mod-A77UWGGG.js} +1 -1
  48. package/chunks/mod-TYCXSLSH.js +1 -0
  49. package/chunks/next-7W4YVHSZ.js +7 -0
  50. package/chunks/{ollama-VSBCL6RB.js → ollama-LTZ43OHQ.js} +1 -1
  51. package/chunks/opencode-PZDL7VDP.js +1 -0
  52. package/chunks/pack-DXWS4PMA.js +5 -0
  53. package/chunks/{purge-573OIQZI.js → purge-XZ5EOCFP.js} +1 -1
  54. package/chunks/reopen-VATALF56.js +1 -0
  55. package/chunks/reset-BL73UVLM.js +1 -0
  56. package/chunks/review-VF6JOTLX.js +1 -0
  57. package/chunks/rule-ODX4WMCS.js +6 -0
  58. package/chunks/run-J5Z6R4DP.js +3 -0
  59. package/chunks/{sdk-LHBUQS75.js → sdk-6IMATOQ3.js} +8 -8
  60. package/chunks/session-DFMI2GCC.js +1 -0
  61. package/chunks/spec-3PAUTPIT.js +1 -0
  62. package/chunks/status-5JHFFTMD.js +1 -0
  63. package/chunks/sync-CVEZ4FMQ.js +1 -0
  64. package/chunks/watch-I7Q3AEAQ.js +8 -0
  65. package/chunks/web-JOWEH622.js +1 -0
  66. package/chunks/wontfix-CJMNFDCG.js +1 -0
  67. package/noskills.js +1 -1
  68. package/package.json +1 -1
  69. package/chunks/approve-LCVVXAE3.js +0 -1
  70. package/chunks/block-MNFFAMEP.js +0 -1
  71. package/chunks/cancel-M3G3XXMU.js +0 -1
  72. package/chunks/chunk-4N7N37OY.js +0 -1
  73. package/chunks/chunk-MSJSMJL2.js +0 -1
  74. package/chunks/chunk-NLLZQP64.js +0 -1
  75. package/chunks/chunk-NRCHLNQA.js +0 -3
  76. package/chunks/chunk-ON7NJA2P.js +0 -3
  77. package/chunks/chunk-RMCTOOQL.js +0 -1
  78. package/chunks/chunk-RTD42HPS.js +0 -2
  79. package/chunks/chunk-U3JLX6DY.js +0 -1
  80. package/chunks/chunk-Y2PH2BTY.js +0 -16
  81. package/chunks/claude-code-R7PCCNRZ.js +0 -1
  82. package/chunks/concern-NQODAEHU.js +0 -1
  83. package/chunks/done-XDWNPZVT.js +0 -1
  84. package/chunks/free-MXG3ZUQY.js +0 -1
  85. package/chunks/init-NJ7KI65T.js +0 -1
  86. package/chunks/invoke-hook-D6BRYBNY.js +0 -11
  87. package/chunks/kiro-3VFHKARM.js +0 -3
  88. package/chunks/manager-BIVHW3S7.js +0 -6
  89. package/chunks/next-LQLZL4LN.js +0 -8
  90. package/chunks/opencode-YE3RKOY7.js +0 -1
  91. package/chunks/pack-5U7QBA2H.js +0 -5
  92. package/chunks/reopen-IR7FAPQE.js +0 -1
  93. package/chunks/reset-XY2HW67W.js +0 -1
  94. package/chunks/rule-YI5GBUAS.js +0 -6
  95. package/chunks/run-B6BBYCQM.js +0 -3
  96. package/chunks/session-5BLO37XK.js +0 -1
  97. package/chunks/spec-W52NAT6U.js +0 -1
  98. package/chunks/status-DJZSCXLA.js +0 -1
  99. package/chunks/sync-A44KPO5R.js +0 -1
  100. package/chunks/watch-I7NEY7YJ.js +0 -8
  101. package/chunks/wontfix-JULEBOGK.js +0 -1
@@ -1 +1 @@
1
- import{a as p}from"./chunk-U3JLX6DY.js";import{c as t,d as a,g as l,m as n,o,q as m,r as d}from"./chunk-K223KAUB.js";import{a as i}from"./chunk-2N4GTHXQ.js";import"./chunk-ON7NJA2P.js";import"./chunk-RMCTOOQL.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var $=async b=>{let e=o({renderer:d.ansi(),sink:m.stdout()});e.writeln(t("AI Providers")),e.writeln("");let r=await p(),v=r.map(s=>[s.available?l("\u25CF"):a("\u25CB"),s.available?t(`${s.name} (${s.alias})`):a(`${s.name} (${s.alias})`),a(s.type),s.available?s.detail:a(s.detail)]);e.writeln(n(["","Provider","Type","Status"],v));let u=r.filter(s=>s.available).length;return e.writeln(a(`${u}/${r.length} providers available`)),await e.close(),i(void 0)};export{$ as main};
1
+ import{a as p}from"./chunk-AP3YBNPX.js";import{c as t,d as a,g as l,m as n,o,q as m,r as d}from"./chunk-2GF5IUQD.js";import"./chunk-JVCVWI3B.js";import{a as i}from"./chunk-2N4GTHXQ.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var $=async b=>{let e=o({renderer:d.ansi(),sink:m.stdout()});e.writeln(t("AI Providers")),e.writeln("");let r=await p(),v=r.map(s=>[s.available?l("\u25CF"):a("\u25CB"),s.available?t(`${s.name} (${s.alias})`):a(`${s.name} (${s.alias})`),a(s.type),s.available?s.detail:a(s.detail)]);e.writeln(n(["","Provider","Type","Status"],v));let u=r.filter(s=>s.available).length;return e.writeln(a(`${u}/${r.length} providers available`)),await e.close(),i(void 0)};export{$ as main};
@@ -0,0 +1,6 @@
1
+ import"./chunk-5P46WSNG.js";import{c as H,d as he,e as be,p as O,q as a,r as V,s as j,t as J,u as Z,v as z,w as we}from"./chunk-YTNM7A5Y.js";import"./chunk-PKYW3S5P.js";import{a as Le}from"./chunk-RJX4ZXQ4.js";import{b as ae,c as oe}from"./chunk-H77MLIL5.js";import"./chunk-KYQ77E7T.js";import{h as ie}from"./chunk-HNAHPI6V.js";import"./chunk-OKM4FE4G.js";import{A as se,B as Re,C as De,d as Se,e as Ee,f as ee,j as Te,l as xe,m as ve,t as te,w as Ie,y as Me}from"./chunk-5URW6X3N.js";import{b as re}from"./chunk-UT6ZCLRA.js";import"./chunk-2GF5IUQD.js";import{d as Pe,e as ne,f as Ce}from"./chunk-JVCVWI3B.js";import{a as Q,b as ye}from"./chunk-2N4GTHXQ.js";import{i as N}from"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var Ye=["IDLE","DISCOVERY","REVIEW","DRAFT","APPROVED","EXECUTING","DONE","IDLE"],Ge=e=>{let n={DISCOVERY_REVIEW:"REVIEW",SPEC_DRAFT:"DRAFT",SPEC_APPROVED:"APPROVED",COMPLETED:"DONE",BLOCKED:"EXECUTING"}[e]??e;return Ye.map(r=>r===n?`[ ${r} ]`:r).join(" \u2192 ")},Ae=async(e,s)=>{let n;try{n=await Te(e,s)}catch{n=await Ee(e)}let r=await Le(e,s),l=new Set(n.execution.completedTasks??[]),t=(r?.tasks??[]).map(u=>({id:u.id,description:u.title,done:l.has(u.id),...u.files!==void 0&&u.files.length>0?{files:u.files}:{}})),b=[...new Set(n.discovery.answers.map(u=>"user"in u?u.user:null).filter(u=>u!==null&&u!=="Unknown User"))],E=(n.specNotes??[]).filter(u=>u.text.startsWith("[QUESTION] ")).map(u=>({id:u.id,text:u.text.replace("[QUESTION] ",""),user:u.user,ts:u.timestamp})),v=n.transitionHistory??[],g=v.length>0?v[0].timestamp:new Date().toISOString(),I=n.lastCalledAt??g,S=n.execution.confidenceFindings??[],h=S.length>0?Math.round(S.reduce((u,i)=>u+i.confidence,0)/S.length*10)/10:null,M=S.filter(u=>u.confidence<5).length;return{name:s,slug:s,phase:n.phase,description:n.specDescription??"",tasks:t,contributors:b,delegations:n.discovery.delegations??[],pendingQuestions:E,pendingSignoffs:[],roadmap:Ge(n.phase),createdAt:g,updatedAt:I,avgConfidence:h,lowConfidenceItems:M}},K=async e=>{let s=await xe(e),n=new Set(s.map(i=>i.name));try{let i=`${e}/${Se.specsDir}`;for await(let m of(await import("./mod-TYCXSLSH.js")).runtime.fs.readDir(i))m.isDirectory&&!n.has(m.name)&&n.add(m.name)}catch{}let r=[];for(let i of n)try{r.push(await Ae(e,i))}catch{}r.sort((i,m)=>{let T=i.phase!=="COMPLETED"&&i.phase!=="IDLE",R=m.phase!=="COMPLETED"&&m.phase!=="IDLE";return T&&!R?-1:!T&&R?1:m.updatedAt.localeCompare(i.updatedAt)});let l=r.find(i=>i.phase!=="COMPLETED"&&i.phase!=="IDLE")??null,t=await ae(e,{limit:50}),b=t.filter(i=>i.type==="mention"),E=new Set(t.filter(i=>i.type==="mention-reply").map(i=>i.mentionId)),v=b.filter(i=>!E.has(i.id)).map(i=>({id:i.id??"",spec:i.spec,from:i.from??i.user,to:i.to??"",question:i.question??"",status:"pending",ts:i.ts})),I=t.filter(i=>i.type==="signoff").filter(i=>i.status==="pending").map(i=>({spec:i.spec,role:i.role??"",status:"pending",ts:i.ts})),S=await ie(e),h=S!==void 0?{name:S.name,email:S.email}:null,u=(await ve(e))?.roles??null;return{specs:r,activeSpec:l,pendingMentions:v,pendingSignoffs:I,recentEvents:t,currentUser:h,roles:u}};var ke=()=>({tabs:[],selectedTabIndex:-1,focus:"list",running:!0,specsVisible:!0,monitorVisible:!0});var Ze=e=>e===null?"\u2014":{DISCOVERY:"DISC",DISCOVERY_REVIEW:"REVW",SPEC_DRAFT:"DRFT",SPEC_APPROVED:"APPR",EXECUTING:"EXEC",BLOCKED:"BLKD",COMPLETED:"DONE",IDLE:"IDLE"}[e]??e.slice(0,4),et=e=>{switch(e){case"EXECUTING":return"green";case"DISCOVERY":case"DISCOVERY_REVIEW":return"cyan";case"BLOCKED":return"red";case"SPEC_DRAFT":case"SPEC_APPROVED":return"yellow";case"COMPLETED":return"dim";default:return"dim"}},tt=(e,s)=>{switch(s){case"green":return a.green(e);case"yellow":return a.yellow(e);case"red":return a.red(e);case"cyan":return a.cyan(e);case"dim":return a.dim(e);default:return e}},A=(e,s)=>{let n=new Set(s.filter(l=>l.spec!==null).map(l=>l.spec)),r=e.map(l=>({label:l.name,badge:Ze(l.phase),badgeColor:et(l.phase),active:n.has(l.name),dimmed:l.phase==="COMPLETED"}));return r.length===0&&r.push({label:"No specs yet",dimmed:!0,selectable:!1}),r},ce=(e,s,n,r)=>{let l=A(e,s),t=V.drawBox({x:r.x,y:r.y,width:r.width,height:r.height,title:"Specs",borderStyle:"rounded"}),b=r.width-2,E=r.height-2,v=Math.max(0,Math.min(n,l.length-1)),g=z.ensureVisible(z.createScrollState(l.length,E),v),I=z.visibleRange(g),S=[];for(let u=0;u<E;u++){let i=I.start+u,m=r.y+1+u;if(i>=I.end||i>=l.length){S.push(a.moveTo(m,r.x+1)+" ".repeat(b));continue}let T=l[i];if(T===void 0){S.push(a.moveTo(m,r.x+1)+" ".repeat(b));continue}let R=T.selectable!==!1,f=i===n&&R,D=T.active?a.green("\u25CF"):f?"\u25B8":" ",C=T.badge!==void 0?" "+tt(`[${T.badge}]`,T.badgeColor??"dim"):"",F=T.dimmed?a.dim(T.label):T.label,Y=` ${D} ${F}${C}`,U=a.truncate(Y,b),c=Math.max(0,b-a.visibleLength(U));f?S.push(a.moveTo(m,r.x+1)+a.inverse(U+" ".repeat(c))):S.push(a.moveTo(m,r.x+1)+U+" ".repeat(c))}let h={id:r.id,x:r.x,y:r.y+1,width:r.width-1,height:E},M=z.renderScrollbar(h,g);return t+S.join("")+M};var nt=["IDLE","DISCOVERY","REVIEW","DRAFT","APPROVED","EXECUTING","DONE","IDLE"],rt=e=>{if(e===null||e==="IDLE")return"IDLE";let n={DISCOVERY_REVIEW:"REVIEW",SPEC_DRAFT:"DRAFT",SPEC_APPROVED:"APPROVED",COMPLETED:"DONE"}[e]??e;return nt.map(r=>r===n?a.bold(`\u2726${r}\u2726`):a.dim(r)).join("\u2192")},it=(e,s,n)=>{if(s===0)return a.dim("no tasks");let r=Math.round(e/s*n),l=n-r;return a.green("\u2588".repeat(r))+a.dim("\u2591".repeat(l))+` ${e}/${s}`},le=(e,s,n)=>{let r=[];return e===null?(r.push(a.bold("Mode: ")+a.cyan("IDLE")),r.push(a.dim("No active spec"))):e.mode==="free"?(r.push(a.bold("Mode: ")+a.cyan("IDLE")),r.push(a.dim("No active spec")),r.push(""),r.push(a.dim(`Session: ${e.sessionId}`))):(r.push(a.bold("Spec: ")+(e.spec??"unknown")),r.push(a.bold("Phase: ")+(e.phase??"unknown")),r.push(""),r.push(rt(e.phase)),r.push(""),n!==void 0&&r.push(a.bold("Progress: ")+it(n.completed,n.total,15)),r.push(""),r.push(a.dim(`Session: ${e.sessionId}`))),V.fillBox({x:s.x,y:s.y,width:s.width,height:s.height,title:"Monitor",borderStyle:"rounded"},r)};var ot=e=>({DISCOVERY:"DISC",DISCOVERY_REVIEW:"REVW",SPEC_DRAFT:"DRFT",SPEC_APPROVED:"APPR",EXECUTING:"EXEC",BLOCKED:"BLKD",COMPLETED:"DONE",IDLE:"IDLE"})[e]??e.slice(0,4),ct=e=>{switch(e){case"EXECUTING":return"green";case"DISCOVERY":case"DISCOVERY_REVIEW":return"cyan";case"BLOCKED":return"red";case"SPEC_DRAFT":case"SPEC_APPROVED":return"yellow";case"COMPLETED":return"dim";default:return"dim"}},lt=e=>e.map(s=>({id:s.id,label:s.spec!==null?s.spec:"IDLE",badge:s.phase!==null?ot(s.phase):void 0,badgeColor:s.phase!==null?ct(s.phase):void 0,closable:!0})),Ve=(e,s,n,r,l=1)=>{let t=[];if(t.push(a.moveTo(r,l)),e.length===0){let v=a.dim(" No tabs \u2014 press n to create one ");return t.push(v+" ".repeat(Math.max(0,n-a.visibleLength(v)))),t.join("")}let b=lt(e),E=we.renderTabBar({tabs:b,activeIndex:s,maxWidth:n,style:"inverse"});return t.push(E),t.join("")};var de=(e,s,n,r)=>{let l="Terminal",t=n??[],b=r??0,E=s.y-1,v=s.width,g=Ve(t,b,v,E,s.x),I=e!==null&&e.widget!==null,S=V.drawBox({x:s.x,y:s.y,width:s.width,height:s.height,title:l,borderStyle:"rounded",skipInterior:I});if(t.length===0){let u=a.dim("No tabs \u2014 press n to create one"),i=" ".repeat(Math.max(0,s.width-2)),m="",T=Math.floor((s.height-2)/2);for(let R=1;R<s.height-1;R++)if(m+=a.moveTo(s.y+R,s.x+1),R===T){let f=a.visibleLength(u),D=Math.max(0,Math.floor((s.width-2-f)/2));m+=" ".repeat(D)+u+" ".repeat(Math.max(0,s.width-2-D-f))}else m+=i;return g+S+m}if(e===null||e.widget===null&&e.buffer.length===0){let u=" ".repeat(Math.max(0,s.width-2)),i="";for(let m=1;m<s.height-1;m++)i+=a.moveTo(s.y+m,s.x+1),i+=u;return g+S+i}if(e.widget!==null)return g+S+e.widget.render(s);let h=s.height-2,M=e.buffer.slice(-h);return g+V.fillBox({x:s.x,y:s.y,width:s.width,height:s.height,title:l,borderStyle:"rounded"},M)};var ue=(e,s)=>({...e,tabs:[...e.tabs,s],selectedTabIndex:e.tabs.length}),X=(e,s)=>{let n=e.tabs.findIndex(t=>t.id===s);if(n===-1)return e;let r=e.tabs[n];r.process!==null&&r.process.kill();let l=e.tabs.filter(t=>t.id!==s);return{...e,tabs:l,selectedTabIndex:Math.min(e.selectedTabIndex,l.length-1)}},Be=(e,s)=>s<0||s>=e.tabs.length?e:{...e,selectedTabIndex:s},pe=(e,s)=>{let n=s.split(`
2
+ `);for(let r of n)e.buffer.push(r);e.buffer.length>1e3&&e.buffer.splice(0,e.buffer.length-1e3)},k=e=>e.selectedTabIndex<0||e.selectedTabIndex>=e.tabs.length?null:e.tabs[e.selectedTabIndex]??null;var me=(e,s,n)=>{if(e.focus==="terminal")return n&&s==="c"?{type:"quit"}:s==="escape"?{type:"toggleFocus"}:{type:"passthrough",data:s};if(n&&s==="c")return{type:"quit"};if(n&&s==="d")return{type:"quit"};if(n&&s==="t")return{type:"newTab"};if(s==="tab"||s==="escape")return{type:"toggleFocus"};if(n&&s==="e")return{type:"toggleSpecs"};if(n&&s==="w")return{type:"toggleMonitor"};if(e.focus==="list")switch(s){case"up":return{type:"navigate",direction:"up"};case"down":return{type:"navigate",direction:"down"};case"return":return{type:"select"};case"n":return{type:"newTab"};case"x":return{type:"closeTab"};case"q":return{type:"quit"};default:return{type:"none"}}return{type:"passthrough",data:s}},Fe=e=>({...e,focus:e.focus==="list"?"terminal":"list"}),fe=(e,s,n)=>{let r=j.nextSelectableIndex(n,e.selectedTabIndex,s);return{...e,selectedTabIndex:r}},ge=(e,s,n)=>e>=n.x&&e<n.x+n.width&&s>=n.y&&s<n.y+n.height,Ue=(e,s,n,r)=>{let l=e.x+1,t=e.y+1;if(ge(l,t,s.left)){if(e.type==="wheel")return{type:"scrollSpecs",direction:e.direction==="up"?"up":"down"};if(e.type==="mousedown"&&e.button===0){let b=e.y+1-s.left.y-1;if(b>=0&&b<n.length&&n[b].selectable!==!1)return{type:"clickSpec",index:b}}return{type:"none"}}return ge(l,t,s.rightBottom)?e.type==="wheel"?{type:"scrollTerminal",direction:e.direction==="up"?"up":"down"}:r!=="terminal"?{type:"clickTerminal"}:{type:"forwardMouse",event:e}:ge(l,t,s.rightTop)?{type:"clickMonitor"}:{type:"none"}};var Zt=async e=>{let s=e?.includes("--dry-run")??!1,{root:n}=await De();if(!await Re(n))return console.error("noskills is not initialized. Run:",re(),"init"),ye({exitCode:1});let l=(await K(n)).specs.map(c=>({name:c.name,phase:c.phase,hasActiveSession:!1})),t=ke(),{cols:b,rows:E}=O.getTerminalSize(),v=(c,d)=>{let o=E-1,p=_=>({id:_,x:0,y:0,width:0,height:0});if(!c&&!d)return{left:p("left"),rightTop:p("rightTop"),rightBottom:{id:"rightBottom",x:1,y:2,width:b,height:o-1},statusBar:{id:"statusBar",x:1,y:E,width:b,height:1}};let w=c?Math.min(Math.floor(b*.25),b):0,P=Math.floor(o*(d?.35:0)),L=[];d&&L.push({id:"rightTop",size:{type:"fixed",value:P}}),L.push({id:"rightBottom",size:{type:"flex",grow:1}});let B=[];c&&B.push({id:"left",size:{type:"fixed",value:w}}),B.push({direction:"column",size:{type:"flex",grow:1},children:L});let _e={direction:"column",children:[{direction:"row",size:{type:"flex",grow:1},children:B},{id:"statusBar",size:{type:"fixed",value:1}}]},$e=Z.computeLayout(_e,b,E),q=_=>{let $=Z.findPanel($e,_);return $===void 0?p(_):{id:_,x:$.x+1,y:$.y+1,width:$.width,height:$.height}},Ne=q("left"),ze=q("rightTop"),G=q("rightBottom"),We=q("statusBar"),qe=G.y+1,je=G.height-1;return{left:c?Ne:p("left"),rightTop:d?ze:p("rightTop"),rightBottom:{...G,y:qe,height:je},statusBar:We}},g=v(t.specsVisible,t.monitorVisible),I=()=>({cols:g.rightBottom.width-2,rows:g.rightBottom.height-2}),S=new TextEncoder,h=c=>{N.process.writeToStdout(S.encode(c))};if(s){h(O.clearScreenSeq());let c=` noskills manager | ${l.length} spec(s) | ${re()} | Ctrl+C to quit`;h(a.moveTo(g.statusBar.y,g.statusBar.x)),h(a.inverse(a.truncate(c,g.statusBar.width))),h(ce(l,t.tabs,t.selectedTabIndex,g.left));let d=k(t);return h(le(d,g.rightTop)),h(de(d,g.rightBottom,t.tabs,t.selectedTabIndex)),h(a.moveTo(E,1)),h(`
3
+ `),Q(void 0)}let M=new Ce,u=null,i=async()=>{for(let c of["claude","claude-code"])try{if(await Pe`which ${c}`.noThrow().code()===0)return c}catch{}return"claude"},m=A(l,t.tabs);t.selectedTabIndex=j.nextSelectableIndex(m,-1,"down");let T=async()=>{let c=se();await te(n,{id:c,spec:null,mode:"free",phase:null,pid:0,startedAt:new Date().toISOString(),lastActiveAt:new Date().toISOString(),tool:"claude-code"});let d=I(),y=new J(d.rows,d.cols),o={id:`tab-${c}`,spec:null,mode:"free",sessionId:c,process:null,buffer:[],widget:y,active:!0,phase:null};try{let p=await i(),w=await ne({command:p,cwd:n,env:{...N.env.toObject(),NOSKILLS_SESSION:c,NOSKILLS_PROJECT_ROOT:n},cols:d.cols,rows:d.rows});o.process=w,M.add(o.id,w),w.onData(x=>{y.write(x),pe(o,x),u?.()}),w.exitCode.then(()=>{Object.assign(t,X(t,o.id)),m=A(l,t.tabs),C(),t.running&&D()}).catch(()=>{})}catch(p){let w=p instanceof Error?p.message:String(p);y.write(`[noskills manager] Failed to spawn claude: ${w}\r
4
+ `),y.write(`Is Claude Code installed? Set command in manifest.yml\r
5
+ `)}Object.assign(t,ue(t,o)),t.focus="terminal",m=A(l,t.tabs)},R=async c=>{let d=t.tabs.find(P=>P.spec===c);if(d!==void 0){let P=t.tabs.indexOf(d);Object.assign(t,Be(t,P)),t.focus="terminal";return}let y=null;try{y=(await ee(n,c)).phase}catch{}let o=se();await te(n,{id:o,spec:c,mode:"spec",phase:y,pid:0,startedAt:new Date().toISOString(),lastActiveAt:new Date().toISOString(),tool:"claude-code"});let p=I(),w=new J(p.rows,p.cols),x={id:`tab-${o}`,spec:c,mode:"spec",sessionId:o,process:null,buffer:[],widget:w,active:!0,phase:y};try{let P=await i(),L=await ne({command:P,cwd:n,env:{...N.env.toObject(),NOSKILLS_SESSION:o,NOSKILLS_PROJECT_ROOT:n},cols:p.cols,rows:p.rows});x.process=L,M.add(x.id,L),L.onData(B=>{w.write(B),pe(x,B),u?.()}),L.exitCode.then(()=>{Object.assign(t,X(t,x.id)),m=A(l,t.tabs),C(),t.running&&D()}).catch(()=>{})}catch(P){let L=P instanceof Error?P.message:String(P);w.write(`[noskills manager] Failed to spawn claude for spec "${c}": ${L}\r
6
+ `)}Object.assign(t,ue(t,x)),t.focus="terminal",m=A(l,t.tabs)};await T(),h(O.enterAlternateScreen()),h(O.hideCursorSeq()),h(O.clearScreenSeq()),h(H.enableMouse());let f=new Set(["specs","monitor","terminal","status"]),D=()=>{let c=k(t),d=[];if(d.push(O.hideCursorSeq()),f.size>=4&&d.push("\x1B[2J\x1B[H"),f.has("status")||f.size===0){let o=t.focus==="list"?"LIST":"TERM",p=`ctrl+e: ${t.specsVisible?"hide":"show"} specs | ctrl+w: ${t.monitorVisible?"hide":"show"} monitor`,w=t.focus==="terminal"?"esc: panels | ctrl+c: quit":`esc/tab: switch | ctrl+d: quit | ctrl+t: new tab | ${p}`,x=` noskills | ${t.tabs.length} tab(s) | [${o}] ${w}`;d.push(a.moveTo(g.statusBar.y,g.statusBar.x)),d.push(a.inverse(a.truncate(x,g.statusBar.width)+" ".repeat(Math.max(0,g.statusBar.width-a.visibleLength(x)))))}t.specsVisible&&f.has("specs")&&d.push(ce(l,t.tabs,t.selectedTabIndex,g.left)),t.monitorVisible&&f.has("monitor")&&d.push(le(c,g.rightTop)),f.has("terminal")&&d.push(de(c,g.rightBottom,t.tabs,t.selectedTabIndex));let y=k(t);if(y?.widget!==null&&y?.widget!==void 0){let o=g.rightBottom.y+1+y.widget.terminal.cursorRow,p=g.rightBottom.x+1+y.widget.terminal.cursorCol;d.push(a.moveTo(o,p))}d.push(O.showCursorSeq()),f.clear(),h(d.join(""))},C=()=>{f.add("specs"),f.add("monitor"),f.add("terminal"),f.add("status")},F=!1;u=()=>{f.add("terminal"),!F&&(F=!0,setTimeout(()=>{F=!1,t.running&&D()},16))};let Y=oe(n,async()=>{try{let c=await K(n);l.length=0;for(let d of c.specs)l.push({name:d.name,phase:d.phase,hasActiveSession:!1});m=A(l,t.tabs),f.add("specs"),f.add("monitor"),t.running&&D()}catch{}});C(),D();let U=async c=>{let d=Ue(c,g,m,t.focus);switch(d.type){case"clickSpec":{t.focus="list",t.selectedTabIndex=d.index;let y=l.find(o=>o.name===m[d.index]?.label)?.name;if(y!==void 0){await R(y),C();return}f.add("specs"),f.add("monitor"),f.add("status");break}case"clickTerminal":{t.focus="terminal",f.add("status");break}case"clickMonitor":{t.focus="list",f.add("status");break}case"scrollSpecs":{Object.assign(t,fe(t,d.direction,m)),f.add("specs"),f.add("monitor");break}case"scrollTerminal":{let y=k(t);if(y?.process!==null&&y!==null){let o=d.direction==="up"?"\x1B[A":"\x1B[B";y.process?.write(o.repeat(3))}break}case"forwardMouse":{t.focus="terminal",f.add("status");let y=k(t);if(y?.process!==null&&y!==null){let o=c.x+1-g.rightBottom.x,p=c.y+1-g.rightBottom.y,w=c.button;c.type==="mousemove"&&(w|=32),c.type==="wheel"&&(w=64|(c.direction==="down"?1:0)),c.shift&&(w|=4),c.ctrl&&(w|=16);let x=c.type==="mouseup"?"m":"M";y.process?.write(`\x1B[<${w};${o};${p}${x}`)}break}case"none":break}};try{await he(async()=>{for await(let c of be(N.process.stdin)){if(!t.running)break;if(c.kind==="mouse"){await U(c.event),f.size>0&&D();continue}let d=c.event;if(t.focus==="terminal"){let o=me(t,d.name,d.ctrl);if(o.type==="passthrough"||o.type==="none"){let p=k(t);p?.process!==null&&p!==null&&p.process?.write(new TextDecoder().decode(d.raw));continue}}let y=me(t,d.name,d.ctrl);switch(y.type){case"quit":t.running=!1;break;case"toggleFocus":Object.assign(t,Fe(t)),f.add("status");break;case"navigate":Object.assign(t,fe(t,y.direction,m)),f.add("specs"),f.add("monitor"),f.add("terminal");break;case"newTab":await T(),C();break;case"toggleSpecs":{t.specsVisible=!t.specsVisible,!t.specsVisible&&!t.monitorVisible&&(t.focus="terminal"),g=v(t.specsVisible,t.monitorVisible);let o=I();for(let p of t.tabs)p.process!==null&&p.process.resize(o.cols,o.rows),p.widget!==null&&p.widget.resize(o.rows,o.cols);C();break}case"toggleMonitor":{t.monitorVisible=!t.monitorVisible,!t.specsVisible&&!t.monitorVisible&&(t.focus="terminal"),g=v(t.specsVisible,t.monitorVisible);let o=I();for(let p of t.tabs)p.process!==null&&p.process.resize(o.cols,o.rows),p.widget!==null&&p.widget.resize(o.rows,o.cols);C();break}case"select":{let o=m[t.selectedTabIndex];if(o===void 0)break;let p=o.label;{let w=l.find(x=>x.name===p)?.name;w!==void 0&&await R(w)}C();break}case"closeTab":{let o=k(t);o!==null&&(o.process!==null&&M.remove(o.id),await Ie(n,o.sessionId),Object.assign(t,X(t,o.id)),m=A(l,t.tabs),t.focus="list"),C();break}case"passthrough":{let o=k(t);o?.process!==null&&o!==null&&o.process?.write(new TextDecoder().decode(d.raw));break}case"none":break}if(!t.running)break;f.size>0&&D()}})}finally{Y(),await M.killAll(),M.forceKillAll(),await Me(n),h(H.disableMouse()),h(O.showCursorSeq()),h(O.exitAlternateScreen())}return Q(void 0)};export{Zt as main};
@@ -1 +1 @@
1
- import{a,b,c,d,e,f}from"./chunk-ON7NJA2P.js";import"./chunk-RMCTOOQL.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";export{b as CommandBuilder,a as CommandError,f as ProcessGroup,d as exec,c as parseCommand,e as spawnPty};
1
+ import{a,b,c,d,e,f}from"./chunk-JVCVWI3B.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";export{b as CommandBuilder,a as CommandError,f as ProcessGroup,d as exec,c as parseCommand,e as spawnPty};
@@ -0,0 +1 @@
1
+ import{a as r,b as s,c as t,d as u,e as v,f as w,g as x,h as A,i as B}from"./chunk-XNGHRJVK.js";import{b as y,c as z}from"./chunk-CKETVOVQ.js";import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q}from"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";export{c as AlreadyExistsError,b as NotFoundError,d as ProcessError,a as RuntimeCapabilityError,t as buildCommand,z as clearWorkerdEnv,A as createRuntime,x as detectExecutionContext,s as detectInvoker,g as detectRuntime,n as getArch,w as getCliPrefix,o as getHomedir,m as getPlatform,q as getPlatformInfo,h as getRuntimeVersion,p as getTmpdir,j as isBrowser,u as isCommandInPath,l as isEdge,i as isRuntime,k as isServer,v as matchCliPrefix,y as populateEnvFromContext,f as posixPath,r as resolvePathDirs,B as runtime,e as toPosix};
@@ -0,0 +1,7 @@
1
+ import{a as re}from"./chunk-Z3O5HAIO.js";import{b as Ie}from"./chunk-5CNPFLE6.js";import{a as z}from"./chunk-RGGYSKJY.js";import{a as K,c as Y,e as X}from"./chunk-6YHWLEJ4.js";import"./chunk-PKYW3S5P.js";import{a as G}from"./chunk-7UX6WIXX.js";import{a as we,b as ye,d as C}from"./chunk-LBPD4EIH.js";import{a as ge,b as Se,c as ve}from"./chunk-OVLGUKPG.js";import"./chunk-DEIZVYT6.js";import{a as be}from"./chunk-SVJVJDZR.js";import{a as W}from"./chunk-RJX4ZXQ4.js";import{a as Ee,b as Re,c as Fe,d as Oe}from"./chunk-KYQ77E7T.js";import{h as J}from"./chunk-HNAHPI6V.js";import{a as xe,b as De,c as Z,d as ee,e as Ce,f as te,g as F,h as se,i as _,j as ne,k as ke,m as Ae,o as ie,p as Pe}from"./chunk-OKM4FE4G.js";import{B as fe,C as he,a as oe,d as R,f as ce,g as le,k as de,l as pe,m as ue,q as me,s as q,x as B}from"./chunk-5URW6X3N.js";import{c as V}from"./chunk-UT6ZCLRA.js";import{a as j,b}from"./chunk-2N4GTHXQ.js";import{i as D}from"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var at=async d=>{let{root:e}=await he(),a=we(d),u=ye(d);if(!await fe(e))return await C({error:`noskills not initialized. Run: ${V("init")}`},a),b({exitCode:1});let n=null;for(let m of u)m.startsWith("--answer=")&&(n=m.slice(9));let s=le(u),t;try{t=await ce(e,s)}catch(m){let f=m instanceof Error?m.message:String(m);return await C({error:f},a),b({exitCode:1})}if(s===null&&t.phase!=="IDLE"&&t.phase!=="COMPLETED")return await C({error:"Error: --spec=<name> is required. Use `noskills spec list` to see available specs."},a),b({exitCode:1});let o=await ue(e);if(o?.command!==void 0){let{setCommandPrefix:m}=await import("./cmd-ZXO6KFK6.js");m(o.command)}if(o===null)return await C({error:"No config found"},a),b({exitCode:1});if(t.spec!==null&&t.phase!=="IDLE"&&t.phase!=="COMPLETED"){let m=`${e}/${R.specDir(t.spec)}`;try{await D.fs.stat(m)}catch{return await C({error:!0,message:`Active spec '${t.spec}' directory not found. Files may have been deleted manually.`,suggestion:`Run \`${V("reset")}\` to return to idle, or \`${V("cancel")}\` to mark as cancelled.`},a),b({exitCode:1})}}let i=Ie(u,o);t.phase==="DISCOVERY"&&t.discovery.audience!==i&&(t={...t,discovery:{...t.discovery,audience:i}});let l=(await me(e)).filter(m=>o.concerns.includes(m.id));if(n!==null){let m=await J(e),f=await Ne(e,t,o,l,n,m);await q(e,f);let g={...f,lastCalledAt:new Date().toISOString()};await q(e,g);let U=D.env.get("NOSKILLS_SESSION")??null;U!==null&&await B(e,U,g.phase);let N=await K(e),{tier1:M,tier2Count:v}=Y(N,g.phase),k=g.spec!==null?await W(e,g.spec):null,P=await Te(e,g),x=await re(e,P),I=X(o?.tools??[]),S=await J(e),A=await z(g,l,M,o,k,x,void 0,I,S,v,e),Q=n.trim().toLowerCase()==="save",$e=g.phase===t.phase;if(Q&&$e&&(g.phase==="SPEC_DRAFT"||g.phase==="SPEC_APPROVED")){let Le=g.phase==="SPEC_DRAFT"?"Spec draft saved. The spec stays in DRAFT and can be reviewed by anyone. Other users can add ACs (`ac add`), notes (`note add`), or tasks (`task add`) while in draft. When ready, any user can approve with `noskills spec <name> approve`.":'Spec is approved and parked. Others can still add ACs or notes. When ready, run `noskills next --answer="start"` to begin execution.',Ue={...A,instruction:Le,saved:!0};return await C(Ue,a),j(void 0)}return await C(A,a),j(void 0)}let r={...t,lastCalledAt:new Date().toISOString()};await q(e,r);let p=D.env.get("NOSKILLS_SESSION")??null;p!==null&&await B(e,p,r.phase);let h=await K(e),{tier1:w,tier2Count:y}=Y(h,r.phase),H=r.spec!==null?await W(e,r.spec):null,O=await Te(e,r),T=await re(e,O),$;r.phase==="IDLE"&&($={existingSpecs:(await pe(e)).map(f=>({name:f.name,phase:f.state.phase,iteration:f.state.execution.iteration,detail:f.state.phase==="EXECUTING"?`${f.state.execution.completedTasks.length} tasks done, iteration ${f.state.execution.iteration}`:f.state.phase==="SPEC_DRAFT"?"awaiting approval":f.state.phase==="COMPLETED"?"completed":void 0})),rulesCount:w.length});let L=X(o?.tools??[]),ae=await J(e),E=await z(r,l,w,o,H,T,$,L,ae,y,e);return await C(E,a),j(void 0)},Ne=async(d,e,a,u,n,s)=>{switch(e.phase){case"DISCOVERY":{let t=e.specDescription!==null&&e.specDescription.length>0,o=e.discovery.mode;if(o===void 0&&t)return["full","validate","technical-depth","ship-fast","explore"].includes(n)?Z(e,n):Z(e,"full");let i=e.discovery.premisesCompleted===!0;if(o!==void 0&&!i){try{let p=JSON.parse(n);if(p!==null&&typeof p=="object"&&"premises"in p){let w=p.premises.map(y=>({text:y.text??"",agreed:y.agreed??!0,revision:y.revision,user:s?.name??"Unknown User",timestamp:new Date().toISOString()}));return ee(e,w)}}catch{}return ee(e,[])}let c=e.discovery.audience==="agent",l=null;try{let p=JSON.parse(n);typeof p=="object"&&p!==null&&!Array.isArray(p)&&(c?ge.map(y=>y.id).every(y=>y in p)&&(l=p):l=p)}catch{}let r=e;if(l!==null)for(let[p,h]of Object.entries(l))typeof h=="string"&&h.length>0&&(r=F(r,p,h,s));else{let p=Se(u),h=r.discovery.currentQuestion,w=p[h];if(w===void 0)return e;r=F(r,w.id,n,s),r=ke(r)}return ve(r.discovery.answers)&&(r=se(r)),r}case"DISCOVERY_REVIEW":{let t=n.trim().toLowerCase();if(t==="approve"){let i=G(e.discovery.answers);return i.detected&&i.proposals.length>=2?ne(e):e.discovery.mode!==void 0?ne(e):_(e)}if(t==="split")return await Me(d,e);if(t==="keep"){let i=ie(e,{id:`decision-split-keep-${Date.now()}`,question:"Split spec into separate areas?",choice:"Chose to keep as single spec despite multiple areas detected",promoted:!1,timestamp:new Date().toISOString()});return _(i)}let o=e.discovery.alternativesPresented===!0;if(e.discovery.approved&&!o){let i;if(t==="skip"||t==="none")i=te(e);else{let c=!1;try{let l=JSON.parse(n);if(l!==null&&typeof l=="object"&&"approach"in l){let r={id:String(l.approach),name:String(l.name??l.approach),summary:String(l.summary??""),effort:String(l.effort??""),risk:String(l.risk??""),user:s?.name??"Unknown User",timestamp:new Date().toISOString()};i=Ce(e,r),c=!0}}catch{}c||(i=te(e))}return _(i)}try{let i=JSON.parse(n);if(typeof i.revise=="object"&&i.revise!==null){let c=e;for(let[l,r]of Object.entries(i.revise))typeof r=="string"&&r.length>0&&(c=F(c,l,r,s));return c}}catch{}return e}case"SPEC_DRAFT":{if(n.trim().toLowerCase()==="save")return e;if(e.classification===null){let t,o=n.trim().toLowerCase();if(o==="none"||o==="skip")t={involvesWebUI:!1,involvesCLI:!1,involvesPublicAPI:!1,involvesMigration:!1,involvesDataHandling:!1};else try{let c=JSON.parse(n);t={involvesWebUI:c.involvesWebUI===!0||c.involvesUI===!0,involvesCLI:c.involvesCLI===!0||c.involvesUI===!0,involvesPublicAPI:c.involvesPublicAPI===!0,involvesMigration:c.involvesMigration===!0,involvesDataHandling:c.involvesDataHandling===!0}}catch{t={involvesWebUI:!1,involvesCLI:!1,involvesPublicAPI:!1,involvesMigration:!1,involvesDataHandling:!1}}let i={...e,classification:t};try{await be(d,i,u)}catch{}return i}try{let t=JSON.parse(n);if(typeof t.refinement=="string"&&t.refinement.length>0){let o=t.refinement;if(e.spec!==null){let i=`${d}/${R.specFile(e.spec)}`,c=await D.fs.readTextFile(i);if(o.includes("task-")){let r=je(o).map(w=>`- [ ] ${w}`).join(`
2
+ `),p=/## Tasks\n\n([\s\S]*?)(?=\n## |\n*$)/,h=c.replace(p,`## Tasks
3
+
4
+ ${r}
5
+ `);await D.fs.writeTextFile(i,h)}}return e}}catch{}return e}case"SPEC_APPROVED":{if(n.trim().toLowerCase()==="save")return e;let t=Ae(e);return t.spec!==null&&(await Ee(d,t.spec,"executing"),await Oe(d,t.spec,"executing")),t}case"EXECUTING":{if(!e.execution.awaitingStatusReport){let t={...e,execution:{...e.execution,lastProgress:n}};if(a.verifyCommand!==null&&a.verifyCommand!==void 0&&a.verifyCommand.length>0){let o=await Ve(d,a.verifyCommand);if(t={...t,execution:{...t.execution,lastVerification:o}},!o.passed)return t}return t={...t,execution:{...t.execution,awaitingStatusReport:!0}},t}return await qe(d,e,n,u)}case"BLOCKED":{let t=e.execution.lastProgress??"Unknown",o={id:`d${e.decisions.length+1}`,question:t.replace(/^BLOCKED:\s*/,""),choice:n,promoted:!1,timestamp:new Date().toISOString()},i=ie(e,o);return i=xe(i,"EXECUTING"),i={...i,execution:{...i.execution,lastProgress:`Resolved: ${n}`}},i}default:return e}},Me=async(d,e)=>{let a=G(e.discovery.answers);if(!a.detected||a.proposals.length===0)return e;let u=[];for(let s of a.proposals){let t=`${d}/${R.specDir(s.name)}`;await D.fs.mkdir(t,{recursive:!0});let o=e.discovery.answers.filter(l=>s.relevantAnswers.includes(l.questionId)),c=De(oe(),s.name,`spec/${s.name}`);for(let l of o)c=F(c,l.questionId,l.answer);c=se(c),await de(d,s.name,c),u.push(s.name)}return Pe(e,"cancelled",`Split into: ${u.join(", ")}`)},je=d=>d.split(/(?=task-\d+:)/).map(e=>e.replace(/[,;\n\s]+$/,"").trim()).filter(e=>/^task-\d+:/.test(e)),qe=async(d,e,a,u)=>{let n;try{n=JSON.parse(a)}catch{return{...e,execution:{...e.execution,lastProgress:a,awaitingStatusReport:!1}}}let s=e;if(e.execution.debt!==null&&e.execution.debt.items.length>0&&typeof e.execution.debt.items[0]=="string"){let k=e.execution.debt.items.map((I,S)=>({id:`legacy-${S+1}`,text:I,since:e.execution.debt.fromIteration}));s={...e,execution:{...e.execution,debt:{...e.execution.debt,items:k}}};let P=new TextEncoder,x=D.process.stderr.getWriter();await x.write(P.encode(`noskills: migrated legacy string[] debt to DebtItem[] format
6
+ `)),x.releaseLock()}let t=new Set(["mandatory-tests","mandatory-docs"]),i=(n.na??[]).filter(v=>t.has(v));if(i.length>0)return{...s,execution:{...s.execution,lastProgress:`REJECTED: Tests and documentation ACs require explicit justification to mark as N/A. Explain why tests or docs are not needed for this spec. Rejected IDs: ${i.join(", ")}`,awaitingStatusReport:!0}};let c=n.completed??[],l=new Set(c),r=n.na??[],p=new Set(r),h=n.newIssues??[],w=n.remaining??[],y=n.blocked??[],H=s.execution.debt?.unaddressedIterations??0,O=s.execution.debt!==null?s.execution.debt.items.filter(v=>!l.has(v.id)&&!p.has(v.id)):[],T=s.execution.debtCounter??0,$=h.map((v,k)=>({id:`debt-${T+k+1}`,text:v,since:s.execution.iteration})),L=[...O,...$],E=w.length===0&&y.length===0&&h.length===0||L.length===0?null:{items:L,fromIteration:s.execution.debt?.fromIteration??s.execution.iteration,unaddressedIterations:O.length>0?H+1:1},m=[...new Set([...s.execution.naItems??[],...r])],f=[];c.length>0&&f.push(`Completed: ${c.join(", ")}`),r.length>0&&f.push(`N/A: ${r.join(", ")}`);let g=f.length>0?f.join("; "):"Status report submitted",U=s.execution.lastVerification===null||s.execution.lastVerification.passed===!0,N=E===null&&U,M=T+h.length;if(N&&s.spec!==null){let v=await W(d,s.spec);if(v!==null){let k=s.execution.completedTasks??[],P=new Set(k),x=[];try{let S=JSON.parse(s.execution.lastProgress??"");Array.isArray(S.completed)&&(x=S.completed.filter(A=>!P.has(A)&&v.tasks.some(Q=>Q.id===A)))}catch{}if(x.length===0){let S=v.tasks.find(A=>!P.has(A.id));S!==void 0&&(x=[S.id])}let I=[];for(let S of x)await Re(d,s.spec,S),await Fe(d,s.spec,S,"done"),I.push(S);if(I.length>0){let S=I.length===1?`Task ${I[0]} accepted`:`Tasks ${I.join(", ")} accepted`;return{...s,execution:{...s.execution,lastProgress:`${S}: ${g}`,awaitingStatusReport:!1,debt:E,completedTasks:[...k,...I],debtCounter:M,naItems:m}}}}}return{...s,execution:{...s.execution,lastProgress:N?g:`Task not accepted \u2014 remaining items must be addressed first. ${g}`,awaitingStatusReport:!1,debt:E,debtCounter:M,naItems:m}}},Ve=async(d,e)=>{try{let{execSync:a}=await import("node:child_process"),u=a(e,{cwd:d,encoding:"utf-8",timeout:6e4,stdio:["pipe","pipe","pipe"]});return{passed:!0,output:String(u).slice(0,4e3),timestamp:new Date().toISOString()}}catch(a){let u=a,n=((u.stdout??"")+(u.stderr??"")).slice(0,4e3);return u.status!==void 0?{passed:!1,output:n||"Verification failed with no output",timestamp:new Date().toISOString()}:{passed:!1,output:`Verification command failed to execute: ${a instanceof Error?a.message:String(a)}`,timestamp:new Date().toISOString()}}},Te=async(d,e)=>{let a=[...e.execution.modifiedFiles??[]],u=await _e(d);return[...new Set([...a,...u])]},_e=async d=>{let e=`${d}/${R.stateDir}/files-changed.jsonl`;try{let u=(await D.fs.readTextFile(e)).trim().split(`
7
+ `).filter(Boolean),n=[];for(let s of u)try{let t=JSON.parse(s);n.includes(t.file)||n.push(t.file)}catch{}return n}catch{return[]}};export{Ne as handleAnswer,at as main,je as parseRefinementTasks};
@@ -1,3 +1,3 @@
1
- import{c as u}from"./chunk-NRCHLNQA.js";import{a as i,e as m}from"./chunk-OLM5RTFK.js";import"./chunk-ON7NJA2P.js";import"./chunk-RMCTOOQL.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var p="http://localhost:11434",d=class{capabilities=["text_generation","streaming","vision"];provider="ollama";modelId;baseUrl;config;constructor(e,o){this.baseUrl=e,this.config=o,this.modelId=o.model}async generateText(e,o){let s=g(this.config,e,!1);try{let t=await fetch(`${this.baseUrl}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s),signal:o});if(!t.ok)throw await f(t);let r=await t.json();return h(r,this.modelId)}catch(t){throw t instanceof i?t:new i(t instanceof Error?t.message:String(t),{provider:"ollama",cause:t instanceof Error?t:void 0})}}async*streamText(e,o){let s=g(this.config,e,!0);try{let t=await fetch(`${this.baseUrl}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s),signal:o});if(!t.ok){yield{kind:"error",error:await f(t)};return}if(t.body===null){yield{kind:"error",error:new i("No response body",{provider:"ollama"})};return}for await(let r of u(t.body)){let l=k(r);l!==null&&(yield l)}}catch(t){t instanceof i?yield{kind:"error",error:t}:yield{kind:"error",error:new i(t instanceof Error?t.message:String(t),{provider:"ollama",cause:t instanceof Error?t:void 0})}}}close(){return Promise.resolve()}getRawClient(){return null}},v={provider:"ollama",createModel(n){let e=n.properties?.baseUrl??p;return Promise.resolve(new d(e,n))}},g=(n,e,o)=>{let s=y(e.messages,e.system),t={model:n.model,messages:s,stream:o},r={};return e.temperature!==void 0&&(r.temperature=e.temperature),e.maxTokens!==void 0&&(r.num_predict=e.maxTokens),e.topP!==void 0&&(r.top_p=e.topP),e.stopWords!==void 0&&(r.stop=e.stopWords),Object.keys(r).length>0&&(t.options=r),e.responseFormat!==void 0&&(e.responseFormat.type==="json_schema"?t.format=e.responseFormat.jsonSchema:e.responseFormat.type==="json_object"&&(t.format="json")),t},y=(n,e)=>{let o=[];e!==void 0&&o.push({role:"system",content:e});for(let s of n){if(s.role==="system"){let a=[];for(let c of s.content)c.kind==="text"&&a.push(c.text);o.push({role:"system",content:a.join(`
1
+ import{c as u}from"./chunk-UG26APX2.js";import"./chunk-JVCVWI3B.js";import{a as i,e as m}from"./chunk-OLM5RTFK.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var p="http://localhost:11434",d=class{capabilities=["text_generation","streaming","vision"];provider="ollama";modelId;baseUrl;config;constructor(e,o){this.baseUrl=e,this.config=o,this.modelId=o.model}async generateText(e,o){let s=g(this.config,e,!1);try{let t=await fetch(`${this.baseUrl}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s),signal:o});if(!t.ok)throw await f(t);let r=await t.json();return h(r,this.modelId)}catch(t){throw t instanceof i?t:new i(t instanceof Error?t.message:String(t),{provider:"ollama",cause:t instanceof Error?t:void 0})}}async*streamText(e,o){let s=g(this.config,e,!0);try{let t=await fetch(`${this.baseUrl}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s),signal:o});if(!t.ok){yield{kind:"error",error:await f(t)};return}if(t.body===null){yield{kind:"error",error:new i("No response body",{provider:"ollama"})};return}for await(let r of u(t.body)){let l=k(r);l!==null&&(yield l)}}catch(t){t instanceof i?yield{kind:"error",error:t}:yield{kind:"error",error:new i(t instanceof Error?t.message:String(t),{provider:"ollama",cause:t instanceof Error?t:void 0})}}}close(){return Promise.resolve()}getRawClient(){return null}},v={provider:"ollama",createModel(n){let e=n.properties?.baseUrl??p;return Promise.resolve(new d(e,n))}},g=(n,e,o)=>{let s=y(e.messages,e.system),t={model:n.model,messages:s,stream:o},r={};return e.temperature!==void 0&&(r.temperature=e.temperature),e.maxTokens!==void 0&&(r.num_predict=e.maxTokens),e.topP!==void 0&&(r.top_p=e.topP),e.stopWords!==void 0&&(r.stop=e.stopWords),Object.keys(r).length>0&&(t.options=r),e.responseFormat!==void 0&&(e.responseFormat.type==="json_schema"?t.format=e.responseFormat.jsonSchema:e.responseFormat.type==="json_object"&&(t.format="json")),t},y=(n,e)=>{let o=[];e!==void 0&&o.push({role:"system",content:e});for(let s of n){if(s.role==="system"){let a=[];for(let c of s.content)c.kind==="text"&&a.push(c.text);o.push({role:"system",content:a.join(`
2
2
  `)});continue}let t=[],r=[];for(let a of s.content)a.kind==="text"?t.push(a.text):a.kind==="image"&&a.image.url!==void 0&&r.push(a.image.url);let l={role:s.role==="tool"?"user":s.role,content:t.join(`
3
3
  `)};r.length>0&&(l.images=r),o.push(l)}return o},h=(n,e)=>{let o=[];return n.message?.content!==void 0&&o.push({kind:"text",text:n.message.content}),{content:o,stopReason:n.done_reason==="length"?"max_tokens":"end_turn",usage:{inputTokens:n.prompt_eval_count??0,outputTokens:n.eval_count??0,totalTokens:(n.prompt_eval_count??0)+(n.eval_count??0)},modelId:e,rawResponse:n}},k=n=>{if(n===null||typeof n!="object")return null;let e=n;return e.done===!0?{kind:"message_done",stopReason:e.done_reason==="length"?"max_tokens":"end_turn",usage:{inputTokens:e.prompt_eval_count??0,outputTokens:e.eval_count??0,totalTokens:(e.prompt_eval_count??0)+(e.eval_count??0)}}:e.message?.content!==void 0&&e.message.content.length>0?{kind:"content_delta",textDelta:e.message.content}:e.response!==void 0&&e.response.length>0?{kind:"content_delta",textDelta:e.response}:null},f=async n=>{let e;try{e=(await n.json()).error??`Ollama HTTP ${n.status}`}catch{e=`Ollama HTTP ${n.status}: ${n.statusText}`}return m("ollama",n.status,new Error(e))};export{d as OllamaModel,v as ollamaFactory};
@@ -0,0 +1 @@
1
+ import{a as h,b as p,c as S,d as k,e as g,f as m,g as f}from"./chunk-UG26APX2.js";import"./chunk-JVCVWI3B.js";import{a as c}from"./chunk-OLM5RTFK.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var y=class{capabilities=["text_generation","streaming"];provider="opencode";modelId;binary;config;constructor(e,r){this.binary=e,this.config=r,this.modelId=r.model}async generateText(e,r){let o=w(this.config,e,"json"),i=f(e.messages,e.system),s=p(this.binary,o,{signal:r,stdinData:i}),l=g(s.stderr),t=await k(s.stdout,this.modelId),u=await s.waitForExit(),a=await l,d=m("opencode",u.code,a);if(d!==null)throw d;return t}async*streamText(e,r){let o=w(this.config,e,"stream-json"),i=f(e.messages,e.system),s=p(this.binary,o,{signal:r,stdinData:i}),l=g(s.stderr);try{for await(let d of S(s.stdout)){let x=v(d);x!==null&&(yield x)}let t=await s.waitForExit(),u=await l,a=m("opencode",t.code,u);a!==null&&(yield{kind:"error",error:a})}catch(t){t instanceof c?yield{kind:"error",error:t}:yield{kind:"error",error:new c(t instanceof Error?t.message:String(t),{provider:"opencode",cause:t instanceof Error?t:void 0})}}}close(){return Promise.resolve()}getRawClient(){return null}},b={provider:"opencode",async createModel(n){let e=await h("opencode",n);return new y(e,n)}},w=(n,e,r)=>{let o=["--output-format",r];o.push("--model",n.model),e.maxTokens!==void 0&&o.push("--max-tokens",String(e.maxTokens));let i=n.properties?.args;return i!==void 0&&o.push(...i),o},v=n=>{if(n===null||typeof n!="object")return null;let e=n;if(e.type==="content_block_delta"||e.type==="assistant"){let r=e.delta?.text??e.message?.content?.[0]?.text;return r!==void 0?{kind:"content_delta",textDelta:r}:null}return e.type==="result"||e.done===!0?{kind:"message_done",stopReason:"end_turn",usage:{inputTokens:e.usage?.input_tokens??0,outputTokens:e.usage?.output_tokens??0,totalTokens:(e.usage?.input_tokens??0)+(e.usage?.output_tokens??0)}}:e.type==="error"?{kind:"error",error:new c(e.error?.message??"Unknown OpenCode error",{provider:"opencode"})}:e.content!==void 0&&typeof e.content=="string"?{kind:"content_delta",textDelta:e.content}:null};export{y as OpenCodeModel,b as openCodeFactory};
@@ -0,0 +1,5 @@
1
+ import{f as E}from"./chunk-6YHWLEJ4.js";import{C as R,d as y,m as T}from"./chunk-5URW6X3N.js";import{b as C}from"./chunk-UT6ZCLRA.js";import{c as h,d as f,f as w,g as F,o as P,q as S,r as v}from"./chunk-2GF5IUQD.js";import{a as $,b as g}from"./chunk-2N4GTHXQ.js";import{i as m}from"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var U=r=>{let e=r;if(typeof e?.name!="string"||e.name.length===0)throw new Error("Pack manifest must have a non-empty 'name' field");if(typeof e?.version!="string"||e.version.length===0)throw new Error("Pack manifest must have a non-empty 'version' field");if(typeof e?.description!="string"||e.description.length===0)throw new Error("Pack manifest must have a non-empty 'description' field");return e},B=()=>({installed:[]});var L={name:"typescript",version:"1.0.0",description:"TypeScript best practices",tags:["typescript","types"],rules:["rules/use-strict-types.md","rules/no-any.md","rules/prefer-const.md"],concerns:["concerns/ts-quality.json"]};var _={id:"ts-quality",name:"TypeScript Quality",description:"Enforces TypeScript best practices",extras:[{questionId:"verification",text:"Does the code pass strict TypeScript checks (noEmit, strict mode)?"}],specSections:[],reminders:["Run tsc --noEmit before reporting task complete"],acceptanceCriteria:["TypeScript strict mode passes with zero errors"]};var J={name:"react",version:"1.0.0",description:"React component conventions",tags:["react","frontend"],rules:["rules/component-structure.md","rules/prefer-function-components.md","rules/state-management.md"]};var H={name:"security",version:"1.0.0",description:"Security audit rules",tags:["security","audit"],rules:["rules/no-secrets-in-code.md","rules/validate-input.md","rules/no-eval.md"],concerns:["concerns/security-audit.json"]};var K={id:"security-audit",name:"Security Audit",description:"Security-focused review for every spec",extras:[{questionId:"verification",text:"Has the change been reviewed for injection, XSS, CSRF, and auth bypass?"},{questionId:"scope_boundary",text:"What security boundaries must NOT be crossed?"}],specSections:["Security Review"],reminders:["Check for hardcoded secrets, unsanitized input, and missing auth checks"],acceptanceCriteria:["No hardcoded secrets","All user input validated","Auth checks present on protected routes"]};var ne={"use-strict-types":"Prefer explicit types over inference for function params and returns","no-any":"Never use 'any'. Use 'unknown' when type is genuinely unknown.","prefer-const":"Use const by default, let only when reassignment is needed"},te={"component-structure":"One component per file. Name file same as component.","prefer-function-components":"Use function components with hooks. No class components.","state-management":"Keep state as close to where it's used as possible."},se={"no-secrets-in-code":"Never hardcode API keys, passwords, or tokens","validate-input":"Validate and sanitize all user input at API boundaries","no-eval":"Never use eval(), new Function(), or equivalent dynamic code execution"},re={manifest:L,ruleContents:ne,concernContents:[_]},ie={manifest:J,ruleContents:te,concernContents:[]},ae={manifest:H,ruleContents:se,concernContents:[K]},x=new Map([["typescript",re],["react",ie],["security",ae]]);var z=".eser/packs.json",D=3e4,je=async r=>{let e=r?.[0];if(e==="list")return await ce();if(e==="install")return await le(r?.slice(1));if(e==="uninstall")return await de(r?.slice(1));if(e==="inspect")return await ue(r?.slice(1));if(e==="search")return await pe(r?.slice(1));let n=C(),i=P({renderer:v.ansi(),sink:S.stdout()});return i.writeln(`Usage: ${n} pack <list | install <name> | uninstall <name> | inspect <name> | search <query>>`),await i.close(),$(void 0)},M=async r=>{let e=`${r}/${z}`;try{let n=await m.fs.readTextFile(e);return JSON.parse(n)}catch{return B()}},N=async(r,e)=>{let n=`${r}/${z}`;await m.fs.mkdir(`${r}/.eser`,{recursive:!0}),await m.fs.writeTextFile(n,JSON.stringify(e,null,2)+`
2
+ `)},b=r=>x.get(r),O=r=>{let e=r.replace(/^github:/,"").replace(/^gh:/,""),n=e.indexOf("#");if(n===-1)return null;let i=e.slice(0,n),t=e.slice(n+1),l=i.indexOf("/");if(l===-1)return null;let u=i.slice(0,l),c=i.slice(l+1);return u.length===0||c.length===0||t.length===0?null:{owner:u,repo:c,ref:"main",packPath:t}},W=async r=>{let e=O(r);if(e===null)throw new Error(`Invalid pack specifier: ${r}. Expected format: github:owner/repo#pack-name`);let n=`https://raw.githubusercontent.com/${e.owner}/${e.repo}/${e.ref}/packs/${e.packPath}/pack.json`,i=await globalThis.fetch(n,{signal:AbortSignal.timeout(D)});if(!i.ok)throw new Error(`Could not fetch pack from ${r}. HTTP ${i.status}`);let t=JSON.parse(await i.text());return U(t)},j=async(r,e)=>{let n=O(r);if(n===null)throw new Error(`Invalid pack specifier: ${r}`);let i=`https://raw.githubusercontent.com/${n.owner}/${n.repo}/${n.ref}/packs/${n.packPath}/${e}`,t=await globalThis.fetch(i,{signal:AbortSignal.timeout(D)});if(!t.ok)throw new Error(`Could not fetch ${e} from ${r}. HTTP ${t.status}`);return await t.text()},Q=async r=>{let e=`${r}/${y.concernsDir}`,n=0;try{for await(let i of m.fs.readDir(e))if(i.isFile&&i.name.endsWith(".json")){let t=i.name.match(/^(\d+)-/);if(t!==null){let l=parseInt(t[1],10);l>n&&(n=l)}}}catch{}return n+1},A=async(r,e,n)=>{let i=[],t=[],l=[],u=`${r}/${y.rulesDir}`;await m.fs.mkdir(u,{recursive:!0});for(let[p,o]of Object.entries(n.ruleContents)){let a=`pack-${e}-${p}.md`;await m.fs.writeTextFile(`${u}/${a}`,o+`
3
+ `),i.push(a)}if(n.concernContents.length>0){let p=`${r}/${y.concernsDir}`;await m.fs.mkdir(p,{recursive:!0});let o=await Q(r);for(let a of n.concernContents){let d=`${String(o).padStart(3,"0")}-${a.id}.json`;await m.fs.writeTextFile(`${p}/${d}`,JSON.stringify(a,null,2)+`
4
+ `),t.push(d),o++}}if(n.folderRuleContents!==void 0)for(let[p,o]of Object.entries(n.folderRuleContents)){let a=`${r}/${p}/.folder-rules.md`;await m.fs.mkdir(`${r}/${p}`,{recursive:!0}),await m.fs.writeTextFile(a,o+`
5
+ `),l.push(`${p}/.folder-rules.md`)}return{name:e,version:n.manifest.version,installedAt:new Date().toISOString(),source:"builtin",rules:i,concerns:t,folderRules:l}},oe=async(r,e,n)=>{let i=n.name,t=[],l=[],u=[],c=`${r}/${y.rulesDir}`;if(await m.fs.mkdir(c,{recursive:!0}),n.rules!==void 0)for(let o of n.rules){let a=await j(e,o),s=o.replace(/^rules\//,"").replace(/\.md$/,""),d=`pack-${i}-${s}.md`;await m.fs.writeTextFile(`${c}/${d}`,a),t.push(d)}if(n.concerns!==void 0&&n.concerns.length>0){let o=`${r}/${y.concernsDir}`;await m.fs.mkdir(o,{recursive:!0});let a=await Q(r);for(let s of n.concerns){let d=await j(e,s),k=JSON.parse(d),q=`${String(a).padStart(3,"0")}-${k.id}.json`;await m.fs.writeTextFile(`${o}/${q}`,d),l.push(q),a++}}if(n.folderRules!==void 0)for(let[o,a]of Object.entries(n.folderRules)){let s=await j(e,a),d=`${r}/${o}/.folder-rules.md`;await m.fs.mkdir(`${r}/${o}`,{recursive:!0}),await m.fs.writeTextFile(d,s),u.push(`${o}/.folder-rules.md`)}return{name:i,version:n.version,installedAt:new Date().toISOString(),source:e,rules:t,concerns:l,folderRules:u}},ce=async()=>{let r=P({renderer:v.ansi(),sink:S.stdout()}),{root:e}=await R(),n=await M(e),i=new Set(n.installed.map(t=>t.name));r.writeln(h("Built-in packs:"));for(let[t,l]of x){let u=Object.keys(l.ruleContents).length,c=l.concernContents.length,p=[];u>0&&p.push(`${u} rules`),c>0&&p.push(`${c} concern${c>1?"s":""}`),r.writeln(" ",h(t.padEnd(16)),f(l.manifest.description),f(` (${p.join(", ")})`))}if(r.writeln(""),r.writeln(h("Installed packs:")),n.installed.length===0)r.writeln(f(" No packs installed."));else for(let t of n.installed){let l=t.installedAt.slice(0,10);r.writeln(" ",i.has(t.name)?F(t.name.padEnd(16)):h(t.name.padEnd(16)),f(`v${t.version}`),f(` (installed ${l})`))}return await r.close(),$(void 0)},le=async r=>{let e=P({renderer:v.ansi(),sink:S.stdout()}),{root:n}=await R(),i=r?.[0];if(i===void 0||i.length===0){let a=C();return e.writeln(w("Please provide a pack name: "),h(`${a} pack install typescript`)),await e.close(),g({exitCode:1})}let t=await M(n),l=i.includes("/")||i.includes(":"),u=l?O(i)?.packPath??i:i;if(t.installed.some(a=>a.name===u))return e.writeln(w(`Pack "${u}" is already installed.`)),e.writeln(f(" Uninstall first to re-install.")),await e.close(),g({exitCode:1});let c;if(l){e.writeln(f(`Fetching pack from ${i}...`));try{let a=await W(i);if(a.requires!==void 0){for(let s of a.requires)if(!t.installed.some(d=>d.name===s)){e.writeln(f(` Installing dependency: ${s}`));let d=b(s);if(d!==void 0){let k=await A(n,s,d);t.installed.push(k)}}}c=await oe(n,i,a)}catch(a){return e.writeln(w(`Failed to install: ${a instanceof Error?a.message:String(a)}`)),await e.close(),g({exitCode:1})}}else{let a=b(i);if(a===void 0)return e.writeln(w(`Unknown pack: ${i}`)),e.writeln(f(` Available built-in packs: ${[...x.keys()].join(", ")}`)),await e.close(),g({exitCode:1});if(a.manifest.requires!==void 0){for(let s of a.manifest.requires)if(!t.installed.some(d=>d.name===s)){e.writeln(f(` Installing dependency: ${s}`));let d=b(s);if(d!==void 0){let k=await A(n,s,d),I=[...t.installed,k];await N(n,{installed:I})}}}c=await A(n,i,a)}let p={installed:[...t.installed,c]};await N(n,p);let o=await T(n);return o!==null&&o.tools.length>0&&(await E(n,o.tools,o),e.writeln(f(" Tool files synced."))),e.writeln(F("\u2714"),` Pack "${c.name}" v${c.version} installed.`),c.rules.length>0&&e.writeln(f(` Rules: ${c.rules.join(", ")}`)),c.concerns.length>0&&e.writeln(f(` Concerns: ${c.concerns.join(", ")}`)),await e.close(),$(void 0)},de=async r=>{let e=P({renderer:v.ansi(),sink:S.stdout()}),{root:n}=await R(),i=r?.[0];if(i===void 0||i.length===0){let s=C();return e.writeln(w("Please provide a pack name: "),h(`${s} pack uninstall typescript`)),await e.close(),g({exitCode:1})}let t=await M(n),l=t.installed.find(s=>s.name===i);if(l===void 0)return e.writeln(w(`Pack "${i}" is not installed.`)),await e.close(),g({exitCode:1});let u=[];for(let s of t.installed){if(s.name===i)continue;let d=b(s.name);d?.manifest.requires!==void 0&&d.manifest.requires.includes(i)&&u.push(s.name)}u.length>0&&e.writeln(w(`Warning: pack "${i}" is required by: ${u.join(", ")}`));let c=`${n}/${y.rulesDir}`;for(let s of l.rules)try{await m.fs.remove(`${c}/${s}`)}catch{}let p=`${n}/${y.concernsDir}`;for(let s of l.concerns)try{await m.fs.remove(`${p}/${s}`)}catch{}for(let s of l.folderRules)try{await m.fs.remove(`${n}/${s}`)}catch{}let o={installed:t.installed.filter(s=>s.name!==i)};await N(n,o);let a=await T(n);return a!==null&&a.tools.length>0&&(await E(n,a.tools,a),e.writeln(f(" Tool files synced."))),e.writeln(F("\u2714"),` Pack "${i}" uninstalled.`),await e.close(),$(void 0)},ue=async r=>{let e=P({renderer:v.ansi(),sink:S.stdout()}),n=r?.[0];if(n===void 0||n.length===0){let s=C();return e.writeln(w("Please provide a pack name: "),h(`${s} pack inspect typescript`)),await e.close(),g({exitCode:1})}let i=n.includes("/")||n.includes(":"),t,l=null,u=null;if(i)try{t=await W(n)}catch(s){return e.writeln(w(`Failed to fetch: ${s instanceof Error?s.message:String(s)}`)),await e.close(),g({exitCode:1})}else{let s=b(n);if(s===void 0)return e.writeln(w(`Unknown pack: ${n}`)),await e.close(),g({exitCode:1});t=s.manifest,l=s.ruleContents,u=s.concernContents}e.writeln(h(`Pack: ${t.name}`),f(` v${t.version}`)),e.writeln(`Description: ${t.description}`),t.author!==void 0&&e.writeln(`Author: ${t.author}`),t.tags!==void 0&&t.tags.length>0&&e.writeln(`Tags: ${t.tags.join(", ")}`),e.writeln("");let c=t.rules?.length??0;if(e.writeln(h(`Rules (${c}):`)),l!==null)for(let[s,d]of Object.entries(l))e.writeln(` - ${s}: `,f(`"${d}"`));else if(t.rules!==void 0)for(let s of t.rules){let d=s.replace(/^rules\//,"").replace(/\.md$/,"");e.writeln(` - ${d}`)}let p=t.concerns?.length??0;if(e.writeln(""),e.writeln(h(`Concerns (${p}):`)),u!==null&&u.length>0)for(let s of u)e.writeln(` - ${s.id}: ${s.name}`),s.acceptanceCriteria.length>0&&e.writeln(f(` ACs: "${s.acceptanceCriteria.join('", "')}"`));else p===0&&e.writeln(f(" none"));let o=t.folderRules!==void 0?Object.keys(t.folderRules).length:0;e.writeln(""),e.writeln(`Folder rules: ${o>0?o:"none"}`);let a=t.requires?.length??0;return e.writeln(`Dependencies: ${a>0?t.requires.join(", "):"none"}`),await e.close(),$(void 0)},pe=async r=>{let e=P({renderer:v.ansi(),sink:S.stdout()}),n=r?.[0]?.toLowerCase();if(n===void 0||n.length===0){let c=C();return e.writeln(w("Please provide a search query: "),h(`${c} pack search typescript`)),await e.close(),g({exitCode:1})}e.writeln(h("Matching packs:"));let i=!1;for(let[c,p]of x){let o=p.manifest.tags??[],a=c.includes(n),s=o.some(k=>k.includes(n)),d=p.manifest.description.toLowerCase().includes(n);(a||s||d)&&(e.writeln(" ",h(c.padEnd(16)),f(p.manifest.description),f(" [builtin]")),i=!0)}let{root:t}=await R(),u=(await T(t))?.packRegistry;if(u!==void 0)try{let c=await globalThis.fetch(u,{signal:AbortSignal.timeout(D)});if(c.ok){let p=JSON.parse(await c.text());for(let o of p.packs){let a=o.tags??[],s=o.name.includes(n),d=a.some(I=>I.includes(n)),k=o.description.toLowerCase().includes(n);(s||d||k)&&(e.writeln(" ",h(o.name.padEnd(16)),f(o.description),f(` [${o.source}]`)),i=!0)}}}catch{}return i||e.writeln(f(` No packs matching "${n}" found.`)),await e.close(),$(void 0)};export{A as installBuiltinPack,oe as installRemotePack,je as main,M as readPacksFile,N as writePacksFile};
@@ -1,4 +1,4 @@
1
- import{a as k,b as C,f as v,n as o}from"./chunk-4N7N37OY.js";import{b as D,c as P}from"./chunk-MSJSMJL2.js";import{c as E,d as l,k as R,p as x}from"./chunk-AQWB2PVR.js";import"./chunk-K223KAUB.js";import{a as d,b as $}from"./chunk-2N4GTHXQ.js";import{b as a}from"./chunk-RMCTOOQL.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import{e as j}from"./chunk-OTRBRRIO.js";var S=j(E(),1);var Y=async e=>{let t=a.process.cwd(),n=D(e),s=C({target:n==="agent"?"non-interactive":"interactive"}),u=P(e).includes("--force");if(!u&&n==="agent")return o.error(s,"Purge requires `--force` flag in agent mode."),$({exitCode:1});if(u)return o.step(s,"Purging noskills content..."),await q(t,s),o.success(s,"Purge complete."),d(void 0);let g=(await N(t)).filter(i=>i.exists);if(g.length===0)return o.info(s,"Nothing to remove."),d(void 0);let p=[];for(let i of g){let y=await v(s,{message:i.message});if(k(y))return o.info(s,"Aborted."),d(void 0);p.push({id:i.id,confirmed:y===!0})}let f=p.filter(i=>i.confirmed),I=p.filter(i=>!i.confirmed);if(f.length===0)return o.info(s,"Nothing selected for removal."),d(void 0);let T=new Set(f.map(i=>i.id)),w=[];for(let i of f)await H(t,i.id)?o.step(s,` Removed ${h(i.id)}`):(w.push(i.id),o.step(s,` Failed to remove ${h(i.id)}`));for(let i of I)o.step(s,` Kept ${h(i.id)}`);T.size>0&&await b(t);let M=f.length-w.length;return o.success(s,`Purge complete (${M} of ${g.length} categories removed).`),d(void 0)},N=async e=>{let[t,n,s,r]=await Promise.all([O(e),L(e),J(e),U(e)]);return[t,n,s,r]},O=async e=>{let t=await x(e),n=t.map(s=>s.id).join(", ");return{id:"concerns",exists:t.length>0,message:`Remove concerns? (${n})`}},L=async e=>{let t=await R(e),n=0;try{for await(let c of a.fs.readDir(`${e}/${l.specsDir}`))c.isDirectory&&n++}catch{}let s=Math.max(t.length,n);if(s===0)return{id:"specs",exists:!1,message:""};let r=t.map(c=>`${c.name} ${c.state.phase}`).join(", ");return{id:"specs",exists:!0,message:t.length>0?`Remove specs? (${s} specs: ${r})`:`Remove specs? (${s} spec directories)`}},J=async e=>{let t=0;try{for await(let n of a.fs.readDir(`${e}/${l.rulesDir}`))n.isFile&&t++}catch{}return{id:"rules",exists:t>0,message:`Remove rules? (${t} active rules)`}},U=async e=>{let t=!1,n=!1,s=!1;try{let c=await a.fs.readTextFile(`${e}/.claude/settings.json`);t=JSON.parse(c).hooks!==void 0}catch{}try{n=(await a.fs.readTextFile(`${e}/CLAUDE.md`)).includes("<!-- noskills:start -->")}catch{}let r=[`${e}/.claude/agents/noskills-executor.md`,`${e}/.claude/agents/noskills-verifier.md`];for(let c of r)try{await a.fs.stat(c),s=!0;break}catch{}return{id:"agent-integration",exists:t||n||s,message:"Remove agent integration? (.claude/settings.json, CLAUDE.md, .claude/agents/noskills-*.md)"}},h=e=>({concerns:"concerns",specs:"specs",rules:"rules","agent-integration":"agent integration"})[e],H=(e,t)=>{switch(t){case"concerns":return m(`${e}/${l.concernsDir}`);case"specs":return z([`${e}/${l.specsDir}`,`${e}/${l.stateDir}`]);case"rules":return m(`${e}/${l.rulesDir}`);case"agent-integration":return A(e)}},q=async(e,t)=>{await m(`${e}/${l.concernsDir}`)&&o.step(t," Removed `.eser/concerns/`"),await m(`${e}/${l.specsDir}`)&&o.step(t," Removed `.eser/specs/`"),await m(`${e}/${l.rulesDir}`)&&o.step(t," Removed `.eser/rules/`"),await m(`${e}/${l.stateDir}`)&&o.step(t," Removed `.eser/.state/`"),await b(e)&&o.step(t," Removed noskills section from `manifest.yml`"),await A(e)&&o.step(t," Removed agent integration")},m=async e=>{try{await a.fs.stat(e);let{rmSync:t}=await import("node:fs");return t(e,{recursive:!0,force:!0}),!0}catch{return!1}},z=async e=>{let t=!1;for(let n of e)await m(n)&&(t=!0);return t},F=async e=>{try{await a.fs.stat(e);let{unlinkSync:t}=await import("node:fs");return t(e),!0}catch{return!1}},b=async e=>{let t=`${e}/${l.manifestFile}`;try{let n=await a.fs.readTextFile(t),s=S.parseDocument(n);return s.has("noskills")?(s.delete("noskills"),await a.fs.writeTextFile(t,s.toString()),!0):!1}catch{return!1}},B=async e=>{let t=`${e}/CLAUDE.md`,n="<!-- noskills:start -->",s="<!-- noskills:end -->";try{let r=await a.fs.readTextFile(t),u=r.indexOf(n),c=r.indexOf(s);return u!==-1&&c!==-1?(r=r.slice(0,u).trimEnd()+`
1
+ import{a as k,b as C,f as v,n as o}from"./chunk-YTNM7A5Y.js";import{b as D,c as P}from"./chunk-5CNPFLE6.js";import{c as E,d as l,l as R,q as x}from"./chunk-5URW6X3N.js";import"./chunk-2GF5IUQD.js";import{a as d,b as $}from"./chunk-2N4GTHXQ.js";import{i as a}from"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import{e as j}from"./chunk-OTRBRRIO.js";var S=j(E(),1);var Y=async e=>{let t=a.process.cwd(),n=D(e),s=C({target:n==="agent"?"non-interactive":"interactive"}),u=P(e).includes("--force");if(!u&&n==="agent")return o.error(s,"Purge requires `--force` flag in agent mode."),$({exitCode:1});if(u)return o.step(s,"Purging noskills content..."),await q(t,s),o.success(s,"Purge complete."),d(void 0);let g=(await N(t)).filter(i=>i.exists);if(g.length===0)return o.info(s,"Nothing to remove."),d(void 0);let p=[];for(let i of g){let y=await v(s,{message:i.message});if(k(y))return o.info(s,"Aborted."),d(void 0);p.push({id:i.id,confirmed:y===!0})}let f=p.filter(i=>i.confirmed),I=p.filter(i=>!i.confirmed);if(f.length===0)return o.info(s,"Nothing selected for removal."),d(void 0);let T=new Set(f.map(i=>i.id)),w=[];for(let i of f)await H(t,i.id)?o.step(s,` Removed ${h(i.id)}`):(w.push(i.id),o.step(s,` Failed to remove ${h(i.id)}`));for(let i of I)o.step(s,` Kept ${h(i.id)}`);T.size>0&&await b(t);let M=f.length-w.length;return o.success(s,`Purge complete (${M} of ${g.length} categories removed).`),d(void 0)},N=async e=>{let[t,n,s,r]=await Promise.all([O(e),L(e),J(e),U(e)]);return[t,n,s,r]},O=async e=>{let t=await x(e),n=t.map(s=>s.id).join(", ");return{id:"concerns",exists:t.length>0,message:`Remove concerns? (${n})`}},L=async e=>{let t=await R(e),n=0;try{for await(let c of a.fs.readDir(`${e}/${l.specsDir}`))c.isDirectory&&n++}catch{}let s=Math.max(t.length,n);if(s===0)return{id:"specs",exists:!1,message:""};let r=t.map(c=>`${c.name} ${c.state.phase}`).join(", ");return{id:"specs",exists:!0,message:t.length>0?`Remove specs? (${s} specs: ${r})`:`Remove specs? (${s} spec directories)`}},J=async e=>{let t=0;try{for await(let n of a.fs.readDir(`${e}/${l.rulesDir}`))n.isFile&&t++}catch{}return{id:"rules",exists:t>0,message:`Remove rules? (${t} active rules)`}},U=async e=>{let t=!1,n=!1,s=!1;try{let c=await a.fs.readTextFile(`${e}/.claude/settings.json`);t=JSON.parse(c).hooks!==void 0}catch{}try{n=(await a.fs.readTextFile(`${e}/CLAUDE.md`)).includes("<!-- noskills:start -->")}catch{}let r=[`${e}/.claude/agents/noskills-executor.md`,`${e}/.claude/agents/noskills-verifier.md`];for(let c of r)try{await a.fs.stat(c),s=!0;break}catch{}return{id:"agent-integration",exists:t||n||s,message:"Remove agent integration? (.claude/settings.json, CLAUDE.md, .claude/agents/noskills-*.md)"}},h=e=>({concerns:"concerns",specs:"specs",rules:"rules","agent-integration":"agent integration"})[e],H=(e,t)=>{switch(t){case"concerns":return m(`${e}/${l.concernsDir}`);case"specs":return z([`${e}/${l.specsDir}`,`${e}/${l.stateDir}`]);case"rules":return m(`${e}/${l.rulesDir}`);case"agent-integration":return A(e)}},q=async(e,t)=>{await m(`${e}/${l.concernsDir}`)&&o.step(t," Removed `.eser/concerns/`"),await m(`${e}/${l.specsDir}`)&&o.step(t," Removed `.eser/specs/`"),await m(`${e}/${l.rulesDir}`)&&o.step(t," Removed `.eser/rules/`"),await m(`${e}/${l.stateDir}`)&&o.step(t," Removed `.eser/.state/`"),await b(e)&&o.step(t," Removed noskills section from `manifest.yml`"),await A(e)&&o.step(t," Removed agent integration")},m=async e=>{try{await a.fs.stat(e);let{rmSync:t}=await import("node:fs");return t(e,{recursive:!0,force:!0}),!0}catch{return!1}},z=async e=>{let t=!1;for(let n of e)await m(n)&&(t=!0);return t},F=async e=>{try{await a.fs.stat(e);let{unlinkSync:t}=await import("node:fs");return t(e),!0}catch{return!1}},b=async e=>{let t=`${e}/${l.manifestFile}`;try{let n=await a.fs.readTextFile(t),s=S.parseDocument(n);return s.has("noskills")?(s.delete("noskills"),await a.fs.writeTextFile(t,s.toString()),!0):!1}catch{return!1}},B=async e=>{let t=`${e}/CLAUDE.md`,n="<!-- noskills:start -->",s="<!-- noskills:end -->";try{let r=await a.fs.readTextFile(t),u=r.indexOf(n),c=r.indexOf(s);return u!==-1&&c!==-1?(r=r.slice(0,u).trimEnd()+`
2
2
  `+r.slice(c+s.length).trimStart(),await a.fs.writeTextFile(t,r.trimEnd()+`
3
3
  `),!0):!1}catch{return!1}},K=async e=>{let t=`${e}/.claude/settings.json`;try{let n=await a.fs.readTextFile(t),s=JSON.parse(n);return s.hooks!==void 0?(delete s.hooks,await a.fs.writeTextFile(t,JSON.stringify(s,null,2)+`
4
4
  `),!0):!1}catch{return!1}},A=async e=>{let t=!1;await K(e)&&(t=!0),await B(e)&&(t=!0);let n=[`${e}/.claude/agents/noskills-executor.md`,`${e}/.claude/agents/noskills-verifier.md`];for(let r of n)await F(r)&&(t=!0);let s=[`${e}/.cursorrules`,`${e}/.windsurfrules`,`${e}/.kiro/steering/conventions.md`,`${e}/.github/copilot-instructions.md`];for(let r of s)await F(r)&&(t=!0);return t};export{Y as main};
@@ -0,0 +1 @@
1
+ import{h as E}from"./chunk-HNAHPI6V.js";import{q as y,s as C}from"./chunk-OKM4FE4G.js";import{C as g,f as w,h as f,i as h,k as S}from"./chunk-5URW6X3N.js";import{d as c,f as n,g as l,o as m,q as d,r as u}from"./chunk-2GF5IUQD.js";import{a as p,b as a}from"./chunk-2N4GTHXQ.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var M=async v=>{let e=m({renderer:u.ansi(),sink:d.stdout()}),{root:r}=await g(),i=f(v);if(!i.ok)return e.writeln(n(i.error)),await e.close(),a({exitCode:1});let t;try{t=await w(r,i.spec)}catch(o){let x=o instanceof Error?o.message:String(o);return e.writeln(n(x)),await e.close(),a({exitCode:1})}if(t.phase!=="COMPLETED")return e.writeln(n(`Cannot reopen in phase: ${t.phase}`)),e.writeln(c("Only COMPLETED specs can be reopened.")),await e.close(),a({exitCode:1});let k=await E(r),s=y(t);return s=C(s,"COMPLETED","DISCOVERY",k,"reopened"),await h(r,s),s.spec!==null&&await S(r,s.spec,s),e.writeln(l("\u2714")," Spec reopened. Discovery answers preserved \u2014 run `noskills next` to revise."),await e.close(),p(void 0)};export{M as main};
@@ -0,0 +1 @@
1
+ import{C as v}from"./chunk-OKM4FE4G.js";import{C as I,d as h,f as g,h as y,i as S,k}from"./chunk-5URW6X3N.js";import{d as a,f as n,g as d,o as u,q as w,r as f}from"./chunk-2GF5IUQD.js";import{a as c,b as l}from"./chunk-2N4GTHXQ.js";import{i as m}from"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var F=async A=>{let e=u({renderer:f.ansi(),sink:w.stdout()}),{root:i}=await I(),o=y(A);if(!o.ok)return e.writeln(n(o.error)),await e.close(),l({exitCode:1});let s;try{s=await g(i,o.spec)}catch(r){let R=r instanceof Error?r.message:String(r);return e.writeln(n(R)),await e.close(),l({exitCode:1})}if(s.phase==="IDLE"||s.phase==="UNINITIALIZED")return e.writeln(a("Already idle. Nothing to reset.")),await e.close(),c(void 0);if(s.spec!==null){let r=`${i}/${h.specDir(s.spec)}`;try{await m.fs.stat(r)}catch{e.writeln(n(`Active spec '${s.spec}' directory not found.`)),e.writeln(a("Resetting to idle anyway."))}}let t=s.spec,p=v(s);return await S(i,p),t!==null&&await k(i,t,p),e.writeln(d("\u2714")," Reset to idle."),t!==null&&e.writeln(a(`Spec "${t}" state cleared. Files in .eser/specs/${t}/ preserved.`)),await e.close(),c(void 0)};export{F as main};
@@ -0,0 +1 @@
1
+ import{b as T}from"./chunk-OVLGUKPG.js";import"./chunk-DEIZVYT6.js";import{a as M}from"./chunk-H77MLIL5.js";import{h as P}from"./chunk-HNAHPI6V.js";import{A as D}from"./chunk-OKM4FE4G.js";import{C,f as x,h as E,k as b,m as k,q as A}from"./chunk-5URW6X3N.js";import{c as q,d as c,f as d,g as p,h as v,o as I,q as S,r as $}from"./chunk-2GF5IUQD.js";import{a as w,b as g}from"./chunk-2N4GTHXQ.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var J=async f=>{let t=I({renderer:$.ansi(),sink:S.stdout()}),{root:r}=await C(),i=E(f);if(!i.ok)return t.writeln(d(i.error)),await t.close(),g({exitCode:1});let u;try{u=await x(r,i.spec)}catch(e){let s=e instanceof Error?e.message:String(e);return t.writeln(d(s)),await t.close(),g({exitCode:1})}let o=await P(r),h=u.discovery.delegations??[],n=h.filter(e=>e.delegatedTo===o.name&&e.status==="pending"),l=h.filter(e=>e.delegatedTo===o.name&&e.status==="answered");if(n.length===0&&l.length===0)return t.writeln(c("No delegations for you on this spec.")),await t.close(),w(void 0);let N=await A(r),R=await k(r),W=N.filter(e=>R?.concerns.includes(e.id)??!1),F=T(W),y=new Map(F.map(e=>[e.id,e.text]));if(t.writeln(q(`Spec: ${i.spec}`)),t.writeln(""),n.length>0){t.writeln(v(`You have ${n.length} pending delegation(s):`)),t.writeln("");for(let e=0;e<n.length;e++){let s=n[e],Q=y.get(s.questionId)??s.questionId;t.writeln(` ${e+1}. `,d("[PENDING]"),` ${Q}`),t.writeln(c(` Delegated by: ${s.delegatedBy} (${s.delegatedAt.slice(0,10)})`))}}if(l.length>0){t.writeln(""),t.writeln(p(`${l.length} answered delegation(s):`));for(let e of l){let s=y.get(e.questionId)??e.questionId;t.writeln(" ",p("\u2714"),` ${s}`),t.writeln(c(` Answer: ${e.answer?.slice(0,80)??""}`))}}let m=null,a=null;for(let e of f??[])e.startsWith("--answer=")&&(m=e.slice(9)),e.startsWith("--question=")&&(a=parseInt(e.slice(11),10)-1);if(m!==null&&a!==null&&a>=0&&a<n.length){let e=n[a],s=D(u,e.questionId,m,o.name);await b(r,i.spec,s),await M(r,{ts:new Date().toISOString(),type:"delegation-answered",spec:i.spec,user:o.name,question:e.questionId}),t.writeln(""),t.writeln(p("\u2714"),` Answered: ${e.questionId}`)}return await t.close(),w(void 0)};export{J as main};
@@ -0,0 +1,6 @@
1
+ import{a as A,f as C}from"./chunk-6YHWLEJ4.js";import{C as x,d as k,m as R}from"./chunk-5URW6X3N.js";import{b as T,c as P}from"./chunk-UT6ZCLRA.js";import{c as y,d as a,f as j,g as v,o as p,q as d,r as u}from"./chunk-2GF5IUQD.js";import{a as h,b as w}from"./chunk-2N4GTHXQ.js";import{i as $}from"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var B=async e=>{let s=e?.[0];if(s==="add")return await b(e?.slice(1));if(s==="list")return await W();if(s==="promote")return await U(e?.slice(1));let i=T(),t=p({renderer:u.ansi(),sink:d.stdout()});return t.writeln(`Usage: ${i} rule <add "rule text" | list | promote "decision">`),await t.close(),h(void 0)},b=async e=>{let s=p({renderer:u.ansi(),sink:d.stdout()}),{root:i}=await x(),t=[],r=[],n=[];if(e!==void 0)for(let o of e)o.startsWith("--phases=")?t=o.slice(9).split(",").map(g=>g.trim()):o.startsWith("--applies-to=")?r=o.slice(13).split(",").map(g=>g.trim().replace(/^["']|["']$/g,"")):o.startsWith("-")||n.push(o);let c=n.join(" "),m=await R(i);if(c.length===0)return s.writeln(j("Please provide a rule: "),y(`${P('rule add "Use Deno Tests for all tests"')}`)),await s.close(),w({exitCode:1});let D=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,50),l="";(t.length>0||r.length>0)&&(l+=`---
2
+ `,t.length>0&&(l+=`phases: [${t.join(", ")}]
3
+ `),r.length>0&&(l+=`applies_to: [${r.map(o=>`"${o}"`).join(", ")}]
4
+ `),l+=`---
5
+ `),l+=c+`
6
+ `;let E=`${i}/${k.rulesDir}/${D}.md`;await $.fs.mkdir(`${i}/${k.rulesDir}`,{recursive:!0}),await $.fs.writeTextFile(E,l);let f=[];t.length>0&&f.push(t.join(", ")),r.length>0&&f.push(r.join(", "));let L=f.length>0?` [${f.join("; ")}]`:"";return s.writeln(v("\u2714")," Rule added: ",a(c),a(L)),m!==null&&m.tools.length>0&&(await C(i,m.tools,m),s.writeln(a(" Tool files synced."))),await s.close(),h(void 0)},W=async()=>{let e=p({renderer:u.ansi(),sink:d.stdout()}),{root:s}=await x(),i=await A(s);if(e.writeln(y("Rules")),e.writeln(""),i.length===0)e.writeln(a(` No rules yet. Add one with: ${P('rule add "..."')}`));else for(let t=0;t<i.length;t++){let r=i[t],n=[];r.phases!==void 0&&r.phases.length>0?n.push(r.phases.join(", ")):n.push("all phases"),r.appliesTo!==void 0&&r.appliesTo.length>0?n.push(r.appliesTo.join(", ")):n.push("all files"),e.writeln(` ${t+1}. ${r.text} `,a(`[${n.join(", ")}]`))}return await e.close(),h(void 0)},U=async e=>{let s=p({renderer:u.ansi(),sink:d.stdout()}),i=e?.join(" ");return i===void 0||i.length===0?(s.writeln(j("Please provide the decision text to promote.")),await s.close(),w({exitCode:1})):(await s.close(),await b(e))};export{B as main};
@@ -0,0 +1,3 @@
1
+ import{a as T,b as D,g as A}from"./chunk-YTNM7A5Y.js";import{a as B}from"./chunk-RGGYSKJY.js";import{b as W,e as X}from"./chunk-6YHWLEJ4.js";import"./chunk-PKYW3S5P.js";import"./chunk-7UX6WIXX.js";import"./chunk-OVLGUKPG.js";import"./chunk-DEIZVYT6.js";import{a as j,m as _}from"./chunk-OKM4FE4G.js";import{B as L,C as M,e as g,f as F,g as N,i as $,m as U,q as G}from"./chunk-5URW6X3N.js";import{b as E,c as V}from"./chunk-UT6ZCLRA.js";import{c as y,d as o,f as l,g as v,h,k as P,o as I,q as R,r as O}from"./chunk-2GF5IUQD.js";import{a as S,b as w}from"./chunk-2N4GTHXQ.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var pe=async t=>{let e=I({renderer:O.ansi(),sink:R.stdout()}),{root:i}=await M(),n=t?.includes("--unattended")??!1,r=z(t,"--max-turns")??10,p=z(t,"--max-iterations")??50;if(!await L(i))return e.writeln(l(`noskills not initialized. Run: ${V("init")}`)),await e.close(),w({exitCode:1});let x=N(t),c=await F(i,x);if(c.phase!=="EXECUTING"&&c.phase!=="SPEC_APPROVED")return e.writeln(l(`Cannot run from phase: ${c.phase}`)),e.writeln(o("Must be in SPEC_APPROVED or EXECUTING to start.")),await e.close(),w({exitCode:1});if(c.phase==="SPEC_APPROVED"){e.writeln(o("Starting execution from approved spec..."));let s=_(c);await $(i,s)}let u=await U(i);if(u===null)return e.writeln(l("Config not found.")),await e.close(),w({exitCode:1});e.writeln(y(`${E()} run`)),e.writeln(o(`Mode: ${n?"unattended":"interactive"}, max-turns: ${r}, max-iterations: ${p}`)),e.writeln("");let m=0,d=0;for(;m<p;){m++;let s=await g(i);if(s.phase==="COMPLETED"){e.writeln(""),e.writeln(v("\u2714")," Spec completed!"),e.writeln(` Iterations: ${s.execution.iteration}`),e.writeln(` Decisions: ${s.decisions.length}`);break}if(s.phase==="BLOCKED"){let a=s.execution.lastProgress??"Unknown";if(e.writeln(""),e.writeln(h("\u26A0")," Execution blocked: ",o(a)),n){await Z(i,a,m),e.writeln(o("Logged to .eser/.state/blocked.log. Resolve and re-run.")),d=1;break}let C=D(),f=await A(C,{message:"Enter resolution (or leave empty to stop):"});if(T(f)||f===""){e.writeln(o("Stopped by user."));break}let k=j(s,"EXECUTING");await $(i,{...k,execution:{...k.execution,lastProgress:`Resolved: ${f}`}});continue}if(s.phase!=="EXECUTING"){e.writeln(l(`Unexpected phase: ${s.phase}. Stopping.`)),d=1;break}let H=(await G(i)).filter(a=>u.concerns.includes(a.id)),q=await W(i),K=X(u.tools),J=await B(s,H,q,u,void 0,void 0,void 0,K),Q=Y(J);e.writeln(P(`\u2500\u2500 Iteration ${m}`),o(` (execution: ${s.execution.iteration}, debt: ${s.execution.debt?.items.length??0})`)),s.execution.lastProgress!==null&&e.writeln(o(` Last: ${s.execution.lastProgress}`)),s.execution.lastVerification?.passed===!1&&e.writeln(l(" Verification failed \u2014 agent will fix")),s.execution.debt!==null&&e.writeln(h(` Debt: ${s.execution.debt.items.length} items`)),e.writeln(o(" Spawning agent..."));try{await(await import("./mod-A77UWGGG.js")).exec`claude -p ${Q} --max-turns ${String(r)} --output-format json`.noThrow().text()}catch{e.writeln(l(" Failed to spawn claude CLI. Is it installed?")),d=1;break}e.writeln(o(" Agent exited. Stop hook captured state."));let b=await g(i);if(u.autoCommit===!0&&u.allowGit!==!1)try{let a=await import("./mod-A77UWGGG.js");if((await a.exec`git diff --name-only`.noThrow().text()).trim().length>0){await a.exec`git add -A`.noThrow().text();let f=`noskills: iteration ${b.execution.iteration} \u2014 ${b.execution.lastProgress??"progress"}`;await a.exec`git commit -m ${f}`.noThrow().text(),e.writeln(o(" Auto-committed."))}}catch{e.writeln(o(" Auto-commit failed (non-fatal)."))}}return m>=p&&(e.writeln(""),e.writeln(h("\u26A0"),` Max iterations (${p}) reached. Stopping.`),d=2),await e.close(),d!==0?w({exitCode:d}):S(void 0)},Y=t=>{let e=[];if(e.push(t.meta.resumeHint),e.push(""),t.meta.spec!==null&&(e.push(`Working on spec: ${t.meta.spec}`),e.push("")),"instruction"in t&&(e.push(t.instruction),e.push("")),"previousIterationDebt"in t){let n=t.previousIterationDebt;if(n!==void 0){e.push(`DEBT from iteration ${n.fromIteration} (address first):`);for(let r of n.items)e.push(`- ${r}`);e.push("")}}if("statusReportRequired"in t){let n=t.statusReport;if(n!==void 0){e.push("Report against these acceptance criteria:");for(let r of n.criteria)e.push(`- ${r}`);e.push("")}}if("verificationFailed"in t&&t.verificationFailed===!0&&(e.push("Test output:"),e.push(("verificationOutput"in t?t.verificationOutput:"")??""),e.push("")),t.behavioral.rules.length>0){e.push("Rules:");for(let n of t.behavioral.rules)e.push(`- ${n}`);e.push("")}if("context"in t){let n=t.context;if(n.concernReminders.length>0){e.push("Reminders:");for(let r of n.concernReminders)e.push(`- ${r}`);e.push("")}}let i=E();return e.push(`When done, report progress: ${i} next --answer="your progress"`),e.push(`If blocked, run: ${i} block "reason"`),e.push(`When all tasks are complete: ${i} done`),e.join(`
2
+ `)},z=(t,e)=>{if(t===void 0)return null;let i=`${e}=`;for(let n of t)if(n.startsWith(i)){let r=parseInt(n.slice(i.length),10);if(!isNaN(r)&&r>0)return r}return null},Z=async(t,e,i)=>{let n=`${t}/.eser/.state/blocked.log`,r=`[${new Date().toISOString()}] iteration=${i} reason=${e}
3
+ `;try{let{appendFileSync:p,mkdirSync:x}=await import("node:fs"),{dirname:c}=await import("node:path");x(c(n),{recursive:!0}),p(n,r)}catch{}};export{pe as main};