@staff0rd/assist 0.186.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/dist/commands/backlog/web/bundle.js +1 -1
- package/dist/index.js +87 -57
- package/package.json +1 -1
|
@@ -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.186.
|
|
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/
|
|
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
|
|
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,
|
|
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,
|
|
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} ${
|
|
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,
|
|
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 ${
|
|
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 ${
|
|
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,
|
|
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} ${
|
|
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,
|
|
868
|
+
function buildPhasePrompt(item, phaseNumber, phase) {
|
|
856
869
|
if (phase.name === REVIEW_PHASE_NAME) {
|
|
857
|
-
return buildReviewPrompt(item,
|
|
870
|
+
return buildReviewPrompt(item, phaseNumber);
|
|
858
871
|
}
|
|
859
|
-
return buildAuthoredPhasePrompt(item,
|
|
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 ${
|
|
963
|
+
Rewinding to phase ${targetPhaseNumber}.`));
|
|
950
964
|
return targetPhase;
|
|
951
965
|
}
|
|
966
|
+
const phaseNumber = phaseIndex + 1;
|
|
952
967
|
console.log(chalk4.green(`
|
|
953
|
-
Phase ${
|
|
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 ${
|
|
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,
|
|
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 ??
|
|
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
|
-
|
|
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
|
|
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,
|
|
1206
|
+
addPhaseSummary(result.item, summary, phaseNumber);
|
|
1189
1207
|
saveBacklog(result.items);
|
|
1190
1208
|
}
|
|
1191
|
-
setCurrentPhase(id,
|
|
1192
|
-
console.log(
|
|
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
|
|
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 ${
|
|
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,
|
|
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 (
|
|
4208
|
-
return `Phase ${
|
|
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 ??
|
|
4211
|
-
if (
|
|
4212
|
-
return `Phase ${
|
|
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
|
|
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,
|
|
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 ${
|
|
4231
|
-
|
|
4252
|
+
`Rewound to phase ${phaseNumber} (${phaseName}): ${opts.reason}`,
|
|
4253
|
+
phaseNumber
|
|
4232
4254
|
);
|
|
4233
4255
|
saveBacklog(result.items);
|
|
4234
|
-
setCurrentPhase(id,
|
|
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 ${
|
|
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
|
|
4308
|
-
const pending = item.plan.slice(
|
|
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 ??
|
|
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 ??
|
|
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
|
|
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(
|
|
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
|
-
|
|
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 ===
|
|
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
|
|
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(
|
|
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(
|
|
4577
|
+
chalk62.green(
|
|
4578
|
+
`Updated ${fields} on phase ${phaseIdx + 1} of item #${itemId}.`
|
|
4579
|
+
)
|
|
4550
4580
|
);
|
|
4551
4581
|
}
|
|
4552
4582
|
|