noskills 4.1.50 → 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 (92) hide show
  1. package/README.md +345 -890
  2. package/chunks/approve-ZX62EG5U.js +1 -0
  3. package/chunks/{ask-IZXOXJHB.js → ask-VGI3BFZW.js} +1 -1
  4. package/chunks/block-ERQESYMH.js +1 -0
  5. package/chunks/cancel-FOVCYBQY.js +1 -0
  6. package/chunks/{chunk-K223KAUB.js → chunk-2GF5IUQD.js} +1 -1
  7. package/chunks/chunk-5CNPFLE6.js +1 -0
  8. package/chunks/chunk-5P46WSNG.js +5 -0
  9. package/chunks/{chunk-AQWB2PVR.js → chunk-5URW6X3N.js} +93 -92
  10. package/chunks/{chunk-6OQNXZAN.js → chunk-6YHWLEJ4.js} +26 -26
  11. package/chunks/chunk-AP3YBNPX.js +1 -0
  12. package/chunks/{chunk-OCDUS26F.js → chunk-DEIZVYT6.js} +1 -1
  13. package/chunks/chunk-H77MLIL5.js +4 -0
  14. package/chunks/{chunk-TI4CLT2V.js → chunk-HNAHPI6V.js} +1 -1
  15. package/chunks/{chunk-E7UED6DA.js → chunk-JVCVWI3B.js} +1 -1
  16. package/chunks/{chunk-ESTTTPON.js → chunk-KYQ77E7T.js} +1 -1
  17. package/chunks/{chunk-JCIANZPY.js → chunk-LBPD4EIH.js} +1 -1
  18. package/chunks/chunk-OKM4FE4G.js +1 -0
  19. package/chunks/chunk-OVLGUKPG.js +1 -0
  20. package/chunks/chunk-PKYW3S5P.js +5 -0
  21. package/chunks/chunk-RGGYSKJY.js +5 -0
  22. package/chunks/chunk-RJX4ZXQ4.js +2 -0
  23. package/chunks/{chunk-WWPJMOT3.js → chunk-SVJVJDZR.js} +1 -1
  24. package/chunks/{chunk-JKKCV4KM.js → chunk-UG26APX2.js} +1 -1
  25. package/chunks/{chunk-2X2U2VC5.js → chunk-UT6ZCLRA.js} +1 -1
  26. package/chunks/chunk-XNGHRJVK.js +1 -0
  27. package/chunks/{chunk-CLCZ7IO3.js → chunk-YSSDQJTT.js} +1 -1
  28. package/chunks/chunk-YTNM7A5Y.js +3 -0
  29. package/chunks/chunk-Z3O5HAIO.js +2 -0
  30. package/chunks/{claude-code-F64HRHHR.js → claude-code-BWCSAVK2.js} +1 -1
  31. package/chunks/{cmd-NWSNAUKC.js → cmd-ZXO6KFK6.js} +1 -1
  32. package/chunks/concern-2PON4VPG.js +1 -0
  33. package/chunks/{config-EPT7NOOO.js → config-CZDLCSOC.js} +1 -1
  34. package/chunks/delegate-VRPCGUT2.js +1 -0
  35. package/chunks/diagrams-D5CYTTWA.js +1 -0
  36. package/chunks/diagrams-I2QKL7WR.js +1 -0
  37. package/chunks/done-WQDGQZ5D.js +1 -0
  38. package/chunks/followup-Q3RLSNNM.js +1 -0
  39. package/chunks/{free-5HORD4VB.js → free-R4ZTZ76O.js} +1 -1
  40. package/chunks/init-HTCNOWTZ.js +1 -0
  41. package/chunks/invoke-hook-675IUCLN.js +13 -0
  42. package/chunks/{kiro-XJ6XH4Q4.js → kiro-RGYUKJAX.js} +1 -1
  43. package/chunks/learn-MWUFAR2G.js +7 -0
  44. package/chunks/{list-SG2MZH7M.js → list-6EQP6VUL.js} +1 -1
  45. package/chunks/manager-Q7DRXNNO.js +6 -0
  46. package/chunks/{mod-AU5SVHO5.js → mod-A77UWGGG.js} +1 -1
  47. package/chunks/mod-TYCXSLSH.js +1 -0
  48. package/chunks/next-7W4YVHSZ.js +7 -0
  49. package/chunks/{ollama-IVHLR7VV.js → ollama-LTZ43OHQ.js} +1 -1
  50. package/chunks/{opencode-MTSBCZYY.js → opencode-PZDL7VDP.js} +1 -1
  51. package/chunks/pack-DXWS4PMA.js +5 -0
  52. package/chunks/{purge-573OIQZI.js → purge-XZ5EOCFP.js} +1 -1
  53. package/chunks/reopen-VATALF56.js +1 -0
  54. package/chunks/reset-BL73UVLM.js +1 -0
  55. package/chunks/review-VF6JOTLX.js +1 -0
  56. package/chunks/rule-ODX4WMCS.js +6 -0
  57. package/chunks/run-J5Z6R4DP.js +3 -0
  58. package/chunks/session-DFMI2GCC.js +1 -0
  59. package/chunks/spec-3PAUTPIT.js +1 -0
  60. package/chunks/status-5JHFFTMD.js +1 -0
  61. package/chunks/sync-CVEZ4FMQ.js +1 -0
  62. package/chunks/{watch-ELIW23EO.js → watch-I7Q3AEAQ.js} +7 -7
  63. package/chunks/web-JOWEH622.js +1 -0
  64. package/chunks/wontfix-CJMNFDCG.js +1 -0
  65. package/noskills.js +1 -1
  66. package/package.json +1 -1
  67. package/chunks/approve-LYDFDSXE.js +0 -1
  68. package/chunks/block-4IUG6QYT.js +0 -1
  69. package/chunks/cancel-STVRTPSC.js +0 -1
  70. package/chunks/chunk-4N7N37OY.js +0 -1
  71. package/chunks/chunk-GOLHD4DZ.js +0 -1
  72. package/chunks/chunk-IZMNMJYU.js +0 -16
  73. package/chunks/chunk-JNVM2KAE.js +0 -1
  74. package/chunks/chunk-MSJSMJL2.js +0 -1
  75. package/chunks/chunk-RMCTOOQL.js +0 -1
  76. package/chunks/chunk-RTD42HPS.js +0 -2
  77. package/chunks/concern-NQODAEHU.js +0 -1
  78. package/chunks/done-TLRZYAUZ.js +0 -1
  79. package/chunks/init-A3VTACZC.js +0 -1
  80. package/chunks/invoke-hook-Y2YREMYB.js +0 -11
  81. package/chunks/manager-5AJ7QWMG.js +0 -6
  82. package/chunks/next-GSQE7GYI.js +0 -8
  83. package/chunks/pack-KWRZVNBH.js +0 -5
  84. package/chunks/reopen-G7ZMJSB7.js +0 -1
  85. package/chunks/reset-WRG3L4QP.js +0 -1
  86. package/chunks/rule-HMBAP5LJ.js +0 -6
  87. package/chunks/run-CC6MLCNO.js +0 -3
  88. package/chunks/session-TYOM74BQ.js +0 -1
  89. package/chunks/spec-LVJCLNRO.js +0 -1
  90. package/chunks/status-YALP7W5Y.js +0 -1
  91. package/chunks/sync-L7E5Y3OG.js +0 -1
  92. package/chunks/wontfix-4L3IAWLG.js +0 -1
@@ -0,0 +1,7 @@
1
+ import{f as R}from"./chunk-6YHWLEJ4.js";import{a as D,b as x,c as C}from"./chunk-PKYW3S5P.js";import{C as S,d as k,g as E,m as L}from"./chunk-5URW6X3N.js";import"./chunk-UT6ZCLRA.js";import{c as P,d as a,f as o,g,o as b,q as I,r as T}from"./chunk-2GF5IUQD.js";import{a as u,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 U=async(i,e,t)=>{let d=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,50),h=`---
2
+ phases: [EXECUTING]
3
+ source: learned from spec "${t}" on ${new Date().toISOString().slice(0,10)}
4
+ ---
5
+ ${e}
6
+ `,f=`${i}/${k.rulesDir}/${d}.md`;return await $.fs.mkdir(`${i}/${k.rulesDir}`,{recursive:!0}),await $.fs.writeTextFile(f,h),f},j=i=>{let e=i.toLowerCase();return e.includes("always ")||e.includes("never ")||e.includes("every time")||e.includes("must ")||e.includes("do not ")||e.startsWith("use ")||e.includes("convention:")||e.includes("rule:")},B=async i=>{let e=b({renderer:T.ansi(),sink:I.stdout()}),{root:t}=await S(),d=i?.[0];if(d==="list"||d===void 0){let n=await x(t);if(n.length===0)return e.writeln(a("No learnings recorded yet.")),await e.close(),u(void 0);e.writeln(P(`${n.length} learning(s):`)),e.writeln("");for(let s=0;s<n.length;s++){let r=n[s],v=r.type==="mistake"?o("\u26A0"):g("\u2713"),m=a(`[${r.type}]`),W=r.severity==="high"?o("HIGH"):a(r.severity);e.writeln(` ${s+1}. ${v} ${m} ${r.text}`),e.writeln(a(` spec: ${r.spec} | severity: `),W,a(` | ${r.ts.slice(0,10)}`))}return await e.close(),u(void 0)}if(d==="remove"){let n=parseInt(i?.[1]??"",10)-1;return isNaN(n)||n<0?(e.writeln(o("Usage: noskills learn remove <number>")),await e.close(),w({exitCode:1})):(await C(t,n)?e.writeln(g("\u2714"),` Removed learning #${n+1}`):e.writeln(o(`Learning #${n+1} not found`)),await e.close(),u(void 0))}if(d==="promote"){let n=parseInt(i?.[1]??"",10)-1;if(isNaN(n)||n<0)return e.writeln(o("Usage: noskills learn promote <number>")),await e.close(),w({exitCode:1});let s=await x(t);if(n>=s.length)return e.writeln(o(`Learning #${n+1} not found`)),await e.close(),w({exitCode:1});let r=s[n],v=await U(t,r.text,r.spec);await C(t,n);let m=await L(t);return m!==null&&m.tools.length>0&&await R(t,m.tools,m),e.writeln(g("\u2714"),` Promoted to rule: ${v}`),e.writeln(a(" Removed from learnings.")),await e.close(),u(void 0)}let h=E(i),f=(i??[]).includes("--rule"),c=(i??[]).filter(n=>!n.startsWith("--")).join(" ");if(c.length===0)return e.writeln(o('Usage: noskills spec <name> learn "learning text"')),e.writeln(a(" Add --rule to create a permanent project rule instead.")),await e.close(),w({exitCode:1});let A=h??"unknown";if(f){let n=await U(t,c,A),s=await L(t);return s!==null&&s.tools.length>0&&await R(t,s.tools,s),e.writeln(g("\u2714"),` Rule created: ${n}`),await e.close(),u(void 0)}let p="convention",y="medium";for(let n of i??[]){if(n.startsWith("--type=")){let s=n.slice(7);["mistake","convention","success","dependency"].includes(s)&&(p=s)}if(n.startsWith("--severity=")){let s=n.slice(11);["high","medium","low"].includes(s)&&(y=s)}}let l=c.toLowerCase();l.includes("mistake")||l.includes("wrong")||l.includes("assumed")?(p="mistake",y="high"):l.includes("convention")||l.includes("pattern")||l.includes("always use")?p="convention":(l.includes("worked well")||l.includes("success"))&&(p="success"),await D(t,{ts:new Date().toISOString(),spec:A,type:p,text:c,severity:y});let N=j(c)?a(`
7
+ Tip: This sounds like a permanent rule. Add --rule to enforce it in every spec.`):"";return e.writeln(g("\u2714"),` Learning recorded: [${p}] ${c.slice(0,60)}${c.length>60?"...":""}`),N&&e.writeln(N),await e.close(),u(void 0)};export{B as main};
@@ -1 +1 @@
1
- import{a as p}from"./chunk-GOLHD4DZ.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-E7UED6DA.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-E7UED6DA.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-JKKCV4KM.js";import{a as i,e as m}from"./chunk-OLM5RTFK.js";import"./chunk-E7UED6DA.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};
@@ -1 +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-JKKCV4KM.js";import{a as c}from"./chunk-OLM5RTFK.js";import"./chunk-E7UED6DA.js";import"./chunk-RMCTOOQL.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};
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};
@@ -0,0 +1 @@
1
+ import{A as $,B as x,C as h,f as b,l as O,t as P,v as y,w as A,y as C,z as N}from"./chunk-5URW6X3N.js";import{b as I,c as R}from"./chunk-UT6ZCLRA.js";import{c as a,d as i,f as d,g as v,o as m,q as f,r as w}from"./chunk-2GF5IUQD.js";import{a as u,b as g}from"./chunk-2N4GTHXQ.js";import{i as E}from"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var G=async t=>{let s=t?.[0];if(s==="start")return await D(t?.slice(1));if(s==="end")return await M(t?.slice(1));if(s==="list")return await j();if(s==="gc")return await _();let n=I(),e=m({renderer:w.ansi(),sink:f.stdout()});return e.writeln(`Usage: ${n} session <start | end | list | gc>`),e.writeln(""),e.writeln(i(" start --spec=<name> Bind to a spec")),e.writeln(i(" start --free Idle mode (no spec, no enforcement)")),e.writeln(i(" start --auto Auto-detect spec or idle")),e.writeln(i(" end [--id=<id>] End current/specific session")),e.writeln(i(" list Show active sessions")),e.writeln(i(" gc Remove stale sessions")),await e.close(),u(void 0)},D=async t=>{let s=m({renderer:w.ansi(),sink:f.stdout()}),{root:n}=await h();if(!await x(n))return s.writeln(d("noskills is not initialized.")," Run: ",a(R("init"))),await s.close(),g({exitCode:1});let e=null,o=!1,c=!1;for(let r of t??[])r.startsWith("--spec=")?e=r.slice(7):r==="--free"?o=!0:r==="--auto"&&(c=!0);if(c){let p=(await O(n)).filter(L=>L.state.phase!=="COMPLETED"&&L.state.phase!=="IDLE");p.length===1?e=p[0].name:o=!0}if(e===null&&!o)return s.writeln(d("Specify --spec=<name>, --free, or --auto.")),s.writeln(i(`Example: ${I()} session start --spec=my-feature`)),await s.close(),g({exitCode:1});let l=null;if(e!==null)try{l=(await b(n,e)).phase}catch(r){let p=r instanceof Error?r.message:String(r);return s.writeln(d(`Error: ${p}`)),await s.close(),g({exitCode:1})}let S=$(),k={id:S,spec:e,mode:o?"free":"spec",phase:o?null:l,pid:0,startedAt:new Date().toISOString(),lastActiveAt:new Date().toISOString(),tool:"claude-code",projectRoot:n};return await P(n,k),s.writeln(v("Session started.")),s.writeln(" ID: ",a(S)),s.writeln(" Mode: ",a(o?"free":"spec")),e!==null&&(s.writeln(" Spec: ",a(e)),l!==null&&s.writeln(" Phase: ",i(l))),s.writeln(""),s.writeln("Run:"),s.writeln(a(` export NOSKILLS_SESSION=${S}`)),s.writeln(a(` export NOSKILLS_PROJECT_ROOT=${n}`)),await s.close(),u(void 0)},M=async t=>{let s=m({renderer:w.ansi(),sink:f.stdout()}),{root:n}=await h(),e=null;for(let c of t??[])c.startsWith("--id=")&&(e=c.slice(5));return e===null&&(e=E.env.get("NOSKILLS_SESSION")??null),e===null?(s.writeln(d("No session specified. Use --id=<id> or set NOSKILLS_SESSION env var.")),await s.close(),g({exitCode:1})):(await A(n,e)?s.writeln(v("Session ended: "),i(e)):s.writeln(d(`Session not found: ${e}`)),await s.close(),u(void 0))},j=async()=>{let t=m({renderer:w.ansi(),sink:f.stdout()}),{root:s}=await h(),n=await y(s);if(t.writeln(a("Sessions")),t.writeln(""),n.length===0)t.writeln(i(` No active sessions. Start one with: ${R("session start --spec=<name>")}`));else for(let e of n){let o=N(e),c=Date.now()-new Date(e.lastActiveAt).getTime(),l=Math.floor(c/6e4),S=l<60?`${l}min ago`:`${Math.floor(l/60)}h ago`,k=e.mode==="free"?"free":`spec:${e.spec??"?"}`,r=e.phase??"\u2014",p=o?d(" (stale)"):"";t.writeln(" ",a(e.id)," ",i(k.padEnd(25))," ",i(r.padEnd(18))," ",i(S),p)}return await t.close(),u(void 0)},_=async()=>{let t=m({renderer:w.ansi(),sink:f.stdout()}),{root:s}=await h(),n=await C(s);if(n.length===0)t.writeln(i("No stale sessions to remove."));else{t.writeln(v(`Removed ${n.length} stale session(s):`));for(let e of n)t.writeln(" ",i(e))}return await t.close(),u(void 0)};export{G as main};
@@ -0,0 +1 @@
1
+ import{a as G}from"./chunk-7UX6WIXX.js";import{a as X,d as B}from"./chunk-LBPD4EIH.js";import{a as Z}from"./chunk-H77MLIL5.js";import{g as W,h as U}from"./chunk-HNAHPI6V.js";import{b as z,g as N,h as F,p as L,r as H,s as J,t as Q,u as _}from"./chunk-OKM4FE4G.js";import{B as j,C as R,a as T,d as b,f as E,g as M,k as C,l as K}from"./chunk-5URW6X3N.js";import{b as S,c as I}from"./chunk-UT6ZCLRA.js";import{c as m,d as c,f as p,g as x,h as O,k as Y,o as $,q as v,r as y}from"./chunk-2GF5IUQD.js";import{a as w,b as d}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 ee=new Set(["new","list","help","next","approve","done","block","reset","cancel","wontfix","reopen","revisit","split","ac","task","note","review","delegate","followup"]),te=new Set(["a","an","the","and","or","but","in","on","at","to","for","of","with","by","from","is","it","its","this","that","as","be","are","was","were","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","i","we","you","they","our","my","so","if","not","no","all"]),se=n=>n.replace(/(?:~|\.{1,2})?\/(?:[\w@.-]+\/)*[\w@.-]+/g," ").replace(/(?:[\w@.-]+\/){2,}[\w@.-]+/g," ").replace(/\s+/g," ").trim(),ne=n=>{let a=se(n).toLowerCase().replace(/[^a-z0-9\s-]/g,"").split(/\s+/).filter(o=>o.length>0&&!te.has(o)).slice(0,6).join("-");return a.length>50&&(a=a.slice(0,50).replace(/-[^-]*$/,"")),a=a.replace(/^-+|-+$/g,""),a||"spec"},ie=n=>n.includes(" ")||n.length>50,re=new Map([["next",()=>import("./next-7W4YVHSZ.js")],["approve",()=>import("./approve-ZX62EG5U.js")],["done",()=>import("./done-WQDGQZ5D.js")],["block",()=>import("./block-ERQESYMH.js")],["reset",()=>import("./reset-BL73UVLM.js")],["cancel",()=>import("./cancel-FOVCYBQY.js")],["wontfix",()=>import("./wontfix-CJMNFDCG.js")],["reopen",()=>import("./reopen-VATALF56.js")],["review",()=>import("./review-VF6JOTLX.js")],["delegate",()=>import("./delegate-VRPCGUT2.js")],["followup",()=>import("./followup-Q3RLSNNM.js")],["learn",()=>import("./learn-MWUFAR2G.js")]]);var De=async n=>{let e=n?.[0];if(e==="new")return await ae(n?.slice(1));if(e==="list")return await oe(n?.slice(1));if(e==="help"||e===void 0){let l=S(),r=$({renderer:y.ansi(),sink:v.stdout()});return r.writeln(`Usage: ${l} spec <new "description" | list | <name> <command>>`),r.writeln(""),r.writeln(c(" Commands for a spec:")),r.writeln(c(" next, approve, done, block, reset, cancel, wontfix, reopen, revisit, split, ac, task, note")),r.writeln(""),r.writeln(c(" Examples:")),r.writeln(c(` ${l} spec new "Add photo upload support" # name auto-generated`)),r.writeln(c(` ${l} spec new my-feature "Add upload support" # explicit name`)),r.writeln(c(` ${l} spec my-feature next`)),r.writeln(c(` ${l} spec my-feature next --answer="approve"`)),await r.close(),w(void 0)}let t=e,s=n?.[1];if(s===void 0)return await(await import("./status-5JHFFTMD.js")).main([`--spec=${t}`]);if(s==="split")return await ce([`--spec=${t}`,...n?.slice(2)??[]]);if(s==="revisit")return await pe([`--spec=${t}`,...n?.slice(2)??[]]);if(s==="ac")return await de(t,n?.slice(2));if(s==="task")return await ue(t,n?.slice(2));if(s==="note")return await we(t,n?.slice(2));let a=re.get(s);if(a!==void 0)return await(await a()).main([`--spec=${t}`,...n?.slice(2)??[]]);let o=$({renderer:y.ansi(),sink:v.stdout()});return o.writeln(p(`Unknown command: spec ${t} ${s}`)),o.writeln(c(" Valid: next, approve, done, block, reset, cancel, wontfix, reopen, revisit, split, ac, task, note")),await o.close(),d({exitCode:1})},ae=async n=>{let e=$({renderer:y.ansi(),sink:v.stdout()}),{root:t}=await R();if(!await j(t))return e.writeln(p("noskills is not initialized.")," Run: ",m(I("init"))),await e.close(),d({exitCode:1});let s=null,a=[];if(n!==void 0){let h=!1,g=[];for(let k of n)k.startsWith("--name=")?(s=k.slice(7),h=!0):k.startsWith("-")||g.push(k);if(h)a.push(...g);else if(g.length>=1){let k=g[0];ie(k)?a.push(...g):(s=k,a.push(...g.slice(1)))}}let o=null;if(n!==void 0)for(let h of n)h.startsWith("--from-plan=")&&(o=h.slice(12));let l=a.join(" ");if((s===null||s.length===0)&&l.length>0){s=ne(l);let h=s,g=2;for(;;){if(ee.has(h)){h=`${s}-${g}`,g++;continue}let k=`${t}/${b.specDir(h)}`;try{await D.fs.stat(k),h=`${s}-${g}`,g++}catch{break}}s=h}if(s===null||s.length===0)return e.writeln(p("Error: description is required.")),e.writeln(c("Example: "),m(`${S()} spec new "Add photo upload support"`)),await e.close(),d({exitCode:1});if(ee.has(s))return e.writeln(p(`"${s}" is a reserved name.`),c(" Choose a different spec name.")),await e.close(),d({exitCode:1});let r=/^[a-z0-9][a-z0-9-]*[a-z0-9]$/;if(s.length>50||s.length>1&&!r.test(s)||s.length===1&&!/^[a-z0-9]$/.test(s))return e.writeln(p("Invalid spec name: "),m(s)),e.writeln(c("Must be lowercase, hyphens, numbers only. Max 50 chars. Regex: /^[a-z0-9][a-z0-9-]*[a-z0-9]$/")),await e.close(),d({exitCode:1});if(l.length===0)return e.writeln(p("Please provide a description: "),m(`${S()} spec new "Add photo upload support"`)),await e.close(),d({exitCode:1});if(o!==null)try{if((await D.fs.stat(o)).size>50*1024)return e.writeln(p("Plan file too large. Maximum 50KB.")),await e.close(),d({exitCode:1})}catch{return e.writeln(p(`Plan file not found: ${o}`)),await e.close(),d({exitCode:1})}let i=`spec/${s}`,u=`${t}/${b.specDir(s)}`;try{return await D.fs.stat(u),e.writeln(p(`Spec "${s}" already exists.`),c(` Use a different --name or run \`${S()} reset --spec=${s}\` first.`)),await e.close(),d({exitCode:1})}catch{}let A=T(),f=z(A,s,i,l),P=await U(t),V=J(f,"IDLE","DISCOVERY",P);return o!==null&&(V={...f,discovery:{...f.discovery,planPath:o}}),await D.fs.mkdir(`${t}/${b.specDir(s)}`,{recursive:!0}),await C(t,s,V),await Z(t,{ts:new Date().toISOString(),type:"spec-created",spec:s,user:P?.name??"unknown",description:l??""}),e.writeln(x("\u2714")," Spec started: ",m(s)),e.writeln(" Directory: ",c(b.specDir(s))),e.writeln(" Branch: ",c(i)),e.writeln(" Phase: ",O("DISCOVERY")),o!==null&&e.writeln(" Plan: ",c(o)),e.writeln(""),e.writeln("Run ",m(I(`next --spec=${s}`))," to begin discovery questions."),await e.close(),w(void 0)},oe=async n=>{let{root:e}=await R(),t=X(n),s=await K(e),a=`${e}/${b.specsDir}`,o=new Set(s.map(i=>i.name)),l=[];for(let i of s)l.push({name:i.name,phase:i.state.phase,iteration:i.state.execution.iteration});try{for await(let i of D.fs.readDir(a))i.isDirectory&&!o.has(i.name)&&l.push({name:i.name,phase:"IDLE",iteration:0})}catch{}if(t==="json")return await B(l,"json"),w(void 0);let r=$({renderer:y.ansi(),sink:v.stdout()});if(r.writeln(m("Specs")),r.writeln(""),l.length===0)r.writeln(c(" No specs yet."));else for(let i of l){let u=i.phase==="COMPLETED"?x(i.phase):i.phase==="EXECUTING"?Y(i.phase):i.phase==="BLOCKED"?p(i.phase):O(i.phase),A=i.phase==="EXECUTING"?c(` iteration ${i.iteration}`):"";r.writeln(" ",c("\u25CB")," ",i.name," ",u,A)}return await r.close(),w(void 0)},le=n=>{let e=[],t=0;for(;t<n.length;)if(n[t]==="--into"&&t+1<n.length){let s=n[t+1],a=s;t+2<n.length&&!n[t+2].startsWith("-")?(a=n[t+2],t+=3):t+=2,e.push({name:s,description:a})}else t+=1;return e},ce=async n=>{let e=$({renderer:y.ansi(),sink:v.stdout()}),{root:t}=await R();if(!await j(t))return e.writeln(p("noskills is not initialized.")," Run: ",m(I("init"))),await e.close(),d({exitCode:1});let s=M(n??[]);if(s===null)return e.writeln(p("Error: --spec=<name> is required.")),e.writeln(c("Example: "),m(`${S()} spec split --spec=parent --into name1 "desc1" --into name2 "desc2"`)),await e.close(),d({exitCode:1});let a;try{a=await E(t,s)}catch(i){let u=i instanceof Error?i.message:String(i);return e.writeln(p(`Error: ${u}`)),await e.close(),d({exitCode:1})}if(a.phase!=="DISCOVERY"&&a.phase!=="DISCOVERY_REVIEW")return e.writeln(p(`Cannot split spec in phase ${a.phase}. Must be in DISCOVERY or DISCOVERY_REVIEW.`)),await e.close(),d({exitCode:1});let o=le(n??[]);if(o.length<2){let i=G(a.discovery.answers);if(!i.detected||i.proposals.length<2)return e.writeln(p("Error: at least 2 --into entries required, or discovery answers must contain 2+ independent areas.")),await e.close(),d({exitCode:1});let u=[];for(let f of i.proposals){let P=`${t}/${b.specDir(f.name)}`;await D.fs.mkdir(P,{recursive:!0});let q=a.discovery.answers.filter(g=>f.relevantAnswers.includes(g.questionId)),h=z(T(),f.name,`spec/${f.name}`);for(let g of q)h=N(h,g.questionId,g.answer);h=F(h),await C(t,f.name,h),u.push(f.name)}let A=L(a,"cancelled",`Split into: ${u.join(", ")}`);await C(t,s,A),e.writeln(x("Split complete."),` Created ${u.length} sub-specs:`);for(let f of u)e.writeln(" ",c("\u25CB")," ",m(f));return e.writeln("",c(`Parent spec "${s}" cancelled.`)),await e.close(),w(void 0)}let l=[];for(let i of o){let u=`${t}/${b.specDir(i.name)}`;await D.fs.mkdir(u,{recursive:!0});let f=z(T(),i.name,`spec/${i.name}`);for(let P of a.discovery.answers)f=N(f,P.questionId,P.answer);f=F(f),await C(t,i.name,f),l.push(i.name)}let r=L(a,"cancelled",`Split into: ${l.join(", ")}`);await C(t,s,r),e.writeln(x("Split complete."),` Created ${l.length} sub-specs:`);for(let i of l)e.writeln(" ",c("\u25CB")," ",m(i));return e.writeln("",c(`Parent spec "${s}" cancelled.`)),await e.close(),w(void 0)},pe=async n=>{let e=$({renderer:y.ansi(),sink:v.stdout()}),{root:t}=await R();if(!await j(t))return e.writeln(p("noskills is not initialized.")," Run: ",m(I("init"))),await e.close(),d({exitCode:1});let s=M(n??[]);if(s===null)return e.writeln(p("Error: --spec=<name> is required.")),e.writeln(c("Example: "),m(`${S()} spec revisit --spec=my-spec "reason for revisit"`)),await e.close(),d({exitCode:1});let a=(n??[]).find(i=>!i.startsWith("--")&&i!==s);if(a===void 0||a.trim().length===0)return e.writeln(p('Error: Reason is required: noskills spec revisit --spec=X "reason"')),await e.close(),d({exitCode:1});let o;try{o=await E(t,s)}catch(i){let u=i instanceof Error?i.message:String(i);return e.writeln(p(`Error: ${u}`)),await e.close(),d({exitCode:1})}if(o.phase==="DISCOVERY"||o.phase==="DISCOVERY_REVIEW"||o.phase==="SPEC_DRAFT"||o.phase==="SPEC_APPROVED")return e.writeln(p("Already in planning phase, no need to revisit.")),await e.close(),d({exitCode:1});if(o.phase==="COMPLETED")return e.writeln(p(`Spec is completed. Use \`${S()} reopen --spec=${s}\` instead.`)),await e.close(),d({exitCode:1});if(o.phase==="IDLE")return e.writeln(p("No active spec to revisit.")),await e.close(),d({exitCode:1});let l=o.execution.completedTasks.length,r=H(o,a.trim());return await C(t,s,r),e.writeln(x("Revisit complete.")),e.writeln(" Phase: ",m("DISCOVERY"),c(` (revisited from ${o.phase})`)),l>0&&e.writeln(" Previous progress: ",m(`${l} tasks completed`)),e.writeln(" Reason: ",c(`"${a.trim()}"`)),e.writeln(" Discovery answers preserved \u2014 revise or re-approve."),await e.close(),w(void 0)},de=async(n,e)=>{let t=$({renderer:y.ansi(),sink:v.stdout()}),{root:s}=await R(),a=e?.[0];if(n===void 0||a===void 0)return t.writeln(`Usage: ${S()} spec <name> ac <add "text" | list>`),await t.close(),w(void 0);if(a==="add"){let o=(e?.slice(1)??[]).filter(u=>!u.startsWith("-")).join(" ");if(o.length===0)return t.writeln(p("Please provide AC text.")),await t.close(),d({exitCode:1});let l=await E(s,n),r=await U(s);l.phase==="EXECUTING"&&t.writeln(O("Warning: Adding ACs during execution is scope creep."));let i=Q(l,o,r);return await C(s,n,i),t.writeln(x("AC added: "),`"${o}"`,c(` (by ${W(r)})`)),await t.close(),w(void 0)}if(a==="list"){let l=(await E(s,n)).customACs??[];if(t.writeln(m(`Custom ACs for ${n}`)),t.writeln(""),l.length===0)t.writeln(c(" No custom ACs."));else for(let r of l)t.writeln(` - ${r.text}`,c(` -- ${r.user}, ${r.addedInPhase}`));return await t.close(),w(void 0)}return t.writeln(`Usage: ${S()} spec <name> ac <add "text" | list>`),await t.close(),w(void 0)},ue=async(n,e)=>{let t=$({renderer:y.ansi(),sink:v.stdout()}),{root:s}=await R(),a=e?.[0];if(n===void 0||a===void 0)return t.writeln(`Usage: ${S()} spec <name> task <add "text" | list>`),await t.close(),w(void 0);if(a==="add"){let o=(e?.slice(1)??[]).filter(u=>!u.startsWith("-")).join(" ");if(o.length===0)return t.writeln(p("Please provide task text.")),await t.close(),d({exitCode:1});let l=await E(s,n);if(l.phase==="EXECUTING"||l.phase==="BLOCKED")return t.writeln(p("Cannot add tasks during execution. Use `spec revisit` to go back to discovery.")),await t.close(),d({exitCode:1});let r=await U(s),i=_(l,`[TASK] ${o}`,r);return await C(s,n,i),t.writeln(x("Task added: "),`"${o}"`,c(` (by ${W(r)})`)),await t.close(),w(void 0)}if(a==="list"){let l=((await E(s,n)).specNotes??[]).filter(r=>r.text.startsWith("[TASK] "));if(t.writeln(m(`Custom tasks for ${n}`)),t.writeln(""),l.length===0)t.writeln(c(" No custom tasks."));else for(let r of l)t.writeln(` - ${r.text.replace("[TASK] ","")}`,c(` -- ${r.user}, ${r.phase}`));return await t.close(),w(void 0)}return t.writeln(`Usage: ${S()} spec <name> task <add "text" | list>`),await t.close(),w(void 0)},we=async(n,e)=>{let t=$({renderer:y.ansi(),sink:v.stdout()}),{root:s}=await R(),a=e?.[0];if(n===void 0||a===void 0)return t.writeln(`Usage: ${S()} spec <name> note <add "text" | list>`),await t.close(),w(void 0);if(a==="add"){let o=(e?.slice(1)??[]).filter(u=>!u.startsWith("-")).join(" ");if(o.length===0)return t.writeln(p("Please provide note text.")),await t.close(),d({exitCode:1});let l=await E(s,n),r=await U(s),i=_(l,o,r);return await C(s,n,i),t.writeln(x("Note added: "),`"${o}"`,c(` (by ${W(r)})`)),await t.close(),w(void 0)}if(a==="list"){let l=((await E(s,n)).specNotes??[]).filter(r=>!r.text.startsWith("[TASK] "));if(t.writeln(m(`Notes for ${n}`)),t.writeln(""),l.length===0)t.writeln(c(" No notes."));else for(let r of l)t.writeln(` - ${r.text}`,c(` -- ${r.user}, ${r.phase}`));return await t.close(),w(void 0)}return t.writeln(`Usage: ${S()} spec <name> note <add "text" | list>`),await t.close(),w(void 0)};export{ee as RESERVED_NAMES,ie as looksLikeDescription,De as main,ne as slugFromDescription};
@@ -0,0 +1 @@
1
+ import{a as R}from"./chunk-RGGYSKJY.js";import{b as O,e as S}from"./chunk-6YHWLEJ4.js";import"./chunk-PKYW3S5P.js";import"./chunk-7UX6WIXX.js";import{a as k,d as w}from"./chunk-LBPD4EIH.js";import{a as f}from"./chunk-OVLGUKPG.js";import"./chunk-DEIZVYT6.js";import{B as v,C as P,f as I,g as b,m as x,q as D}from"./chunk-5URW6X3N.js";import{c as h}from"./chunk-UT6ZCLRA.js";import{c as i,d as r,f as c,g as C,h as p,k as y,o as d,q as u,r as m}from"./chunk-2GF5IUQD.js";import{a as l,b as E}from"./chunk-2N4GTHXQ.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var M=async g=>{let{root:n}=await P(),o=k(g);if(!await v(n)){if(o==="json")await w({error:"noskills is not initialized"},o);else{let s=d({renderer:m.ansi(),sink:u.stdout()});s.writeln(c("noskills is not initialized.")," Run: ",i(h("init"))),await s.close()}return E({exitCode:1})}let V=b(g),e=await I(n,V),t=await x(n),j={phase:e.phase,spec:e.spec,branch:e.branch,discovery:e.phase==="DISCOVERY"||e.phase==="DISCOVERY_REVIEW"?{answered:e.discovery.answers.length,total:f.length}:void 0,execution:e.phase==="EXECUTING"||e.phase==="BLOCKED"?{iteration:e.execution.iteration,lastProgress:e.execution.lastProgress,debt:e.execution.debt?.items.length??0,verificationPassed:e.execution.lastVerification?.passed??null}:void 0,concerns:t?.concerns??[],tools:t?.tools??[],decisions:e.decisions.length};if(o==="json"){let a=(await D(n)).filter(N=>t!==null&&t.concerns.includes(N.id)),T=await O(n),$=S(t?.tools??[]),F=await R(e,a,T,t,void 0,void 0,void 0,$);return await w({...j,...F},"json"),l(void 0)}{let s=d({renderer:m.ansi(),sink:u.stdout()});s.writeln(i(`${h("status")}`)),s.writeln("");let a=e.phase==="COMPLETED"?C(e.phase):e.phase==="BLOCKED"?c(e.phase):e.phase==="EXECUTING"?y(e.phase):p(e.phase);s.writeln(" Phase: ",a),e.spec!==null&&s.writeln(" Spec: ",i(e.spec)),e.branch!==null&&s.writeln(" Branch: ",e.branch),(e.phase==="DISCOVERY"||e.phase==="DISCOVERY_REVIEW")&&s.writeln(` Discovery: ${e.discovery.answers.length}/${f.length} questions answered`),e.phase==="EXECUTING"&&(s.writeln(` Iteration: ${e.execution.iteration}`),e.execution.lastProgress!==null&&s.writeln(" Progress: ",r(e.execution.lastProgress)),e.execution.debt!==null&&s.writeln(p(` Debt: ${e.execution.debt.items.length} items`))),t!==null&&(s.writeln(""),t.concerns.length>0&&s.writeln(" Concerns: ",r(t.concerns.join(", "))),t.tools.length>0&&s.writeln(" Tools: ",r(t.tools.join(", ")))),e.decisions.length>0&&(s.writeln(""),s.writeln(` Decisions: ${e.decisions.length}`)),await s.close()}return l(void 0)};export{M as main};
@@ -0,0 +1 @@
1
+ import{d as t,o as i,q as r,r as n}from"./chunk-2GF5IUQD.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var l=async e=>{let s=i({renderer:n.ansi(),sink:r.stdout()});return s.writeln(t("`sync` has been merged into `init`. Running `noskills init`...")),s.writeln(""),await s.close(),await(await import("./init-HTCNOWTZ.js")).main(e)};export{l as main};
@@ -1,8 +1,8 @@
1
- import{a as v,c as L}from"./chunk-JCIANZPY.js";import{a as I,c as O}from"./chunk-RTD42HPS.js";import{A as D,e as S,k as x,l as P}from"./chunk-AQWB2PVR.js";import{a as y,b as C}from"./chunk-2N4GTHXQ.js";import{b as f}from"./chunk-RMCTOOQL.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var M=async e=>{let t=await S(e),d=await P(e),l=await A(e),s=null,c=null,u=0,a=0;if(t.spec!==null){let n=await I(e,t.spec);if(n!==null){u=n.tasks.length,a=t.execution.completedTasks.length;let g=O(n.tasks,t.execution.completedTasks);g!==null&&(s=g.id,c=g.title)}}let p=null;t.lastCalledAt!==null&&(p=Math.floor((Date.now()-new Date(t.lastCalledAt).getTime())/1e3));let r=(await x(e)).map(n=>({name:n.name,phase:n.state.phase,iteration:n.state.execution.iteration}));return{spec:t.spec,phase:t.phase,iteration:t.execution.iteration,activeTaskId:s,activeTaskTitle:c,totalTasks:u,completedTaskCount:a,lastProgress:t.execution.lastProgress,lastCalledAt:t.lastCalledAt,modifiedFiles:t.execution.modifiedFiles,debt:t.execution.debt,concerns:d?.concerns??[],maxIterations:d?.maxIterationsBeforeRestart??15,awaitingStatusReport:t.execution.awaitingStatusReport,verificationPassed:t.execution.lastVerification?.passed??null,decisionsCount:t.decisions.length,discoveryAnswered:t.discovery.answers.length,discoveryTotal:6,trackedFiles:l,timeSinceUpdate:p,allSpecs:r}},A=async e=>{let t=`${e}/.eser/.state/files-changed.jsonl`;try{let l=(await f.fs.readTextFile(t)).trim().split(`
2
- `).filter(Boolean),s=[];for(let c of l)try{let u=JSON.parse(c);s.includes(u.file)||s.push(u.file)}catch{}return s}catch{return[]}},W="\x1B[2J\x1B[H",E="\x1B[1m",m="\x1B[2m",o="\x1B[0m",k="\x1B[32m",T="\x1B[33m",w="\x1B[31m",R="\x1B[36m",b=e=>{switch(e){case"COMPLETED":return k;case"BLOCKED":return w;case"EXECUTING":return R;default:return T}},F=(e,t,d)=>{if(t===0)return"\u2591".repeat(d);let l=Math.min(e/t,1),s=Math.round(l*d);return"\u2588".repeat(s)+"\u2591".repeat(d-s)},N=e=>e===null?"never":e<60?`${e}s ago`:e<3600?`${Math.floor(e/60)}m ago`:`${Math.floor(e/3600)}h ago`,B=e=>e.replace(/\x1b\[[0-9;]*m/g,""),U=(e,t)=>{let d=B(e).length;return e+" ".repeat(Math.max(0,t-d))},j=e=>{let t=[],l="\u2500".repeat(54),s=a=>`${m}\u2502${o} ${U(a,52)}${m}\u2502${o}`,c=()=>`${m}\u2502${"".padEnd(54)}\u2502${o}`;if(t.push(`${m}\u256D${l}\u256E${o}`),t.push(s(`${E}noskills watch${o}`)),t.push(c()),t.push(s(`${E}Specs:${o}`)),e.allSpecs.length>0)for(let a of e.allSpecs){let p=b(a.phase),i=a.name.slice(0,18).padEnd(18),r=`${p}${a.phase}${o}`.padEnd(a.phase.length+10);if(a.phase==="EXECUTING"||a.phase==="BLOCKED"){let n=F(e.completedTaskCount,e.totalTasks,10),g=e.totalTasks>0?Math.round(e.completedTaskCount/e.totalTasks*100):0;t.push(s(` ${i} ${r} ${n} ${e.completedTaskCount}/${e.totalTasks} (${g}%)`))}else a.phase==="COMPLETED"?t.push(s(` ${i} ${r} done`)):t.push(s(` ${i} ${r}`))}else if(e.spec!==null){let a=b(e.phase);t.push(s(` ${e.spec} ${a}${e.phase}${o}`))}else t.push(s(` ${m}No specs yet${o}`));if(t.push(c()),e.phase==="DISCOVERY"||e.phase==="DISCOVERY_REVIEW")t.push(s(`Phase: ${b(e.phase)}${e.phase}${o} Discovery: ${e.discoveryAnswered}/${e.discoveryTotal} questions answered`));else if(e.phase==="SPEC_DRAFT")t.push(s(`Phase: ${T}${e.phase}${o} ${T}Awaiting approval${o}`));else if(e.phase==="SPEC_APPROVED")t.push(s(`Phase: ${T}${e.phase}${o} ${k}Ready to start${o}`));else if(e.phase==="EXECUTING"||e.phase==="BLOCKED"){if(e.spec!==null&&t.push(s(`${E}${e.spec}${o} (iteration ${e.iteration}):`)),e.activeTaskId!==null){let i=`${e.activeTaskId}${e.activeTaskTitle!==null?` (${e.activeTaskTitle})`:""}`;t.push(s(` Active task: ${R}${i.slice(0,36)}${o}`))}let a=F(e.completedTaskCount,e.totalTasks,12),p=e.totalTasks>0?Math.round(e.completedTaskCount/e.totalTasks*100):0;if(t.push(s(` Progress: ${k}${a} ${e.completedTaskCount}/${e.totalTasks} tasks (${p}%)${o}`)),t.push(s(` Iteration: ${e.iteration}`)),t.push(s(` Last update: ${N(e.timeSinceUpdate)}`)),e.lastProgress!==null&&t.push(s(` ${m}${e.lastProgress.slice(0,50)}${o}`)),e.phase==="BLOCKED"){let i=(e.lastProgress??"unknown").replace(/^BLOCKED:\s*/,"");t.push(s(` ${w}BLOCKED: ${i.slice(0,40)}${o}`)),t.push(s(` ${T}Human input needed${o}`))}if(e.awaitingStatusReport&&t.push(s(` ${T}Status report pending${o}`)),e.verificationPassed===!1&&t.push(s(` ${w}Verification failed${o}`)),t.push(c()),e.debt!==null&&e.debt.items.length>0){t.push(s(` Debt: ${e.debt.items.length} item(s)`));for(let i of e.debt.items.slice(0,3))t.push(s(` \u2514\u2500 ${i.text.slice(0,44)}`));e.debt.items.length>3&&t.push(s(` \u2514\u2500 ... and ${e.debt.items.length-3} more`))}if(e.trackedFiles.length>0||e.modifiedFiles.length>0){let i=e.trackedFiles.length>0?e.trackedFiles:e.modifiedFiles;t.push(s(` Files changed: ${i.length}`));for(let r of i.slice(0,5)){let n=r.length>44?"..."+r.slice(-41):r;t.push(s(` \u2514\u2500 ${n}`))}i.length>5&&t.push(s(` \u2514\u2500 ... and ${i.length-5} more`))}}else e.phase==="COMPLETED"?t.push(s(`${k}Complete!${o} ${e.iteration} iterations, ${e.decisionsCount} decisions`)):e.phase==="IDLE"&&t.push(s(`${m}No active spec \u2014 work freely${o}`));t.push(c()),e.concerns.length>0&&t.push(s(`Concerns: ${e.concerns.join(", ").slice(0,40)}`));let u=e.iteration>=e.maxIterations?`${w}RESTART RECOMMENDED${o}`:`${k}ok${o} (${e.iteration}/${e.maxIterations})`;return t.push(s(`Context: ${u}`)),t.push(`${m}\u2570${l}\u256F${o}`),t.push(` ${m}watching .eser/.state/ ... ctrl+c to stop${o}`),t.join(`
3
- `)},K=e=>JSON.stringify({ts:new Date().toISOString(),phase:e.phase,spec:e.spec,iteration:e.iteration,activeTask:e.activeTaskId,tasks:{completed:e.completedTaskCount,total:e.totalTasks},progress:e.lastProgress,debt:e.debt?.items.length??0,filesChanged:e.trackedFiles.length>0?e.trackedFiles:e.modifiedFiles,timeSinceUpdate:e.timeSinceUpdate,verificationPassed:e.verificationPassed}),X=async e=>{let t=f.process.cwd(),l=e!==void 0&&e.some(r=>r==="-o"||r.startsWith("--output"))?v(e):"ansi";if(!await D(t)){let r=new TextEncoder,n=f.process.stdout.getWriter();return await n.write(r.encode(`noskills not initialized.
4
- `)),n.releaseLock(),C({exitCode:1})}let s=`${t}/.eser/.state`,c="",u=async()=>{let r=await M(t),n=l==="json"?K(r):l==="markdown"?L(r,"markdown"):j(r);if(l==="json"){let h=new TextEncoder,$=f.process.stdout.getWriter();await $.write(h.encode(n+`
5
- `)),$.releaseLock()}else if(l==="markdown"){let h=new TextEncoder,$=f.process.stdout.getWriter();await $.write(h.encode(n+`
1
+ import{a as L,c as I}from"./chunk-LBPD4EIH.js";import{a as O,c as F}from"./chunk-RJX4ZXQ4.js";import{B as D,C as v,e as S,l as x,m as P}from"./chunk-5URW6X3N.js";import{a as y,b as C}from"./chunk-2N4GTHXQ.js";import{i as g}from"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var A=async e=>{let t=await S(e),d=await P(e),l=await W(e),s=null,c=null,u=0,a=0;if(t.spec!==null){let n=await O(e,t.spec);if(n!==null){u=n.tasks.length,a=t.execution.completedTasks.length;let f=F(n.tasks,t.execution.completedTasks);f!==null&&(s=f.id,c=f.title)}}let p=null;t.lastCalledAt!==null&&(p=Math.floor((Date.now()-new Date(t.lastCalledAt).getTime())/1e3));let r=(await x(e)).map(n=>({name:n.name,phase:n.state.phase,iteration:n.state.execution.iteration}));return{spec:t.spec,phase:t.phase,iteration:t.execution.iteration,activeTaskId:s,activeTaskTitle:c,totalTasks:u,completedTaskCount:a,lastProgress:t.execution.lastProgress,lastCalledAt:t.lastCalledAt,modifiedFiles:t.execution.modifiedFiles,debt:t.execution.debt,concerns:d?.concerns??[],maxIterations:d?.maxIterationsBeforeRestart??15,awaitingStatusReport:t.execution.awaitingStatusReport,verificationPassed:t.execution.lastVerification?.passed??null,decisionsCount:t.decisions.length,discoveryAnswered:t.discovery.answers.length,discoveryTotal:6,trackedFiles:l,timeSinceUpdate:p,allSpecs:r}},W=async e=>{let t=`${e}/.eser/.state/files-changed.jsonl`;try{let l=(await g.fs.readTextFile(t)).trim().split(`
2
+ `).filter(Boolean),s=[];for(let c of l)try{let u=JSON.parse(c);s.includes(u.file)||s.push(u.file)}catch{}return s}catch{return[]}},N="\x1B[2J\x1B[H",E="\x1B[1m",m="\x1B[2m",o="\x1B[0m",k="\x1B[32m",T="\x1B[33m",w="\x1B[31m",M="\x1B[36m",b=e=>{switch(e){case"COMPLETED":return k;case"BLOCKED":return w;case"EXECUTING":return M;default:return T}},R=(e,t,d)=>{if(t===0)return"\u2591".repeat(d);let l=Math.min(e/t,1),s=Math.round(l*d);return"\u2588".repeat(s)+"\u2591".repeat(d-s)},B=e=>e===null?"never":e<60?`${e}s ago`:e<3600?`${Math.floor(e/60)}m ago`:`${Math.floor(e/3600)}h ago`,U=e=>e.replace(/\x1b\[[0-9;]*m/g,""),j=(e,t)=>{let d=U(e).length;return e+" ".repeat(Math.max(0,t-d))},K=e=>{let t=[],l="\u2500".repeat(54),s=a=>`${m}\u2502${o} ${j(a,52)}${m}\u2502${o}`,c=()=>`${m}\u2502${"".padEnd(54)}\u2502${o}`;if(t.push(`${m}\u256D${l}\u256E${o}`),t.push(s(`${E}noskills watch${o}`)),t.push(c()),t.push(s(`${E}Specs:${o}`)),e.allSpecs.length>0)for(let a of e.allSpecs){let p=b(a.phase),i=a.name.slice(0,18).padEnd(18),r=`${p}${a.phase}${o}`.padEnd(a.phase.length+10);if(a.phase==="EXECUTING"||a.phase==="BLOCKED"){let n=R(e.completedTaskCount,e.totalTasks,10),f=e.totalTasks>0?Math.round(e.completedTaskCount/e.totalTasks*100):0;t.push(s(` ${i} ${r} ${n} ${e.completedTaskCount}/${e.totalTasks} (${f}%)`))}else a.phase==="COMPLETED"?t.push(s(` ${i} ${r} done`)):t.push(s(` ${i} ${r}`))}else if(e.spec!==null){let a=b(e.phase);t.push(s(` ${e.spec} ${a}${e.phase}${o}`))}else t.push(s(` ${m}No specs yet${o}`));if(t.push(c()),e.phase==="DISCOVERY"||e.phase==="DISCOVERY_REVIEW")t.push(s(`Phase: ${b(e.phase)}${e.phase}${o} Discovery: ${e.discoveryAnswered}/${e.discoveryTotal} questions answered`));else if(e.phase==="SPEC_DRAFT")t.push(s(`Phase: ${T}${e.phase}${o} ${T}Awaiting approval${o}`));else if(e.phase==="SPEC_APPROVED")t.push(s(`Phase: ${T}${e.phase}${o} ${k}Ready to start${o}`));else if(e.phase==="EXECUTING"||e.phase==="BLOCKED"){if(e.spec!==null&&t.push(s(`${E}${e.spec}${o} (iteration ${e.iteration}):`)),e.activeTaskId!==null){let i=`${e.activeTaskId}${e.activeTaskTitle!==null?` (${e.activeTaskTitle})`:""}`;t.push(s(` Active task: ${M}${i.slice(0,36)}${o}`))}let a=R(e.completedTaskCount,e.totalTasks,12),p=e.totalTasks>0?Math.round(e.completedTaskCount/e.totalTasks*100):0;if(t.push(s(` Progress: ${k}${a} ${e.completedTaskCount}/${e.totalTasks} tasks (${p}%)${o}`)),t.push(s(` Iteration: ${e.iteration}`)),t.push(s(` Last update: ${B(e.timeSinceUpdate)}`)),e.lastProgress!==null&&t.push(s(` ${m}${e.lastProgress.slice(0,50)}${o}`)),e.phase==="BLOCKED"){let i=(e.lastProgress??"unknown").replace(/^BLOCKED:\s*/,"");t.push(s(` ${w}BLOCKED: ${i.slice(0,40)}${o}`)),t.push(s(` ${T}Human input needed${o}`))}if(e.awaitingStatusReport&&t.push(s(` ${T}Status report pending${o}`)),e.verificationPassed===!1&&t.push(s(` ${w}Verification failed${o}`)),t.push(c()),e.debt!==null&&e.debt.items.length>0){t.push(s(` Debt: ${e.debt.items.length} item(s)`));for(let i of e.debt.items.slice(0,3))t.push(s(` \u2514\u2500 ${i.text.slice(0,44)}`));e.debt.items.length>3&&t.push(s(` \u2514\u2500 ... and ${e.debt.items.length-3} more`))}if(e.trackedFiles.length>0||e.modifiedFiles.length>0){let i=e.trackedFiles.length>0?e.trackedFiles:e.modifiedFiles;t.push(s(` Files changed: ${i.length}`));for(let r of i.slice(0,5)){let n=r.length>44?"..."+r.slice(-41):r;t.push(s(` \u2514\u2500 ${n}`))}i.length>5&&t.push(s(` \u2514\u2500 ... and ${i.length-5} more`))}}else e.phase==="COMPLETED"?t.push(s(`${k}Complete!${o} ${e.iteration} iterations, ${e.decisionsCount} decisions`)):e.phase==="IDLE"&&t.push(s(`${m}No active spec \u2014 work freely${o}`));t.push(c()),e.concerns.length>0&&t.push(s(`Concerns: ${e.concerns.join(", ").slice(0,40)}`));let u=e.iteration>=e.maxIterations?`${w}RESTART RECOMMENDED${o}`:`${k}ok${o} (${e.iteration}/${e.maxIterations})`;return t.push(s(`Context: ${u}`)),t.push(`${m}\u2570${l}\u256F${o}`),t.push(` ${m}watching .eser/.state/ ... ctrl+c to stop${o}`),t.join(`
3
+ `)},V=e=>JSON.stringify({ts:new Date().toISOString(),phase:e.phase,spec:e.spec,iteration:e.iteration,activeTask:e.activeTaskId,tasks:{completed:e.completedTaskCount,total:e.totalTasks},progress:e.lastProgress,debt:e.debt?.items.length??0,filesChanged:e.trackedFiles.length>0?e.trackedFiles:e.modifiedFiles,timeSinceUpdate:e.timeSinceUpdate,verificationPassed:e.verificationPassed}),z=async e=>{let{root:t}=await v(),l=e!==void 0&&e.some(r=>r==="-o"||r.startsWith("--output"))?L(e):"ansi";if(!await D(t)){let r=new TextEncoder,n=g.process.stdout.getWriter();return await n.write(r.encode(`noskills not initialized.
4
+ `)),n.releaseLock(),C({exitCode:1})}let s=`${t}/.eser/.state`,c="",u=async()=>{let r=await A(t),n=l==="json"?V(r):l==="markdown"?I(r,"markdown"):K(r);if(l==="json"){let h=new TextEncoder,$=g.process.stdout.getWriter();await $.write(h.encode(n+`
5
+ `)),$.releaseLock()}else if(l==="markdown"){let h=new TextEncoder,$=g.process.stdout.getWriter();await $.write(h.encode(n+`
6
6
  ---
7
- `)),$.releaseLock()}else if(n!==c){let h=new TextEncoder,$=f.process.stdout.getWriter();await $.write(h.encode(W+n+`
8
- `)),$.releaseLock(),c=n}return r.allSpecs.length>0&&r.allSpecs.every(h=>h.phase==="COMPLETED")||r.allSpecs.length===0&&r.phase==="COMPLETED"};if(await u())return y(void 0);let p=1e3,i=0;for(;;){await new Promise(r=>setTimeout(r,p));try{let n=(await f.fs.stat(`${s}/state.json`)).mtime?.getTime()??0;if(n>i&&(i=n,await new Promise(h=>setTimeout(h,200)),await u()))break}catch{}}return y(void 0)};export{M as buildSnapshot,X as main,K as renderJsonLine,j as renderTerminal};
7
+ `)),$.releaseLock()}else if(n!==c){let h=new TextEncoder,$=g.process.stdout.getWriter();await $.write(h.encode(N+n+`
8
+ `)),$.releaseLock(),c=n}return r.allSpecs.length>0&&r.allSpecs.every(h=>h.phase==="COMPLETED")||r.allSpecs.length===0&&r.phase==="COMPLETED"};if(await u())return y(void 0);let p=1e3,i=0;for(;;){await new Promise(r=>setTimeout(r,p));try{let n=(await g.fs.stat(`${s}/state.json`)).mtime?.getTime()??0;if(n>i&&(i=n,await new Promise(h=>setTimeout(h,200)),await u()))break}catch{}}return y(void 0)};export{A as buildSnapshot,z as main,V as renderJsonLine,K as renderTerminal};
@@ -0,0 +1 @@
1
+ import{B as l,C as a}from"./chunk-5URW6X3N.js";import{a as n,b as s}from"./chunk-2N4GTHXQ.js";import"./chunk-XNGHRJVK.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var m=async p=>{let{root:t}=await a();if(!await l(t))return console.error("noskills is not initialized. Run: noskills init"),s({exitCode:1});let r=3e3,o=!1;for(let e of p??[])e.startsWith("--port=")&&(r=parseInt(e.slice(7),10)),e==="--open"&&(o=!0);let c="@eser/noskills-web",i;try{i=(await import(c)).startServer}catch{return console.error("@eser/noskills-web is not installed. Run: deno install"),s({exitCode:1})}return await i({root:t,port:r,open:o}),n(void 0)};export{m as main};
@@ -0,0 +1 @@
1
+ import{a as P}from"./chunk-H77MLIL5.js";import{a as T,d as L}from"./chunk-KYQ77E7T.js";import{h as I}from"./chunk-HNAHPI6V.js";import{C as A,p as v,s as D}from"./chunk-OKM4FE4G.js";import{C,d as g,f as x,h as E,i as k,k as y}from"./chunk-5URW6X3N.js";import{d as f,f as n,g as u,o as w,q as h,r as S}from"./chunk-2GF5IUQD.js";import{a as m,b as i}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 z=async c=>{let e=w({renderer:S.ansi(),sink:h.stdout()}),{root:r}=await C(),p=E(c);if(!p.ok)return e.writeln(n(p.error)),await e.close(),i({exitCode:1});let o=(c??[]).filter(a=>!a.startsWith("--spec=")).join(" ");if(o.length===0)return e.writeln(n('A reason is required: noskills wontfix "reason text"')),await e.close(),i({exitCode:1});let t;try{t=await x(r,p.spec)}catch(a){let $=a instanceof Error?a.message:String(a);return e.writeln(n($)),await e.close(),i({exitCode:1})}if(t.phase==="IDLE"||t.phase==="UNINITIALIZED"||t.phase==="COMPLETED")return e.writeln(n(`Cannot mark as won't fix in phase: ${t.phase}`)),await e.close(),i({exitCode:1});if(t.spec!==null){let a=`${r}/${g.specDir(t.spec)}`;try{await d.fs.stat(a)}catch{return e.writeln(n(`Active spec '${t.spec}' directory not found.`)),e.writeln(f("Run `noskills reset` to return to idle.")),await e.close(),i({exitCode:1})}}let l=await I(r),s=v(t,"wontfix",o);s=D(s,t.phase,"COMPLETED",l,o),s.spec!==null&&await y(r,s.spec,s);let U=A(s);return await k(r,U),s.spec!==null&&(await T(r,s.spec,"wontfix"),await L(r,s.spec,"wontfix")),await P(r,{ts:new Date().toISOString(),type:"phase-change",spec:t.spec??"unknown",user:l.name,from:t.phase,to:"COMPLETED",reason:"wontfix"}),e.writeln(u("\u2714"),` Spec marked as won't fix: ${o}`),await e.close(),m(void 0)};export{z as main};
package/noskills.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{a as t}from"./chunks/chunk-CLCZ7IO3.js";import{c as o}from"./chunks/chunk-2N4GTHXQ.js";import{b as s}from"./chunks/chunk-RMCTOOQL.js";import"./chunks/chunk-CKETVOVQ.js";import"./chunks/chunk-YSLRAWBK.js";import"./chunks/chunk-OTRBRRIO.js";var i=new t({description:"noskills \u2014 state-machine orchestrator for AI agents",modules:{init:{description:"Initialize noskills in project",load:()=>import("./chunks/init-A3VTACZC.js")},status:{description:"Show current state",load:()=>import("./chunks/status-YALP7W5Y.js")},spec:{description:"Manage specs (new, list)",load:()=>import("./chunks/spec-LVJCLNRO.js")},next:{description:"Get next instruction for agent",load:()=>import("./chunks/next-GSQE7GYI.js")},approve:{description:"Approve phase transition",load:()=>import("./chunks/approve-LYDFDSXE.js")},block:{description:"Mark spec as blocked",load:()=>import("./chunks/block-4IUG6QYT.js")},reset:{description:"Reset current spec state",load:()=>import("./chunks/reset-WRG3L4QP.js")},done:{description:"Mark spec execution as complete",load:()=>import("./chunks/done-TLRZYAUZ.js")},free:{description:"Show idle mode info (noskills starts permissive by default)",load:()=>import("./chunks/free-5HORD4VB.js")},cancel:{description:"Cancel current spec",load:()=>import("./chunks/cancel-STVRTPSC.js")},wontfix:{description:"Mark spec as won't fix (requires reason)",load:()=>import("./chunks/wontfix-4L3IAWLG.js")},reopen:{description:"Reopen a completed spec for revision",load:()=>import("./chunks/reopen-G7ZMJSB7.js")},concern:{description:"Manage concerns (add, remove, list)",load:()=>import("./chunks/concern-NQODAEHU.js")},run:{description:"Autonomous execution loop (Ralph loop)",load:()=>import("./chunks/run-CC6MLCNO.js")},watch:{description:"Live dashboard for monitoring agent progress",load:()=>import("./chunks/watch-ELIW23EO.js")},sync:{description:"Regenerate tool-specific files",load:()=>import("./chunks/sync-L7E5Y3OG.js")},purge:{description:"Remove all noskills content (specs, rules, concerns, hooks)",load:()=>import("./chunks/purge-573OIQZI.js")},"invoke-hook":{description:"Internal hook handlers (called by agents)",load:()=>import("./chunks/invoke-hook-Y2YREMYB.js")},rule:{description:"Manage rules (add, list, promote)",load:()=>import("./chunks/rule-HMBAP5LJ.js")},config:{description:"Manage configuration (set-user, get-user, clear-user)",load:()=>import("./chunks/config-EPT7NOOO.js")},pack:{description:"Manage packs (list, install, uninstall, inspect, search)",load:()=>import("./chunks/pack-KWRZVNBH.js")},session:{description:"Manage sessions for multi-instance support",load:()=>import("./chunks/session-TYOM74BQ.js")},manager:{description:"Multi-spec TUI with tab management",load:()=>import("./chunks/manager-5AJ7QWMG.js")},mgr:{description:"Alias for manager",load:()=>import("./chunks/manager-5AJ7QWMG.js")}}});var r={name:"@eser/noskills",version:"4.1.50",type:"module",exports:{".":"./main.ts","./mod":"./mod.ts","./module":"./module.ts"},dependencies:{"@eser/ai":"workspace:*","@eser/primitives":"workspace:*","@eser/shell":"workspace:*","@eser/standards":"workspace:*","@eser/streams":"workspace:*",yaml:"^2"},devDependencies:{"@std/assert":"npm:@jsr/std__assert@^1.0.16","@std/testing":"npm:@jsr/std__testing@^1.0.16"}};var p=i.toCommand("noskills",r.version),d=async()=>await p.parse();if(import.meta.main){let n=await d();o(n,{ok:()=>{},fail:e=>{e.message!==void 0&&console.error(e.message),s.process.setExitCode(e.exitCode)}})}export{d as main};
2
+ import{a as t}from"./chunks/chunk-YSSDQJTT.js";import{c as o}from"./chunks/chunk-2N4GTHXQ.js";import{i as s}from"./chunks/chunk-XNGHRJVK.js";import"./chunks/chunk-CKETVOVQ.js";import"./chunks/chunk-YSLRAWBK.js";import"./chunks/chunk-OTRBRRIO.js";var i=new t({description:"noskills \u2014 state-machine orchestrator for AI agents",modules:{init:{description:"Initialize noskills in project",load:()=>import("./chunks/init-HTCNOWTZ.js")},status:{description:"Show current state",load:()=>import("./chunks/status-5JHFFTMD.js")},spec:{description:"Manage specs (new, list)",load:()=>import("./chunks/spec-3PAUTPIT.js")},next:{description:"Get next instruction for agent",load:()=>import("./chunks/next-7W4YVHSZ.js")},approve:{description:"Approve phase transition",load:()=>import("./chunks/approve-ZX62EG5U.js")},block:{description:"Mark spec as blocked",load:()=>import("./chunks/block-ERQESYMH.js")},reset:{description:"Reset current spec state",load:()=>import("./chunks/reset-BL73UVLM.js")},done:{description:"Mark spec execution as complete",load:()=>import("./chunks/done-WQDGQZ5D.js")},free:{description:"Show idle mode info (noskills starts permissive by default)",load:()=>import("./chunks/free-R4ZTZ76O.js")},cancel:{description:"Cancel current spec",load:()=>import("./chunks/cancel-FOVCYBQY.js")},wontfix:{description:"Mark spec as won't fix (requires reason)",load:()=>import("./chunks/wontfix-CJMNFDCG.js")},reopen:{description:"Reopen a completed spec for revision",load:()=>import("./chunks/reopen-VATALF56.js")},concern:{description:"Manage concerns (add, remove, list)",load:()=>import("./chunks/concern-2PON4VPG.js")},run:{description:"Autonomous execution loop (Ralph loop)",load:()=>import("./chunks/run-J5Z6R4DP.js")},watch:{description:"Live dashboard for monitoring agent progress",load:()=>import("./chunks/watch-I7Q3AEAQ.js")},web:{description:"Start web interface (browser dashboard)",load:()=>import("./chunks/web-JOWEH622.js")},sync:{description:"Regenerate tool-specific files (redirects to init)",load:()=>import("./chunks/sync-CVEZ4FMQ.js")},learn:{description:"Manage cross-session learnings (list, remove)",load:()=>import("./chunks/learn-MWUFAR2G.js")},diagrams:{description:"Diagram registry and staleness checks (scan, list, check, verify)",load:()=>import("./chunks/diagrams-D5CYTTWA.js")},purge:{description:"Remove all noskills content (specs, rules, concerns, hooks)",load:()=>import("./chunks/purge-XZ5EOCFP.js")},"invoke-hook":{description:"Internal hook handlers (called by agents)",load:()=>import("./chunks/invoke-hook-675IUCLN.js")},rule:{description:"Manage rules (add, list, promote)",load:()=>import("./chunks/rule-ODX4WMCS.js")},config:{description:"Manage configuration (set-user, get-user, clear-user)",load:()=>import("./chunks/config-CZDLCSOC.js")},pack:{description:"Manage packs (list, install, uninstall, inspect, search)",load:()=>import("./chunks/pack-DXWS4PMA.js")},session:{description:"Manage sessions for multi-instance support",load:()=>import("./chunks/session-DFMI2GCC.js")},manager:{description:"Multi-spec TUI with tab management",load:()=>import("./chunks/manager-Q7DRXNNO.js")},mgr:{description:"Alias for manager",load:()=>import("./chunks/manager-Q7DRXNNO.js")}}});var r={name:"@eser/noskills",version:"4.1.53",type:"module",exports:{".":"./main.ts","./mod":"./mod.ts","./module":"./module.ts","./dashboard":"./dashboard/mod.ts","./persistence":"./state/persistence.ts"},dependencies:{"@eser/ai":"workspace:*","@eser/primitives":"workspace:*","@eser/shell":"workspace:*","@eser/standards":"workspace:*","@eser/streams":"workspace:*",yaml:"^2"},devDependencies:{"@std/assert":"npm:@jsr/std__assert@^1.0.16","@std/testing":"npm:@jsr/std__testing@^1.0.16"}};var p=i.toCommand("noskills",r.version),d=async()=>await p.parse();if(import.meta.main){let n=await d();o(n,{ok:()=>{},fail:e=>{e.message!==void 0&&console.error(e.message),s.process.setExitCode(e.exitCode)}})}export{d as main};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noskills",
3
- "version": "4.1.50",
3
+ "version": "4.1.53",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "noskills": "./noskills.js"
@@ -1 +0,0 @@
1
- import{a as T}from"./chunk-WWPJMOT3.js";import"./chunk-RTD42HPS.js";import{a as V,d as k}from"./chunk-ESTTTPON.js";import{h}from"./chunk-TI4CLT2V.js";import{c as o}from"./chunk-2X2U2VC5.js";import{i as _,l as F,s as S}from"./chunk-JNVM2KAE.js";import{d as g,f as E,h as D,i as u,j as f,l as P,p as A}from"./chunk-AQWB2PVR.js";import{c as p,d,f as n,g as m,k as w,o as y,q as C,r as R}from"./chunk-K223KAUB.js";import{a as v,b as i}from"./chunk-2N4GTHXQ.js";import{b as l}from"./chunk-RMCTOOQL.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var J=async x=>{let s=y({renderer:R.ansi(),sink:C.stdout()}),r=l.process.cwd(),c=D(x);if(!c.ok)return s.writeln(n(c.error)),await s.close(),i({exitCode:1});let t;try{t=await E(r,c.spec)}catch(a){let e=a instanceof Error?a.message:String(a);return s.writeln(n(e)),await s.close(),i({exitCode:1})}let I=await P(r);if(t.spec!==null){let a=`${r}/${g.specDir(t.spec)}`;try{await l.fs.stat(a)}catch{return s.writeln(n(`Active spec '${t.spec}' directory not found.`)),s.writeln(d("Run `noskills reset` to return to idle.")),await s.close(),i({exitCode:1})}}if(t.phase==="SPEC_DRAFT"){if(t.classification===null&&t.spec!==null){let O=(await A(r)).filter(U=>I?.concerns.includes(U.id)??!1);try{await T(r,t,O)}catch{}}let a=await h(r),e=F(t);e=S(e,"SPEC_DRAFT","SPEC_APPROVED",a),await u(r,e),e.spec!==null&&await f(r,e.spec,e),e.spec!==null&&(await V(r,e.spec,"approved"),await k(r,e.spec,"approved")),s.writeln(m("\u2714")," Spec approved. Phase: ",w("SPEC_APPROVED")),s.writeln("When ready, run ",p(`${o('next --answer="start"')}`)," to begin execution.")}else if(t.phase==="DISCOVERY_REVIEW"){let a=await h(r),e=_(t);e=S(e,"DISCOVERY_REVIEW","SPEC_DRAFT",a),await u(r,e),e.spec!==null&&await f(r,e.spec,e),s.writeln(m("\u2714")," Discovery answers approved. Phase: ",w("SPEC_DRAFT")),s.writeln("Review the spec and run ",p(o("approve"))," again to approve.")}else t.phase==="DISCOVERY"&&t.discovery.completed?(s.writeln(d("Discovery complete. Spec draft already generated.")),s.writeln("Review the spec and run ",p(o("approve"))," again when in SPEC_DRAFT phase.")):s.writeln(n(`Cannot approve in phase: ${t.phase}`));return await s.close(),v(void 0)};export{J as main};
@@ -1 +0,0 @@
1
- import{h as $}from"./chunk-TI4CLT2V.js";import{c as E}from"./chunk-2X2U2VC5.js";import{n as v,s as A}from"./chunk-JNVM2KAE.js";import{d as y,f as k,h as C,i as S,j as x}from"./chunk-AQWB2PVR.js";import{c as u,d as p,f as a,h as f,o as w,q as h,r as g}from"./chunk-K223KAUB.js";import{a as d,b as n}from"./chunk-2N4GTHXQ.js";import{b as l}from"./chunk-RMCTOOQL.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var q=async m=>{let e=w({renderer:g.ansi(),sink:h.stdout()}),i=l.process.cwd(),o=C(m);if(!o.ok)return e.writeln(a(o.error)),await e.close(),n({exitCode:1});let c=(m??[]).filter(t=>!t.startsWith("--spec=")).join(" ")||"No reason given",s;try{s=await k(i,o.spec)}catch(t){let R=t instanceof Error?t.message:String(t);return e.writeln(a(R)),await e.close(),n({exitCode:1})}if(s.spec!==null){let t=`${i}/${y.specDir(s.spec)}`;try{await l.fs.stat(t)}catch{return e.writeln(a(`Active spec '${s.spec}' directory not found.`)),e.writeln(p("Run `noskills reset` to return to idle.")),await e.close(),n({exitCode:1})}}if(s.phase!=="EXECUTING")return e.writeln(a(`Cannot block in phase: ${s.phase}`)),await e.close(),n({exitCode:1});let b=await $(i),r=v(s,c);return r=A(r,"EXECUTING","BLOCKED",b,c),await S(i,r),r.spec!==null&&await x(i,r.spec,r),e.writeln(f("\u26A0")," Spec blocked: ",p(c)),e.writeln("Resolve with: ",u(`${E('next --answer="resolution"')}`)),await e.close(),d(void 0)};export{q as main};
@@ -1 +0,0 @@
1
- import{a as I,d as x}from"./chunk-ESTTTPON.js";import{h as D}from"./chunk-TI4CLT2V.js";import{p as C,s as E,v as k}from"./chunk-JNVM2KAE.js";import{d as w,f as h,h as S,i as g,j as y}from"./chunk-AQWB2PVR.js";import{d as l,f as n,g as m,o as d,q as u,r as f}from"./chunk-K223KAUB.js";import{a as p,b as i}from"./chunk-2N4GTHXQ.js";import{b as o}from"./chunk-RMCTOOQL.js";import"./chunk-CKETVOVQ.js";import"./chunk-YSLRAWBK.js";import"./chunk-OTRBRRIO.js";var q=async T=>{let e=d({renderer:f.ansi(),sink:u.stdout()}),r=o.process.cwd(),c=S(T);if(!c.ok)return e.writeln(n(c.error)),await e.close(),i({exitCode:1});let s;try{s=await h(r,c.spec)}catch(a){let A=a instanceof Error?a.message:String(a);return e.writeln(n(A)),await e.close(),i({exitCode:1})}if(s.phase==="IDLE"||s.phase==="UNINITIALIZED"||s.phase==="COMPLETED")return e.writeln(n(`Cannot cancel in phase: ${s.phase}`)),await e.close(),i({exitCode:1});if(s.spec!==null){let a=`${r}/${w.specDir(s.spec)}`;try{await o.fs.stat(a)}catch{return e.writeln(n(`Active spec '${s.spec}' directory not found.`)),e.writeln(l("Run `noskills reset` to return to idle.")),await e.close(),i({exitCode:1})}}let U=await D(r),t=C(s,"cancelled");t=E(t,s.phase,"COMPLETED",U,"cancelled"),t.spec!==null&&await y(r,t.spec,t);let v=k(t);return await g(r,v),t.spec!==null&&(await I(r,t.spec,"cancelled"),await x(r,t.spec,"cancelled")),e.writeln(m("\u2714")," Spec cancelled."),await e.close(),p(void 0)};export{q as main};
@@ -1 +0,0 @@
1
- import{b as u,c as Ae,d,e as U,f as R,g as x,h as E,i as Oe,k,l as _,n as V,o as he,q as re,r as se}from"./chunk-K223KAUB.js";import{b}from"./chunk-RMCTOOQL.js";import{d as D}from"./chunk-OTRBRRIO.js";var h=Symbol("tui.cancel"),Ke=e=>e===h,Ee={ctrlC:"exit",escape:"cancel"},He=()=>{try{return b.process.stdin}catch{return new ReadableStream}},Fe=e=>{let t=e?.interaction??(e?.target==="non-interactive"?"non-interactive":"interactive"),r=e?.audience??"human",s=t==="non-interactive"?"non-interactive":"interactive",n=t==="interactive";return{output:e?.output??he({renderer:n?se.ansi():se.plain(),sink:n?re.stdout():re.stderr()}),input:e?.input??He(),target:s,interaction:t,audience:r,signals:{...Ee,...e?.signals},stderr:e?.stderr??he({renderer:se.plain(),sink:re.stderr()})}};var Pe={};D(Pe,{disableMouse:()=>We,enableMouse:()=>qe,isSGRMouseSequence:()=>ye,parseMouseEvent:()=>fe});var qe=()=>"\x1B[?1000h\x1B[?1002h\x1B[?1006h",We=()=>"\x1B[?1006l\x1B[?1002l\x1B[?1000l",je=/^\x1b\[<(\d+);(\d+);(\d+)([Mm])$/,fe=e=>{let t=e.match(je);if(t===null)return null;let r=parseInt(t[1],10),s=parseInt(t[2],10)-1,n=parseInt(t[3],10)-1,i=t[4]==="m",o=r&3,a=(r&4)!==0,p=(r&16)!==0,c=(r&32)!==0;return(r&64)!==0?{type:"wheel",button:0,x:s,y:n,shift:a,ctrl:p,direction:r&1?"down":"up"}:c?{type:"mousemove",button:o,x:s,y:n,shift:a,ctrl:p}:{type:i?"mouseup":"mousedown",button:o,x:s,y:n,shift:a,ctrl:p}},ye=e=>e.length>=4&&e[0]===27&&e[1]===91&&e[2]===60;var P=async e=>{let t=!1;if(b.capabilities.stdin&&b.process.isTerminal("stdin"))try{b.process.setStdinRaw(!0),t=!0}catch{}try{return await e()}finally{if(t)try{b.process.setStdinRaw(!1)}catch{}}},L=e=>{e.write(u("\x1B[?25l"))},A=e=>{e.write(u("\x1B[?25h"))},f=(e,t)=>{t>0&&e.write(u(`\x1B[${t}A\x1B[J`))};var Le=e=>{let t=new Uint8Array(e);if(e.length===1&&e[0]===3)return{name:"c",ctrl:!0,meta:!1,shift:!1,raw:t};if(e.length===1&&e[0]===27)return{name:"escape",ctrl:!1,meta:!1,shift:!1,raw:t};if(e.length===1&&(e[0]===13||e[0]===10))return{name:"return",ctrl:!1,meta:!1,shift:!1,raw:t};if(e.length===1&&e[0]===9)return{name:"tab",ctrl:!1,meta:!1,shift:!1,raw:t};if(e.length===1&&e[0]===127)return{name:"backspace",ctrl:!1,meta:!1,shift:!1,raw:t};if(e.length>=3&&e[0]===27&&e[1]===91)switch(e[2]){case 65:return{name:"up",ctrl:!1,meta:!1,shift:!1,raw:t};case 66:return{name:"down",ctrl:!1,meta:!1,shift:!1,raw:t};case 67:return{name:"right",ctrl:!1,meta:!1,shift:!1,raw:t};case 68:return{name:"left",ctrl:!1,meta:!1,shift:!1,raw:t};case 72:return{name:"home",ctrl:!1,meta:!1,shift:!1,raw:t};case 70:return{name:"end",ctrl:!1,meta:!1,shift:!1,raw:t}}if(e.length===1&&e[0]>=1&&e[0]<=26)return{name:String.fromCharCode(e[0]+96),ctrl:!0,meta:!1,shift:!1,raw:t};if(e.length===1&&e[0]===32)return{name:"space",char:" ",ctrl:!1,meta:!1,shift:!1,raw:t};if(e.length===1&&e[0]>=33&&e[0]<=126){let r=String.fromCharCode(e[0]);return{name:r,char:r,ctrl:!1,meta:!1,shift:!1,raw:t}}if(e.length>0&&e[0]>=192){let r=new TextDecoder().decode(e);return{name:r,char:r,ctrl:!1,meta:!1,shift:!1,raw:t}}return{name:"unknown",ctrl:!1,meta:!1,shift:!1,raw:t}};async function*B(e,t){let r=e.getReader();try{for(;!t?.aborted;){let{done:s,value:n}=await r.read();if(s||n===void 0)break;yield Le(n)}}finally{r.releaseLock()}}async function*ze(e,t){let r=e.getReader(),s=new TextDecoder;try{for(;!t?.aborted;){let{done:n,value:i}=await r.read();if(n||i===void 0)break;if(ye(i)){let o=s.decode(i),a=fe(o);if(a!==null){yield{kind:"mouse",event:a};continue}}yield{kind:"key",event:Le(i)}}}finally{r.releaseLock()}}var T=(e,t)=>{if(e==="exit"){A(t.output);try{b.process.setStdinRaw(!1)}catch{}b.process.exit(130)}return e==="cancel"?"cancel":"continue"};var g="\u2502",Be="\u250C",C="\u2514";var ne="\u25CF",ie="\u25CB",Me="\u25FC",Ie="\u25FB",N="\u25C6",S="\u25C7",O="\u25A0",Ne="\u25CF";var G="\u25B2";var De="\u25C7";var oe=(e,t,r,s)=>{if(s==="done"){let o=r?"Yes":"No";return e.output.writeln(x(S),u(` ${t}`),d(` \xB7 ${o}`)),1}if(s==="cancel")return e.output.writeln(R(O),u(` ${t}`)),1;let n=r?U(x(ne),u(" Yes")):U(d(ie),d(" Yes")),i=r?U(d(ie),d(" No")):U(x(ne),u(" No"));return e.output.writeln(k(N),u(` ${t}`)),e.output.writeln(d(g),u(" "),n,d(" / "),i),e.output.writeln(d(C)),3},Xe=async(e,t)=>{let r=t.initialValue??!0,s=0;L(e.output);try{return await P(async()=>{s=oe(e,t.message,r,"active"),await e.output.flush();let n=()=>{f(e.output,s),oe(e,t.message,r,"cancel")};for await(let i of B(e.input)){if(i.name==="c"&&i.ctrl){if(T(e.signals.ctrlC,e)==="cancel")return n(),await e.output.flush(),h;continue}if(i.name==="escape"){if(T(e.signals.escape,e)==="cancel")return n(),await e.output.flush(),h;continue}if(i.name==="return")return f(e.output,s),oe(e,t.message,r,"done"),await e.output.flush(),r;let o=!1;(i.name==="left"||i.name==="right")&&(r=!r,o=!0),(i.name==="y"||i.name==="Y")&&(r=!0,o=!0),(i.name==="n"||i.name==="N")&&(r=!1,o=!0),o&&(f(e.output,s),s=oe(e,t.message,r,"active"),await e.output.flush())}return h})}finally{A(e.output),await e.output.flush()}};var F=(e,t,r,s,n,i)=>{if(i==="done")return e.output.writeln(x(S),u(` ${t}`),d(` \xB7 ${r}`)),1;if(i==="cancel")return e.output.writeln(R(O),u(` ${t}`)),1;let o=r.length>0?u(r):s!==void 0?d(s):u(""),a=n!==void 0?E(G):k(N);e.output.writeln(a,u(` ${t}`)),e.output.writeln(d(g),u(" "),o);let p=2;return n!==void 0?(e.output.writeln(d(C),u(" "),E(n)),p=3):(e.output.writeln(d(C)),p=3),p},Ye=async(e,t)=>{let r=t.initialValue??"",s=r.length,n,i=0;L(e.output);try{return await P(async()=>{i=F(e,t.message,r,t.placeholder,n,"active"),await e.output.flush();let o=()=>{f(e.output,i),F(e,t.message,r,t.placeholder,void 0,"cancel")};for await(let a of B(e.input)){if(a.name==="c"&&a.ctrl){if(T(e.signals.ctrlC,e)==="cancel")return o(),await e.output.flush(),h;continue}if(a.name==="escape"){if(T(e.signals.escape,e)==="cancel")return o(),await e.output.flush(),h;continue}if(a.name==="return"){if(t.validate!==void 0){let p=t.validate(r);if(p!==void 0){n=p,f(e.output,i),i=F(e,t.message,r,t.placeholder,n,"active"),await e.output.flush();continue}}return f(e.output,i),F(e,t.message,r,t.placeholder,void 0,"done"),await e.output.flush(),r}if(n=void 0,a.name==="backspace")s>0&&(r=r.slice(0,s-1)+r.slice(s),s--);else if(a.name==="left")s>0&&s--;else if(a.name==="right")s<r.length&&s++;else if(a.name==="home")s=0;else if(a.name==="end")s=r.length;else if(a.char!==void 0)r=r.slice(0,s)+a.char+r.slice(s),s++;else continue;f(e.output,i),i=F(e,t.message,r,t.placeholder,n,"active"),await e.output.flush()}return h})}finally{A(e.output),await e.output.flush()}};var q=(e,t,r,s,n,i,o)=>{if(o==="done"){let c=[...n].sort((l,m)=>l-m).map(l=>r[l]?.label??"").join(", ");return e.output.writeln(x(S),u(` ${t}`),d(` \xB7 ${c}`)),1}if(o==="cancel")return e.output.writeln(R(O),u(` ${t}`)),1;let a=i!==void 0?E(G):k(N);e.output.writeln(a,u(` ${t}`));for(let c=0;c<r.length;c++){let l=r[c],m=c===s,y=n.has(c),v=l.disabled===!0,te=y?x(Me):d(Ie),$=v?d(` ${l.label}`):m?u(` ${l.label}`):d(` ${l.label}`),de=l.hint!==void 0?d(` (${l.hint})`):u("");e.output.writeln(d(g),u(" "),te,$,de)}let p=r.length+2;return i!==void 0?e.output.writeln(d(C),u(" "),E(i)):e.output.writeln(d(C)),p},ge=(e,t,r)=>{let s=e.length,n=t;for(let i=0;i<s;i++)if(n=(n+r+s)%s,e[n]?.disabled!==!0)return n;return t},Je=async(e,t)=>{let r=0,s=new Set;if(t.initialValues!==void 0)for(let o of t.initialValues){let a=t.options.findIndex(p=>p.value===o);a>=0&&s.add(a)}t.options[r]?.disabled===!0&&(r=ge(t.options,r,1));let n=0,i;L(e.output);try{return await P(async()=>{n=q(e,t.message,t.options,r,s,i,"active"),await e.output.flush();let o=()=>{f(e.output,n),q(e,t.message,t.options,r,s,void 0,"cancel")};for await(let a of B(e.input)){if(a.name==="c"&&a.ctrl){if(T(e.signals.ctrlC,e)==="cancel")return o(),await e.output.flush(),h;continue}if(a.name==="escape"){if(T(e.signals.escape,e)==="cancel")return o(),await e.output.flush(),h;continue}if(a.name==="return"){if(t.required!==!1&&s.size===0){i="Please select at least one option.",f(e.output,n),n=q(e,t.message,t.options,r,s,i,"active"),await e.output.flush();continue}return f(e.output,n),q(e,t.message,t.options,r,s,void 0,"done"),await e.output.flush(),[...s].sort((c,l)=>c-l).map(c=>t.options[c].value)}i=void 0;let p=!1;if((a.name==="up"||a.name==="k")&&(r=ge(t.options,r,-1),p=!0),(a.name==="down"||a.name==="j")&&(r=ge(t.options,r,1),p=!0),a.name==="space"&&t.options[r]?.disabled!==!0&&(s.has(r)?s.delete(r):s.add(r),p=!0),a.name==="a"){let c=t.options.every((l,m)=>l.disabled===!0||s.has(m));for(let l=0;l<t.options.length;l++)t.options[l]?.disabled!==!0&&(c?s.delete(l):s.add(l));p=!0}p&&(f(e.output,n),n=q(e,t.message,t.options,r,s,i,"active"),await e.output.flush())}return h})}finally{A(e.output),await e.output.flush()}};var Ze=(e,t)=>{e.output.writeln(_(Be),u(" "),Ae(t)),e.output.writeln(_(g))},Qe=(e,t)=>{e.output.writeln(_(g)),e.output.writeln(_(C),u(" "),u(t))},et=e=>{e.output.writeln(u(""))},tt=(e,t)=>{e.output.writeln(u(" "),d(t))},rt=e=>{e.output.writeln(_(g))},st={info:(e,t)=>{e.output.writeln(V("info",t))},success:(e,t)=>{e.output.writeln(V("success",t))},warn:(e,t)=>{e.output.writeln(V("warning",t))},error:(e,t)=>{e.output.writeln(V("error",t))},step:(e,t)=>{e.output.writeln(d(De),u(" "),d(t))},message:(e,t,r)=>{e.output.writeln(d(r??g),u(" "),u(t))}};var nt=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],it=80,ot=(e,t,r)=>{let s=r?.frames??nt,n=r?.interval??it,i=t,o=0,a,p=()=>{e.output.write(u(`\r${" ".repeat(i.length+4)}\r`))},c=()=>{a!==void 0&&(clearInterval(a),a=void 0,p())};return{start:l=>{l!==void 0&&(i=l),a=setInterval(()=>{let m=s[o%s.length];e.output.write(u("\r"),k(m??""),u(` ${i}`)),o++},n)},stop:l=>{c(),l!==void 0&&(i=l)},update:l=>{i=l},succeed:l=>{c(),e.output.writeln(x(S),u(` ${l??i}`))},fail:l=>{c(),e.output.writeln(R(O),u(` ${l??i}`))},warn:l=>{c(),e.output.writeln(E(G),u(` ${l??i}`))},info:l=>{c(),e.output.writeln(Oe(Ne),u(` ${l??i}`))}}};var _e={};D(_e,{clearScreenSeq:()=>pt,enterAlternateScreen:()=>at,exitAlternateScreen:()=>lt,getTerminalSize:()=>dt,hideCursorSeq:()=>ut,showCursorSeq:()=>ct});var at=()=>"\x1B[?1049h",lt=()=>"\x1B[?1049l",ut=()=>"\x1B[?25l",ct=()=>"\x1B[?25h",pt=()=>"\x1B[2J\x1B[H",dt=()=>{try{let{columns:e,rows:t}=b.process.consoleSize();return{cols:e,rows:t}}catch{return{cols:80,rows:24}}};var ce={};D(ce,{bgBlue:()=>yt,bgGreen:()=>ft,bold:()=>mt,cyan:()=>we,dim:()=>ae,green:()=>le,inverse:()=>Ce,moveTo:()=>w,red:()=>xe,reset:()=>ue,stripAnsi:()=>ve,truncate:()=>j,visibleLength:()=>W,white:()=>ht,yellow:()=>be});var w=(e,t)=>`\x1B[${e};${t}H`,mt=e=>`\x1B[1m${e}\x1B[22m`,ae=e=>`\x1B[2m${e}\x1B[22m`,le=e=>`\x1B[32m${e}\x1B[39m`,be=e=>`\x1B[33m${e}\x1B[39m`,xe=e=>`\x1B[31m${e}\x1B[39m`,we=e=>`\x1B[36m${e}\x1B[39m`,ht=e=>`\x1B[37m${e}\x1B[39m`,ft=e=>`\x1B[42m${e}\x1B[49m`,yt=e=>`\x1B[44m${e}\x1B[49m`,Ce=e=>`\x1B[7m${e}\x1B[27m`,ue=()=>"\x1B[0m",gt=/\x1b\[[0-9;]*[a-zA-Z]/g,ve=e=>e.replace(gt,""),W=e=>ve(e).length,j=(e,t)=>{if(ve(e).length<=t)return e;let s=0,n=0,i=e;for(;n<i.length&&s<t-1;){if(i[n]==="\x1B"){let o=i.indexOf("m",n);if(o!==-1){n=o+1;continue}}s++,n++}return i.slice(0,n)+"\u2026"+ue()};var Ge={};D(Ge,{calculateLayout:()=>bt});var bt=(e,t,r)=>{let s=r.leftWidth<=1?Math.floor(e*r.leftWidth):Math.min(Math.floor(r.leftWidth),e),n=e-s,i=t-1,o=r.rightTopHeight<=1?Math.floor(i*r.rightTopHeight):Math.min(Math.floor(r.rightTopHeight),i),a=i-o;return{left:{id:"left",x:1,y:1,width:s,height:i},rightTop:{id:"rightTop",x:s+1,y:1,width:n,height:o},rightBottom:{id:"rightBottom",x:s+1,y:o+1,width:n,height:a},statusBar:{id:"statusBar",x:1,y:t,width:e,height:1}}};var $e={};D($e,{nextSelectableIndex:()=>wt,renderList:()=>Ct});var xt=(e,t)=>{switch(t){case"green":return le(e);case"yellow":return be(e);case"red":return xe(e);case"cyan":return we(e);case"dim":return ae(e);default:return e}},wt=(e,t,r)=>{let s=r==="up"?-1:1,n=t+s;for(;n>=0&&n<e.length;){if(e[n].selectable!==!1)return n;n+=s}return t},Ct=(e,t,r)=>{let s=[],n=r.width-2,i=r.height-2,o=0;t>=i&&(o=t-i+1);for(let a=0;a<i;a++){let p=o+a,c=r.y+1+a;if(p>=e.length){s.push(w(c,r.x+1)+" ".repeat(n));continue}let l=e[p],m=l.selectable!==!1,y=p===t&&m,v=l.active?le("\u25CF"):y?"\u25B8":" ",te=l.badge!==void 0?" "+xt(`[${l.badge}]`,l.badgeColor??"dim"):"",$=l.dimmed?ae(l.label):l.label,de=` ${v} ${$}${te}`,me=j(de,n),ke=Math.max(0,n-W(me));y?s.push(w(c,r.x+1)+Ce(me+" ".repeat(ke))):s.push(w(c,r.x+1)+me+" ".repeat(ke))}return s.join("")};var X=()=>({char:" ",fg:-1,bg:-1,fgRGB:null,bgRGB:null,bold:!1,dim:!1,italic:!1,underline:!1,inverse:!1}),pe=(e,t)=>{let r=[];for(let s=0;s<e;s++){let n=[];for(let i=0;i<t;i++)n.push(X());r.push(n)}return r},z=e=>{let t=[];for(let r=0;r<e;r++)t.push(X());return t},Y=class{#e;#t;#r;#i=null;#o=0;#n;#s=new Set;constructor(t,r){this.#e=t,this.#t=r,this.#r=pe(t,r),this.#n=t-1}get rows(){return this.#e}get cols(){return this.#t}getCell(t,r){return t<0||t>=this.#e||r<0||r>=this.#t?X():this.#r[t][r]}setCell(t,r,s,n){t<0||t>=this.#e||r<0||r>=this.#t||(this.#r[t][r]={char:n,fg:s.fg,bg:s.bg,fgRGB:s.fgRGB,bgRGB:s.bgRGB,bold:s.bold,dim:s.dim,italic:s.italic,underline:s.underline,inverse:s.inverse},this.#s.add(t))}scrollUp(t=1){for(let r=0;r<t;r++)this.#r.splice(this.#o,1),this.#r.splice(this.#n,0,z(this.#t));for(let r=this.#o;r<=this.#n;r++)this.#s.add(r)}scrollDown(t=1){for(let r=0;r<t;r++)this.#r.splice(this.#n,1),this.#r.splice(this.#o,0,z(this.#t));for(let r=this.#o;r<=this.#n;r++)this.#s.add(r)}setScrollRegion(t,r){this.#o=Math.max(0,t),this.#n=Math.min(this.#e-1,r)}insertLines(t,r){for(let s=0;s<t;s++)this.#r.splice(this.#n,1),this.#r.splice(r,0,z(this.#t));for(let s=r;s<=this.#n;s++)this.#s.add(s)}deleteLines(t,r){for(let s=0;s<t;s++)this.#r.splice(r,1),this.#r.splice(this.#n,0,z(this.#t));for(let s=r;s<=this.#n;s++)this.#s.add(s)}clearLine(t,r){if(t<0||t>=this.#e)return;let s=this.#r[t];if(r===2)for(let n=0;n<this.#t;n++)s[n]=X();this.#s.add(t)}clearLineRange(t,r,s){if(t<0||t>=this.#e)return;let n=this.#r[t];for(let i=r;i<=Math.min(s,this.#t-1);i++)n[i]=X();this.#s.add(t)}clearDisplay(t,r,s){if(t===0){this.clearLineRange(r,s,this.#t-1);for(let n=r+1;n<this.#e;n++)this.clearLine(n,2)}else if(t===1){for(let n=0;n<r;n++)this.clearLine(n,2);this.clearLineRange(r,0,s)}else{this.#r=pe(this.#e,this.#t);for(let n=0;n<this.#e;n++)this.#s.add(n)}}enterAlternateScreen(){this.#i=this.#r,this.#r=pe(this.#e,this.#t);for(let t=0;t<this.#e;t++)this.#s.add(t)}exitAlternateScreen(){if(this.#i!==null){this.#r=this.#i,this.#i=null;for(let t=0;t<this.#e;t++)this.#s.add(t)}}resize(t,r){let s=pe(t,r),n=Math.min(t,this.#e),i=Math.min(r,this.#t);for(let o=0;o<n;o++)for(let a=0;a<i;a++)s[o][a]=this.#r[o][a];this.#e=t,this.#t=r,this.#r=s,this.#n=t-1;for(let o=0;o<t;o++)this.#s.add(o)}getLine(t){return t<0||t>=this.#e?z(this.#t):this.#r[t]}getGrid(){return this.#r}getDirtyLines(){return this.#s}clearDirty(){this.#s.clear()}markAllDirty(){for(let t=0;t<this.#e;t++)this.#s.add(t)}markLineDirty(t){t>=0&&t<this.#e&&this.#s.add(t)}};var J=class{row=0;col=0;visible=!0;#e=0;#t=0;moveTo(t,r){this.row=t,this.col=r}moveUp(t=1){this.row=Math.max(0,this.row-t)}moveDown(t=1){this.row+=t}moveForward(t=1){this.col+=t}moveBack(t=1){this.col=Math.max(0,this.col-t)}moveToColumn(t){this.col=t}save(){this.#e=this.row,this.#t=this.col}restore(){this.row=this.#e,this.col=this.#t}clamp(t,r){this.row=Math.max(0,Math.min(this.row,t-1)),this.col=Math.max(0,Math.min(this.col,r-1))}};var Z=()=>({fg:-1,bg:-1,fgRGB:null,bgRGB:null,bold:!1,dim:!1,italic:!1,underline:!1,inverse:!1}),Te=(e,t)=>{let r={...t},s=0;for(;s<e.length;){let n=e[s];switch(n){case 0:Object.assign(r,Z());break;case 1:r.bold=!0;break;case 2:r.dim=!0;break;case 3:r.italic=!0;break;case 4:r.underline=!0;break;case 7:r.inverse=!0;break;case 22:r.bold=!1,r.dim=!1;break;case 23:r.italic=!1;break;case 24:r.underline=!1;break;case 27:r.inverse=!1;break;case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:r.fg=n-30;break;case 39:r.fg=-1;break;case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:r.bg=n-40;break;case 49:r.bg=-1;break;case 90:case 91:case 92:case 93:case 94:case 95:case 96:case 97:r.fg=n-90+8;break;case 100:case 101:case 102:case 103:case 104:case 105:case 106:case 107:r.bg=n-100+8;break;case 38:s+1<e.length&&e[s+1]===5&&s+2<e.length?(r.fg=e[s+2],r.fgRGB=null,s+=2):s+1<e.length&&e[s+1]===2&&s+4<e.length&&(r.fgRGB={r:e[s+2],g:e[s+3],b:e[s+4]},r.fg=-1,s+=4);break;case 48:s+1<e.length&&e[s+1]===5&&s+2<e.length?(r.bg=e[s+2],r.bgRGB=null,s+=2):s+1<e.length&&e[s+1]===2&&s+4<e.length&&(r.bgRGB={r:e[s+2],g:e[s+3],b:e[s+4]},r.bg=-1,s+=4);break}s++}return r};var Q=class{#e="GROUND";#t="";#r="";#i="";feed(t){let r=[],s=()=>{this.#i.length>0&&(r.push({type:"text",text:this.#i}),this.#i="")};for(let n=0;n<t.length;n++){let i=t[n],o=i.charCodeAt(0);switch(this.#e){case"GROUND":i==="\x1B"?(s(),this.#e="ESC"):o<32&&o!==27?(s(),r.push({type:"control",code:o})):this.#i+=i;break;case"ESC":i==="["?(this.#e="CSI_PARAM",this.#t=""):i==="]"?(this.#e="OSC",this.#r=""):(r.push({type:"esc",command:i}),this.#e="GROUND");break;case"CSI_PARAM":if(o>=48&&o<=63||i===";"||i==="?")this.#t+=i;else if(o>=64&&o<=126){let a=this.#t.replace(/^\?/,""),p=this.#t.startsWith("?"),c=a.length>0?a.split(";").map(m=>{let y=parseInt(m,10);return isNaN(y)?0:y}):[],l=(p?"?":"")+i;r.push({type:"csi",command:l,params:c}),this.#e="GROUND"}else this.#t+=i;break;case"OSC":if(i==="\x07"||i==="\\"&&this.#r.endsWith("\x1B")){let a=i==="\\"?this.#r.slice(0,-1):this.#r,p=a.indexOf(";"),c=p>=0?parseInt(a.slice(0,p),10):0,l=p>=0?a.slice(p+1):a;r.push({type:"osc",command:isNaN(c)?0:c,data:l}),this.#e="GROUND"}else this.#r+=i;break}}return s(),r}};var ee=class{screen;cursor;#e;#t;constructor(t,r){this.screen=new Y(t,r),this.cursor=new J,this.#e=new Q,this.#t=Z()}write(t){let r=this.#e.feed(t);for(let s of r)switch(s.type){case"text":this.#r(s.text);break;case"csi":this.#o(s.command,s.params);break;case"esc":this.#n(s.command);break;case"control":this.#i(s.code);break;case"osc":break}}resize(t,r){this.screen.resize(t,r),this.cursor.clamp(t,r)}getScreen(){return this.screen}getCursor(){return this.cursor}#r(t){for(let r of t)this.cursor.col>=this.screen.cols&&(this.cursor.col=0,this.cursor.row++,this.cursor.row>=this.screen.rows&&(this.screen.scrollUp(),this.cursor.row=this.screen.rows-1)),this.screen.setCell(this.cursor.row,this.cursor.col,this.#t,r),this.cursor.col++}#i(t){switch(t){case 13:this.cursor.col=0;break;case 10:this.cursor.row++,this.cursor.row>=this.screen.rows&&(this.screen.scrollUp(),this.cursor.row=this.screen.rows-1);break;case 9:this.cursor.col=Math.min(this.screen.cols-1,(Math.floor(this.cursor.col/8)+1)*8);break;case 8:this.cursor.moveBack();break;case 7:break}}#o(t,r){let s=r[0]??0,n=r[1]??0,i=s||1;switch(t){case"A":this.cursor.moveUp(i);break;case"B":this.cursor.moveDown(i);break;case"C":this.cursor.moveForward(i);break;case"D":this.cursor.moveBack(i);break;case"H":case"f":this.cursor.moveTo((s||1)-1,(n||1)-1);break;case"G":this.cursor.moveToColumn((s||1)-1);break;case"d":this.cursor.moveTo((s||1)-1,this.cursor.col);break;case"J":this.screen.clearDisplay(s,this.cursor.row,this.cursor.col);break;case"K":s===0?this.screen.clearLineRange(this.cursor.row,this.cursor.col,this.screen.cols-1):s===1?this.screen.clearLineRange(this.cursor.row,0,this.cursor.col):this.screen.clearLine(this.cursor.row,2);break;case"m":this.#t=Te(r.length>0?r:[0],this.#t);break;case"S":this.screen.scrollUp(i);break;case"T":this.screen.scrollDown(i);break;case"L":this.screen.insertLines(i,this.cursor.row);break;case"M":this.screen.deleteLines(i,this.cursor.row);break;case"s":this.cursor.save();break;case"u":this.cursor.restore();break;case"r":this.screen.setScrollRegion((s||1)-1,(n||this.screen.rows)-1);break;case"?h":s===25&&(this.cursor.visible=!0),s===1049&&this.screen.enterAlternateScreen();break;case"?l":s===25&&(this.cursor.visible=!1),s===1049&&this.screen.exitAlternateScreen();break}this.cursor.clamp(this.screen.rows,this.screen.cols)}#n(t){switch(t){case"7":this.cursor.save();break;case"8":this.cursor.restore();break;case"M":this.cursor.row===0?this.screen.scrollDown():this.cursor.moveUp();break;case"c":this.screen.clearDisplay(2,0,0),this.cursor.moveTo(0,0),this.#t=Z();break}}};var kt=e=>{let t=[];return e.bold&&t.push(1),e.dim&&t.push(2),e.italic&&t.push(3),e.underline&&t.push(4),e.fgRGB!==null?t.push(38,2,e.fgRGB.r,e.fgRGB.g,e.fgRGB.b):e.fg>=0&&e.fg<8?t.push(30+e.fg):e.fg>=8&&e.fg<16?t.push(90+(e.fg-8)):e.fg>=16&&t.push(38,5,e.fg),t.length===0?"":`\x1B[${t.join(";")}m`},At=e=>e.fg===-1&&e.fgRGB===null&&!e.bold&&!e.dim&&!e.italic&&!e.underline,Se=(e,t,r,s)=>{s!==void 0&&s.prevCursorRow>=0&&s.prevCursorRow<e.rows&&e.markLineDirty(s.prevCursorRow),t.visible&&t.row>=0&&t.row<e.rows&&e.markLineDirty(t.row);let n=[],i=e.getDirtyLines(),o=r.fullRedraw===!0||i.size>=r.height,a=Math.min(r.height,e.rows),p=Math.min(r.width,e.cols);for(let c=0;c<a;c++){if(!o&&!i.has(c))continue;n.push(`\x1B[${r.offsetRow+c};${r.offsetCol}H`);let l=e.getLine(c),m=!1,y=0;for(;y<p;y++){let v=y<l.length?l[y]:void 0;if(t.visible&&c===t.row&&y===t.col)m&&(n.push("\x1B[0m"),m=!1),n.push("\x1B[7m"),n.push(v?.char??" "),n.push("\x1B[27m");else if(v===void 0||At(v))m&&(n.push("\x1B[0m"),m=!1),n.push(v?.char??" ");else{let $=kt(v);n.push($),m=!0,n.push(v.char)}}m&&n.push("\x1B[0m")}return s!==void 0&&(s.prevCursorRow=t.row,s.prevCursorCol=t.col),e.clearDirty(),n.join("")};var Re=class{#e;#t=!1;constructor(t,r){this.#e=new ee(t,r)}write(t){this.#e.write(t),this.#t=!0}render(t,r=!1){let s={offsetRow:t.y+1,offsetCol:t.x+1,width:t.width-2,height:t.height-2,fullRedraw:r};return this.#t=!1,Se(this.#e.getScreen(),this.#e.getCursor(),s)}resize(t,r){this.#e.resize(t,r),this.#t=!0}get dirty(){return this.#t}clearDirty(){this.#t=!1}get terminal(){return this.#e}};var Ve={};D(Ve,{drawBox:()=>Ue,fillBox:()=>Pt});var Et={single:{tl:"\u250C",tr:"\u2510",bl:"\u2514",br:"\u2518",h:"\u2500",v:"\u2502"},double:{tl:"\u2554",tr:"\u2557",bl:"\u255A",br:"\u255D",h:"\u2550",v:"\u2551"},rounded:{tl:"\u256D",tr:"\u256E",bl:"\u2570",br:"\u256F",h:"\u2500",v:"\u2502"}},Ue=e=>{let t=e.borderStyle??"single",r=Et[t],s=e.width-2,n=[],i=r.tl;if(e.title!==void 0){let o=` ${e.title} `;i+=o+r.h.repeat(Math.max(0,s-o.length))}else i+=r.h.repeat(s);if(i+=r.tr,n.push(w(e.y,e.x)+i),e.skipInterior===!0)for(let o=1;o<e.height-1;o++)n.push(w(e.y+o,e.x)+r.v+w(e.y+o,e.x+e.width-1)+r.v);else for(let o=1;o<e.height-1;o++)n.push(w(e.y+o,e.x)+r.v+ue()+" ".repeat(s)+r.v);return n.push(w(e.y+e.height-1,e.x)+r.bl+r.h.repeat(s)+r.br),n.join("")},Pt=(e,t)=>{let r=Ue(e),s=e.width-2,n=e.height-2,i=[];for(let o=0;o<n;o++){let a=o<t.length?t[o]:"",p=j(a??"",s),c=Math.max(0,s-W(p));i.push(w(e.y+1+o,e.x+1)+p+" ".repeat(c))}return r+i.join("")};export{Ke as a,Fe as b,Pe as c,P as d,ze as e,Xe as f,Ye as g,Je as h,Ze as i,Qe as j,et as k,tt as l,rt as m,st as n,ot as o,_e as p,ce as q,Ve as r,Ge as s,$e as t,Re as u};
@@ -1 +0,0 @@
1
- import{d as r}from"./chunk-E7UED6DA.js";import{b as i}from"./chunk-RMCTOOQL.js";var t=async e=>{try{return await r`which ${e}`.noThrow().code()===0}catch{return!1}},s=async()=>{try{return(await fetch("http://localhost:11434/api/version",{signal:AbortSignal.timeout(1e3)})).ok}catch{return!1}},a=e=>i.env.has(e),d=async()=>{let[e,o,l,n]=await Promise.all([t("claude"),s(),t("opencode"),t("kiro")]);return[{name:"claude-code",alias:"cc",type:"CLI",available:e,detail:e?"claude binary found":"claude not on PATH"},{name:"ollama",alias:"ol",type:"HTTP",available:o,detail:o?"localhost:11434 reachable":"localhost:11434 not reachable"},{name:"opencode",alias:"oc",type:"CLI",available:l,detail:l?"opencode binary found":"opencode not on PATH"},{name:"kiro",alias:"kr",type:"CLI",available:n,detail:n?"kiro binary found":"kiro not on PATH"},{name:"anthropic",alias:"ant",type:"API",available:a("ANTHROPIC_API_KEY"),detail:a("ANTHROPIC_API_KEY")?"ANTHROPIC_API_KEY set":"ANTHROPIC_API_KEY not set"},{name:"openai",alias:"oai",type:"API",available:a("OPENAI_API_KEY"),detail:a("OPENAI_API_KEY")?"OPENAI_API_KEY set":"OPENAI_API_KEY not set"},{name:"gemini",alias:"gem",type:"API",available:a("GEMINI_API_KEY")||a("GOOGLE_API_KEY"),detail:a("GEMINI_API_KEY")||a("GOOGLE_API_KEY")?"API key set":"GEMINI_API_KEY not set"},{name:"vertexai",alias:"vtx",type:"API",available:a("GOOGLE_CLOUD_PROJECT"),detail:a("GOOGLE_CLOUD_PROJECT")?"GOOGLE_CLOUD_PROJECT set":"GOOGLE_CLOUD_PROJECT not set"}]};export{d as a};