@staff0rd/assist 0.185.0 → 0.186.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -33,6 +33,7 @@ After installation, the `assist` command will be available globally. You can als
33
33
 
34
34
  ## Claude Commands
35
35
 
36
+ - `/add-command` - Add a new run command to assist.yml
36
37
  - `/bug` - File a bug with reproduction steps, expected and actual behavior
37
38
  - `/comment` - Add pending review comments to the current PR
38
39
  - `/commit` - Commit only relevant files from the session
@@ -0,0 +1,28 @@
1
+ ---
2
+ description: Add a new run command to assist.yml
3
+ allowed_args: "[description of the command to add]"
4
+ ---
5
+
6
+ The user wants to register a new run command via `assist run add`. This command adds a named entry to the `run` section of `assist.yml` so it can be invoked with `assist run <name>`.
7
+
8
+ ## Step 1: Understand the request
9
+
10
+ If the user provided a description via $ARGUMENTS, use that as a starting point. Otherwise, ask what command they want to add.
11
+
12
+ ## Step 2: Determine the correct syntax
13
+
14
+ Run `assist run add --help` to see the current CLI usage and options. Use the output to construct the correct command.
15
+
16
+ ## Step 3: Add the command
17
+
18
+ Run `assist run add <name> <command> [args...]` with the appropriate arguments. For example:
19
+
20
+ ```
21
+ assist run add lint biome check --write
22
+ ```
23
+
24
+ If the command needs a working directory, use `--cwd <dir>`.
25
+
26
+ ## Step 4: Verify
27
+
28
+ Run `assist run <name>` to confirm the command works, or `assist run <name> --help` if it accepts params.
@@ -64,7 +64,7 @@ ${e}</tr>
64
64
  `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
65
65
  `}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${Jt(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let a=this.parser.parseInline(n),l=L0(e);if(l===null)return a;e=l;let r='<a href="'+e+'"';return t&&(r+=' title="'+Jt(t)+'"'),r+=">"+a+"</a>",r}image({href:e,title:t,text:n,tokens:a}){a&&(n=this.parser.parseInline(a,this.parser.textRenderer));let l=L0(e);if(l===null)return Jt(n);e=l;let r=`<img src="${e}" alt="${n}"`;return t&&(r+=` title="${Jt(t)}"`),r+=">",r}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:Jt(e.text)}},wd=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}},wn=class md{constructor(t){B(this,"options");B(this,"renderer");B(this,"textRenderer");this.options=t||Ba,this.options.renderer=this.options.renderer||new _u,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new wd}static parse(t,n){return new md(n).parse(t)}static parseInline(t,n){return new md(n).parseInline(t)}parse(t,n=!0){let a="";for(let l=0;l<t.length;l++){let r=t[l];if(this.options.extensions?.renderers?.[r.type]){let o=r,u=this.options.extensions.renderers[o.type].call({parser:this},o);if(u!==!1||!["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(o.type)){a+=u||"";continue}}let i=r;switch(i.type){case"space":{a+=this.renderer.space(i);continue}case"hr":{a+=this.renderer.hr(i);continue}case"heading":{a+=this.renderer.heading(i);continue}case"code":{a+=this.renderer.code(i);continue}case"table":{a+=this.renderer.table(i);continue}case"blockquote":{a+=this.renderer.blockquote(i);continue}case"list":{a+=this.renderer.list(i);continue}case"html":{a+=this.renderer.html(i);continue}case"paragraph":{a+=this.renderer.paragraph(i);continue}case"text":{let o=i,u=this.renderer.text(o);for(;l+1<t.length&&t[l+1].type==="text";)o=t[++l],u+=`
66
66
  `+this.renderer.text(o);n?a+=this.renderer.paragraph({type:"paragraph",raw:u,text:u,tokens:[{type:"text",raw:u,text:u,escaped:!0}]}):a+=u;continue}default:{let o='Token with "'+i.type+'" type was not found.';if(this.options.silent)return console.error(o),"";throw new Error(o)}}}return a}parseInline(t,n=this.renderer){let a="";for(let l=0;l<t.length;l++){let r=t[l];if(this.options.extensions?.renderers?.[r.type]){let o=this.options.extensions.renderers[r.type].call({parser:this},r);if(o!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(r.type)){a+=o||"";continue}}let i=r;switch(i.type){case"escape":{a+=n.text(i);break}case"html":{a+=n.html(i);break}case"link":{a+=n.link(i);break}case"image":{a+=n.image(i);break}case"strong":{a+=n.strong(i);break}case"em":{a+=n.em(i);break}case"codespan":{a+=n.codespan(i);break}case"br":{a+=n.br(i);break}case"del":{a+=n.del(i);break}case"text":{a+=n.text(i);break}default:{let o='Token with "'+i.type+'" type was not found.';if(this.options.silent)return console.error(o),"";throw new Error(o)}}}return a}},fd,Cu=(fd=class{constructor(e){B(this,"options");B(this,"block");this.options=e||Ba}preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}provideLexer(){return this.block?En.lex:En.lexInline}provideParser(){return this.block?wn.parse:wn.parseInline}},B(fd,"passThroughHooks",new Set(["preprocess","postprocess","processAllTokens"])),fd),Zx=class{constructor(...e){B(this,"defaults",pd());B(this,"options",this.setOptions);B(this,"parse",this.parseMarkdown(!0));B(this,"parseInline",this.parseMarkdown(!1));B(this,"Parser",wn);B(this,"Renderer",_u);B(this,"TextRenderer",wd);B(this,"Lexer",En);B(this,"Tokenizer",Au);B(this,"Hooks",Cu);this.use(...e)}walkTokens(e,t){let n=[];for(let a of e)switch(n=n.concat(t.call(this,a)),a.type){case"table":{let l=a;for(let r of l.header)n=n.concat(this.walkTokens(r.tokens,t));for(let r of l.rows)for(let i of r)n=n.concat(this.walkTokens(i.tokens,t));break}case"list":{let l=a;n=n.concat(this.walkTokens(l.items,t));break}default:{let l=a;this.defaults.extensions?.childTokens?.[l.type]?this.defaults.extensions.childTokens[l.type].forEach(r=>{let i=l[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):l.tokens&&(n=n.concat(this.walkTokens(l.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let a={...n};if(a.async=this.defaults.async||a.async||!1,n.extensions&&(n.extensions.forEach(l=>{if(!l.name)throw new Error("extension name required");if("renderer"in l){let r=t.renderers[l.name];r?t.renderers[l.name]=function(...i){let o=l.renderer.apply(this,i);return o===!1&&(o=r.apply(this,i)),o}:t.renderers[l.name]=l.renderer}if("tokenizer"in l){if(!l.level||l.level!=="block"&&l.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let r=t[l.level];r?r.unshift(l.tokenizer):t[l.level]=[l.tokenizer],l.start&&(l.level==="block"?t.startBlock?t.startBlock.push(l.start):t.startBlock=[l.start]:l.level==="inline"&&(t.startInline?t.startInline.push(l.start):t.startInline=[l.start]))}"childTokens"in l&&l.childTokens&&(t.childTokens[l.name]=l.childTokens)}),a.extensions=t),n.renderer){let l=this.defaults.renderer||new _u(this.defaults);for(let r in n.renderer){if(!(r in l))throw new Error(`renderer '${r}' does not exist`);if(["options","parser"].includes(r))continue;let i=r,o=n.renderer[i],u=l[i];l[i]=(...s)=>{let f=o.apply(l,s);return f===!1&&(f=u.apply(l,s)),f||""}}a.renderer=l}if(n.tokenizer){let l=this.defaults.tokenizer||new Au(this.defaults);for(let r in n.tokenizer){if(!(r in l))throw new Error(`tokenizer '${r}' does not exist`);if(["options","rules","lexer"].includes(r))continue;let i=r,o=n.tokenizer[i],u=l[i];l[i]=(...s)=>{let f=o.apply(l,s);return f===!1&&(f=u.apply(l,s)),f}}a.tokenizer=l}if(n.hooks){let l=this.defaults.hooks||new Cu;for(let r in n.hooks){if(!(r in l))throw new Error(`hook '${r}' does not exist`);if(["options","block"].includes(r))continue;let i=r,o=n.hooks[i],u=l[i];Cu.passThroughHooks.has(r)?l[i]=s=>{if(this.defaults.async)return Promise.resolve(o.call(l,s)).then(c=>u.call(l,c));let f=o.call(l,s);return u.call(l,f)}:l[i]=(...s)=>{let f=o.apply(l,s);return f===!1&&(f=u.apply(l,s)),f}}a.hooks=l}if(n.walkTokens){let l=this.defaults.walkTokens,r=n.walkTokens;a.walkTokens=function(i){let o=[];return o.push(r.call(this,i)),l&&(o=o.concat(l.call(this,i))),o}}this.defaults={...this.defaults,...a}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return En.lex(e,t??this.defaults)}parser(e,t){return wn.parse(e,t??this.defaults)}parseMarkdown(e){return(n,a)=>{let l={...a},r={...this.defaults,...l},i=this.onError(!!r.silent,!!r.async);if(this.defaults.async===!0&&l.async===!1)return i(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof n>"u"||n===null)return i(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));r.hooks&&(r.hooks.options=r,r.hooks.block=e);let o=r.hooks?r.hooks.provideLexer():e?En.lex:En.lexInline,u=r.hooks?r.hooks.provideParser():e?wn.parse:wn.parseInline;if(r.async)return Promise.resolve(r.hooks?r.hooks.preprocess(n):n).then(s=>o(s,r)).then(s=>r.hooks?r.hooks.processAllTokens(s):s).then(s=>r.walkTokens?Promise.all(this.walkTokens(s,r.walkTokens)).then(()=>s):s).then(s=>u(s,r)).then(s=>r.hooks?r.hooks.postprocess(s):s).catch(i);try{r.hooks&&(n=r.hooks.preprocess(n));let s=o(n,r);r.hooks&&(s=r.hooks.processAllTokens(s)),r.walkTokens&&this.walkTokens(s,r.walkTokens);let f=u(s,r);return r.hooks&&(f=r.hooks.postprocess(f)),f}catch(s){return i(s)}}}onError(e,t){return n=>{if(n.message+=`
67
- Please report this to https://github.com/markedjs/marked.`,e){let a="<p>An error occurred:</p><pre>"+Jt(n.message+"",!0)+"</pre>";return t?Promise.resolve(a):a}if(t)return Promise.reject(n);throw n}}},Ua=new Zx;function H(e,t){return Ua.parse(e,t)}H.options=H.setOptions=function(e){return Ua.setOptions(e),H.defaults=Ua.defaults,U0(H.defaults),H};H.getDefaults=pd;H.defaults=Ba;H.use=function(...e){return Ua.use(...e),H.defaults=Ua.defaults,U0(H.defaults),H};H.walkTokens=function(e,t){return Ua.walkTokens(e,t)};H.parseInline=Ua.parseInline;H.Parser=wn;H.parser=wn.parse;H.Renderer=_u;H.TextRenderer=wd;H.Lexer=En;H.lexer=En.lex;H.Tokenizer=Au;H.Hooks=Cu;H.parse=H;var vN=H.options,bN=H.setOptions,RN=H.use,SN=H.walkTokens,EN=H.parseInline;var wN=wn.parse,xN=En.lex;var P0=w(M(),1),xn=w(D(),1);function Kx({text:e}){return(0,xn.jsx)("div",{className:"border border-gray-200 rounded-md p-3 mt-2 min-h-[60px] bg-gray-50",dangerouslySetInnerHTML:{__html:H.parse(e||"")}})}function X0({value:e,onChange:t}){let[n,a]=(0,P0.useState)(!1);return(0,xn.jsxs)(Fe.Root,{className:"mb-4",children:[(0,xn.jsxs)(Fe.Label,{className:"block font-medium mb-1 text-sm",children:["Description"," ",(0,xn.jsx)("button",{type:"button",className:"text-xs text-blue-600 cursor-pointer ml-2 bg-transparent border-none p-0",onClick:()=>a(!n),children:"(preview)"})]}),(0,xn.jsx)(Fe.Control,{className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm font-[inherit] min-h-[120px] resize-y",render:(0,xn.jsx)("textarea",{}),placeholder:"Markdown supported",value:e,onChange:l=>t(l.target.value)}),n&&(0,xn.jsx)(Kx,{text:e})]})}var fi=w(D(),1);function Q0({submitLabel:e,onCancel:t}){return(0,fi.jsxs)("div",{className:"flex gap-2 mt-4",children:[(0,fi.jsx)("button",{type:"submit",className:"bg-blue-600 hover:bg-blue-700 text-white rounded-md px-4 py-2 text-sm font-medium cursor-pointer",children:e}),(0,fi.jsx)("button",{type:"button",className:"bg-gray-200 hover:bg-gray-300 text-gray-800 rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:t,children:"Cancel"})]})}async function Z0(e,t,n,a,l){let r=t.trim();if(!r)return;let i={type:e,name:r,description:n.trim()||void 0,acceptanceCriteria:a.map(u=>u.trim()).filter(Boolean)};return l?(await bv(l.id,i),l.id):(await gv(i)).id}function K0(e){return{type:e?.type??"story",name:e?.name??"",description:e?.description??"",ac:e?.acceptanceCriteria??[],title:e?"Edit Item":"Add Item",submitLabel:e?"Save":"Add"}}async function J0(e,t,n,a,l,r,i){e.preventDefault();let o=await Z0(t,n,a,l,r);o!==void 0&&await i(o)}var Fl=w(D(),1);function W0({value:e,onChange:t}){return(0,Fl.jsxs)(Fe.Root,{className:"mb-4",children:[(0,Fl.jsx)(Fe.Label,{className:"block font-medium mb-1 text-sm",children:"Name"}),(0,Fl.jsx)(Fe.Control,{className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm font-[inherit]",required:!0,placeholder:"Item name",value:e,onChange:n=>t(n.target.value)}),(0,Fl.jsx)(Fe.Error,{className:"text-red-500 text-xs mt-1",match:"valueMissing",children:"Name is required."})]})}var ta=w(D(),1);function eb({value:e,onChange:t}){return(0,ta.jsxs)("fieldset",{className:"mb-4",children:[(0,ta.jsx)("legend",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Type"}),(0,ta.jsx)("div",{className:"flex gap-4",children:["story","bug"].map(n=>(0,ta.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[(0,ta.jsx)("input",{type:"radio",name:"type",value:n,checked:e===n,onChange:()=>t(n)}),(0,ta.jsx)("span",{className:"text-sm capitalize",children:n})]},n))})]})}var gt=w(D(),1);function Ou({item:e,onReload:t,backTo:n}){let a=Ht(),l=K0(e),[r,i]=(0,Yl.useState)(l.type),[o,u]=(0,Yl.useState)(l.name),[s,f]=(0,Yl.useState)(l.description),c=(0,Yl.useRef)(l.ac),d=()=>a(n);return(0,gt.jsxs)(gt.Fragment,{children:[(0,gt.jsx)(wu,{to:n}),(0,gt.jsxs)(td,{className:"bg-white rounded-lg p-6 border border-gray-200",onSubmit:m=>J0(m,r,o,s,c.current,e,async g=>{await t(),a(`/items/${g}`)}),children:[(0,gt.jsx)("h2",{className:"mb-4",children:l.title}),(0,gt.jsx)(eb,{value:r,onChange:i}),(0,gt.jsx)(W0,{value:o,onChange:u}),(0,gt.jsx)(X0,{value:s,onChange:f}),(0,gt.jsx)(D0,{initial:l.ac,onChange:m=>{c.current=m}}),(0,gt.jsx)(Q0,{submitLabel:l.submitLabel,onCancel:d})]})]})}var Ee={};function nb(e){return"init"in e}function xd(e){return!!e.write}function tb(e){return"v"in e||"e"in e}function Mu(e){if("e"in e)throw e.e;if((Ee.env?Ee.env.MODE:void 0)!=="production"&&!("v"in e))throw new Error("[Bug] atom state is not initialized");return e.v}function Lu(e){return typeof e?.then=="function"}function ab(e,t,n){if(!n.p.has(e)){n.p.add(e);let a=()=>n.p.delete(e);t.then(a,a)}}function lb(e,t,n){var a;let l=new Set;for(let r of((a=n.get(e))==null?void 0:a.t)||[])l.add(r);for(let r of t.p)l.add(r);return l}var Jx=(e,t,...n)=>t.read(...n),Wx=(e,t,...n)=>t.write(...n),eC=(e,t)=>{var n;return(n=t.INTERNAL_onInit)==null?void 0:n.call(t,e)},tC=(e,t,n)=>{var a;return(a=t.onMount)==null?void 0:a.call(t,n)},nC=(e,t)=>{var n;let a=Te(e),l=a[0],r=a[6],i=a[9];if((Ee.env?Ee.env.MODE:void 0)!=="production"&&!t)throw new Error("Atom is undefined or null");let o=l.get(t);return o||(o={d:new Map,p:new Set,n:0},l.set(t,o),(n=r.i)==null||n.call(r,t),i?.(e,t)),o},aC=e=>{let t=Te(e),n=t[1],a=t[3],l=t[4],r=t[5],i=t[6],o=t[13],u=[],s=f=>{try{f()}catch(c){u.push(c)}};do{i.f&&s(i.f);let f=new Set,c=f.add.bind(f);a.forEach(d=>{var m;return(m=n.get(d))==null?void 0:m.l.forEach(c)}),a.clear(),r.forEach(c),r.clear(),l.forEach(c),l.clear(),f.forEach(s),a.size&&o(e)}while(a.size||r.size||l.size);if(u.length)throw new AggregateError(u)},lC=e=>{let t=Te(e),n=t[1],a=t[2],l=t[3],r=t[11],i=t[14],o=t[17],u=[],s=new WeakSet,f=new WeakSet,c=Array.from(l);for(;c.length;){let d=c[c.length-1],m=r(e,d);if(f.has(d)){c.pop();continue}if(s.has(d)){if(a.get(d)===m.n)u.push([d,m]);else if((Ee.env?Ee.env.MODE:void 0)!=="production"&&a.has(d))throw new Error("[Bug] invalidated atom exists");f.add(d),c.pop();continue}s.add(d);for(let g of lb(d,m,n))s.has(g)||c.push(g)}for(let d=u.length-1;d>=0;--d){let[m,g]=u[d],v=!1;for(let R of g.d.keys())if(R!==m&&l.has(R)){v=!0;break}v&&(i(e,m),o(e,m)),a.delete(m)}},Cd=new WeakSet,rC=(e,t)=>{var n,a;let l=Te(e),r=l[1],i=l[2],o=l[3],u=l[6],s=l[7],f=l[11],c=l[12],d=l[13],m=l[14],g=l[16],v=l[17],R=l[20],p=l[26],h=f(e,t);if(tb(h)){if(r.has(t)&&i.get(t)!==h.n)return h;let L=!1;for(let[I,G]of h.d)if(m(e,I).n!==G){L=!0;break}if(!L)return h}let y=!0,b=new Set(h.d.keys()),S=new Map,C=()=>{for(let L of b)S.has(L)||h.d.delete(L)},x=()=>{if(r.has(t)){let L=!o.size;v(e,t),L&&(d(e),c(e))}},T=L=>{var I;if(L===t){let oe=f(e,L);if(!tb(oe))if(nb(L))R(e,L,L.init);else throw new Error("no atom init");return Mu(oe)}let G=m(e,L);try{return Mu(G)}finally{S.set(L,G.n),h.d.set(L,G.n),Lu(h.v)&&ab(t,h.v,G),r.has(t)&&((I=r.get(L))==null||I.t.add(t)),y||x()}},A,O,te={get signal(){return A||(A=new AbortController),A.signal},get setSelf(){return(Ee.env?Ee.env.MODE:void 0)!=="production"&&console.warn("[DEPRECATED] setSelf is deprecated and will be removed in v3."),(Ee.env?Ee.env.MODE:void 0)!=="production"&&!xd(t)&&console.warn("setSelf function cannot be used with read-only atom"),!O&&xd(t)&&(O=(...L)=>{if((Ee.env?Ee.env.MODE:void 0)!=="production"&&y&&console.warn("setSelf function cannot be called in sync"),!y)try{return g(e,t,...L)}finally{d(e),c(e)}}),O}},de=h.n;try{(Ee.env?Ee.env.MODE:void 0)!=="production"&&Cd.delete(e);let L=s(e,t,T,te);if((Ee.env?Ee.env.MODE:void 0)!=="production"&&Cd.has(e)&&console.warn("Detected store mutation during atom read. This is not supported."),R(e,t,L),Lu(L)){p(e,L,()=>A?.abort());let I=()=>{C(),x()};L.then(I,I)}else C();return(n=u.r)==null||n.call(u,t),h}catch(L){return delete h.v,h.e=L,++h.n,h}finally{y=!1,de!==h.n&&i.get(t)===de&&(i.set(t,h.n),o.add(t),(a=u.c)==null||a.call(u,t))}},iC=(e,t)=>{let n=Te(e),a=n[1],l=n[2],r=n[11],i=[t];for(;i.length;){let o=i.pop(),u=r(e,o);for(let s of lb(o,u,a)){let f=r(e,s);l.get(s)!==f.n&&(l.set(s,f.n),i.push(s))}}},oC=(e,t,...n)=>{let a=Te(e),l=a[3],r=a[6],i=a[8],o=a[11],u=a[12],s=a[13],f=a[14],c=a[15],d=a[16],m=a[17],g=a[20],v=!0,R=h=>Mu(f(e,h)),p=(h,...y)=>{var b;let S=o(e,h);try{if(h===t){if(!nb(h))throw new Error("atom not writable");(Ee.env?Ee.env.MODE:void 0)!=="production"&&Cd.add(e);let C=S.n,x=y[0];g(e,h,x),m(e,h),C!==S.n&&(l.add(h),c(e,h),(b=r.c)==null||b.call(r,h));return}else return d(e,h,...y)}finally{v||(s(e),u(e))}};try{return i(e,t,R,p,...n)}finally{v=!1}},uC=(e,t)=>{var n;let a=Te(e),l=a[1],r=a[3],i=a[6],o=a[11],u=a[15],s=a[18],f=a[19],c=o(e,t),d=l.get(t);if(d){for(let[m,g]of c.d)if(!d.d.has(m)){let v=o(e,m);s(e,m).t.add(t),d.d.add(m),g!==v.n&&(r.add(m),u(e,m),(n=i.c)==null||n.call(i,m))}for(let m of d.d)if(!c.d.has(m)){d.d.delete(m);let g=f(e,m);g?.t.delete(t)}}},sC=(e,t)=>{var n;let a=Te(e),l=a[1],r=a[4],i=a[6],o=a[10],u=a[11],s=a[12],f=a[13],c=a[14],d=a[16],m=a[18],g=u(e,t),v=l.get(t);if(!v){c(e,t);for(let R of g.d.keys())m(e,R).t.add(t);if(v={l:new Set,d:new Set(g.d.keys()),t:new Set},l.set(t,v),xd(t)){let R=()=>{let p=!0,h=(...y)=>{try{return d(e,t,...y)}finally{p||(f(e),s(e))}};try{let y=o(e,t,h);y&&(v.u=()=>{p=!0;try{y()}finally{p=!1}})}finally{p=!1}};r.add(R)}(n=i.m)==null||n.call(i,t)}return v},cC=(e,t)=>{var n,a;let l=Te(e),r=l[1],i=l[5],o=l[6],u=l[11],s=l[19],f=u(e,t),c=r.get(t);if(!c||c.l.size)return c;let d=!1;for(let m of c.t)if((n=r.get(m))!=null&&n.d.has(t)){d=!0;break}if(!d){c.u&&i.add(c.u),c=void 0,r.delete(t);for(let m of f.d.keys()){let g=s(e,m);g?.t.delete(t)}(a=o.u)==null||a.call(o,t);return}return c},fC=(e,t,n)=>{let a=Te(e),l=a[11],r=a[27],i=l(e,t),o="v"in i,u=i.v;if(Lu(n))for(let s of i.d.keys())ab(t,n,l(e,s));i.v=n,delete i.e,(!o||!Object.is(u,i.v))&&(++i.n,Lu(u)&&r(e,u))},dC=(e,t)=>{let n=Te(e)[14];return Mu(n(e,t))},hC=(e,t,...n)=>{let a=Te(e),l=a[12],r=a[13],i=a[16];try{return i(e,t,...n)}finally{r(e),l(e)}},mC=(e,t,n)=>{let a=Te(e),l=a[12],r=a[18],i=a[19],u=r(e,t).l;return u.add(n),l(e),()=>{u.delete(n),i(e,t),l(e)}},pC=(e,t,n)=>{let l=Te(e)[25],r=l.get(t);if(!r){r=new Set,l.set(t,r);let i=()=>l.delete(t);t.then(i,i)}r.add(n)},yC=(e,t)=>{let l=Te(e)[25].get(t);l?.forEach(r=>r())},rb=new WeakMap,Te=e=>{let t=rb.get(e);if((Ee.env?Ee.env.MODE:void 0)!=="production"&&!t)throw new Error("Store must be created by buildStore to read its building blocks");return t};function ib(e){let t=Te(e),n=t[24];return n?n(t):t}function ob(...e){let t={get(a){let l=Te(t)[21];return l(t,a)},set(a,...l){let r=Te(t)[22];return r(t,a,...l)},sub(a,l){let r=Te(t)[23];return r(t,a,l)}},n=[new WeakMap,new WeakMap,new WeakMap,new Set,new Set,new Set,{},Jx,Wx,eC,tC,nC,aC,lC,rC,iC,oC,uC,sC,cC,fC,dC,hC,mC,void 0,new WeakMap,pC,yC].map((a,l)=>e[l]||a);return rb.set(t,Object.freeze(n)),t}var ku={},gC=0;function Td(e,t){let n=`atom${++gC}`,a={toString(){return(ku.env?ku.env.MODE:void 0)!=="production"&&this.debugLabel?n+":"+this.debugLabel:n}};return typeof e=="function"?a.read=e:(a.init=e,a.read=vC,a.write=bC),t&&(a.write=t),a}function vC(e){return e(this)}function bC(e,t,n){return t(this,typeof n=="function"?n(e(this)):n)}var ub;function sb(){return ub?ub():ob()}var di;function cb(){return di||(di=sb(),(ku.env?ku.env.MODE:void 0)!=="production"&&(globalThis.__JOTAI_DEFAULT_STORE__||(globalThis.__JOTAI_DEFAULT_STORE__=di),globalThis.__JOTAI_DEFAULT_STORE__!==di&&console.warn("Detected multiple Jotai instances. It may cause unexpected behavior with the default store. https://github.com/pmndrs/jotai/discussions/2044"))),di}var He=w(M(),1);var db={},RC=(0,He.createContext)(void 0);function hb(e){let t=(0,He.useContext)(RC);return e?.store||t||cb()}var _d=e=>typeof e?.then=="function",Dd=e=>{e.status||(e.status="pending",e.then(t=>{e.status="fulfilled",e.value=t},t=>{e.status="rejected",e.reason=t}))},SC=He.default.use||(e=>{if(e.status==="pending")throw e;if(e.status==="fulfilled")return e.value;throw e.status==="rejected"?e.reason:(Dd(e),e)}),Ad=new WeakMap,fb=(e,t,n)=>{let l=ib(e)[26],r=Ad.get(t);return r||(r=new Promise((i,o)=>{let u=t,s=d=>m=>{u===d&&i(m)},f=d=>m=>{u===d&&o(m)},c=()=>{try{let d=n();_d(d)?(Ad.set(d,r),u=d,d.then(s(d),f(d)),l(e,d,c)):i(d)}catch(d){o(d)}};t.then(s(t),f(t)),l(e,t,c)}),Ad.set(t,r)),r};function Nd(e,t){let{delay:n,unstable_promiseStatus:a=!He.default.use}=t||{},l=hb(t),[[r,i,o],u]=(0,He.useReducer)(f=>{let c=l.get(e);return Object.is(f[0],c)&&f[1]===l&&f[2]===e?f:[c,l,e]},void 0,()=>[l.get(e),l,e]),s=r;if((i!==l||o!==e)&&(u(),s=l.get(e)),(0,He.useEffect)(()=>{let f=l.sub(e,()=>{if(a)try{let c=l.get(e);_d(c)&&Dd(fb(l,c,()=>l.get(e)))}catch{}if(typeof n=="number"){setTimeout(u,n);return}u()});return u(),f},[l,e,n,a]),(0,He.useDebugValue)(s),_d(s)){let f=fb(l,s,()=>l.get(e));return a&&Dd(f),SC(f)}return s}function EC(e,t){let n=hb(t);return(0,He.useCallback)((...l)=>{if((db.env?db.env.MODE:void 0)!=="production"&&!("write"in e))throw new Error("not writable atom");return n.set(e,...l)},[n,e])}function mb(e,t){return[Nd(e,t),EC(e,t)]}var Gl={},wC=Symbol((Gl.env?Gl.env.MODE:void 0)!=="production"?"RESET":"");var pb=e=>typeof e?.then=="function";function xC(e=()=>{try{return window.localStorage}catch(n){(Gl.env?Gl.env.MODE:void 0)!=="production"&&typeof window<"u"&&console.warn(n);return}},t){var n;let a,l,r={getItem:(u,s)=>{var f,c;let d=g=>{if(g=g||"",a!==g){try{l=JSON.parse(g,t?.reviver)}catch{return s}a=g}return l},m=(c=(f=e())==null?void 0:f.getItem(u))!=null?c:null;return pb(m)?m.then(d):d(m)},setItem:(u,s)=>{var f;return(f=e())==null?void 0:f.setItem(u,JSON.stringify(s,t?.replacer))},removeItem:u=>{var s;return(s=e())==null?void 0:s.removeItem(u)}},i=u=>(s,f,c)=>u(s,d=>{let m;try{m=JSON.parse(d||"")}catch{m=c}f(m)}),o;try{o=(n=e())==null?void 0:n.subscribe}catch{}return!o&&typeof window<"u"&&typeof window.addEventListener=="function"&&window.Storage&&(o=(u,s)=>{if(!(e()instanceof window.Storage))return()=>{};let f=c=>{c.storageArea===e()&&c.key===u&&s(c.newValue)};return window.addEventListener("storage",f),()=>{window.removeEventListener("storage",f)}}),o&&(r.subscribe=i(o)),r}var CC=xC();function yb(e,t,n=CC,a){let l=a?.getOnInit,r=Td(l?n.getItem(e,t):t);return(Gl.env?Gl.env.MODE:void 0)!=="production"&&(r.debugPrivate=!0),r.onMount=o=>{o(n.getItem(e,t));let u;return n.subscribe&&(u=n.subscribe(e,o,t)),u},Td(o=>o(r),(o,u,s)=>{let f=typeof s=="function"?s(o(r)):s;return f===wC?(u(r,t),n.removeItem(e)):pb(f)?f.then(c=>(u(r,c),n.setItem(e,c))):(u(r,f),n.setItem(e,f))})}var zu=yb("backlog-show-completed",!1);var Ha=w(M(),1);function gb(){let[e,t]=(0,Ha.useState)(""),[n,a]=(0,Ha.useState)(null),l=(0,Ha.useRef)(void 0);return(0,Ha.useEffect)(()=>{if(l.current!==void 0&&clearTimeout(l.current),!e.trim()){a(null);return}return l.current=setTimeout(async()=>{a(await au(e))},250),()=>{l.current!==void 0&&clearTimeout(l.current)}},[e]),{query:e,setQuery:t,results:n}}var hi=w(D(),1);function vb(){let[e,t]=mb(zu);return(0,hi.jsxs)("label",{className:"flex items-center gap-2 text-sm text-gray-600 cursor-pointer select-none",children:[(0,hi.jsx)("button",{type:"button",role:"switch","aria-checked":e,onClick:()=>t(!e),className:`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${e?"bg-blue-600":"bg-gray-300"}`,children:(0,hi.jsx)("span",{className:`inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform ${e?"translate-x-[18px]":"translate-x-[3px]"}`})}),"Show completed"]})}var ja=w(D(),1),TC={todo:"\u25CB","in-progress":"\u25D4",done:"\u25CF",wontdo:"\u2715"},AC={todo:"text-gray-400","in-progress":"text-amber-500",done:"text-green-500",wontdo:"text-red-500"},_C={story:"bg-blue-100 text-blue-700",bug:"bg-red-100 text-red-700"};function bb({item:e,onSelect:t}){return(0,ja.jsxs)("button",{type:"button",className:"bg-white rounded-lg p-4 mb-2 cursor-pointer border border-gray-200 hover:shadow-md transition-shadow flex items-center gap-3 text-left w-full font-[inherit]",onClick:t,children:[(0,ja.jsx)("span",{className:`text-lg shrink-0 ${AC[e.status]}`,children:TC[e.status]}),(0,ja.jsx)("span",{className:`text-xs font-medium rounded-full px-2 shrink-0 ${_C[e.type]}`,children:e.type}),(0,ja.jsxs)("span",{className:"text-gray-400 text-sm shrink-0",children:["#",e.id]}),(0,ja.jsx)("span",{className:"font-medium",children:e.name})]})}var Sb=w(D(),1);function Rb({value:e,onChange:t}){return(0,Sb.jsx)("input",{type:"text",placeholder:"Search backlog\u2026",value:e,onChange:n=>t(n.target.value),className:"w-full mb-4 px-3 py-2 rounded-md border border-gray-600 bg-gray-800 text-gray-100 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"})}var vt=w(D(),1);function DC(e,t){return t?e:e.filter(n=>n.status!=="done"&&n.status!=="wontdo")}function Eb({items:e}){let t=Ht(),n=Nd(zu),{query:a,setQuery:l,results:r}=gb(),i=DC(r??e,n);return(0,vt.jsxs)(vt.Fragment,{children:[(0,vt.jsxs)("header",{className:"flex justify-between items-center mb-6",children:[(0,vt.jsx)("h1",{className:"text-2xl font-semibold",children:"Backlog"}),(0,vt.jsxs)("div",{className:"flex items-center gap-4",children:[(0,vt.jsx)(vb,{}),(0,vt.jsx)("button",{type:"button",className:"bg-blue-600 hover:bg-blue-700 text-white rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:()=>t("/add"),children:"+ Add Item"})]})]}),(0,vt.jsx)(Rb,{value:a,onChange:l}),i.length===0?(0,vt.jsx)("div",{className:"text-center text-gray-400 py-12 px-4",children:a.trim()?"No items match your search.":"No items in the backlog."}):i.map(o=>(0,vt.jsx)(bb,{item:o,onSelect:()=>t(`/items/${o.id}`)},o.id))]})}var Lb=w(M(),1);var na=w(D(),1);function wb({onConfirm:e,onCancel:t}){return(0,na.jsx)("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",children:(0,na.jsxs)("div",{className:"bg-white rounded-lg p-6 max-w-sm mx-4",children:[(0,na.jsx)("p",{className:"text-gray-800 mb-4",children:"Are you sure you want to delete this item?"}),(0,na.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,na.jsx)("button",{type:"button",className:"bg-gray-200 hover:bg-gray-300 text-gray-800 rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:t,children:"Cancel"}),(0,na.jsx)("button",{type:"button",className:"bg-red-600 hover:bg-red-700 text-white rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:e,children:"Delete"})]})]})})}var aa=w(D(),1);function xb({criteria:e}){return e.length===0?null:(0,aa.jsxs)("div",{className:"mb-4",children:[(0,aa.jsx)("h3",{className:"text-xs uppercase text-gray-500 mb-2 tracking-wide",children:"Acceptance Criteria"}),(0,aa.jsx)("ol",{className:"list-none",children:e.map((t,n)=>(0,aa.jsxs)("li",{className:"py-1 markdown",children:[(0,aa.jsxs)("span",{className:"text-gray-500 mr-2",children:[n+1,"."]}),(0,aa.jsx)("span",{dangerouslySetInnerHTML:{__html:H.parseInline(t)}})]},t))})]})}var bt=w(D(),1),NC={summary:"bg-amber-50 border-amber-200",comment:"bg-gray-50 border-gray-200"},OC={summary:"Phase summary",comment:"Comment"};function MC(e){return new Date(e).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function LC({comment:e}){return(0,bt.jsxs)("div",{className:`border rounded-md p-3 ${NC[e.type]}`,children:[(0,bt.jsxs)("div",{className:"flex items-center gap-2 text-xs text-gray-500 mb-1",children:[e.id!==void 0&&(0,bt.jsxs)("span",{className:"text-gray-400",children:["#",e.id]}),(0,bt.jsx)("span",{className:"font-medium",children:OC[e.type]}),e.phase!==void 0&&(0,bt.jsxs)("span",{children:["\xB7 Phase ",e.phase]}),(0,bt.jsxs)("span",{children:["\xB7 ",MC(e.timestamp)]})]}),(0,bt.jsx)("p",{className:"text-sm text-gray-800 whitespace-pre-wrap",children:e.text})]})}function Cb({comments:e}){return e.length===0?null:(0,bt.jsxs)("div",{className:"mb-4",children:[(0,bt.jsx)("h3",{className:"text-xs uppercase text-gray-500 mb-2 tracking-wide",children:"Comments"}),(0,bt.jsx)("div",{className:"space-y-2",children:e.map((t,n)=>(0,bt.jsx)(LC,{comment:t},`${t.timestamp}-${n}`))})]})}var la=w(D(),1);function Tb({checks:e}){return(0,la.jsxs)("div",{className:"mt-2 pt-2 border-t border-gray-200",children:[(0,la.jsx)("span",{className:"text-xs uppercase text-gray-400 tracking-wide",children:"Manual Checks"}),(0,la.jsx)("ul",{className:"list-none ml-1 mt-1",children:e.map(t=>(0,la.jsxs)("li",{className:"py-0.5 text-sm text-gray-600 markdown",children:[(0,la.jsx)("span",{className:"mr-2",children:"\u2610"}),(0,la.jsx)("span",{dangerouslySetInnerHTML:{__html:H.parseInline(t)}})]},t))})]})}var ql=w(D(),1);function Ab({tasks:e,marker:t}){return(0,ql.jsx)("ul",{className:"list-none ml-1 space-y-1",children:e.map(n=>(0,ql.jsxs)("li",{className:"py-0.5 markdown",children:[(0,ql.jsx)("span",{className:"text-gray-500 mr-2",children:t}),(0,ql.jsx)("span",{dangerouslySetInnerHTML:{__html:H.parseInline(n.task)}})]},n.task))})}var ra=w(D(),1),kC={done:"border-green-300 bg-green-50",current:"border-blue-400 bg-blue-50 ring-2 ring-blue-200",upcoming:"border-gray-200 bg-white"},zC={done:{label:"Done",style:"bg-green-100 text-green-700"},current:{label:"In Progress",style:"bg-blue-100 text-blue-700"},upcoming:{label:"Upcoming",style:"bg-gray-100 text-gray-500"}};function _b({phase:e,index:t,status:n}){let a=zC[n],l=n==="done"?"\u2713":"\u2022",r=e.manualChecks??[];return(0,ra.jsxs)("div",{className:`rounded-lg border p-4 ${kC[n]}`,children:[(0,ra.jsxs)("div",{className:"flex items-center gap-2 mb-2",children:[(0,ra.jsxs)("span",{className:"font-medium",children:["Phase ",t+1,": ",e.name]}),(0,ra.jsx)("span",{className:`inline-block rounded-full px-2 text-xs font-medium ${a.style}`,children:a.label})]}),(0,ra.jsx)(Ab,{tasks:e.tasks,marker:l}),r.length>0&&(0,ra.jsx)(Tb,{checks:r})]})}var Il=w(D(),1);function UC(e,t){return t===void 0?"upcoming":e<t?"done":e===t?"current":"upcoming"}function Db({phases:e,currentPhase:t}){return e.length===0?null:(0,Il.jsxs)("div",{className:"mb-4",children:[(0,Il.jsx)("h3",{className:"text-xs uppercase text-gray-500 mb-2 tracking-wide",children:"Plan"}),(0,Il.jsx)("div",{className:"space-y-3",children:e.map((n,a)=>(0,Il.jsx)(_b,{phase:n,index:a,status:UC(a,t)},n.name))})]})}var Uu=w(D(),1),Nb={todo:"bg-gray-100 text-gray-500","in-progress":"bg-amber-100 text-amber-800",done:"bg-green-100 text-green-800",wontdo:"bg-red-100 text-red-700"},BC=["todo","in-progress","done","wontdo"];function Ob({current:e,onStatusChange:t}){return t?(0,Uu.jsx)("select",{value:e,onChange:n=>t(n.target.value),className:`rounded-full px-2.5 text-xs font-medium cursor-pointer ${Nb[e]}`,children:BC.map(n=>(0,Uu.jsx)("option",{value:n,children:n},n))}):(0,Uu.jsx)("span",{className:`inline-block rounded-full px-2.5 text-xs font-medium ${Nb[e]}`,children:e})}var rt=w(D(),1),HC={story:"bg-blue-100 text-blue-700",bug:"bg-red-100 text-red-700"};function jC({content:e}){return(0,rt.jsx)("div",{className:"markdown leading-relaxed",dangerouslySetInnerHTML:{__html:H.parse(e)}})}function Mb({item:e,onStatusChange:t}){return(0,rt.jsxs)("div",{className:"bg-white rounded-lg p-6 border border-gray-200",children:[(0,rt.jsx)("h2",{children:e.name}),(0,rt.jsxs)("div",{className:"text-gray-400 text-sm mb-4 flex items-center gap-2",children:["#",e.id,(0,rt.jsx)("span",{className:`inline-block rounded-full px-2.5 text-xs font-medium ${HC[e.type]}`,children:e.type}),(0,rt.jsx)(Ob,{current:e.status,onStatusChange:t})]}),e.description&&(0,rt.jsxs)("div",{className:"mb-4",children:[(0,rt.jsx)("h3",{className:"text-xs uppercase text-gray-500 mb-2 tracking-wide",children:"Description"}),(0,rt.jsx)(jC,{content:e.description})]}),(0,rt.jsx)(xb,{criteria:e.acceptanceCriteria}),e.plan&&(0,rt.jsx)(Db,{phases:e.plan,currentPhase:e.currentPhase}),e.comments&&(0,rt.jsx)(Cb,{comments:e.comments})]})}var Ye=w(D(),1);function VC({itemId:e,onDeleted:t}){let[n,a]=(0,Lb.useState)(!1);return(0,Ye.jsxs)(Ye.Fragment,{children:[n&&(0,Ye.jsx)(wb,{onConfirm:async()=>{await vv(e),await t()},onCancel:()=>a(!1)}),(0,Ye.jsx)("button",{type:"button",className:"bg-red-600 hover:bg-red-700 text-white rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:()=>a(!0),children:"Delete"})]})}function FC({itemId:e,onDeleted:t}){let n=Ht();return(0,Ye.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,Ye.jsx)(wu,{to:"/"}),(0,Ye.jsxs)("div",{className:"flex gap-2",children:[(0,Ye.jsx)("button",{type:"button",className:"bg-gray-200 hover:bg-gray-300 text-gray-800 rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:()=>n(`/items/${e}/edit`),children:"Edit"}),(0,Ye.jsx)(VC,{itemId:e,onDeleted:t})]})]})}function kb({item:e,onReload:t}){let n=Ht();return(0,Ye.jsxs)(Ye.Fragment,{children:[(0,Ye.jsx)(FC,{itemId:e.id,onDeleted:async()=>{await t(),n("/")}}),(0,Ye.jsx)(Mb,{item:e,onStatusChange:async a=>{await Rv(e.id,a),await t()}})]})}var Od=w(D(),1);function Md({items:e,mode:t,onReload:n}){let{id:a}=kf(),l=Number(a),r=e.find(i=>i.id===l);return r?t==="edit"?(0,Od.jsx)(Ou,{item:r,onReload:n,backTo:`/items/${l}`}):(0,Od.jsx)(kb,{item:r,onReload:n}):null}var jt=w(D(),1);function zb({items:e,onReload:t}){return(0,jt.jsxs)(Kr,{children:[(0,jt.jsx)(Rn,{index:!0,element:(0,jt.jsx)(Eb,{items:e})}),(0,jt.jsx)(Rn,{path:"items/:id",element:(0,jt.jsx)(Md,{items:e,mode:"detail",onReload:t})}),(0,jt.jsx)(Rn,{path:"items/:id/edit",element:(0,jt.jsx)(Md,{items:e,mode:"edit",onReload:t})}),(0,jt.jsx)(Rn,{path:"add",element:(0,jt.jsx)(Ou,{onReload:t,backTo:"/"})})]})}var $l=w(D(),1);function YC(){let[e,t]=(0,Pl.useState)([]),n=(0,Pl.useCallback)(async()=>{t(await au())},[]);return(0,Pl.useEffect)(()=>{n()},[n]),(0,$l.jsx)(qf,{children:(0,$l.jsx)(Kr,{children:(0,$l.jsx)(Rn,{path:"/*",element:(0,$l.jsx)(zb,{items:e,onReload:n})})})})}var Ub=document.getElementById("app");Ub&&(0,Bb.createRoot)(Ub).render((0,$l.jsx)(YC,{}));})();
67
+ Please report this to https://github.com/markedjs/marked.`,e){let a="<p>An error occurred:</p><pre>"+Jt(n.message+"",!0)+"</pre>";return t?Promise.resolve(a):a}if(t)return Promise.reject(n);throw n}}},Ua=new Zx;function H(e,t){return Ua.parse(e,t)}H.options=H.setOptions=function(e){return Ua.setOptions(e),H.defaults=Ua.defaults,U0(H.defaults),H};H.getDefaults=pd;H.defaults=Ba;H.use=function(...e){return Ua.use(...e),H.defaults=Ua.defaults,U0(H.defaults),H};H.walkTokens=function(e,t){return Ua.walkTokens(e,t)};H.parseInline=Ua.parseInline;H.Parser=wn;H.parser=wn.parse;H.Renderer=_u;H.TextRenderer=wd;H.Lexer=En;H.lexer=En.lex;H.Tokenizer=Au;H.Hooks=Cu;H.parse=H;var vN=H.options,bN=H.setOptions,RN=H.use,SN=H.walkTokens,EN=H.parseInline;var wN=wn.parse,xN=En.lex;var P0=w(M(),1),xn=w(D(),1);function Kx({text:e}){return(0,xn.jsx)("div",{className:"border border-gray-200 rounded-md p-3 mt-2 min-h-[60px] bg-gray-50",dangerouslySetInnerHTML:{__html:H.parse(e||"")}})}function X0({value:e,onChange:t}){let[n,a]=(0,P0.useState)(!1);return(0,xn.jsxs)(Fe.Root,{className:"mb-4",children:[(0,xn.jsxs)(Fe.Label,{className:"block font-medium mb-1 text-sm",children:["Description"," ",(0,xn.jsx)("button",{type:"button",className:"text-xs text-blue-600 cursor-pointer ml-2 bg-transparent border-none p-0",onClick:()=>a(!n),children:"(preview)"})]}),(0,xn.jsx)(Fe.Control,{className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm font-[inherit] min-h-[120px] resize-y",render:(0,xn.jsx)("textarea",{}),placeholder:"Markdown supported",value:e,onChange:l=>t(l.target.value)}),n&&(0,xn.jsx)(Kx,{text:e})]})}var fi=w(D(),1);function Q0({submitLabel:e,onCancel:t}){return(0,fi.jsxs)("div",{className:"flex gap-2 mt-4",children:[(0,fi.jsx)("button",{type:"submit",className:"bg-blue-600 hover:bg-blue-700 text-white rounded-md px-4 py-2 text-sm font-medium cursor-pointer",children:e}),(0,fi.jsx)("button",{type:"button",className:"bg-gray-200 hover:bg-gray-300 text-gray-800 rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:t,children:"Cancel"})]})}async function Z0(e,t,n,a,l){let r=t.trim();if(!r)return;let i={type:e,name:r,description:n.trim()||void 0,acceptanceCriteria:a.map(u=>u.trim()).filter(Boolean)};return l?(await bv(l.id,i),l.id):(await gv(i)).id}function K0(e){return{type:e?.type??"story",name:e?.name??"",description:e?.description??"",ac:e?.acceptanceCriteria??[],title:e?"Edit Item":"Add Item",submitLabel:e?"Save":"Add"}}async function J0(e,t,n,a,l,r,i){e.preventDefault();let o=await Z0(t,n,a,l,r);o!==void 0&&await i(o)}var Fl=w(D(),1);function W0({value:e,onChange:t}){return(0,Fl.jsxs)(Fe.Root,{className:"mb-4",children:[(0,Fl.jsx)(Fe.Label,{className:"block font-medium mb-1 text-sm",children:"Name"}),(0,Fl.jsx)(Fe.Control,{className:"w-full px-3 py-2 border border-gray-300 rounded-md text-sm font-[inherit]",required:!0,placeholder:"Item name",value:e,onChange:n=>t(n.target.value)}),(0,Fl.jsx)(Fe.Error,{className:"text-red-500 text-xs mt-1",match:"valueMissing",children:"Name is required."})]})}var ta=w(D(),1);function eb({value:e,onChange:t}){return(0,ta.jsxs)("fieldset",{className:"mb-4",children:[(0,ta.jsx)("legend",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Type"}),(0,ta.jsx)("div",{className:"flex gap-4",children:["story","bug"].map(n=>(0,ta.jsxs)("label",{className:"flex items-center gap-1.5 cursor-pointer",children:[(0,ta.jsx)("input",{type:"radio",name:"type",value:n,checked:e===n,onChange:()=>t(n)}),(0,ta.jsx)("span",{className:"text-sm capitalize",children:n})]},n))})]})}var gt=w(D(),1);function Ou({item:e,onReload:t,backTo:n}){let a=Ht(),l=K0(e),[r,i]=(0,Yl.useState)(l.type),[o,u]=(0,Yl.useState)(l.name),[s,f]=(0,Yl.useState)(l.description),c=(0,Yl.useRef)(l.ac),d=()=>a(n);return(0,gt.jsxs)(gt.Fragment,{children:[(0,gt.jsx)(wu,{to:n}),(0,gt.jsxs)(td,{className:"bg-white rounded-lg p-6 border border-gray-200",onSubmit:m=>J0(m,r,o,s,c.current,e,async g=>{await t(),a(`/items/${g}`)}),children:[(0,gt.jsx)("h2",{className:"mb-4",children:l.title}),(0,gt.jsx)(eb,{value:r,onChange:i}),(0,gt.jsx)(W0,{value:o,onChange:u}),(0,gt.jsx)(X0,{value:s,onChange:f}),(0,gt.jsx)(D0,{initial:l.ac,onChange:m=>{c.current=m}}),(0,gt.jsx)(Q0,{submitLabel:l.submitLabel,onCancel:d})]})]})}var Ee={};function nb(e){return"init"in e}function xd(e){return!!e.write}function tb(e){return"v"in e||"e"in e}function Mu(e){if("e"in e)throw e.e;if((Ee.env?Ee.env.MODE:void 0)!=="production"&&!("v"in e))throw new Error("[Bug] atom state is not initialized");return e.v}function Lu(e){return typeof e?.then=="function"}function ab(e,t,n){if(!n.p.has(e)){n.p.add(e);let a=()=>n.p.delete(e);t.then(a,a)}}function lb(e,t,n){var a;let l=new Set;for(let r of((a=n.get(e))==null?void 0:a.t)||[])l.add(r);for(let r of t.p)l.add(r);return l}var Jx=(e,t,...n)=>t.read(...n),Wx=(e,t,...n)=>t.write(...n),eC=(e,t)=>{var n;return(n=t.INTERNAL_onInit)==null?void 0:n.call(t,e)},tC=(e,t,n)=>{var a;return(a=t.onMount)==null?void 0:a.call(t,n)},nC=(e,t)=>{var n;let a=Te(e),l=a[0],r=a[6],i=a[9];if((Ee.env?Ee.env.MODE:void 0)!=="production"&&!t)throw new Error("Atom is undefined or null");let o=l.get(t);return o||(o={d:new Map,p:new Set,n:0},l.set(t,o),(n=r.i)==null||n.call(r,t),i?.(e,t)),o},aC=e=>{let t=Te(e),n=t[1],a=t[3],l=t[4],r=t[5],i=t[6],o=t[13],u=[],s=f=>{try{f()}catch(c){u.push(c)}};do{i.f&&s(i.f);let f=new Set,c=f.add.bind(f);a.forEach(d=>{var m;return(m=n.get(d))==null?void 0:m.l.forEach(c)}),a.clear(),r.forEach(c),r.clear(),l.forEach(c),l.clear(),f.forEach(s),a.size&&o(e)}while(a.size||r.size||l.size);if(u.length)throw new AggregateError(u)},lC=e=>{let t=Te(e),n=t[1],a=t[2],l=t[3],r=t[11],i=t[14],o=t[17],u=[],s=new WeakSet,f=new WeakSet,c=Array.from(l);for(;c.length;){let d=c[c.length-1],m=r(e,d);if(f.has(d)){c.pop();continue}if(s.has(d)){if(a.get(d)===m.n)u.push([d,m]);else if((Ee.env?Ee.env.MODE:void 0)!=="production"&&a.has(d))throw new Error("[Bug] invalidated atom exists");f.add(d),c.pop();continue}s.add(d);for(let g of lb(d,m,n))s.has(g)||c.push(g)}for(let d=u.length-1;d>=0;--d){let[m,g]=u[d],v=!1;for(let R of g.d.keys())if(R!==m&&l.has(R)){v=!0;break}v&&(i(e,m),o(e,m)),a.delete(m)}},Cd=new WeakSet,rC=(e,t)=>{var n,a;let l=Te(e),r=l[1],i=l[2],o=l[3],u=l[6],s=l[7],f=l[11],c=l[12],d=l[13],m=l[14],g=l[16],v=l[17],R=l[20],p=l[26],h=f(e,t);if(tb(h)){if(r.has(t)&&i.get(t)!==h.n)return h;let L=!1;for(let[I,G]of h.d)if(m(e,I).n!==G){L=!0;break}if(!L)return h}let y=!0,b=new Set(h.d.keys()),S=new Map,C=()=>{for(let L of b)S.has(L)||h.d.delete(L)},x=()=>{if(r.has(t)){let L=!o.size;v(e,t),L&&(d(e),c(e))}},T=L=>{var I;if(L===t){let oe=f(e,L);if(!tb(oe))if(nb(L))R(e,L,L.init);else throw new Error("no atom init");return Mu(oe)}let G=m(e,L);try{return Mu(G)}finally{S.set(L,G.n),h.d.set(L,G.n),Lu(h.v)&&ab(t,h.v,G),r.has(t)&&((I=r.get(L))==null||I.t.add(t)),y||x()}},A,O,te={get signal(){return A||(A=new AbortController),A.signal},get setSelf(){return(Ee.env?Ee.env.MODE:void 0)!=="production"&&console.warn("[DEPRECATED] setSelf is deprecated and will be removed in v3."),(Ee.env?Ee.env.MODE:void 0)!=="production"&&!xd(t)&&console.warn("setSelf function cannot be used with read-only atom"),!O&&xd(t)&&(O=(...L)=>{if((Ee.env?Ee.env.MODE:void 0)!=="production"&&y&&console.warn("setSelf function cannot be called in sync"),!y)try{return g(e,t,...L)}finally{d(e),c(e)}}),O}},de=h.n;try{(Ee.env?Ee.env.MODE:void 0)!=="production"&&Cd.delete(e);let L=s(e,t,T,te);if((Ee.env?Ee.env.MODE:void 0)!=="production"&&Cd.has(e)&&console.warn("Detected store mutation during atom read. This is not supported."),R(e,t,L),Lu(L)){p(e,L,()=>A?.abort());let I=()=>{C(),x()};L.then(I,I)}else C();return(n=u.r)==null||n.call(u,t),h}catch(L){return delete h.v,h.e=L,++h.n,h}finally{y=!1,de!==h.n&&i.get(t)===de&&(i.set(t,h.n),o.add(t),(a=u.c)==null||a.call(u,t))}},iC=(e,t)=>{let n=Te(e),a=n[1],l=n[2],r=n[11],i=[t];for(;i.length;){let o=i.pop(),u=r(e,o);for(let s of lb(o,u,a)){let f=r(e,s);l.get(s)!==f.n&&(l.set(s,f.n),i.push(s))}}},oC=(e,t,...n)=>{let a=Te(e),l=a[3],r=a[6],i=a[8],o=a[11],u=a[12],s=a[13],f=a[14],c=a[15],d=a[16],m=a[17],g=a[20],v=!0,R=h=>Mu(f(e,h)),p=(h,...y)=>{var b;let S=o(e,h);try{if(h===t){if(!nb(h))throw new Error("atom not writable");(Ee.env?Ee.env.MODE:void 0)!=="production"&&Cd.add(e);let C=S.n,x=y[0];g(e,h,x),m(e,h),C!==S.n&&(l.add(h),c(e,h),(b=r.c)==null||b.call(r,h));return}else return d(e,h,...y)}finally{v||(s(e),u(e))}};try{return i(e,t,R,p,...n)}finally{v=!1}},uC=(e,t)=>{var n;let a=Te(e),l=a[1],r=a[3],i=a[6],o=a[11],u=a[15],s=a[18],f=a[19],c=o(e,t),d=l.get(t);if(d){for(let[m,g]of c.d)if(!d.d.has(m)){let v=o(e,m);s(e,m).t.add(t),d.d.add(m),g!==v.n&&(r.add(m),u(e,m),(n=i.c)==null||n.call(i,m))}for(let m of d.d)if(!c.d.has(m)){d.d.delete(m);let g=f(e,m);g?.t.delete(t)}}},sC=(e,t)=>{var n;let a=Te(e),l=a[1],r=a[4],i=a[6],o=a[10],u=a[11],s=a[12],f=a[13],c=a[14],d=a[16],m=a[18],g=u(e,t),v=l.get(t);if(!v){c(e,t);for(let R of g.d.keys())m(e,R).t.add(t);if(v={l:new Set,d:new Set(g.d.keys()),t:new Set},l.set(t,v),xd(t)){let R=()=>{let p=!0,h=(...y)=>{try{return d(e,t,...y)}finally{p||(f(e),s(e))}};try{let y=o(e,t,h);y&&(v.u=()=>{p=!0;try{y()}finally{p=!1}})}finally{p=!1}};r.add(R)}(n=i.m)==null||n.call(i,t)}return v},cC=(e,t)=>{var n,a;let l=Te(e),r=l[1],i=l[5],o=l[6],u=l[11],s=l[19],f=u(e,t),c=r.get(t);if(!c||c.l.size)return c;let d=!1;for(let m of c.t)if((n=r.get(m))!=null&&n.d.has(t)){d=!0;break}if(!d){c.u&&i.add(c.u),c=void 0,r.delete(t);for(let m of f.d.keys()){let g=s(e,m);g?.t.delete(t)}(a=o.u)==null||a.call(o,t);return}return c},fC=(e,t,n)=>{let a=Te(e),l=a[11],r=a[27],i=l(e,t),o="v"in i,u=i.v;if(Lu(n))for(let s of i.d.keys())ab(t,n,l(e,s));i.v=n,delete i.e,(!o||!Object.is(u,i.v))&&(++i.n,Lu(u)&&r(e,u))},dC=(e,t)=>{let n=Te(e)[14];return Mu(n(e,t))},hC=(e,t,...n)=>{let a=Te(e),l=a[12],r=a[13],i=a[16];try{return i(e,t,...n)}finally{r(e),l(e)}},mC=(e,t,n)=>{let a=Te(e),l=a[12],r=a[18],i=a[19],u=r(e,t).l;return u.add(n),l(e),()=>{u.delete(n),i(e,t),l(e)}},pC=(e,t,n)=>{let l=Te(e)[25],r=l.get(t);if(!r){r=new Set,l.set(t,r);let i=()=>l.delete(t);t.then(i,i)}r.add(n)},yC=(e,t)=>{let l=Te(e)[25].get(t);l?.forEach(r=>r())},rb=new WeakMap,Te=e=>{let t=rb.get(e);if((Ee.env?Ee.env.MODE:void 0)!=="production"&&!t)throw new Error("Store must be created by buildStore to read its building blocks");return t};function ib(e){let t=Te(e),n=t[24];return n?n(t):t}function ob(...e){let t={get(a){let l=Te(t)[21];return l(t,a)},set(a,...l){let r=Te(t)[22];return r(t,a,...l)},sub(a,l){let r=Te(t)[23];return r(t,a,l)}},n=[new WeakMap,new WeakMap,new WeakMap,new Set,new Set,new Set,{},Jx,Wx,eC,tC,nC,aC,lC,rC,iC,oC,uC,sC,cC,fC,dC,hC,mC,void 0,new WeakMap,pC,yC].map((a,l)=>e[l]||a);return rb.set(t,Object.freeze(n)),t}var ku={},gC=0;function Td(e,t){let n=`atom${++gC}`,a={toString(){return(ku.env?ku.env.MODE:void 0)!=="production"&&this.debugLabel?n+":"+this.debugLabel:n}};return typeof e=="function"?a.read=e:(a.init=e,a.read=vC,a.write=bC),t&&(a.write=t),a}function vC(e){return e(this)}function bC(e,t,n){return t(this,typeof n=="function"?n(e(this)):n)}var ub;function sb(){return ub?ub():ob()}var di;function cb(){return di||(di=sb(),(ku.env?ku.env.MODE:void 0)!=="production"&&(globalThis.__JOTAI_DEFAULT_STORE__||(globalThis.__JOTAI_DEFAULT_STORE__=di),globalThis.__JOTAI_DEFAULT_STORE__!==di&&console.warn("Detected multiple Jotai instances. It may cause unexpected behavior with the default store. https://github.com/pmndrs/jotai/discussions/2044"))),di}var He=w(M(),1);var db={},RC=(0,He.createContext)(void 0);function hb(e){let t=(0,He.useContext)(RC);return e?.store||t||cb()}var _d=e=>typeof e?.then=="function",Dd=e=>{e.status||(e.status="pending",e.then(t=>{e.status="fulfilled",e.value=t},t=>{e.status="rejected",e.reason=t}))},SC=He.default.use||(e=>{if(e.status==="pending")throw e;if(e.status==="fulfilled")return e.value;throw e.status==="rejected"?e.reason:(Dd(e),e)}),Ad=new WeakMap,fb=(e,t,n)=>{let l=ib(e)[26],r=Ad.get(t);return r||(r=new Promise((i,o)=>{let u=t,s=d=>m=>{u===d&&i(m)},f=d=>m=>{u===d&&o(m)},c=()=>{try{let d=n();_d(d)?(Ad.set(d,r),u=d,d.then(s(d),f(d)),l(e,d,c)):i(d)}catch(d){o(d)}};t.then(s(t),f(t)),l(e,t,c)}),Ad.set(t,r)),r};function Nd(e,t){let{delay:n,unstable_promiseStatus:a=!He.default.use}=t||{},l=hb(t),[[r,i,o],u]=(0,He.useReducer)(f=>{let c=l.get(e);return Object.is(f[0],c)&&f[1]===l&&f[2]===e?f:[c,l,e]},void 0,()=>[l.get(e),l,e]),s=r;if((i!==l||o!==e)&&(u(),s=l.get(e)),(0,He.useEffect)(()=>{let f=l.sub(e,()=>{if(a)try{let c=l.get(e);_d(c)&&Dd(fb(l,c,()=>l.get(e)))}catch{}if(typeof n=="number"){setTimeout(u,n);return}u()});return u(),f},[l,e,n,a]),(0,He.useDebugValue)(s),_d(s)){let f=fb(l,s,()=>l.get(e));return a&&Dd(f),SC(f)}return s}function EC(e,t){let n=hb(t);return(0,He.useCallback)((...l)=>{if((db.env?db.env.MODE:void 0)!=="production"&&!("write"in e))throw new Error("not writable atom");return n.set(e,...l)},[n,e])}function mb(e,t){return[Nd(e,t),EC(e,t)]}var Gl={},wC=Symbol((Gl.env?Gl.env.MODE:void 0)!=="production"?"RESET":"");var pb=e=>typeof e?.then=="function";function xC(e=()=>{try{return window.localStorage}catch(n){(Gl.env?Gl.env.MODE:void 0)!=="production"&&typeof window<"u"&&console.warn(n);return}},t){var n;let a,l,r={getItem:(u,s)=>{var f,c;let d=g=>{if(g=g||"",a!==g){try{l=JSON.parse(g,t?.reviver)}catch{return s}a=g}return l},m=(c=(f=e())==null?void 0:f.getItem(u))!=null?c:null;return pb(m)?m.then(d):d(m)},setItem:(u,s)=>{var f;return(f=e())==null?void 0:f.setItem(u,JSON.stringify(s,t?.replacer))},removeItem:u=>{var s;return(s=e())==null?void 0:s.removeItem(u)}},i=u=>(s,f,c)=>u(s,d=>{let m;try{m=JSON.parse(d||"")}catch{m=c}f(m)}),o;try{o=(n=e())==null?void 0:n.subscribe}catch{}return!o&&typeof window<"u"&&typeof window.addEventListener=="function"&&window.Storage&&(o=(u,s)=>{if(!(e()instanceof window.Storage))return()=>{};let f=c=>{c.storageArea===e()&&c.key===u&&s(c.newValue)};return window.addEventListener("storage",f),()=>{window.removeEventListener("storage",f)}}),o&&(r.subscribe=i(o)),r}var CC=xC();function yb(e,t,n=CC,a){let l=a?.getOnInit,r=Td(l?n.getItem(e,t):t);return(Gl.env?Gl.env.MODE:void 0)!=="production"&&(r.debugPrivate=!0),r.onMount=o=>{o(n.getItem(e,t));let u;return n.subscribe&&(u=n.subscribe(e,o,t)),u},Td(o=>o(r),(o,u,s)=>{let f=typeof s=="function"?s(o(r)):s;return f===wC?(u(r,t),n.removeItem(e)):pb(f)?f.then(c=>(u(r,c),n.setItem(e,c))):(u(r,f),n.setItem(e,f))})}var zu=yb("backlog-show-completed",!1);var Ha=w(M(),1);function gb(){let[e,t]=(0,Ha.useState)(""),[n,a]=(0,Ha.useState)(null),l=(0,Ha.useRef)(void 0);return(0,Ha.useEffect)(()=>{if(l.current!==void 0&&clearTimeout(l.current),!e.trim()){a(null);return}return l.current=setTimeout(async()=>{a(await au(e))},250),()=>{l.current!==void 0&&clearTimeout(l.current)}},[e]),{query:e,setQuery:t,results:n}}var hi=w(D(),1);function vb(){let[e,t]=mb(zu);return(0,hi.jsxs)("label",{className:"flex items-center gap-2 text-sm text-gray-600 cursor-pointer select-none",children:[(0,hi.jsx)("button",{type:"button",role:"switch","aria-checked":e,onClick:()=>t(!e),className:`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${e?"bg-blue-600":"bg-gray-300"}`,children:(0,hi.jsx)("span",{className:`inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform ${e?"translate-x-[18px]":"translate-x-[3px]"}`})}),"Show completed"]})}var ja=w(D(),1),TC={todo:"\u25CB","in-progress":"\u25D4",done:"\u25CF",wontdo:"\u2715"},AC={todo:"text-gray-400","in-progress":"text-amber-500",done:"text-green-500",wontdo:"text-red-500"},_C={story:"bg-blue-100 text-blue-700",bug:"bg-red-100 text-red-700"};function bb({item:e,onSelect:t}){return(0,ja.jsxs)("button",{type:"button",className:"bg-white rounded-lg p-4 mb-2 cursor-pointer border border-gray-200 hover:shadow-md transition-shadow flex items-center gap-3 text-left w-full font-[inherit]",onClick:t,children:[(0,ja.jsx)("span",{className:`text-lg shrink-0 ${AC[e.status]}`,children:TC[e.status]}),(0,ja.jsx)("span",{className:`text-xs font-medium rounded-full px-2 shrink-0 ${_C[e.type]}`,children:e.type}),(0,ja.jsxs)("span",{className:"text-gray-400 text-sm shrink-0",children:["#",e.id]}),(0,ja.jsx)("span",{className:"font-medium",children:e.name})]})}var Sb=w(D(),1);function Rb({value:e,onChange:t}){return(0,Sb.jsx)("input",{type:"text",placeholder:"Search backlog\u2026",value:e,onChange:n=>t(n.target.value),className:"w-full mb-4 px-3 py-2 rounded-md border border-gray-600 bg-gray-800 text-gray-100 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"})}var vt=w(D(),1);function DC(e,t){return t?e:e.filter(n=>n.status!=="done"&&n.status!=="wontdo")}function Eb({items:e}){let t=Ht(),n=Nd(zu),{query:a,setQuery:l,results:r}=gb(),i=DC(r??e,n);return(0,vt.jsxs)(vt.Fragment,{children:[(0,vt.jsxs)("header",{className:"flex justify-between items-center mb-6",children:[(0,vt.jsx)("h1",{className:"text-2xl font-semibold",children:"Backlog"}),(0,vt.jsxs)("div",{className:"flex items-center gap-4",children:[(0,vt.jsx)(vb,{}),(0,vt.jsx)("button",{type:"button",className:"bg-blue-600 hover:bg-blue-700 text-white rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:()=>t("/add"),children:"+ Add Item"})]})]}),(0,vt.jsx)(Rb,{value:a,onChange:l}),i.length===0?(0,vt.jsx)("div",{className:"text-center text-gray-400 py-12 px-4",children:a.trim()?"No items match your search.":"No items in the backlog."}):i.map(o=>(0,vt.jsx)(bb,{item:o,onSelect:()=>t(`/items/${o.id}`)},o.id))]})}var Lb=w(M(),1);var na=w(D(),1);function wb({onConfirm:e,onCancel:t}){return(0,na.jsx)("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",children:(0,na.jsxs)("div",{className:"bg-white rounded-lg p-6 max-w-sm mx-4",children:[(0,na.jsx)("p",{className:"text-gray-800 mb-4",children:"Are you sure you want to delete this item?"}),(0,na.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,na.jsx)("button",{type:"button",className:"bg-gray-200 hover:bg-gray-300 text-gray-800 rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:t,children:"Cancel"}),(0,na.jsx)("button",{type:"button",className:"bg-red-600 hover:bg-red-700 text-white rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:e,children:"Delete"})]})]})})}var aa=w(D(),1);function xb({criteria:e}){return e.length===0?null:(0,aa.jsxs)("div",{className:"mb-4",children:[(0,aa.jsx)("h3",{className:"text-xs uppercase text-gray-500 mb-2 tracking-wide",children:"Acceptance Criteria"}),(0,aa.jsx)("ol",{className:"list-none",children:e.map((t,n)=>(0,aa.jsxs)("li",{className:"py-1 markdown",children:[(0,aa.jsxs)("span",{className:"text-gray-500 mr-2",children:[n+1,"."]}),(0,aa.jsx)("span",{dangerouslySetInnerHTML:{__html:H.parseInline(t)}})]},t))})]})}var bt=w(D(),1),NC={summary:"bg-amber-50 border-amber-200",comment:"bg-gray-50 border-gray-200"},OC={summary:"Phase summary",comment:"Comment"};function MC(e){return new Date(e).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function LC({comment:e}){return(0,bt.jsxs)("div",{className:`border rounded-md p-3 ${NC[e.type]}`,children:[(0,bt.jsxs)("div",{className:"flex items-center gap-2 text-xs text-gray-500 mb-1",children:[e.id!==void 0&&(0,bt.jsxs)("span",{className:"text-gray-400",children:["#",e.id]}),(0,bt.jsx)("span",{className:"font-medium",children:OC[e.type]}),e.phase!==void 0&&(0,bt.jsxs)("span",{children:["\xB7 Phase ",e.phase]}),(0,bt.jsxs)("span",{children:["\xB7 ",MC(e.timestamp)]})]}),(0,bt.jsx)("p",{className:"text-sm text-gray-800 whitespace-pre-wrap",children:e.text})]})}function Cb({comments:e}){return e.length===0?null:(0,bt.jsxs)("div",{className:"mb-4",children:[(0,bt.jsx)("h3",{className:"text-xs uppercase text-gray-500 mb-2 tracking-wide",children:"Comments"}),(0,bt.jsx)("div",{className:"space-y-2",children:e.map((t,n)=>(0,bt.jsx)(LC,{comment:t},`${t.timestamp}-${n}`))})]})}var la=w(D(),1);function Tb({checks:e}){return(0,la.jsxs)("div",{className:"mt-2 pt-2 border-t border-gray-200",children:[(0,la.jsx)("span",{className:"text-xs uppercase text-gray-400 tracking-wide",children:"Manual Checks"}),(0,la.jsx)("ul",{className:"list-none ml-1 mt-1",children:e.map(t=>(0,la.jsxs)("li",{className:"py-0.5 text-sm text-gray-600 markdown",children:[(0,la.jsx)("span",{className:"mr-2",children:"\u2610"}),(0,la.jsx)("span",{dangerouslySetInnerHTML:{__html:H.parseInline(t)}})]},t))})]})}var ql=w(D(),1);function Ab({tasks:e,marker:t}){return(0,ql.jsx)("ul",{className:"list-none ml-1 space-y-1",children:e.map(n=>(0,ql.jsxs)("li",{className:"py-0.5 markdown",children:[(0,ql.jsx)("span",{className:"text-gray-500 mr-2",children:t}),(0,ql.jsx)("span",{dangerouslySetInnerHTML:{__html:H.parseInline(n.task)}})]},n.task))})}var ra=w(D(),1),kC={done:"border-green-300 bg-green-50",current:"border-blue-400 bg-blue-50 ring-2 ring-blue-200",upcoming:"border-gray-200 bg-white"},zC={done:{label:"Done",style:"bg-green-100 text-green-700"},current:{label:"In Progress",style:"bg-blue-100 text-blue-700"},upcoming:{label:"Upcoming",style:"bg-gray-100 text-gray-500"}};function _b({phase:e,index:t,status:n}){let a=zC[n],l=n==="done"?"\u2713":"\u2022",r=e.manualChecks??[];return(0,ra.jsxs)("div",{className:`rounded-lg border p-4 ${kC[n]}`,children:[(0,ra.jsxs)("div",{className:"flex items-center gap-2 mb-2",children:[(0,ra.jsxs)("span",{className:"font-medium",children:["Phase ",t+1,": ",e.name]}),(0,ra.jsx)("span",{className:`inline-block rounded-full px-2 text-xs font-medium ${a.style}`,children:a.label})]}),(0,ra.jsx)(Ab,{tasks:e.tasks,marker:l}),r.length>0&&(0,ra.jsx)(Tb,{checks:r})]})}var Il=w(D(),1);function UC(e,t){if(t===void 0)return"upcoming";let n=e+1;return n<t?"done":n===t?"current":"upcoming"}function Db({phases:e,currentPhase:t}){return e.length===0?null:(0,Il.jsxs)("div",{className:"mb-4",children:[(0,Il.jsx)("h3",{className:"text-xs uppercase text-gray-500 mb-2 tracking-wide",children:"Plan"}),(0,Il.jsx)("div",{className:"space-y-3",children:e.map((n,a)=>(0,Il.jsx)(_b,{phase:n,index:a,status:UC(a,t)},n.name))})]})}var Uu=w(D(),1),Nb={todo:"bg-gray-100 text-gray-500","in-progress":"bg-amber-100 text-amber-800",done:"bg-green-100 text-green-800",wontdo:"bg-red-100 text-red-700"},BC=["todo","in-progress","done","wontdo"];function Ob({current:e,onStatusChange:t}){return t?(0,Uu.jsx)("select",{value:e,onChange:n=>t(n.target.value),className:`rounded-full px-2.5 text-xs font-medium cursor-pointer ${Nb[e]}`,children:BC.map(n=>(0,Uu.jsx)("option",{value:n,children:n},n))}):(0,Uu.jsx)("span",{className:`inline-block rounded-full px-2.5 text-xs font-medium ${Nb[e]}`,children:e})}var rt=w(D(),1),HC={story:"bg-blue-100 text-blue-700",bug:"bg-red-100 text-red-700"};function jC({content:e}){return(0,rt.jsx)("div",{className:"markdown leading-relaxed",dangerouslySetInnerHTML:{__html:H.parse(e)}})}function Mb({item:e,onStatusChange:t}){return(0,rt.jsxs)("div",{className:"bg-white rounded-lg p-6 border border-gray-200",children:[(0,rt.jsx)("h2",{children:e.name}),(0,rt.jsxs)("div",{className:"text-gray-400 text-sm mb-4 flex items-center gap-2",children:["#",e.id,(0,rt.jsx)("span",{className:`inline-block rounded-full px-2.5 text-xs font-medium ${HC[e.type]}`,children:e.type}),(0,rt.jsx)(Ob,{current:e.status,onStatusChange:t})]}),e.description&&(0,rt.jsxs)("div",{className:"mb-4",children:[(0,rt.jsx)("h3",{className:"text-xs uppercase text-gray-500 mb-2 tracking-wide",children:"Description"}),(0,rt.jsx)(jC,{content:e.description})]}),(0,rt.jsx)(xb,{criteria:e.acceptanceCriteria}),e.plan&&(0,rt.jsx)(Db,{phases:e.plan,currentPhase:e.currentPhase}),e.comments&&(0,rt.jsx)(Cb,{comments:e.comments})]})}var Ye=w(D(),1);function VC({itemId:e,onDeleted:t}){let[n,a]=(0,Lb.useState)(!1);return(0,Ye.jsxs)(Ye.Fragment,{children:[n&&(0,Ye.jsx)(wb,{onConfirm:async()=>{await vv(e),await t()},onCancel:()=>a(!1)}),(0,Ye.jsx)("button",{type:"button",className:"bg-red-600 hover:bg-red-700 text-white rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:()=>a(!0),children:"Delete"})]})}function FC({itemId:e,onDeleted:t}){let n=Ht();return(0,Ye.jsxs)("div",{className:"flex justify-between items-center mb-4",children:[(0,Ye.jsx)(wu,{to:"/"}),(0,Ye.jsxs)("div",{className:"flex gap-2",children:[(0,Ye.jsx)("button",{type:"button",className:"bg-gray-200 hover:bg-gray-300 text-gray-800 rounded-md px-4 py-2 text-sm font-medium cursor-pointer",onClick:()=>n(`/items/${e}/edit`),children:"Edit"}),(0,Ye.jsx)(VC,{itemId:e,onDeleted:t})]})]})}function kb({item:e,onReload:t}){let n=Ht();return(0,Ye.jsxs)(Ye.Fragment,{children:[(0,Ye.jsx)(FC,{itemId:e.id,onDeleted:async()=>{await t(),n("/")}}),(0,Ye.jsx)(Mb,{item:e,onStatusChange:async a=>{await Rv(e.id,a),await t()}})]})}var Od=w(D(),1);function Md({items:e,mode:t,onReload:n}){let{id:a}=kf(),l=Number(a),r=e.find(i=>i.id===l);return r?t==="edit"?(0,Od.jsx)(Ou,{item:r,onReload:n,backTo:`/items/${l}`}):(0,Od.jsx)(kb,{item:r,onReload:n}):null}var jt=w(D(),1);function zb({items:e,onReload:t}){return(0,jt.jsxs)(Kr,{children:[(0,jt.jsx)(Rn,{index:!0,element:(0,jt.jsx)(Eb,{items:e})}),(0,jt.jsx)(Rn,{path:"items/:id",element:(0,jt.jsx)(Md,{items:e,mode:"detail",onReload:t})}),(0,jt.jsx)(Rn,{path:"items/:id/edit",element:(0,jt.jsx)(Md,{items:e,mode:"edit",onReload:t})}),(0,jt.jsx)(Rn,{path:"add",element:(0,jt.jsx)(Ou,{onReload:t,backTo:"/"})})]})}var $l=w(D(),1);function YC(){let[e,t]=(0,Pl.useState)([]),n=(0,Pl.useCallback)(async()=>{t(await au())},[]);return(0,Pl.useEffect)(()=>{n()},[n]),(0,$l.jsx)(qf,{children:(0,$l.jsx)(Kr,{children:(0,$l.jsx)(Rn,{path:"/*",element:(0,$l.jsx)(zb,{items:e,onReload:n})})})})}var Ub=document.getElementById("app");Ub&&(0,Bb.createRoot)(Ub).render((0,$l.jsx)(YC,{}));})();
68
68
  /*! Bundled license information:
69
69
 
70
70
  react/cjs/react.production.js:
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import { Command } from "commander";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "@staff0rd/assist",
9
- version: "0.185.0",
9
+ version: "0.186.1",
10
10
  type: "module",
11
11
  main: "dist/index.js",
12
12
  bin: {
@@ -439,11 +439,7 @@ function ensureGitignore(dir) {
439
439
  `);
440
440
  }
441
441
 
442
- // src/commands/backlog/openDb.ts
443
- var _db;
444
- function getDbPath(dir) {
445
- return join3(dir, ".assist", "backlog.db");
446
- }
442
+ // src/commands/backlog/migrateCommentsAddId.ts
447
443
  function migrateCommentsAddId(db) {
448
444
  const cols = db.pragma("table_info(comments)");
449
445
  if (cols.length === 0 || cols.some((c) => c.name === "id")) return;
@@ -463,6 +459,24 @@ function migrateCommentsAddId(db) {
463
459
  ALTER TABLE comments_new RENAME TO comments;
464
460
  `);
465
461
  }
462
+ function migrateToOneBasedPhases(db) {
463
+ const row = db.prepare(
464
+ "SELECT value FROM metadata WHERE key = 'one_based_phases_migrated'"
465
+ ).get();
466
+ if (row) return;
467
+ db.exec(`
468
+ UPDATE items SET current_phase = current_phase + 1 WHERE current_phase IS NOT NULL;
469
+ UPDATE comments SET phase = phase + 1 WHERE phase IS NOT NULL;
470
+ INSERT INTO metadata (key, value) VALUES ('one_based_phases_migrated', '1')
471
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value;
472
+ `);
473
+ }
474
+
475
+ // src/commands/backlog/openDb.ts
476
+ var _db;
477
+ function getDbPath(dir) {
478
+ return join3(dir, ".assist", "backlog.db");
479
+ }
466
480
  function initSchema(db) {
467
481
  db.exec(`
468
482
  CREATE TABLE IF NOT EXISTS items (
@@ -524,6 +538,7 @@ function openDb(dir) {
524
538
  db.pragma("foreign_keys = ON");
525
539
  initSchema(db);
526
540
  migrateCommentsAddId(db);
541
+ migrateToOneBasedPhases(db);
527
542
  ensureGitignore(dir);
528
543
  _db = db;
529
544
  return db;
@@ -700,9 +715,7 @@ function typeLabel(type) {
700
715
  }
701
716
  function phaseLabel(item) {
702
717
  if (!item.plan) return "";
703
- return chalk2.dim(
704
- ` (phase ${(item.currentPhase ?? 0) + 1}/${item.plan.length})`
705
- );
718
+ return chalk2.dim(` (phase ${item.currentPhase ?? 1}/${item.plan.length})`);
706
719
  }
707
720
  function isBlocked(item, items) {
708
721
  const deps2 = (item.links ?? []).filter((l) => l.type === "depends-on");
@@ -766,18 +779,18 @@ function buildCommentLines(comments2) {
766
779
  function formatPromptComment(entry) {
767
780
  const id = entry.id !== void 0 ? `#${entry.id} ` : "";
768
781
  const tag = entry.type === "summary" ? "[summary]" : "[comment]";
769
- const phase = entry.phase !== void 0 ? ` (phase ${entry.phase + 1})` : "";
782
+ const phase = entry.phase !== void 0 ? ` (phase ${entry.phase})` : "";
770
783
  return `${id}${tag}${phase} ${entry.timestamp}
771
784
  ${entry.text}`;
772
785
  }
773
786
 
774
787
  // src/commands/backlog/buildAuthoredPhasePrompt.ts
775
- function buildAuthoredPhasePrompt(item, phaseIndex, phase) {
788
+ function buildAuthoredPhasePrompt(item, phaseNumber, phase) {
776
789
  const manualChecks = phase.manualChecks ?? [];
777
790
  const needsConfirmation = manualChecks.length > 0;
778
791
  const confirmSuffix = needsConfirmation ? " and the user confirms" : "";
779
792
  return [
780
- ...buildContextLines(item, phaseIndex, phase),
793
+ ...buildContextLines(item, phaseNumber, phase),
781
794
  "",
782
795
  "Focus ONLY on this phase. Do not work on other phases.",
783
796
  "When you have completed all tasks for this phase, run /verify to check your work.",
@@ -785,14 +798,14 @@ function buildAuthoredPhasePrompt(item, phaseIndex, phase) {
785
798
  "",
786
799
  `Post concise comments for any notable findings or changes using \`assist backlog comment ${item.id} "<text>"\`.`,
787
800
  "",
788
- `Once verify passes${confirmSuffix}, run: assist backlog phase-done ${item.id} ${phaseIndex} "<summary>"`,
801
+ `Once verify passes${confirmSuffix}, run: assist backlog phase-done ${item.id} ${phaseNumber} "<summary>"`,
789
802
  "Replace <summary> with a concise summary of what was done in this phase."
790
803
  ].filter((line) => line !== void 0).join("\n");
791
804
  }
792
- function buildContextLines(item, phaseIndex, phase) {
805
+ function buildContextLines(item, phaseNumber, phase) {
793
806
  const ac = item.acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join("\n");
794
807
  return [
795
- `You are implementing phase ${phaseIndex + 1} of backlog item #${item.id}: ${item.name}`,
808
+ `You are implementing phase ${phaseNumber} of backlog item #${item.id}: ${item.name}`,
796
809
  "",
797
810
  item.description ? `Description: ${item.description}` : "",
798
811
  "",
@@ -800,7 +813,7 @@ function buildContextLines(item, phaseIndex, phase) {
800
813
  ac,
801
814
  ...buildCommentLines(item.comments),
802
815
  "",
803
- `Phase ${phaseIndex + 1}: ${phase.name}`,
816
+ `Phase ${phaseNumber}: ${phase.name}`,
804
817
  "Tasks:",
805
818
  formatTasks(phase)
806
819
  ];
@@ -822,7 +835,7 @@ function formatTasks(phase) {
822
835
  }
823
836
 
824
837
  // src/commands/backlog/buildReviewPrompt.ts
825
- function buildReviewPrompt(item, phaseIndex) {
838
+ function buildReviewPrompt(item, phaseNumber) {
826
839
  const acLines = item.acceptanceCriteria.map((ac, i) => `${i + 1}. ${ac}`).join("\n");
827
840
  return [
828
841
  `You are reviewing backlog item #${item.id}: ${item.name}`,
@@ -846,17 +859,17 @@ function buildReviewPrompt(item, phaseIndex) {
846
859
  "Once the user confirms:",
847
860
  `1. Run: assist backlog done ${item.id} "<summary>"`,
848
861
  "2. Run: /commit",
849
- `3. Run: assist backlog phase-done ${item.id} ${phaseIndex} "done"`
862
+ `3. Run: assist backlog phase-done ${item.id} ${phaseNumber} "done"`
850
863
  ].filter((line) => line !== void 0).join("\n");
851
864
  }
852
865
 
853
866
  // src/commands/backlog/buildPhasePrompt.ts
854
867
  var REVIEW_PHASE_NAME = "Review";
855
- function buildPhasePrompt(item, phaseIndex, phase) {
868
+ function buildPhasePrompt(item, phaseNumber, phase) {
856
869
  if (phase.name === REVIEW_PHASE_NAME) {
857
- return buildReviewPrompt(item, phaseIndex);
870
+ return buildReviewPrompt(item, phaseNumber);
858
871
  }
859
- return buildAuthoredPhasePrompt(item, phaseIndex, phase);
872
+ return buildAuthoredPhasePrompt(item, phaseNumber, phase);
860
873
  }
861
874
 
862
875
  // src/commands/backlog/buildReviewPhase.ts
@@ -945,12 +958,14 @@ async function resolvePhaseResult(phaseIndex, itemId) {
945
958
  cleanupSignal();
946
959
  if (signal?.event === "rewind") {
947
960
  const targetPhase = signal.targetPhase;
961
+ const targetPhaseNumber = targetPhase + 1;
948
962
  console.log(chalk4.yellow(`
949
- Rewinding to phase ${targetPhase + 1}.`));
963
+ Rewinding to phase ${targetPhaseNumber}.`));
950
964
  return targetPhase;
951
965
  }
966
+ const phaseNumber = phaseIndex + 1;
952
967
  console.log(chalk4.green(`
953
- Phase ${phaseIndex + 1} completed.`));
968
+ Phase ${phaseNumber} completed.`));
954
969
  return phaseIndex + 1;
955
970
  }
956
971
 
@@ -991,16 +1006,17 @@ function stopWatching() {
991
1006
  // src/commands/backlog/executePhase.ts
992
1007
  async function executePhase(item, phaseIndex, phases, spawnOptions) {
993
1008
  const phase = phases[phaseIndex];
1009
+ const phaseNumber = phaseIndex + 1;
994
1010
  console.log(
995
1011
  chalk5.bold(
996
1012
  `
997
- --- Phase ${phaseIndex + 1}/${phases.length}: ${phase.name} ---
1013
+ --- Phase ${phaseNumber}/${phases.length}: ${phase.name} ---
998
1014
  `
999
1015
  )
1000
1016
  );
1001
1017
  process.env.ASSIST_SESSION_ID = String(process.pid);
1002
1018
  const { child, done: done2 } = spawnClaude(
1003
- buildPhasePrompt(item, phaseIndex, phase),
1019
+ buildPhasePrompt(item, phaseNumber, phase),
1004
1020
  spawnOptions
1005
1021
  );
1006
1022
  watchForMarker(child);
@@ -1031,7 +1047,7 @@ function prepareRun(id) {
1031
1047
  if (!result) return void 0;
1032
1048
  const { item } = result;
1033
1049
  const plan2 = resolvePlan(item);
1034
- const startPhase = item.currentPhase ?? 0;
1050
+ const startPhase = (item.currentPhase ?? 1) - 1;
1035
1051
  if (item.status === "done") {
1036
1052
  console.log(chalk6.green(`Already done: #${id}: ${item.name}`));
1037
1053
  return void 0;
@@ -1066,7 +1082,8 @@ async function run(id, spawnOptions) {
1066
1082
  function logProgress(id, name, startPhase, total) {
1067
1083
  console.log(chalk7.bold(`Running plan for #${id}: ${name}`));
1068
1084
  if (startPhase > 0) {
1069
- console.log(chalk7.dim(`Resuming from phase ${startPhase + 1}/${total}
1085
+ const phaseNumber = startPhase + 1;
1086
+ console.log(chalk7.dim(`Resuming from phase ${phaseNumber}/${total}
1070
1087
  `));
1071
1088
  } else {
1072
1089
  console.log(chalk7.dim(`${total} phase(s)
@@ -1173,7 +1190,8 @@ function addPhaseSummary(item, text, phase) {
1173
1190
 
1174
1191
  // src/commands/backlog/phaseDone.ts
1175
1192
  function phaseDone(id, phase, summary) {
1176
- const phaseIndex = Number.parseInt(phase, 10);
1193
+ const phaseNumber = Number.parseInt(phase, 10);
1194
+ const phaseIndex = phaseNumber - 1;
1177
1195
  writeSignal("phase-done", {
1178
1196
  itemId: Number.parseInt(id, 10),
1179
1197
  phaseIndex,
@@ -1185,11 +1203,13 @@ function phaseDone(id, phase, summary) {
1185
1203
  return;
1186
1204
  }
1187
1205
  if (result) {
1188
- addPhaseSummary(result.item, summary, phaseIndex);
1206
+ addPhaseSummary(result.item, summary, phaseNumber);
1189
1207
  saveBacklog(result.items);
1190
1208
  }
1191
- setCurrentPhase(id, phaseIndex + 1);
1192
- console.log(chalk9.green(`Phase ${phase} of item #${id} marked as complete.`));
1209
+ setCurrentPhase(id, phaseNumber + 1);
1210
+ console.log(
1211
+ chalk9.green(`Phase ${phaseNumber} of item #${id} marked as complete.`)
1212
+ );
1193
1213
  }
1194
1214
 
1195
1215
  // src/commands/backlog/plan.ts
@@ -1221,7 +1241,7 @@ import chalk11 from "chalk";
1221
1241
  function formatComment(entry) {
1222
1242
  const id = entry.id !== void 0 ? chalk11.dim(`#${entry.id} `) : "";
1223
1243
  const tag = entry.type === "summary" ? chalk11.magenta("[summary]") : chalk11.cyan("[comment]");
1224
- const phase = entry.phase !== void 0 ? chalk11.dim(` (phase ${entry.phase + 1})`) : "";
1244
+ const phase = entry.phase !== void 0 ? chalk11.dim(` (phase ${entry.phase})`) : "";
1225
1245
  const time = chalk11.dim(entry.timestamp);
1226
1246
  return `${id}${tag}${phase} ${time}
1227
1247
  ${entry.text}`;
@@ -1268,14 +1288,15 @@ function printPlan(item) {
1268
1288
  if (!item.plan || item.plan.length === 0) return;
1269
1289
  console.log(chalk14.bold("Plan"));
1270
1290
  for (const [i, phase] of item.plan.entries()) {
1271
- const isCurrent = item.currentPhase === i;
1291
+ const isCurrent = item.currentPhase === i + 1;
1272
1292
  printPhase(phase, i, isCurrent);
1273
1293
  }
1274
1294
  console.log();
1275
1295
  }
1276
1296
  function phaseHeader(index, name, isCurrent) {
1297
+ const phaseNumber = index + 1;
1277
1298
  const marker = isCurrent ? chalk14.green("\u25B6 ") : " ";
1278
- const label2 = isCurrent ? chalk14.green.bold(`Phase ${index + 1}: ${name}`) : `${chalk14.bold(`Phase ${index + 1}:`)} ${name}`;
1299
+ const label2 = isCurrent ? chalk14.green.bold(`Phase ${phaseNumber}: ${name}`) : `${chalk14.bold(`Phase ${phaseNumber}:`)} ${name}`;
1279
1300
  return `${marker}${label2}`;
1280
1301
  }
1281
1302
  function printPhase(phase, index, isCurrent) {
@@ -4200,25 +4221,26 @@ function registerLinkCommands(cmd) {
4200
4221
 
4201
4222
  // src/commands/backlog/rewindPhase.ts
4202
4223
  import chalk52 from "chalk";
4203
- function validateRewind(item, phaseIndex) {
4224
+ function validateRewind(item, phaseNumber) {
4204
4225
  if (!item.plan || item.plan.length === 0) {
4205
4226
  return `Item #${item.id} has no plan phases.`;
4206
4227
  }
4207
- if (phaseIndex < 0 || phaseIndex >= item.plan.length) {
4208
- return `Phase ${phaseIndex} does not exist. Valid range: 0\u2013${item.plan.length - 1}.`;
4228
+ if (phaseNumber < 1 || phaseNumber > item.plan.length) {
4229
+ return `Phase ${phaseNumber} does not exist. Valid range: 1\u2013${item.plan.length}.`;
4209
4230
  }
4210
- const currentPhase = item.currentPhase ?? 0;
4211
- if (phaseIndex >= currentPhase) {
4212
- return `Phase ${phaseIndex} is not earlier than the current phase (${currentPhase}).`;
4231
+ const currentPhase = item.currentPhase ?? 1;
4232
+ if (phaseNumber >= currentPhase) {
4233
+ return `Phase ${phaseNumber} is not earlier than the current phase (${currentPhase}).`;
4213
4234
  }
4214
4235
  return void 0;
4215
4236
  }
4216
4237
  function rewindPhase(id, phase, opts) {
4217
- const phaseIndex = Number.parseInt(phase, 10);
4238
+ const phaseNumber = Number.parseInt(phase, 10);
4239
+ const phaseIndex = phaseNumber - 1;
4218
4240
  const result = loadAndFindItem(id);
4219
4241
  if (!result) return;
4220
4242
  const { item } = result;
4221
- const error = validateRewind(item, phaseIndex);
4243
+ const error = validateRewind(item, phaseNumber);
4222
4244
  if (error) {
4223
4245
  console.log(chalk52.red(error));
4224
4246
  process.exitCode = 1;
@@ -4227,18 +4249,18 @@ function rewindPhase(id, phase, opts) {
4227
4249
  const phaseName = item.plan?.[phaseIndex].name;
4228
4250
  addComment(
4229
4251
  item,
4230
- `Rewound to phase ${phaseIndex} (${phaseName}): ${opts.reason}`,
4231
- phaseIndex
4252
+ `Rewound to phase ${phaseNumber} (${phaseName}): ${opts.reason}`,
4253
+ phaseNumber
4232
4254
  );
4233
4255
  saveBacklog(result.items);
4234
- setCurrentPhase(id, phaseIndex);
4256
+ setCurrentPhase(id, phaseNumber);
4235
4257
  setStatus(id, "in-progress");
4236
4258
  writeSignal("rewind", {
4237
4259
  itemId: Number.parseInt(id, 10),
4238
4260
  targetPhase: phaseIndex
4239
4261
  });
4240
4262
  console.log(
4241
- chalk52.green(`Rewound item #${id} to phase ${phaseIndex} (${phaseName}).`)
4263
+ chalk52.green(`Rewound item #${id} to phase ${phaseNumber} (${phaseName}).`)
4242
4264
  );
4243
4265
  }
4244
4266
 
@@ -4304,8 +4326,8 @@ async function done(id, summary) {
4304
4326
  if (!result) return;
4305
4327
  const { item } = result;
4306
4328
  if (item.plan && item.plan.length > 0) {
4307
- const completed = item.currentPhase ?? 0;
4308
- const pending = item.plan.slice(completed);
4329
+ const completedCount = (item.currentPhase ?? 1) - 1;
4330
+ const pending = item.plan.slice(completedCount);
4309
4331
  if (pending.length > 0) {
4310
4332
  console.log(
4311
4333
  chalk55.red(
@@ -4321,7 +4343,7 @@ async function done(id, summary) {
4321
4343
  }
4322
4344
  item.status = "done";
4323
4345
  if (summary) {
4324
- const phase = item.currentPhase ?? 0;
4346
+ const phase = item.currentPhase ?? 1;
4325
4347
  addPhaseSummary(item, summary, phase);
4326
4348
  }
4327
4349
  saveBacklog(result.items);
@@ -4344,7 +4366,7 @@ async function wontdo(id, reason) {
4344
4366
  if (!result) return;
4345
4367
  result.item.status = "wontdo";
4346
4368
  if (reason) {
4347
- const phase = result.item.currentPhase ?? 0;
4369
+ const phase = result.item.currentPhase ?? 1;
4348
4370
  addPhaseSummary(result.item, reason, phase);
4349
4371
  }
4350
4372
  saveBacklog(result.items);
@@ -4370,12 +4392,15 @@ function findPhase(id, phase) {
4370
4392
  const dir = getBacklogDir();
4371
4393
  const db = openDb(dir);
4372
4394
  const itemId = result.item.id;
4373
- const phaseIdx = Number.parseInt(phase, 10);
4395
+ const phaseNumber = Number.parseInt(phase, 10);
4396
+ const phaseIdx = phaseNumber - 1;
4374
4397
  const existing = db.prepare(
4375
4398
  "SELECT COUNT(*) as cnt FROM plan_phases WHERE item_id = ? AND idx = ?"
4376
4399
  ).get(itemId, phaseIdx);
4377
4400
  if (existing.cnt === 0) {
4378
- console.log(chalk58.red(`Phase ${phaseIdx} not found on item #${itemId}.`));
4401
+ console.log(
4402
+ chalk58.red(`Phase ${phaseNumber} not found on item #${itemId}.`)
4403
+ );
4379
4404
  process.exitCode = 1;
4380
4405
  return void 0;
4381
4406
  }
@@ -4397,14 +4422,15 @@ function reindexPhases(db, itemId) {
4397
4422
  }
4398
4423
  function adjustCurrentPhase(db, item, removedIdx) {
4399
4424
  if (item.currentPhase === void 0) return;
4400
- if (removedIdx < item.currentPhase) {
4425
+ const currentIdx = item.currentPhase - 1;
4426
+ if (removedIdx < currentIdx) {
4401
4427
  db.prepare("UPDATE items SET current_phase = ? WHERE id = ?").run(
4402
4428
  item.currentPhase - 1,
4403
4429
  item.id
4404
4430
  );
4405
- } else if (removedIdx === item.currentPhase) {
4431
+ } else if (removedIdx === currentIdx) {
4406
4432
  const { cnt } = db.prepare("SELECT COUNT(*) as cnt FROM plan_phases WHERE item_id = ?").get(item.id);
4407
- const newPhase = cnt === 0 ? null : Math.min(item.currentPhase, cnt - 1);
4433
+ const newPhase = cnt === 0 ? null : Math.min(item.currentPhase, cnt);
4408
4434
  db.prepare("UPDATE items SET current_phase = ? WHERE id = ?").run(
4409
4435
  newPhase,
4410
4436
  item.id
@@ -4431,7 +4457,9 @@ function removePhase(id, phase) {
4431
4457
  run4();
4432
4458
  exportToJsonl(db, dir);
4433
4459
  commitBacklog(itemId, result.item.name);
4434
- console.log(chalk59.green(`Removed phase ${phaseIdx} from item #${itemId}.`));
4460
+ console.log(
4461
+ chalk59.green(`Removed phase ${phaseIdx + 1} from item #${itemId}.`)
4462
+ );
4435
4463
  }
4436
4464
 
4437
4465
  // src/commands/backlog/update/index.ts
@@ -4546,7 +4574,9 @@ function updatePhase(id, phase, options2) {
4546
4574
  manualCheck && "manual checks"
4547
4575
  ].filter(Boolean).join(", ");
4548
4576
  console.log(
4549
- chalk62.green(`Updated ${fields} on phase ${phaseIdx} of item #${itemId}.`)
4577
+ chalk62.green(
4578
+ `Updated ${fields} on phase ${phaseIdx + 1} of item #${itemId}.`
4579
+ )
4550
4580
  );
4551
4581
  }
4552
4582
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@staff0rd/assist",
3
- "version": "0.185.0",
3
+ "version": "0.186.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {