scrum-skills 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/.agents/skills/diagram-design/SKILL.md +11 -1
  2. package/.agents/skills/diagram-design/UPSTREAM.json +13 -1
  3. package/.agents/skills/diagram-design/references/primitives-core.md +4 -0
  4. package/README.md +224 -224
  5. package/assets/board/200.html +1 -1
  6. package/assets/board/404.html +1 -1
  7. package/assets/board/_nuxt/{BtzUbHO_.js → BGwhkDRl.js} +1 -1
  8. package/assets/board/_nuxt/{BkcaOYQ_.js → BU8vdZUs.js} +4 -4
  9. package/assets/board/_nuxt/{COecDWbb.js → BmrSh0rL.js} +1 -1
  10. package/assets/board/_nuxt/{CtFknnHZ.js → C-fx-vFO.js} +1 -1
  11. package/assets/board/_nuxt/{DZ--fXuU.js → Cajxc4Dw.js} +1 -1
  12. package/assets/board/_nuxt/{ChUHb39z.js → CoipdpDu.js} +1 -1
  13. package/assets/board/_nuxt/{1XlYaCp9.js → D1V1gysQ.js} +1 -1
  14. package/assets/board/_nuxt/D_ct-Stz.js +1 -1
  15. package/assets/board/_nuxt/{CReA4TEB.js → Dmg78zOY.js} +1 -1
  16. package/assets/board/_nuxt/{BizDeOK5.js → DwCE3305.js} +1 -1
  17. package/assets/board/_nuxt/{DjzLR9Bl.js → DwzGxoX2.js} +1 -1
  18. package/assets/board/_nuxt/{BbxmvdIF.js → Utb4TVOl.js} +1 -1
  19. package/assets/board/_nuxt/_id_.B6iqDPxe.css +1 -0
  20. package/assets/board/_nuxt/{oSJF4yHw.js → b7xtxFRl.js} +1 -1
  21. package/assets/board/_nuxt/builds/latest.json +1 -1
  22. package/assets/board/_nuxt/builds/meta/08bebe14-0f1b-4d2a-8de4-e84e122d10e9.json +1 -0
  23. package/assets/board/_nuxt/burndown.Do6IbM6o.css +1 -0
  24. package/assets/board/_nuxt/diagrams.pyhqNtmr.css +1 -0
  25. package/assets/board/_nuxt/{entry.BCuHiFgF.css → entry.BBv-sBnP.css} +1 -1
  26. package/assets/board/_nuxt/epics.Dmessplu.css +1 -0
  27. package/assets/board/_nuxt/error-404.CgJNdpB5.css +1 -0
  28. package/assets/board/_nuxt/error-500.WYSoH44y.css +1 -0
  29. package/assets/board/_nuxt/gantt.Dmp00GUo.css +1 -0
  30. package/assets/board/_nuxt/last-change.1Su4GrCN.css +1 -0
  31. package/assets/board/_nuxt/milestones.U0xKCsEo.css +1 -0
  32. package/assets/board/_nuxt/pages.Dbj2IVk8.css +1 -0
  33. package/assets/board/_nuxt/tests.dXlUX16A.css +1 -0
  34. package/assets/board/burndown/index.html +1 -1
  35. package/assets/board/diagrams/index.html +1 -1
  36. package/assets/board/epics/index.html +1 -1
  37. package/assets/board/favicon.svg +16 -16
  38. package/assets/board/gantt/index.html +1 -1
  39. package/assets/board/index.html +1 -1
  40. package/assets/board/last-change/index.html +1 -1
  41. package/assets/board/milestones/index.html +1 -1
  42. package/assets/board/tests/index.html +1 -1
  43. package/bin/scrum-skills.mjs +204 -204
  44. package/docs/ai-assistant-guide.md +1008 -1008
  45. package/package.json +42 -42
  46. package/templates/AGENTS.md +84 -84
  47. package/tools/agile-tools.mjs +510 -510
  48. package/tools/ai.mjs +464 -464
  49. package/tools/git-commit.mjs +216 -216
  50. package/tools/projects.mjs +240 -240
  51. package/tools/serve.mjs +180 -180
  52. package/assets/board/_nuxt/_id_.ItzoSaBL.css +0 -1
  53. package/assets/board/_nuxt/builds/meta/2218461a-f45b-41d6-ae44-b0d2332a9511.json +0 -1
  54. package/assets/board/_nuxt/burndown.CT8fx1Ge.css +0 -1
  55. package/assets/board/_nuxt/diagrams.D1ybqBem.css +0 -1
  56. package/assets/board/_nuxt/epics.CUeDIEa0.css +0 -1
  57. package/assets/board/_nuxt/error-404.Y9imKiDC.css +0 -1
  58. package/assets/board/_nuxt/error-500.DufSBGVC.css +0 -1
  59. package/assets/board/_nuxt/gantt.CiC2Ts1t.css +0 -1
  60. package/assets/board/_nuxt/last-change.C05Vc3BF.css +0 -1
  61. package/assets/board/_nuxt/milestones.Civ3sMiQ.css +0 -1
  62. package/assets/board/_nuxt/pages.BshWbOyo.css +0 -1
  63. package/assets/board/_nuxt/tests.Ci9fBCka.css +0 -1
@@ -1 +1 @@
1
- import{I as e,a as t,i as n,n as ee,o as r,r as i,s as a}from"#entry";import{t as o}from"./DJM7u8P3.js";import{t as te}from"./OKKaKILz.js";import{t as ne}from"./CI0scS-N.js";import{At as s,K as c,S as l,U as u,Xt as d,Yt as f,b as p,d as m,f as re,gt as h,i as g,lt as _,m as v,p as y,qt as b,u as x,xt as S,y as C}from"./BxuBMtk_.js";import{c as w,s as T}from"./BygIGL69.js";var ie={class:`stats`},ae={class:`stat-top`},oe={class:`stat-label`},se={class:`stat-pill`},ce={class:`stat-value`},le={class:`stat-sub`},ue={class:`stat-delta`},de={class:`split`},fe={class:`spark`},pe=[`title`],me={class:`stat-top`},he={class:`stat-label`},ge={class:`stat-pill`},_e={class:`stat-value`},ve={class:`stat-sub`},ye={class:`stat-rows`},be={class:`stat-row`},xe={class:`v`},Se={class:`stat-row`},Ce={class:`v`},we={class:`stat-row`},Te={class:`v`},Ee={class:`stat-row`},De={class:`v`},Oe={class:`stat-foot`},ke={class:`row`},Ae={class:`bar`},je={class:`stat-top`},Me={class:`stat-label`},Ne={class:`stat-value`},Pe={class:`unit`},Fe={class:`stat-sub`},Ie={class:`stat-rows`},Le={class:`stat-row`},Re={class:`v`},ze={class:`stat-row`},Be={class:`v`},Ve={class:`stat-row`},He={class:`v`},Ue={class:`stat-row`},We={class:`v`},Ge={class:`stat-foot`},Ke={class:`row`},qe={class:`bar lilac`},Je={class:`stat-top`},Ye={class:`stat-label`},Xe={class:`stat-value`},Ze={class:`stat-rows`},Qe={class:`stat-row`},$e={class:`v`},et={class:`stat-row`},tt={class:`v`},nt={class:`stat-row`},rt={class:`v`},it={class:`stat-row`},at={class:`v`},ot={class:`stat-foot`},st={class:`row`},ct={class:`bar on-dark`},lt={class:`card tb`},ut={class:`tb-l`},dt={class:`tb-r`},ft={class:`mono`},pt={class:`mono`},mt={key:0,class:`card act-error`},ht={class:`act-error-txt`},gt={class:`card board`},_t={class:`lanes`},vt=[`title`,`onClick`],yt={class:`stub-name`},bt={class:`stub-ct`},xt={class:`stub-pts`},St={class:`lane-hd`},Ct={class:`lane-ct`},wt={class:`lane-pts`},Tt=[`aria-expanded`,`title`,`onClick`],Et={class:`lane-bd`},Dt={class:`sc-id mono`},Ot={class:`sc-c-pts`},kt=[`title`],At={class:`sc-top`},jt={class:`sc-id mono`},Mt={class:`dim sc-wsjf`},Nt=[`title`],Pt={class:`sc-title`},Ft={class:`sc-meta`},It={class:`sc-tags`},Lt={class:`tag tag-ghost`},Rt={key:0,class:`tag tag-neutral mono`},zt=[`title`],Bt=[`title`],Vt={class:`bar slim sc-bar`},Ht={class:`sc-ask`},Ut=[`aria-label`,`onClick`,`onKeydown`],Wt=[`aria-label`,`onClick`,`onKeydown`],Gt=[`aria-label`,`onClick`,`onKeydown`],Kt=[`aria-label`,`onClick`,`onKeydown`],qt={key:0,class:`lane-empty`},E=`board.foldedLanes.v1`,D=n(l({__name:`index`,setup(n){let{stories:l,epics:D,states:O,progress:k,milestoneOfStory:Jt,pointsOf:Yt,milestones:Xt,refresh:Zt,STATE_LABEL:A,STATE_SHORT:Qt,STATE_DOT:$t,TYPE_LABEL:en,TYPE_COLOR:tn,TYPE_ICON:nn,PRIORITY_COLOR:rn,SCOPE_LABEL:j,wsjf:M,blockedStories:an}=a(),N=S(`all`),P=S(`all`),F=S(`rank`),on=x(()=>[{label:`全部史诗`,value:`all`,icon:`i-lucide-layers`},...D.value.map(e=>({label:`${e.id} ${e.title}`,value:e.id,icon:`i-lucide-layer-group`}))]),sn=x(()=>[{label:`全部里程碑`,value:`all`,icon:`i-lucide-flag`},...Xt.value.map(e=>({label:`${e.id} ${e.title}`,value:e.id,icon:e.kind===`mvp`?`i-lucide-star`:`i-lucide-map-pin`}))]),cn=[{label:`默认顺序`,value:`rank`,icon:`i-lucide-list-ordered`},{label:`按优先级 P0 → P3`,value:`priority`,icon:`i-lucide-alert-circle`},{label:`按 WSJF 价值/点数`,value:`wsjf`,icon:`i-lucide-scale`},{label:`按点数`,value:`points`,icon:`i-lucide-signal`}],ln={P0:0,P1:1,P2:2,P3:3},I=[`done`,`cancelled`],L=[`done`,`cancelled`],R=S((()=>{try{if(typeof localStorage>`u`)return[...L];let e=localStorage.getItem(E);if(!e)return[...L];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>I.includes(e)):[...L]}catch{return[...L]}})()),un=e=>I.includes(e),z=e=>R.value.includes(e),dn=e=>I.includes(e),fn=e=>{if(un(e)){R.value=z(e)?R.value.filter(t=>t!==e):[...R.value,e];try{localStorage.setItem(E,JSON.stringify(R.value))}catch{}}},B=x(()=>{let e=l.value.filter(e=>!(N.value!==`all`&&e.epicId!==N.value||P.value!==`all`&&!Jt(e.id).some(e=>e.id===P.value)));return F.value===`priority`?[...e].sort((e,t)=>(ln[e.priority]??9)-(ln[t.priority]??9)||M(t)-M(e)):F.value===`wsjf`?[...e].sort((e,t)=>M(t)-M(e)):F.value===`points`?[...e].sort((e,t)=>t.points-e.points):e}),V=e=>B.value.filter(t=>t.status===e),H=e=>Yt(V(e).map(e=>e.id)),U=x(()=>{let e=B.value,t=e.filter(e=>e.status===`done`),n=e.filter(e=>e.status===`in-progress`||e.status===`review`),ee=e.filter(e=>e.status===`ready`||e.status===`draft`),r=e.filter(e=>e.status===`cancelled`),i=e.filter(e=>e.status!==`cancelled`),a=e.flatMap(e=>e.tasks??[]),o=e=>a.filter(t=>t.status===e).length;return{count:e.length,points:e.reduce((e,t)=>e+t.points,0),liveCount:i.length,livePoints:i.reduce((e,t)=>e+t.points,0),donePoints:t.reduce((e,t)=>e+t.points,0),done:t.length,running:n.length,idle:ee.length,cancelled:r.length,cancelledPoints:r.reduce((e,t)=>e+t.points,0),tasks:a.length,tasksDone:o(`done`),taskRed:o(`red`),taskGreen:o(`green`),taskRefactor:o(`refactored`),taskTodo:o(`todo`),bugs:e.filter(e=>e.type===`bug`).length,debt:e.filter(e=>e.type===`debt`).length,scope:e.filter(e=>e.scopeChange).length}}),W=x(()=>U.value.livePoints?Math.round(U.value.donePoints/U.value.livePoints*100):0),pn=x(()=>U.value.liveCount?Math.round(U.value.livePoints/U.value.liveCount*10)/10:0),G=x(()=>U.value.tasks?Math.round(U.value.tasksDone/U.value.tasks*100):0),mn=x(()=>an.value.length+U.value.bugs),hn=x(()=>Math.max(1,...O.map(e=>V(e).length))),gn=e=>8+Math.round(V(e).length/hn.value*34),K=[`draft`,`ready`,`in-progress`,`review`,`done`],_n=e=>K[K.indexOf(e)+1]??null,q=e=>K.indexOf(e)>0?K[K.indexOf(e)-1]:null,J=e=>(e.tasks??[]).filter(e=>e.status!==`done`).length,vn=e=>{let t=_n(e.status);return t?!(t===`done`&&J(e)>0):!1},yn=e=>{let t=_n(e.status);return t?t===`done`&&J(e)?`还有 ${J(e)} 个任务没完成,先做完再收尾`:`推进到「${A[t]}」`:`已经是最后一个状态`},bn=e=>q(e.status)!==null,Y={content:`bg-[#1b1526]! text-white! ring-0 shadow-lg`},xn=S(``),X=S(``),Z=S(``),Q=S(``);async function $(t,n){if(!X.value&&(n!==`next`||vn(t))&&(n!==`prev`||bn(t))){X.value=t.id,Q.value=``;try{xn.value||=(await e(`/api/projects`)).token,await e(`/api/agile/story-status`,{method:`POST`,headers:{"x-project-token":xn.value},body:{id:t.id,action:n}}),Z.value=``,await Zt()}catch(e){Q.value=`${t.id}:${e?.data?.error??e?.message??`改状态失败`}`}finally{X.value=``}}}let Sn=x(()=>{if(N.value===`all`)return`全部史诗`;let e=D.value.find(e=>e.id===N.value);return e?e.title.slice(0,6):`全部史诗`}),Cn=e=>Jt(e).filter(e=>e.kind===`mvp`);return(e,n)=>{let a=i,l=o,x=te,S=ee,E=ne;return u(),v(`div`,null,[m(`div`,ie,[m(`article`,{class:b([`stat`,(`cardToneClass`in e?e.cardToneClass:s(r))(0)])},[p(a,{tone:(`cardTone`in e?e.cardTone:s(t))(0)},null,8,[`tone`]),m(`div`,ae,[m(`span`,oe,[p(l,{name:`i-lucide-gauge`,class:`size-3.5`}),n[7]||=C(`看板完成度`,-1)]),m(`span`,se,d(s(Sn)),1)]),m(`div`,ce,[C(d(s(W)),1),n[8]||=m(`span`,{class:`unit`},`%`,-1)]),m(`div`,le,[m(`span`,ue,[p(l,{name:`i-lucide-check`,class:`size-3`}),C(d(s(U).donePoints)+` 点`,1)]),C(` 已交付 · 共 `+d(s(U).livePoints)+` 点 `,1)]),m(`div`,de,[m(`div`,null,[n[9]||=m(`span`,{class:`k`},`完成故事`,-1),m(`b`,null,[C(d(s(U).done),1),m(`small`,null,`/`+d(s(U).liveCount),1)])]),m(`div`,null,[n[11]||=m(`span`,{class:`k`},`剩余点`,-1),m(`b`,null,[C(d(s(U).livePoints-s(U).donePoints),1),n[10]||=m(`small`,null,`点`,-1)])])]),m(`div`,fe,[(u(!0),v(g,null,c(s(O),e=>(u(),v(`div`,{key:e,class:`spark-col`,title:`${s(A)[e]}:${V(e).length} 个`},[m(`div`,{class:b([`spark-bar`,{done:e===`done`,cancel:e===`cancelled`}]),style:f({height:gn(e)+`px`})},null,6),m(`span`,null,d(s(Qt)[e]),1)],8,pe))),128))])],2),m(`article`,{class:b([`stat`,(`cardToneClass`in e?e.cardToneClass:s(r))(1)])},[p(a,{tone:(`cardTone`in e?e.cardTone:s(t))(1)},null,8,[`tone`]),m(`div`,me,[m(`span`,he,[p(l,{name:`i-lucide-book-open`,class:`size-3.5`}),n[12]||=C(`故事`,-1)]),m(`span`,ge,d(Math.round(s(pn)))+` 点/个`,1)]),m(`div`,_e,[C(d(s(U).count),1),n[13]||=m(`span`,{class:`unit`},`个`,-1)]),m(`div`,ve,`共 `+d(s(U).livePoints)+` 点 · 任务 `+d(s(U).tasks)+` 个`,1),m(`div`,ye,[m(`div`,be,[n[14]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#6aa844`}}),C(`已完成`)],-1),m(`span`,xe,d(s(U).done),1)]),m(`div`,Se,[n[15]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#3f7fd4`}}),C(`进行中`)],-1),m(`span`,Ce,d(s(U).running),1)]),m(`div`,we,[n[16]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#b6bac1`}}),C(`未开始`)],-1),m(`span`,Te,d(s(U).idle),1)]),m(`div`,Ee,[n[17]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#cf4759`}}),C(`已取消`)],-1),m(`span`,De,d(s(U).cancelled)+d(s(U).cancelledPoints?` · ${s(U).cancelledPoints} 点`:``),1)])]),m(`div`,Oe,[m(`div`,ke,[m(`span`,null,`任务完成 `+d(s(U).tasksDone)+`/`+d(s(U).tasks),1),m(`span`,null,d(s(G))+`%`,1)]),m(`div`,Ae,[m(`i`,{style:f({width:s(G)+`%`})},null,4)])])],2),m(`article`,{class:b([`stat`,(`cardToneClass`in e?e.cardToneClass:s(r))(2)])},[p(a,{tone:(`cardTone`in e?e.cardTone:s(t))(2)},null,8,[`tone`]),m(`div`,je,[m(`span`,Me,[p(l,{name:`i-lucide-list-checks`,class:`size-3.5`}),n[18]||=C(`TDD 任务`,-1)]),n[19]||=m(`span`,{class:`stat-pill`},`红 → 绿 → 重构`,-1)]),m(`div`,Ne,[C(d(s(U).tasksDone),1),m(`span`,Pe,`/ `+d(s(U).tasks)+` 项`,1)]),m(`div`,Fe,`已完成任务占 `+d(s(G))+`%`,1),m(`div`,Ie,[m(`div`,Le,[n[20]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#cf4759`}}),C(`红(测试失败)`)],-1),m(`span`,Re,d(s(U).taskRed),1)]),m(`div`,ze,[n[21]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#6aa844`}}),C(`绿(测试通过)`)],-1),m(`span`,Be,d(s(U).taskGreen),1)]),m(`div`,Ve,[n[22]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#6d4ff0`}}),C(`已重构`)],-1),m(`span`,He,d(s(U).taskRefactor),1)]),m(`div`,Ue,[n[23]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#b6bac1`}}),C(`待办`)],-1),m(`span`,We,d(s(U).taskTodo),1)])]),m(`div`,Ge,[m(`div`,Ke,[m(`span`,null,`已完成 `+d(s(U).tasksDone)+`/`+d(s(U).tasks),1),m(`span`,null,d(s(G))+`%`,1)]),m(`div`,qe,[m(`i`,{style:f({width:s(G)+`%`})},null,4)])])],2),m(`article`,{class:b([`stat`,(`cardToneClass`in e?e.cardToneClass:s(r))(3)])},[p(a,{tone:(`cardTone`in e?e.cardTone:s(t))(3)},null,8,[`tone`]),m(`div`,Je,[m(`span`,Ye,[p(l,{name:`i-lucide-shield-alert`,class:`size-3.5`}),n[24]||=C(`风险面`,-1)]),n[25]||=m(`span`,{class:`stat-pill`},`需处理`,-1)]),m(`div`,Xe,[C(d(s(mn)),1),n[26]||=m(`span`,{class:`unit`},`项`,-1)]),n[32]||=m(`div`,{class:`stat-sub`},`阻塞故事与缺陷合计`,-1),m(`div`,Ze,[m(`div`,Qe,[n[27]||=m(`span`,{class:`k`},`阻塞故事`,-1),m(`span`,$e,d(s(an).length),1)]),m(`div`,et,[n[28]||=m(`span`,{class:`k`},`缺陷`,-1),m(`span`,tt,d(s(U).bugs),1)]),m(`div`,nt,[n[29]||=m(`span`,{class:`k`},`技术债`,-1),m(`span`,rt,d(s(U).debt),1)]),m(`div`,it,[n[30]||=m(`span`,{class:`k`},`范围变更`,-1),m(`span`,at,d(s(U).scope),1)])]),m(`div`,ot,[m(`div`,st,[n[31]||=m(`span`,null,`完成度`,-1),m(`span`,null,d(s(W))+`%`,1)]),m(`div`,ct,[m(`i`,{style:f({width:s(W)+`%`})},null,4)])])],2)]),m(`div`,lt,[m(`div`,ut,[n[33]||=m(`span`,{class:`lbl`},`筛选`,-1),p(x,{modelValue:s(N),"onUpdate:modelValue":n[0]||=e=>h(N)?N.value=e:null,items:s(on),icon:`i-lucide-layers`,"aria-label":`按史诗筛选`},null,8,[`modelValue`,`items`]),p(x,{modelValue:s(P),"onUpdate:modelValue":n[1]||=e=>h(P)?P.value=e:null,items:s(sn),icon:`i-lucide-flag`,"aria-label":`按里程碑筛选`},null,8,[`modelValue`,`items`]),p(x,{modelValue:s(F),"onUpdate:modelValue":n[2]||=e=>h(F)?F.value=e:null,items:cn,icon:`i-lucide-arrow-up-down`,"aria-label":`排序方式`},null,8,[`modelValue`])]),m(`div`,dt,[m(`span`,ft,d(s(B).length),1),n[34]||=C(` 个故事 `,-1),n[35]||=m(`i`,{class:`sep`},null,-1),m(`span`,pt,d(s(Yt)(s(B).map(e=>e.id))),1),n[36]||=C(` 点 `,-1)])]),s(Q)?(u(),v(`div`,mt,[p(l,{name:`i-lucide-circle-alert`,class:`size-4`}),m(`span`,ht,d(s(Q)),1),m(`button`,{class:`btn btn-sm`,onClick:n[3]||=e=>Q.value=``},`知道了`)])):y(``,!0),m(`div`,gt,[m(`div`,_t,[(u(!0),v(g,null,c(s(O),e=>(u(),v(`section`,{key:e,class:b([`lane`,{folded:z(e)}])},[z(e)?(u(),v(`button`,{key:0,class:`lane-stub`,title:`展开${s(A)[e]}:${V(e).length} 个 · ${H(e)} 点`,onClick:t=>fn(e)},[m(`i`,{class:`lane-dot`,style:f({background:s($t)[e]})},null,4),m(`span`,yt,d(s(A)[e]),1),m(`span`,bt,d(V(e).length),1),m(`span`,xt,d(H(e))+` 点`,1),p(l,{name:`i-lucide-chevrons-right`,class:`stub-ic`})],8,vt)):(u(),v(g,{key:1},[m(`header`,St,[m(`i`,{class:`lane-dot`,style:f({background:s($t)[e]})},null,4),m(`b`,null,d(s(A)[e]),1),m(`span`,Ct,d(V(e).length),1),m(`span`,wt,d(H(e))+` 点`,1),un(e)?(u(),v(`button`,{key:0,class:`lane-fold`,"aria-expanded":!z(e),title:`收起${s(A)[e]}`,onClick:t=>fn(e)},[p(l,{name:`i-lucide-chevron-left`,class:`size-3`})],8,Tt)):y(``,!0)]),m(`div`,Et,[(u(!0),v(g,null,c(V(e),t=>(u(),re(E,{key:t.id,to:`/story/${t.id}`,class:b([`scard`,{"scard-compact":dn(e)}])},{default:_(()=>[dn(e)?(u(),v(g,{key:0},[m(`span`,Dt,d(t.id),1),m(`span`,Ot,d(t.points)+` 点`,1),m(`span`,{class:`sc-c-title`,title:t.title},d(t.title),9,kt)],64)):(u(),v(g,{key:1},[m(`div`,At,[m(`span`,jt,d(t.id),1),m(`span`,{class:b([`tag`,`tag-${s(rn)[t.priority]}`])},d(t.priority),3),m(`span`,Mt,`WSJF `+d(s(M)(t)),1),t.blocked?(u(),v(`span`,{key:0,class:`tag tag-error tag-dot`,title:`阻塞中:${t.blocked.reason}(自 ${t.blocked.since})`},`阻塞`,8,Nt)):y(``,!0)]),m(`p`,Pt,d(t.title),1),m(`div`,Ft,[m(`span`,null,d(t.points)+` 点`,1),n[37]||=m(`span`,{class:`dim`},`·`,-1),m(`span`,null,`任务 `+d(s(k)(t).done)+`/`+d(s(k)(t).total),1)]),m(`div`,It,[m(`span`,{class:b([`tag`,`tag-${s(tn)[t.type]}`])},[p(l,{name:s(nn)[t.type],class:`size-3`},null,8,[`name`]),C(d(s(en)[t.type]),1)],2),m(`span`,Lt,d(t.epicId),1),t.sprintId?(u(),v(`span`,Rt,d(t.sprintId),1)):y(``,!0),(u(!0),v(g,null,c(Cn(t.id),e=>(u(),v(`span`,{key:e.id,class:`tag tag-mint`,title:`${e.id} ${e.title} · ${e.criteria}`},`MVP`,8,zt))),128)),t.scopeChange?(u(),v(`span`,{key:1,class:`tag tag-info`,title:`${s(j)[t.scopeChange.kind]}(${t.scopeChange.at}):${t.scopeChange.reason}`},d(s(j)[t.scopeChange.kind]),9,Bt)):y(``,!0)]),m(`div`,Vt,[m(`i`,{style:f({width:s(k)(t).pct+`%`})},null,4)]),m(`div`,{class:`sc-actions`,style:{backdropFilter:`blur(10px) saturate(125%)`},onMouseleave:n[6]||=e=>Z.value=``},[s(Z)===t.id?(u(),v(g,{key:0},[m(`span`,Ht,`取消 `+d(t.id)+`?`,1),m(`span`,{class:`sc-act danger`,role:`button`,tabindex:`0`,"data-act":`cancel-confirm`,"aria-label":`确认取消 ${t.id}`,onClick:w(e=>$(t,`cancel`),[`stop`,`prevent`]),onKeydown:T(w(e=>$(t,`cancel`),[`prevent`]),[`enter`])},`确认`,40,Ut),m(`span`,{class:`sc-act`,role:`button`,tabindex:`0`,"data-act":`cancel-abort`,onClick:n[4]||=w(e=>Z.value=``,[`stop`,`prevent`]),onKeydown:n[5]||=T(w(e=>Z.value=``,[`prevent`]),[`enter`])},`返回`,32)],64)):(u(),v(g,{key:1},[bn(t)?(u(),re(S,{key:0,text:`退回「${s(A)[q(t.status)??``]}」`,"delay-duration":150,ui:Y},{default:_(()=>[m(`span`,{class:`sc-act`,role:`button`,tabindex:`0`,"data-act":`prev`,"aria-label":`退回 ${t.id}`,onClick:w(e=>$(t,`prev`),[`stop`,`prevent`]),onKeydown:T(w(e=>$(t,`prev`),[`prevent`]),[`enter`])},[p(l,{name:`i-lucide-arrow-left`,class:`size-3.5`})],40,Wt)]),_:2},1032,[`text`])):y(``,!0),p(S,{text:yn(t),"delay-duration":150,ui:Y},{default:_(()=>[m(`span`,{class:b([`sc-act`,{off:!vn(t)}]),role:`button`,tabindex:`0`,"data-act":`next`,"aria-label":`推进 ${t.id}`,onClick:w(e=>$(t,`next`),[`stop`,`prevent`]),onKeydown:T(w(e=>$(t,`next`),[`prevent`]),[`enter`])},[p(l,{name:`i-lucide-arrow-right`,class:`size-3.5`})],42,Gt)]),_:2},1032,[`text`]),p(S,{text:`标记 ${t.id} 已取消`,"delay-duration":150,ui:Y},{default:_(()=>[m(`span`,{class:`sc-act danger`,role:`button`,tabindex:`0`,"data-act":`cancel`,"aria-label":`取消 ${t.id}`,onClick:w(e=>Z.value=t.id,[`stop`,`prevent`]),onKeydown:T(w(e=>Z.value=t.id,[`prevent`]),[`enter`])},[p(l,{name:`i-lucide-x`,class:`size-3.5`})],40,Kt)]),_:2},1032,[`text`])],64))],32)],64))]),_:2},1032,[`to`,`class`]))),128)),V(e).length?y(``,!0):(u(),v(`p`,qt,`暂无故事`))])],64))],2))),128))])])])}}}),[[`__scopeId`,`data-v-febc50a0`]]);export{D as default};
1
+ import{I as e,a as t,i as n,n as ee,o as r,r as i,s as a}from"#entry";import{t as o}from"./DJM7u8P3.js";import{t as te}from"./OKKaKILz.js";import{t as ne}from"./CI0scS-N.js";import{At as s,K as c,S as l,U as u,Xt as d,Yt as f,b as p,d as m,f as re,gt as h,i as g,lt as _,m as v,p as y,qt as b,u as x,xt as S,y as C}from"./BxuBMtk_.js";import{c as w,s as T}from"./BygIGL69.js";var ie={class:`stats`},ae={class:`stat-top`},oe={class:`stat-label`},se={class:`stat-pill`},ce={class:`stat-value`},le={class:`stat-sub`},ue={class:`stat-delta`},de={class:`split`},fe={class:`spark`},pe=[`title`],me={class:`stat-top`},he={class:`stat-label`},ge={class:`stat-pill`},_e={class:`stat-value`},ve={class:`stat-sub`},ye={class:`stat-rows`},be={class:`stat-row`},xe={class:`v`},Se={class:`stat-row`},Ce={class:`v`},we={class:`stat-row`},Te={class:`v`},Ee={class:`stat-row`},De={class:`v`},Oe={class:`stat-foot`},ke={class:`row`},Ae={class:`bar`},je={class:`stat-top`},Me={class:`stat-label`},Ne={class:`stat-value`},Pe={class:`unit`},Fe={class:`stat-sub`},Ie={class:`stat-rows`},Le={class:`stat-row`},Re={class:`v`},ze={class:`stat-row`},Be={class:`v`},Ve={class:`stat-row`},He={class:`v`},Ue={class:`stat-row`},We={class:`v`},Ge={class:`stat-foot`},Ke={class:`row`},qe={class:`bar lilac`},Je={class:`stat-top`},Ye={class:`stat-label`},Xe={class:`stat-value`},Ze={class:`stat-rows`},Qe={class:`stat-row`},$e={class:`v`},et={class:`stat-row`},tt={class:`v`},nt={class:`stat-row`},rt={class:`v`},it={class:`stat-row`},at={class:`v`},ot={class:`stat-foot`},st={class:`row`},ct={class:`bar on-dark`},lt={class:`card tb`},ut={class:`tb-l`},dt={class:`tb-r`},ft={class:`mono`},pt={class:`mono`},mt={key:0,class:`card act-error`},ht={class:`act-error-txt`},gt={class:`card board`},_t={class:`lanes`},vt=[`title`,`onClick`],yt={class:`stub-name`},bt={class:`stub-ct`},xt={class:`stub-pts`},St={class:`lane-hd`},Ct={class:`lane-ct`},wt={class:`lane-pts`},Tt=[`aria-expanded`,`title`,`onClick`],Et={class:`lane-bd`},Dt={class:`sc-id mono`},Ot={class:`sc-c-pts`},kt=[`title`],At={class:`sc-top`},jt={class:`sc-id mono`},Mt={class:`dim sc-wsjf`},Nt=[`title`],Pt={class:`sc-title`},Ft={class:`sc-meta`},It={class:`sc-tags`},Lt={class:`tag tag-ghost`},Rt={key:0,class:`tag tag-neutral mono`},zt=[`title`],Bt=[`title`],Vt={class:`bar slim sc-bar`},Ht={class:`sc-ask`},Ut=[`aria-label`,`onClick`,`onKeydown`],Wt=[`aria-label`,`onClick`,`onKeydown`],Gt=[`aria-label`,`onClick`,`onKeydown`],Kt=[`aria-label`,`onClick`,`onKeydown`],qt={key:0,class:`lane-empty`},E=`board.foldedLanes.v1`,D=n(l({__name:`index`,setup(n){let{stories:l,epics:D,states:O,progress:k,milestoneOfStory:Jt,pointsOf:Yt,milestones:Xt,refresh:Zt,STATE_LABEL:A,STATE_SHORT:Qt,STATE_DOT:$t,TYPE_LABEL:en,TYPE_COLOR:tn,TYPE_ICON:nn,PRIORITY_COLOR:rn,SCOPE_LABEL:j,wsjf:M,blockedStories:an}=a(),N=S(`all`),P=S(`all`),F=S(`rank`),on=x(()=>[{label:`全部史诗`,value:`all`,icon:`i-lucide-layers`},...D.value.map(e=>({label:`${e.id} ${e.title}`,value:e.id,icon:`i-lucide-layer-group`}))]),sn=x(()=>[{label:`全部里程碑`,value:`all`,icon:`i-lucide-flag`},...Xt.value.map(e=>({label:`${e.id} ${e.title}`,value:e.id,icon:e.kind===`mvp`?`i-lucide-star`:`i-lucide-map-pin`}))]),cn=[{label:`默认顺序`,value:`rank`,icon:`i-lucide-list-ordered`},{label:`按优先级 P0 → P3`,value:`priority`,icon:`i-lucide-alert-circle`},{label:`按 WSJF 价值/点数`,value:`wsjf`,icon:`i-lucide-scale`},{label:`按点数`,value:`points`,icon:`i-lucide-signal`}],ln={P0:0,P1:1,P2:2,P3:3},I=[`done`,`cancelled`],L=[`done`,`cancelled`],R=S((()=>{try{if(typeof localStorage>`u`)return[...L];let e=localStorage.getItem(E);if(!e)return[...L];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>I.includes(e)):[...L]}catch{return[...L]}})()),un=e=>I.includes(e),z=e=>R.value.includes(e),dn=e=>I.includes(e),fn=e=>{if(un(e)){R.value=z(e)?R.value.filter(t=>t!==e):[...R.value,e];try{localStorage.setItem(E,JSON.stringify(R.value))}catch{}}},B=x(()=>{let e=l.value.filter(e=>!(N.value!==`all`&&e.epicId!==N.value||P.value!==`all`&&!Jt(e.id).some(e=>e.id===P.value)));return F.value===`priority`?[...e].sort((e,t)=>(ln[e.priority]??9)-(ln[t.priority]??9)||M(t)-M(e)):F.value===`wsjf`?[...e].sort((e,t)=>M(t)-M(e)):F.value===`points`?[...e].sort((e,t)=>t.points-e.points):e}),V=e=>B.value.filter(t=>t.status===e),H=e=>Yt(V(e).map(e=>e.id)),U=x(()=>{let e=B.value,t=e.filter(e=>e.status===`done`),n=e.filter(e=>e.status===`in-progress`||e.status===`review`),ee=e.filter(e=>e.status===`ready`||e.status===`draft`),r=e.filter(e=>e.status===`cancelled`),i=e.filter(e=>e.status!==`cancelled`),a=e.flatMap(e=>e.tasks??[]),o=e=>a.filter(t=>t.status===e).length;return{count:e.length,points:e.reduce((e,t)=>e+t.points,0),liveCount:i.length,livePoints:i.reduce((e,t)=>e+t.points,0),donePoints:t.reduce((e,t)=>e+t.points,0),done:t.length,running:n.length,idle:ee.length,cancelled:r.length,cancelledPoints:r.reduce((e,t)=>e+t.points,0),tasks:a.length,tasksDone:o(`done`),taskRed:o(`red`),taskGreen:o(`green`),taskRefactor:o(`refactored`),taskTodo:o(`todo`),bugs:e.filter(e=>e.type===`bug`).length,debt:e.filter(e=>e.type===`debt`).length,scope:e.filter(e=>e.scopeChange).length}}),W=x(()=>U.value.livePoints?Math.round(U.value.donePoints/U.value.livePoints*100):0),pn=x(()=>U.value.liveCount?Math.round(U.value.livePoints/U.value.liveCount*10)/10:0),G=x(()=>U.value.tasks?Math.round(U.value.tasksDone/U.value.tasks*100):0),mn=x(()=>an.value.length+U.value.bugs),hn=x(()=>Math.max(1,...O.map(e=>V(e).length))),gn=e=>8+Math.round(V(e).length/hn.value*34),K=[`draft`,`ready`,`in-progress`,`review`,`done`],_n=e=>K[K.indexOf(e)+1]??null,q=e=>K.indexOf(e)>0?K[K.indexOf(e)-1]:null,J=e=>(e.tasks??[]).filter(e=>e.status!==`done`).length,vn=e=>{let t=_n(e.status);return t?!(t===`done`&&J(e)>0):!1},yn=e=>{let t=_n(e.status);return t?t===`done`&&J(e)?`还有 ${J(e)} 个任务没完成,先做完再收尾`:`推进到「${A[t]}」`:`已经是最后一个状态`},bn=e=>q(e.status)!==null,Y={content:`bg-[#1b1526]! text-white! ring-0 shadow-lg`},xn=S(``),X=S(``),Z=S(``),Q=S(``);async function $(t,n){if(!X.value&&(n!==`next`||vn(t))&&(n!==`prev`||bn(t))){X.value=t.id,Q.value=``;try{xn.value||=(await e(`/api/projects`)).token,await e(`/api/agile/story-status`,{method:`POST`,headers:{"x-project-token":xn.value},body:{id:t.id,action:n}}),Z.value=``,await Zt()}catch(e){Q.value=`${t.id}:${e?.data?.error??e?.message??`改状态失败`}`}finally{X.value=``}}}let Sn=x(()=>{if(N.value===`all`)return`全部史诗`;let e=D.value.find(e=>e.id===N.value);return e?e.title.slice(0,6):`全部史诗`}),Cn=e=>Jt(e).filter(e=>e.kind===`mvp`);return(e,n)=>{let a=i,l=o,x=te,S=ee,E=ne;return u(),v(`div`,null,[m(`div`,ie,[m(`article`,{class:b([`stat`,(`cardToneClass`in e?e.cardToneClass:s(r))(0)])},[p(a,{tone:(`cardTone`in e?e.cardTone:s(t))(0)},null,8,[`tone`]),m(`div`,ae,[m(`span`,oe,[p(l,{name:`i-lucide-gauge`,class:`size-3.5`}),n[7]||=C(`看板完成度`,-1)]),m(`span`,se,d(s(Sn)),1)]),m(`div`,ce,[C(d(s(W)),1),n[8]||=m(`span`,{class:`unit`},`%`,-1)]),m(`div`,le,[m(`span`,ue,[p(l,{name:`i-lucide-check`,class:`size-3`}),C(d(s(U).donePoints)+` 点`,1)]),C(` 已交付 · 共 `+d(s(U).livePoints)+` 点 `,1)]),m(`div`,de,[m(`div`,null,[n[9]||=m(`span`,{class:`k`},`完成故事`,-1),m(`b`,null,[C(d(s(U).done),1),m(`small`,null,`/`+d(s(U).liveCount),1)])]),m(`div`,null,[n[11]||=m(`span`,{class:`k`},`剩余点`,-1),m(`b`,null,[C(d(s(U).livePoints-s(U).donePoints),1),n[10]||=m(`small`,null,`点`,-1)])])]),m(`div`,fe,[(u(!0),v(g,null,c(s(O),e=>(u(),v(`div`,{key:e,class:`spark-col`,title:`${s(A)[e]}:${V(e).length} 个`},[m(`div`,{class:b([`spark-bar`,{done:e===`done`,cancel:e===`cancelled`}]),style:f({height:gn(e)+`px`})},null,6),m(`span`,null,d(s(Qt)[e]),1)],8,pe))),128))])],2),m(`article`,{class:b([`stat`,(`cardToneClass`in e?e.cardToneClass:s(r))(1)])},[p(a,{tone:(`cardTone`in e?e.cardTone:s(t))(1)},null,8,[`tone`]),m(`div`,me,[m(`span`,he,[p(l,{name:`i-lucide-book-open`,class:`size-3.5`}),n[12]||=C(`故事`,-1)]),m(`span`,ge,d(Math.round(s(pn)))+` 点/个`,1)]),m(`div`,_e,[C(d(s(U).count),1),n[13]||=m(`span`,{class:`unit`},`个`,-1)]),m(`div`,ve,`共 `+d(s(U).livePoints)+` 点 · 任务 `+d(s(U).tasks)+` 个`,1),m(`div`,ye,[m(`div`,be,[n[14]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#6aa844`}}),C(`已完成`)],-1),m(`span`,xe,d(s(U).done),1)]),m(`div`,Se,[n[15]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#3f7fd4`}}),C(`进行中`)],-1),m(`span`,Ce,d(s(U).running),1)]),m(`div`,we,[n[16]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#b6bac1`}}),C(`未开始`)],-1),m(`span`,Te,d(s(U).idle),1)]),m(`div`,Ee,[n[17]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#cf4759`}}),C(`已取消`)],-1),m(`span`,De,d(s(U).cancelled)+d(s(U).cancelledPoints?` · ${s(U).cancelledPoints} 点`:``),1)])]),m(`div`,Oe,[m(`div`,ke,[m(`span`,null,`任务完成 `+d(s(U).tasksDone)+`/`+d(s(U).tasks),1),m(`span`,null,d(s(G))+`%`,1)]),m(`div`,Ae,[m(`i`,{style:f({width:s(G)+`%`})},null,4)])])],2),m(`article`,{class:b([`stat`,(`cardToneClass`in e?e.cardToneClass:s(r))(2)])},[p(a,{tone:(`cardTone`in e?e.cardTone:s(t))(2)},null,8,[`tone`]),m(`div`,je,[m(`span`,Me,[p(l,{name:`i-lucide-list-checks`,class:`size-3.5`}),n[18]||=C(`TDD 任务`,-1)]),n[19]||=m(`span`,{class:`stat-pill`},`红 → 绿 → 重构`,-1)]),m(`div`,Ne,[C(d(s(U).tasksDone),1),m(`span`,Pe,`/ `+d(s(U).tasks)+` 项`,1)]),m(`div`,Fe,`已完成任务占 `+d(s(G))+`%`,1),m(`div`,Ie,[m(`div`,Le,[n[20]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#cf4759`}}),C(`红(测试失败)`)],-1),m(`span`,Re,d(s(U).taskRed),1)]),m(`div`,ze,[n[21]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#6aa844`}}),C(`绿(测试通过)`)],-1),m(`span`,Be,d(s(U).taskGreen),1)]),m(`div`,Ve,[n[22]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#6d4ff0`}}),C(`已重构`)],-1),m(`span`,He,d(s(U).taskRefactor),1)]),m(`div`,Ue,[n[23]||=m(`span`,{class:`k`},[m(`i`,{class:`dot`,style:{background:`#b6bac1`}}),C(`待办`)],-1),m(`span`,We,d(s(U).taskTodo),1)])]),m(`div`,Ge,[m(`div`,Ke,[m(`span`,null,`已完成 `+d(s(U).tasksDone)+`/`+d(s(U).tasks),1),m(`span`,null,d(s(G))+`%`,1)]),m(`div`,qe,[m(`i`,{style:f({width:s(G)+`%`})},null,4)])])],2),m(`article`,{class:b([`stat`,(`cardToneClass`in e?e.cardToneClass:s(r))(3)])},[p(a,{tone:(`cardTone`in e?e.cardTone:s(t))(3)},null,8,[`tone`]),m(`div`,Je,[m(`span`,Ye,[p(l,{name:`i-lucide-shield-alert`,class:`size-3.5`}),n[24]||=C(`风险面`,-1)]),n[25]||=m(`span`,{class:`stat-pill`},`需处理`,-1)]),m(`div`,Xe,[C(d(s(mn)),1),n[26]||=m(`span`,{class:`unit`},`项`,-1)]),n[32]||=m(`div`,{class:`stat-sub`},`阻塞故事与缺陷合计`,-1),m(`div`,Ze,[m(`div`,Qe,[n[27]||=m(`span`,{class:`k`},`阻塞故事`,-1),m(`span`,$e,d(s(an).length),1)]),m(`div`,et,[n[28]||=m(`span`,{class:`k`},`缺陷`,-1),m(`span`,tt,d(s(U).bugs),1)]),m(`div`,nt,[n[29]||=m(`span`,{class:`k`},`技术债`,-1),m(`span`,rt,d(s(U).debt),1)]),m(`div`,it,[n[30]||=m(`span`,{class:`k`},`范围变更`,-1),m(`span`,at,d(s(U).scope),1)])]),m(`div`,ot,[m(`div`,st,[n[31]||=m(`span`,null,`完成度`,-1),m(`span`,null,d(s(W))+`%`,1)]),m(`div`,ct,[m(`i`,{style:f({width:s(W)+`%`})},null,4)])])],2)]),m(`div`,lt,[m(`div`,ut,[n[33]||=m(`span`,{class:`lbl`},`筛选`,-1),p(x,{modelValue:s(N),"onUpdate:modelValue":n[0]||=e=>h(N)?N.value=e:null,items:s(on),icon:`i-lucide-layers`,"aria-label":`按史诗筛选`},null,8,[`modelValue`,`items`]),p(x,{modelValue:s(P),"onUpdate:modelValue":n[1]||=e=>h(P)?P.value=e:null,items:s(sn),icon:`i-lucide-flag`,"aria-label":`按里程碑筛选`},null,8,[`modelValue`,`items`]),p(x,{modelValue:s(F),"onUpdate:modelValue":n[2]||=e=>h(F)?F.value=e:null,items:cn,icon:`i-lucide-arrow-up-down`,"aria-label":`排序方式`},null,8,[`modelValue`])]),m(`div`,dt,[m(`span`,ft,d(s(B).length),1),n[34]||=C(` 个故事 `,-1),n[35]||=m(`i`,{class:`sep`},null,-1),m(`span`,pt,d(s(Yt)(s(B).map(e=>e.id))),1),n[36]||=C(` 点 `,-1)])]),s(Q)?(u(),v(`div`,mt,[p(l,{name:`i-lucide-circle-alert`,class:`size-4`}),m(`span`,ht,d(s(Q)),1),m(`button`,{class:`btn btn-sm`,onClick:n[3]||=e=>Q.value=``},`知道了`)])):y(``,!0),m(`div`,gt,[m(`div`,_t,[(u(!0),v(g,null,c(s(O),e=>(u(),v(`section`,{key:e,class:b([`lane`,{folded:z(e)}])},[z(e)?(u(),v(`button`,{key:0,class:`lane-stub`,title:`展开${s(A)[e]}:${V(e).length} 个 · ${H(e)} 点`,onClick:t=>fn(e)},[m(`i`,{class:`lane-dot`,style:f({background:s($t)[e]})},null,4),m(`span`,yt,d(s(A)[e]),1),m(`span`,bt,d(V(e).length),1),m(`span`,xt,d(H(e))+` 点`,1),p(l,{name:`i-lucide-chevrons-right`,class:`stub-ic`})],8,vt)):(u(),v(g,{key:1},[m(`header`,St,[m(`i`,{class:`lane-dot`,style:f({background:s($t)[e]})},null,4),m(`b`,null,d(s(A)[e]),1),m(`span`,Ct,d(V(e).length),1),m(`span`,wt,d(H(e))+` 点`,1),un(e)?(u(),v(`button`,{key:0,class:`lane-fold`,"aria-expanded":!z(e),title:`收起${s(A)[e]}`,onClick:t=>fn(e)},[p(l,{name:`i-lucide-chevron-left`,class:`size-3`})],8,Tt)):y(``,!0)]),m(`div`,Et,[(u(!0),v(g,null,c(V(e),t=>(u(),re(E,{key:t.id,to:`/story/${t.id}`,class:b([`scard`,{"scard-compact":dn(e)}])},{default:_(()=>[dn(e)?(u(),v(g,{key:0},[m(`span`,Dt,d(t.id),1),m(`span`,Ot,d(t.points)+` 点`,1),m(`span`,{class:`sc-c-title`,title:t.title},d(t.title),9,kt)],64)):(u(),v(g,{key:1},[m(`div`,At,[m(`span`,jt,d(t.id),1),m(`span`,{class:b([`tag`,`tag-${s(rn)[t.priority]}`])},d(t.priority),3),m(`span`,Mt,`WSJF `+d(s(M)(t)),1),t.blocked?(u(),v(`span`,{key:0,class:`tag tag-error tag-dot`,title:`阻塞中:${t.blocked.reason}(自 ${t.blocked.since})`},`阻塞`,8,Nt)):y(``,!0)]),m(`p`,Pt,d(t.title),1),m(`div`,Ft,[m(`span`,null,d(t.points)+` 点`,1),n[37]||=m(`span`,{class:`dim`},`·`,-1),m(`span`,null,`任务 `+d(s(k)(t).done)+`/`+d(s(k)(t).total),1)]),m(`div`,It,[m(`span`,{class:b([`tag`,`tag-${s(tn)[t.type]}`])},[p(l,{name:s(nn)[t.type],class:`size-3`},null,8,[`name`]),C(d(s(en)[t.type]),1)],2),m(`span`,Lt,d(t.epicId),1),t.sprintId?(u(),v(`span`,Rt,d(t.sprintId),1)):y(``,!0),(u(!0),v(g,null,c(Cn(t.id),e=>(u(),v(`span`,{key:e.id,class:`tag tag-mint`,title:`${e.id} ${e.title} · ${e.criteria}`},`MVP`,8,zt))),128)),t.scopeChange?(u(),v(`span`,{key:1,class:`tag tag-info`,title:`${s(j)[t.scopeChange.kind]}(${t.scopeChange.at}):${t.scopeChange.reason}`},d(s(j)[t.scopeChange.kind]),9,Bt)):y(``,!0)]),m(`div`,Vt,[m(`i`,{style:f({width:s(k)(t).pct+`%`})},null,4)]),m(`div`,{class:`sc-actions`,style:{backdropFilter:`blur(10px) saturate(125%)`},onMouseleave:n[6]||=e=>Z.value=``},[s(Z)===t.id?(u(),v(g,{key:0},[m(`span`,Ht,`取消 `+d(t.id)+`?`,1),m(`span`,{class:`sc-act danger`,role:`button`,tabindex:`0`,"data-act":`cancel-confirm`,"aria-label":`确认取消 ${t.id}`,onClick:w(e=>$(t,`cancel`),[`stop`,`prevent`]),onKeydown:T(w(e=>$(t,`cancel`),[`prevent`]),[`enter`])},`确认`,40,Ut),m(`span`,{class:`sc-act`,role:`button`,tabindex:`0`,"data-act":`cancel-abort`,onClick:n[4]||=w(e=>Z.value=``,[`stop`,`prevent`]),onKeydown:n[5]||=T(w(e=>Z.value=``,[`prevent`]),[`enter`])},`返回`,32)],64)):(u(),v(g,{key:1},[bn(t)?(u(),re(S,{key:0,text:`退回「${s(A)[q(t.status)??``]}」`,"delay-duration":150,ui:Y},{default:_(()=>[m(`span`,{class:`sc-act`,role:`button`,tabindex:`0`,"data-act":`prev`,"aria-label":`退回 ${t.id}`,onClick:w(e=>$(t,`prev`),[`stop`,`prevent`]),onKeydown:T(w(e=>$(t,`prev`),[`prevent`]),[`enter`])},[p(l,{name:`i-lucide-arrow-left`,class:`size-3.5`})],40,Wt)]),_:2},1032,[`text`])):y(``,!0),p(S,{text:yn(t),"delay-duration":150,ui:Y},{default:_(()=>[m(`span`,{class:b([`sc-act`,{off:!vn(t)}]),role:`button`,tabindex:`0`,"data-act":`next`,"aria-label":`推进 ${t.id}`,onClick:w(e=>$(t,`next`),[`stop`,`prevent`]),onKeydown:T(w(e=>$(t,`next`),[`prevent`]),[`enter`])},[p(l,{name:`i-lucide-arrow-right`,class:`size-3.5`})],42,Gt)]),_:2},1032,[`text`]),p(S,{text:`标记 ${t.id} 已取消`,"delay-duration":150,ui:Y},{default:_(()=>[m(`span`,{class:`sc-act danger`,role:`button`,tabindex:`0`,"data-act":`cancel`,"aria-label":`取消 ${t.id}`,onClick:w(e=>Z.value=t.id,[`stop`,`prevent`]),onKeydown:T(w(e=>Z.value=t.id,[`prevent`]),[`enter`])},[p(l,{name:`i-lucide-x`,class:`size-3.5`})],40,Kt)]),_:2},1032,[`text`])],64))],32)],64))]),_:2},1032,[`to`,`class`]))),128)),V(e).length?y(``,!0):(u(),v(`p`,qt,`暂无故事`))])],64))],2))),128))])])])}}}),[[`__scopeId`,`data-v-3d44e42e`]]);export{D as default};
@@ -1 +1 @@
1
- {"id":"2218461a-f45b-41d6-ae44-b0d2332a9511","timestamp":1793447291754}
1
+ {"id":"08bebe14-0f1b-4d2a-8de4-e84e122d10e9","timestamp":1793514373522}
@@ -0,0 +1 @@
1
+ {"id":"08bebe14-0f1b-4d2a-8de4-e84e122d10e9","timestamp":1793514373522,"prerendered":[]}
@@ -0,0 +1 @@
1
+ .kpi .v.bad[data-v-d8ba9a67]{color:var(--rose)}.kpi .v.good[data-v-d8ba9a67]{color:var(--green)}.panel[data-v-d8ba9a67]{border-radius:var(--r-xl);margin-bottom:12px;overflow:hidden}.panel-hd[data-v-d8ba9a67]{border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:14px;padding:14px 16px;display:flex}.sp-name[data-v-d8ba9a67]{letter-spacing:-.015em;font-size:15px;font-weight:660}.ph-l .sub[data-v-d8ba9a67]{margin-top:3px;font-size:11.2px}.goal[data-v-d8ba9a67]{color:var(--ink-2);max-width:80ch;margin-top:7px;font-size:12px;line-height:1.55}.bd-select[data-v-d8ba9a67]{max-width:300px}.chart-wrap[data-v-d8ba9a67]{padding:10px 16px 0;position:relative}.chart-legend[data-v-d8ba9a67]{color:var(--ink-3);gap:12px;margin-bottom:2px;font-size:10.8px;display:flex}.lg[data-v-d8ba9a67]{align-items:center;gap:5px;display:inline-flex}.sw[data-v-d8ba9a67]{border-radius:999px;width:14px;height:3px;display:inline-block}.sw.actual[data-v-d8ba9a67]{background:var(--grad)}.sw.ideal[data-v-d8ba9a67]{background:repeating-linear-gradient(90deg,#cdc9d8 0 4px,#0000 0 7px)}.sw.scope[data-v-d8ba9a67]{background:#3f7fd4;width:2px;height:11px}.chart[data-v-d8ba9a67]{width:100%;max-width:980px;display:block}.cells[data-v-d8ba9a67]{gap:5px;padding:10px 16px 2px;display:flex;overflow-x:auto}.cell[data-v-d8ba9a67]{background:var(--sunken-2);border:1px solid var(--line);border-radius:10px;flex:1 1 0;grid-template-columns:1fr auto;gap:0 5px;min-width:62px;padding:6px 8px 8px;display:grid;position:relative;overflow:hidden}.cell.today[data-v-d8ba9a67]{background:#fdf1ef;border-color:#f3cec6}.cell.future[data-v-d8ba9a67]{opacity:.62}.cell.scope[data-v-d8ba9a67]{background:#eff5fd;border-color:#d5e6fa}.cd[data-v-d8ba9a67]{color:var(--ink-4);grid-column:1/-1;font-size:9.6px}.ca[data-v-d8ba9a67]{letter-spacing:-.02em;font-size:12.4px;font-weight:680}.ci[data-v-d8ba9a67]{align-self:center;font-size:10.2px}.underline[data-v-d8ba9a67]{background:var(--grad);height:2px;position:absolute;bottom:0;left:0}.foot[data-v-d8ba9a67]{margin-top:7px;padding:0 16px;font-size:10.6px}.scope[data-v-d8ba9a67]{border-top:1px dashed var(--line-2);margin:12px 16px 16px;padding:12px 0 0}.scope ul[data-v-d8ba9a67]{gap:6px;margin:8px 0 0;padding:0;font-size:11.8px;list-style:none;display:grid}.scope li[data-v-d8ba9a67]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.scope .foot[data-v-d8ba9a67]{margin-top:8px;padding:0}.link[data-v-d8ba9a67]{font-weight:640}.link[data-v-d8ba9a67]:hover{color:var(--violet-ink)}.tip[data-v-d8ba9a67]{margin-left:auto;font-size:10.8px}
@@ -0,0 +1 @@
1
+ .diagrams-page>.callout[data-v-29e559e1]{margin-bottom:12px}.diagrams-page[data-v-29e559e1]{flex-direction:column;height:calc(100vh - 112px);min-height:480px;display:flex}.dg-layout[data-v-29e559e1]{flex:1;grid-template-rows:minmax(0,1fr);grid-template-columns:272px minmax(0,1fr);gap:0;min-height:0;display:grid}.dg-list[data-v-29e559e1]{border-right:1px solid var(--line);flex-direction:column;min-height:0;padding:2px 0 6px 2px;display:flex;overflow:hidden}.dg-head[data-v-29e559e1]{align-items:baseline;gap:7px;padding:2px 12px 8px 0;display:flex}.dg-title[data-v-29e559e1]{letter-spacing:-.015em;font-size:14px;font-weight:680}.dg-total[data-v-29e559e1]{color:var(--ink-4);font-size:10.5px}.dg-head-link[data-v-29e559e1]{margin-left:auto;font-size:11px}.dg-filter[data-v-29e559e1]{gap:6px;margin-bottom:8px;padding-right:12px;display:flex}.dg-filter .input[data-v-29e559e1]{box-sizing:border-box;background:var(--sunken);min-width:0;height:27px;color:var(--ink);border:1px solid #0000;border-radius:999px;outline:none;flex:1;padding:0 11px;font-family:inherit;font-size:11.4px;transition:background .14s,border-color .14s,box-shadow .14s}.dg-filter .input[data-v-29e559e1]::placeholder{color:var(--ink-4)}.dg-filter .input[data-v-29e559e1]:hover{background:#f1f1ec}.dg-filter .input[data-v-29e559e1]:focus,.dg-filter .input[data-v-29e559e1]:focus-visible{border-color:var(--violet-line);background:#fff;outline:none;box-shadow:0 0 0 3px #6d4ff024}.dg-filter .chip[data-v-29e559e1],.dot[data-v-29e559e1]{flex:none}.chip[data-v-29e559e1]{box-sizing:border-box;background:var(--sunken);height:27px;color:var(--ink-2);border:1px solid #0000;border-radius:999px;align-items:center;gap:5px;padding:0 9px;font-size:11px;display:inline-flex}.chip[data-v-29e559e1]:hover{background:var(--line)}.chip.on[data-v-29e559e1]{background:var(--violet-soft);border-color:var(--violet-line);color:var(--violet-ink);font-weight:650}.dot[data-v-29e559e1]{border-radius:999px;width:7px;height:7px}.dg-tree[data-v-29e559e1]{overscroll-behavior:contain;scrollbar-width:auto;scrollbar-color:auto;scrollbar-gutter:stable;flex:1;align-content:start;gap:4px;min-height:0;padding:0 12px 2px 0;display:grid;overflow-y:auto}.dg-tree[data-v-29e559e1]::-webkit-scrollbar{width:5px}.dg-tree[data-v-29e559e1]::-webkit-scrollbar-track{background:0 0;margin:4px 0}.dg-tree[data-v-29e559e1]::-webkit-scrollbar-thumb{background:#dedcd5;border:0;border-radius:999px;min-height:36px}.dg-tree[data-v-29e559e1]::-webkit-scrollbar-thumb:hover{background:#c9c6bd}.dg-tree[data-v-29e559e1]::-webkit-scrollbar-thumb:active{background:#b8b4a9}.dg-group-hd[data-v-29e559e1]{width:100%;color:var(--ink-2);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;align-items:center;gap:6px;padding:4px 6px 4px 3px;font-size:11.6px;font-weight:660;display:flex}.dg-group-hd[data-v-29e559e1]:hover{background:var(--sunken-2);color:var(--ink)}.dg-group-lb[data-v-29e559e1]{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.dg-group-n[data-v-29e559e1]{color:var(--ink-4);margin-left:auto;font-size:10px}.dg-chev[data-v-29e559e1]{width:13px;height:13px;color:var(--ink-4);flex:none;transition:transform .16s}.dg-chev.fold[data-v-29e559e1]{transform:rotate(-90deg)}.dg-items[data-v-29e559e1]{gap:1px;margin:1px 0 2px;padding:0 0 2px 15px;list-style:none;display:grid;position:relative}.dg-items[data-v-29e559e1]:before{content:"";background:var(--line-2);width:1px;position:absolute;top:1px;bottom:3px;left:5px}.dg-item[data-v-29e559e1]{cursor:pointer;border-radius:8px;align-items:flex-start;gap:7px;padding:5px 6px 5px 5px;transition:background .14s;display:flex;position:relative}.dg-item[data-v-29e559e1]:hover{background:var(--sunken-2)}.dg-item.on[data-v-29e559e1]:before{content:"";background:var(--violet);border-radius:2px;width:2px;position:absolute;top:2px;bottom:2px;left:-10px}.dg-ic[data-v-29e559e1]{width:14px;height:14px;color:var(--ink-4);flex:none;margin-top:1px}.dg-item:hover .dg-ic[data-v-29e559e1]{color:var(--ink-3)}.dg-item.on .dg-ic[data-v-29e559e1]{color:var(--violet)}.dg-name[data-v-29e559e1]{flex-direction:column;min-width:0;line-height:1.35;display:flex}.dg-name b[data-v-29e559e1]{color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:560;overflow:hidden}.dg-item:hover .dg-name b[data-v-29e559e1]{color:var(--ink)}.dg-item.on .dg-name b[data-v-29e559e1]{color:var(--violet-ink);font-weight:680}.dg-name small[data-v-29e559e1]{color:var(--ink-4);font-size:9.6px}.dg-item .tag[data-v-29e559e1]{flex:none;margin-left:auto}.dg-main[data-v-29e559e1]{flex-direction:column;min-width:0;min-height:0;padding:0 2px 10px 16px;display:flex;overflow:hidden}.dg-main-hd[data-v-29e559e1]{flex-wrap:wrap;align-items:center;gap:8px;padding:0 0 9px;display:flex}.dg-h2[data-v-29e559e1]{letter-spacing:-.02em;font-size:15px;font-weight:680}.dg-open[data-v-29e559e1]{margin-left:auto}.dg-frame[data-v-29e559e1]{border:1px solid var(--line);touch-action:none;-webkit-user-select:none;user-select:none;background:#fff;border-radius:10px;flex:1;width:100%;min-height:0;margin:0 0 10px;position:relative;overflow:hidden}.dg-frame.has-canvas[data-v-29e559e1]{cursor:grab}.dg-frame.dragging[data-v-29e559e1]{cursor:grabbing}.dg-frame iframe[data-v-29e559e1]{border:0;width:100%;height:100%;position:absolute;inset:0}.dg-canvas-img[data-v-29e559e1]{-webkit-user-drag:none;pointer-events:none;max-width:none;position:absolute}.dg-canvas-hint[data-v-29e559e1]{place-items:center;font-size:12px;display:grid;position:absolute;inset:0}.dg-zoom[data-v-29e559e1]{border:1px solid var(--line-2);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);opacity:.6;background:#ffffffeb;border-radius:999px;align-items:center;gap:2px;padding:3px;transition:opacity .15s;display:flex;position:absolute;bottom:10px;right:10px;box-shadow:0 6px 18px -10px #1c1b1973}.dg-frame:focus-within .dg-zoom[data-v-29e559e1],.dg-frame:hover .dg-zoom[data-v-29e559e1]{opacity:1}.dg-zbtn[data-v-29e559e1]{min-width:26px;height:22px;color:var(--ink-2);cursor:pointer;background:0 0;border:0;border-radius:999px;padding:0 7px;font-size:11px;line-height:22px}.dg-zbtn[data-v-29e559e1]:hover{background:var(--sunken-2);color:var(--violet-ink)}.dg-zval[data-v-29e559e1]{text-align:center;min-width:40px;color:var(--ink-3);font-size:10.5px}.dg-hint[data-v-29e559e1]{color:var(--ink-4);pointer-events:none;font-size:10px;position:absolute;bottom:14px;left:10px}.dg-meta[data-v-29e559e1]{color:var(--ink-2);flex-wrap:wrap;align-items:center;gap:6px 14px;margin:0 0 9px;font-size:11.8px;line-height:1.6;display:flex}.dg-meta>p[data-v-29e559e1]{flex:260px;min-width:0}.dg-tags[data-v-29e559e1]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.sep[data-v-29e559e1]{background:var(--line-2);width:1px;height:14px}.dl[data-v-29e559e1]{font-weight:620}.dl[data-v-29e559e1]:hover{color:var(--violet-ink)}.dg-path[data-v-29e559e1]{margin-left:auto;font-size:10.2px}.dg-meta button.dl[data-v-29e559e1]{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0;padding:0}.dg-meta button.dl[data-v-29e559e1]:disabled{color:var(--ink-4);cursor:progress}.dg-meta button.dl[data-v-29e559e1]:hover:not(:disabled){color:var(--violet-ink)}@media (width<=1080px){.diagrams-page[data-v-29e559e1]{height:auto;min-height:0;display:block}.dg-layout[data-v-29e559e1]{grid-template-rows:none;grid-template-columns:minmax(0,1fr)}.dg-list[data-v-29e559e1]{border-right:0;border-bottom:1px solid var(--line);padding:2px 0 8px;display:block;overflow:visible}.dg-tree[data-v-29e559e1]{scrollbar-width:thin;scrollbar-color:#dcdad4 transparent;overflow-y:visible}.dg-main[data-v-29e559e1]{padding:12px 2px 8px 0;overflow:visible}.dg-frame[data-v-29e559e1]{min-height:0;aspect-ratio:var(--dg-ratio,3/2);flex:none;margin-bottom:0}.dg-items[data-v-29e559e1]{max-height:none}}