noskills 4.1.44 → 4.1.47

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 (53) hide show
  1. package/README.md +74 -22
  2. package/chunks/{approve-NPG6X7O6.js → approve-D5AONTPF.js} +1 -1
  3. package/chunks/{ask-F4XM2EEC.js → ask-SWMI6GK2.js} +1 -1
  4. package/chunks/{block-LSEXCK45.js → block-MW7CCPRS.js} +1 -1
  5. package/chunks/{cancel-BK6GCIIY.js → cancel-3JUX5SPS.js} +1 -1
  6. package/chunks/{chunk-3SLKOP72.js → chunk-6FTHIS2Z.js} +1 -1
  7. package/chunks/chunk-FEHZCASN.js +3 -0
  8. package/chunks/chunk-FJCXMC2D.js +1 -0
  9. package/chunks/chunk-IZ4J7VRF.js +1 -0
  10. package/chunks/{chunk-ZMVD5IU4.js → chunk-OV7ZXBXC.js} +28 -27
  11. package/chunks/chunk-QMZBEPES.js +16 -0
  12. package/chunks/{chunk-LWCWPXCS.js → chunk-QYMX2GR3.js} +86 -83
  13. package/chunks/chunk-RBLZTQ64.js +3 -0
  14. package/chunks/{chunk-ERX4HONR.js → chunk-TIGKFDKY.js} +1 -1
  15. package/chunks/{chunk-7QFOEK3I.js → chunk-XRKWQJMC.js} +1 -1
  16. package/chunks/{chunk-ALZM4JXG.js → chunk-XYJXQHQN.js} +1 -1
  17. package/chunks/{claude-code-K3SX5D5F.js → claude-code-FZXKRWA5.js} +1 -1
  18. package/chunks/{concern-3K3QUYG4.js → concern-XME2LKJJ.js} +1 -1
  19. package/chunks/{done-OMGLEA32.js → done-5FR2OAXK.js} +1 -1
  20. package/chunks/{free-BO5UA5V2.js → free-KPB37MR3.js} +1 -1
  21. package/chunks/{init-M4MSHCVJ.js → init-HIQXEJDS.js} +1 -1
  22. package/chunks/invoke-hook-NXZYKSHD.js +11 -0
  23. package/chunks/{kiro-T5X4D4SC.js → kiro-AC5LYTVB.js} +1 -1
  24. package/chunks/{list-3RK7TPGG.js → list-B5YTFNLR.js} +1 -1
  25. package/chunks/manager-OOJQ6WXI.js +6 -0
  26. package/chunks/mod-RW5J2N5Q.js +1 -0
  27. package/chunks/next-SP7JFPGS.js +8 -0
  28. package/chunks/{ollama-CNKKUTPX.js → ollama-TM4MMP7N.js} +1 -1
  29. package/chunks/{opencode-MJO3K6T4.js → opencode-YGNBYWQL.js} +1 -1
  30. package/chunks/{purge-MDSEQLDQ.js → purge-OAHH3MCY.js} +1 -1
  31. package/chunks/{reopen-EKSLLO54.js → reopen-H6WXM2OQ.js} +1 -1
  32. package/chunks/{reset-WRTVX7TT.js → reset-O4WA2VGI.js} +1 -1
  33. package/chunks/rule-IHME5I6Q.js +6 -0
  34. package/chunks/run-7OEMPUFO.js +3 -0
  35. package/chunks/session-NSWI2Q3S.js +1 -0
  36. package/chunks/spec-2FKI55EV.js +1 -0
  37. package/chunks/{status-63TFVF7Y.js → status-MOMQ2FRD.js} +1 -1
  38. package/chunks/{sync-VS4HROEX.js → sync-YI7WLQP2.js} +1 -1
  39. package/chunks/{watch-4HJMGNF4.js → watch-GMTD4676.js} +1 -1
  40. package/chunks/{wontfix-BOT7HHH2.js → wontfix-2AKBA54I.js} +1 -1
  41. package/noskills.js +1 -1
  42. package/package.json +1 -1
  43. package/chunks/chunk-73EEM3FY.js +0 -1
  44. package/chunks/chunk-7GUYMD3Z.js +0 -16
  45. package/chunks/chunk-BBKSV2RO.js +0 -3
  46. package/chunks/chunk-SNHYXBHM.js +0 -3
  47. package/chunks/chunk-TMC5H2A5.js +0 -1
  48. package/chunks/invoke-hook-HB2TBCHD.js +0 -10
  49. package/chunks/mod-KTV64DHD.js +0 -1
  50. package/chunks/next-4DJGEJBW.js +0 -8
  51. package/chunks/rule-QP5BSH27.js +0 -2
  52. package/chunks/run-3VWWQDN2.js +0 -3
  53. package/chunks/spec-HQZVVCBY.js +0 -1
@@ -0,0 +1,3 @@
1
+ import{b as f}from"./chunk-VPXOI7CR.js";import{d}from"./chunk-QYMX2GR3.js";import{b as u}from"./chunk-MNEZ5QGX.js";var m=r=>{let n=r.split(/\n/).flatMap(t=>t.trim().length>0?[t.trim()]:[]);return n.length>1?n:r.split(/\.(?=\s+[A-Z])|;\s+/).map(t=>t.trim()).filter(t=>t.length>5)},v=(r,n=[])=>{let t=[],o=r.find(e=>e.questionId==="ambition");if(o!==void 0){let e=o.answer,c=e.match(/10[- ]?star[:\s]+(.+?)(?:\n|$)/is),a=e.match(/5[- ]?star[:\s]+(.+?)(?:\n|$)/is),s=(c!==null?c[1].trim():a!==null?a[1].trim():e.replace(/1[- ]?star[:\s]+[^.]*\.\s*/i,"").trim()).replace(/^(the|a|an|with|plus|also)\s+/i,"").replace(/^(the\s+)?(target|goal|objective)[:\s]+/i,"").trim();s.length>0&&(s=s.charAt(0).toUpperCase()+s.slice(1)),s=s.replace(/[.\u2026]+$/,"").trim(),s.length>140&&(s=s.slice(0,137)+"..."),s.length>3&&t.push(s)}let i=r.find(e=>e.questionId==="verification");if(i!==void 0){let e=i.answer.split(/\n/).map(c=>c.replace(/^\s*[-\u2022*]\s*/,"").trim()).filter(c=>c.length>0);for(let c of e)t.push(c)}for(let e of n){let c=e.choice.toLowerCase();if(c.includes("accepted")||c.includes("add to scope")){let a=e.question.replace(/^should\s+(we|i)\s+/i,"").replace(/\?+$/,"").trim(),l=a.charAt(0).toUpperCase()+a.slice(1);t.push(l)}}return t.length===0&&t.push("_Tasks need to be defined before execution. Add tasks manually or run discovery with more detail._"),t.push("Write or update tests for all new and changed behavior"),t.push("Update documentation for all public-facing changes (README, API docs, CHANGELOG)"),t},w=(r,n)=>{let t={};if(n===null){for(let o of r.specSections)t[o]=!1;return t}for(let o of r.specSections){let i=o.toLowerCase();i.includes("design")||i.includes("mobile")||i.includes("layout")||i.includes("interaction")?t[o]=n.involvesWebUI:i.includes("contributor")||i.includes("public api")||i.includes("api surface")?t[o]=n.involvesPublicAPI:i.includes("migration")||i.includes("deprecation")||i.includes("backward")||i.includes("compatibility")?t[o]=n.involvesMigration:i.includes("audit")||i.includes("access control")||i.includes("data handling")?t[o]=n.involvesDataHandling:t[o]=!0}return t},g=(r,n,t,o,i)=>{let e=[];e.push(`# Spec: ${r}`),e.push(""),e.push("## Status: draft"),e.push(""),t.length>0&&(e.push(`## Concerns: ${t.map(s=>s.id).join(", ")}`),e.push("")),e.push("## Discovery Answers"),e.push("");for(let s of n)e.push(`### ${s.questionId}`),e.push(""),e.push(s.answer),e.push("");for(let s of t)if(s.specSections.length>0){let p=w(s,i??null);for(let h of s.specSections)p[h]!==!1&&(e.push(`## ${h} (${s.id})`),e.push(""),e.push("_To be addressed during execution._"),e.push(""))}if(o.length>0){e.push("## Decisions"),e.push(""),e.push("| # | Decision | Choice | Promoted |"),e.push("|---|----------|--------|----------|");for(let s=0;s<o.length;s++){let p=o[s];e.push(`| ${s+1} | ${p.question} | ${p.choice} | ${p.promoted?"yes":"no"} |`)}e.push("")}let c=n.find(s=>s.questionId==="scope_boundary");if(c!==void 0){e.push("## Out of Scope"),e.push("");let s=m(c.answer);for(let p of s)e.push(`- ${p}`);e.push("")}let a=v(n,o);e.push("## Tasks"),e.push("");for(let s=0;s<a.length;s++)e.push(`- [ ] task-${s+1}: ${a[s]}`);e.push("");let l=n.find(s=>s.questionId==="verification");if(e.push("## Verification"),e.push(""),l!==void 0){let s=m(l.answer);for(let p of s)e.push(`- ${p}`)}else e.push("_To be defined._");return e.push(""),e.join(`
2
+ `)};var D=async(r,n,t)=>{if(n.spec===null)throw new Error("No active spec");let o=`${r}/${d.specDir(n.spec)}`,i=`${r}/${d.specFile(n.spec)}`;await u.fs.mkdir(o,{recursive:!0});let e=g(n.spec,n.discovery.answers,t,n.decisions,n.classification);await u.fs.writeTextFile(i,e);let c=f(n.spec,e),a=`${o}/progress.json`,l={spec:n.spec,status:"draft",tasks:c.tasks.map(s=>({id:s.id,title:s.title,status:"pending"})),decisions:n.decisions.map(s=>({question:s.question,choice:s.choice,promoted:s.promoted})),debt:[],updatedAt:new Date().toISOString()};return await u.fs.writeTextFile(a,JSON.stringify(l,null,2)+`
3
+ `),i};export{D as a};
@@ -1 +1 @@
1
- import{d as r}from"./chunk-BBKSV2RO.js";import{b as i}from"./chunk-MNEZ5QGX.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};
1
+ import{d as r}from"./chunk-FEHZCASN.js";import{b as i}from"./chunk-MNEZ5QGX.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};
@@ -1,3 +1,3 @@
1
- import{a as i}from"./chunk-OLM5RTFK.js";import{b as d,d as c}from"./chunk-BBKSV2RO.js";var y=async(r,t)=>{let e=t.properties?.binPath;if(e!==void 0)return e;try{let n=await c`which ${r}`.noThrow().text();if(n.length>0)return n}catch{}throw new i(`Binary "${r}" not found. Set properties.binPath in config or ensure it is on PATH.`,{provider:r})},f=(r,t,e)=>{let s=new d(r,[...t],{stdin:"null",stdout:"piped",stderr:"piped",cwd:e?.cwd,env:e?.env}).child();if(e?.signal!==void 0){let o=e.signal;o.aborted?s.kill("SIGTERM"):o.addEventListener("abort",()=>{s.kill("SIGTERM")},{once:!0})}return{stdout:s.stdout,stderr:s.stderr,waitForExit:async()=>{let o=await s.status;return{code:o.code,success:o.success}},kill:o=>{s.kill(o??"SIGTERM")}}},a=new TextDecoder;async function*m(r){let t=r.getReader(),e="";try{let n=await t.read();for(;n.done!==!0;){e+=a.decode(n.value,{stream:!0});let o=e.split(`
1
+ import{a as i}from"./chunk-OLM5RTFK.js";import{b as d,d as c}from"./chunk-FEHZCASN.js";var y=async(r,t)=>{let e=t.properties?.binPath;if(e!==void 0)return e;try{let n=await c`which ${r}`.noThrow().text();if(n.length>0)return n}catch{}throw new i(`Binary "${r}" not found. Set properties.binPath in config or ensure it is on PATH.`,{provider:r})},f=(r,t,e)=>{let s=new d(r,[...t],{stdin:"null",stdout:"piped",stderr:"piped",cwd:e?.cwd,env:e?.env}).child();if(e?.signal!==void 0){let o=e.signal;o.aborted?s.kill("SIGTERM"):o.addEventListener("abort",()=>{s.kill("SIGTERM")},{once:!0})}return{stdout:s.stdout,stderr:s.stderr,waitForExit:async()=>{let o=await s.status;return{code:o.code,success:o.success}},kill:o=>{s.kill(o??"SIGTERM")}}},a=new TextDecoder;async function*m(r){let t=r.getReader(),e="";try{let n=await t.read();for(;n.done!==!0;){e+=a.decode(n.value,{stream:!0});let o=e.split(`
2
2
  `);e=o.pop()??"";for(let u of o){let l=u.trim();if(l.length!==0)try{yield JSON.parse(l)}catch{}}n=await t.read()}let s=e.trim();if(s.length>0)try{yield JSON.parse(s)}catch{}}finally{t.releaseLock()}}var h=async(r,t)=>{let e=r.getReader(),n=[],s=await e.read();for(;s.done!==!0;)n.push(a.decode(s.value,{stream:!0})),s=await e.read();return e.releaseLock(),{content:[{kind:"text",text:n.join("").trim()}],stopReason:"end_turn",usage:{inputTokens:0,outputTokens:0,totalTokens:0},modelId:t}},w=async r=>{let t=r.getReader(),e=[],n=await t.read();for(;n.done!==!0;)e.push(a.decode(n.value,{stream:!0})),n=await t.read();return t.releaseLock(),e.join("").trim()},x=(r,t,e)=>{if(t===0)return null;let n=e.length>0?`${r} exited with code ${t}: ${e}`:`${r} exited with code ${t}`;return t===1?new i(n,{provider:r}):t===126||t===127?new i(`${r} binary not found or not executable (exit code ${t})`,{provider:r}):new i(n,{provider:r})},b=(r,t)=>{let e=[];t!==void 0&&(e.push(t),e.push(""));for(let n of r)for(let s of n.content)s.kind==="text"&&e.push(s.text);return e.join(`
3
3
  `)};export{y as a,f as b,m as c,h as d,w as e,x as f,b as g};
@@ -76,7 +76,7 @@ complete -F _${n}_completions ${n}
76
76
  `;return t+=`# ${n} zsh completion
77
77
  `,t+=`# Generated by @eser/shell/completions
78
78
 
79
- `,t+=te(n,e,[]),t};var oe=n=>n.replace(/[\\'\$`()]/g,"\\$&"),ke=(n,e,t)=>{let o="";for(let s of e){let r=oe(s.description??`${s.name} flag`),i=`complete -c ${n} ${t}`;i+=` -l ${s.name}`,s.short!==void 0&&(i+=` -s ${s.short}`),s.takesValue===!0&&(i+=" -r"),i+=` -d '${r}'`,o+=i+`
79
+ `,t+=te(n,e,[]),t};var oe=n=>n.replace(/[\\'"$`(){}|&;<>#~*?!\^]/g,"\\$&"),ke=(n,e,t)=>{let o="";for(let s of e){let r=oe(s.description??`${s.name} flag`),i=`complete -c ${n} ${t}`;i+=` -l ${s.name}`,s.short!==void 0&&(i+=` -s ${s.short}`),s.takesValue===!0&&(i+=" -r"),i+=` -d '${r}'`,o+=i+`
80
80
  `}return o},re=(n,e,t)=>{let o="",s;if(t.length===0?s="-n __fish_use_subcommand":s=`-n "${t.map(i=>`__fish_seen_subcommand_from ${i}`).join("; and ")}"`,e.children!==void 0&&e.children.length>0){for(let r of e.children){let i=oe(r.description??r.name);if(t.length===0)o+=`complete -c ${n} -f ${s} `,o+=`-a "${r.name}" -d '${i}'
81
81
  `;else{let d=`-n "__fish_seen_subcommand_from ${t[t.length-1]}"`;o+=`complete -c ${n} -f ${d} `,o+=`-a "${r.name}" -d '${i}'
82
82
  `}}for(let r of e.children)o+=re(n,r,[...t,r.name])}return e.flags!==void 0&&e.flags.length>0&&(o+=ke(n,e.flags,s)),o},ie=(n,e)=>{let t=`# ${n} fish completion
@@ -1 +1 @@
1
- import{a as k,b as p,c as h,e as m,f as u,g as f}from"./chunk-7QFOEK3I.js";import{a as c}from"./chunk-OLM5RTFK.js";import"./chunk-BBKSV2RO.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var y=class{capabilities=["text_generation","streaming","tool_calling"];provider="claude-code";modelId;binary;config;constructor(e,n){this.binary=e,this.config=n,this.modelId=n.model}async generateText(e,n){let r=w(this.config,e,"json"),s=f(e.messages,e.system);r.push("-p",s);let o=p(this.binary,r,{signal:n}),l=m(o.stderr),i=o.stdout.getReader(),a=[],d=new TextDecoder,g=await i.read();for(;g.done!==!0;)a.push(d.decode(g.value,{stream:!0})),g=await i.read();i.releaseLock();let T=await o.waitForExit(),_=await l,x=u("claude-code",T.code,_);if(x!==null)throw x;let S=a.join("");return v(S,this.modelId)}async*streamText(e,n){let r=this.config.properties?.streamFormat??"text",s=w(this.config,e,r),o=f(e.messages,e.system);s.push("-p",o);let l=p(this.binary,s,{signal:n}),i=m(l.stderr);try{r==="stream-json"?yield*this.#t(l,i):yield*this.#e(l,i)}catch(a){a instanceof c?yield{kind:"error",error:a}:yield{kind:"error",error:new c(a instanceof Error?a.message:String(a),{provider:"claude-code",cause:a instanceof Error?a:void 0})}}}async*#e(e,n){let r=new TextDecoder,s=e.stdout.getReader(),o=await s.read();for(;o.done!==!0;){let d=r.decode(o.value,{stream:!0});d.length>0&&(yield{kind:"content_delta",textDelta:d}),o=await s.read()}s.releaseLock();let l=await e.waitForExit(),i=await n,a=u("claude-code",l.code,i);a!==null?yield{kind:"error",error:a}:yield{kind:"message_done",stopReason:"end_turn",usage:{inputTokens:0,outputTokens:0,totalTokens:0}}}async*#t(e,n){for await(let l of h(e.stdout)){let i=E(l);i!==null&&(yield i)}let r=await e.waitForExit(),s=await n,o=u("claude-code",r.code,s);o!==null&&(yield{kind:"error",error:o})}close(){return Promise.resolve()}getRawClient(){return null}},P={provider:"claude-code",async createModel(t){let e=await k("claude",t);return new y(e,t)}},w=(t,e,n)=>{let r=[];n!=="text"&&r.push("--output-format",n),n==="stream-json"&&r.push("--verbose"),r.push("--model",t.model);let s=t.properties?.maxTurns;s!==void 0&&r.push("--max-turns",String(s));let o=t.properties?.allowedTools;if(o!==void 0)for(let i of o)r.push("--allowedTools",i);let l=t.properties?.args;return l!==void 0&&r.push(...l),r},v=(t,e)=>{try{let n=JSON.parse(t);return b(n,e)}catch{return{content:[{kind:"text",text:t.trim()}],stopReason:"end_turn",usage:{inputTokens:0,outputTokens:0,totalTokens:0},modelId:e}}},b=(t,e)=>{let n=[];if(t.result!==void 0)n.push({kind:"text",text:String(t.result)});else if(t.message?.content!==void 0)for(let r of t.message.content)r.type==="text"?n.push({kind:"text",text:r.text}):r.type==="tool_use"&&n.push({kind:"tool_call",toolCall:{id:r.id??r.name,name:r.name,arguments:r.input??{}}});else typeof t=="string"&&n.push({kind:"text",text:t});return n.length===0&&n.push({kind:"text",text:JSON.stringify(t)}),{content:n,stopReason:t.stop_reason==="tool_use"?"tool_use":"end_turn",usage:{inputTokens:t.usage?.input_tokens??0,outputTokens:t.usage?.output_tokens??0,totalTokens:(t.usage?.input_tokens??0)+(t.usage?.output_tokens??0)},modelId:e,rawResponse:t}},E=t=>{if(t===null||typeof t!="object")return null;let e=t;if(e.type==="assistant"){if(e.message?.content!==void 0){for(let n of e.message.content)if(n.type==="text")return{kind:"content_delta",textDelta:n.text}}return null}return e.type==="content_block_delta"?e.delta?.type==="text_delta"?{kind:"content_delta",textDelta:e.delta.text}:null:e.type==="result"?{kind:"message_done",stopReason:e.subtype==="tool_use"?"tool_use":"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 Claude Code error",{provider:"claude-code"})}:e.content!==void 0&&typeof e.content=="string"?{kind:"content_delta",textDelta:e.content}:null};export{y as ClaudeCodeModel,P as claudeCodeFactory};
1
+ import{a as k,b as p,c as h,e as m,f as u,g as f}from"./chunk-XRKWQJMC.js";import{a as c}from"./chunk-OLM5RTFK.js";import"./chunk-FEHZCASN.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var y=class{capabilities=["text_generation","streaming","tool_calling"];provider="claude-code";modelId;binary;config;constructor(e,n){this.binary=e,this.config=n,this.modelId=n.model}async generateText(e,n){let r=w(this.config,e,"json"),s=f(e.messages,e.system);r.push("-p",s);let o=p(this.binary,r,{signal:n}),l=m(o.stderr),i=o.stdout.getReader(),a=[],d=new TextDecoder,g=await i.read();for(;g.done!==!0;)a.push(d.decode(g.value,{stream:!0})),g=await i.read();i.releaseLock();let T=await o.waitForExit(),_=await l,x=u("claude-code",T.code,_);if(x!==null)throw x;let S=a.join("");return v(S,this.modelId)}async*streamText(e,n){let r=this.config.properties?.streamFormat??"text",s=w(this.config,e,r),o=f(e.messages,e.system);s.push("-p",o);let l=p(this.binary,s,{signal:n}),i=m(l.stderr);try{r==="stream-json"?yield*this.#t(l,i):yield*this.#e(l,i)}catch(a){a instanceof c?yield{kind:"error",error:a}:yield{kind:"error",error:new c(a instanceof Error?a.message:String(a),{provider:"claude-code",cause:a instanceof Error?a:void 0})}}}async*#e(e,n){let r=new TextDecoder,s=e.stdout.getReader(),o=await s.read();for(;o.done!==!0;){let d=r.decode(o.value,{stream:!0});d.length>0&&(yield{kind:"content_delta",textDelta:d}),o=await s.read()}s.releaseLock();let l=await e.waitForExit(),i=await n,a=u("claude-code",l.code,i);a!==null?yield{kind:"error",error:a}:yield{kind:"message_done",stopReason:"end_turn",usage:{inputTokens:0,outputTokens:0,totalTokens:0}}}async*#t(e,n){for await(let l of h(e.stdout)){let i=E(l);i!==null&&(yield i)}let r=await e.waitForExit(),s=await n,o=u("claude-code",r.code,s);o!==null&&(yield{kind:"error",error:o})}close(){return Promise.resolve()}getRawClient(){return null}},P={provider:"claude-code",async createModel(t){let e=await k("claude",t);return new y(e,t)}},w=(t,e,n)=>{let r=[];n!=="text"&&r.push("--output-format",n),n==="stream-json"&&r.push("--verbose"),r.push("--model",t.model);let s=t.properties?.maxTurns;s!==void 0&&r.push("--max-turns",String(s));let o=t.properties?.allowedTools;if(o!==void 0)for(let i of o)r.push("--allowedTools",i);let l=t.properties?.args;return l!==void 0&&r.push(...l),r},v=(t,e)=>{try{let n=JSON.parse(t);return b(n,e)}catch{return{content:[{kind:"text",text:t.trim()}],stopReason:"end_turn",usage:{inputTokens:0,outputTokens:0,totalTokens:0},modelId:e}}},b=(t,e)=>{let n=[];if(t.result!==void 0)n.push({kind:"text",text:String(t.result)});else if(t.message?.content!==void 0)for(let r of t.message.content)r.type==="text"?n.push({kind:"text",text:r.text}):r.type==="tool_use"&&n.push({kind:"tool_call",toolCall:{id:r.id??r.name,name:r.name,arguments:r.input??{}}});else typeof t=="string"&&n.push({kind:"text",text:t});return n.length===0&&n.push({kind:"text",text:JSON.stringify(t)}),{content:n,stopReason:t.stop_reason==="tool_use"?"tool_use":"end_turn",usage:{inputTokens:t.usage?.input_tokens??0,outputTokens:t.usage?.output_tokens??0,totalTokens:(t.usage?.input_tokens??0)+(t.usage?.output_tokens??0)},modelId:e,rawResponse:t}},E=t=>{if(t===null||typeof t!="object")return null;let e=t;if(e.type==="assistant"){if(e.message?.content!==void 0){for(let n of e.message.content)if(n.type==="text")return{kind:"content_delta",textDelta:n.text}}return null}return e.type==="content_block_delta"?e.delta?.type==="text_delta"?{kind:"content_delta",textDelta:e.delta.text}:null:e.type==="result"?{kind:"message_done",stopReason:e.subtype==="tool_use"?"tool_use":"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 Claude Code error",{provider:"claude-code"})}:e.content!==void 0&&typeof e.content=="string"?{kind:"content_delta",textDelta:e.content}:null};export{y as ClaudeCodeModel,P as claudeCodeFactory};
@@ -1 +1 @@
1
- import{b as A}from"./chunk-MRZT23BL.js";import{b as $,c as b}from"./chunk-YK6UG66R.js";import{l as k,m as y,n as x,o as P}from"./chunk-LWCWPXCS.js";import{c as d,d as c,f as u,g as C,o as m,q as w,r as g}from"./chunk-Y6AFIAJP.js";import{a as l,b as p}from"./chunk-2N4GTHXQ.js";import{b as v}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var q=async s=>{let e=s?.[0];if(e==="add")return await I(s?.slice(1));if(e==="remove")return await M(s?.slice(1));if(e==="list")return await R();let r=$(),n=m({renderer:g.ansi(),sink:w.stdout()});return n.writeln(`Usage: ${r} concern <add <id> | remove <id> | list>`),await n.close(),l(void 0)},I=async s=>{let e=m({renderer:g.ansi(),sink:w.stdout()}),r=v.process.cwd(),n=(s??[]).filter(i=>!i.startsWith("-")),t=await k(r);if(n.length===0)return e.writeln(u("Please provide concern ID(s): "),d(b("concern add open-source beautiful-product"))),await e.close(),p({exitCode:1});if(t===null)return e.writeln(u("noskills not initialized.")),await e.close(),p({exitCode:1});let a=await A(),o=[];for(let i of n){let f=await x(r,i);if(f===null&&(f=a.find(h=>h.id===i)??null,f!==null&&await P(r,f)),f===null){e.writeln(u(`Unknown concern: ${i}`)),e.writeln(c(` Available: ${a.map(h=>h.id).join(", ")}`));continue}if(t.concerns.includes(i)||o.includes(i)){e.writeln(c(`Concern "${i}" is already active.`));continue}o.push(i)}if(o.length>0){let i={...t,concerns:[...t.concerns,...o]};await y(r,i),e.writeln(C("\u2714"),` Activated concerns: ${o.join(", ")}`)}return await e.close(),l(void 0)},M=async s=>{let e=m({renderer:g.ansi(),sink:w.stdout()}),r=v.process.cwd(),n=s?.[0],t=await k(r);if(n===void 0||n.length===0)return e.writeln(u("Please provide a concern ID: "),d(b("concern remove move-fast"))),await e.close(),p({exitCode:1});if(t===null)return e.writeln(u("noskills not initialized.")),await e.close(),p({exitCode:1});if(!t.concerns.includes(n))return e.writeln(c(`Concern "${n}" is not active.`)),await e.close(),l(void 0);let a={...t,concerns:t.concerns.filter(o=>o!==n)};return await y(r,a),e.writeln(C("\u2714")," Deactivated concern: ",d(n)),await e.close(),l(void 0)},R=async()=>{let s=m({renderer:g.ansi(),sink:w.stdout()}),e=v.process.cwd(),r=await k(e),n=await A(),t=r?.concerns??[];if(s.writeln(d("Concerns")),s.writeln(""),n.length===0)s.writeln(c(" No concerns defined."));else for(let a of n){let o=t.includes(a.id);s.writeln(" ",o?C("\u25CF"):c("\u25CB")," ",o?d(a.id):c(a.id),c(` ${a.description.slice(0,60)}...`))}return await s.close(),l(void 0)};export{q as main};
1
+ import{b as A}from"./chunk-MRZT23BL.js";import{b as $,c as b}from"./chunk-YK6UG66R.js";import{l as k,m as y,n as x,o as P}from"./chunk-QYMX2GR3.js";import{c as d,d as c,f as u,g as C,o as m,q as w,r as g}from"./chunk-Y6AFIAJP.js";import{a as l,b as p}from"./chunk-2N4GTHXQ.js";import{b as v}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var q=async s=>{let e=s?.[0];if(e==="add")return await I(s?.slice(1));if(e==="remove")return await M(s?.slice(1));if(e==="list")return await R();let r=$(),n=m({renderer:g.ansi(),sink:w.stdout()});return n.writeln(`Usage: ${r} concern <add <id> | remove <id> | list>`),await n.close(),l(void 0)},I=async s=>{let e=m({renderer:g.ansi(),sink:w.stdout()}),r=v.process.cwd(),n=(s??[]).filter(i=>!i.startsWith("-")),t=await k(r);if(n.length===0)return e.writeln(u("Please provide concern ID(s): "),d(b("concern add open-source beautiful-product"))),await e.close(),p({exitCode:1});if(t===null)return e.writeln(u("noskills not initialized.")),await e.close(),p({exitCode:1});let a=await A(),o=[];for(let i of n){let f=await x(r,i);if(f===null&&(f=a.find(h=>h.id===i)??null,f!==null&&await P(r,f)),f===null){e.writeln(u(`Unknown concern: ${i}`)),e.writeln(c(` Available: ${a.map(h=>h.id).join(", ")}`));continue}if(t.concerns.includes(i)||o.includes(i)){e.writeln(c(`Concern "${i}" is already active.`));continue}o.push(i)}if(o.length>0){let i={...t,concerns:[...t.concerns,...o]};await y(r,i),e.writeln(C("\u2714"),` Activated concerns: ${o.join(", ")}`)}return await e.close(),l(void 0)},M=async s=>{let e=m({renderer:g.ansi(),sink:w.stdout()}),r=v.process.cwd(),n=s?.[0],t=await k(r);if(n===void 0||n.length===0)return e.writeln(u("Please provide a concern ID: "),d(b("concern remove move-fast"))),await e.close(),p({exitCode:1});if(t===null)return e.writeln(u("noskills not initialized.")),await e.close(),p({exitCode:1});if(!t.concerns.includes(n))return e.writeln(c(`Concern "${n}" is not active.`)),await e.close(),l(void 0);let a={...t,concerns:t.concerns.filter(o=>o!==n)};return await y(r,a),e.writeln(C("\u2714")," Deactivated concern: ",d(n)),await e.close(),l(void 0)},R=async()=>{let s=m({renderer:g.ansi(),sink:w.stdout()}),e=v.process.cwd(),r=await k(e),n=await A(),t=r?.concerns??[];if(s.writeln(d("Concerns")),s.writeln(""),n.length===0)s.writeln(c(" No concerns defined."));else for(let a of n){let o=t.includes(a.id);s.writeln(" ",o?C("\u25CF"):c("\u25CB")," ",o?d(a.id):c(a.id),c(` ${a.description.slice(0,60)}...`))}return await s.close(),l(void 0)};export{q as main};
@@ -1 +1 @@
1
- import{a as x,d as D}from"./chunk-3SLKOP72.js";import{c as $}from"./chunk-YK6UG66R.js";import{m as k}from"./chunk-TMC5H2A5.js";import{d as S,f as g,h as C,i as y,j as E}from"./chunk-LWCWPXCS.js";import{c as m,d as o,f as a,g as u,o as w,q as f,r as h}from"./chunk-Y6AFIAJP.js";import{a as d,b as n}from"./chunk-2N4GTHXQ.js";import{b as l}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var G=async U=>{let e=w({renderer:h.ansi(),sink:f.stdout()}),i=l.process.cwd(),p=C(U);if(!p.ok)return e.writeln(a(p.error)),await e.close(),n({exitCode:1});let t;try{t=await g(i,p.spec)}catch(s){let c=s instanceof Error?s.message:String(s);return e.writeln(a(c)),await e.close(),n({exitCode:1})}if(t.phase!=="EXECUTING")return e.writeln(a(`Cannot complete in phase: ${t.phase}`)),e.writeln(o("Only EXECUTING phase can transition to COMPLETED.")),await e.close(),n({exitCode:1});if(t.spec!==null){let s=`${i}/${S.specDir(t.spec)}`;try{await l.fs.stat(s)}catch{return e.writeln(a(`Active spec '${t.spec}' directory not found.`)),e.writeln(o("Run `noskills reset` to return to IDLE.")),await e.close(),n({exitCode:1})}}let r=k(t,"done");if(await y(i,r),r.spec!==null&&await E(i,r.spec,r),r.spec!==null&&(await x(i,r.spec,"completed"),await D(i,r.spec,"completed")),e.writeln(u("\u2714")," Spec completed!"),e.writeln(""),e.writeln(" Spec: ",m(t.spec??"unknown")),e.writeln(` Iterations: ${t.execution.iteration}`),e.writeln(` Decisions: ${t.decisions.length}`),t.decisions.length>0){let s=t.decisions.filter(c=>c.promoted);s.length>0&&e.writeln(o(` Promoted to rules: ${s.length}`))}return e.writeln(""),e.writeln("Start a new spec with: ",m(`${$('spec new "..."')}`)),await e.close(),d(void 0)};export{G as main};
1
+ import{a as x,d as D}from"./chunk-6FTHIS2Z.js";import{c as $}from"./chunk-YK6UG66R.js";import{n as k}from"./chunk-FJCXMC2D.js";import{d as S,f as g,h as C,i as y,j as E}from"./chunk-QYMX2GR3.js";import{c as m,d as o,f as a,g as u,o as w,q as f,r as h}from"./chunk-Y6AFIAJP.js";import{a as d,b as n}from"./chunk-2N4GTHXQ.js";import{b as l}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var G=async U=>{let e=w({renderer:h.ansi(),sink:f.stdout()}),i=l.process.cwd(),p=C(U);if(!p.ok)return e.writeln(a(p.error)),await e.close(),n({exitCode:1});let t;try{t=await g(i,p.spec)}catch(s){let c=s instanceof Error?s.message:String(s);return e.writeln(a(c)),await e.close(),n({exitCode:1})}if(t.phase!=="EXECUTING")return e.writeln(a(`Cannot complete in phase: ${t.phase}`)),e.writeln(o("Only EXECUTING phase can transition to COMPLETED.")),await e.close(),n({exitCode:1});if(t.spec!==null){let s=`${i}/${S.specDir(t.spec)}`;try{await l.fs.stat(s)}catch{return e.writeln(a(`Active spec '${t.spec}' directory not found.`)),e.writeln(o("Run `noskills reset` to return to IDLE.")),await e.close(),n({exitCode:1})}}let r=k(t,"done");if(await y(i,r),r.spec!==null&&await E(i,r.spec,r),r.spec!==null&&(await x(i,r.spec,"completed"),await D(i,r.spec,"completed")),e.writeln(u("\u2714")," Spec completed!"),e.writeln(""),e.writeln(" Spec: ",m(t.spec??"unknown")),e.writeln(` Iterations: ${t.execution.iteration}`),e.writeln(` Decisions: ${t.decisions.length}`),t.decisions.length>0){let s=t.decisions.filter(c=>c.promoted);s.length>0&&e.writeln(o(` Promoted to rules: ${s.length}`))}return e.writeln(""),e.writeln("Start a new spec with: ",m(`${$('spec new "..."')}`)),await e.close(),d(void 0)};export{G as main};
@@ -1 +1 @@
1
- import{c}from"./chunk-YK6UG66R.js";import{c as x,d as g}from"./chunk-TMC5H2A5.js";import{e as E,i as p}from"./chunk-LWCWPXCS.js";import{c as o,d as m,f as n,g as l,o as f,q as u,r as h}from"./chunk-Y6AFIAJP.js";import{a as i,b as r}from"./chunk-2N4GTHXQ.js";import{b as w}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var b=async d=>{let e=f({renderer:h.ansi(),sink:u.stdout()}),a=w.process.cwd(),S=d!==void 0&&d.some(s=>s==="--exit"),t;try{t=await E(a)}catch(s){let y=s instanceof Error?s.message:String(s);return e.writeln(n(y)),await e.close(),r({exitCode:1})}if(S){if(t.phase!=="FREE")return e.writeln(n(`Cannot exit free mode in phase: ${t.phase}`)),e.writeln(m("Only FREE phase can transition back to IDLE.")),await e.close(),r({exitCode:1});let s=g(t);return await p(a,s),e.writeln(l("\u2714")," Exited free mode. Back to IDLE."),e.writeln(""),e.writeln("Start a spec with: ",o(`${c('spec new "..."')}`)),await e.close(),i(void 0)}if(t.phase!=="IDLE")return e.writeln(n(`Cannot enter free mode in phase: ${t.phase}`)),e.writeln(m("Only IDLE phase can transition to FREE.")),await e.close(),r({exitCode:1});let k=x(t);return await p(a,k),e.writeln(l("\u2714")," Free mode active \u2014 no enforcement."),e.writeln(""),e.writeln("Exit free mode with: ",o(`${c("free --exit")}`)),await e.close(),i(void 0)};export{b as main};
1
+ import{c}from"./chunk-YK6UG66R.js";import{c as x,d as g}from"./chunk-FJCXMC2D.js";import{e as E,i as p}from"./chunk-QYMX2GR3.js";import{c as o,d as m,f as n,g as l,o as f,q as u,r as h}from"./chunk-Y6AFIAJP.js";import{a as i,b as r}from"./chunk-2N4GTHXQ.js";import{b as w}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var b=async d=>{let e=f({renderer:h.ansi(),sink:u.stdout()}),a=w.process.cwd(),S=d!==void 0&&d.some(s=>s==="--exit"),t;try{t=await E(a)}catch(s){let y=s instanceof Error?s.message:String(s);return e.writeln(n(y)),await e.close(),r({exitCode:1})}if(S){if(t.phase!=="FREE")return e.writeln(n(`Cannot exit free mode in phase: ${t.phase}`)),e.writeln(m("Only FREE phase can transition back to IDLE.")),await e.close(),r({exitCode:1});let s=g(t);return await p(a,s),e.writeln(l("\u2714")," Exited free mode. Back to IDLE."),e.writeln(""),e.writeln("Start a spec with: ",o(`${c('spec new "..."')}`)),await e.close(),i(void 0)}if(t.phase!=="IDLE")return e.writeln(n(`Cannot enter free mode in phase: ${t.phase}`)),e.writeln(m("Only IDLE phase can transition to FREE.")),await e.close(),r({exitCode:1});let k=x(t);return await p(a,k),e.writeln(l("\u2714")," Free mode active \u2014 no enforcement."),e.writeln(""),e.writeln("Exit free mode with: ",o(`${c("free --exit")}`)),await e.close(),i(void 0)};export{b as main};
@@ -1 +1 @@
1
- import{a as T,b as J,e as B,f as N,g as q,h as G,i as U,j as h,k as r,l as y}from"./chunk-73EEM3FY.js";import{a as ie,b as ne,c as re}from"./chunk-VK7L5SMS.js";import{d as Z}from"./chunk-7GUYMD3Z.js";import{a as ee,b as te,c as oe}from"./chunk-ZMVD5IU4.js";import{b as I}from"./chunk-MRZT23BL.js";import"./chunk-7UX6WIXX.js";import{d as se}from"./chunk-TJZAIUKM.js";import{a as X,c as A,d as Y}from"./chunk-YK6UG66R.js";import{a as W,b as z,i as H,m as _,o as K,q as V,s as Q}from"./chunk-LWCWPXCS.js";import"./chunk-AGPCY6XP.js";import{a as k}from"./chunk-ERX4HONR.js";import"./chunk-Y6AFIAJP.js";import"./chunk-5MN3MWQN.js";import"./chunk-OLM5RTFK.js";import{a as F}from"./chunk-ALZM4JXG.js";import{a as S}from"./chunk-2N4GTHXQ.js";import"./chunk-BBKSV2RO.js";import{b as g}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var he=new F({description:"AI provider interface \u2014 ask questions, generate content",modules:{ask:{description:"Send a prompt to an AI provider",load:()=>import("./ask-F4XM2EEC.js")},list:{description:"List available AI providers",load:()=>import("./list-3RK7TPGG.js")}}});var ae=k;var ve=async t=>{try{return await g.fs.stat(t),!0}catch{return!1}},we=[{id:"claude-code",paths:["CLAUDE.md",".claude"]},{id:"cursor",paths:[".cursorrules",".cursor"]},{id:"kiro",paths:[".kiro"]},{id:"copilot",paths:[".github/copilot-instructions.md"]},{id:"windsurf",paths:[".windsurfrules"]},{id:"codex",paths:[".codex",".codex/config.toml"]},{id:"copilot-cli",paths:[".copilot",".github/hooks"]}],le=async t=>{let e=[];for(let i of we)for(let o of i.paths)if(await ve(`${t}/${o}`)){e.push(i.id);break}return e};var a=async t=>{try{return await g.fs.stat(t),!0}catch{return!1}},ce=async(t,e)=>{try{let i=await g.fs.readTextFile(t);return JSON.parse(i)[e]??null}catch{return null}},xe=async t=>{let e=[];return(await a(`${t}/package.json`)||await a(`${t}/deno.json`))&&e.push("typescript"),await a(`${t}/go.mod`)&&e.push("go"),await a(`${t}/Cargo.toml`)&&e.push("rust"),(await a(`${t}/pyproject.toml`)||await a(`${t}/setup.py`))&&e.push("python"),e},Pe=async t=>{let e=[],i=await ce(`${t}/package.json`,"dependencies");return i!==null&&("react"in i&&e.push("react"),"vue"in i&&e.push("vue"),"svelte"in i&&e.push("svelte"),"next"in i&&e.push("nextjs"),"express"in i&&e.push("express"),"hono"in i&&e.push("hono")),e},Se=async t=>{let e=[];return await a(`${t}/.github/workflows`)&&e.push("github-actions"),await a(`${t}/.gitlab-ci.yml`)&&e.push("gitlab-ci"),await a(`${t}/Jenkinsfile`)&&e.push("jenkins"),await a(`${t}/.circleci`)&&e.push("circleci"),e},Te=async t=>{if(await a(`${t}/deno.json`))return"deno";let e=await ce(`${t}/package.json`,"devDependencies");if(e!==null){if("vitest"in e)return"vitest";if("jest"in e)return"jest";if("playwright"in e)return"playwright"}return null},de=async t=>{let[e,i,o,d]=await Promise.all([xe(t),Pe(t),Se(t),Te(t)]);return{languages:e,frameworks:i,ci:o,testRunner:d}};var It=async t=>{let e=g.process.cwd(),i=ne(t),o=J({target:i==="agent"?"non-interactive":"interactive"}),d=re(t),b=pe(d,"--concerns"),f=pe(d,"--tools"),p=d.includes("--non-interactive")||i==="agent";if(await Q(e))return r.warn(o,"noskills is already initialized in this project."),r.info(o,`Run \`${A("sync")}\` to regenerate tool files.`),S(void 0);N(o,"noskills init");let D=y(o,"Scanning project...");D.start();let m=await de(e);D.succeed("Project scanned");for(let s of m.languages)r.step(o,` ${s}`);for(let s of m.frameworks)r.step(o,` ${s}`);for(let s of m.ci)r.step(o,` ${s}`);m.testRunner!==null&&r.step(o,` test runner: ${m.testRunner}`),h(o);let R=y(o,"Detecting coding tools...");R.start();let $=await le(e),v=ie(),E=v!==null&&!$.includes(v)?[v]:[],w=[...new Set([...E,...$])];R.succeed(`${w.length} coding tool(s) detected`);for(let s of w){let n=s===v?" (current)":"";r.step(o,` ${s}${n}`)}let u;if(f!==null){let s=["claude-code","cursor","kiro","copilot","windsurf","opencode","codex","copilot-cli"],n=f.filter(c=>s.includes(c));u=[...new Set([...E,...n])]}else p?u=[...w]:(h(o),u=await Ie(o,w,v));h(o);let M=y(o,"Detecting AI providers...");M.start();let x=(await ae()).filter(s=>s.available).map(s=>s.name);M.succeed(`${x.length} provider(s) detected`),h(o);let P=await I(),l;if(b!==null){let s=P.map(n=>n.id);l=b.filter(n=>s.includes(n)).sort((n,c)=>s.indexOf(n)-s.indexOf(c))}else if(p)l=[];else{let s=P.map(c=>({value:c.id,label:c.name,hint:c.description.slice(0,60)})),n=await B(o,{message:"What kind of project is this? (space to toggle, enter to confirm)",options:s});l=T(n)?[]:[...n]}l.length>0?r.success(o,` Concerns: ${l.join(", ")}`):r.info(o,"No concerns selected. Add later with `concern add <id> [<id2> ...]`."),h(o);let j=y(o,"Initializing...");j.start(),await V(e);let ue=P.filter(s=>l.includes(s.id));for(let s of ue)await K(e,s);let L=await Y();X(L);let C={...z(l,u,x,m),command:L};await _(e,C);let O=W();if(await H(e,O),j.succeed("Scaffolded `.eser/`"),u.length>0){let s=y(o,"Syncing tool files...");s.start();let n=await oe(e,u,C);s.succeed(`Synced ${n.length} tool(s)`)}else r.warn(o,"No tools selected. noskills will work in agentless CLI mode only."),r.info(o,"Add tools later with `noskills sync`.");if(q(o,`Done. ${u.length} tool(s), ${x.length} provider(s), ${l.length} concern(s).`),i==="agent"){let n=(await I()).filter(me=>l.includes(me.id)),c=await ee(e),ge=te(C?.tools??[]),fe=Z(O,n,c,C,void 0,void 0,void 0,ge);await se(fe,"json")}else G(o),U(o,`Start a spec with: ${A('spec new "..."')}`);return S(void 0)},ke=[{value:"claude-code",label:"Claude Code"},{value:"cursor",label:"Cursor"},{value:"kiro",label:"Kiro"},{value:"copilot",label:"GitHub Copilot"},{value:"windsurf",label:"Windsurf"},{value:"opencode",label:"OpenCode"},{value:"codex",label:"Codex CLI"},{value:"copilot-cli",label:"Copilot CLI"}],Ie=async(t,e,i)=>{let o=e.length===0?"No coding tools detected. Which tools do you use? (space to toggle)":"Any additional tools? (space to toggle, enter to skip)",d=new Set(e),b=await B(t,{message:o,options:ke.map(p=>({...p,hint:p.value===i?"you're running inside it":d.has(p.value)?"detected":void 0,disabled:p.value===i})),initialValues:[...e],required:!1});if(T(b))return[...e];let f=[...b];return i!==null&&!f.includes(i)&&f.unshift(i),f},pe=(t,e)=>{if(t===void 0)return null;for(let i of t)if(i.startsWith(`${e}=`))return i.slice(e.length+1).split(",").map(o=>o.trim()).filter(Boolean);return null};export{It as main};
1
+ import{a as T,b as J,h as B,i as N,j as q,k as G,l as U,m as h,n as r,o as y}from"./chunk-IZ4J7VRF.js";import{a as ie,b as ne,c as re}from"./chunk-VK7L5SMS.js";import{d as Z}from"./chunk-QMZBEPES.js";import{c as ee,d as te,e as oe}from"./chunk-OV7ZXBXC.js";import"./chunk-7UX6WIXX.js";import{b as I}from"./chunk-MRZT23BL.js";import{d as se}from"./chunk-TJZAIUKM.js";import{a as X,c as A,d as Y}from"./chunk-YK6UG66R.js";import{A as Q,a as W,b as z,i as H,m as _,o as K,q as V}from"./chunk-QYMX2GR3.js";import"./chunk-AGPCY6XP.js";import{a as k}from"./chunk-TIGKFDKY.js";import"./chunk-Y6AFIAJP.js";import"./chunk-5MN3MWQN.js";import"./chunk-OLM5RTFK.js";import{a as F}from"./chunk-XYJXQHQN.js";import{a as S}from"./chunk-2N4GTHXQ.js";import"./chunk-FEHZCASN.js";import{b as g}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var he=new F({description:"AI provider interface \u2014 ask questions, generate content",modules:{ask:{description:"Send a prompt to an AI provider",load:()=>import("./ask-SWMI6GK2.js")},list:{description:"List available AI providers",load:()=>import("./list-B5YTFNLR.js")}}});var ae=k;var ve=async t=>{try{return await g.fs.stat(t),!0}catch{return!1}},we=[{id:"claude-code",paths:["CLAUDE.md",".claude"]},{id:"cursor",paths:[".cursorrules",".cursor"]},{id:"kiro",paths:[".kiro"]},{id:"copilot",paths:[".github/copilot-instructions.md"]},{id:"windsurf",paths:[".windsurfrules"]},{id:"codex",paths:[".codex",".codex/config.toml"]},{id:"copilot-cli",paths:[".copilot",".github/hooks"]}],le=async t=>{let e=[];for(let i of we)for(let o of i.paths)if(await ve(`${t}/${o}`)){e.push(i.id);break}return e};var a=async t=>{try{return await g.fs.stat(t),!0}catch{return!1}},ce=async(t,e)=>{try{let i=await g.fs.readTextFile(t);return JSON.parse(i)[e]??null}catch{return null}},xe=async t=>{let e=[];return(await a(`${t}/package.json`)||await a(`${t}/deno.json`))&&e.push("typescript"),await a(`${t}/go.mod`)&&e.push("go"),await a(`${t}/Cargo.toml`)&&e.push("rust"),(await a(`${t}/pyproject.toml`)||await a(`${t}/setup.py`))&&e.push("python"),e},Pe=async t=>{let e=[],i=await ce(`${t}/package.json`,"dependencies");return i!==null&&("react"in i&&e.push("react"),"vue"in i&&e.push("vue"),"svelte"in i&&e.push("svelte"),"next"in i&&e.push("nextjs"),"express"in i&&e.push("express"),"hono"in i&&e.push("hono")),e},Se=async t=>{let e=[];return await a(`${t}/.github/workflows`)&&e.push("github-actions"),await a(`${t}/.gitlab-ci.yml`)&&e.push("gitlab-ci"),await a(`${t}/Jenkinsfile`)&&e.push("jenkins"),await a(`${t}/.circleci`)&&e.push("circleci"),e},Te=async t=>{if(await a(`${t}/deno.json`))return"deno";let e=await ce(`${t}/package.json`,"devDependencies");if(e!==null){if("vitest"in e)return"vitest";if("jest"in e)return"jest";if("playwright"in e)return"playwright"}return null},de=async t=>{let[e,i,o,d]=await Promise.all([xe(t),Pe(t),Se(t),Te(t)]);return{languages:e,frameworks:i,ci:o,testRunner:d}};var It=async t=>{let e=g.process.cwd(),i=ne(t),o=J({target:i==="agent"?"non-interactive":"interactive"}),d=re(t),b=pe(d,"--concerns"),f=pe(d,"--tools"),p=d.includes("--non-interactive")||i==="agent";if(await Q(e))return r.warn(o,"noskills is already initialized in this project."),r.info(o,`Run \`${A("sync")}\` to regenerate tool files.`),S(void 0);N(o,"noskills init");let D=y(o,"Scanning project...");D.start();let m=await de(e);D.succeed("Project scanned");for(let s of m.languages)r.step(o,` ${s}`);for(let s of m.frameworks)r.step(o,` ${s}`);for(let s of m.ci)r.step(o,` ${s}`);m.testRunner!==null&&r.step(o,` test runner: ${m.testRunner}`),h(o);let R=y(o,"Detecting coding tools...");R.start();let $=await le(e),v=ie(),E=v!==null&&!$.includes(v)?[v]:[],w=[...new Set([...E,...$])];R.succeed(`${w.length} coding tool(s) detected`);for(let s of w){let n=s===v?" (current)":"";r.step(o,` ${s}${n}`)}let u;if(f!==null){let s=["claude-code","cursor","kiro","copilot","windsurf","opencode","codex","copilot-cli"],n=f.filter(c=>s.includes(c));u=[...new Set([...E,...n])]}else p?u=[...w]:(h(o),u=await Ie(o,w,v));h(o);let M=y(o,"Detecting AI providers...");M.start();let x=(await ae()).filter(s=>s.available).map(s=>s.name);M.succeed(`${x.length} provider(s) detected`),h(o);let P=await I(),l;if(b!==null){let s=P.map(n=>n.id);l=b.filter(n=>s.includes(n)).sort((n,c)=>s.indexOf(n)-s.indexOf(c))}else if(p)l=[];else{let s=P.map(c=>({value:c.id,label:c.name,hint:c.description.slice(0,60)})),n=await B(o,{message:"What kind of project is this? (space to toggle, enter to confirm)",options:s});l=T(n)?[]:[...n]}l.length>0?r.success(o,` Concerns: ${l.join(", ")}`):r.info(o,"No concerns selected. Add later with `concern add <id> [<id2> ...]`."),h(o);let j=y(o,"Initializing...");j.start(),await V(e);let ue=P.filter(s=>l.includes(s.id));for(let s of ue)await K(e,s);let L=await Y();X(L);let C={...z(l,u,x,m),command:L};await _(e,C);let O=W();if(await H(e,O),j.succeed("Scaffolded `.eser/`"),u.length>0){let s=y(o,"Syncing tool files...");s.start();let n=await oe(e,u,C);s.succeed(`Synced ${n.length} tool(s)`)}else r.warn(o,"No tools selected. noskills will work in agentless CLI mode only."),r.info(o,"Add tools later with `noskills sync`.");if(q(o,`Done. ${u.length} tool(s), ${x.length} provider(s), ${l.length} concern(s).`),i==="agent"){let n=(await I()).filter(me=>l.includes(me.id)),c=await ee(e),ge=te(C?.tools??[]),fe=Z(O,n,c,C,void 0,void 0,void 0,ge);await se(fe,"json")}else G(o),U(o,`Start a spec with: ${A('spec new "..."')}`);return S(void 0)},ke=[{value:"claude-code",label:"Claude Code"},{value:"cursor",label:"Cursor"},{value:"kiro",label:"Kiro"},{value:"copilot",label:"GitHub Copilot"},{value:"windsurf",label:"Windsurf"},{value:"opencode",label:"OpenCode"},{value:"codex",label:"Codex CLI"},{value:"copilot-cli",label:"Copilot CLI"}],Ie=async(t,e,i)=>{let o=e.length===0?"No coding tools detected. Which tools do you use? (space to toggle)":"Any additional tools? (space to toggle, enter to skip)",d=new Set(e),b=await B(t,{message:o,options:ke.map(p=>({...p,hint:p.value===i?"you're running inside it":d.has(p.value)?"detected":void 0,disabled:p.value===i})),initialValues:[...e],required:!1});if(T(b))return[...e];let f=[...b];return i!==null&&!f.includes(i)&&f.unshift(i),f},pe=(t,e)=>{if(t===void 0)return null;for(let i of t)if(i.startsWith(`${e}=`))return i.slice(e.length+1).split(",").map(o=>o.trim()).filter(Boolean);return null};export{It as main};
@@ -0,0 +1,11 @@
1
+ import{d as F}from"./chunk-QMZBEPES.js";import{c as A,d as _}from"./chunk-OV7ZXBXC.js";import"./chunk-7UX6WIXX.js";import"./chunk-MRZT23BL.js";import{c as m}from"./chunk-YK6UG66R.js";import{A as P,d as g,e as D,f as b,l as E,p as $,t as x,u as N}from"./chunk-QYMX2GR3.js";import{a as l}from"./chunk-2N4GTHXQ.js";import{b as a}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var L=new Set(["log","diff","status","show","blame","rev-parse","ls-files","ls-tree","cat-file","describe","shortlog","name-rev","for-each-ref","rev-list","help","version"]),I=new Map([["branch",new Set(["","--list","-l","-a","--all","-r","--remotes","-v","--verbose","--contains","--no-contains","--merged","--no-merged"])],["tag",new Set(["","-l","--list","-v","--verify","-n"])],["stash",new Set(["list","show"])],["remote",new Set(["","-v","--verbose","show","get-url"])],["config",new Set(["--get","--get-all","--get-regexp","--list","-l","--global","--local","--system"])],["reflog",new Set(["","show"])]]),S=e=>{let s=e.trim();if(!s.startsWith("git"))return!0;let t=s.slice(3).trim();if(t.length===0)return!0;let i=t.split(/\s+/),r=i[0]??"";if(L.has(r))return!0;let n=I.get(r);if(n!==void 0){let o=i[1]??"";if(n.has(o))return!0}return!1};var G=e=>{let s=[/(?:bash|sh|\/bin\/bash|\/bin\/sh)\s+-c\s+["'](.+?)["']/g,/(?:bash|sh|\/bin\/bash|\/bin\/sh)\s+-c\s+(\S+)/g,/eval\s+["'](.+?)["']/g];for(let r of s){let n;for(;(n=r.exec(e))!==null;){let o=n[1]??"";if(o.includes("git")&&!S(o))return!0}}let t=e.split(/\s*\|\s*/);for(let r of t){let n=r.trim();if(n.startsWith("git")&&!S(n))return!0}let i=e.matchAll(/\bgit\s+([\w-]+)/g);for(let r of i){let n=r[1]??"";if(!L.has(n)&&!I.has(n))return!0;if(I.has(n)){let o=r.index??0,p=e.slice(o);if(!S(p.split(/[;&|$)`]/)[0]??""))return!0}}return!1};var R=async()=>{let e=a.process.stdin.getReader(),s=[];try{for(;;){let{done:n,value:o}=await e.read();if(n||o===void 0)break;s.push(o)}}finally{e.releaseLock()}let t=0,i=new Uint8Array(s.reduce((n,o)=>n+o.length,0));for(let n of s)i.set(n,t),t+=n.length;let r=new TextDecoder().decode(i);try{return JSON.parse(r)}catch{return{}}},M=async e=>{let s=new TextEncoder,t=a.process.stdout.getWriter();await t.write(s.encode(JSON.stringify(e))),t.releaseLock()},ee=async e=>{switch(e?.[0]){case"pre-tool-use":return await B();case"stop":return await Y();case"post-file-write":return await J();case"post-bash":return await K();case"session-start":return await j();default:return l(void 0)}},v=async e=>{await M({hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:`noskills: ${e}`}})},W=(e,s)=>{if(s||!e.includes("git"))return null;let t=e.split(/\s*(?:&&|;)\s*/);for(let i of t){let r=i.trim();if(r.startsWith("git")&&!S(r))return"Git write operations are not allowed. Only read commands (log, diff, status, show, blame, branch, tag) are permitted. The user controls git, the agent controls files."}return G(e)?"Git write operations detected in subshell or pipe. Only read commands are permitted. The user controls git, the agent controls files.":null},B=async()=>{let e=await R(),s=e.tool_name??"unknown",t=e.tool_input??{},i=e.cwd??a.process.cwd(),r=await E(i),n=a.env.get("NOSKILLS_SESSION")??null;if(n!==null){let c=await x(i,n);if(c!==null&&c.mode==="free"){if(s==="Bash"){let u=(t.command??"").trim(),d=r?.allowGit??!1;if(!d&&u.includes("git")){let h=W(u,d);if(h!==null)return await v(h),l(void 0)}}return l(void 0)}}let o={};if(n!==null){let c=await x(i,n);if(c!==null&&c.mode==="spec"&&c.phase!==null)o={phase:c.phase};else if(c!==null&&c.spec!==null)try{o=await b(i,c.spec)}catch{return l(void 0)}else return l(void 0)}else{let c=await N(i);if(c.length>0){let u={DISCOVERY:10,DISCOVERY_REVIEW:10,SPEC_DRAFT:10,SPEC_APPROVED:8,BLOCKED:8,EXECUTING:2,FREE:0,IDLE:0,COMPLETED:0},d="IDLE",h=0;for(let U of c){let C=U.phase??"IDLE",T=u[C]??0;T>h&&(h=T,d=C)}o={phase:d};let y=new TextEncoder,O=a.process.stderr.getWriter();await O.write(y.encode(`noskills: WARNING \u2014 ${c.length} session(s) active but NOSKILLS_SESSION not set. Using most restrictive phase (${d}). Set NOSKILLS_SESSION for correct per-instance enforcement.
2
+ `)),O.releaseLock()}else try{o=await D(i)}catch{return l(void 0)}}if(s==="Bash"){let c=(t.command??"").trim(),u=r?.allowGit??!1,d=W(c,u);return d!==null?(await v(d),l(void 0)):l(void 0)}let p=["Write","Edit","MultiEdit"];if(!p.includes(s))return l(void 0);let w=t.file_path??t.path??"";if(w.includes(".eser/")||w.includes(".claude/"))return l(void 0);let f=o.phase??"UNKNOWN";if(f==="EXECUTING"||f==="IDLE"||f==="FREE"||f==="COMPLETED"||f==="UNKNOWN"){if(f==="EXECUTING"&&p.includes(s)){let c=`${i}/${g.stateDir}/executor-warned.flag`;try{await a.fs.readTextFile(c)}catch{try{await a.fs.mkdir(`${i}/${g.stateDir}`,{recursive:!0}),await a.fs.writeTextFile(c,new Date().toISOString());let u=new TextEncoder,d=a.process.stderr.getWriter();await d.write(u.encode(`noskills: REMINDER \u2014 You should be spawning a noskills-executor sub-agent for implementation work. If you're the main orchestrator agent, delegate to a sub-agent instead of editing directly. If you ARE a sub-agent, ignore this message and continue.
3
+ `)),d.releaseLock()}catch{}}}return l(void 0)}let k={DISCOVERY:`You are in DISCOVERY \u2014 this is a thinking phase, not an implementation phase. Read and discuss only. To write code, complete discovery and get the spec approved first. Run \`${m("next")}\` to continue.`,DISCOVERY_REVIEW:`You are in DISCOVERY_REVIEW \u2014 this is a thinking phase, not an implementation phase. Read and discuss only. To write code, complete discovery and get the spec approved first. Run \`${m('next --answer="approve"')}\` or revise answers.`,SPEC_DRAFT:`You are in SPEC_DRAFT \u2014 this is a thinking phase, not an implementation phase. Read and discuss only. To write code, approve the spec first. Run \`${m("approve")}\``,SPEC_APPROVED:`You are in SPEC_APPROVED \u2014 start execution first: \`${m('next --answer="start"')}\``,BLOCKED:`Execution blocked. Resolve with \`${m('next --answer="resolution"')}\``};return await v(k[f]??`Run \`${m("next")}\` first.`),l(void 0)},Y=async()=>{let e=await R();if(e.stop_hook_active===!0)return l(void 0);let s=e.cwd??a.process.cwd(),t;try{let u=await a.fs.readTextFile(`${s}/${g.stateFile}`);t=JSON.parse(u)}catch{return l(void 0)}if(t.phase!=="EXECUTING")return l(void 0);let i=t.execution??{},r=`${s}/${g.stateDir}/files-changed.jsonl`,n=[];try{let d=(await a.fs.readTextFile(r)).trim().split(`
4
+ `).filter(Boolean);n=[...new Set(d.map(h=>{try{return JSON.parse(h).file}catch{return null}}).filter(h=>h!==null))]}catch{}let o=[],p="no changes";try{let{execSync:u}=await import("node:child_process");o=u("git diff --name-only",{cwd:s,encoding:"utf-8",timeout:5e3}).trim().split(`
5
+ `).filter(Boolean);let y=u("git diff --stat",{cwd:s,encoding:"utf-8",timeout:5e3}).trim().split(`
6
+ `);p=y[y.length-1]??"no changes"}catch{}let w=[...new Set([...n,...o])],f=(i.iteration??0)+1,k=`${s}/${g.stateDir}/iterations`;try{await a.fs.mkdir(k,{recursive:!0}),await a.fs.writeTextFile(`${k}/iteration-${f}.json`,JSON.stringify({iteration:f,files:w,gitStat:p.trim(),timestamp:new Date().toISOString()},null,2)+`
7
+ `)}catch{}let c=15;try{let u=await E(s);u!==null&&(c=u.maxIterationsBeforeRestart)}catch{}t.execution={...i,iteration:f,modifiedFiles:w,lastProgress:p.trim()||i.lastProgress||null},t.lastCalledAt=new Date().toISOString();try{await a.fs.writeTextFile(`${s}/${g.stateFile}`,JSON.stringify(t,null,2)+`
8
+ `)}catch{}try{await a.fs.writeTextFile(r,"")}catch{}try{await a.fs.remove(`${s}/${g.stateDir}/executor-warned.flag`)}catch{}if(f>=c){let u=new TextEncoder,d=a.process.stderr.getWriter();await d.write(u.encode(`noskills: iteration ${f} reached threshold (${c}). Consider starting a fresh conversation.
9
+ `)),d.releaseLock()}return l(void 0)},J=async()=>{let e=await R(),s=e.tool_input??{},t=s.file_path??s.path??"";if(!t||t.includes(".eser/")||t.includes(".claude/"))return l(void 0);let i=e.cwd??a.process.cwd(),r=`${i}/${g.stateDir}/files-changed.jsonl`,n=JSON.stringify({file:t,tool:e.tool_name,ts:new Date().toISOString()});try{await a.fs.mkdir(`${i}/${g.stateDir}`,{recursive:!0});let o="";try{o=await a.fs.readTextFile(r)}catch{}await a.fs.writeTextFile(r,o+n+`
10
+ `)}catch{}return l(void 0)},K=async()=>{let e=await R(),t=(e.tool_input??{}).command??"";if(!t.includes("noskills"))return l(void 0);let i=e.cwd??a.process.cwd(),r=`${i}/${g.stateDir}/noskills-calls.jsonl`,n=JSON.stringify({command:t,ts:new Date().toISOString()});try{await a.fs.mkdir(`${i}/${g.stateDir}`,{recursive:!0});let o="";try{o=await a.fs.readTextFile(r)}catch{}await a.fs.writeTextFile(r,o+n+`
11
+ `)}catch{}return l(void 0)},j=async()=>{let e=a.process.cwd();if(!await P(e))return l(void 0);let s=await D(e),t=await E(e),r=(await $(e)).filter(w=>t!==null&&t.concerns.includes(w.id)),n=await A(e),o=_(t?.tools??[]),p=F(s,r,n,t,void 0,void 0,void 0,o);return await M(p),l(void 0)};export{ee as main};
@@ -1,3 +1,3 @@
1
- import{a as S,b as g,d as T,e as m,f,g as y}from"./chunk-7QFOEK3I.js";import{a as l}from"./chunk-OLM5RTFK.js";import"./chunk-BBKSV2RO.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var k=class{capabilities=["text_generation","streaming"];provider="kiro";modelId;binary;config;constructor(e,r){this.binary=e,this.config=r,this.modelId=r.model}async generateText(e,r){let o=v(this.config,e),c=y(e.messages,e.system);o.push("--prompt",c);let s=g(this.binary,o,{signal:r}),u=m(s.stderr),t=await T(s.stdout,this.modelId),d=await s.waitForExit(),i=await u,a=f("kiro",d.code,i);if(a!==null)throw a;return t}async*streamText(e,r){let o=v(this.config,e),c=y(e.messages,e.system);o.push("--prompt",c);let s=g(this.binary,o,{signal:r}),u=m(s.stderr);try{let t=new TextDecoder,d=s.stdout.getReader(),i="",a=await d.read();for(;a.done!==!0;){i+=t.decode(a.value,{stream:!0});let x=i.split(`
1
+ import{a as S,b as g,d as T,e as m,f,g as y}from"./chunk-XRKWQJMC.js";import{a as l}from"./chunk-OLM5RTFK.js";import"./chunk-FEHZCASN.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var k=class{capabilities=["text_generation","streaming"];provider="kiro";modelId;binary;config;constructor(e,r){this.binary=e,this.config=r,this.modelId=r.model}async generateText(e,r){let o=v(this.config,e),c=y(e.messages,e.system);o.push("--prompt",c);let s=g(this.binary,o,{signal:r}),u=m(s.stderr),t=await T(s.stdout,this.modelId),d=await s.waitForExit(),i=await u,a=f("kiro",d.code,i);if(a!==null)throw a;return t}async*streamText(e,r){let o=v(this.config,e),c=y(e.messages,e.system);o.push("--prompt",c);let s=g(this.binary,o,{signal:r}),u=m(s.stderr);try{let t=new TextDecoder,d=s.stdout.getReader(),i="",a=await d.read();for(;a.done!==!0;){i+=t.decode(a.value,{stream:!0});let x=i.split(`
2
2
  `);i=x.pop()??"";for(let _ of x){let p=_.trim();if(p.length!==0){try{let A=JSON.parse(p),w=C(A);if(w!==null){yield w;continue}}catch{}yield{kind:"content_delta",textDelta:p+`
3
3
  `}}}a=await d.read()}d.releaseLock(),i.trim().length>0&&(yield{kind:"content_delta",textDelta:i.trim()});let E=await s.waitForExit(),b=await u,h=f("kiro",E.code,b);h!==null?yield{kind:"error",error:h}:yield{kind:"message_done",stopReason:"end_turn",usage:{inputTokens:0,outputTokens:0,totalTokens:0}}}catch(t){t instanceof l?yield{kind:"error",error:t}:yield{kind:"error",error:new l(t instanceof Error?t.message:String(t),{provider:"kiro",cause:t instanceof Error?t:void 0})}}}close(){return Promise.resolve()}getRawClient(){return null}},O={provider:"kiro",async createModel(n){let e=await S("kiro",n);return new k(e,n)}},v=(n,e)=>{let r=[];r.push("--output","json"),r.push("--model",n.model),e.maxTokens!==void 0&&r.push("--max-tokens",String(e.maxTokens));let o=n.properties?.args;return o!==void 0&&r.push(...o),r},C=n=>{if(n===null||typeof n!="object")return null;let e=n;if(e.type==="content"||e.type==="text"){let r=e.text??e.content;return r!==void 0?{kind:"content_delta",textDelta:String(r)}:null}return e.type==="done"||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 l(e.error?.message??e.message??"Unknown Kiro error",{provider:"kiro"})}:null};export{k as KiroModel,O as kiroFactory};
@@ -1 +1 @@
1
- import{a as p}from"./chunk-ERX4HONR.js";import{c as t,d as a,g as l,m as n,o,q as m,r as d}from"./chunk-Y6AFIAJP.js";import{a as i}from"./chunk-2N4GTHXQ.js";import"./chunk-BBKSV2RO.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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-TIGKFDKY.js";import{c as t,d as a,g as l,m as n,o,q as m,r as d}from"./chunk-Y6AFIAJP.js";import{a as i}from"./chunk-2N4GTHXQ.js";import"./chunk-FEHZCASN.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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{c as N,d as se,e as ne,p as y,q as l,r as x,s as ie,t as I,u as W}from"./chunk-IZ4J7VRF.js";import{b as X}from"./chunk-YK6UG66R.js";import{A as le,f as re,k as ae,s as q,v as oe,x as ce,z as j}from"./chunk-QYMX2GR3.js";import"./chunk-Y6AFIAJP.js";import{a as _,b as te}from"./chunk-2N4GTHXQ.js";import{d as ue,e as K,f as de}from"./chunk-FEHZCASN.js";import{b as C}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var pe=()=>({tabs:[],selectedTabIndex:-1,focus:"list",running:!0});var we=e=>e===null?"\u2014":{DISCOVERY:"DISC",DISCOVERY_REVIEW:"REVW",SPEC_DRAFT:"DRFT",SPEC_APPROVED:"APPR",EXECUTING:"EXEC",BLOCKED:"BLKD",COMPLETED:"DONE",IDLE:"IDLE",FREE:"FREE"}[e]??e.slice(0,4),Se=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"}},M=(e,n)=>{let a=new Set(n.filter(o=>o.spec!==null).map(o=>o.spec)),i=e.map(o=>({label:o.name,badge:we(o.phase),badgeColor:Se(o.phase),active:a.has(o.name),dimmed:o.phase==="COMPLETED"}));return i.length===0&&i.push({label:"No specs yet",dimmed:!0,selectable:!1}),i.push({label:"\u2500".repeat(20),dimmed:!0,selectable:!1}),i.push({label:"[n] New spec",badge:"+",badgeColor:"green"}),i.push({label:"[f] Free mode",badge:"~",badgeColor:"cyan"}),i},Y=(e,n,a,i)=>{let o=M(e,n),t=x.drawBox({x:i.x,y:i.y,width:i.width,height:i.height,title:"Specs",borderStyle:"rounded"}),R=I.renderList(o,a,i);return t+R};var xe=["IDLE","DISCOVERY","REVIEW","DRAFT","APPROVED","EXECUTING","DONE"],Ee=e=>{if(e===null||e==="FREE")return"FREE (no enforcement)";let a={DISCOVERY_REVIEW:"REVIEW",SPEC_DRAFT:"DRAFT",SPEC_APPROVED:"APPROVED",COMPLETED:"DONE"}[e]??e;return xe.map(i=>i===a?l.bold(`\u2726${i}\u2726`):l.dim(i)).join("\u2192")},Ie=(e,n,a)=>{if(n===0)return l.dim("no tasks");let i=Math.round(e/n*a),o=a-i;return l.green("\u2588".repeat(i))+l.dim("\u2591".repeat(o))+` ${e}/${n}`},z=(e,n,a)=>{let i=[];return e===null?(i.push(l.dim("No spec selected")),i.push(""),i.push(l.dim("Select a spec from the list or press [n] for new"))):e.mode==="free"?(i.push(l.bold("Mode: ")+l.cyan("FREE")),i.push(l.dim("No enforcement active")),i.push(""),i.push(l.dim(`Session: ${e.sessionId}`))):(i.push(l.bold("Spec: ")+(e.spec??"unknown")),i.push(l.bold("Phase: ")+(e.phase??"unknown")),i.push(""),i.push(Ee(e.phase)),i.push(""),a!==void 0&&i.push(l.bold("Progress: ")+Ie(a.completed,a.total,15)),i.push(""),i.push(l.dim(`Session: ${e.sessionId}`))),x.fillBox({x:n.x,y:n.y,width:n.width,height:n.height,title:"Monitor",borderStyle:"rounded"},i)};var U=(e,n)=>{let a=e!==null?e.mode==="free"?"Terminal (FREE)":`Terminal (${e.spec??"?"})`:"Terminal",i=e!==null&&e.widget!==null,o=x.drawBox({x:n.x,y:n.y,width:n.width,height:n.height,title:a,borderStyle:"rounded",skipInterior:i});if(e===null||e.widget===null&&e.buffer.length===0){let L=l.dim("Waiting for output..."),k=" ".repeat(n.width-2),u="";for(let E=1;E<n.height-1;E++)u+=l.moveTo(n.y+E,n.x+1),u+=E===1?l.truncate(L,n.width-2)+" ".repeat(Math.max(0,n.width-2-l.visibleLength(L))):k;return o+u}if(e.widget!==null)return o+e.widget.render(n);let t=n.height-2,R=e.buffer.slice(-t);return x.fillBox({x:n.x,y:n.y,width:n.width,height:n.height,title:a,borderStyle:"rounded"},R)};var G=(e,n)=>({...e,tabs:[...e.tabs,n],selectedTabIndex:e.tabs.length}),me=(e,n)=>{let a=e.tabs.findIndex(t=>t.id===n);if(a===-1)return e;let i=e.tabs[a];i.process!==null&&i.process.kill();let o=e.tabs.filter(t=>t.id!==n);return{...e,tabs:o,selectedTabIndex:Math.min(e.selectedTabIndex,o.length-1)}},ge=(e,n)=>n<0||n>=e.tabs.length?e:{...e,selectedTabIndex:n},H=(e,n)=>{let a=n.split(`
2
+ `);for(let i of a)e.buffer.push(i);e.buffer.length>1e3&&e.buffer.splice(0,e.buffer.length-1e3)},P=e=>e.selectedTabIndex<0||e.selectedTabIndex>=e.tabs.length?null:e.tabs[e.selectedTabIndex]??null;var fe=(e,n,a)=>{if(a&&n==="c")return{type:"quit"};if(n==="tab")return{type:"toggleFocus"};if(e.focus==="list")switch(n){case"up":return{type:"navigate",direction:"up"};case"down":return{type:"navigate",direction:"down"};case"return":return{type:"select"};case"n":return{type:"newSpec"};case"f":return{type:"freeMode"};case"x":return{type:"closeTab"};case"q":return{type:"quit"};default:return{type:"none"}}return{type:"passthrough",data:n}},be=e=>({...e,focus:e.focus==="list"?"terminal":"list"}),J=(e,n,a)=>{let i=I.nextSelectableIndex(a,e.selectedTabIndex,n);return{...e,selectedTabIndex:i}};var Be=async e=>{let n=e?.includes("--dry-run")??!1,a=C.process.cwd();if(!await le(a))return console.error("noskills is not initialized. Run:",X(),"init"),te({exitCode:1});let o=(await ae(a)).map(s=>({name:s.name,phase:s.state.phase,hasActiveSession:!1})),t=pe(),{cols:R,rows:L}=y.getTerminalSize(),k={leftWidth:.25,rightTopHeight:.35},u=ie.calculateLayout(R,L,k),E=new TextEncoder,g=s=>{Deno.stdout.writeSync(E.encode(s))};if(n){g(y.clearScreenSeq());let s=` noskills manager | ${o.length} spec(s) | ${X()} | Ctrl+C to quit`;g(l.moveTo(u.statusBar.y,u.statusBar.x)),g(l.inverse(l.truncate(s,u.statusBar.width))),g(Y(o,t.tabs,t.selectedTabIndex,u.left));let r=P(t);return g(z(r,u.rightTop)),g(U(r,u.rightBottom)),g(l.moveTo(L,1)),g(`
3
+ `),_(void 0)}let D=new de,F=null,Q=async()=>{for(let s of["claude","claude-code"])try{if(await ue`which ${s}`.noThrow().code()===0)return s}catch{}return"claude"},w=M(o,t.tabs);t.selectedTabIndex=I.nextSelectableIndex(w,-1,"down");let O=async()=>{let s=j();await q(a,{id:s,spec:null,mode:"free",phase:null,pid:0,startedAt:new Date().toISOString(),lastActiveAt:new Date().toISOString(),tool:"claude-code"});let r=u.rightBottom.width-2,d=u.rightBottom.height-2,c=new W(d,r),m={id:`tab-${s}`,spec:null,mode:"free",sessionId:s,process:null,buffer:[],widget:c,active:!0,phase:null};try{let f=await Q(),b=await K({command:f,cwd:a,env:{...C.env.toObject(),NOSKILLS_SESSION:s},cols:r,rows:d});m.process=b,D.add(m.id,b),b.onData(T=>{c.write(T),H(m,T),F?.()})}catch(f){let b=f instanceof Error?f.message:String(f);c.write(`[noskills manager] Failed to spawn claude: ${b}\r
4
+ `),c.write(`Is Claude Code installed? Set command in manifest.yml\r
5
+ `)}Object.assign(t,G(t,m)),t.focus="terminal",w=M(o,t.tabs)},Z=async s=>{let r=t.tabs.find(h=>h.spec===s);if(r!==void 0){let h=t.tabs.indexOf(r);Object.assign(t,ge(t,h)),t.focus="terminal";return}let d=null;try{d=(await re(a,s)).phase}catch{}let c=j();await q(a,{id:c,spec:s,mode:"spec",phase:d,pid:0,startedAt:new Date().toISOString(),lastActiveAt:new Date().toISOString(),tool:"claude-code"});let m=u.rightBottom.width-2,f=u.rightBottom.height-2,b=new W(f,m),T={id:`tab-${c}`,spec:s,mode:"spec",sessionId:c,process:null,buffer:[],widget:b,active:!0,phase:d};try{let h=await Q(),A=await K({command:h,cwd:a,env:{...C.env.toObject(),NOSKILLS_SESSION:c},cols:m,rows:f});T.process=A,D.add(T.id,A),A.onData(ee=>{b.write(ee),H(T,ee),F?.()})}catch(h){let A=h instanceof Error?h.message:String(h);b.write(`[noskills manager] Failed to spawn claude for spec "${s}": ${A}\r
6
+ `)}Object.assign(t,G(t,T)),t.focus="terminal",w=M(o,t.tabs)};g(y.enterAlternateScreen()),g(y.hideCursorSeq()),g(y.clearScreenSeq()),g(N.enableMouse());let p=new Set(["specs","monitor","terminal","status"]),v=()=>{let s=P(t),r=[];if(r.push(y.hideCursorSeq()),p.has("status")||p.size===0){let d=t.focus==="list"?"LIST":"TERM",c=` noskills manager | ${o.length} spec(s) | ${t.tabs.length} tab(s) | [${d}] Tab: toggle | q: quit | n: new | f: free`;r.push(l.moveTo(u.statusBar.y,u.statusBar.x)),r.push(l.inverse(l.truncate(c,u.statusBar.width)+" ".repeat(Math.max(0,u.statusBar.width-l.visibleLength(c)))))}p.has("specs")&&r.push(Y(o,t.tabs,t.selectedTabIndex,u.left)),p.has("monitor")&&r.push(z(s,u.rightTop)),p.has("terminal")&&r.push(U(s,u.rightBottom)),r.push(y.showCursorSeq()),p.clear(),g(r.join(""))},S=()=>{p.add("specs"),p.add("monitor"),p.add("terminal"),p.add("status")},$=!1;F=()=>{p.add("terminal"),!$&&($=!0,setTimeout(()=>{$=!1,t.running&&v()},16))},S(),v();let V=(s,r,d)=>s>=d.x&&s<d.x+d.width&&r>=d.y&&r<d.y+d.height,he=async s=>{if(V(s.x+1,s.y+1,u.left)){if(s.type==="mousedown"&&s.button===0){t.focus="list";let r=s.y+1-u.left.y-1;if(r>=0&&r<w.length){let d=w[r];if(d.selectable!==!1){if(t.selectedTabIndex=r,d.label.includes("[n]")||d.label.includes("[f]")){await O(),S();return}let c=o.find(m=>m.name===d.label)?.name;if(c!==void 0){await Z(c),S();return}}}p.add("specs"),p.add("monitor"),p.add("status")}else if(s.type==="wheel"){let r=s.direction==="up"?"up":"down";Object.assign(t,J(t,r,w)),p.add("specs"),p.add("monitor")}return}if(V(s.x+1,s.y+1,u.rightBottom)){t.focus="terminal",p.add("status");let r=P(t);if(r?.process!==null&&r!==null){let d=s.x+1-u.rightBottom.x,c=s.y+1-u.rightBottom.y,m=s.button;s.type==="mousemove"&&(m|=32),s.type==="wheel"&&(m=64|(s.direction==="down"?1:0)),s.shift&&(m|=4),s.ctrl&&(m|=16);let f=s.type==="mouseup"?"m":"M";r.process?.write(`\x1B[<${m};${d};${c}${f}`)}if(s.type==="wheel"&&r?.process!==null&&r!==null){let d=s.direction==="up"?"\x1B[A":"\x1B[B";r.process?.write(d.repeat(3))}return}V(s.x+1,s.y+1,u.rightTop)&&(t.focus="list",p.add("status"))};try{await se(async()=>{for await(let s of ne(C.process.stdin)){if(!t.running)break;if(s.kind==="mouse"){await he(s.event),p.size>0&&v();continue}let r=s.event,d=fe(t,r.name,r.ctrl);switch(d.type){case"quit":t.running=!1;break;case"toggleFocus":Object.assign(t,be(t)),p.add("status");break;case"navigate":Object.assign(t,J(t,d.direction,w)),p.add("specs"),p.add("monitor"),p.add("terminal");break;case"freeMode":await O(),S();break;case"newSpec":await O(),S();break;case"select":{let c=w[t.selectedTabIndex];if(c===void 0)break;let m=c.label;if(m.includes("[n]")||m.includes("[f]"))await O();else{let f=o.find(b=>b.name===m)?.name;f!==void 0&&await Z(f)}S();break}case"closeTab":{let c=P(t);c!==null&&(c.process!==null&&D.remove(c.id),await oe(a,c.sessionId),Object.assign(t,me(t,c.id)),w=M(o,t.tabs),t.focus="list"),S();break}case"passthrough":{let c=P(t);c?.process!==null&&c!==null&&c.process?.write(new TextDecoder().decode(r.raw));break}case"none":break}if(!t.running)break;p.size>0&&v()}})}finally{await D.killAll(),D.forceKillAll(),await ce(a),g(N.disableMouse()),g(y.showCursorSeq()),g(y.exitAlternateScreen())}return _(void 0)};export{Be as main};
@@ -0,0 +1 @@
1
+ import{a,b,c,d,e,f}from"./chunk-FEHZCASN.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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,8 @@
1
+ import{b as fe}from"./chunk-VK7L5SMS.js";import{a as le,b as de,c as pe,d as G}from"./chunk-QMZBEPES.js";import{a as z,b as K,d as Y}from"./chunk-OV7ZXBXC.js";import{a as Q}from"./chunk-7UX6WIXX.js";import"./chunk-MRZT23BL.js";import{a as ue,b as me,d as v}from"./chunk-TJZAIUKM.js";import{a as Ie}from"./chunk-RBLZTQ64.js";import{a as q}from"./chunk-VPXOI7CR.js";import{a as xe,b as Ce,c as De,d as Re}from"./chunk-6FTHIS2Z.js";import{c as j}from"./chunk-YK6UG66R.js";import{a as ge,b as he,e as k,f as B,g as X,h as Se,i as we,k as ve,m as Z,n as ye}from"./chunk-FJCXMC2D.js";import{A as ce,a as te,d as F,f as se,g as ne,j as ie,k as re,l as oe,p as ae,r as U,w as H}from"./chunk-QYMX2GR3.js";import{a as J,b as D}from"./chunk-2N4GTHXQ.js";import{b as h}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var Fe=o=>o.split(`
2
+ `).map(e=>e.replace(/^[-*]\s+/,"").trim()).filter(e=>e.length>0&&!e.startsWith("#")),ke=async(o,e)=>{let r=[],i=(e.startsWith(o)?e.slice(o.length+1):e).split("/");i.pop();for(let t=i.length;t>=0;t--){let n=`${t===0?o:`${o}/${i.slice(0,t).join("/")}`}/.folder-rules.md`,a=t===0?".":i.slice(0,t).join("/");try{let l=await h.fs.readTextFile(n),u=Fe(l);for(let p of u)r.push({folder:a,rule:p})}catch{}}return r},ee=async(o,e)=>{let r=new Set,c=[];for(let i of e){let t=await ke(o,i);for(let s of t){let n=`${s.folder}::${s.rule}`;r.has(n)||(r.add(n),c.push(s))}}return c};var Ze=async o=>{let e=h.process.cwd(),r=ue(o),c=me(o);if(!await ce(e))return await v({error:`noskills not initialized. Run: ${j("init")}`},r),D({exitCode:1});let i=null;for(let m of c)m.startsWith("--answer=")&&(i=m.slice(9));let t=ne(c),s;try{s=await se(e,t)}catch(m){let d=m instanceof Error?m.message:String(m);return await v({error:d},r),D({exitCode:1})}if(t===null&&s.phase!=="IDLE"&&s.phase!=="FREE"&&s.phase!=="COMPLETED")return await v({error:"Error: --spec=<name> is required. Use `noskills spec list` to see available specs."},r),D({exitCode:1});let n=await oe(e);if(n?.command!==void 0){let{setCommandPrefix:m}=await import("./cmd-RST2ZPA6.js");m(n.command)}if(n===null)return await v({error:"No config found"},r),D({exitCode:1});if(s.spec!==null&&s.phase!=="IDLE"&&s.phase!=="COMPLETED"){let m=`${e}/${F.specDir(s.spec)}`;try{await h.fs.stat(m)}catch{return await v({error:!0,message:`Active spec '${s.spec}' directory not found. Files may have been deleted manually.`,suggestion:`Run \`${j("reset")}\` to return to IDLE, or \`${j("cancel")}\` to mark as cancelled.`},r),D({exitCode:1})}}let a=fe(c,n);s.phase==="DISCOVERY"&&s.discovery.audience!==a&&(s={...s,discovery:{...s.discovery,audience:a}});let u=(await ae(e)).filter(m=>n.concerns.includes(m.id));if(i!==null){let m=await Ae(e,s,n,u,i);await U(e,m);let d={...m,lastCalledAt:new Date().toISOString()};await U(e,d);let b=h.env.get("NOSKILLS_SESSION")??null;b!==null&&await H(e,b,d.phase);let C=await z(e),E=K(C,d.phase),_=d.spec!==null?await q(e,d.spec):null,O=await be(e,d),T=await ee(e,O),f=Y(n?.tools??[]),S=G(d,u,E,n,_,T,void 0,f);return await v(S,r),J(void 0)}let p={...s,lastCalledAt:new Date().toISOString()};await U(e,p);let x=h.env.get("NOSKILLS_SESSION")??null;x!==null&&await H(e,x,p.phase);let y=await z(e),P=K(y,p.phase),M=p.spec!==null?await q(e,p.spec):null,V=await be(e,p),A=await ee(e,V),R;p.phase==="IDLE"&&(R={existingSpecs:(await re(e)).map(d=>({name:d.name,phase:d.state.phase,iteration:d.state.execution.iteration,detail:d.state.phase==="EXECUTING"?`${d.state.execution.completedTasks.length} tasks done, iteration ${d.state.execution.iteration}`:d.state.phase==="SPEC_DRAFT"?"awaiting approval":d.state.phase==="COMPLETED"?"completed":void 0})),rulesCount:P.length});let W=Y(n?.tools??[]),$=G(p,u,P,n,M,A,R,W);return await v($,r),J(void 0)},Ae=async(o,e,r,c,i)=>{switch(e.phase){case"DISCOVERY":{let t=e.discovery.audience==="agent",s=null;try{let a=JSON.parse(i);typeof a=="object"&&a!==null&&!Array.isArray(a)&&(t?le.map(p=>p.id).every(p=>p in a)&&(s=a):s=a)}catch{}let n=e;if(s!==null)for(let[a,l]of Object.entries(s))typeof l=="string"&&l.length>0&&(n=k(n,a,l));else{let a=de(c),l=n.discovery.currentQuestion,u=a[l];if(u===void 0)return e;n=k(n,u.id,i),n=we(n)}return pe(n.discovery.answers)&&(n=B(n)),n}case"DISCOVERY_REVIEW":{let t=i.trim().toLowerCase();if(t==="approve"){let s=Q(e.discovery.answers);return s.detected&&s.proposals.length>=2?Se(e):X(e)}if(t==="split")return await $e(o,e);if(t==="keep"){let s=Z(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 X(s)}try{let s=JSON.parse(i);if(typeof s.revise=="object"&&s.revise!==null){let n=e;for(let[a,l]of Object.entries(s.revise))typeof l=="string"&&l.length>0&&(n=k(n,a,l));return n}}catch{}return e}case"SPEC_DRAFT":{if(e.classification===null){let t,s=i.trim().toLowerCase();if(s==="none"||s==="skip")t={involvesWebUI:!1,involvesCLI:!1,involvesPublicAPI:!1,involvesMigration:!1,involvesDataHandling:!1};else try{let a=JSON.parse(i);t={involvesWebUI:a.involvesWebUI===!0||a.involvesUI===!0,involvesCLI:a.involvesCLI===!0||a.involvesUI===!0,involvesPublicAPI:a.involvesPublicAPI===!0,involvesMigration:a.involvesMigration===!0,involvesDataHandling:a.involvesDataHandling===!0}}catch{t={involvesWebUI:!1,involvesCLI:!1,involvesPublicAPI:!1,involvesMigration:!1,involvesDataHandling:!1}}let n={...e,classification:t};try{await Ie(o,n,c)}catch{}return n}try{let t=JSON.parse(i);if(typeof t.refinement=="string"&&t.refinement.length>0){let s=t.refinement;if(e.spec!==null){let n=`${o}/${F.specFile(e.spec)}`,a=await h.fs.readTextFile(n);if(s.includes("task-")){let u=Oe(s).map(y=>`- [ ] ${y}`).join(`
3
+ `),p=/## Tasks\n\n([\s\S]*?)(?=\n## |\n*$)/,x=a.replace(p,`## Tasks
4
+
5
+ ${u}
6
+ `);await h.fs.writeTextFile(n,x)}}return e}}catch{}return e}case"SPEC_APPROVED":{let t=ve(e);return t.spec!==null&&(await xe(o,t.spec,"executing"),await Re(o,t.spec,"executing")),t}case"EXECUTING":{if(!e.execution.awaitingStatusReport){let t={...e,execution:{...e.execution,lastProgress:i}};if(r.verifyCommand!==null&&r.verifyCommand!==void 0&&r.verifyCommand.length>0){let s=await Le(o,r.verifyCommand);if(t={...t,execution:{...t.execution,lastVerification:s}},!s.passed)return t}return t={...t,execution:{...t.execution,awaitingStatusReport:!0}},t}return await Te(o,e,i,c)}case"BLOCKED":{let t=e.execution.lastProgress??"Unknown",s={id:`d${e.decisions.length+1}`,question:t.replace(/^BLOCKED:\s*/,""),choice:i,promoted:!1,timestamp:new Date().toISOString()},n=Z(e,s);return n=ge(n,"EXECUTING"),n={...n,execution:{...n.execution,lastProgress:`Resolved: ${i}`}},n}default:return e}},$e=async(o,e)=>{let r=Q(e.discovery.answers);if(!r.detected||r.proposals.length===0)return e;let c=[];for(let t of r.proposals){let s=`${o}/${F.specDir(t.name)}`;await h.fs.mkdir(s,{recursive:!0});let n=e.discovery.answers.filter(u=>t.relevantAnswers.includes(u.questionId)),l=he(te(),t.name,`spec/${t.name}`);for(let u of n)l=k(l,u.questionId,u.answer);l=B(l),await ie(o,t.name,l),c.push(t.name)}return ye(e,"cancelled",`Split into: ${c.join(", ")}`)},Oe=o=>o.split(/(?=task-\d+:)/).map(e=>e.replace(/[,;\n\s]+$/,"").trim()).filter(e=>/^task-\d+:/.test(e)),Te=async(o,e,r,c)=>{let i;try{i=JSON.parse(r)}catch{return{...e,execution:{...e.execution,lastProgress:r,awaitingStatusReport:!1}}}let t=e;if(e.execution.debt!==null&&e.execution.debt.items.length>0&&typeof e.execution.debt.items[0]=="string"){let S=e.execution.debt.items.map((w,g)=>({id:`legacy-${g+1}`,text:w,since:e.execution.debt.fromIteration}));t={...e,execution:{...e.execution,debt:{...e.execution.debt,items:S}}};let L=new TextEncoder,I=h.process.stderr.getWriter();await I.write(L.encode(`noskills: migrated legacy string[] debt to DebtItem[] format
7
+ `)),I.releaseLock()}let s=new Set(["mandatory-tests","mandatory-docs"]),a=(i.na??[]).filter(f=>s.has(f));if(a.length>0)return{...t,execution:{...t.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: ${a.join(", ")}`,awaitingStatusReport:!0}};let l=i.completed??[],u=new Set(l),p=i.na??[],x=new Set(p),y=i.newIssues??[],P=i.remaining??[],M=i.blocked??[],V=t.execution.debt?.unaddressedIterations??0,A=t.execution.debt!==null?t.execution.debt.items.filter(f=>!u.has(f.id)&&!x.has(f.id)):[],R=t.execution.debtCounter??0,W=y.map((f,S)=>({id:`debt-${R+S+1}`,text:f,since:t.execution.iteration})),$=[...A,...W],d=P.length===0&&M.length===0&&y.length===0||$.length===0?null:{items:$,fromIteration:t.execution.debt?.fromIteration??t.execution.iteration,unaddressedIterations:A.length>0?V+1:1},b=[...new Set([...t.execution.naItems??[],...p])],C=[];l.length>0&&C.push(`Completed: ${l.join(", ")}`),p.length>0&&C.push(`N/A: ${p.join(", ")}`);let E=C.length>0?C.join("; "):"Status report submitted",_=t.execution.lastVerification===null||t.execution.lastVerification.passed===!0,O=d===null&&_,T=R+y.length;if(O&&t.spec!==null){let f=await q(o,t.spec);if(f!==null){let S=t.execution.completedTasks??[],L=new Set(S),I=[];try{let g=JSON.parse(t.execution.lastProgress??"");Array.isArray(g.completed)&&(I=g.completed.filter(N=>!L.has(N)&&f.tasks.some(Ee=>Ee.id===N)))}catch{}if(I.length===0){let g=f.tasks.find(N=>!L.has(N.id));g!==void 0&&(I=[g.id])}let w=[];for(let g of I)await Ce(o,t.spec,g),await De(o,t.spec,g,"done"),w.push(g);if(w.length>0){let g=w.length===1?`Task ${w[0]} accepted`:`Tasks ${w.join(", ")} accepted`;return{...t,execution:{...t.execution,lastProgress:`${g}: ${E}`,awaitingStatusReport:!1,debt:d,completedTasks:[...S,...w],debtCounter:T,naItems:b}}}}}return{...t,execution:{...t.execution,lastProgress:O?E:`Task not accepted \u2014 remaining items must be addressed first. ${E}`,awaitingStatusReport:!1,debt:d,debtCounter:T,naItems:b}}},Le=async(o,e)=>{try{let{execSync:r}=await import("node:child_process"),c=r(e,{cwd:o,encoding:"utf-8",timeout:6e4,stdio:["pipe","pipe","pipe"]});return{passed:!0,output:String(c).slice(0,4e3),timestamp:new Date().toISOString()}}catch(r){let c=r,i=((c.stdout??"")+(c.stderr??"")).slice(0,4e3);return c.status!==void 0?{passed:!1,output:i||"Verification failed with no output",timestamp:new Date().toISOString()}:{passed:!1,output:`Verification command failed to execute: ${r instanceof Error?r.message:String(r)}`,timestamp:new Date().toISOString()}}},be=async(o,e)=>{let r=[...e.execution.modifiedFiles??[]],c=await Ne(o);return[...new Set([...r,...c])]},Ne=async o=>{let e=`${o}/${F.stateDir}/files-changed.jsonl`;try{let c=(await h.fs.readTextFile(e)).trim().split(`
8
+ `).filter(Boolean),i=[];for(let t of c)try{let s=JSON.parse(t);i.includes(s.file)||i.push(s.file)}catch{}return i}catch{return[]}};export{Ae as handleAnswer,Ze as main,Oe as parseRefinementTasks};
@@ -1,3 +1,3 @@
1
- import{c as u}from"./chunk-7QFOEK3I.js";import{a as i,e as m}from"./chunk-OLM5RTFK.js";import"./chunk-BBKSV2RO.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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-XRKWQJMC.js";import{a as i,e as m}from"./chunk-OLM5RTFK.js";import"./chunk-FEHZCASN.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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 u,c as S,d as k,e as g,f as m,g as f}from"./chunk-7QFOEK3I.js";import{a as c}from"./chunk-OLM5RTFK.js";import"./chunk-BBKSV2RO.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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);o.push("-p",i);let s=u(this.binary,o,{signal:r}),l=g(s.stderr),t=await k(s.stdout,this.modelId),p=await s.waitForExit(),a=await l,d=m("opencode",p.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);o.push("-p",i);let s=u(this.binary,o,{signal:r}),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(),p=await l,a=m("opencode",t.code,p);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 u,c as S,d as k,e as g,f as m,g as f}from"./chunk-XRKWQJMC.js";import{a as c}from"./chunk-OLM5RTFK.js";import"./chunk-FEHZCASN.js";import"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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);o.push("-p",i);let s=u(this.binary,o,{signal:r}),l=g(s.stderr),t=await k(s.stdout,this.modelId),p=await s.waitForExit(),a=await l,d=m("opencode",p.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);o.push("-p",i);let s=u(this.binary,o,{signal:r}),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(),p=await l,a=m("opencode",t.code,p);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,4 +1,4 @@
1
- import{a as k,b as C,c as v,k as o}from"./chunk-73EEM3FY.js";import{b as D,c as P}from"./chunk-VK7L5SMS.js";import{c as E,d as l,k as R,p as x}from"./chunk-LWCWPXCS.js";import"./chunk-Y6AFIAJP.js";import{a as d,b as $}from"./chunk-2N4GTHXQ.js";import{b as a}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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-IZ4J7VRF.js";import{b as D,c as P}from"./chunk-VK7L5SMS.js";import{c as E,d as l,k as R,p as x}from"./chunk-QYMX2GR3.js";import"./chunk-Y6AFIAJP.js";import{a as d,b as $}from"./chunk-2N4GTHXQ.js";import{b as a}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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};
@@ -1 +1 @@
1
- import{n as y}from"./chunk-TMC5H2A5.js";import{f,h,i as S,j as g}from"./chunk-LWCWPXCS.js";import{d as l,f as n,g as m,o as u,q as d,r as w}from"./chunk-Y6AFIAJP.js";import{a as p,b as t}from"./chunk-2N4GTHXQ.js";import{b as c}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var A=async C=>{let e=u({renderer:w.ansi(),sink:d.stdout()}),a=c.process.cwd(),i=h(C);if(!i.ok)return e.writeln(n(i.error)),await e.close(),t({exitCode:1});let s;try{s=await f(a,i.spec)}catch(o){let k=o instanceof Error?o.message:String(o);return e.writeln(n(k)),await e.close(),t({exitCode:1})}if(s.phase!=="COMPLETED")return e.writeln(n(`Cannot reopen in phase: ${s.phase}`)),e.writeln(l("Only COMPLETED specs can be reopened.")),await e.close(),t({exitCode:1});let r=y(s);return await S(a,r),r.spec!==null&&await g(a,r.spec,r),e.writeln(m("\u2714")," Spec reopened. Discovery answers preserved \u2014 run `noskills next` to revise."),await e.close(),p(void 0)};export{A as main};
1
+ import{o as y}from"./chunk-FJCXMC2D.js";import{f,h,i as S,j as g}from"./chunk-QYMX2GR3.js";import{d as l,f as n,g as m,o as u,q as d,r as w}from"./chunk-Y6AFIAJP.js";import{a as p,b as t}from"./chunk-2N4GTHXQ.js";import{b as c}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var A=async C=>{let e=u({renderer:w.ansi(),sink:d.stdout()}),a=c.process.cwd(),i=h(C);if(!i.ok)return e.writeln(n(i.error)),await e.close(),t({exitCode:1});let s;try{s=await f(a,i.spec)}catch(o){let k=o instanceof Error?o.message:String(o);return e.writeln(n(k)),await e.close(),t({exitCode:1})}if(s.phase!=="COMPLETED")return e.writeln(n(`Cannot reopen in phase: ${s.phase}`)),e.writeln(l("Only COMPLETED specs can be reopened.")),await e.close(),t({exitCode:1});let r=y(s);return await S(a,r),r.spec!==null&&await g(a,r.spec,r),e.writeln(m("\u2714")," Spec reopened. Discovery answers preserved \u2014 run `noskills next` to revise."),await e.close(),p(void 0)};export{A as main};
@@ -1 +1 @@
1
- import{o as k}from"./chunk-TMC5H2A5.js";import{d as h,f as g,h as y,i as S,j as I}from"./chunk-LWCWPXCS.js";import{d as i,f as n,g as d,o as u,q as w,r as f}from"./chunk-Y6AFIAJP.js";import{a as c,b as p}from"./chunk-2N4GTHXQ.js";import{b as l}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var x=async D=>{let e=u({renderer:f.ansi(),sink:w.stdout()}),a=l.process.cwd(),o=y(D);if(!o.ok)return e.writeln(n(o.error)),await e.close(),p({exitCode:1});let s;try{s=await g(a,o.spec)}catch(r){let A=r instanceof Error?r.message:String(r);return e.writeln(n(A)),await e.close(),p({exitCode:1})}if(s.phase==="IDLE"||s.phase==="UNINITIALIZED")return e.writeln(i("Already idle. Nothing to reset.")),await e.close(),c(void 0);if(s.spec!==null){let r=`${a}/${h.specDir(s.spec)}`;try{await l.fs.stat(r)}catch{e.writeln(n(`Active spec '${s.spec}' directory not found.`)),e.writeln(i("Resetting to IDLE anyway."))}}let t=s.spec,m=k(s);return await S(a,m),t!==null&&await I(a,t,m),e.writeln(d("\u2714")," Reset to IDLE."),t!==null&&e.writeln(i(`Spec "${t}" state cleared. Files in .eser/specs/${t}/ preserved.`)),await e.close(),c(void 0)};export{x as main};
1
+ import{q as k}from"./chunk-FJCXMC2D.js";import{d as h,f as g,h as y,i as S,j as I}from"./chunk-QYMX2GR3.js";import{d as i,f as n,g as d,o as u,q as w,r as f}from"./chunk-Y6AFIAJP.js";import{a as c,b as p}from"./chunk-2N4GTHXQ.js";import{b as l}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var x=async D=>{let e=u({renderer:f.ansi(),sink:w.stdout()}),a=l.process.cwd(),o=y(D);if(!o.ok)return e.writeln(n(o.error)),await e.close(),p({exitCode:1});let s;try{s=await g(a,o.spec)}catch(r){let A=r instanceof Error?r.message:String(r);return e.writeln(n(A)),await e.close(),p({exitCode:1})}if(s.phase==="IDLE"||s.phase==="UNINITIALIZED")return e.writeln(i("Already idle. Nothing to reset.")),await e.close(),c(void 0);if(s.spec!==null){let r=`${a}/${h.specDir(s.spec)}`;try{await l.fs.stat(r)}catch{e.writeln(n(`Active spec '${s.spec}' directory not found.`)),e.writeln(i("Resetting to IDLE anyway."))}}let t=s.spec,m=k(s);return await S(a,m),t!==null&&await I(a,t,m),e.writeln(d("\u2714")," Reset to IDLE."),t!==null&&e.writeln(i(`Spec "${t}" state cleared. Files in .eser/specs/${t}/ preserved.`)),await e.close(),c(void 0)};export{x as main};
@@ -0,0 +1,6 @@
1
+ import{a as v,e as C}from"./chunk-OV7ZXBXC.js";import{b as A,c as j}from"./chunk-YK6UG66R.js";import{d as x,l as T}from"./chunk-QYMX2GR3.js";import{c as y,d as a,f as k,g as P,o as d,q as u,r as c}from"./chunk-Y6AFIAJP.js";import{a as g,b as $}from"./chunk-2N4GTHXQ.js";import{b as p}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var q=async e=>{let s=e?.[0];if(s==="add")return await R(e?.slice(1));if(s==="list")return await L();if(s==="promote")return await W(e?.slice(1));let n=A(),t=d({renderer:c.ansi(),sink:u.stdout()});return t.writeln(`Usage: ${n} rule <add "rule text" | list | promote "decision">`),await t.close(),g(void 0)},R=async e=>{let s=d({renderer:c.ansi(),sink:u.stdout()}),n=p.process.cwd(),t=[],r=[],i=[];if(e!==void 0)for(let o of e)o.startsWith("--phases=")?t=o.slice(9).split(",").map(w=>w.trim()):o.startsWith("--applies-to=")?r=o.slice(13).split(",").map(w=>w.trim().replace(/^["']|["']$/g,"")):o.startsWith("-")||i.push(o);let m=i.join(" "),f=await T(n);if(m.length===0)return s.writeln(k("Please provide a rule: "),y(`${j('rule add "Use Deno Tests for all tests"')}`)),await s.close(),$({exitCode:1});let b=m.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+=m+`
6
+ `;let D=`${n}/${x.rulesDir}/${b}.md`;await p.fs.mkdir(`${n}/${x.rulesDir}`,{recursive:!0}),await p.fs.writeTextFile(D,l);let h=[];t.length>0&&h.push(t.join(", ")),r.length>0&&h.push(r.join(", "));let E=h.length>0?` [${h.join("; ")}]`:"";return s.writeln(P("\u2714")," Rule added: ",a(m),a(E)),f!==null&&f.tools.length>0&&(await C(n,f.tools,f),s.writeln(a(" Tool files synced."))),await s.close(),g(void 0)},L=async()=>{let e=d({renderer:c.ansi(),sink:u.stdout()}),s=p.process.cwd(),n=await v(s);if(e.writeln(y("Rules")),e.writeln(""),n.length===0)e.writeln(a(` No rules yet. Add one with: ${j('rule add "..."')}`));else for(let t=0;t<n.length;t++){let r=n[t],i=[];r.phases!==void 0&&r.phases.length>0?i.push(r.phases.join(", ")):i.push("all phases"),r.appliesTo!==void 0&&r.appliesTo.length>0?i.push(r.appliesTo.join(", ")):i.push("all files"),e.writeln(` ${t+1}. ${r.text} `,a(`[${i.join(", ")}]`))}return await e.close(),g(void 0)},W=async e=>{let s=d({renderer:c.ansi(),sink:u.stdout()}),n=e?.join(" ");return n===void 0||n.length===0?(s.writeln(k("Please provide the decision text to promote.")),await s.close(),$({exitCode:1})):(await s.close(),await R(e))};export{q as main};
@@ -0,0 +1,3 @@
1
+ import{a as D,b as A,g as F}from"./chunk-IZ4J7VRF.js";import{d as B}from"./chunk-QMZBEPES.js";import{c as W,d as X}from"./chunk-OV7ZXBXC.js";import"./chunk-7UX6WIXX.js";import"./chunk-MRZT23BL.js";import{b as E,c as V}from"./chunk-YK6UG66R.js";import{a as _,k as j}from"./chunk-FJCXMC2D.js";import{A as M,e as g,f as N,g as U,i as $,l as G,p as L}from"./chunk-QYMX2GR3.js";import{c as v,d as o,f as l,g as P,h,k as I,o as R,q as O,r as T}from"./chunk-Y6AFIAJP.js";import{a as S,b as w}from"./chunk-2N4GTHXQ.js";import{b as y}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var ue=async t=>{let e=R({renderer:T.ansi(),sink:O.stdout()}),i=y.process.cwd(),n=t?.includes("--unattended")??!1,r=z(t,"--max-turns")??10,p=z(t,"--max-iterations")??50;if(!await M(i))return e.writeln(l(`noskills not initialized. Run: ${V("init")}`)),await e.close(),w({exitCode:1});let x=U(t),c=await N(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=j(c);await $(i,s)}let u=await G(i);if(u===null)return e.writeln(l("Config not found.")),await e.close(),w({exitCode:1});e.writeln(v(`${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(P("\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=A(),f=await F(C,{message:"Enter resolution (or leave empty to stop):"});if(D(f)||f===""){e.writeln(o("Stopped by user."));break}let k=_(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 L(i)).filter(a=>u.concerns.includes(a.id)),q=await W(i),K=X(u.tools),J=B(s,H,q,u,void 0,void 0,void 0,K),Q=Y(J);e.writeln(I(`\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-RW5J2N5Q.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-RW5J2N5Q.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{ue as main};
@@ -0,0 +1 @@
1
+ import{b as I,c as E}from"./chunk-YK6UG66R.js";import{A as R,f as b,k as y,s as A,u as C,v as N,x as $,y as x,z as O}from"./chunk-QYMX2GR3.js";import{c as l,d as n,f as c,g as v,o as f,q as w,r as S}from"./chunk-Y6AFIAJP.js";import{a as u,b as h}from"./chunk-2N4GTHXQ.js";import{b as m}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var F=async t=>{let s=t?.[0];if(s==="start")return await P(t?.slice(1));if(s==="end")return await D(t?.slice(1));if(s==="list")return await M();if(s==="gc")return await K();let i=I(),e=f({renderer:S.ansi(),sink:w.stdout()});return e.writeln(`Usage: ${i} session <start | end | list | gc>`),e.writeln(""),e.writeln(n(" start --spec=<name> Bind to a spec")),e.writeln(n(" start --free Free mode (no enforcement)")),e.writeln(n(" start --auto Auto-detect spec or free")),e.writeln(n(" end [--id=<id>] End current/specific session")),e.writeln(n(" list Show active sessions")),e.writeln(n(" gc Remove stale sessions")),await e.close(),u(void 0)},P=async t=>{let s=f({renderer:S.ansi(),sink:w.stdout()}),i=m.process.cwd();if(!await R(i))return s.writeln(c("noskills is not initialized.")," Run: ",l(E("init"))),await s.close(),h({exitCode:1});let e=null,o=!1,d=!1;for(let r of t??[])r.startsWith("--spec=")?e=r.slice(7):r==="--free"?o=!0:r==="--auto"&&(d=!0);if(d){let p=(await y(i)).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(c("Specify --spec=<name>, --free, or --auto.")),s.writeln(n(`Example: ${I()} session start --spec=my-feature`)),await s.close(),h({exitCode:1});let a=null;if(e!==null)try{a=(await b(i,e)).phase}catch(r){let p=r instanceof Error?r.message:String(r);return s.writeln(c(`Error: ${p}`)),await s.close(),h({exitCode:1})}let g=O(),k={id:g,spec:e,mode:o?"free":"spec",phase:o?null:a,pid:0,startedAt:new Date().toISOString(),lastActiveAt:new Date().toISOString(),tool:"claude-code"};return await A(i,k),s.writeln(v("Session started.")),s.writeln(" ID: ",l(g)),s.writeln(" Mode: ",l(o?"free":"spec")),e!==null&&(s.writeln(" Spec: ",l(e)),a!==null&&s.writeln(" Phase: ",n(a))),s.writeln(""),s.writeln("Run: ",l(`export NOSKILLS_SESSION=${g}`)),await s.close(),u(void 0)},D=async t=>{let s=f({renderer:S.ansi(),sink:w.stdout()}),i=m.process.cwd(),e=null;for(let d of t??[])d.startsWith("--id=")&&(e=d.slice(5));return e===null&&(e=m.env.get("NOSKILLS_SESSION")??null),e===null?(s.writeln(c("No session specified. Use --id=<id> or set NOSKILLS_SESSION env var.")),await s.close(),h({exitCode:1})):(await N(i,e)?s.writeln(v("Session ended: "),n(e)):s.writeln(c(`Session not found: ${e}`)),await s.close(),u(void 0))},M=async()=>{let t=f({renderer:S.ansi(),sink:w.stdout()}),s=m.process.cwd(),i=await C(s);if(t.writeln(l("Sessions")),t.writeln(""),i.length===0)t.writeln(n(` No active sessions. Start one with: ${E("session start --spec=<name>")}`));else for(let e of i){let o=x(e),d=Date.now()-new Date(e.lastActiveAt).getTime(),a=Math.floor(d/6e4),g=a<60?`${a}min ago`:`${Math.floor(a/60)}h ago`,k=e.mode==="free"?"free":`spec:${e.spec??"?"}`,r=e.phase??"\u2014",p=o?c(" (stale)"):"";t.writeln(" ",l(e.id)," ",n(k.padEnd(25))," ",n(r.padEnd(18))," ",n(g),p)}return await t.close(),u(void 0)},K=async()=>{let t=f({renderer:S.ansi(),sink:w.stdout()}),s=m.process.cwd(),i=await $(s);if(i.length===0)t.writeln(n("No stale sessions to remove."));else{t.writeln(v(`Removed ${i.length} stale session(s):`));for(let e of i)t.writeln(" ",n(e))}return await t.close(),u(void 0)};export{F as main};
@@ -0,0 +1 @@
1
+ import{a as Y}from"./chunk-7UX6WIXX.js";import{a as _,d as U}from"./chunk-TJZAIUKM.js";import{b as E,c as R}from"./chunk-YK6UG66R.js";import{b as A,e as M,f as N,n as F,p as L}from"./chunk-FJCXMC2D.js";import{A as P,a as b,d as g,f as O,g as V,j as v,k as W}from"./chunk-QYMX2GR3.js";import{c as u,d as a,f as c,g as D,h as z,k as q,o as y,q as C,r as $}from"./chunk-Y6AFIAJP.js";import{a as S,b as d}from"./chunk-2N4GTHXQ.js";import{b as h}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var j=new Set(["new","list","help","next","approve","done","block","reset","cancel","wontfix","reopen","revisit","split"]),X=new Map([["next",()=>import("./next-SP7JFPGS.js")],["approve",()=>import("./approve-D5AONTPF.js")],["done",()=>import("./done-5FR2OAXK.js")],["block",()=>import("./block-MW7CCPRS.js")],["reset",()=>import("./reset-O4WA2VGI.js")],["cancel",()=>import("./cancel-3JUX5SPS.js")],["wontfix",()=>import("./wontfix-2AKBA54I.js")],["reopen",()=>import("./reopen-H6WXM2OQ.js")]]);var pe=async r=>{let e=r?.[0];if(e==="new")return await B(r?.slice(1));if(e==="list")return await G(r?.slice(1));if(e==="help"||e===void 0){let p=E(),l=y({renderer:$.ansi(),sink:C.stdout()});return l.writeln(`Usage: ${p} spec <new <name> "desc" | list | <name> <command>>`),l.writeln(""),l.writeln(a(" Commands for a spec:")),l.writeln(a(" next, approve, done, block, reset, cancel, wontfix, reopen, revisit, split")),l.writeln(""),l.writeln(a(" Examples:")),l.writeln(a(` ${p} spec new my-feature "Add upload support"`)),l.writeln(a(` ${p} spec my-feature next`)),l.writeln(a(` ${p} spec my-feature next --answer="approve"`)),await l.close(),S(void 0)}let n=e,s=r?.[1];if(s===void 0)return await(await import("./status-MOMQ2FRD.js")).main([`--spec=${n}`]);if(s==="split")return await H([`--spec=${n}`,...r?.slice(2)??[]]);if(s==="revisit")return await J([`--spec=${n}`,...r?.slice(2)??[]]);let i=X.get(s);if(i!==void 0)return await(await i()).main([`--spec=${n}`,...r?.slice(2)??[]]);let o=y({renderer:$.ansi(),sink:C.stdout()});return o.writeln(c(`Unknown command: spec ${n} ${s}`)),o.writeln(a(" Valid: next, approve, done, block, reset, cancel, wontfix, reopen, revisit, split")),await o.close(),d({exitCode:1})},B=async r=>{let e=y({renderer:$.ansi(),sink:C.stdout()}),n=h.process.cwd();if(!await P(n))return e.writeln(c("noskills is not initialized.")," Run: ",u(R("init"))),await e.close(),d({exitCode:1});let s=null,i=[];if(r!==void 0){let m=!1;for(let f of r)f.startsWith("--name=")?(s=f.slice(7),m=!0):f.startsWith("-")||(!m&&s===null?(s=f,m=!0):i.push(f))}let o=i.join(" ");if(s===null||s.length===0)return e.writeln(c("Error: spec name is required.")),e.writeln(a("Example: "),u(`${E()} spec new photo-upload "photo upload feature"`)),await e.close(),d({exitCode:1});if(j.has(s))return e.writeln(c(`"${s}" is a reserved name.`),a(" Choose a different spec name.")),await e.close(),d({exitCode:1});let p=/^[a-z0-9][a-z0-9-]*[a-z0-9]$/;if(s.length>50||s.length>1&&!p.test(s)||s.length===1&&!/^[a-z0-9]$/.test(s))return e.writeln(c("Invalid spec name: "),u(s)),e.writeln(a("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(o.length===0)return e.writeln(c("Please provide a description: "),u(`${E()} spec new --name=${s} "photo upload feature"`)),await e.close(),d({exitCode:1});let l=`spec/${s}`,t=`${n}/${g.specDir(s)}`;try{return await h.fs.stat(t),e.writeln(c(`Spec "${s}" already exists.`),a(` Use a different --name or run \`${E()} reset --spec=${s}\` first.`)),await e.close(),d({exitCode:1})}catch{}let w=b(),x=A(w,s,l,o);return await h.fs.mkdir(`${n}/${g.specDir(s)}`,{recursive:!0}),await v(n,s,x),e.writeln(D("\u2714")," Spec started: ",u(s)),e.writeln(" Directory: ",a(g.specDir(s))),e.writeln(" Branch: ",a(l)),e.writeln(" Phase: ",z("DISCOVERY")),e.writeln(""),e.writeln("Run ",u(R(`next --spec=${s}`))," to begin discovery questions."),await e.close(),S(void 0)},G=async r=>{let e=h.process.cwd(),n=_(r),s=await W(e),i=`${e}/${g.specsDir}`,o=new Set(s.map(t=>t.name)),p=[];for(let t of s)p.push({name:t.name,phase:t.state.phase,iteration:t.state.execution.iteration});try{for await(let t of h.fs.readDir(i))t.isDirectory&&!o.has(t.name)&&p.push({name:t.name,phase:"IDLE",iteration:0})}catch{}if(n==="json")return await U(p,"json"),S(void 0);let l=y({renderer:$.ansi(),sink:C.stdout()});if(l.writeln(u("Specs")),l.writeln(""),p.length===0)l.writeln(a(" No specs yet."));else for(let t of p){let w=t.phase==="COMPLETED"?D(t.phase):t.phase==="EXECUTING"?q(t.phase):t.phase==="BLOCKED"?c(t.phase):z(t.phase),x=t.phase==="EXECUTING"?a(` iteration ${t.iteration}`):"";l.writeln(" ",a("\u25CB")," ",t.name," ",w,x)}return await l.close(),S(void 0)},K=r=>{let e=[],n=0;for(;n<r.length;)if(r[n]==="--into"&&n+1<r.length){let s=r[n+1],i=s;n+2<r.length&&!r[n+2].startsWith("-")?(i=r[n+2],n+=3):n+=2,e.push({name:s,description:i})}else n+=1;return e},H=async r=>{let e=y({renderer:$.ansi(),sink:C.stdout()}),n=h.process.cwd();if(!await P(n))return e.writeln(c("noskills is not initialized.")," Run: ",u(R("init"))),await e.close(),d({exitCode:1});let s=V(r??[]);if(s===null)return e.writeln(c("Error: --spec=<name> is required.")),e.writeln(a("Example: "),u(`${E()} spec split --spec=parent --into name1 "desc1" --into name2 "desc2"`)),await e.close(),d({exitCode:1});let i;try{i=await O(n,s)}catch(t){let w=t instanceof Error?t.message:String(t);return e.writeln(c(`Error: ${w}`)),await e.close(),d({exitCode:1})}if(i.phase!=="DISCOVERY"&&i.phase!=="DISCOVERY_REVIEW")return e.writeln(c(`Cannot split spec in phase ${i.phase}. Must be in DISCOVERY or DISCOVERY_REVIEW.`)),await e.close(),d({exitCode:1});let o=K(r??[]);if(o.length<2){let t=Y(i.discovery.answers);if(!t.detected||t.proposals.length<2)return e.writeln(c("Error: at least 2 --into entries required, or discovery answers must contain 2+ independent areas.")),await e.close(),d({exitCode:1});let w=[];for(let m of t.proposals){let f=`${n}/${g.specDir(m.name)}`;await h.fs.mkdir(f,{recursive:!0});let T=i.discovery.answers.filter(I=>m.relevantAnswers.includes(I.questionId)),k=A(b(),m.name,`spec/${m.name}`);for(let I of T)k=M(k,I.questionId,I.answer);k=N(k),await v(n,m.name,k),w.push(m.name)}let x=F(i,"cancelled",`Split into: ${w.join(", ")}`);await v(n,s,x),e.writeln(D("Split complete."),` Created ${w.length} sub-specs:`);for(let m of w)e.writeln(" ",a("\u25CB")," ",u(m));return e.writeln("",a(`Parent spec "${s}" cancelled.`)),await e.close(),S(void 0)}let p=[];for(let t of o){let w=`${n}/${g.specDir(t.name)}`;await h.fs.mkdir(w,{recursive:!0});let m=A(b(),t.name,`spec/${t.name}`);for(let f of i.discovery.answers)m=M(m,f.questionId,f.answer);m=N(m),await v(n,t.name,m),p.push(t.name)}let l=F(i,"cancelled",`Split into: ${p.join(", ")}`);await v(n,s,l),e.writeln(D("Split complete."),` Created ${p.length} sub-specs:`);for(let t of p)e.writeln(" ",a("\u25CB")," ",u(t));return e.writeln("",a(`Parent spec "${s}" cancelled.`)),await e.close(),S(void 0)},J=async r=>{let e=y({renderer:$.ansi(),sink:C.stdout()}),n=h.process.cwd();if(!await P(n))return e.writeln(c("noskills is not initialized.")," Run: ",u(R("init"))),await e.close(),d({exitCode:1});let s=V(r??[]);if(s===null)return e.writeln(c("Error: --spec=<name> is required.")),e.writeln(a("Example: "),u(`${E()} spec revisit --spec=my-spec "reason for revisit"`)),await e.close(),d({exitCode:1});let i=(r??[]).find(t=>!t.startsWith("--")&&t!==s);if(i===void 0||i.trim().length===0)return e.writeln(c('Error: Reason is required: noskills spec revisit --spec=X "reason"')),await e.close(),d({exitCode:1});let o;try{o=await O(n,s)}catch(t){let w=t instanceof Error?t.message:String(t);return e.writeln(c(`Error: ${w}`)),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(c("Already in planning phase, no need to revisit.")),await e.close(),d({exitCode:1});if(o.phase==="COMPLETED")return e.writeln(c(`Spec is completed. Use \`${E()} reopen --spec=${s}\` instead.`)),await e.close(),d({exitCode:1});if(o.phase==="IDLE"||o.phase==="FREE")return e.writeln(c("No active spec to revisit.")),await e.close(),d({exitCode:1});let p=o.execution.completedTasks.length,l=L(o,i.trim());return await v(n,s,l),e.writeln(D("Revisit complete.")),e.writeln(" Phase: ",u("DISCOVERY"),a(` (revisited from ${o.phase})`)),p>0&&e.writeln(" Previous progress: ",u(`${p} tasks completed`)),e.writeln(" Reason: ",a(`"${i.trim()}"`)),e.writeln(" Discovery answers preserved \u2014 revise or re-approve."),await e.close(),S(void 0)};export{j as RESERVED_NAMES,pe as main};
@@ -1 +1 @@
1
- import{a as f,d as P}from"./chunk-7GUYMD3Z.js";import{a as R,b as S}from"./chunk-ZMVD5IU4.js";import"./chunk-MRZT23BL.js";import"./chunk-7UX6WIXX.js";import{a as k,d as w}from"./chunk-TJZAIUKM.js";import{c as h}from"./chunk-YK6UG66R.js";import{f as b,g as x,l as D,p as v,s as O}from"./chunk-LWCWPXCS.js";import{c as i,d as r,f as c,g as y,h as p,k as I,o as d,q as u,r as m}from"./chunk-Y6AFIAJP.js";import{a as l,b as E}from"./chunk-2N4GTHXQ.js";import{b as C}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var W=async g=>{let t=C.process.cwd(),o=k(g);if(!await O(t)){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=x(g),e=await b(t,V),n=await D(t),T={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:n?.concerns??[],tools:n?.tools??[],decisions:e.decisions.length};if(o==="json"){let a=(await v(t)).filter(N=>n!==null&&n.concerns.includes(N.id)),$=await R(t),j=S(n?.tools??[]),F=P(e,a,$,n,void 0,void 0,void 0,j);return await w({...T,...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"?y(e.phase):e.phase==="BLOCKED"?c(e.phase):e.phase==="EXECUTING"?I(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`))),n!==null&&(s.writeln(""),n.concerns.length>0&&s.writeln(" Concerns: ",r(n.concerns.join(", "))),n.tools.length>0&&s.writeln(" Tools: ",r(n.tools.join(", ")))),e.decisions.length>0&&(s.writeln(""),s.writeln(` Decisions: ${e.decisions.length}`)),await s.close()}return l(void 0)};export{W as main};
1
+ import{a as f,d as P}from"./chunk-QMZBEPES.js";import{c as R,d as S}from"./chunk-OV7ZXBXC.js";import"./chunk-7UX6WIXX.js";import"./chunk-MRZT23BL.js";import{a as k,d as w}from"./chunk-TJZAIUKM.js";import{c as h}from"./chunk-YK6UG66R.js";import{A as O,f as b,g as x,l as D,p as v}from"./chunk-QYMX2GR3.js";import{c as i,d as r,f as c,g as y,h as p,k as I,o as d,q as u,r as m}from"./chunk-Y6AFIAJP.js";import{a as l,b as E}from"./chunk-2N4GTHXQ.js";import{b as C}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var W=async g=>{let t=C.process.cwd(),o=k(g);if(!await O(t)){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=x(g),e=await b(t,V),n=await D(t),T={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:n?.concerns??[],tools:n?.tools??[],decisions:e.decisions.length};if(o==="json"){let a=(await v(t)).filter(N=>n!==null&&n.concerns.includes(N.id)),$=await R(t),j=S(n?.tools??[]),F=P(e,a,$,n,void 0,void 0,void 0,j);return await w({...T,...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"?y(e.phase):e.phase==="BLOCKED"?c(e.phase):e.phase==="EXECUTING"?I(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`))),n!==null&&(s.writeln(""),n.concerns.length>0&&s.writeln(" Concerns: ",r(n.concerns.join(", "))),n.tools.length>0&&s.writeln(" Tools: ",r(n.tools.join(", ")))),e.decisions.length>0&&(s.writeln(""),s.writeln(` Decisions: ${e.decisions.length}`)),await s.close()}return l(void 0)};export{W as main};
@@ -1 +1 @@
1
- import{c as w}from"./chunk-ZMVD5IU4.js";import{c as g}from"./chunk-YK6UG66R.js";import{l as u}from"./chunk-LWCWPXCS.js";import{c as m,d as r,f as c,g as n,o as p,q as d,r as f}from"./chunk-Y6AFIAJP.js";import{a as o,b as a}from"./chunk-2N4GTHXQ.js";import{b as l}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var v=async h=>{let s=p({renderer:f.ansi(),sink:d.stdout()}),t=l.process.cwd(),e=await u(t);if(e===null)return s.writeln(c("noskills is not initialized.")," Run: ",m(g("init"))),await s.close(),a({exitCode:1});s.writeln(r("Syncing tool files..."));let i=await w(t,e.tools,e);for(let y of i)s.writeln(" ",n("\u2714"),` ${y}`);return i.length===0&&s.writeln(r(" No tools configured.")),s.writeln(""),s.writeln(n("Done.")),await s.close(),o(void 0)};export{v as main};
1
+ import{e as w}from"./chunk-OV7ZXBXC.js";import{c as g}from"./chunk-YK6UG66R.js";import{l as u}from"./chunk-QYMX2GR3.js";import{c as m,d as r,f as c,g as n,o as p,q as d,r as f}from"./chunk-Y6AFIAJP.js";import{a as o,b as a}from"./chunk-2N4GTHXQ.js";import{b as l}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var v=async h=>{let s=p({renderer:f.ansi(),sink:d.stdout()}),t=l.process.cwd(),e=await u(t);if(e===null)return s.writeln(c("noskills is not initialized.")," Run: ",m(g("init"))),await s.close(),a({exitCode:1});s.writeln(r("Syncing tool files..."));let i=await w(t,e.tools,e);for(let y of i)s.writeln(" ",n("\u2714"),` ${y}`);return i.length===0&&s.writeln(r(" No tools configured.")),s.writeln(""),s.writeln(n("Done.")),await s.close(),o(void 0)};export{v as main};
@@ -1,4 +1,4 @@
1
- import{a as v,c as L}from"./chunk-TJZAIUKM.js";import{a as F,c as I}from"./chunk-VPXOI7CR.js";import{e as S,k as x,l as P,s as D}from"./chunk-LWCWPXCS.js";import{a as y,b as C}from"./chunk-2N4GTHXQ.js";import{b as f}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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 F(e,t.spec);if(n!==null){u=n.tasks.length,a=t.execution.completedTasks.length;let g=I(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(`
1
+ import{a as v,c as L}from"./chunk-TJZAIUKM.js";import{a as F,c as I}from"./chunk-VPXOI7CR.js";import{A as D,e as S,k as x,l as P}from"./chunk-QYMX2GR3.js";import{a as y,b as C}from"./chunk-2N4GTHXQ.js";import{b as f}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.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 F(e,t.spec);if(n!==null){u=n.tasks.length,a=t.execution.completedTasks.length;let g=I(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
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",h="\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}},O=(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=>`${h}\u2502${o} ${U(a,52)}${h}\u2502${o}`,c=()=>`${h}\u2502${"".padEnd(54)}\u2502${o}`;if(t.push(`${h}\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=O(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(` ${h}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=O(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(` ${h}${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==="FREE"?t.push(s(`${h}Free mode \u2014 no enforcement${o}`)):e.phase==="IDLE"&&t.push(s(`${h}No active work${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(`${h}\u2570${l}\u256F${o}`),t.push(` ${h}watching .eser/.state/ ... ctrl+c to stop${o}`),t.join(`
3
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
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 m=new TextEncoder,$=f.process.stdout.getWriter();await $.write(m.encode(n+`
@@ -1 +1 @@
1
- import{a as y,d as A}from"./chunk-3SLKOP72.js";import{m as E}from"./chunk-TMC5H2A5.js";import{d as x,f as S,h as g,i as k,j as C}from"./chunk-LWCWPXCS.js";import{d as u,f as n,g as f,o as d,q as w,r as h}from"./chunk-Y6AFIAJP.js";import{a as m,b as i}from"./chunk-2N4GTHXQ.js";import{b as c}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var q=async l=>{let e=d({renderer:h.ansi(),sink:w.stdout()}),a=c.process.cwd(),o=g(l);if(!o.ok)return e.writeln(n(o.error)),await e.close(),i({exitCode:1});let p=(l??[]).filter(r=>!r.startsWith("--spec=")).join(" ");if(p.length===0)return e.writeln(n('A reason is required: noskills wontfix "reason text"')),await e.close(),i({exitCode:1});let s;try{s=await S(a,o.spec)}catch(r){let D=r instanceof Error?r.message:String(r);return e.writeln(n(D)),await e.close(),i({exitCode:1})}if(s.phase==="IDLE"||s.phase==="FREE"||s.phase==="UNINITIALIZED"||s.phase==="COMPLETED")return e.writeln(n(`Cannot mark as won't fix in phase: ${s.phase}`)),await e.close(),i({exitCode:1});if(s.spec!==null){let r=`${a}/${x.specDir(s.spec)}`;try{await c.fs.stat(r)}catch{return e.writeln(n(`Active spec '${s.spec}' directory not found.`)),e.writeln(u("Run `noskills reset` to return to IDLE.")),await e.close(),i({exitCode:1})}}let t=E(s,"wontfix",p);return await k(a,t),t.spec!==null&&await C(a,t.spec,t),t.spec!==null&&(await y(a,t.spec,"wontfix"),await A(a,t.spec,"wontfix")),e.writeln(f("\u2714"),` Spec marked as won't fix: ${p}`),await e.close(),m(void 0)};export{q as main};
1
+ import{a as y,d as A}from"./chunk-6FTHIS2Z.js";import{n as E}from"./chunk-FJCXMC2D.js";import{d as x,f as S,h as g,i as k,j as C}from"./chunk-QYMX2GR3.js";import{d as u,f as n,g as f,o as d,q as w,r as h}from"./chunk-Y6AFIAJP.js";import{a as m,b as i}from"./chunk-2N4GTHXQ.js";import{b as c}from"./chunk-MNEZ5QGX.js";import"./chunk-DHMCIRLT.js";import"./chunk-4BH6CF3J.js";import"./chunk-OTRBRRIO.js";var q=async l=>{let e=d({renderer:h.ansi(),sink:w.stdout()}),a=c.process.cwd(),o=g(l);if(!o.ok)return e.writeln(n(o.error)),await e.close(),i({exitCode:1});let p=(l??[]).filter(r=>!r.startsWith("--spec=")).join(" ");if(p.length===0)return e.writeln(n('A reason is required: noskills wontfix "reason text"')),await e.close(),i({exitCode:1});let s;try{s=await S(a,o.spec)}catch(r){let D=r instanceof Error?r.message:String(r);return e.writeln(n(D)),await e.close(),i({exitCode:1})}if(s.phase==="IDLE"||s.phase==="FREE"||s.phase==="UNINITIALIZED"||s.phase==="COMPLETED")return e.writeln(n(`Cannot mark as won't fix in phase: ${s.phase}`)),await e.close(),i({exitCode:1});if(s.spec!==null){let r=`${a}/${x.specDir(s.spec)}`;try{await c.fs.stat(r)}catch{return e.writeln(n(`Active spec '${s.spec}' directory not found.`)),e.writeln(u("Run `noskills reset` to return to IDLE.")),await e.close(),i({exitCode:1})}}let t=E(s,"wontfix",p);return await k(a,t),t.spec!==null&&await C(a,t.spec,t),t.spec!==null&&(await y(a,t.spec,"wontfix"),await A(a,t.spec,"wontfix")),e.writeln(f("\u2714"),` Spec marked as won't fix: ${p}`),await e.close(),m(void 0)};export{q as main};
package/noskills.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{a as t}from"./chunks/chunk-ALZM4JXG.js";import{c as o}from"./chunks/chunk-2N4GTHXQ.js";import{b as s}from"./chunks/chunk-MNEZ5QGX.js";import"./chunks/chunk-DHMCIRLT.js";import"./chunks/chunk-4BH6CF3J.js";import"./chunks/chunk-OTRBRRIO.js";var r=new t({description:"noskills \u2014 state-machine orchestrator for AI agents",modules:{init:{description:"Initialize noskills in project",load:()=>import("./chunks/init-M4MSHCVJ.js")},status:{description:"Show current state",load:()=>import("./chunks/status-63TFVF7Y.js")},spec:{description:"Manage specs (new, list)",load:()=>import("./chunks/spec-HQZVVCBY.js")},next:{description:"Get next instruction for agent",load:()=>import("./chunks/next-4DJGEJBW.js")},approve:{description:"Approve phase transition",load:()=>import("./chunks/approve-NPG6X7O6.js")},block:{description:"Mark spec as blocked",load:()=>import("./chunks/block-LSEXCK45.js")},reset:{description:"Reset current spec state",load:()=>import("./chunks/reset-WRTVX7TT.js")},done:{description:"Mark spec execution as complete",load:()=>import("./chunks/done-OMGLEA32.js")},free:{description:"Enter or exit free mode (no enforcement)",load:()=>import("./chunks/free-BO5UA5V2.js")},cancel:{description:"Cancel current spec",load:()=>import("./chunks/cancel-BK6GCIIY.js")},wontfix:{description:"Mark spec as won't fix (requires reason)",load:()=>import("./chunks/wontfix-BOT7HHH2.js")},reopen:{description:"Reopen a completed spec for revision",load:()=>import("./chunks/reopen-EKSLLO54.js")},concern:{description:"Manage concerns (add, remove, list)",load:()=>import("./chunks/concern-3K3QUYG4.js")},run:{description:"Autonomous execution loop (Ralph loop)",load:()=>import("./chunks/run-3VWWQDN2.js")},watch:{description:"Live dashboard for monitoring agent progress",load:()=>import("./chunks/watch-4HJMGNF4.js")},sync:{description:"Regenerate tool-specific files",load:()=>import("./chunks/sync-VS4HROEX.js")},purge:{description:"Remove all noskills content (specs, rules, concerns, hooks)",load:()=>import("./chunks/purge-MDSEQLDQ.js")},"invoke-hook":{description:"Internal hook handlers (called by agents)",load:()=>import("./chunks/invoke-hook-HB2TBCHD.js")},rule:{description:"Manage rules (add, list, promote)",load:()=>import("./chunks/rule-QP5BSH27.js")}}});var i={name:"@eser/noskills",version:"4.1.44",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=r.toCommand("noskills",i.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-XYJXQHQN.js";import{c as o}from"./chunks/chunk-2N4GTHXQ.js";import{b as s}from"./chunks/chunk-MNEZ5QGX.js";import"./chunks/chunk-DHMCIRLT.js";import"./chunks/chunk-4BH6CF3J.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-HIQXEJDS.js")},status:{description:"Show current state",load:()=>import("./chunks/status-MOMQ2FRD.js")},spec:{description:"Manage specs (new, list)",load:()=>import("./chunks/spec-2FKI55EV.js")},next:{description:"Get next instruction for agent",load:()=>import("./chunks/next-SP7JFPGS.js")},approve:{description:"Approve phase transition",load:()=>import("./chunks/approve-D5AONTPF.js")},block:{description:"Mark spec as blocked",load:()=>import("./chunks/block-MW7CCPRS.js")},reset:{description:"Reset current spec state",load:()=>import("./chunks/reset-O4WA2VGI.js")},done:{description:"Mark spec execution as complete",load:()=>import("./chunks/done-5FR2OAXK.js")},free:{description:"Enter or exit free mode (no enforcement)",load:()=>import("./chunks/free-KPB37MR3.js")},cancel:{description:"Cancel current spec",load:()=>import("./chunks/cancel-3JUX5SPS.js")},wontfix:{description:"Mark spec as won't fix (requires reason)",load:()=>import("./chunks/wontfix-2AKBA54I.js")},reopen:{description:"Reopen a completed spec for revision",load:()=>import("./chunks/reopen-H6WXM2OQ.js")},concern:{description:"Manage concerns (add, remove, list)",load:()=>import("./chunks/concern-XME2LKJJ.js")},run:{description:"Autonomous execution loop (Ralph loop)",load:()=>import("./chunks/run-7OEMPUFO.js")},watch:{description:"Live dashboard for monitoring agent progress",load:()=>import("./chunks/watch-GMTD4676.js")},sync:{description:"Regenerate tool-specific files",load:()=>import("./chunks/sync-YI7WLQP2.js")},purge:{description:"Remove all noskills content (specs, rules, concerns, hooks)",load:()=>import("./chunks/purge-OAHH3MCY.js")},"invoke-hook":{description:"Internal hook handlers (called by agents)",load:()=>import("./chunks/invoke-hook-NXZYKSHD.js")},rule:{description:"Manage rules (add, list, promote)",load:()=>import("./chunks/rule-IHME5I6Q.js")},session:{description:"Manage sessions for multi-instance support",load:()=>import("./chunks/session-NSWI2Q3S.js")},manager:{description:"Multi-spec TUI with tab management",load:()=>import("./chunks/manager-OOJQ6WXI.js")},mgr:{description:"Alias for manager",load:()=>import("./chunks/manager-OOJQ6WXI.js")}}});var r={name:"@eser/noskills",version:"4.1.47",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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noskills",
3
- "version": "4.1.44",
3
+ "version": "4.1.47",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "noskills": "./noskills.js"