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{a as e,i as t,o as n,r,s as i}from"#entry";import{t as a}from"./DJM7u8P3.js";import{t as o}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,i as h,lt as g,m as _,p as v,qt as y,u as b,y as x}from"./BxuBMtk_.js";var ee={class:`kpis`},te={class:`v`},S={class:`v`},C={class:`v`},w={class:`v`},T={class:`v`},E={class:`grid`},D={class:`hero`},O={class:`hero-top`},k={class:`tag tag-ghost`},A={class:`tag tag-neutral`},j={key:0,class:`tag tag-error`},M={key:1,class:`tag tag-warning`},N={class:`hero-pct`},P={class:`epic-title`},F={class:`goal`},I={class:`bar ink hero-bar`},L={class:`hero-foot`},ne={class:`bd`},R={class:`h3`},z={key:0,class:`dim empty`},B={class:`kr-top`},V={class:`kr-text`},H={class:`kr-num mono`},U={class:`h3 stories-hd`},W={class:`stlist`},G={class:`st-id mono`},K={class:`st-title`},q={class:`st-pts dim`},J={class:`st-state dim`},Y=t(l({__name:`epics`,setup(t){let{epics:l,storyById:Y,STATE_LABEL:X,STATE_DOT:Z,TYPE_LABEL:re,TYPE_COLOR:ie,TYPE_ICON:ae,PRIORITY_COLOR:oe}=i(),se={draft:`neutral`,active:`primary`,done:`success`,cancelled:`error`},ce={draft:`草稿`,active:`进行中`,done:`已完成`,cancelled:`已取消`},Q=b(()=>l.value.map(e=>{let t=(e.stories??[]).map(e=>Y.value.get(e)).filter(Boolean),n=t.filter(e=>e.status===`done`),r=t.reduce((e,t)=>e+t.points,0),i=n.reduce((e,t)=>e+t.points,0),a=(e.keyResults??[]).map(e=>{let t=e.target>0?Math.min(100,Math.round((e.current??0)/e.target*100)):(e.current??0)<=0?100:0;return{...e,pct:t,ok:t>=100}});return{...e,list:t,done:n,points:r,donePoints:i,pct:r?Math.round(i/r*100):0,krs:a,krOk:a.filter(e=>e.ok).length,blocked:t.filter(e=>e.blocked),bugs:t.filter(e=>e.type===`bug`)}})),$=b(()=>({epics:Q.value.length,stories:Q.value.reduce((e,t)=>e+t.list.length,0),points:Q.value.reduce((e,t)=>e+t.points,0),donePoints:Q.value.reduce((e,t)=>e+t.donePoints,0),kr:Q.value.reduce((e,t)=>e+t.krs.length,0),krOk:Q.value.reduce((e,t)=>e+t.krOk,0),blocked:Q.value.reduce((e,t)=>e+t.blocked.length,0)}));return(t,i)=>{let l=r,b=a,Y=o;return u(),_(`div`,null,[m(`div`,ee,[m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(0)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(0),size:`sm`},null,8,[`tone`]),i[1]||=m(`p`,{class:`k`},`史诗`,-1),m(`p`,te,[x(d(s($).epics),1),i[0]||=m(`small`,null,`个`,-1)])],2),m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(1)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(1),size:`sm`},null,8,[`tone`]),i[2]||=m(`p`,{class:`k`},`关键结果达成`,-1),m(`p`,S,[x(d(s($).krOk),1),m(`small`,null,`/ `+d(s($).kr),1)])],2),m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(2)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(2),size:`sm`},null,8,[`tone`]),i[3]||=m(`p`,{class:`k`},`故事点交付`,-1),m(`p`,C,[x(d(s($).donePoints),1),m(`small`,null,`/ `+d(s($).points),1)])],2),m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(3)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(3),size:`sm`},null,8,[`tone`]),i[5]||=m(`p`,{class:`k`},`覆盖故事`,-1),m(`p`,w,[x(d(s($).stories),1),i[4]||=m(`small`,null,`个`,-1)])],2),m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(4)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(4),size:`sm`},null,8,[`tone`]),i[7]||=m(`p`,{class:`k`},`阻塞`,-1),m(`p`,T,[x(d(s($).blocked),1),i[6]||=m(`small`,null,`个故事`,-1)])],2)]),m(`div`,E,[(u(!0),_(h,null,c(s(Q),e=>(u(),_(`article`,{key:e.id,class:`card epic`},[m(`div`,D,[m(`div`,O,[m(`span`,k,d(e.id),1),m(`span`,{class:y([`tag`,`tag-${se[e.status]}`])},d(ce[e.status]),3),m(`span`,A,d(e.list.length)+` 个故事`,1),e.bugs.length?(u(),_(`span`,j,[p(b,{name:`i-lucide-bug`,class:`size-3`}),x(d(e.bugs.length),1)])):v(``,!0),e.blocked.length?(u(),_(`span`,M,[p(b,{name:`i-lucide-octagon-alert`,class:`size-3`}),x(d(e.blocked.length),1)])):v(``,!0),m(`span`,N,[x(d(e.pct),1),i[8]||=m(`small`,null,`%`,-1)])]),m(`h2`,P,d(e.title),1),m(`p`,F,d(e.goal),1),m(`div`,I,[m(`i`,{style:f({width:e.pct+`%`})},null,4)]),m(`div`,L,[m(`span`,null,[m(`b`,null,d(e.donePoints),1),x(`/`+d(e.points)+` 点`,1)]),i[9]||=m(`i`,{class:`sep`},null,-1),m(`span`,null,`关键结果 `+d(e.krOk)+`/`+d(e.krs.length)+` 达成`,1),i[10]||=m(`i`,{class:`sep`},null,-1),m(`span`,null,d(e.done.length)+`/`+d(e.list.length)+` 个故事完成`,1)])]),m(`div`,ne,[m(`p`,R,[p(b,{name:`i-lucide-target`,class:`size-3`}),i[11]||=x(`关键结果`,-1)]),e.krs.length?v(``,!0):(u(),_(`p`,z,`这个史诗还没写 keyResults。`)),(u(!0),_(h,null,c(e.krs,e=>(u(),_(`div`,{key:e.id,class:`kr`},[m(`div`,B,[m(`span`,V,d(e.text),1),m(`span`,H,d(e.current??`—`)+` / `+d(e.target)+` `+d(e.unit??``),1),m(`span`,{class:y([`tag`,e.ok?`tag-success`:`tag-warning`])},d(e.pct)+`%`,3)]),m(`div`,{class:y([`bar slim`,e.ok?`mint`:`lilac`])},[m(`i`,{style:f({width:e.pct+`%`})},null,4)],2)]))),128)),m(`p`,U,[p(b,{name:`i-lucide-list-checks`,class:`size-3`}),i[12]||=x(`故事`,-1)]),m(`ul`,W,[(u(!0),_(h,null,c(e.list,e=>(u(),_(`li`,{key:e.id},[p(Y,{to:`/story/${e.id}`,class:`strow`},{default:g(()=>[m(`i`,{class:`sdot`,style:f({background:s(Z)[e.status]})},null,4),m(`span`,G,d(e.id),1),m(`span`,K,d(e.title),1),m(`span`,{class:y([`tag`,`tag-${s(ie)[e.type]}`])},[p(b,{name:s(ae)[e.type],class:`size-3`},null,8,[`name`]),x(d(s(re)[e.type]),1)],2),m(`span`,{class:y([`tag`,`tag-${s(oe)[e.priority]}`])},d(e.priority),3),m(`span`,q,d(e.points)+` 点`,1),m(`span`,J,d(s(X)[e.status]),1),p(b,{name:`i-lucide-chevron-right`,class:`st-chev`})]),_:2},1032,[`to`])]))),128))])])]))),128))])])}}}),[[`__scopeId`,`data-v-6cff08c9`]]);export{Y as default};
1
+ import{a as e,i as t,o as n,r,s as i}from"#entry";import{t as a}from"./DJM7u8P3.js";import{t as o}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,i as h,lt as g,m as _,p as v,qt as y,u as b,y as x}from"./BxuBMtk_.js";var ee={class:`kpis`},te={class:`v`},S={class:`v`},C={class:`v`},w={class:`v`},T={class:`v`},E={class:`grid`},D={class:`hero`},O={class:`hero-top`},k={class:`tag tag-ghost`},A={class:`tag tag-neutral`},j={key:0,class:`tag tag-error`},M={key:1,class:`tag tag-warning`},N={class:`hero-pct`},P={class:`epic-title`},F={class:`goal`},I={class:`bar ink hero-bar`},L={class:`hero-foot`},ne={class:`bd`},R={class:`h3`},z={key:0,class:`dim empty`},B={class:`kr-top`},V={class:`kr-text`},H={class:`kr-num mono`},U={class:`h3 stories-hd`},W={class:`stlist`},G={class:`st-id mono`},K={class:`st-title`},q={class:`st-pts dim`},J={class:`st-state dim`},Y=t(l({__name:`epics`,setup(t){let{epics:l,storyById:Y,STATE_LABEL:X,STATE_DOT:Z,TYPE_LABEL:re,TYPE_COLOR:ie,TYPE_ICON:ae,PRIORITY_COLOR:oe}=i(),se={draft:`neutral`,active:`primary`,done:`success`,cancelled:`error`},ce={draft:`草稿`,active:`进行中`,done:`已完成`,cancelled:`已取消`},Q=b(()=>l.value.map(e=>{let t=(e.stories??[]).map(e=>Y.value.get(e)).filter(Boolean),n=t.filter(e=>e.status===`done`),r=t.reduce((e,t)=>e+t.points,0),i=n.reduce((e,t)=>e+t.points,0),a=(e.keyResults??[]).map(e=>{let t=e.target>0?Math.min(100,Math.round((e.current??0)/e.target*100)):(e.current??0)<=0?100:0;return{...e,pct:t,ok:t>=100}});return{...e,list:t,done:n,points:r,donePoints:i,pct:r?Math.round(i/r*100):0,krs:a,krOk:a.filter(e=>e.ok).length,blocked:t.filter(e=>e.blocked),bugs:t.filter(e=>e.type===`bug`)}})),$=b(()=>({epics:Q.value.length,stories:Q.value.reduce((e,t)=>e+t.list.length,0),points:Q.value.reduce((e,t)=>e+t.points,0),donePoints:Q.value.reduce((e,t)=>e+t.donePoints,0),kr:Q.value.reduce((e,t)=>e+t.krs.length,0),krOk:Q.value.reduce((e,t)=>e+t.krOk,0),blocked:Q.value.reduce((e,t)=>e+t.blocked.length,0)}));return(t,i)=>{let l=r,b=a,Y=o;return u(),_(`div`,null,[m(`div`,ee,[m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(0)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(0),size:`sm`},null,8,[`tone`]),i[1]||=m(`p`,{class:`k`},`史诗`,-1),m(`p`,te,[x(d(s($).epics),1),i[0]||=m(`small`,null,`个`,-1)])],2),m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(1)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(1),size:`sm`},null,8,[`tone`]),i[2]||=m(`p`,{class:`k`},`关键结果达成`,-1),m(`p`,S,[x(d(s($).krOk),1),m(`small`,null,`/ `+d(s($).kr),1)])],2),m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(2)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(2),size:`sm`},null,8,[`tone`]),i[3]||=m(`p`,{class:`k`},`故事点交付`,-1),m(`p`,C,[x(d(s($).donePoints),1),m(`small`,null,`/ `+d(s($).points),1)])],2),m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(3)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(3),size:`sm`},null,8,[`tone`]),i[5]||=m(`p`,{class:`k`},`覆盖故事`,-1),m(`p`,w,[x(d(s($).stories),1),i[4]||=m(`small`,null,`个`,-1)])],2),m(`div`,{class:y([`kpi`,(`cardToneClass`in t?t.cardToneClass:s(n))(4)])},[p(l,{tone:(`cardTone`in t?t.cardTone:s(e))(4),size:`sm`},null,8,[`tone`]),i[7]||=m(`p`,{class:`k`},`阻塞`,-1),m(`p`,T,[x(d(s($).blocked),1),i[6]||=m(`small`,null,`个故事`,-1)])],2)]),m(`div`,E,[(u(!0),_(h,null,c(s(Q),e=>(u(),_(`article`,{key:e.id,class:`card epic`},[m(`div`,D,[m(`div`,O,[m(`span`,k,d(e.id),1),m(`span`,{class:y([`tag`,`tag-${se[e.status]}`])},d(ce[e.status]),3),m(`span`,A,d(e.list.length)+` 个故事`,1),e.bugs.length?(u(),_(`span`,j,[p(b,{name:`i-lucide-bug`,class:`size-3`}),x(d(e.bugs.length),1)])):v(``,!0),e.blocked.length?(u(),_(`span`,M,[p(b,{name:`i-lucide-octagon-alert`,class:`size-3`}),x(d(e.blocked.length),1)])):v(``,!0),m(`span`,N,[x(d(e.pct),1),i[8]||=m(`small`,null,`%`,-1)])]),m(`h2`,P,d(e.title),1),m(`p`,F,d(e.goal),1),m(`div`,I,[m(`i`,{style:f({width:e.pct+`%`})},null,4)]),m(`div`,L,[m(`span`,null,[m(`b`,null,d(e.donePoints),1),x(`/`+d(e.points)+` 点`,1)]),i[9]||=m(`i`,{class:`sep`},null,-1),m(`span`,null,`关键结果 `+d(e.krOk)+`/`+d(e.krs.length)+` 达成`,1),i[10]||=m(`i`,{class:`sep`},null,-1),m(`span`,null,d(e.done.length)+`/`+d(e.list.length)+` 个故事完成`,1)])]),m(`div`,ne,[m(`p`,R,[p(b,{name:`i-lucide-target`,class:`size-3`}),i[11]||=x(`关键结果`,-1)]),e.krs.length?v(``,!0):(u(),_(`p`,z,`这个史诗还没写 keyResults。`)),(u(!0),_(h,null,c(e.krs,e=>(u(),_(`div`,{key:e.id,class:`kr`},[m(`div`,B,[m(`span`,V,d(e.text),1),m(`span`,H,d(e.current??`—`)+` / `+d(e.target)+` `+d(e.unit??``),1),m(`span`,{class:y([`tag`,e.ok?`tag-success`:`tag-warning`])},d(e.pct)+`%`,3)]),m(`div`,{class:y([`bar slim`,e.ok?`mint`:`lilac`])},[m(`i`,{style:f({width:e.pct+`%`})},null,4)],2)]))),128)),m(`p`,U,[p(b,{name:`i-lucide-list-checks`,class:`size-3`}),i[12]||=x(`故事`,-1)]),m(`ul`,W,[(u(!0),_(h,null,c(e.list,e=>(u(),_(`li`,{key:e.id},[p(Y,{to:`/story/${e.id}`,class:`strow`},{default:g(()=>[m(`i`,{class:`sdot`,style:f({background:s(Z)[e.status]})},null,4),m(`span`,G,d(e.id),1),m(`span`,K,d(e.title),1),m(`span`,{class:y([`tag`,`tag-${s(ie)[e.type]}`])},[p(b,{name:s(ae)[e.type],class:`size-3`},null,8,[`name`]),x(d(s(re)[e.type]),1)],2),m(`span`,{class:y([`tag`,`tag-${s(oe)[e.priority]}`])},d(e.priority),3),m(`span`,q,d(e.points)+` 点`,1),m(`span`,J,d(s(X)[e.status]),1),p(b,{name:`i-lucide-chevron-right`,class:`st-chev`})]),_:2},1032,[`to`])]))),128))])])]))),128))])])}}}),[[`__scopeId`,`data-v-4bf98db6`]]);export{Y as default};
@@ -1 +1 @@
1
- import{t as e}from"./DJM7u8P3.js";import{t}from"./CI0scS-N.js";import{i as ee,s as n,t as r}from"#entry";import{At as i,K as a,S as o,U as s,Xt as c,Yt as l,b as u,d,f,i as p,lt as m,m as h,p as g,qt as _,u as v,y}from"./BxuBMtk_.js";var te={class:`card hero`},ne={class:`chips`},re={class:`tag tag-ghost`},ie=[`title`],ae=[`title`],oe={class:`tag tag-neutral`},se={key:3,class:`tag tag-primary mono`},ce=[`title`],le={class:`story-title`},ue={class:`narrative`},de={class:`facts`},fe={class:`fact`},pe={class:`fact`},me={class:`fact`},he={class:`fact`},ge={class:`fact`},b={class:`mono`},x={class:`fact`},S={class:`mono`},C={class:`dim`},w={class:`fact`},T={class:`mono`},E={key:0,class:`fact`},D={class:`hero-foot`},O={class:`dim`},k={class:`bar`},A={class:`cols`},j={key:0,class:`card block`},M={class:`card-hd`},N={class:`h2`},P={class:`card-bd bug`},F={class:`steps`},I={key:1,class:`card block`},L={class:`card-hd`},_e={class:`h2`},ve={class:`card-bd`},ye={key:0,class:`callout`},be={key:1,class:`dep-row`},xe={key:2,class:`dep-row`},Se={class:`card block`},Ce={class:`card-hd`},we={class:`h2`},Te={class:`tag tag-neutral`},Ee={class:`card-bd`},De={key:0,class:`ac`},Oe={class:`ac-row`},ke={class:`ac-row`},Ae={class:`ac-row`},je={key:0,class:`ac-row verify`},Me={key:1,class:`dim`},Ne={key:0,class:`card block`},Pe={class:`card-hd`},Fe={class:`h2`},Ie={class:`tag tag-neutral`},Le={class:`card-bd dg-links`},Re={class:`tag tag-neutral`},ze={key:0,class:`tag tag-warning`},Be={class:`mono dim`},Ve={class:`card-hd task-hd`},He={class:`tag tag-ghost`},Ue={class:`tag tag-neutral`},We={class:`task-title`},Ge={class:`dim entries-ct`},Ke={key:0,class:`files mono dim`},qe={class:`card-bd`},Je={key:0,class:`entries`},Ye={class:`entry-hd`},Xe={class:`date mono dim`},Ze={class:`tag tag-neutral mono result`},Qe={class:`note`},$e={key:0,class:`cmd mono`},et={key:1,class:`efiles dim mono`},tt={key:1,class:`dim`},nt={class:`pager`},rt={class:`pg-k`},it={class:`pg-t`},at={key:1,class:`pg-empty`},ot={class:`pg-k`},st={class:`pg-t`},ct={key:1,class:`callout warn`},R=ee(o({__name:`[id]`,setup(ee){let o=r(),{storyById:R,stories:z,epicById:lt,sprintById:ut,journalByTask:dt,actualRange:B,progress:V,milestoneOfStory:ft,STATE_LABEL:pt,STATE_COLOR:mt,TASK_LABEL:ht,TASK_COLOR:gt,KIND_LABEL:_t,MS_LABEL:vt,md:H,diffDays:yt,wsjf:bt,dependentsOf:U,TYPE_LABEL:xt,TYPE_COLOR:St,TYPE_ICON:Ct,PRIORITY_COLOR:wt,SEVERITY_LABEL:W,SEVERITY_COLOR:G,SCOPE_LABEL:K,storyDiagrams:q,staleDiagrams:J,DIAGRAM_KIND_LABEL:Tt,DIAGRAM_KIND_ICON:Et,DIAGRAM_KIND_DOT:Dt}=n(),Y=v(()=>R.value.get(String(o.value?.params?.id))),X=v(()=>z.value.findIndex(e=>e.id===Y.value?.id)),Z=v(()=>X.value>0?z.value[X.value-1]:null),Q=v(()=>X.value>=0&&X.value<z.value.length-1?z.value[X.value+1]:null),$=e=>dt.value.get(e)?.entries??[],Ot={red:`RED 失败测试`,green:`GREEN 让测试通过`,refactor:`REFACTOR 重构`},kt={red:`tag-error`,green:`tag-success`,refactor:`tag-primary`};return(ee,n)=>{let r=e,o=t;return s(),h(`div`,null,[i(Y)?(s(),h(p,{key:0},[u(o,{to:`/`,class:`btn btn-quiet btn-sm back`},{default:m(()=>[u(r,{name:`i-lucide-arrow-left`,class:`size-3.5`}),n[0]||=y(`返回看板 `,-1)]),_:1}),d(`article`,te,[d(`div`,ne,[d(`span`,re,c(i(Y).id),1),d(`span`,{class:_([`tag`,`tag-${i(mt)[i(Y).status]}`])},c(i(pt)[i(Y).status]??i(Y).status),3),d(`span`,{class:_([`tag`,`tag-${i(St)[i(Y).type]}`])},[u(r,{name:i(Ct)[i(Y).type],class:`size-3`},null,8,[`name`]),y(c(i(xt)[i(Y).type]),1)],2),d(`span`,{class:_([`tag`,`tag-${i(wt)[i(Y).priority]}`])},c(i(Y).priority),3),i(Y).bug?(s(),h(`span`,{key:0,class:_([`tag`,`tag-${i(G)[i(Y).bug.severity]}`])},[u(r,{name:`i-lucide-bug`,class:`size-3`}),y(c(i(W)[i(Y).bug.severity]),1)],2)):g(``,!0),i(Y).blocked?(s(),h(`span`,{key:1,class:`tag tag-error tag-dot`,title:i(Y).blocked.reason},`阻塞`,8,ie)):g(``,!0),i(Y).scopeChange?(s(),h(`span`,{key:2,class:`tag tag-info`,title:`${i(K)[i(Y).scopeChange.kind]}(${i(Y).scopeChange.at}):${i(Y).scopeChange.reason}`},c(i(K)[i(Y).scopeChange.kind])+` · `+c(i(Y).scopeChange.at),9,ae)):g(``,!0),d(`span`,oe,[u(r,{name:`i-lucide-layers`,class:`size-3`}),y(c(i(Y).epicId)+` `+c(i(lt).get(i(Y).epicId)?.title),1)]),i(Y).sprintId?(s(),h(`span`,se,[u(r,{name:`i-lucide-calendar-range`,class:`size-3`}),y(c(i(Y).sprintId),1)])):g(``,!0),(s(!0),h(p,null,a(i(ft)(i(Y).id),e=>(s(),h(`span`,{key:e.id,class:_([`tag`,e.kind===`mvp`?`tag-mint`:`tag-neutral`]),title:`${e.id} · ${e.criteria}`},c(i(_t)[e.kind])+` `+c(e.id)+` · `+c(i(vt)[e.status]),11,ce))),128))]),d(`h1`,le,c(i(Y).title),1),d(`p`,ue,c(i(Y).narrative),1),d(`div`,de,[d(`div`,fe,[n[1]||=d(`span`,{class:`k`},`点数`,-1),d(`b`,null,c(i(Y).points),1)]),d(`div`,pe,[n[2]||=d(`span`,{class:`k`},`价值`,-1),d(`b`,null,c(i(Y).value),1)]),d(`div`,me,[n[3]||=d(`span`,{class:`k`},`WSJF`,-1),d(`b`,null,c(i(bt)(i(Y))),1)]),d(`div`,he,[n[4]||=d(`span`,{class:`k`},`任务`,-1),d(`b`,null,c(i(V)(i(Y)).done)+`/`+c(i(V)(i(Y)).total),1)]),d(`div`,ge,[n[5]||=d(`span`,{class:`k`},`计划`,-1),d(`b`,b,c(i(Y).schedule?`${i(H)(i(Y).schedule.start)} ~ ${i(H)(i(Y).schedule.end)}`:`未排期`),1)]),d(`div`,x,[n[6]||=d(`span`,{class:`k`},`实际`,-1),d(`b`,S,[i(B)(i(Y))?(s(),h(p,{key:0},[y(c(i(H)(i(B)(i(Y)).start))+` ~ `+c(i(H)(i(B)(i(Y)).end))+` `,1),d(`small`,C,`(`+c(i(yt)(i(B)(i(Y)).start,i(B)(i(Y)).end)+1)+` 天)`,1)],64)):(s(),h(p,{key:1},[y(`—`)],64))])]),d(`div`,w,[n[7]||=d(`span`,{class:`k`},`创建`,-1),d(`b`,T,c(i(Y).created),1)]),i(Y).sprintId?(s(),h(`div`,E,[n[8]||=d(`span`,{class:`k`},`所属迭代`,-1),d(`b`,null,c(i(ut).get(i(Y).sprintId)?.name),1)])):g(``,!0)]),d(`div`,D,[d(`span`,O,`任务完成度 `+c(i(V)(i(Y)).pct)+`%`,1),d(`div`,k,[d(`i`,{style:l({width:i(V)(i(Y)).pct+`%`})},null,4)])])]),d(`div`,A,[i(Y).bug?(s(),h(`article`,j,[d(`div`,M,[d(`h2`,N,[u(r,{name:`i-lucide-bug`,class:`size-3.5`}),n[9]||=y(`缺陷详情`,-1)]),d(`span`,{class:_([`tag`,`tag-${i(G)[i(Y).bug.severity]}`])},c(i(W)[i(Y).bug.severity]),3)]),d(`div`,P,[d(`div`,null,[n[10]||=d(`span`,{class:`lbl`},`影响环境`,-1),d(`p`,null,c(i(Y).bug.environment),1)]),d(`div`,null,[n[11]||=d(`span`,{class:`lbl`},`复现步骤`,-1),d(`p`,F,c(i(Y).bug.steps),1)])])])):g(``,!0),i(Y).blocked||i(Y).dependsOn?.length||i(U)(i(Y).id).length?(s(),h(`article`,I,[d(`div`,L,[d(`h2`,_e,[u(r,{name:`i-lucide-git-branch`,class:`size-3.5`}),n[12]||=y(`依赖与阻塞`,-1)])]),d(`div`,ve,[i(Y).blocked?(s(),h(`div`,ye,[u(r,{name:`i-lucide-octagon-alert`,class:`size-4`}),d(`div`,null,[n[13]||=d(`b`,null,`当前被阻塞`,-1),d(`p`,null,c(i(Y).blocked.reason)+`(自 `+c(i(Y).blocked.since)+` 起)`,1)])])):g(``,!0),i(Y).dependsOn?.length?(s(),h(`div`,be,[n[14]||=d(`span`,{class:`lbl`},`依赖`,-1),(s(!0),h(p,null,a(i(Y).dependsOn,e=>(s(),f(o,{key:e,to:`/story/${e}`,class:`dep`},{default:m(()=>[u(r,{name:`i-lucide-arrow-left`,class:`size-3`}),y(c(e)+` `+c(i(R).get(e)?.title??``),1)]),_:2},1032,[`to`]))),128))])):g(``,!0),i(U)(i(Y).id).length?(s(),h(`div`,xe,[n[15]||=d(`span`,{class:`lbl`},`被依赖`,-1),(s(!0),h(p,null,a(i(U)(i(Y).id),e=>(s(),f(o,{key:e.id,to:`/story/${e.id}`,class:`dep ghost`},{default:m(()=>[y(c(e.id)+` `+c(e.title),1),u(r,{name:`i-lucide-arrow-right`,class:`size-3`})]),_:2},1032,[`to`]))),128))])):g(``,!0)])])):g(``,!0)]),d(`article`,Se,[d(`div`,Ce,[d(`h2`,we,[u(r,{name:`i-lucide-list-checks`,class:`size-3.5`}),n[16]||=y(`验收标准`,-1)]),d(`span`,Te,c(i(Y).acceptance?.length??0)+` 条`,1)]),d(`div`,Ee,[i(Y).acceptance?.length?(s(),h(`ol`,De,[(s(!0),h(p,null,a(i(Y).acceptance,(e,t)=>(s(),h(`li`,{key:t},[d(`div`,Oe,[n[17]||=d(`span`,{class:`tag tag-neutral gw`},`Given`,-1),d(`span`,null,c(e.given),1)]),d(`div`,ke,[n[18]||=d(`span`,{class:`tag tag-info gw`},`When`,-1),d(`span`,null,c(e.when),1)]),d(`div`,Ae,[n[19]||=d(`span`,{class:`tag tag-success gw`},`Then`,-1),d(`span`,null,c(e.then),1)]),e.verifyBy?.length?(s(),h(`div`,je,[n[20]||=d(`span`,{class:`dim`},`由谁验证`,-1),(s(!0),h(p,null,a(e.verifyBy,e=>(s(),h(`span`,{key:e,class:`tag tag-ghost`},c(e),1))),128))])):g(``,!0)]))),128))])):(s(),h(`p`,Me,`还没有验收标准(草稿阶段允许为空,进迭代前必须补)。`))])]),(i(q).get(i(Y).id)??[]).length?(s(),h(`article`,Ne,[d(`div`,Pe,[d(`h2`,Fe,[u(r,{name:`i-lucide-network`,class:`size-3.5`}),n[21]||=y(`架构图例`,-1)]),d(`span`,Ie,c((i(q).get(i(Y).id)??[]).length)+` 张`,1),n[22]||=d(`span`,{class:`dim tip`},`点开在看板里预览`,-1)]),d(`div`,Le,[(s(!0),h(p,null,a(i(q).get(i(Y).id),e=>(s(),f(o,{key:e.id,to:`/diagrams?focus=${e.id}`,class:`dg-link`},{default:m(()=>[u(r,{name:i(Et)[e.kind],class:`size-3.5`,style:l({color:i(Dt)[e.kind]})},null,8,[`name`,`style`]),d(`b`,null,c(e.title),1),d(`span`,Re,c(i(Tt)[e.kind]),1),i(J).has(e.id)?(s(),h(`span`,ze,`可能过期`)):g(``,!0),d(`span`,Be,c(e.id)+` · `+c(i(H)(e.updatedAt)),1)]),_:2},1032,[`to`]))),128))])])):g(``,!0),(s(!0),h(p,null,a(i(Y).tasks,e=>(s(),h(`article`,{key:e.id,class:`card block`},[d(`div`,Ve,[d(`span`,He,c(e.id),1),d(`span`,Ue,c(e.type),1),d(`span`,{class:_([`tag`,`tag-${i(gt)[e.status]}`])},c(i(ht)[e.status]),3),d(`b`,We,c(e.title),1),d(`span`,Ge,c($(e.id).length)+` 条记录`,1)]),e.files?.length?(s(),h(`p`,Ke,c(e.files.join(` · `)),1)):g(``,!0),d(`div`,qe,[$(e.id).length?(s(),h(`div`,Je,[(s(!0),h(p,null,a($(e.id),(e,t)=>(s(),h(`div`,{key:t,class:_([`entry`,e.phase])},[d(`div`,Ye,[d(`span`,{class:_([`tag`,kt[e.phase]])},c(Ot[e.phase]),3),d(`span`,Xe,c(i(H)(e.date)),1),d(`span`,Ze,c(e.result),1)]),d(`p`,Qe,c(e.note),1),e.testCommand?(s(),h(`p`,$e,[u(r,{name:`i-lucide-terminal`,class:`size-3`}),y(c(e.testCommand),1)])):g(``,!0),e.files?.length?(s(),h(`p`,et,c(e.files.join(`, `)),1)):g(``,!0)],2))),128))])):(s(),h(`p`,tt,`还没有实施记录(未开工)。`))])]))),128)),d(`div`,nt,[i(Z)?(s(),f(o,{key:0,to:`/story/${i(Z).id}`,class:`pg`},{default:m(()=>[d(`span`,rt,[u(r,{name:`i-lucide-arrow-left`,class:`size-3.5`}),n[23]||=y(`上一个`,-1)]),d(`span`,it,c(i(Z).id)+` `+c(i(Z).title),1)]),_:1},8,[`to`])):(s(),h(`span`,at)),i(Q)?(s(),f(o,{key:2,to:`/story/${i(Q).id}`,class:`pg right`},{default:m(()=>[d(`span`,ot,[n[24]||=y(`下一个`,-1),u(r,{name:`i-lucide-arrow-right`,class:`size-3.5`})]),d(`span`,st,c(i(Q).id)+` `+c(i(Q).title),1)]),_:1},8,[`to`])):g(``,!0)])],64)):(s(),h(`div`,ct,[u(r,{name:`i-lucide-search-x`,class:`size-4`}),n[25]||=y(`没找到这个故事,可能 id 写错了。 `,-1)]))])}}}),[[`__scopeId`,`data-v-8602d523`]]);export{R as default};
1
+ import{t as e}from"./DJM7u8P3.js";import{t}from"./CI0scS-N.js";import{i as ee,s as n,t as r}from"#entry";import{At as i,K as a,S as o,U as s,Xt as c,Yt as l,b as u,d,f,i as p,lt as m,m as h,p as g,qt as _,u as v,y}from"./BxuBMtk_.js";var te={class:`card hero`},ne={class:`chips`},re={class:`tag tag-ghost`},ie=[`title`],ae=[`title`],oe={class:`tag tag-neutral`},se={key:3,class:`tag tag-primary mono`},ce=[`title`],le={class:`story-title`},ue={class:`narrative`},de={class:`facts`},fe={class:`fact`},pe={class:`fact`},me={class:`fact`},he={class:`fact`},ge={class:`fact`},b={class:`mono`},x={class:`fact`},S={class:`mono`},C={class:`dim`},w={class:`fact`},T={class:`mono`},E={key:0,class:`fact`},D={class:`hero-foot`},O={class:`dim`},k={class:`bar`},A={class:`cols`},j={key:0,class:`card block`},M={class:`card-hd`},N={class:`h2`},P={class:`card-bd bug`},F={class:`steps`},I={key:1,class:`card block`},L={class:`card-hd`},_e={class:`h2`},ve={class:`card-bd`},ye={key:0,class:`callout`},be={key:1,class:`dep-row`},xe={key:2,class:`dep-row`},Se={class:`card block`},Ce={class:`card-hd`},we={class:`h2`},Te={class:`tag tag-neutral`},Ee={class:`card-bd`},De={key:0,class:`ac`},Oe={class:`ac-row`},ke={class:`ac-row`},Ae={class:`ac-row`},je={key:0,class:`ac-row verify`},Me={key:1,class:`dim`},Ne={key:0,class:`card block`},Pe={class:`card-hd`},Fe={class:`h2`},Ie={class:`tag tag-neutral`},Le={class:`card-bd dg-links`},Re={class:`tag tag-neutral`},ze={key:0,class:`tag tag-warning`},Be={class:`mono dim`},Ve={class:`card-hd task-hd`},He={class:`tag tag-ghost`},Ue={class:`tag tag-neutral`},We={class:`task-title`},Ge={class:`dim entries-ct`},Ke={key:0,class:`files mono dim`},qe={class:`card-bd`},Je={key:0,class:`entries`},Ye={class:`entry-hd`},Xe={class:`date mono dim`},Ze={class:`tag tag-neutral mono result`},Qe={class:`note`},$e={key:0,class:`cmd mono`},et={key:1,class:`efiles dim mono`},tt={key:1,class:`dim`},nt={class:`pager`},rt={class:`pg-k`},it={class:`pg-t`},at={key:1,class:`pg-empty`},ot={class:`pg-k`},st={class:`pg-t`},ct={key:1,class:`callout warn`},R=ee(o({__name:`[id]`,setup(ee){let o=r(),{storyById:R,stories:z,epicById:lt,sprintById:ut,journalByTask:dt,actualRange:B,progress:V,milestoneOfStory:ft,STATE_LABEL:pt,STATE_COLOR:mt,TASK_LABEL:ht,TASK_COLOR:gt,KIND_LABEL:_t,MS_LABEL:vt,md:H,diffDays:yt,wsjf:bt,dependentsOf:U,TYPE_LABEL:xt,TYPE_COLOR:St,TYPE_ICON:Ct,PRIORITY_COLOR:wt,SEVERITY_LABEL:W,SEVERITY_COLOR:G,SCOPE_LABEL:K,storyDiagrams:q,staleDiagrams:J,DIAGRAM_KIND_LABEL:Tt,DIAGRAM_KIND_ICON:Et,DIAGRAM_KIND_DOT:Dt}=n(),Y=v(()=>R.value.get(String(o.value?.params?.id))),X=v(()=>z.value.findIndex(e=>e.id===Y.value?.id)),Z=v(()=>X.value>0?z.value[X.value-1]:null),Q=v(()=>X.value>=0&&X.value<z.value.length-1?z.value[X.value+1]:null),$=e=>dt.value.get(e)?.entries??[],Ot={red:`RED 失败测试`,green:`GREEN 让测试通过`,refactor:`REFACTOR 重构`},kt={red:`tag-error`,green:`tag-success`,refactor:`tag-primary`};return(ee,n)=>{let r=e,o=t;return s(),h(`div`,null,[i(Y)?(s(),h(p,{key:0},[u(o,{to:`/`,class:`btn btn-quiet btn-sm back`},{default:m(()=>[u(r,{name:`i-lucide-arrow-left`,class:`size-3.5`}),n[0]||=y(`返回看板 `,-1)]),_:1}),d(`article`,te,[d(`div`,ne,[d(`span`,re,c(i(Y).id),1),d(`span`,{class:_([`tag`,`tag-${i(mt)[i(Y).status]}`])},c(i(pt)[i(Y).status]??i(Y).status),3),d(`span`,{class:_([`tag`,`tag-${i(St)[i(Y).type]}`])},[u(r,{name:i(Ct)[i(Y).type],class:`size-3`},null,8,[`name`]),y(c(i(xt)[i(Y).type]),1)],2),d(`span`,{class:_([`tag`,`tag-${i(wt)[i(Y).priority]}`])},c(i(Y).priority),3),i(Y).bug?(s(),h(`span`,{key:0,class:_([`tag`,`tag-${i(G)[i(Y).bug.severity]}`])},[u(r,{name:`i-lucide-bug`,class:`size-3`}),y(c(i(W)[i(Y).bug.severity]),1)],2)):g(``,!0),i(Y).blocked?(s(),h(`span`,{key:1,class:`tag tag-error tag-dot`,title:i(Y).blocked.reason},`阻塞`,8,ie)):g(``,!0),i(Y).scopeChange?(s(),h(`span`,{key:2,class:`tag tag-info`,title:`${i(K)[i(Y).scopeChange.kind]}(${i(Y).scopeChange.at}):${i(Y).scopeChange.reason}`},c(i(K)[i(Y).scopeChange.kind])+` · `+c(i(Y).scopeChange.at),9,ae)):g(``,!0),d(`span`,oe,[u(r,{name:`i-lucide-layers`,class:`size-3`}),y(c(i(Y).epicId)+` `+c(i(lt).get(i(Y).epicId)?.title),1)]),i(Y).sprintId?(s(),h(`span`,se,[u(r,{name:`i-lucide-calendar-range`,class:`size-3`}),y(c(i(Y).sprintId),1)])):g(``,!0),(s(!0),h(p,null,a(i(ft)(i(Y).id),e=>(s(),h(`span`,{key:e.id,class:_([`tag`,e.kind===`mvp`?`tag-mint`:`tag-neutral`]),title:`${e.id} · ${e.criteria}`},c(i(_t)[e.kind])+` `+c(e.id)+` · `+c(i(vt)[e.status]),11,ce))),128))]),d(`h1`,le,c(i(Y).title),1),d(`p`,ue,c(i(Y).narrative),1),d(`div`,de,[d(`div`,fe,[n[1]||=d(`span`,{class:`k`},`点数`,-1),d(`b`,null,c(i(Y).points),1)]),d(`div`,pe,[n[2]||=d(`span`,{class:`k`},`价值`,-1),d(`b`,null,c(i(Y).value),1)]),d(`div`,me,[n[3]||=d(`span`,{class:`k`},`WSJF`,-1),d(`b`,null,c(i(bt)(i(Y))),1)]),d(`div`,he,[n[4]||=d(`span`,{class:`k`},`任务`,-1),d(`b`,null,c(i(V)(i(Y)).done)+`/`+c(i(V)(i(Y)).total),1)]),d(`div`,ge,[n[5]||=d(`span`,{class:`k`},`计划`,-1),d(`b`,b,c(i(Y).schedule?`${i(H)(i(Y).schedule.start)} ~ ${i(H)(i(Y).schedule.end)}`:`未排期`),1)]),d(`div`,x,[n[6]||=d(`span`,{class:`k`},`实际`,-1),d(`b`,S,[i(B)(i(Y))?(s(),h(p,{key:0},[y(c(i(H)(i(B)(i(Y)).start))+` ~ `+c(i(H)(i(B)(i(Y)).end))+` `,1),d(`small`,C,`(`+c(i(yt)(i(B)(i(Y)).start,i(B)(i(Y)).end)+1)+` 天)`,1)],64)):(s(),h(p,{key:1},[y(`—`)],64))])]),d(`div`,w,[n[7]||=d(`span`,{class:`k`},`创建`,-1),d(`b`,T,c(i(Y).created),1)]),i(Y).sprintId?(s(),h(`div`,E,[n[8]||=d(`span`,{class:`k`},`所属迭代`,-1),d(`b`,null,c(i(ut).get(i(Y).sprintId)?.name),1)])):g(``,!0)]),d(`div`,D,[d(`span`,O,`任务完成度 `+c(i(V)(i(Y)).pct)+`%`,1),d(`div`,k,[d(`i`,{style:l({width:i(V)(i(Y)).pct+`%`})},null,4)])])]),d(`div`,A,[i(Y).bug?(s(),h(`article`,j,[d(`div`,M,[d(`h2`,N,[u(r,{name:`i-lucide-bug`,class:`size-3.5`}),n[9]||=y(`缺陷详情`,-1)]),d(`span`,{class:_([`tag`,`tag-${i(G)[i(Y).bug.severity]}`])},c(i(W)[i(Y).bug.severity]),3)]),d(`div`,P,[d(`div`,null,[n[10]||=d(`span`,{class:`lbl`},`影响环境`,-1),d(`p`,null,c(i(Y).bug.environment),1)]),d(`div`,null,[n[11]||=d(`span`,{class:`lbl`},`复现步骤`,-1),d(`p`,F,c(i(Y).bug.steps),1)])])])):g(``,!0),i(Y).blocked||i(Y).dependsOn?.length||i(U)(i(Y).id).length?(s(),h(`article`,I,[d(`div`,L,[d(`h2`,_e,[u(r,{name:`i-lucide-git-branch`,class:`size-3.5`}),n[12]||=y(`依赖与阻塞`,-1)])]),d(`div`,ve,[i(Y).blocked?(s(),h(`div`,ye,[u(r,{name:`i-lucide-octagon-alert`,class:`size-4`}),d(`div`,null,[n[13]||=d(`b`,null,`当前被阻塞`,-1),d(`p`,null,c(i(Y).blocked.reason)+`(自 `+c(i(Y).blocked.since)+` 起)`,1)])])):g(``,!0),i(Y).dependsOn?.length?(s(),h(`div`,be,[n[14]||=d(`span`,{class:`lbl`},`依赖`,-1),(s(!0),h(p,null,a(i(Y).dependsOn,e=>(s(),f(o,{key:e,to:`/story/${e}`,class:`dep`},{default:m(()=>[u(r,{name:`i-lucide-arrow-left`,class:`size-3`}),y(c(e)+` `+c(i(R).get(e)?.title??``),1)]),_:2},1032,[`to`]))),128))])):g(``,!0),i(U)(i(Y).id).length?(s(),h(`div`,xe,[n[15]||=d(`span`,{class:`lbl`},`被依赖`,-1),(s(!0),h(p,null,a(i(U)(i(Y).id),e=>(s(),f(o,{key:e.id,to:`/story/${e.id}`,class:`dep ghost`},{default:m(()=>[y(c(e.id)+` `+c(e.title),1),u(r,{name:`i-lucide-arrow-right`,class:`size-3`})]),_:2},1032,[`to`]))),128))])):g(``,!0)])])):g(``,!0)]),d(`article`,Se,[d(`div`,Ce,[d(`h2`,we,[u(r,{name:`i-lucide-list-checks`,class:`size-3.5`}),n[16]||=y(`验收标准`,-1)]),d(`span`,Te,c(i(Y).acceptance?.length??0)+` 条`,1)]),d(`div`,Ee,[i(Y).acceptance?.length?(s(),h(`ol`,De,[(s(!0),h(p,null,a(i(Y).acceptance,(e,t)=>(s(),h(`li`,{key:t},[d(`div`,Oe,[n[17]||=d(`span`,{class:`tag tag-neutral gw`},`Given`,-1),d(`span`,null,c(e.given),1)]),d(`div`,ke,[n[18]||=d(`span`,{class:`tag tag-info gw`},`When`,-1),d(`span`,null,c(e.when),1)]),d(`div`,Ae,[n[19]||=d(`span`,{class:`tag tag-success gw`},`Then`,-1),d(`span`,null,c(e.then),1)]),e.verifyBy?.length?(s(),h(`div`,je,[n[20]||=d(`span`,{class:`dim`},`由谁验证`,-1),(s(!0),h(p,null,a(e.verifyBy,e=>(s(),h(`span`,{key:e,class:`tag tag-ghost`},c(e),1))),128))])):g(``,!0)]))),128))])):(s(),h(`p`,Me,`还没有验收标准(草稿阶段允许为空,进迭代前必须补)。`))])]),(i(q).get(i(Y).id)??[]).length?(s(),h(`article`,Ne,[d(`div`,Pe,[d(`h2`,Fe,[u(r,{name:`i-lucide-network`,class:`size-3.5`}),n[21]||=y(`架构图例`,-1)]),d(`span`,Ie,c((i(q).get(i(Y).id)??[]).length)+` 张`,1),n[22]||=d(`span`,{class:`dim tip`},`点开在看板里预览`,-1)]),d(`div`,Le,[(s(!0),h(p,null,a(i(q).get(i(Y).id),e=>(s(),f(o,{key:e.id,to:`/diagrams?focus=${e.id}`,class:`dg-link`},{default:m(()=>[u(r,{name:i(Et)[e.kind],class:`size-3.5`,style:l({color:i(Dt)[e.kind]})},null,8,[`name`,`style`]),d(`b`,null,c(e.title),1),d(`span`,Re,c(i(Tt)[e.kind]),1),i(J).has(e.id)?(s(),h(`span`,ze,`可能过期`)):g(``,!0),d(`span`,Be,c(e.id)+` · `+c(i(H)(e.updatedAt)),1)]),_:2},1032,[`to`]))),128))])])):g(``,!0),(s(!0),h(p,null,a(i(Y).tasks,e=>(s(),h(`article`,{key:e.id,class:`card block`},[d(`div`,Ve,[d(`span`,He,c(e.id),1),d(`span`,Ue,c(e.type),1),d(`span`,{class:_([`tag`,`tag-${i(gt)[e.status]}`])},c(i(ht)[e.status]),3),d(`b`,We,c(e.title),1),d(`span`,Ge,c($(e.id).length)+` 条记录`,1)]),e.files?.length?(s(),h(`p`,Ke,c(e.files.join(` · `)),1)):g(``,!0),d(`div`,qe,[$(e.id).length?(s(),h(`div`,Je,[(s(!0),h(p,null,a($(e.id),(e,t)=>(s(),h(`div`,{key:t,class:_([`entry`,e.phase])},[d(`div`,Ye,[d(`span`,{class:_([`tag`,kt[e.phase]])},c(Ot[e.phase]),3),d(`span`,Xe,c(i(H)(e.date)),1),d(`span`,Ze,c(e.result),1)]),d(`p`,Qe,c(e.note),1),e.testCommand?(s(),h(`p`,$e,[u(r,{name:`i-lucide-terminal`,class:`size-3`}),y(c(e.testCommand),1)])):g(``,!0),e.files?.length?(s(),h(`p`,et,c(e.files.join(`, `)),1)):g(``,!0)],2))),128))])):(s(),h(`p`,tt,`还没有实施记录(未开工)。`))])]))),128)),d(`div`,nt,[i(Z)?(s(),f(o,{key:0,to:`/story/${i(Z).id}`,class:`pg`},{default:m(()=>[d(`span`,rt,[u(r,{name:`i-lucide-arrow-left`,class:`size-3.5`}),n[23]||=y(`上一个`,-1)]),d(`span`,it,c(i(Z).id)+` `+c(i(Z).title),1)]),_:1},8,[`to`])):(s(),h(`span`,at)),i(Q)?(s(),f(o,{key:2,to:`/story/${i(Q).id}`,class:`pg right`},{default:m(()=>[d(`span`,ot,[n[24]||=y(`下一个`,-1),u(r,{name:`i-lucide-arrow-right`,class:`size-3.5`})]),d(`span`,st,c(i(Q).id)+` `+c(i(Q).title),1)]),_:1},8,[`to`])):g(``,!0)])],64)):(s(),h(`div`,ct,[u(r,{name:`i-lucide-search-x`,class:`size-4`}),n[25]||=y(`没找到这个故事,可能 id 写错了。 `,-1)]))])}}}),[[`__scopeId`,`data-v-a4bac36b`]]);export{R as default};
@@ -1 +1 @@
1
- import{a as e,i as t,o as n,r as ee,s as r}from"#entry";import{t as te}from"./DJM7u8P3.js";import{t as ne}from"./CI0scS-N.js";import{At as i,K as a,S as o,U as s,Xt as c,Yt as l,b as u,d,i as f,lt as p,m,p as h,qt as g,u as _,v as re,y as v}from"./BxuBMtk_.js";var ie={class:`kpis`},ae={class:`v`},oe={class:`v`},se={class:`v`},ce={class:`v`},le={class:`v mono`},ue={class:`card gantt`},de={class:`ticks`},fe={class:`track`},pe={class:`label`},me={class:`lane`},he={class:`grid-lines`},ge=[`title`],_e={class:`track-hd`},ve={class:`tag tag-neutral mono`},ye={class:`dim`},y={class:`grow-row`},b={class:`label`},x={class:`tag tag-ghost`},S={class:`lane`},C={class:`grid-lines`},w={class:`label`},T=[`title`],E=[`title`],D={class:`pts mono dim`},O={class:`lane`},k={class:`grid-lines`},A={class:`track last`},j={class:`label`},M={class:`dim pts mono`},N={class:`tag tag-neutral`},P={class:`lane`},be={class:`grid-lines`},xe={class:`extra`},Se={key:0,class:`card`},Ce={class:`card-hd`},we={class:`h2`},Te={class:`tag tag-neutral`},Ee={class:`card-bd`},De={class:`list`},Oe={class:`dep-txt`},ke={class:`dep-txt dim`},Ae={key:1,class:`card`},je={class:`card-hd`},Me={class:`h2`},F={class:`tag tag-error`},Ne={class:`card-bd`},Pe={class:`list`},Fe={class:`dep-txt`},Ie={class:`dim`},I=t(o({__name:`gantt`,setup(t){let{sprints:o,stories:I,milestones:L,storyById:R,actualRange:z,progress:B,addDays:Le,diffDays:V,md:H,now:U,MS_COLOR:Re,MS_LABEL:ze,KIND_LABEL:Be,KIND_ICON:Ve,STATE_LABEL:He,STATE_DOT:W,dependencyPairs:G,blockedStories:K}=r(),Ue=_(()=>o.value.map(e=>({id:e.id,name:e.name,start:e.start,end:e.end,rows:(e.stories??[]).map(e=>R.value.get(e)).filter(Boolean).map(e=>({...e,actual:z(e),prog:B(e)}))}))),q=_(()=>I.value.filter(e=>e.schedule)),We=_(()=>I.value.filter(e=>!e.schedule)),J=_(()=>[...o.value.map(e=>e.start),...q.value.map(e=>e.schedule.start),...L.value.map(e=>e.due)].sort()[0]??U),Ge=_(()=>{let e=[...o.value.map(e=>e.end),...q.value.map(e=>e.schedule.end),...L.value.map(e=>e.due)].sort();return e[e.length-1]??U}),Y=_(()=>Math.max(1,V(J.value,Ge.value)+1)),X=e=>V(J.value,e)/Y.value*100,Z=(e,t)=>({left:`${X(e)}%`,width:`${Math.max(1.1,(V(e,t)+1)/Y.value*100)}%`}),Q=_(()=>{let e=Y.value>90?14:Y.value>45?7:4,t=[];for(let n=0;n<=Y.value;n+=e)t.push({date:Le(J.value,n),x:n/Y.value*100});return t}),$=_(()=>X(U));return(t,r)=>{let _=ee,z=te,B=ne;return s(),m(`div`,null,[d(`div`,ie,[d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(0)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(0),size:`sm`},null,8,[`tone`]),r[1]||=d(`p`,{class:`k`},`迭代窗口`,-1),d(`p`,ae,[v(c(i(o).length),1),r[0]||=d(`small`,null,`个`,-1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(1)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(1),size:`sm`},null,8,[`tone`]),r[3]||=d(`p`,{class:`k`},`里程碑`,-1),d(`p`,oe,[v(c(i(L).length),1),r[2]||=d(`small`,null,`个`,-1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(2)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(2),size:`sm`},null,8,[`tone`]),r[4]||=d(`p`,{class:`k`},`已排期故事`,-1),d(`p`,se,[v(c(i(q).length),1),d(`small`,null,`/ `+c(i(I).length),1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(3)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(3),size:`sm`},null,8,[`tone`]),r[6]||=d(`p`,{class:`k`},`时间跨度`,-1),d(`p`,ce,[v(c(i(Y)),1),r[5]||=d(`small`,null,`天`,-1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(4)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(4),size:`sm`},null,8,[`tone`]),r[7]||=d(`p`,{class:`k`},`今天`,-1),d(`p`,le,c(i(U)),1)],2)]),d(`div`,ue,[r[11]||=re(`<div class="gantt-hd" data-v-7bf72906><h2 class="h2" data-v-7bf72906>时间轴</h2><div class="legend" data-v-7bf72906><span class="lg" data-v-7bf72906><i class="sw plan" data-v-7bf72906></i>计划</span><span class="lg" data-v-7bf72906><i class="sw real" data-v-7bf72906></i>实际</span><span class="lg" data-v-7bf72906><i class="sw ms" data-v-7bf72906></i>里程碑</span><span class="lg" data-v-7bf72906><i class="sw mvp" data-v-7bf72906></i>MVP 节点</span><span class="lg" data-v-7bf72906><i class="sw today" data-v-7bf72906></i>今天</span></div></div>`,1),d(`div`,de,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`div`,{key:e.date,class:`tick`,style:l({left:e.x+`%`})},[d(`span`,null,c(i(H)(e.date)),1)],4))),128)),d(`div`,{class:`today-line`,style:l({left:i($)+`%`})},null,4),d(`div`,{class:`today-flag`,style:l({left:i($)+`%`})},`今天 `+c(i(H)(i(U))),5)]),d(`section`,fe,[r[8]||=d(`header`,{class:`track-hd`},`里程碑`,-1),(s(!0),m(f,null,a(i(L),e=>(s(),m(`div`,{key:e.id,class:`grow-row`},[d(`div`,pe,[d(`span`,{class:g([`tag`,e.kind===`mvp`?`tag-mint`:`tag-primary`])},[u(z,{name:i(Ve)[e.kind],class:`size-3`},null,8,[`name`]),v(c(i(Be)[e.kind]),1)],2),u(B,{to:`/milestones`,class:`lbl-txt`},{default:p(()=>[v(c(e.title),1)]),_:2},1024),d(`span`,{class:g([`tag`,`tag-${i(Re)[e.status]}`])},c(i(ze)[e.status]),3)]),d(`div`,me,[d(`div`,he,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`span`,{key:e.date,style:l({left:e.x+`%`})},null,4))),128))]),d(`span`,{class:g([`diamond`,{mvp:e.kind===`mvp`}]),style:l({left:X(e.due)+`%`}),title:`${e.id} · ${e.due} · ${e.criteria}`},null,14,ge)])]))),128))]),(s(!0),m(f,null,a(i(Ue),e=>(s(),m(`section`,{key:e.id,class:`track`},[d(`header`,_e,[d(`span`,ve,c(e.id),1),v(` `+c(e.name)+` `,1),d(`span`,ye,c(i(H)(e.start))+` ~ `+c(i(H)(e.end)),1)]),d(`div`,y,[d(`div`,b,[d(`span`,x,[u(z,{name:`i-lucide-calendar-range`,class:`size-3`}),r[9]||=v(`迭代窗口`,-1)])]),d(`div`,S,[d(`div`,C,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`span`,{key:e.date,style:l({left:e.x+`%`})},null,4))),128))]),d(`div`,{class:`band`,style:l(Z(e.start,e.end))},null,4)])]),(s(!0),m(f,null,a(e.rows,e=>(s(),m(`div`,{key:e.id,class:`grow-row`},[d(`div`,w,[d(`i`,{class:`sdot`,style:l({background:i(W)[e.status]})},null,4),u(B,{to:`/story/${e.id}`,class:`lbl-txt`},{default:p(()=>[v(c(e.title),1)]),_:2},1032,[`to`]),e.dependsOn?.length?(s(),m(`span`,{key:0,class:`tag tag-secondary`,title:`依赖:${e.dependsOn.join(`、`)}`},c(e.dependsOn.length),9,T)):h(``,!0),e.blocked?(s(),m(`span`,{key:1,class:`tag tag-error`,title:`阻塞:${e.blocked.reason}(自 ${e.blocked.since})`},`!`,8,E)):h(``,!0),d(`span`,D,c(e.points)+` 点 · `+c(e.prog.done)+`/`+c(e.prog.total),1)]),d(`div`,O,[d(`div`,k,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`span`,{key:e.date,style:l({left:e.x+`%`})},null,4))),128))]),e.schedule?(s(),m(`div`,{key:0,class:`g-plan`,style:l(Z(e.schedule.start,e.schedule.end))},null,4)):h(``,!0),e.actual?(s(),m(`div`,{key:1,class:`g-real`,style:l(Z(e.actual.start,e.actual.end))},null,4)):h(``,!0)])]))),128))]))),128)),d(`section`,A,[r[10]||=d(`header`,{class:`track-hd`},`未排期(backlog)`,-1),(s(!0),m(f,null,a(i(We),e=>(s(),m(`div`,{key:e.id,class:`grow-row`},[d(`div`,j,[d(`i`,{class:`sdot`,style:l({background:i(W)[e.status]})},null,4),u(B,{to:`/story/${e.id}`,class:`lbl-txt`},{default:p(()=>[v(c(e.title),1)]),_:2},1032,[`to`]),d(`span`,M,c(e.points)+` 点`,1),d(`span`,N,c(i(He)[e.status]),1)]),d(`div`,P,[d(`div`,be,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`span`,{key:e.date,style:l({left:e.x+`%`})},null,4))),128))])])]))),128))])]),d(`div`,xe,[i(G).length?(s(),m(`div`,Se,[d(`div`,Ce,[d(`h2`,we,[u(z,{name:`i-lucide-git-branch`,class:`size-3.5`}),r[12]||=v(`依赖链`,-1)]),d(`span`,Te,c(i(G).length),1)]),d(`div`,Ee,[d(`ul`,De,[(s(!0),m(f,null,a(i(G),e=>(s(),m(`li`,{key:`${e.from}-${e.to}`},[u(B,{to:`/story/${e.to}`,class:`mono link`},{default:p(()=>[v(c(e.to),1)]),_:2},1032,[`to`]),d(`span`,Oe,c(i(R).get(e.to)?.title),1),u(z,{name:`i-lucide-arrow-left`,class:`size-3 dim`}),r[13]||=d(`span`,{class:`dim`},`依赖`,-1),u(B,{to:`/story/${e.from}`,class:`mono link`},{default:p(()=>[v(c(e.from),1)]),_:2},1032,[`to`]),d(`span`,ke,c(i(R).get(e.from)?.title),1)]))),128))])])])):h(``,!0),i(K).length?(s(),m(`div`,Ae,[d(`div`,je,[d(`h2`,Me,[u(z,{name:`i-lucide-octagon-alert`,class:`size-3.5`}),r[14]||=v(`阻塞中`,-1)]),d(`span`,F,c(i(K).length),1)]),d(`div`,Ne,[d(`ul`,Pe,[(s(!0),m(f,null,a(i(K),e=>(s(),m(`li`,{key:e.id},[r[15]||=d(`span`,{class:`tag tag-error tag-dot`},`阻塞`,-1),u(B,{to:`/story/${e.id}`,class:`mono link`},{default:p(()=>[v(c(e.id),1)]),_:2},1032,[`to`]),d(`span`,Fe,c(e.title),1),d(`span`,Ie,`· `+c(e.blocked.reason)+`(自 `+c(e.blocked.since)+`)`,1)]))),128))])])])):h(``,!0)])])}}}),[[`__scopeId`,`data-v-7bf72906`]]);export{I as default};
1
+ import{a as e,i as t,o as n,r as ee,s as r}from"#entry";import{t as te}from"./DJM7u8P3.js";import{t as ne}from"./CI0scS-N.js";import{At as i,K as a,S as o,U as s,Xt as c,Yt as l,b as u,d,i as f,lt as p,m,p as h,qt as g,u as _,v as re,y as v}from"./BxuBMtk_.js";var ie={class:`kpis`},ae={class:`v`},oe={class:`v`},se={class:`v`},ce={class:`v`},le={class:`v mono`},ue={class:`card gantt`},de={class:`ticks`},fe={class:`track`},pe={class:`label`},me={class:`lane`},he={class:`grid-lines`},ge=[`title`],_e={class:`track-hd`},ve={class:`tag tag-neutral mono`},ye={class:`dim`},y={class:`grow-row`},b={class:`label`},x={class:`tag tag-ghost`},S={class:`lane`},C={class:`grid-lines`},w={class:`label`},T=[`title`],E=[`title`],D={class:`pts mono dim`},O={class:`lane`},k={class:`grid-lines`},A={class:`track last`},j={class:`label`},M={class:`dim pts mono`},N={class:`tag tag-neutral`},P={class:`lane`},be={class:`grid-lines`},xe={class:`extra`},Se={key:0,class:`card`},Ce={class:`card-hd`},we={class:`h2`},Te={class:`tag tag-neutral`},Ee={class:`card-bd`},De={class:`list`},Oe={class:`dep-txt`},ke={class:`dep-txt dim`},Ae={key:1,class:`card`},je={class:`card-hd`},Me={class:`h2`},F={class:`tag tag-error`},Ne={class:`card-bd`},Pe={class:`list`},Fe={class:`dep-txt`},Ie={class:`dim`},I=t(o({__name:`gantt`,setup(t){let{sprints:o,stories:I,milestones:L,storyById:R,actualRange:z,progress:B,addDays:Le,diffDays:V,md:H,now:U,MS_COLOR:Re,MS_LABEL:ze,KIND_LABEL:Be,KIND_ICON:Ve,STATE_LABEL:He,STATE_DOT:W,dependencyPairs:G,blockedStories:K}=r(),Ue=_(()=>o.value.map(e=>({id:e.id,name:e.name,start:e.start,end:e.end,rows:(e.stories??[]).map(e=>R.value.get(e)).filter(Boolean).map(e=>({...e,actual:z(e),prog:B(e)}))}))),q=_(()=>I.value.filter(e=>e.schedule)),We=_(()=>I.value.filter(e=>!e.schedule)),J=_(()=>[...o.value.map(e=>e.start),...q.value.map(e=>e.schedule.start),...L.value.map(e=>e.due)].sort()[0]??U),Ge=_(()=>{let e=[...o.value.map(e=>e.end),...q.value.map(e=>e.schedule.end),...L.value.map(e=>e.due)].sort();return e[e.length-1]??U}),Y=_(()=>Math.max(1,V(J.value,Ge.value)+1)),X=e=>V(J.value,e)/Y.value*100,Z=(e,t)=>({left:`${X(e)}%`,width:`${Math.max(1.1,(V(e,t)+1)/Y.value*100)}%`}),Q=_(()=>{let e=Y.value>90?14:Y.value>45?7:4,t=[];for(let n=0;n<=Y.value;n+=e)t.push({date:Le(J.value,n),x:n/Y.value*100});return t}),$=_(()=>X(U));return(t,r)=>{let _=ee,z=te,B=ne;return s(),m(`div`,null,[d(`div`,ie,[d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(0)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(0),size:`sm`},null,8,[`tone`]),r[1]||=d(`p`,{class:`k`},`迭代窗口`,-1),d(`p`,ae,[v(c(i(o).length),1),r[0]||=d(`small`,null,`个`,-1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(1)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(1),size:`sm`},null,8,[`tone`]),r[3]||=d(`p`,{class:`k`},`里程碑`,-1),d(`p`,oe,[v(c(i(L).length),1),r[2]||=d(`small`,null,`个`,-1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(2)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(2),size:`sm`},null,8,[`tone`]),r[4]||=d(`p`,{class:`k`},`已排期故事`,-1),d(`p`,se,[v(c(i(q).length),1),d(`small`,null,`/ `+c(i(I).length),1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(3)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(3),size:`sm`},null,8,[`tone`]),r[6]||=d(`p`,{class:`k`},`时间跨度`,-1),d(`p`,ce,[v(c(i(Y)),1),r[5]||=d(`small`,null,`天`,-1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(4)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(4),size:`sm`},null,8,[`tone`]),r[7]||=d(`p`,{class:`k`},`今天`,-1),d(`p`,le,c(i(U)),1)],2)]),d(`div`,ue,[r[11]||=re(`<div class="gantt-hd" data-v-719eb5d7><h2 class="h2" data-v-719eb5d7>时间轴</h2><div class="legend" data-v-719eb5d7><span class="lg" data-v-719eb5d7><i class="sw plan" data-v-719eb5d7></i>计划</span><span class="lg" data-v-719eb5d7><i class="sw real" data-v-719eb5d7></i>实际</span><span class="lg" data-v-719eb5d7><i class="sw ms" data-v-719eb5d7></i>里程碑</span><span class="lg" data-v-719eb5d7><i class="sw mvp" data-v-719eb5d7></i>MVP 节点</span><span class="lg" data-v-719eb5d7><i class="sw today" data-v-719eb5d7></i>今天</span></div></div>`,1),d(`div`,de,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`div`,{key:e.date,class:`tick`,style:l({left:e.x+`%`})},[d(`span`,null,c(i(H)(e.date)),1)],4))),128)),d(`div`,{class:`today-line`,style:l({left:i($)+`%`})},null,4),d(`div`,{class:`today-flag`,style:l({left:i($)+`%`})},`今天 `+c(i(H)(i(U))),5)]),d(`section`,fe,[r[8]||=d(`header`,{class:`track-hd`},`里程碑`,-1),(s(!0),m(f,null,a(i(L),e=>(s(),m(`div`,{key:e.id,class:`grow-row`},[d(`div`,pe,[d(`span`,{class:g([`tag`,e.kind===`mvp`?`tag-mint`:`tag-primary`])},[u(z,{name:i(Ve)[e.kind],class:`size-3`},null,8,[`name`]),v(c(i(Be)[e.kind]),1)],2),u(B,{to:`/milestones`,class:`lbl-txt`},{default:p(()=>[v(c(e.title),1)]),_:2},1024),d(`span`,{class:g([`tag`,`tag-${i(Re)[e.status]}`])},c(i(ze)[e.status]),3)]),d(`div`,me,[d(`div`,he,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`span`,{key:e.date,style:l({left:e.x+`%`})},null,4))),128))]),d(`span`,{class:g([`diamond`,{mvp:e.kind===`mvp`}]),style:l({left:X(e.due)+`%`}),title:`${e.id} · ${e.due} · ${e.criteria}`},null,14,ge)])]))),128))]),(s(!0),m(f,null,a(i(Ue),e=>(s(),m(`section`,{key:e.id,class:`track`},[d(`header`,_e,[d(`span`,ve,c(e.id),1),v(` `+c(e.name)+` `,1),d(`span`,ye,c(i(H)(e.start))+` ~ `+c(i(H)(e.end)),1)]),d(`div`,y,[d(`div`,b,[d(`span`,x,[u(z,{name:`i-lucide-calendar-range`,class:`size-3`}),r[9]||=v(`迭代窗口`,-1)])]),d(`div`,S,[d(`div`,C,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`span`,{key:e.date,style:l({left:e.x+`%`})},null,4))),128))]),d(`div`,{class:`band`,style:l(Z(e.start,e.end))},null,4)])]),(s(!0),m(f,null,a(e.rows,e=>(s(),m(`div`,{key:e.id,class:`grow-row`},[d(`div`,w,[d(`i`,{class:`sdot`,style:l({background:i(W)[e.status]})},null,4),u(B,{to:`/story/${e.id}`,class:`lbl-txt`},{default:p(()=>[v(c(e.title),1)]),_:2},1032,[`to`]),e.dependsOn?.length?(s(),m(`span`,{key:0,class:`tag tag-secondary`,title:`依赖:${e.dependsOn.join(`、`)}`},c(e.dependsOn.length),9,T)):h(``,!0),e.blocked?(s(),m(`span`,{key:1,class:`tag tag-error`,title:`阻塞:${e.blocked.reason}(自 ${e.blocked.since})`},`!`,8,E)):h(``,!0),d(`span`,D,c(e.points)+` 点 · `+c(e.prog.done)+`/`+c(e.prog.total),1)]),d(`div`,O,[d(`div`,k,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`span`,{key:e.date,style:l({left:e.x+`%`})},null,4))),128))]),e.schedule?(s(),m(`div`,{key:0,class:`g-plan`,style:l(Z(e.schedule.start,e.schedule.end))},null,4)):h(``,!0),e.actual?(s(),m(`div`,{key:1,class:`g-real`,style:l(Z(e.actual.start,e.actual.end))},null,4)):h(``,!0)])]))),128))]))),128)),d(`section`,A,[r[10]||=d(`header`,{class:`track-hd`},`未排期(backlog)`,-1),(s(!0),m(f,null,a(i(We),e=>(s(),m(`div`,{key:e.id,class:`grow-row`},[d(`div`,j,[d(`i`,{class:`sdot`,style:l({background:i(W)[e.status]})},null,4),u(B,{to:`/story/${e.id}`,class:`lbl-txt`},{default:p(()=>[v(c(e.title),1)]),_:2},1032,[`to`]),d(`span`,M,c(e.points)+` 点`,1),d(`span`,N,c(i(He)[e.status]),1)]),d(`div`,P,[d(`div`,be,[(s(!0),m(f,null,a(i(Q),e=>(s(),m(`span`,{key:e.date,style:l({left:e.x+`%`})},null,4))),128))])])]))),128))])]),d(`div`,xe,[i(G).length?(s(),m(`div`,Se,[d(`div`,Ce,[d(`h2`,we,[u(z,{name:`i-lucide-git-branch`,class:`size-3.5`}),r[12]||=v(`依赖链`,-1)]),d(`span`,Te,c(i(G).length),1)]),d(`div`,Ee,[d(`ul`,De,[(s(!0),m(f,null,a(i(G),e=>(s(),m(`li`,{key:`${e.from}-${e.to}`},[u(B,{to:`/story/${e.to}`,class:`mono link`},{default:p(()=>[v(c(e.to),1)]),_:2},1032,[`to`]),d(`span`,Oe,c(i(R).get(e.to)?.title),1),u(z,{name:`i-lucide-arrow-left`,class:`size-3 dim`}),r[13]||=d(`span`,{class:`dim`},`依赖`,-1),u(B,{to:`/story/${e.from}`,class:`mono link`},{default:p(()=>[v(c(e.from),1)]),_:2},1032,[`to`]),d(`span`,ke,c(i(R).get(e.from)?.title),1)]))),128))])])])):h(``,!0),i(K).length?(s(),m(`div`,Ae,[d(`div`,je,[d(`h2`,Me,[u(z,{name:`i-lucide-octagon-alert`,class:`size-3.5`}),r[14]||=v(`阻塞中`,-1)]),d(`span`,F,c(i(K).length),1)]),d(`div`,Ne,[d(`ul`,Pe,[(s(!0),m(f,null,a(i(K),e=>(s(),m(`li`,{key:e.id},[r[15]||=d(`span`,{class:`tag tag-error tag-dot`},`阻塞`,-1),u(B,{to:`/story/${e.id}`,class:`mono link`},{default:p(()=>[v(c(e.id),1)]),_:2},1032,[`to`]),d(`span`,Fe,c(e.title),1),d(`span`,Ie,`· `+c(e.blocked.reason)+`(自 `+c(e.blocked.since)+`)`,1)]))),128))])])])):h(``,!0)])])}}}),[[`__scopeId`,`data-v-719eb5d7`]]);export{I as default};
@@ -1 +1 @@
1
- import{a as e,i as t,o as n,r as ee,s as r}from"#entry";import{t as te}from"./OKKaKILz.js";import{t as ne}from"./DJM7u8P3.js";import{t as re}from"./CI0scS-N.js";import{At as i,K as a,S as o,U as s,Xt as c,Yt as ie,b as l,d as u,gt as ae,i as d,lt as oe,m as f,ot as p,p as m,qt as h,u as g,ut as se,v as _,xt as v,y}from"./BxuBMtk_.js";import{o as ce}from"./BygIGL69.js";var le={class:`kpis`},ue={class:`v`},de={class:`v`},fe={class:`v`},pe={class:`v`},me={key:0,class:`card panel`},he={class:`panel-hd`},ge={class:`ph-l`},_e={class:`sp-name`},ve={class:`sub mono`},ye={class:`goal`},be={class:`chart-wrap`},xe=[`viewBox`],Se=[`y1`,`x2`,`y2`],b=[`x`,`y`],x=[`d`],S=[`d`],C=[`points`],w=[`cx`,`cy`],T=[`x1`,`y1`,`x2`,`y2`],E=[`x`,`y`],D=[`x`,`y`],O=[`x1`,`y1`,`x2`,`y2`],k=[`cx`,`cy`],A={class:`cells`},j={class:`cd mono`},Ce={class:`ca`},we={class:`ci dim`},Te={key:0,class:`scope`},Ee={class:`h3`},De={class:`tag tag-info`},Oe={class:`dim`},ke={key:1,class:`callout soft`},Ae={class:`card`},je={class:`card-hd`},Me={class:`tag tag-neutral`},Ne={class:`card-bd`},Pe={class:`tbl`},Fe=[`onClick`],Ie={class:`mono`},Le={class:`mono dim`},Re={class:`r`},ze={class:`r mono`},Be=980,Ve=300,M=42,N=t(o({__name:`burndown`,setup(t){let{sprints:o,burndown:N,sprintCommit:P,md:F,now:I,sprintById:L,storyById:He,SCOPE_LABEL:R}=r(),z=v(``),Ue=g(()=>[...o.value].reverse().map(e=>({label:`${e.id} · ${e.name}`,value:e.id,icon:`i-lucide-calendar-range`}))),B=g(()=>L.value.get(z.value)??o.value[o.value.length-1]),V=g(()=>B.value?N(B.value):{total:0,days:[]});p(()=>{z.value&&!L.value.has(z.value)&&(z.value=``),!z.value&&o.value.length&&(z.value=o.value[o.value.length-1].id)});let H=g(()=>V.value.days.length||1),U=g(()=>V.value.total||1),W=e=>M+e*896/(H.value-1||1),G=e=>258-e*216/U.value,K=e=>V.value.days.map((t,n)=>`${W(n)},${G(t[e])}`).join(` `),We=g(()=>{let e=V.value.days.map((e,t)=>`${W(t)},${G(e.actual)}`).join(` `),t=V.value.days.length-1;return`M${W(0)},${G(0)} L${e.replaceAll(` `,` L`)} L${W(t)},${G(0)} Z`}),q=g(()=>V.value.days.findIndex(e=>e.date===I)),J=g(()=>V.value.days.find(e=>e.date===I)??V.value.days[V.value.days.length-1]),Y=g(()=>J.value?.actual??0),X=g(()=>J.value?.ideal??0),Z=g(()=>Math.round((Y.value-X.value)*10)/10),Q=g(()=>{let e=B.value;return e?(e.stories??[]).map(e=>He.value.get(e)).filter(Boolean).filter(t=>t.scopeChange&&t.scopeChange.at>=e.start&&t.scopeChange.at<=e.end).map(e=>({id:e.id,title:e.title,at:e.scopeChange.at,kind:e.scopeChange.kind,reason:e.scopeChange.reason,points:e.points,idx:V.value.days.findIndex(t=>t.date===e.scopeChange.at)})).filter(e=>e.idx>=0):[]}),Ge=g(()=>new Set(Q.value.map(e=>e.at))),$=g(()=>[...o.value].reverse().map(e=>{let t=e.start<=I&&e.end>=I;return{id:e.id,name:e.name,period:`${F(e.start)} ~ ${F(e.end)}`,stories:(e.stories??[]).length,commit:P(e),capacity:e.capacity,status:t?`进行中`:e.end<I?`已结束`:`未开始`,tone:t?`tag-primary`:e.end<I?`tag-neutral`:`tag-info`}}));return(t,r)=>{let o=ee,p=te,g=ne,v=re;return s(),f(`div`,null,[u(`div`,le,[u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(0)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(0),size:`sm`},null,8,[`tone`]),r[1]||=u(`p`,{class:`k`},`剩余故事点`,-1),u(`p`,ue,[y(c(i(Y)),1),u(`small`,null,`/ `+c(i(V).total),1)])],2),u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(1)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(1),size:`sm`},null,8,[`tone`]),r[3]||=u(`p`,{class:`k`},`理想剩余(今天)`,-1),u(`p`,de,[y(c(i(X)),1),r[2]||=u(`small`,null,`点`,-1)])],2),u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(2)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(2),size:`sm`},null,8,[`tone`]),r[5]||=u(`p`,{class:`k`},`偏差`,-1),u(`p`,{class:h([`v`,{bad:i(Z)>0,good:i(Z)<=0}])},[y(c(i(Z)>0?`+`+i(Z):i(Z)),1),r[4]||=u(`small`,null,`点`,-1)],2)],2),u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(3)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(3),size:`sm`},null,8,[`tone`]),r[6]||=u(`p`,{class:`k`},`承诺 / 容量`,-1),u(`p`,fe,[y(c(i(B)?i(P)(i(B)):0),1),u(`small`,null,`/ `+c(i(B)?.capacity??0),1)])],2),u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(4)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(4),size:`sm`},null,8,[`tone`]),r[8]||=u(`p`,{class:`k`},`范围变更`,-1),u(`p`,pe,[y(c(i(Q).length),1),r[7]||=u(`small`,null,`次`,-1)])],2)]),i(B)?(s(),f(`div`,me,[u(`div`,he,[u(`div`,ge,[u(`h2`,_e,c(i(B).name),1),u(`p`,ve,c(i(B).id)+` · `+c(i(F)(i(B).start))+` ~ `+c(i(F)(i(B).end)),1),u(`p`,ye,c(i(B).goal),1)]),l(p,{modelValue:i(z),"onUpdate:modelValue":r[0]||=e=>ae(z)?z.value=e:null,items:i(Ue),icon:`i-lucide-calendar-range`,"aria-label":`选择迭代`,class:`bd-select`},null,8,[`modelValue`,`items`])]),u(`div`,be,[r[10]||=_(`<div class="chart-legend" data-v-8a03a4f8><span class="lg" data-v-8a03a4f8><i class="sw actual" data-v-8a03a4f8></i>实际剩余</span><span class="lg" data-v-8a03a4f8><i class="sw ideal" data-v-8a03a4f8></i>理想线</span><span class="lg" data-v-8a03a4f8><i class="sw scope" data-v-8a03a4f8></i>范围变更</span></div>`,1),(s(),f(`svg`,{viewBox:`0 0 ${Be} ${Ve}`,class:`chart`,role:`img`},[r[9]||=_(`<defs data-v-8a03a4f8><linearGradient id="bd-line" x1="0" y1="0" x2="1" y2="0" data-v-8a03a4f8><stop offset="0%" stop-color="#8a63f7" data-v-8a03a4f8></stop><stop offset="100%" stop-color="#c3aefb" data-v-8a03a4f8></stop></linearGradient><linearGradient id="bd-area" x1="0" y1="0" x2="0" y2="1" data-v-8a03a4f8><stop offset="0%" stop-color="#8a63f7" stop-opacity="0.16" data-v-8a03a4f8></stop><stop offset="100%" stop-color="#8a63f7" stop-opacity="0" data-v-8a03a4f8></stop></linearGradient></defs>`,1),u(`g`,null,[(s(),f(d,null,a([0,.25,.5,.75,1],e=>u(`line`,{key:`grid`+e,x1:M,y1:G(i(U)*e),x2:938,y2:G(i(U)*e),stroke:`#f1f0ea`,"stroke-width":`1`},null,8,Se)),64)),(s(),f(d,null,a([0,.25,.5,.75,1],e=>u(`text`,{key:`gl`+e,x:32,y:G(i(U)*e)+3.5,"text-anchor":`end`,"font-size":`9.5`,fill:`#b0b4ba`},c(Math.round(i(U)*e)),9,b)),64))]),u(`path`,{d:i(We),fill:`url(#bd-area)`},null,8,x),u(`path`,{d:`M${W(0)},${G(i(U))} L${W(i(H)-1)},${G(0)}`,stroke:`#cdc9d8`,"stroke-width":`1.4`,"stroke-dasharray":`5 5`,fill:`none`},null,8,S),u(`polyline`,{points:K(`actual`),stroke:`url(#bd-line)`,"stroke-width":`2.6`,fill:`none`,"stroke-linejoin":`round`,"stroke-linecap":`round`},null,8,C),(s(!0),f(d,null,a(i(V).days,(e,t)=>(s(),f(`circle`,{key:e.date,cx:W(t),cy:G(e.actual),r:`3`,fill:`#fff`,stroke:`#8a63f7`,"stroke-width":`1.8`},null,8,w))),128)),i(q)>=0?(s(),f(`line`,{key:0,x1:W(i(q)),y1:34,x2:W(i(q)),y2:G(0),stroke:`#cf4759`,"stroke-dasharray":`3 3`,"stroke-width":`1.2`,opacity:`0.7`},null,8,T)):m(``,!0),i(q)>=0?(s(),f(`text`,{key:1,x:W(i(q)),y:28,"text-anchor":`middle`,"font-size":`9.5`,fill:`#a5382f`},`今天`,8,E)):m(``,!0),(s(!0),f(d,null,a(i(V).days,(e,t)=>se((s(),f(`text`,{key:`t`+e.date,x:W(t),y:286,"text-anchor":`middle`,"font-size":`9.5`,fill:`#b0b4ba`},c(i(F)(e.date)),9,D)),[[ce,t%Math.ceil(i(H)/10)===0]])),128)),(s(!0),f(d,null,a(i(Q),e=>(s(),f(`g`,{key:e.at+e.id},[u(`title`,null,c(e.id)+` `+c(e.title)+`:`+c(i(R)[e.kind])+`(`+c(e.at)+`,`+c(e.points)+` 点)—— `+c(e.reason),1),u(`line`,{x1:W(e.idx),y1:36,x2:W(e.idx),y2:G(0),stroke:`#3f7fd4`,"stroke-dasharray":`4 3`,"stroke-width":`1.2`,opacity:`0.8`},null,8,O),u(`circle`,{cx:W(e.idx),cy:34,r:`3`,fill:`#3f7fd4`},null,8,k)]))),128))],8,xe))]),u(`div`,A,[(s(!0),f(d,null,a(i(V).days,e=>(s(),f(`div`,{key:`row`+e.date,class:h([`cell`,{today:e.date===i(I),future:e.date>i(I),scope:i(Ge).has(e.date)}])},[u(`span`,j,c(i(F)(e.date)),1),u(`span`,Ce,c(e.actual),1),u(`span`,we,c(e.ideal),1),u(`i`,{class:`underline`,style:ie({width:(i(U)?e.actual/i(U)*100:0)+`%`})},null,4)],2))),128))]),r[12]||=u(`p`,{class:`foot dim`},`每格:日期 / 实际剩余 / 理想剩余`,-1),i(Q).length?(s(),f(`div`,Te,[u(`p`,Ee,[l(g,{name:`i-lucide-git-branch`,class:`size-3`}),y(`本迭代范围变更(`+c(i(Q).length)+`)`,1)]),u(`ul`,null,[(s(!0),f(d,null,a(i(Q),e=>(s(),f(`li`,{key:e.id},[u(`span`,De,c(i(R)[e.kind]),1),l(v,{to:`/story/${e.id}`,class:`mono link`},{default:oe(()=>[y(c(e.id),1)]),_:2},1032,[`to`]),u(`span`,null,c(e.title),1),u(`span`,Oe,`· `+c(e.at)+` · `+c(e.points)+` 点 · `+c(e.reason),1)]))),128))]),r[11]||=u(`p`,{class:`foot dim`},`竖线标出的那几天,实际剩余没有按理想线下滑,是插了活而不是团队拖。`,-1)])):m(``,!0)])):(s(),f(`div`,ke,[l(g,{name:`i-lucide-info`,class:`size-4`}),r[13]||=y(`还没有迭代数据。 `,-1)])),u(`div`,Ae,[u(`div`,je,[r[14]||=u(`h2`,{class:`h2`},`迭代对照`,-1),u(`span`,Me,c(i($).length),1),r[15]||=u(`span`,{class:`dim tip`},`点一行切换上面的燃尽图`,-1)]),u(`div`,Ne,[u(`table`,Pe,[r[16]||=u(`thead`,null,[u(`tr`,null,[u(`th`,null,`迭代`),u(`th`,null,`名称`),u(`th`,null,`周期`),u(`th`,{class:`r`},`故事`),u(`th`,{class:`r`},`承诺 / 容量`),u(`th`,null,`状态`)])],-1),u(`tbody`,null,[(s(!0),f(d,null,a(i($),e=>(s(),f(`tr`,{key:e.id,class:h({on:e.id===i(z)}),onClick:t=>z.value=e.id},[u(`td`,Ie,c(e.id),1),u(`td`,null,c(e.name),1),u(`td`,Le,c(e.period),1),u(`td`,Re,c(e.stories),1),u(`td`,ze,c(e.commit)+`/`+c(e.capacity),1),u(`td`,null,[u(`span`,{class:h([`tag`,e.tone])},c(e.status),3)])],10,Fe))),128))])])])])])}}}),[[`__scopeId`,`data-v-8a03a4f8`]]);export{N as default};
1
+ import{a as e,i as t,o as n,r as ee,s as r}from"#entry";import{t as te}from"./OKKaKILz.js";import{t as ne}from"./DJM7u8P3.js";import{t as re}from"./CI0scS-N.js";import{At as i,K as a,S as o,U as s,Xt as c,Yt as ie,b as l,d as u,gt as ae,i as d,lt as oe,m as f,ot as p,p as m,qt as h,u as g,ut as se,v as _,xt as v,y}from"./BxuBMtk_.js";import{o as ce}from"./BygIGL69.js";var le={class:`kpis`},ue={class:`v`},de={class:`v`},fe={class:`v`},pe={class:`v`},me={key:0,class:`card panel`},he={class:`panel-hd`},ge={class:`ph-l`},_e={class:`sp-name`},ve={class:`sub mono`},ye={class:`goal`},be={class:`chart-wrap`},xe=[`viewBox`],Se=[`y1`,`x2`,`y2`],b=[`x`,`y`],x=[`d`],S=[`d`],C=[`points`],w=[`cx`,`cy`],T=[`x1`,`y1`,`x2`,`y2`],E=[`x`,`y`],D=[`x`,`y`],O=[`x1`,`y1`,`x2`,`y2`],k=[`cx`,`cy`],A={class:`cells`},j={class:`cd mono`},Ce={class:`ca`},we={class:`ci dim`},Te={key:0,class:`scope`},Ee={class:`h3`},De={class:`tag tag-info`},Oe={class:`dim`},ke={key:1,class:`callout soft`},Ae={class:`card`},je={class:`card-hd`},Me={class:`tag tag-neutral`},Ne={class:`card-bd`},Pe={class:`tbl`},Fe=[`onClick`],Ie={class:`mono`},Le={class:`mono dim`},Re={class:`r`},ze={class:`r mono`},Be=980,Ve=300,M=42,N=t(o({__name:`burndown`,setup(t){let{sprints:o,burndown:N,sprintCommit:P,md:F,now:I,sprintById:L,storyById:He,SCOPE_LABEL:R}=r(),z=v(``),Ue=g(()=>[...o.value].reverse().map(e=>({label:`${e.id} · ${e.name}`,value:e.id,icon:`i-lucide-calendar-range`}))),B=g(()=>L.value.get(z.value)??o.value[o.value.length-1]),V=g(()=>B.value?N(B.value):{total:0,days:[]});p(()=>{z.value&&!L.value.has(z.value)&&(z.value=``),!z.value&&o.value.length&&(z.value=o.value[o.value.length-1].id)});let H=g(()=>V.value.days.length||1),U=g(()=>V.value.total||1),W=e=>M+e*896/(H.value-1||1),G=e=>258-e*216/U.value,K=e=>V.value.days.map((t,n)=>`${W(n)},${G(t[e])}`).join(` `),We=g(()=>{let e=V.value.days.map((e,t)=>`${W(t)},${G(e.actual)}`).join(` `),t=V.value.days.length-1;return`M${W(0)},${G(0)} L${e.replaceAll(` `,` L`)} L${W(t)},${G(0)} Z`}),q=g(()=>V.value.days.findIndex(e=>e.date===I)),J=g(()=>V.value.days.find(e=>e.date===I)??V.value.days[V.value.days.length-1]),Y=g(()=>J.value?.actual??0),X=g(()=>J.value?.ideal??0),Z=g(()=>Math.round((Y.value-X.value)*10)/10),Q=g(()=>{let e=B.value;return e?(e.stories??[]).map(e=>He.value.get(e)).filter(Boolean).filter(t=>t.scopeChange&&t.scopeChange.at>=e.start&&t.scopeChange.at<=e.end).map(e=>({id:e.id,title:e.title,at:e.scopeChange.at,kind:e.scopeChange.kind,reason:e.scopeChange.reason,points:e.points,idx:V.value.days.findIndex(t=>t.date===e.scopeChange.at)})).filter(e=>e.idx>=0):[]}),Ge=g(()=>new Set(Q.value.map(e=>e.at))),$=g(()=>[...o.value].reverse().map(e=>{let t=e.start<=I&&e.end>=I;return{id:e.id,name:e.name,period:`${F(e.start)} ~ ${F(e.end)}`,stories:(e.stories??[]).length,commit:P(e),capacity:e.capacity,status:t?`进行中`:e.end<I?`已结束`:`未开始`,tone:t?`tag-primary`:e.end<I?`tag-neutral`:`tag-info`}}));return(t,r)=>{let o=ee,p=te,g=ne,v=re;return s(),f(`div`,null,[u(`div`,le,[u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(0)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(0),size:`sm`},null,8,[`tone`]),r[1]||=u(`p`,{class:`k`},`剩余故事点`,-1),u(`p`,ue,[y(c(i(Y)),1),u(`small`,null,`/ `+c(i(V).total),1)])],2),u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(1)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(1),size:`sm`},null,8,[`tone`]),r[3]||=u(`p`,{class:`k`},`理想剩余(今天)`,-1),u(`p`,de,[y(c(i(X)),1),r[2]||=u(`small`,null,`点`,-1)])],2),u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(2)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(2),size:`sm`},null,8,[`tone`]),r[5]||=u(`p`,{class:`k`},`偏差`,-1),u(`p`,{class:h([`v`,{bad:i(Z)>0,good:i(Z)<=0}])},[y(c(i(Z)>0?`+`+i(Z):i(Z)),1),r[4]||=u(`small`,null,`点`,-1)],2)],2),u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(3)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(3),size:`sm`},null,8,[`tone`]),r[6]||=u(`p`,{class:`k`},`承诺 / 容量`,-1),u(`p`,fe,[y(c(i(B)?i(P)(i(B)):0),1),u(`small`,null,`/ `+c(i(B)?.capacity??0),1)])],2),u(`div`,{class:h([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(4)])},[l(o,{tone:(`cardTone`in t?t.cardTone:i(e))(4),size:`sm`},null,8,[`tone`]),r[8]||=u(`p`,{class:`k`},`范围变更`,-1),u(`p`,pe,[y(c(i(Q).length),1),r[7]||=u(`small`,null,`次`,-1)])],2)]),i(B)?(s(),f(`div`,me,[u(`div`,he,[u(`div`,ge,[u(`h2`,_e,c(i(B).name),1),u(`p`,ve,c(i(B).id)+` · `+c(i(F)(i(B).start))+` ~ `+c(i(F)(i(B).end)),1),u(`p`,ye,c(i(B).goal),1)]),l(p,{modelValue:i(z),"onUpdate:modelValue":r[0]||=e=>ae(z)?z.value=e:null,items:i(Ue),icon:`i-lucide-calendar-range`,"aria-label":`选择迭代`,class:`bd-select`},null,8,[`modelValue`,`items`])]),u(`div`,be,[r[10]||=_(`<div class="chart-legend" data-v-d8ba9a67><span class="lg" data-v-d8ba9a67><i class="sw actual" data-v-d8ba9a67></i>实际剩余</span><span class="lg" data-v-d8ba9a67><i class="sw ideal" data-v-d8ba9a67></i>理想线</span><span class="lg" data-v-d8ba9a67><i class="sw scope" data-v-d8ba9a67></i>范围变更</span></div>`,1),(s(),f(`svg`,{viewBox:`0 0 ${Be} ${Ve}`,class:`chart`,role:`img`},[r[9]||=_(`<defs data-v-d8ba9a67><linearGradient id="bd-line" x1="0" y1="0" x2="1" y2="0" data-v-d8ba9a67><stop offset="0%" stop-color="#8a63f7" data-v-d8ba9a67></stop><stop offset="100%" stop-color="#c3aefb" data-v-d8ba9a67></stop></linearGradient><linearGradient id="bd-area" x1="0" y1="0" x2="0" y2="1" data-v-d8ba9a67><stop offset="0%" stop-color="#8a63f7" stop-opacity="0.16" data-v-d8ba9a67></stop><stop offset="100%" stop-color="#8a63f7" stop-opacity="0" data-v-d8ba9a67></stop></linearGradient></defs>`,1),u(`g`,null,[(s(),f(d,null,a([0,.25,.5,.75,1],e=>u(`line`,{key:`grid`+e,x1:M,y1:G(i(U)*e),x2:938,y2:G(i(U)*e),stroke:`#f1f0ea`,"stroke-width":`1`},null,8,Se)),64)),(s(),f(d,null,a([0,.25,.5,.75,1],e=>u(`text`,{key:`gl`+e,x:32,y:G(i(U)*e)+3.5,"text-anchor":`end`,"font-size":`9.5`,fill:`#b0b4ba`},c(Math.round(i(U)*e)),9,b)),64))]),u(`path`,{d:i(We),fill:`url(#bd-area)`},null,8,x),u(`path`,{d:`M${W(0)},${G(i(U))} L${W(i(H)-1)},${G(0)}`,stroke:`#cdc9d8`,"stroke-width":`1.4`,"stroke-dasharray":`5 5`,fill:`none`},null,8,S),u(`polyline`,{points:K(`actual`),stroke:`url(#bd-line)`,"stroke-width":`2.6`,fill:`none`,"stroke-linejoin":`round`,"stroke-linecap":`round`},null,8,C),(s(!0),f(d,null,a(i(V).days,(e,t)=>(s(),f(`circle`,{key:e.date,cx:W(t),cy:G(e.actual),r:`3`,fill:`#fff`,stroke:`#8a63f7`,"stroke-width":`1.8`},null,8,w))),128)),i(q)>=0?(s(),f(`line`,{key:0,x1:W(i(q)),y1:34,x2:W(i(q)),y2:G(0),stroke:`#cf4759`,"stroke-dasharray":`3 3`,"stroke-width":`1.2`,opacity:`0.7`},null,8,T)):m(``,!0),i(q)>=0?(s(),f(`text`,{key:1,x:W(i(q)),y:28,"text-anchor":`middle`,"font-size":`9.5`,fill:`#a5382f`},`今天`,8,E)):m(``,!0),(s(!0),f(d,null,a(i(V).days,(e,t)=>se((s(),f(`text`,{key:`t`+e.date,x:W(t),y:286,"text-anchor":`middle`,"font-size":`9.5`,fill:`#b0b4ba`},c(i(F)(e.date)),9,D)),[[ce,t%Math.ceil(i(H)/10)===0]])),128)),(s(!0),f(d,null,a(i(Q),e=>(s(),f(`g`,{key:e.at+e.id},[u(`title`,null,c(e.id)+` `+c(e.title)+`:`+c(i(R)[e.kind])+`(`+c(e.at)+`,`+c(e.points)+` 点)—— `+c(e.reason),1),u(`line`,{x1:W(e.idx),y1:36,x2:W(e.idx),y2:G(0),stroke:`#3f7fd4`,"stroke-dasharray":`4 3`,"stroke-width":`1.2`,opacity:`0.8`},null,8,O),u(`circle`,{cx:W(e.idx),cy:34,r:`3`,fill:`#3f7fd4`},null,8,k)]))),128))],8,xe))]),u(`div`,A,[(s(!0),f(d,null,a(i(V).days,e=>(s(),f(`div`,{key:`row`+e.date,class:h([`cell`,{today:e.date===i(I),future:e.date>i(I),scope:i(Ge).has(e.date)}])},[u(`span`,j,c(i(F)(e.date)),1),u(`span`,Ce,c(e.actual),1),u(`span`,we,c(e.ideal),1),u(`i`,{class:`underline`,style:ie({width:(i(U)?e.actual/i(U)*100:0)+`%`})},null,4)],2))),128))]),r[12]||=u(`p`,{class:`foot dim`},`每格:日期 / 实际剩余 / 理想剩余`,-1),i(Q).length?(s(),f(`div`,Te,[u(`p`,Ee,[l(g,{name:`i-lucide-git-branch`,class:`size-3`}),y(`本迭代范围变更(`+c(i(Q).length)+`)`,1)]),u(`ul`,null,[(s(!0),f(d,null,a(i(Q),e=>(s(),f(`li`,{key:e.id},[u(`span`,De,c(i(R)[e.kind]),1),l(v,{to:`/story/${e.id}`,class:`mono link`},{default:oe(()=>[y(c(e.id),1)]),_:2},1032,[`to`]),u(`span`,null,c(e.title),1),u(`span`,Oe,`· `+c(e.at)+` · `+c(e.points)+` 点 · `+c(e.reason),1)]))),128))]),r[11]||=u(`p`,{class:`foot dim`},`竖线标出的那几天,实际剩余没有按理想线下滑,是插了活而不是团队拖。`,-1)])):m(``,!0)])):(s(),f(`div`,ke,[l(g,{name:`i-lucide-info`,class:`size-4`}),r[13]||=y(`还没有迭代数据。 `,-1)])),u(`div`,Ae,[u(`div`,je,[r[14]||=u(`h2`,{class:`h2`},`迭代对照`,-1),u(`span`,Me,c(i($).length),1),r[15]||=u(`span`,{class:`dim tip`},`点一行切换上面的燃尽图`,-1)]),u(`div`,Ne,[u(`table`,Pe,[r[16]||=u(`thead`,null,[u(`tr`,null,[u(`th`,null,`迭代`),u(`th`,null,`名称`),u(`th`,null,`周期`),u(`th`,{class:`r`},`故事`),u(`th`,{class:`r`},`承诺 / 容量`),u(`th`,null,`状态`)])],-1),u(`tbody`,null,[(s(!0),f(d,null,a(i($),e=>(s(),f(`tr`,{key:e.id,class:h({on:e.id===i(z)}),onClick:t=>z.value=e.id},[u(`td`,Ie,c(e.id),1),u(`td`,null,c(e.name),1),u(`td`,Le,c(e.period),1),u(`td`,Re,c(e.stories),1),u(`td`,ze,c(e.commit)+`/`+c(e.capacity),1),u(`td`,null,[u(`span`,{class:h([`tag`,e.tone])},c(e.status),3)])],10,Fe))),128))])])])])])}}}),[[`__scopeId`,`data-v-d8ba9a67`]]);export{N as default};
@@ -1 +1 @@
1
- import{t as e}from"./CI0scS-N.js";import{n as t}from"./SrNUvNwO.js";import{U as n,Xt as r,b as i,d as a,lt as o,m as s,y as c}from"./BxuBMtk_.js";import{i as l}from"#entry";var u={class:`antialiased bg-white dark:bg-neutral-950 dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-neutral-950 tracking-wide`},d={class:`max-w-520px text-center`},f=[`textContent`],p=[`textContent`],m=[`textContent`],h={class:`flex items-center justify-center w-full`},g=[`textContent`],_=l({__name:`error-404`,props:{appName:{type:String,default:`Nuxt`},status:{type:Number,default:404},statusText:{type:String,default:`Page not found`},description:{type:String,default:`Sorry, the page you are looking for could not be found.`},backHome:{type:String,default:`Go back home`},backToPrevious:{type:String,default:`Go back`}},setup(l){let _=l;return t({title:`${_.status} - ${_.statusText} | ${_.appName}`,script:[{innerHTML:`(()=>{if(!(window.history.state&&window.history.state.back||document.referrer.startsWith(window.location.origin+"/")))return;const t=document.querySelector("[data-back-home]"),e=document.querySelector("[data-back-previous]");t&&e&&(e.onclick=()=>window.history.back(),t.hidden=!0,e.hidden=!1)})();`,tagPosition:`bodyClose`}],style:[{innerHTML:`*,:after,:before{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb);--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 #0000;--un-ring-shadow:0 0 #0000;--un-shadow-inset: ;--un-shadow:0 0 #0000;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:#93c5fd80;--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }:after,:before{--un-content:""}html{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body,button{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}a{-webkit-text-decoration:inherit;text-decoration:inherit}a,button{color:inherit}button{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;padding:0;text-transform:none;cursor:pointer}[type=button],button{-webkit-appearance:button;background-color:#0000;background-image:none}h1,h2,p{margin:0}[hidden]:where(:not([hidden=until-found])){display:none}`}]}),(t,_)=>{let v=e;return n(),s(`div`,u,[a(`div`,d,[a(`h1`,{class:`font-medium leading-none mb-4 sm:text-[72px] tabular-nums text-[56px]`,textContent:r(l.status)},null,8,f),a(`h2`,{class:`font-semibold mb-2 sm:text-3xl text-2xl`,textContent:r(l.statusText)},null,8,p),a(`p`,{class:`mb-4 px-2 text-md text-neutral-500`,textContent:r(l.description)},null,8,m),a(`div`,h,[i(v,{to:`/`,"data-back-home":``,class:`font-medium hover:text-[#00DC82] text-sm underline underline-offset-3`},{default:o(()=>[c(r(l.backHome),1)]),_:1}),_[0]||=c(),a(`button`,{type:`button`,"data-back-previous":``,hidden:``,class:`appearance-none bg-transparent border-0 cursor-pointer font-medium font-sans hover:text-[#00DC82] p-0 text-inherit text-sm underline underline-offset-3`,textContent:r(l.backToPrevious)},null,8,g)])])])}}},[[`__scopeId`,`data-v-a27dea0c`]]);export{_ as default};
1
+ import{t as e}from"./CI0scS-N.js";import{n as t}from"./SrNUvNwO.js";import{U as n,Xt as r,b as i,d as a,lt as o,m as s,y as c}from"./BxuBMtk_.js";import{i as l}from"#entry";var u={class:`antialiased bg-white dark:bg-neutral-950 dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-neutral-950 tracking-wide`},d={class:`max-w-520px text-center`},f=[`textContent`],p=[`textContent`],m=[`textContent`],h={class:`flex items-center justify-center w-full`},g=[`textContent`],_=l({__name:`error-404`,props:{appName:{type:String,default:`Nuxt`},status:{type:Number,default:404},statusText:{type:String,default:`Page not found`},description:{type:String,default:`Sorry, the page you are looking for could not be found.`},backHome:{type:String,default:`Go back home`},backToPrevious:{type:String,default:`Go back`}},setup(l){let _=l;return t({title:`${_.status} - ${_.statusText} | ${_.appName}`,script:[{innerHTML:`(()=>{if(!(window.history.state&&window.history.state.back||document.referrer.startsWith(window.location.origin+"/")))return;const t=document.querySelector("[data-back-home]"),e=document.querySelector("[data-back-previous]");t&&e&&(e.onclick=()=>window.history.back(),t.hidden=!0,e.hidden=!1)})();`,tagPosition:`bodyClose`}],style:[{innerHTML:`*,:after,:before{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb);--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 #0000;--un-ring-shadow:0 0 #0000;--un-shadow-inset: ;--un-shadow:0 0 #0000;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:#93c5fd80;--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }:after,:before{--un-content:""}html{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body,button{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}a{-webkit-text-decoration:inherit;text-decoration:inherit}a,button{color:inherit}button{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;padding:0;text-transform:none;cursor:pointer}[type=button],button{-webkit-appearance:button;background-color:#0000;background-image:none}h1,h2,p{margin:0}[hidden]:where(:not([hidden=until-found])){display:none}`}]}),(t,_)=>{let v=e;return n(),s(`div`,u,[a(`div`,d,[a(`h1`,{class:`font-medium leading-none mb-4 sm:text-[72px] tabular-nums text-[56px]`,textContent:r(l.status)},null,8,f),a(`h2`,{class:`font-semibold mb-2 sm:text-3xl text-2xl`,textContent:r(l.statusText)},null,8,p),a(`p`,{class:`mb-4 px-2 text-md text-neutral-500`,textContent:r(l.description)},null,8,m),a(`div`,h,[i(v,{to:`/`,"data-back-home":``,class:`font-medium hover:text-[#00DC82] text-sm underline underline-offset-3`},{default:o(()=>[c(r(l.backHome),1)]),_:1}),_[0]||=c(),a(`button`,{type:`button`,"data-back-previous":``,hidden:``,class:`appearance-none bg-transparent border-0 cursor-pointer font-medium font-sans hover:text-[#00DC82] p-0 text-inherit text-sm underline underline-offset-3`,textContent:r(l.backToPrevious)},null,8,g)])])])}}},[[`__scopeId`,`data-v-8e352ff6`]]);export{_ as default};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./I-sGtDIB.js","./BuBzMkFZ.js","./BxuBMtk_.js","./DK3Fl9T5.js","./CFCM18fF.js","./DxBwVNyP.js","./BygIGL69.js","./SywdkA98.js","./BW3xJdEx.js","./SrNUvNwO.js","./CI0scS-N.js","./P6qlvBHA.js","./CdPGFZyy.js","./DJM7u8P3.js","./DUgGsde6.js","./BrWE0up6.js","./BE6t7Q2m.js","./DqUSsCJ2.js","./q_8bxRMt.js","./DFQDFspC.js","./C9MgRdhu.js","./BQgzP7ur.js","./CgQ30j_6.js","./DzmVW5-D.js","./B0C2jsdk.js","./CYGiZn-X.js","./C3SpAhCW.js","./Cdf_T8Xa.js","./DV4ti-Pq.js","./CXG7GZes.js","./Dki9VkAL.js","./DLr85ebo.js","./Bubk0xn-.js","./entry.BCuHiFgF.css","./C1iO5KH3.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./I-sGtDIB.js","./BuBzMkFZ.js","./BxuBMtk_.js","./DK3Fl9T5.js","./CFCM18fF.js","./DxBwVNyP.js","./BygIGL69.js","./SywdkA98.js","./BW3xJdEx.js","./SrNUvNwO.js","./CI0scS-N.js","./P6qlvBHA.js","./CdPGFZyy.js","./DJM7u8P3.js","./DUgGsde6.js","./BrWE0up6.js","./BE6t7Q2m.js","./DqUSsCJ2.js","./q_8bxRMt.js","./DFQDFspC.js","./C9MgRdhu.js","./BQgzP7ur.js","./CgQ30j_6.js","./DzmVW5-D.js","./B0C2jsdk.js","./CYGiZn-X.js","./C3SpAhCW.js","./Cdf_T8Xa.js","./DV4ti-Pq.js","./CXG7GZes.js","./Dki9VkAL.js","./DLr85ebo.js","./Bubk0xn-.js","./entry.BBv-sBnP.css","./C1iO5KH3.js"])))=>i.map(i=>d[i]);
2
2
  import{t as e}from"./DK3Fl9T5.js";import{t}from"./P6qlvBHA.js";import{b as n,o as r,v as i,y as a}from"./CFCM18fF.js";import{C as o,E as s,Et as c,S as l,at as u,et as d,gt as f,u as p,x as m}from"./BxuBMtk_.js";import{t as h}from"./CdPGFZyy.js";import"./SrNUvNwO.js";import{n as g,t as _}from"./Bubk0xn-.js";var v=`modulepreload`,y=function(e,t){return new URL(e,t).href},b={},x=function(e){return e.pathname.endsWith(`.css`)},S=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},C=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=y(t,n);let r=s(t),i=x(r);return S(b,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:v,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},w=n({docsBase:i,reporters:a}),T=`$s`;function E(...e){let t=typeof e[e.length-1]==`string`?e.pop():void 0;typeof e[0]!=`string`&&e.unshift(t);let[n,i]=e;if(!n||typeof n!=`string`)throw w.NUXT_E7009({key:n});if(i!==void 0&&typeof i!=`function`)throw w.NUXT_E7007({type:typeof i});let a=T+n,o=r(),s=c(o.payload.state,a);if(i&&(o._state[a]??={_default:i}),s.value===void 0&&i){let e=i();if(f(e))return o.payload.state[a]=e,s;s.value=e}return s}function D(e){let t=e.length,n=0,r=0,i=8997,a=0,o=33826,s=0,c=40164,l=0,u=52210;for(;n<t;)i^=e.charCodeAt(n++),r=i*435,a=o*435,s=c*435,l=u*435,s+=i<<8,l+=o<<8,a+=r>>>16,i=r&65535,s+=a>>>16,o=a&65535,u=l+(s>>>16)&65535,c=s&65535;return{high:(u<<16|c)>>>0,low:(o<<16|i)>>>0}}function O(e){let{high:t,low:n}=D(e);return BigInt(t)<<32n|BigInt(n)}var k=`0123456789abcdef`;Array.from({length:256},(e,t)=>k.charAt(t>>4)+k.charAt(t&15));function A(e){return O(e).toString(36)}var j=new Map;function M(e){let t=e();if(typeof t==`function`){let e=d(),n=E(`nuxt-icon-customize`,()=>({})),r=A(t.toString());o()?.vnode.el&&n.value[e]&&j.set(r,n.value[e])}return p(()=>{let t=e();if(typeof t!=`function`)return;let n=A(t.toString());return j.get(n)||n})}function N(e){return e.replace(/([^\w-])/g,`\\$1`)}function P(e){return e.replace(/[\\^$.*+?()[\]{}|]/g,`\\$&`)}function F(e,t,n){let r=`\\.${P(N(t))}(?:[\\w-]|\\\\.)*`,i=RegExp(`(?:^|[{};])\\s*(?::where\\((${r})\\)|(${r}))\\s*\\{`,`g`);for(let t of e.querySelectorAll(`style`)){let e=(t.textContent||``).replace(/\/\*[\s\S]*?\*\//g,``);for(let t of e.matchAll(i))n.add(t[1]||t[2])}}function I(e,t){let n=e=>{if(e=e.replace(/^:where\((.*)\)$/,`$1`).trim(),e.startsWith(`.`))return e},r=e=>{if(e?.length)for(let i of e){i?.cssRules&&r(i.cssRules);let e=i?.selectorText;if(typeof e==`string`){let r=n(e);r&&t.add(r)}}};for(let t of e.styleSheets)try{r(t.cssRules||t.rules)}catch{}}function L(e,t=globalThis.document){let n=new Set,r;return t&&F(t,e,n),{has(e){return n.has(e)?!0:(r||(r=new Set,t&&I(t,r)),r.has(e))},add(e){n.add(e)}}}function R(e,t,n){if(n){t.appendChild(e);return}let r=t.querySelector(`style, link[rel="stylesheet"]`);r?t.insertBefore(e,r):t.appendChild(e)}var z;function B(){return z?Promise.resolve(z):C(()=>import(`./I-sGtDIB.js`).then(e=>z=e),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33]),import.meta.url)}var V,H=l({name:`NuxtIconCss`,props:{name:{type:String,required:!0},customize:{type:[Function,Boolean,null],default:null,required:!1}},setup(e){let n=r(),i=t().icon,a=M(()=>e.customize),o=p(()=>{if(!e.name)return``;let t=i.cssSelectorPrefix+e.name;return a.value?t+`--customized-`+a.value:t});function c(e,t){if(!t)return;let r=e.getIcon(t);if(r)return r;let i=n.payload?.data?.[t];if(i)return e.addIcon(t,i),i}let l=p(()=>`.`+N(o.value));function d(t,n,r=!0,a=l.value){i.cssWherePseudo&&(a=`:where(${a})`);let o=t.getCachedIconCSS(n,a,_(e.customize,i.customize));return i.cssLayer&&r?`@layer ${i.cssLayer} { ${o} }`:o}{let t=V||=L(i.cssSelectorPrefix);async function n(e,n,r,a){if(t.has(a)||typeof document>`u`)return;let o=document.createElement(`style`);o.textContent=d(e,n,!0,a),R(o,document.head,i.cssLayer),t.add(a)}u(()=>e.name,e=>{let r=l.value;if(t.has(r))return;let i=t=>{let i=c(t,e);i?n(t,i,e,r):t.loadIcon(e,-1).then(i=>{i&&n(t,i,e,r)}).catch(()=>null)};z?i(z):B().then(i).catch(()=>null)},{immediate:!0})}return h(),()=>s(`span`,{class:[`iconify`,o.value]})}}),U=m(()=>C(()=>import(`./C1iO5KH3.js`).then(e=>e.NuxtIconSvg),__vite__mapDeps([34,12,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,1,33]),import.meta.url)),W=e({default:()=>G}),G=l({name:`NuxtIcon`,props:{name:{type:String,required:!0},mode:{type:String,required:!1,default:null},size:{type:[Number,String],required:!1,default:null},customize:{type:[Function,Boolean,null],default:null,required:!1}},setup(e,{slots:n}){let i=r(),a=t().icon,o=g(()=>e.name),c=p(()=>i.vueApp?.component(o.value)||((e.mode||a.mode)===`svg`?U:H)),l=p(()=>{let t=e.size||a.size;return t?{fontSize:Number.isNaN(+t)?t:t+`px`}:null});return()=>s(c.value,{...a.attrs,name:o.value,class:a.class,style:l.value,customize:e.customize},n)}});export{C as a,E as i,W as n,A as r,G as t};
@@ -1,3 +1,3 @@
1
1
  import{t as e}from"./DJM7u8P3.js";import{t}from"./CI0scS-N.js";import{I as n,i as r,s as i}from"#entry";import{At as a,B as o,I as ee,K as s,N as te,S as ne,U as c,Xt as l,Yt as re,at as ie,b as u,d,f,i as p,lt as ae,m,p as h,qt as g,s as oe,u as _,v as se,xt as v,y}from"./BxuBMtk_.js";import{c as b}from"./BygIGL69.js";var ce={added:`新增`,updated:`状态变更`,removed:`移除`},le=`更新交付记录`,x=`变更`,S=e=>typeof e==`string`?e.replace(/\s+/g,` `).trim():``;function ue(e){let t=Array.isArray(e?.changes)?e.changes:[],n=S(e?.title)||le,r=t.some(e=>e?.action===`added`)?`feat`:`chore`,i=[];for(let e of t){let t=S(e?.id);if(!t)continue;let n=S(e.title)||S(e.note),r=ce[e.action]||S(e.action)||x;e.action===`updated`&&(S(e.from)||S(e.to))&&(r+=` ${S(e.from)||`—`} → ${S(e.to)||`—`}`),i.push(`- ${t}${n?` ${n}`:``}(${r})`)}return i.length?`${r}: ${n}\n\n${i.join(`
2
2
  `)}`:`${r}: ${n}`}var de={class:`rule-top`},fe={class:`rule-ic`},pe={class:`rule-state`},me={class:`mono`},he={key:0},ge={class:`rule-cases`},_e={class:`case-when`},ve={class:`case-then`},ye={key:1,class:`lc-hist-bar`},be={class:`hist-badge`},xe={class:`hist-readonly mono`},Se=[`title`,`disabled`,`onClick`],Ce={key:2,class:`card lc-empty`},we={class:`em-ic`},Te={key:3,class:`lc`},Ee={class:`lc-hero`},De={class:`hero-body`},Oe={class:`hero-kicker`},ke={class:`k-date mono`},Ae={key:0,class:`k-time mono`},je={key:1,class:`k-today`},Me=[`title`],Ne={class:`hero-title`},Pe={key:0,class:`hero-sum`},Fe={class:`hero-meta`},Ie={class:`hero-aside`},Le={class:`ring-in`},Re={class:`lc-nav`,"aria-label":`分区导航`},ze=[`href`,`onClick`],Be={class:`lc-nav-lb`},Ve={class:`lc-nav-ct`},He={id:`lc-changes`,class:`card sec`},Ue={class:`s-hd`},We={class:`s-ic`},Ge={class:`s-count`},Ke={key:0,class:`sec-empty dim`},qe={key:1,class:`tbl-wrap`},Je={class:`tbl lc-tbl`},Ye={class:`ent`},Xe={class:`ent-top`},Ze={key:0,class:`ent-title`},Qe={key:0,class:`flow mono`},$e={class:`fl`},et={class:`fl`},tt={class:`cell-note`},nt={class:`chips`},rt=[`title`],it={key:0,class:`dim`},at={class:`two`},ot={id:`lc-extras`,class:`card sec`},st={class:`s-hd`},ct={class:`s-ic`},lt={class:`s-count`},ut={class:`sec-bd lc-extras`},dt={key:0,class:`dim`},ft={class:`x-body`},pt={class:`x-title`},mt={key:0,class:`x-detail`},ht={key:1,class:`chips x-files`},gt=[`title`],_t={id:`lc-checks`,class:`card sec`},vt={class:`s-hd`},yt={class:`s-ic tone-mint`},bt={class:`s-count`},xt={class:`sec-bd lc-checks`},St={key:0,class:`dim`},Ct={class:`v-body`},wt={class:`v-what`},Tt={key:0,class:`v-detail`},Et={key:0,id:`lc-access`,class:`card sec lc-access`},Dt={class:`s-hd`},Ot={class:`s-ic tone-sky`},kt={class:`s-count`},At={class:`sec-bd acc-grid`},jt={key:0,class:`acc-col`},Mt={class:`u-head`},Nt=[`href`],Pt={class:`u-label`},Ft=[`onClick`],It={class:`u-url mono`},Lt={key:0,class:`u-note`},Rt={key:1,class:`acc-col`},zt={class:`a-head`},Bt={key:0,class:`a-role`},Vt={class:`a-user mono`},Ht=[`onClick`],Ut={class:`a-line`},Wt={key:0,class:`a-pass mono`},Gt={key:1,class:`a-none dim`},Kt={key:0,class:`a-note`},qt={key:1,id:`lc-prep`,class:`card sec lc-prep`},Jt={class:`s-hd`},Yt={class:`s-ic tone-amber`},Xt={class:`s-count`},Zt={class:`steps`},Qt={class:`step-bd`},$t={class:`step-text`},en={key:0,class:`cmd-row`},tn={class:`cmd mono`},nn=[`onClick`],rn={key:1,class:`step-note`},an={id:`lc-scenarios`,class:`lc-sc-sec`},on={class:`s-hd solo`},sn={class:`s-ic tone-mint`},cn={class:`s-count`},ln={key:0,class:`dim sec-empty`},un={key:1,class:`lc-sc-grid`},dn={class:`sc-hd`},fn={class:`sc-id mono`},pn={class:`sc-title`},mn={key:0,class:`sc-body`},hn={class:`lc-sc-steps`},gn={class:`sc-acc`},_n={class:`sc-acc-h`},vn={class:`sc-acc-t`},yn={key:0,class:`sc-foot`},bn={key:0},xn={key:1,class:`sc-ids`},Sn={class:`two`},Cn={id:`lc-notes`,class:`card sec`},wn={class:`s-hd`},Tn={class:`s-ic`},En={class:`s-count`},Dn={class:`sec-bd`},On={key:0,class:`dim`},kn={key:1,class:`lc-notes`},An={key:0,id:`lc-open`,class:`card sec sec-warn`},jn={class:`s-hd`},Mn={class:`s-ic`},Nn={class:`s-count`},Pn={class:`sec-bd`},Fn={class:`lc-notes warn`},In={class:`lc-hist`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lc-hist-title`},Ln={class:`lc-hist-hd`},Rn={class:`lc-hist-hd-txt`},zn={class:`lc-hist-sub`},Bn={key:0,class:`lc-hist-err`},Vn={key:1,class:`lc-hist-hint dim`},Hn={key:2,class:`lc-hist-list`},Un=[`disabled`,`onClick`],Wn={class:`hist-item-main`},Gn={class:`mono`},Kn={class:`mono hist-item-hash`},qn={key:0,class:`lc-hist-hint dim`},Jn={class:`lc-hist-ft`},Yn={class:`lc-hist lc-commit`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lc-commit-title`},Xn={class:`lc-hist-hd`},Zn=[`disabled`],Qn={key:0,class:`cm-done`},$n={class:`cm-done-ic`},er={class:`cm-done-bd`},tr={class:`cm-done-t`},nr={class:`mono`},rr={class:`cm-done-s`},ir={class:`cm-done-n`},ar={key:1,class:`cm-body`},or={class:`cm-msg mono`},sr={class:`micro`},cr={key:0,class:`cm-hint dim`},lr={key:1,class:`cm-hint warn`},ur={key:2,class:`cm-hint warn`},dr={key:3,class:`cm-hint dim`},fr={key:4,class:`cm-files`},pr=[`title`],mr={key:2,class:`lc-hist-err`},hr={class:`lc-hist-ft`},gr={class:`dim`},_r={class:`cm-acts`},vr=[`disabled`],yr=[`disabled`],C=r(ne({__name:`last-change`,setup(r){let{lastChange:ne,lastChangeGit:ce,refresh:le}=i(),x=v(null),S=_(()=>x.value?.doc?.lastChange??ne.value),C=_(()=>ce.value),w=v([]),T=v(!1),E=v(!1),D=v(``),O=v(!1),br=_(()=>x.value?[x.value]:[]);async function xr(){if(!E.value){E.value=!0,D.value=``;try{let e=await n(`/api/agile/last-change/history`);w.value=e.entries??[]}catch(e){D.value=e?.data?.error||e?.message||`读不到 git 历史`}finally{E.value=!1}}}async function Sr(){T.value=!0,w.value.length||await xr()}async function Cr(e){if(!O.value){O.value=!0,D.value=``;try{x.value=await n(`/api/agile/last-change/revision`,{query:{hash:e.hash}}),T.value=!1,window.scrollTo({top:0,behavior:`smooth`})}catch(e){D.value=e?.data?.error||e?.message||`取不到这个版本`}finally{O.value=!1}}}function wr(){x.value=null,window.scrollTo({top:0,behavior:`smooth`})}let k=v(null);ie(x,async()=>{await te(),k.value?.querySelector(`.hist-tab.on`)?.scrollIntoView({inline:`nearest`,block:`nearest`})});function A(e){e.key===`Escape`&&(J.value?$():T.value&&=!1)}o(()=>window.addEventListener(`keydown`,A)),ee(()=>window.removeEventListener(`keydown`,A));let j={committed:{text:`已提交`,tone:`ok`},dirty:{text:`未提交改动`,tone:`warn`},untracked:{text:`未纳入版本库`,tone:`warn`},"no-git":{text:`非 git 仓库`,tone:`neutral`},missing:{text:`尚未生成`,tone:`neutral`}},M=_(()=>j[C.value?.state??`missing`]??j.missing),Tr=[{key:`committed`,when:`已提交`,then:`下次写入整份覆盖;上一版留在 git 历史里,点「查看历史」随时翻回来`},{key:`pending`,when:`未提交`,then:`下次写入合并:新交付接在旧记录后面,不冲掉还没入库的内容`}],Er=_(()=>{let e=C.value?.state;return e===`committed`?`committed`:e===`dirty`||e===`untracked`||e===`no-git`?`pending`:``}),Dr=_(()=>(S.value?.mergedFrom?.length??0)+1),Or=_(()=>(S.value?.mergedFrom??[]).map(e=>`${e.at??``} ${e.title??``}`.trim()).filter(Boolean).join(`
3
- `)),kr={added:`新增`,updated:`状态变更`,removed:`移除`},Ar={story:`故事`,task:`任务`},jr={pass:`通过`,fail:`失败`,partial:`部分`,skipped:`未跑`},Mr={pass:`i-lucide-check`,fail:`i-lucide-x`,partial:`i-lucide-minus`,skipped:`i-lucide-minus`},N=_(()=>S.value?.changes??[]),P=_(()=>ue(S.value??{})),F=_(()=>S.value?.extras??[]),I=_(()=>S.value?.verification??[]),L=_(()=>S.value?.scenarios??[]),R=_(()=>S.value?.preparation??[]),z=_(()=>S.value?.notes??[]),B=_(()=>S.value?.open??[]),V=_(()=>S.value?.access?.urls??[]),H=_(()=>S.value?.access?.accounts??[]),U=_(()=>I.value.filter(e=>e.result===`pass`).length),Nr=_(()=>I.value.length>0&&U.value===I.value.length),Pr=_(()=>I.value.length?Math.round(U.value/I.value.length*100):0),Fr=_(()=>[...new Set([...N.value.flatMap(e=>e.files??[]),...F.value.flatMap(e=>e.files??[])])]),Ir=e=>e.kind===`story`?e.id:e.id.replace(/-T\d+$/,``),Lr=_(()=>[{id:`lc-changes`,label:`变更清单`,icon:`i-lucide-git-commit-horizontal`,count:`${N.value.length}`,tone:`violet`},{id:`lc-extras`,label:`额外做的事`,icon:`i-lucide-sparkles`,count:`${F.value.length}`,tone:`peach`},{id:`lc-checks`,label:`验证结果`,icon:`i-lucide-badge-check`,count:`${U.value}/${I.value.length}`,tone:`mint`},...V.value.length||H.value.length?[{id:`lc-access`,label:`调试入口与账号`,icon:`i-lucide-key-round`,count:`${V.value.length+H.value.length}`,tone:`sky`}]:[],...R.value.length?[{id:`lc-prep`,label:`测试前准备`,icon:`i-lucide-terminal-square`,count:`${R.value.length}`,tone:`amber`}]:[],{id:`lc-scenarios`,label:`测试场景`,icon:`i-lucide-flask-conical`,count:`${L.value.length}`,tone:`teal`},{id:`lc-notes`,label:`说明`,icon:`i-lucide-message-square-more`,count:`${z.value.length}`,tone:`slate`},...B.value.length?[{id:`lc-open`,label:`还没做的`,icon:`i-lucide-list-todo`,count:`${B.value.length}`,tone:`rose`}]:[]]);function Rr(e){let t=document.getElementById(e);t&&(t.scrollIntoView({behavior:`smooth`,block:`start`}),history.replaceState(null,``,`#${e}`))}let W=new Date,zr=`${W.getFullYear()}-${String(W.getMonth()+1).padStart(2,`0`)}-${String(W.getDate()).padStart(2,`0`)}`,G=_(()=>(S.value?.at??``).slice(0,10)),Br=_(()=>{let e=(S.value?.at??``).slice(10).replace(/^[T ]/,``);return/^\d{2}:\d{2}/.test(e)?e:``}),Vr=_(()=>!!G.value&&G.value===zr),K=v(``);async function q(e,t){try{await navigator.clipboard.writeText(e),K.value=t,setTimeout(()=>{K.value===t&&(K.value=``)},1600)}catch{K.value=``}}let J=v(!1),Y=v(!1),X=v(``),Z=v(null),Q=v(null),Hr=_(()=>!!Z.value?.isRepo&&!Z.value?.blocked&&(Z.value?.files.length??0)>0&&!Y.value);async function Ur(){if(!Y.value){J.value=!0,X.value=``,Q.value=null,Z.value=null;try{Z.value=await n(`/api/agile/git/status`)}catch(e){X.value=e?.data?.error||e?.message||`读不到 git 状态`}}}function $(){Y.value||(J.value=!1,X.value=``,Q.value=null,Z.value=null)}async function Wr(){if(Hr.value){Y.value=!0,X.value=``;try{let{token:e}=await n(`/api/projects`);Q.value=await n(`/api/agile/git/commit`,{method:`POST`,headers:{"x-project-token":e},body:{message:P.value}}),await le()}catch(e){X.value=e?.data?.error||e?.message||`提交失败`}finally{Y.value=!1}}}return(n,r)=>{let i=e,o=t;return c(),m(p,null,[a(x)?(c(),m(`div`,ye,[d(`span`,be,[u(i,{name:`i-lucide-history`,class:`hist-badge-ic`}),r[8]||=y(`历史版本`,-1)]),d(`span`,xe,[y(`只读 · `+l(a(x).short),1),a(x).date?(c(),m(p,{key:0},[y(` · `+l(a(x).date),1)],64)):h(``,!0)]),d(`div`,{ref_key:`tabsRef`,ref:k,class:`lc-hist-tabs`},[d(`button`,{class:`hist-tab`,onClick:wr},`最新`),(c(!0),m(p,null,s(a(br),e=>(c(),m(`button`,{key:e.hash,class:g([`hist-tab`,{on:a(x)?.hash===e.hash}]),title:`${e.date} ${e.subject??``}`,disabled:a(O),onClick:t=>Cr(e)},[y(l(e.short),1),d(`i`,null,l(e.date.slice(5,16)),1)],10,Se))),128))],512),d(`button`,{class:`rule-btn`,onClick:Sr},[u(i,{name:`i-lucide-list`,class:`rule-btn-ic`}),r[9]||=y(`选择历史…`,-1)])])):(c(),m(`div`,{key:0,class:g([`lc-rule`,`is-${a(M).tone}`])},[d(`div`,de,[d(`span`,fe,[u(i,{name:`i-lucide-git-branch`,class:`rule-svg`})]),r[6]||=d(`b`,{class:`rule-title`},`写入规则`,-1),r[7]||=d(`span`,{class:`rule-file mono`},`agile/last-change.json`,-1),d(`span`,pe,[d(`i`,{class:g([`rule-dot`,`tone-${a(M).tone}`])},null,2),y(` 当前 `+l(a(M).text),1),a(C)?.state===`committed`&&a(C).hash?(c(),m(p,{key:0},[r[4]||=y(` · `,-1),d(`span`,me,l(a(C).hash),1)],64)):h(``,!0)]),d(`button`,{class:`rule-btn`,onClick:Sr},[u(i,{name:`i-lucide-history`,class:`rule-btn-ic`}),r[5]||=y(`查看历史 `,-1),a(w).length?(c(),m(`i`,he,l(a(w).length),1)):h(``,!0)])]),d(`ul`,ge,[(c(),m(p,null,s(Tr,e=>d(`li`,{key:e.key,class:g([`rule-case`,{on:a(Er)===e.key}])},[d(`span`,_e,l(e.when),1),u(i,{name:`i-lucide-arrow-right`,class:`case-arrow`}),d(`span`,ve,l(e.then),1)],2)),64))])],2)),a(S)?(c(),m(`div`,Te,[d(`header`,Ee,[d(`div`,De,[d(`p`,Oe,[r[11]||=d(`span`,{class:`k-dot`},null,-1),r[12]||=y(`最近一次交付 `,-1),r[13]||=d(`span`,{class:`k-sep`},null,-1),d(`span`,ke,l(a(G)),1),a(Br)?(c(),m(`span`,Ae,l(a(Br)),1)):h(``,!0),a(Vr)?(c(),m(`span`,je,`今天`)):h(``,!0),a(S).merged?(c(),m(`span`,{key:2,class:`k-merged`,title:a(Or)},`合并记录 · `+l(a(Dr))+` 次交付`,9,Me)):h(``,!0)]),d(`h2`,Ne,l(a(S).title),1),a(S).summary?(c(),m(`p`,Pe,l(a(S).summary),1)):h(``,!0),d(`div`,Fe,[d(`span`,null,[d(`b`,null,l(a(N).length),1),r[14]||=y(` 处变更`,-1)]),r[19]||=d(`i`,{class:`meta-sep`},null,-1),d(`span`,null,[d(`b`,null,l(a(Fr).length),1),r[15]||=y(` 个文件`,-1)]),r[20]||=d(`i`,{class:`meta-sep`},null,-1),d(`span`,null,[d(`b`,null,l(a(L).length),1),r[16]||=y(` 条测试场景`,-1)]),a(F).length?(c(),m(p,{key:0},[r[18]||=d(`i`,{class:`meta-sep`},null,-1),d(`span`,null,[d(`b`,null,l(a(F).length),1),r[17]||=y(` 项额外工作`,-1)])],64)):h(``,!0)])]),d(`div`,Ie,[d(`div`,{class:g([`ring`,{warn:a(I).length&&!a(Nr)}]),style:re({"--pct":a(Pr)})},[d(`div`,Le,[d(`b`,null,[y(l(a(U)),1),d(`small`,null,`/`+l(a(I).length||0),1)]),d(`span`,null,l(a(I).length?a(Nr)?`验证全通过`:`有未通过项`:`无验证记录`),1)])],6)])]),d(`nav`,Re,[(c(!0),m(p,null,s(a(Lr),e=>(c(),m(`a`,{key:e.id,class:g([`lc-nav-link`,`tone-${e.tone}`]),href:`#${e.id}`,onClick:b(t=>Rr(e.id),[`prevent`])},[u(i,{name:e.icon,class:`lc-nav-ic`},null,8,[`name`]),d(`span`,Be,l(e.label),1),d(`b`,Ve,l(e.count),1)],10,ze))),128))]),d(`section`,He,[d(`div`,Ue,[d(`span`,We,[u(i,{name:`i-lucide-git-commit-horizontal`,class:`s-svg`})]),r[22]||=d(`h2`,{class:`s-title`},`变更清单`,-1),d(`span`,Ge,l(a(N).length),1),r[23]||=d(`span`,{class:`s-hint`},`故事与任务各自是新增还是状态变更、动过哪些文件`,-1),a(N).length?(c(),m(`button`,{key:0,class:g([`rule-btn s-copy`,{ok:a(K)===`commit`}]),title:`按 Conventional Commits 生成:首行是标题,正文每条变更带编号与名称`,onClick:r[0]||=e=>q(a(P),`commit`)},[u(i,{name:a(K)===`commit`?`i-lucide-check`:`i-lucide-clipboard-copy`,class:`rule-btn-ic`},null,8,[`name`]),y(` `+l(a(K)===`commit`?`已复制`:`复制变更信息`),1)],2)):h(``,!0),!a(x)&&a(N).length?(c(),m(`button`,{key:1,class:`rule-btn s-commit`,title:`把这次交付整份提交进本地仓库:git add -A + git commit,不 push`,onClick:Ur},[u(i,{name:`i-lucide-git-commit-vertical`,class:`rule-btn-ic`}),r[21]||=y(`自动提交 `,-1)])):h(``,!0)]),a(N).length?(c(),m(`div`,qe,[d(`table`,Je,[r[25]||=d(`colgroup`,null,[d(`col`,{class:`c-ent`}),d(`col`,{class:`c-act`}),d(`col`),d(`col`,{class:`c-file`})],-1),r[26]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`条目`),d(`th`,null,`变更`),d(`th`,null,`变更内容`),d(`th`,null,`涉及文件`)])],-1),d(`tbody`,null,[(c(!0),m(p,null,s(a(N),(e,t)=>(c(),m(`tr`,{key:`${e.kind}-${e.id}-${t}`},[d(`td`,null,[d(`div`,Ye,[d(`div`,Xe,[d(`span`,{class:g([`kind`,`kind-${e.kind}`])},l(Ar[e.kind]??e.kind),3),u(o,{to:`/story/${Ir(e)}`,class:`ent-id mono`},{default:ae(()=>[y(l(e.id),1)]),_:2},1032,[`to`])]),e.title?(c(),m(`p`,Ze,l(e.title),1)):h(``,!0)])]),d(`td`,null,[d(`span`,{class:g([`act`,`act-${e.action}`])},l(kr[e.action]??e.action),3),e.from||e.to?(c(),m(`p`,Qe,[d(`span`,$e,l(e.from??`—`),1),r[24]||=d(`i`,null,`→`,-1),d(`span`,et,l(e.to??`—`),1)])):h(``,!0)]),d(`td`,tt,l(e.note??`—`),1),d(`td`,null,[d(`div`,nt,[(c(!0),m(p,null,s(e.files,e=>(c(),m(`span`,{key:e,class:`fchip mono`,title:e},l(e),9,rt))),128)),e.files?.length?h(``,!0):(c(),m(`span`,it,`—`))])])]))),128))])])])):(c(),m(`p`,Ke,`这次没有涉及任何故事或任务。`))]),d(`div`,at,[d(`section`,ot,[d(`div`,st,[d(`span`,ct,[u(i,{name:`i-lucide-sparkles`,class:`s-svg`})]),r[27]||=d(`h2`,{class:`s-title`},`额外做的事`,-1),d(`span`,lt,l(a(F).length),1)]),d(`div`,ut,[a(F).length?h(``,!0):(c(),m(`p`,dt,`没有计划外的改动。`)),(c(!0),m(p,null,s(a(F),(e,t)=>(c(),m(`article`,{key:t,class:`x-item`},[r[28]||=d(`span`,{class:`x-mark`},null,-1),d(`div`,ft,[d(`p`,pt,l(e.title),1),e.detail?(c(),m(`p`,mt,l(e.detail),1)):h(``,!0),e.files?.length?(c(),m(`div`,ht,[(c(!0),m(p,null,s(e.files,e=>(c(),m(`span`,{key:e,class:`fchip mono`,title:e},l(e),9,gt))),128))])):h(``,!0)])]))),128))])]),d(`section`,_t,[d(`div`,vt,[d(`span`,yt,[u(i,{name:`i-lucide-badge-check`,class:`s-svg`})]),r[29]||=d(`h2`,{class:`s-title`},`验证结果`,-1),d(`span`,bt,l(a(U))+`/`+l(a(I).length),1)]),d(`div`,xt,[a(I).length?h(``,!0):(c(),m(`p`,St,`这次没有留下验证记录。`)),(c(!0),m(p,null,s(a(I),(e,t)=>(c(),m(`div`,{key:t,class:`v-item`},[d(`span`,{class:g([`v-ic`,`v-${e.result}`])},[u(i,{name:Mr[e.result]??`i-lucide-circle`,class:`v-svg`},null,8,[`name`])],2),d(`div`,Ct,[d(`p`,wt,l(e.what),1),e.detail?(c(),m(`p`,Tt,l(e.detail),1)):h(``,!0)]),d(`span`,{class:g([`v-res`,`v-${e.result}`])},l(jr[e.result]??e.result),3)]))),128))])])]),a(V).length||a(H).length?(c(),m(`section`,Et,[d(`div`,Dt,[d(`span`,Ot,[u(i,{name:`i-lucide-key-round`,class:`s-svg`})]),r[30]||=d(`h2`,{class:`s-title`},`调试入口与账号`,-1),d(`span`,kt,l(a(V).length+a(H).length),1),r[31]||=d(`span`,{class:`s-hint`},`照着这一栏就能自己跑起来点一遍`,-1)]),d(`div`,At,[a(V).length?(c(),m(`div`,jt,[r[32]||=d(`p`,{class:`micro`},`访问地址`,-1),(c(!0),m(p,null,s(a(V),(e,t)=>(c(),m(`div`,{key:t,class:`u-item`},[d(`div`,Mt,[d(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,class:`u-link`},[d(`span`,Pt,l(e.label??`入口`),1),u(i,{name:`i-lucide-arrow-up-right`,class:`u-go`})],8,Nt),d(`button`,{class:g([`cpy`,{ok:a(K)===`url-${t}`}]),onClick:n=>q(e.url,`url-${t}`)},[u(i,{name:a(K)===`url-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),y(` `+l(a(K)===`url-${t}`?`已复制`:`复制`),1)],10,Ft)]),d(`p`,It,l(e.url),1),e.note?(c(),m(`p`,Lt,l(e.note),1)):h(``,!0)]))),128))])):h(``,!0),a(H).length?(c(),m(`div`,Rt,[r[34]||=d(`p`,{class:`micro`},`账号密码`,-1),(c(!0),m(p,null,s(a(H),(e,t)=>(c(),m(`div`,{key:t,class:`a-item`},[d(`div`,zt,[e.role?(c(),m(`span`,Bt,l(e.role),1)):h(``,!0),d(`span`,Vt,l(e.username),1),d(`button`,{class:g([`cpy`,{ok:a(K)===`acc-${t}`}]),onClick:n=>q(e.password?`账号:${e.username}\n密码:${e.password}`:e.username,`acc-${t}`)},[u(i,{name:a(K)===`acc-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),y(` `+l(a(K)===`acc-${t}`?`已复制`:`复制`),1)],10,Ht)]),d(`div`,Ut,[r[33]||=d(`span`,{class:`a-key`},`密码`,-1),e.password?(c(),m(`span`,Wt,l(e.password),1)):(c(),m(`span`,Gt,`无密码 / 走单点登录`))]),e.note?(c(),m(`p`,Kt,l(e.note),1)):h(``,!0)]))),128))])):h(``,!0)])])):h(``,!0),a(R).length?(c(),m(`section`,qt,[d(`div`,Jt,[d(`span`,Yt,[u(i,{name:`i-lucide-terminal-square`,class:`s-svg`})]),r[35]||=d(`h2`,{class:`s-title`},`测试前准备`,-1),d(`span`,Xt,l(a(R).length),1),r[36]||=d(`span`,{class:`s-hint`},`按顺序做完这些再开始点,命令可直接复制`,-1)]),d(`ol`,Zt,[(c(!0),m(p,null,s(a(R),(e,t)=>(c(),m(`li`,{key:t},[d(`div`,Qt,[d(`p`,$t,l(e.step),1),e.command?(c(),m(`div`,en,[d(`code`,tn,l(e.command),1),d(`button`,{class:g([`cpy`,{ok:a(K)===`cmd-${t}`}]),onClick:n=>q(e.command??``,`cmd-${t}`)},[u(i,{name:a(K)===`cmd-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),y(` `+l(a(K)===`cmd-${t}`?`已复制`:`复制`),1)],10,nn)])):h(``,!0),e.note?(c(),m(`p`,rn,l(e.note),1)):h(``,!0)])]))),128))])])):h(``,!0),d(`section`,an,[d(`div`,on,[d(`span`,sn,[u(i,{name:`i-lucide-flask-conical`,class:`s-svg`})]),r[37]||=d(`h2`,{class:`s-title`},`测试场景`,-1),d(`span`,cn,l(a(L).length),1),r[38]||=d(`span`,{class:`s-hint`},`一条一段:照着步骤走,末尾那句就是验收标准`,-1)]),a(L).length?(c(),m(`div`,un,[(c(!0),m(p,null,s(a(L),(e,t)=>(c(),m(`article`,{key:e.id??t,class:`sc lc-sc`},[d(`header`,dn,[d(`span`,fn,l(e.id??`TC-${t+1}`),1),d(`h3`,pn,l(e.title),1)]),e.steps?.length?(c(),m(`div`,mn,[r[39]||=d(`p`,{class:`micro`},`测试步骤`,-1),d(`ol`,hn,[(c(!0),m(p,null,s(e.steps,(e,t)=>(c(),m(`li`,{key:t},l(e),1))),128))])])):h(``,!0),d(`div`,gn,[d(`p`,_n,[u(i,{name:`i-lucide-badge-check`,class:`sc-acc-ic`}),r[40]||=y(`验收标准`,-1)]),d(`p`,vn,l(e.expect),1),e.acceptance||e.storyIds?.length?(c(),m(`div`,yn,[e.acceptance?(c(),m(`span`,bn,`对应验收:`+l(e.acceptance),1)):h(``,!0),e.storyIds?.length?(c(),m(`span`,xn,[(c(!0),m(p,null,s(e.storyIds,e=>(c(),f(o,{key:e,to:`/story/${e}`,class:`ent-id mono`},{default:ae(()=>[y(l(e),1)]),_:2},1032,[`to`]))),128))])):h(``,!0)])):h(``,!0)])]))),128))])):(c(),m(`p`,ln,`这次没有单独列测试场景。`))]),d(`div`,Sn,[d(`section`,Cn,[d(`div`,wn,[d(`span`,Tn,[u(i,{name:`i-lucide-message-square-more`,class:`s-svg`})]),r[41]||=d(`h2`,{class:`s-title`},`说明`,-1),d(`span`,En,l(a(z).length),1)]),d(`div`,Dn,[a(z).length?(c(),m(`ul`,kn,[(c(!0),m(p,null,s(a(z),(e,t)=>(c(),m(`li`,{key:t},l(e),1))),128))])):(c(),m(`p`,On,`没有额外说明。`))])]),a(B).length?(c(),m(`section`,An,[d(`div`,jn,[d(`span`,Mn,[u(i,{name:`i-lucide-list-todo`,class:`s-svg`})]),r[42]||=d(`h2`,{class:`s-title`},`还没做的`,-1),d(`span`,Nn,l(a(B).length),1)]),d(`div`,Pn,[d(`ul`,Fn,[(c(!0),m(p,null,s(a(B),(e,t)=>(c(),m(`li`,{key:t},l(e),1))),128))])])])):h(``,!0)])])):(c(),m(`div`,Ce,[d(`span`,we,[u(i,{name:`i-lucide-clipboard-list`,class:`em-svg`})]),r[10]||=se(`<h2 class="em-title" data-v-30ebd084>还没有交付记录</h2><p class="em-sub" data-v-30ebd084> 每完成一项功能,AI 都要把「改了哪些故事与任务、额外做了什么、验了什么、怎么测」 写进下面这个文件,这一页就会自动排出来。 </p><p class="em-path mono" data-v-30ebd084>agile/last-change.json</p><p class="em-note" data-v-30ebd084> 每次只保留最近一次(覆盖写,不追加)· 格式见 <span class="mono" data-v-30ebd084>.agents/skills/scrum-planning/references/schema.md</span> 第 4 节 </p>`,4)])),(c(),f(oe,{to:`body`},[a(T)?(c(),m(`div`,{key:0,class:`lc-hist-mask`,onClick:r[3]||=b(e=>T.value=!1,[`self`])},[d(`div`,In,[d(`header`,Ln,[d(`div`,Rn,[r[46]||=d(`h3`,{id:`lc-hist-title`,class:`lc-hist-title`},`历史版本`,-1),d(`p`,zn,[r[43]||=y(` 从 git 里读 `,-1),r[44]||=d(`span`,{class:`mono`},`agile/last-change.json`,-1),r[45]||=y(` 的提交记录 `,-1),a(w).length?(c(),m(p,{key:0},[y(`· 共 `+l(a(w).length)+` 版`,1)],64)):h(``,!0)])]),d(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,onClick:r[1]||=e=>T.value=!1},[u(i,{name:`i-lucide-x`,class:`lc-hist-x-ic`})])]),a(D)?(c(),m(`p`,Bn,l(a(D)),1)):a(E)?(c(),m(`div`,Vn,`正在读 git 历史…`)):(c(),m(`div`,Hn,[(c(!0),m(p,null,s(a(w),(e,t)=>(c(),m(`button`,{key:e.hash,class:g([`hist-item`,{on:a(x)?.hash===e.hash}]),disabled:a(O),onClick:t=>Cr(e)},[d(`span`,{class:g([`hist-item-dot`,{live:t===0}])},null,2),d(`span`,Wn,[d(`b`,null,l(e.subject||`(没有提交说明)`),1),d(`i`,Gn,l(e.date),1)]),d(`span`,Kn,l(e.short),1)],10,Un))),128)),a(w).length?h(``,!0):(c(),m(`p`,qn,` 这个文件还没有提交记录 —— 先 commit 一次,历史里才会出现版本。 `))])),d(`footer`,Jn,[r[47]||=d(`span`,{class:`dim`},`选一个版本即可在页面上只读查看,不会改动文件。`,-1),d(`button`,{class:`hist-close`,onClick:r[2]||=e=>T.value=!1},`关闭`)])])])):h(``,!0)])),(c(),f(oe,{to:`body`},[a(J)?(c(),m(`div`,{key:0,class:`lc-hist-mask`,onClick:b($,[`self`])},[d(`div`,Yn,[d(`header`,Xn,[r[48]||=d(`div`,{class:`lc-hist-hd-txt`},[d(`h3`,{id:`lc-commit-title`,class:`lc-hist-title`},`提交这次交付`),d(`p`,{class:`lc-hist-sub`},[y(` 将执行 `),d(`span`,{class:`mono`},`git add -A`),y(` + `),d(`span`,{class:`mono`},`git commit`),y(`,只提交到本地,不 push `)])],-1),d(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,disabled:a(Y),onClick:$},[u(i,{name:`i-lucide-x`,class:`lc-hist-x-ic`})],8,Zn)]),a(Q)?(c(),m(`div`,Qn,[d(`span`,$n,[u(i,{name:`i-lucide-check`,class:`cm-done-svg`})]),d(`div`,er,[d(`p`,tr,[r[49]||=y(`已提交 `,-1),d(`span`,nr,l(a(Q).hash),1)]),d(`p`,rr,l(a(Q).subject),1),d(`p`,ir,l(a(Q).files)+` 个文件 · 分支 `+l(a(Q).branch??`分离头指针`),1)])])):(c(),m(`div`,ar,[r[51]||=d(`p`,{class:`micro`},`提交信息`,-1),d(`pre`,or,l(a(P)),1),d(`p`,sr,[r[50]||=y(` 将提交的文件`,-1),a(Z)?(c(),m(p,{key:0},[y(` · `+l(a(Z).files.length),1)],64)):h(``,!0)]),!a(Z)&&!a(X)?(c(),m(`p`,cr,`正在读 git 状态…`)):a(Z)&&!a(Z).isRepo?(c(),m(`p`,lr,`这个目录不是 git 仓库,没法自动提交。`)):a(Z)?.blocked?(c(),m(`p`,ur,l(a(Z).blocked),1)):a(Z)?.files.length?(c(),m(`ul`,fr,[(c(!0),m(p,null,s(a(Z).files,e=>(c(),m(`li`,{key:e.path,class:`cm-file`},[d(`span`,{class:g([`cm-code`,e.code===`??`?`cm-new`:`cm-mod`])},l(e.code),3),d(`span`,{class:`mono cm-path`,title:e.path},l(e.path),9,pr)]))),128))])):(c(),m(`p`,dr,`没有未提交的改动,不需要提交。`))])),a(X)?(c(),m(`p`,mr,l(a(X)),1)):h(``,!0),d(`footer`,hr,[d(`span`,gr,l(a(Z)?.branch?`当前分支 ${a(Z).branch}`:`提交后工作区应当是干净的`),1),d(`span`,_r,[d(`button`,{class:`hist-close`,disabled:a(Y),onClick:$},l(a(Q)?`关闭`:`取消`),9,vr),a(Q)?h(``,!0):(c(),m(`button`,{key:0,class:`cm-go`,disabled:!a(Hr),onClick:Wr},l(a(Y)?`提交中…`:`确认提交`),9,yr))])])])])):h(``,!0)]))],64)}}}),[[`__scopeId`,`data-v-30ebd084`]]);export{C as default};
3
+ `)),kr={added:`新增`,updated:`状态变更`,removed:`移除`},Ar={story:`故事`,task:`任务`},jr={pass:`通过`,fail:`失败`,partial:`部分`,skipped:`未跑`},Mr={pass:`i-lucide-check`,fail:`i-lucide-x`,partial:`i-lucide-minus`,skipped:`i-lucide-minus`},N=_(()=>S.value?.changes??[]),P=_(()=>ue(S.value??{})),F=_(()=>S.value?.extras??[]),I=_(()=>S.value?.verification??[]),L=_(()=>S.value?.scenarios??[]),R=_(()=>S.value?.preparation??[]),z=_(()=>S.value?.notes??[]),B=_(()=>S.value?.open??[]),V=_(()=>S.value?.access?.urls??[]),H=_(()=>S.value?.access?.accounts??[]),U=_(()=>I.value.filter(e=>e.result===`pass`).length),Nr=_(()=>I.value.length>0&&U.value===I.value.length),Pr=_(()=>I.value.length?Math.round(U.value/I.value.length*100):0),Fr=_(()=>[...new Set([...N.value.flatMap(e=>e.files??[]),...F.value.flatMap(e=>e.files??[])])]),Ir=e=>e.kind===`story`?e.id:e.id.replace(/-T\d+$/,``),Lr=_(()=>[{id:`lc-changes`,label:`变更清单`,icon:`i-lucide-git-commit-horizontal`,count:`${N.value.length}`,tone:`violet`},{id:`lc-extras`,label:`额外做的事`,icon:`i-lucide-sparkles`,count:`${F.value.length}`,tone:`peach`},{id:`lc-checks`,label:`验证结果`,icon:`i-lucide-badge-check`,count:`${U.value}/${I.value.length}`,tone:`mint`},...V.value.length||H.value.length?[{id:`lc-access`,label:`调试入口与账号`,icon:`i-lucide-key-round`,count:`${V.value.length+H.value.length}`,tone:`sky`}]:[],...R.value.length?[{id:`lc-prep`,label:`测试前准备`,icon:`i-lucide-terminal-square`,count:`${R.value.length}`,tone:`amber`}]:[],{id:`lc-scenarios`,label:`测试场景`,icon:`i-lucide-flask-conical`,count:`${L.value.length}`,tone:`teal`},{id:`lc-notes`,label:`说明`,icon:`i-lucide-message-square-more`,count:`${z.value.length}`,tone:`slate`},...B.value.length?[{id:`lc-open`,label:`还没做的`,icon:`i-lucide-list-todo`,count:`${B.value.length}`,tone:`rose`}]:[]]);function Rr(e){let t=document.getElementById(e);t&&(t.scrollIntoView({behavior:`smooth`,block:`start`}),history.replaceState(null,``,`#${e}`))}let W=new Date,zr=`${W.getFullYear()}-${String(W.getMonth()+1).padStart(2,`0`)}-${String(W.getDate()).padStart(2,`0`)}`,G=_(()=>(S.value?.at??``).slice(0,10)),Br=_(()=>{let e=(S.value?.at??``).slice(10).replace(/^[T ]/,``);return/^\d{2}:\d{2}/.test(e)?e:``}),Vr=_(()=>!!G.value&&G.value===zr),K=v(``);async function q(e,t){try{await navigator.clipboard.writeText(e),K.value=t,setTimeout(()=>{K.value===t&&(K.value=``)},1600)}catch{K.value=``}}let J=v(!1),Y=v(!1),X=v(``),Z=v(null),Q=v(null),Hr=_(()=>!!Z.value?.isRepo&&!Z.value?.blocked&&(Z.value?.files.length??0)>0&&!Y.value);async function Ur(){if(!Y.value){J.value=!0,X.value=``,Q.value=null,Z.value=null;try{Z.value=await n(`/api/agile/git/status`)}catch(e){X.value=e?.data?.error||e?.message||`读不到 git 状态`}}}function $(){Y.value||(J.value=!1,X.value=``,Q.value=null,Z.value=null)}async function Wr(){if(Hr.value){Y.value=!0,X.value=``;try{let{token:e}=await n(`/api/projects`);Q.value=await n(`/api/agile/git/commit`,{method:`POST`,headers:{"x-project-token":e},body:{message:P.value}}),await le()}catch(e){X.value=e?.data?.error||e?.message||`提交失败`}finally{Y.value=!1}}}return(n,r)=>{let i=e,o=t;return c(),m(p,null,[a(x)?(c(),m(`div`,ye,[d(`span`,be,[u(i,{name:`i-lucide-history`,class:`hist-badge-ic`}),r[8]||=y(`历史版本`,-1)]),d(`span`,xe,[y(`只读 · `+l(a(x).short),1),a(x).date?(c(),m(p,{key:0},[y(` · `+l(a(x).date),1)],64)):h(``,!0)]),d(`div`,{ref_key:`tabsRef`,ref:k,class:`lc-hist-tabs`},[d(`button`,{class:`hist-tab`,onClick:wr},`最新`),(c(!0),m(p,null,s(a(br),e=>(c(),m(`button`,{key:e.hash,class:g([`hist-tab`,{on:a(x)?.hash===e.hash}]),title:`${e.date} ${e.subject??``}`,disabled:a(O),onClick:t=>Cr(e)},[y(l(e.short),1),d(`i`,null,l(e.date.slice(5,16)),1)],10,Se))),128))],512),d(`button`,{class:`rule-btn`,onClick:Sr},[u(i,{name:`i-lucide-list`,class:`rule-btn-ic`}),r[9]||=y(`选择历史…`,-1)])])):(c(),m(`div`,{key:0,class:g([`lc-rule`,`is-${a(M).tone}`])},[d(`div`,de,[d(`span`,fe,[u(i,{name:`i-lucide-git-branch`,class:`rule-svg`})]),r[6]||=d(`b`,{class:`rule-title`},`写入规则`,-1),r[7]||=d(`span`,{class:`rule-file mono`},`agile/last-change.json`,-1),d(`span`,pe,[d(`i`,{class:g([`rule-dot`,`tone-${a(M).tone}`])},null,2),y(` 当前 `+l(a(M).text),1),a(C)?.state===`committed`&&a(C).hash?(c(),m(p,{key:0},[r[4]||=y(` · `,-1),d(`span`,me,l(a(C).hash),1)],64)):h(``,!0)]),d(`button`,{class:`rule-btn`,onClick:Sr},[u(i,{name:`i-lucide-history`,class:`rule-btn-ic`}),r[5]||=y(`查看历史 `,-1),a(w).length?(c(),m(`i`,he,l(a(w).length),1)):h(``,!0)])]),d(`ul`,ge,[(c(),m(p,null,s(Tr,e=>d(`li`,{key:e.key,class:g([`rule-case`,{on:a(Er)===e.key}])},[d(`span`,_e,l(e.when),1),u(i,{name:`i-lucide-arrow-right`,class:`case-arrow`}),d(`span`,ve,l(e.then),1)],2)),64))])],2)),a(S)?(c(),m(`div`,Te,[d(`header`,Ee,[d(`div`,De,[d(`p`,Oe,[r[11]||=d(`span`,{class:`k-dot`},null,-1),r[12]||=y(`最近一次交付 `,-1),r[13]||=d(`span`,{class:`k-sep`},null,-1),d(`span`,ke,l(a(G)),1),a(Br)?(c(),m(`span`,Ae,l(a(Br)),1)):h(``,!0),a(Vr)?(c(),m(`span`,je,`今天`)):h(``,!0),a(S).merged?(c(),m(`span`,{key:2,class:`k-merged`,title:a(Or)},`合并记录 · `+l(a(Dr))+` 次交付`,9,Me)):h(``,!0)]),d(`h2`,Ne,l(a(S).title),1),a(S).summary?(c(),m(`p`,Pe,l(a(S).summary),1)):h(``,!0),d(`div`,Fe,[d(`span`,null,[d(`b`,null,l(a(N).length),1),r[14]||=y(` 处变更`,-1)]),r[19]||=d(`i`,{class:`meta-sep`},null,-1),d(`span`,null,[d(`b`,null,l(a(Fr).length),1),r[15]||=y(` 个文件`,-1)]),r[20]||=d(`i`,{class:`meta-sep`},null,-1),d(`span`,null,[d(`b`,null,l(a(L).length),1),r[16]||=y(` 条测试场景`,-1)]),a(F).length?(c(),m(p,{key:0},[r[18]||=d(`i`,{class:`meta-sep`},null,-1),d(`span`,null,[d(`b`,null,l(a(F).length),1),r[17]||=y(` 项额外工作`,-1)])],64)):h(``,!0)])]),d(`div`,Ie,[d(`div`,{class:g([`ring`,{warn:a(I).length&&!a(Nr)}]),style:re({"--pct":a(Pr)})},[d(`div`,Le,[d(`b`,null,[y(l(a(U)),1),d(`small`,null,`/`+l(a(I).length||0),1)]),d(`span`,null,l(a(I).length?a(Nr)?`验证全通过`:`有未通过项`:`无验证记录`),1)])],6)])]),d(`nav`,Re,[(c(!0),m(p,null,s(a(Lr),e=>(c(),m(`a`,{key:e.id,class:g([`lc-nav-link`,`tone-${e.tone}`]),href:`#${e.id}`,onClick:b(t=>Rr(e.id),[`prevent`])},[u(i,{name:e.icon,class:`lc-nav-ic`},null,8,[`name`]),d(`span`,Be,l(e.label),1),d(`b`,Ve,l(e.count),1)],10,ze))),128))]),d(`section`,He,[d(`div`,Ue,[d(`span`,We,[u(i,{name:`i-lucide-git-commit-horizontal`,class:`s-svg`})]),r[22]||=d(`h2`,{class:`s-title`},`变更清单`,-1),d(`span`,Ge,l(a(N).length),1),r[23]||=d(`span`,{class:`s-hint`},`故事与任务各自是新增还是状态变更、动过哪些文件`,-1),a(N).length?(c(),m(`button`,{key:0,class:g([`rule-btn s-copy`,{ok:a(K)===`commit`}]),title:`按 Conventional Commits 生成:首行是标题,正文每条变更带编号与名称`,onClick:r[0]||=e=>q(a(P),`commit`)},[u(i,{name:a(K)===`commit`?`i-lucide-check`:`i-lucide-clipboard-copy`,class:`rule-btn-ic`},null,8,[`name`]),y(` `+l(a(K)===`commit`?`已复制`:`复制变更信息`),1)],2)):h(``,!0),!a(x)&&a(N).length?(c(),m(`button`,{key:1,class:`rule-btn s-commit`,title:`把这次交付整份提交进本地仓库:git add -A + git commit,不 push`,onClick:Ur},[u(i,{name:`i-lucide-git-commit-vertical`,class:`rule-btn-ic`}),r[21]||=y(`自动提交 `,-1)])):h(``,!0)]),a(N).length?(c(),m(`div`,qe,[d(`table`,Je,[r[25]||=d(`colgroup`,null,[d(`col`,{class:`c-ent`}),d(`col`,{class:`c-act`}),d(`col`),d(`col`,{class:`c-file`})],-1),r[26]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`条目`),d(`th`,null,`变更`),d(`th`,null,`变更内容`),d(`th`,null,`涉及文件`)])],-1),d(`tbody`,null,[(c(!0),m(p,null,s(a(N),(e,t)=>(c(),m(`tr`,{key:`${e.kind}-${e.id}-${t}`},[d(`td`,null,[d(`div`,Ye,[d(`div`,Xe,[d(`span`,{class:g([`kind`,`kind-${e.kind}`])},l(Ar[e.kind]??e.kind),3),u(o,{to:`/story/${Ir(e)}`,class:`ent-id mono`},{default:ae(()=>[y(l(e.id),1)]),_:2},1032,[`to`])]),e.title?(c(),m(`p`,Ze,l(e.title),1)):h(``,!0)])]),d(`td`,null,[d(`span`,{class:g([`act`,`act-${e.action}`])},l(kr[e.action]??e.action),3),e.from||e.to?(c(),m(`p`,Qe,[d(`span`,$e,l(e.from??`—`),1),r[24]||=d(`i`,null,`→`,-1),d(`span`,et,l(e.to??`—`),1)])):h(``,!0)]),d(`td`,tt,l(e.note??`—`),1),d(`td`,null,[d(`div`,nt,[(c(!0),m(p,null,s(e.files,e=>(c(),m(`span`,{key:e,class:`fchip mono`,title:e},l(e),9,rt))),128)),e.files?.length?h(``,!0):(c(),m(`span`,it,`—`))])])]))),128))])])])):(c(),m(`p`,Ke,`这次没有涉及任何故事或任务。`))]),d(`div`,at,[d(`section`,ot,[d(`div`,st,[d(`span`,ct,[u(i,{name:`i-lucide-sparkles`,class:`s-svg`})]),r[27]||=d(`h2`,{class:`s-title`},`额外做的事`,-1),d(`span`,lt,l(a(F).length),1)]),d(`div`,ut,[a(F).length?h(``,!0):(c(),m(`p`,dt,`没有计划外的改动。`)),(c(!0),m(p,null,s(a(F),(e,t)=>(c(),m(`article`,{key:t,class:`x-item`},[r[28]||=d(`span`,{class:`x-mark`},null,-1),d(`div`,ft,[d(`p`,pt,l(e.title),1),e.detail?(c(),m(`p`,mt,l(e.detail),1)):h(``,!0),e.files?.length?(c(),m(`div`,ht,[(c(!0),m(p,null,s(e.files,e=>(c(),m(`span`,{key:e,class:`fchip mono`,title:e},l(e),9,gt))),128))])):h(``,!0)])]))),128))])]),d(`section`,_t,[d(`div`,vt,[d(`span`,yt,[u(i,{name:`i-lucide-badge-check`,class:`s-svg`})]),r[29]||=d(`h2`,{class:`s-title`},`验证结果`,-1),d(`span`,bt,l(a(U))+`/`+l(a(I).length),1)]),d(`div`,xt,[a(I).length?h(``,!0):(c(),m(`p`,St,`这次没有留下验证记录。`)),(c(!0),m(p,null,s(a(I),(e,t)=>(c(),m(`div`,{key:t,class:`v-item`},[d(`span`,{class:g([`v-ic`,`v-${e.result}`])},[u(i,{name:Mr[e.result]??`i-lucide-circle`,class:`v-svg`},null,8,[`name`])],2),d(`div`,Ct,[d(`p`,wt,l(e.what),1),e.detail?(c(),m(`p`,Tt,l(e.detail),1)):h(``,!0)]),d(`span`,{class:g([`v-res`,`v-${e.result}`])},l(jr[e.result]??e.result),3)]))),128))])])]),a(V).length||a(H).length?(c(),m(`section`,Et,[d(`div`,Dt,[d(`span`,Ot,[u(i,{name:`i-lucide-key-round`,class:`s-svg`})]),r[30]||=d(`h2`,{class:`s-title`},`调试入口与账号`,-1),d(`span`,kt,l(a(V).length+a(H).length),1),r[31]||=d(`span`,{class:`s-hint`},`照着这一栏就能自己跑起来点一遍`,-1)]),d(`div`,At,[a(V).length?(c(),m(`div`,jt,[r[32]||=d(`p`,{class:`micro`},`访问地址`,-1),(c(!0),m(p,null,s(a(V),(e,t)=>(c(),m(`div`,{key:t,class:`u-item`},[d(`div`,Mt,[d(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,class:`u-link`},[d(`span`,Pt,l(e.label??`入口`),1),u(i,{name:`i-lucide-arrow-up-right`,class:`u-go`})],8,Nt),d(`button`,{class:g([`cpy`,{ok:a(K)===`url-${t}`}]),onClick:n=>q(e.url,`url-${t}`)},[u(i,{name:a(K)===`url-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),y(` `+l(a(K)===`url-${t}`?`已复制`:`复制`),1)],10,Ft)]),d(`p`,It,l(e.url),1),e.note?(c(),m(`p`,Lt,l(e.note),1)):h(``,!0)]))),128))])):h(``,!0),a(H).length?(c(),m(`div`,Rt,[r[34]||=d(`p`,{class:`micro`},`账号密码`,-1),(c(!0),m(p,null,s(a(H),(e,t)=>(c(),m(`div`,{key:t,class:`a-item`},[d(`div`,zt,[e.role?(c(),m(`span`,Bt,l(e.role),1)):h(``,!0),d(`span`,Vt,l(e.username),1),d(`button`,{class:g([`cpy`,{ok:a(K)===`acc-${t}`}]),onClick:n=>q(e.password?`账号:${e.username}\n密码:${e.password}`:e.username,`acc-${t}`)},[u(i,{name:a(K)===`acc-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),y(` `+l(a(K)===`acc-${t}`?`已复制`:`复制`),1)],10,Ht)]),d(`div`,Ut,[r[33]||=d(`span`,{class:`a-key`},`密码`,-1),e.password?(c(),m(`span`,Wt,l(e.password),1)):(c(),m(`span`,Gt,`无密码 / 走单点登录`))]),e.note?(c(),m(`p`,Kt,l(e.note),1)):h(``,!0)]))),128))])):h(``,!0)])])):h(``,!0),a(R).length?(c(),m(`section`,qt,[d(`div`,Jt,[d(`span`,Yt,[u(i,{name:`i-lucide-terminal-square`,class:`s-svg`})]),r[35]||=d(`h2`,{class:`s-title`},`测试前准备`,-1),d(`span`,Xt,l(a(R).length),1),r[36]||=d(`span`,{class:`s-hint`},`按顺序做完这些再开始点,命令可直接复制`,-1)]),d(`ol`,Zt,[(c(!0),m(p,null,s(a(R),(e,t)=>(c(),m(`li`,{key:t},[d(`div`,Qt,[d(`p`,$t,l(e.step),1),e.command?(c(),m(`div`,en,[d(`code`,tn,l(e.command),1),d(`button`,{class:g([`cpy`,{ok:a(K)===`cmd-${t}`}]),onClick:n=>q(e.command??``,`cmd-${t}`)},[u(i,{name:a(K)===`cmd-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),y(` `+l(a(K)===`cmd-${t}`?`已复制`:`复制`),1)],10,nn)])):h(``,!0),e.note?(c(),m(`p`,rn,l(e.note),1)):h(``,!0)])]))),128))])])):h(``,!0),d(`section`,an,[d(`div`,on,[d(`span`,sn,[u(i,{name:`i-lucide-flask-conical`,class:`s-svg`})]),r[37]||=d(`h2`,{class:`s-title`},`测试场景`,-1),d(`span`,cn,l(a(L).length),1),r[38]||=d(`span`,{class:`s-hint`},`一条一段:照着步骤走,末尾那句就是验收标准`,-1)]),a(L).length?(c(),m(`div`,un,[(c(!0),m(p,null,s(a(L),(e,t)=>(c(),m(`article`,{key:e.id??t,class:`sc lc-sc`},[d(`header`,dn,[d(`span`,fn,l(e.id??`TC-${t+1}`),1),d(`h3`,pn,l(e.title),1)]),e.steps?.length?(c(),m(`div`,mn,[r[39]||=d(`p`,{class:`micro`},`测试步骤`,-1),d(`ol`,hn,[(c(!0),m(p,null,s(e.steps,(e,t)=>(c(),m(`li`,{key:t},l(e),1))),128))])])):h(``,!0),d(`div`,gn,[d(`p`,_n,[u(i,{name:`i-lucide-badge-check`,class:`sc-acc-ic`}),r[40]||=y(`验收标准`,-1)]),d(`p`,vn,l(e.expect),1),e.acceptance||e.storyIds?.length?(c(),m(`div`,yn,[e.acceptance?(c(),m(`span`,bn,`对应验收:`+l(e.acceptance),1)):h(``,!0),e.storyIds?.length?(c(),m(`span`,xn,[(c(!0),m(p,null,s(e.storyIds,e=>(c(),f(o,{key:e,to:`/story/${e}`,class:`ent-id mono`},{default:ae(()=>[y(l(e),1)]),_:2},1032,[`to`]))),128))])):h(``,!0)])):h(``,!0)])]))),128))])):(c(),m(`p`,ln,`这次没有单独列测试场景。`))]),d(`div`,Sn,[d(`section`,Cn,[d(`div`,wn,[d(`span`,Tn,[u(i,{name:`i-lucide-message-square-more`,class:`s-svg`})]),r[41]||=d(`h2`,{class:`s-title`},`说明`,-1),d(`span`,En,l(a(z).length),1)]),d(`div`,Dn,[a(z).length?(c(),m(`ul`,kn,[(c(!0),m(p,null,s(a(z),(e,t)=>(c(),m(`li`,{key:t},l(e),1))),128))])):(c(),m(`p`,On,`没有额外说明。`))])]),a(B).length?(c(),m(`section`,An,[d(`div`,jn,[d(`span`,Mn,[u(i,{name:`i-lucide-list-todo`,class:`s-svg`})]),r[42]||=d(`h2`,{class:`s-title`},`还没做的`,-1),d(`span`,Nn,l(a(B).length),1)]),d(`div`,Pn,[d(`ul`,Fn,[(c(!0),m(p,null,s(a(B),(e,t)=>(c(),m(`li`,{key:t},l(e),1))),128))])])])):h(``,!0)])])):(c(),m(`div`,Ce,[d(`span`,we,[u(i,{name:`i-lucide-clipboard-list`,class:`em-svg`})]),r[10]||=se(`<h2 class="em-title" data-v-0c6b2b03>还没有交付记录</h2><p class="em-sub" data-v-0c6b2b03> 每完成一项功能,AI 都要把「改了哪些故事与任务、额外做了什么、验了什么、怎么测」 写进下面这个文件,这一页就会自动排出来。 </p><p class="em-path mono" data-v-0c6b2b03>agile/last-change.json</p><p class="em-note" data-v-0c6b2b03> 每次只保留最近一次(覆盖写,不追加)· 格式见 <span class="mono" data-v-0c6b2b03>.agents/skills/scrum-planning/references/schema.md</span> 第 4 节 </p>`,4)])),(c(),f(oe,{to:`body`},[a(T)?(c(),m(`div`,{key:0,class:`lc-hist-mask`,onClick:r[3]||=b(e=>T.value=!1,[`self`])},[d(`div`,In,[d(`header`,Ln,[d(`div`,Rn,[r[46]||=d(`h3`,{id:`lc-hist-title`,class:`lc-hist-title`},`历史版本`,-1),d(`p`,zn,[r[43]||=y(` 从 git 里读 `,-1),r[44]||=d(`span`,{class:`mono`},`agile/last-change.json`,-1),r[45]||=y(` 的提交记录 `,-1),a(w).length?(c(),m(p,{key:0},[y(`· 共 `+l(a(w).length)+` 版`,1)],64)):h(``,!0)])]),d(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,onClick:r[1]||=e=>T.value=!1},[u(i,{name:`i-lucide-x`,class:`lc-hist-x-ic`})])]),a(D)?(c(),m(`p`,Bn,l(a(D)),1)):a(E)?(c(),m(`div`,Vn,`正在读 git 历史…`)):(c(),m(`div`,Hn,[(c(!0),m(p,null,s(a(w),(e,t)=>(c(),m(`button`,{key:e.hash,class:g([`hist-item`,{on:a(x)?.hash===e.hash}]),disabled:a(O),onClick:t=>Cr(e)},[d(`span`,{class:g([`hist-item-dot`,{live:t===0}])},null,2),d(`span`,Wn,[d(`b`,null,l(e.subject||`(没有提交说明)`),1),d(`i`,Gn,l(e.date),1)]),d(`span`,Kn,l(e.short),1)],10,Un))),128)),a(w).length?h(``,!0):(c(),m(`p`,qn,` 这个文件还没有提交记录 —— 先 commit 一次,历史里才会出现版本。 `))])),d(`footer`,Jn,[r[47]||=d(`span`,{class:`dim`},`选一个版本即可在页面上只读查看,不会改动文件。`,-1),d(`button`,{class:`hist-close`,onClick:r[2]||=e=>T.value=!1},`关闭`)])])])):h(``,!0)])),(c(),f(oe,{to:`body`},[a(J)?(c(),m(`div`,{key:0,class:`lc-hist-mask`,onClick:b($,[`self`])},[d(`div`,Yn,[d(`header`,Xn,[r[48]||=d(`div`,{class:`lc-hist-hd-txt`},[d(`h3`,{id:`lc-commit-title`,class:`lc-hist-title`},`提交这次交付`),d(`p`,{class:`lc-hist-sub`},[y(` 将执行 `),d(`span`,{class:`mono`},`git add -A`),y(` + `),d(`span`,{class:`mono`},`git commit`),y(`,只提交到本地,不 push `)])],-1),d(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,disabled:a(Y),onClick:$},[u(i,{name:`i-lucide-x`,class:`lc-hist-x-ic`})],8,Zn)]),a(Q)?(c(),m(`div`,Qn,[d(`span`,$n,[u(i,{name:`i-lucide-check`,class:`cm-done-svg`})]),d(`div`,er,[d(`p`,tr,[r[49]||=y(`已提交 `,-1),d(`span`,nr,l(a(Q).hash),1)]),d(`p`,rr,l(a(Q).subject),1),d(`p`,ir,l(a(Q).files)+` 个文件 · 分支 `+l(a(Q).branch??`分离头指针`),1)])])):(c(),m(`div`,ar,[r[51]||=d(`p`,{class:`micro`},`提交信息`,-1),d(`pre`,or,l(a(P)),1),d(`p`,sr,[r[50]||=y(` 将提交的文件`,-1),a(Z)?(c(),m(p,{key:0},[y(` · `+l(a(Z).files.length),1)],64)):h(``,!0)]),!a(Z)&&!a(X)?(c(),m(`p`,cr,`正在读 git 状态…`)):a(Z)&&!a(Z).isRepo?(c(),m(`p`,lr,`这个目录不是 git 仓库,没法自动提交。`)):a(Z)?.blocked?(c(),m(`p`,ur,l(a(Z).blocked),1)):a(Z)?.files.length?(c(),m(`ul`,fr,[(c(!0),m(p,null,s(a(Z).files,e=>(c(),m(`li`,{key:e.path,class:`cm-file`},[d(`span`,{class:g([`cm-code`,e.code===`??`?`cm-new`:`cm-mod`])},l(e.code),3),d(`span`,{class:`mono cm-path`,title:e.path},l(e.path),9,pr)]))),128))])):(c(),m(`p`,dr,`没有未提交的改动,不需要提交。`))])),a(X)?(c(),m(`p`,mr,l(a(X)),1)):h(``,!0),d(`footer`,hr,[d(`span`,gr,l(a(Z)?.branch?`当前分支 ${a(Z).branch}`:`提交后工作区应当是干净的`),1),d(`span`,_r,[d(`button`,{class:`hist-close`,disabled:a(Y),onClick:$},l(a(Q)?`关闭`:`取消`),9,vr),a(Q)?h(``,!0):(c(),m(`button`,{key:0,class:`cm-go`,disabled:!a(Hr),onClick:Wr},l(a(Y)?`提交中…`:`确认提交`),9,yr))])])])])):h(``,!0)]))],64)}}}),[[`__scopeId`,`data-v-0c6b2b03`]]);export{C as default};
@@ -1 +1 @@
1
- import{a as e,i as t,o as n,r as ee,s as r}from"#entry";import{t as te}from"./DJM7u8P3.js";import{t as ne}from"./CI0scS-N.js";import{At as i,K as a,S as o,U as s,Xt as c,Yt as l,b as u,d,f as re,gt as ie,i as f,lt as p,m,p as h,qt as g,u as _,ut as ae,xt as v,y}from"./BxuBMtk_.js";import{a as oe,c as se}from"./BygIGL69.js";var ce={class:`tests-page`},le={class:`page-anchor`,"aria-label":`页内跳转`},ue=[`href`,`onClick`],de={id:`tc-overview`,class:`kpis`},fe={class:`v`},pe={class:`v`},me={class:`v`},he={class:`v`},ge={class:`v`},_e={key:0,class:`callout soft`},ve={class:`layers`},ye={class:`layer-hd`},be={class:`tag tag-neutral`},xe={class:`layer-body`},Se={class:`ok`},Ce={class:`bad`},b={class:`dim`},x={class:`dim`},S={id:`tc-coverage`,class:`card panel`},C={class:`card-bd cover-grid`},w={class:`cover-main`},T={class:`cover-big`},E={class:`sub`},D={class:`bar`},O={class:`cover-sub`},k={class:`cover-side`},A={key:0,class:`foot dim`},we={id:`tc-matrix`,class:`card`},Te={class:`card-hd`},Ee={class:`tag tag-neutral`},De={class:`filters inline`},Oe=[`onClick`],ke={class:`n`},Ae={class:`card-bd matrix-wrap`},je={class:`tbl`},Me={class:`ttl`},Ne={class:`dim`},Pe={class:`foot dim`},Fe={key:0},Ie={id:`tc-cases`,class:`card`},Le={class:`card-hd`},Re={class:`tag tag-neutral`},ze={class:`card-bd`},Be={class:`filters`},Ve=[`onClick`],He={class:`n`},Ue=[`onClick`],We={class:`n`},Ge={class:`tbl cases`},Ke=[`onClick`],qe={class:`mono`},Je={key:0,class:`code mono`},Ye={class:`tag tag-neutral`},Xe={class:`dim lv`},Ze={class:`mono covers`},Qe={key:0,class:`dim`},$e={class:`dim`},et={class:`r mono dim`},tt={colspan:`6`},nt={class:`detail`},rt={key:0,class:`steps`},it={key:1,class:`dim`},at={class:`dim`},ot={key:0},st={key:1},ct={key:2},lt={key:0,class:`foot dim`},ut={key:1,class:`foot dim`},dt={id:`tc-gaps`,class:`card`},ft={class:`card-hd`},pt={class:`card-bd gap-grid`},mt={class:`h3`},ht={key:0,class:`gap-list`},gt={class:`dim`},_t={class:`gap-text`},vt={key:1,class:`foot dim`},yt={class:`h3`},bt={key:0,class:`gap-list`},xt={class:`mono`},St={key:0,class:`dim`},Ct={key:1,class:`foot dim`},wt={id:`tc-runs`,class:`card`},Tt={class:`card-hd`},Et={class:`tag tag-neutral`},Dt={class:`card-bd`},Ot={class:`tbl`},kt={class:`mono`},At={class:`mono`},jt={class:`dim`},Mt={class:`r mono`},Nt={class:`r mono ok`},Pt={class:`r mono dim`},Ft={class:`r mono dim`},It={class:`mono dim cov-cell`},Lt={key:0},Rt={key:0,class:`foot dim`},zt={key:1,class:`foot dim`},j=t(o({__name:`tests`,setup(t){let{testCases:o,testStats:j,requirement:M,matrixRows:N,lastRun:P,testRuns:F,coverageRows:I,LAYERS:L,LAYER_LABEL:R,LEVEL_LABEL:Bt,CASE_STATUS_LABEL:z,CASE_STATUS_COLOR:Vt,CASE_STATUS_DOT:Ht,storyById:Ut,STATE_LABEL:Wt,PRIORITY_COLOR:B,md:Gt}=r(),V=v(`all`),H=v(`all`),U=v(``),W=v(``),Kt=[{id:`tc-overview`,label:`概览`},{id:`tc-coverage`,label:`覆盖率`},{id:`tc-matrix`,label:`覆盖矩阵`},{id:`tc-cases`,label:`用例清单`},{id:`tc-gaps`,label:`缺口与风险`},{id:`tc-runs`,label:`执行记录`}],qt=e=>{let t=document.getElementById(e);t&&(t.scrollIntoView({behavior:`smooth`,block:`start`}),history.replaceState(null,``,`#${e}`))},Jt=[`#8a63f7`,`#3f7fd4`,`#6aa844`],G=_(()=>[{key:`all`,label:`全部`,count:j.value.total},...L.map(e=>({key:e,label:R[e],count:j.value.byLayer[e]?.total??0}))]),K=_(()=>{let e=U.value.trim().toLowerCase();return o.value.filter(t=>V.value!==`all`&&t.layer!==V.value||H.value!==`all`&&t.status!==H.value?!1:!e||[t.id,t.title,t.code,t.suiteName,...t.covers??[]].join(` `).toLowerCase().includes(e))}),Yt=_(()=>{let e=P.value?.totals;if(e){let t=e.total-(e.skipped??0);return t>0?Math.round(e.pass/t*100):0}let t=j.value.total-j.value.byStatus[`not-run`];return t>0?Math.round((j.value.byStatus.pass??0)/t*100):0}),q=v(`covered`),Xt=_(()=>N.value.filter(e=>q.value===`all`?!0:q.value===`covered`?e.covered>0:e.covered===0)),J=_(()=>N.value.filter(e=>e.covered===0).length),Zt=_(()=>[{key:`covered`,label:`有用例`,count:N.value.filter(e=>e.covered>0).length},{key:`missing`,label:`未覆盖`,count:J.value},{key:`all`,label:`全部`,count:N.value.length}]),Y=e=>I.value.find(t=>t.layer===e),X=_(()=>o.value.filter(e=>e.status===`fail`)),Z=_(()=>[`pass`,`fail`,`skipped`,`blocked`,`not-run`].map(e=>({key:e,label:z[e],count:j.value.byStatus[e]??0}))),Q=e=>typeof e==`number`?e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`:`—`,Qt=e=>{W.value=W.value===e?``:e},$=e=>[...new Set((e.covers??[]).map(e=>e.replace(/-A\d+$/,``)))].map(e=>Ut.value.get(e)).filter(Boolean);return(t,r)=>{let _=ee,v=te,I=ne;return s(),m(`div`,ce,[d(`nav`,le,[r[2]||=d(`span`,{class:`anchor-label`},`跳到`,-1),(s(),m(f,null,a(Kt,e=>d(`a`,{key:e.id,href:`#${e.id}`,class:`anchor-chip`,onClick:se(t=>qt(e.id),[`prevent`])},c(e.label),9,ue)),64))]),d(`div`,de,[d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(0)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(0),size:`sm`},null,8,[`tone`]),r[3]||=d(`p`,{class:`k`},`用例总数`,-1),d(`p`,fe,[y(c(i(j).total),1),d(`small`,null,`自动 `+c(i(j).automated)+` / 手工 `+c(i(j).manual),1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(1)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(1),size:`sm`},null,8,[`tone`]),r[5]||=d(`p`,{class:`k`},`用例通过率`,-1),d(`p`,pe,[y(c(i(Yt)),1),r[4]||=d(`small`,null,`%`,-1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(2)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(2),size:`sm`},null,8,[`tone`]),r[6]||=d(`p`,{class:`k`},`需求覆盖`,-1),d(`p`,me,[y(c(i(M).covered),1),d(`small`,null,`/ `+c(i(M).total)+` 条验收`,1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(3)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(3),size:`sm`},null,8,[`tone`]),r[7]||=d(`p`,{class:`k`},`前端行覆盖率`,-1),d(`p`,he,[y(c(Y(`frontend`)?.lines??`—`),1),d(`small`,null,c(Y(`frontend`)?`%`:`未上报`),1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(4)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(4),size:`sm`},null,8,[`tone`]),r[8]||=d(`p`,{class:`k`},`后端行覆盖率`,-1),d(`p`,ge,[y(c(Y(`backend`)?.lines??`—`),1),d(`small`,null,c(Y(`backend`)?`%`:`未上报`),1)])],2)]),i(o).length?(s(),m(f,{key:1},[d(`div`,ve,[(s(!0),m(f,null,a(i(L),(e,t)=>(s(),m(`div`,{key:e,class:`card layer-card`},[d(`div`,ye,[d(`span`,{class:`layer-dot`,style:l({background:Jt[t]})},null,4),d(`b`,null,c(i(R)[e]),1),d(`span`,be,c(i(j).byLayer[e]?.total??0),1)]),d(`div`,xe,[d(`span`,Se,`通过 `+c(i(j).byLayer[e]?.pass??0),1),d(`span`,Ce,`失败 `+c(i(j).byLayer[e]?.fail??0),1),d(`span`,b,`跳过 `+c(i(j).byLayer[e]?.skipped??0),1),d(`span`,x,`未跑 `+c(i(j).byLayer[e]?.notRun??0),1)])]))),128))]),d(`div`,S,[r[12]||=d(`div`,{class:`card-hd`},[d(`h2`,{class:`h2`},`覆盖率`),d(`span`,{class:`tag tag-neutral`},`需求口径`),d(`span`,{class:`dim tip`},`分母是非草稿 / 未取消故事的验收条数`)],-1),d(`div`,C,[d(`div`,w,[d(`p`,T,[y(c(i(M).covered),1),d(`span`,null,`/`+c(i(M).total),1)]),d(`p`,E,`验收已被用例覆盖 `+c(i(M).rate)+`%`,1),d(`div`,D,[d(`i`,{style:l({width:i(M).rate+`%`})},null,4)]),d(`p`,O,[r[10]||=y(` 其中最近一次通过验证 `,-1),d(`b`,null,c(i(M).verified),1),y(` / `+c(i(M).total)+`(`+c(i(M).verifiedRate)+`%) `,1)]),r[11]||=d(`p`,{class:`foot dim`},`有用例但最近一次失败的不算「验证通过」——覆盖与通过是两件事。`,-1)]),d(`div`,k,[(s(!0),m(f,null,a(i(Z),e=>(s(),m(`div`,{key:e.key,class:`stat-row`},[d(`i`,{class:`dot`,style:l({background:i(Ht)[e.key]})},null,4),d(`span`,null,c(e.label),1),d(`b`,null,c(e.count),1)]))),128)),i(P)?(s(),m(`p`,A,[y(` 最近一次:`+c(i(P).at)+` · `+c(i(P).command||`未记录命令`),1),i(P).env?(s(),m(f,{key:0},[y(` · `+c(i(P).env),1)],64)):h(``,!0)])):h(``,!0)])])]),d(`div`,we,[d(`div`,Te,[r[13]||=d(`h2`,{class:`h2`},`分层覆盖矩阵`,-1),d(`span`,Ee,c(i(N).length),1),r[14]||=d(`span`,{class:`dim tip`},`前端 / 后端 / E2E 三条泳道分开看,— 表示这一层没有用例`,-1),d(`div`,De,[(s(!0),m(f,null,a(i(Zt),e=>(s(),m(`button`,{key:e.key,class:g([`chip`,{on:i(q)===e.key}]),onClick:t=>q.value=e.key},[y(c(e.label),1),d(`span`,ke,c(e.count),1)],10,Oe))),128))])]),d(`div`,Ae,[d(`table`,je,[r[15]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`故事`),d(`th`,null,`优先级`),d(`th`,{class:`r`},`前端`),d(`th`,{class:`r`},`后端`),d(`th`,{class:`r`},`E2E`),d(`th`,{class:`r`},`验收覆盖`),d(`th`,null,`状态`)])],-1),d(`tbody`,null,[(s(!0),m(f,null,a(i(Xt),e=>(s(),m(`tr`,{key:e.id},[d(`td`,null,[u(I,{to:`/story/${e.id}`,class:`mono link`},{default:p(()=>[y(c(e.id),1)]),_:2},1032,[`to`]),d(`span`,Me,c(e.title),1)]),d(`td`,null,[d(`span`,{class:g([`tag`,`tag-${i(B)[e.priority]??`neutral`}`])},c(e.priority),3)]),d(`td`,{class:g([`r mono`,{zero:!e.layers.frontend}])},c(e.layers.frontend||`—`),3),d(`td`,{class:g([`r mono`,{zero:!e.layers.backend}])},c(e.layers.backend||`—`),3),d(`td`,{class:g([`r mono`,{zero:!e.layers.e2e}])},c(e.layers.e2e||`—`),3),d(`td`,{class:g([`r mono`,{bad:!e.allCovered}])},c(e.covered)+`/`+c(e.total),3),d(`td`,null,[d(`span`,Ne,c(i(Wt)[e.status]??e.status),1)])]))),128))])]),d(`p`,Pe,[r[16]||=y(` 一格 = 这一层覆盖了该故事几条验收;三个 — 全空就是完全没测。 `,-1),i(J)?(s(),m(`span`,Fe,`还有 `+c(i(J))+` 个故事一条用例都没有,切「未覆盖」查看。`,1)):h(``,!0)])])]),d(`div`,Ie,[d(`div`,Le,[r[17]||=d(`h2`,{class:`h2`},`用例清单`,-1),d(`span`,Re,c(i(K).length),1),ae(d(`input`,{"onUpdate:modelValue":r[0]||=e=>ie(U)?U.value=e:null,class:`input case-search`,placeholder:`搜编号 / 标题 / 文件 / 验收`,"aria-label":`搜索用例`},null,512),[[oe,i(U)]])]),d(`div`,ze,[d(`div`,Be,[(s(!0),m(f,null,a(i(G),e=>(s(),m(`button`,{key:e.key,class:g([`chip`,{on:i(V)===e.key}]),onClick:t=>V.value=e.key},[y(c(e.label),1),d(`span`,He,c(e.count),1)],10,Ve))),128)),r[18]||=d(`span`,{class:`sep`},null,-1),d(`button`,{class:g([`chip`,{on:i(H)===`all`}]),onClick:r[1]||=e=>H.value=`all`},`全部状态`,2),(s(!0),m(f,null,a(i(Z),e=>(s(),m(`button`,{key:e.key,class:g([`chip`,{on:i(H)===e.key}]),onClick:t=>H.value=e.key},[y(c(e.label),1),d(`span`,We,c(e.count),1)],10,Ue))),128))]),d(`table`,Ge,[r[23]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`编号`),d(`th`,null,`用例`),d(`th`,null,`层 / 级别`),d(`th`,null,`覆盖验收`),d(`th`,null,`方式`),d(`th`,null,`状态`),d(`th`,{class:`r`},`最近执行`)])],-1),d(`tbody`,null,[(s(!0),m(f,null,a(i(K),e=>(s(),m(f,{key:e.id},[d(`tr`,{class:`case-row`,onClick:t=>Qt(e.id)},[d(`td`,qe,c(e.id),1),d(`td`,null,[d(`b`,null,c(e.title),1),e.code?(s(),m(`span`,Je,c(e.code),1)):h(``,!0)]),d(`td`,null,[d(`span`,Ye,c(i(R)[e.layer]??e.layer),1),d(`span`,Xe,c(i(Bt)[e.level]??e.level),1)]),d(`td`,Ze,[(s(!0),m(f,null,a(e.covers??[],e=>(s(),m(`span`,{key:e,class:`cov-ref`},c(e),1))),128)),(e.covers??[]).length?h(``,!0):(s(),m(`span`,Qe,`—`))]),d(`td`,null,[d(`span`,$e,c(e.automated?`自动`:`手工`),1)]),d(`td`,null,[d(`span`,{class:g([`tag`,`tag-${i(Vt)[e.status]??`neutral`}`])},c(i(z)[e.status]??e.status),3)]),d(`td`,et,c(e.lastRun?i(Gt)(e.lastRun):`—`),1)],8,Ke),i(W)===e.id?(s(),m(`tr`,{key:e.id+`-d`,class:`detail-row`},[r[22]||=d(`td`,null,null,-1),d(`td`,tt,[d(`div`,nt,[d(`p`,null,[r[19]||=d(`b`,null,`预期:`,-1),y(c(e.expect),1)]),(e.steps??[]).length?(s(),m(`ol`,rt,[(s(!0),m(f,null,a(e.steps,(e,t)=>(s(),m(`li`,{key:t},c(e),1))),128))])):h(``,!0),e.note?(s(),m(`p`,it,[r[20]||=d(`b`,null,`备注:`,-1),y(c(e.note),1)])):h(``,!0),d(`p`,at,[r[21]||=y(` 覆盖故事: `,-1),(s(!0),m(f,null,a($(e),e=>(s(),re(I,{key:e.id,to:`/story/${e.id}`,class:`mono link`},{default:p(()=>[y(c(e.id),1)]),_:2},1032,[`to`]))),128)),$(e).length?(s(),m(`span`,ot,` · 套件 `+c(e.suiteName)+`(`+c(e.suiteId)+`)`,1)):(s(),m(`span`,st,`未关联故事 · 套件 `+c(e.suiteName)+`(`+c(e.suiteId)+`)`,1)),e.durationMs===void 0?h(``,!0):(s(),m(`span`,ct,` · 耗时 `+c(Q(e.durationMs)),1))])])])])):h(``,!0)],64))),128))])]),i(K).length?(s(),m(`p`,ut,`点一行展开预期与步骤;手工用例按「步骤 + 预期」交接给 QA。`)):(s(),m(`p`,lt,`当前筛选下没有用例。`))])]),d(`div`,dt,[d(`div`,ft,[r[24]||=d(`h2`,{class:`h2`},`缺口与风险`,-1),d(`span`,{class:g([`tag`,i(M).gaps.length||i(X).length?`tag-error`:`tag-success`])},c(i(M).gaps.length+i(X).length),3),r[25]||=d(`span`,{class:`dim tip`},`未覆盖的验收 + 最近一次失败的用例`,-1)]),d(`div`,pt,[d(`div`,null,[d(`p`,mt,[u(v,{name:`i-lucide-shield-alert`,class:`size-3`}),y(`没有任何用例覆盖的验收(`+c(i(M).gaps.length)+`)`,1)]),i(M).gaps.length?(s(),m(`ul`,ht,[(s(!0),m(f,null,a(i(M).gaps,e=>(s(),m(`li`,{key:e.ref},[d(`span`,{class:g([`tag`,`tag-${i(B)[e.priority]??`neutral`}`])},c(e.priority),3),u(I,{to:`/story/${e.storyId}`,class:`mono link`},{default:p(()=>[y(c(e.ref),1)]),_:2},1032,[`to`]),d(`span`,gt,c(e.storyTitle),1),d(`span`,_t,c(e.text),1)]))),128))])):(s(),m(`p`,vt,`每条验收都有对应用例。`))]),d(`div`,null,[d(`p`,yt,[u(v,{name:`i-lucide-circle-x`,class:`size-3`}),y(`最近一次失败的用例(`+c(i(X).length)+`)`,1)]),i(X).length?(s(),m(`ul`,bt,[(s(!0),m(f,null,a(i(X),e=>(s(),m(`li`,{key:e.id},[d(`span`,xt,c(e.id),1),d(`b`,null,c(e.title),1),e.note?(s(),m(`span`,St,`· `+c(e.note),1)):h(``,!0)]))),128))])):(s(),m(`p`,Ct,`没有失败用例。`))])])]),d(`div`,wt,[d(`div`,Tt,[r[26]||=d(`h2`,{class:`h2`},`执行记录`,-1),d(`span`,Et,c(i(F).length),1),r[27]||=d(`span`,{class:`dim tip`},`最近 20 次,最新一条在最后`,-1)]),d(`div`,Dt,[d(`table`,Ot,[r[28]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`时间`),d(`th`,null,`命令`),d(`th`,null,`环境`),d(`th`,{class:`r`},`总数`),d(`th`,{class:`r`},`通过`),d(`th`,{class:`r`},`失败`),d(`th`,{class:`r`},`跳过`),d(`th`,{class:`r`},`耗时`),d(`th`,null,`代码覆盖`)])],-1),d(`tbody`,null,[(s(!0),m(f,null,a(i(F),(e,t)=>(s(),m(`tr`,{key:e.id??e.at+t,class:g({last:t===i(F).length-1})},[d(`td`,kt,c(e.at),1),d(`td`,At,c(e.command||`—`),1),d(`td`,jt,c(e.env||`—`),1),d(`td`,Mt,c(e.totals?.total??`—`),1),d(`td`,Nt,c(e.totals?.pass??`—`),1),d(`td`,{class:g([`r mono`,{bad:e.totals?.fail}])},c(e.totals?.fail??`—`),3),d(`td`,Pt,c(e.totals?.skipped??`—`),1),d(`td`,Ft,c(Q(e.totals?.durationMs)),1),d(`td`,It,[(s(!0),m(f,null,a(e.coverage??{},(e,t)=>(s(),m(`span`,{key:t},c(i(R)[t]??t)+` `+c(e.lines??`—`)+`%`,1))),128)),Object.keys(e.coverage??{}).length?h(``,!0):(s(),m(`span`,Lt,`—`))])],2))),128))])]),i(F).length?(s(),m(`p`,zt,`覆盖率来自各层测试工具的报告,前端 / 后端分开,不做加权平均。`)):(s(),m(`p`,Rt,`还没有执行记录:跑完测试后把结果追加到 runs,页面上才有通过率与趋势。`))])])],64)):(s(),m(`div`,_e,[u(v,{name:`i-lucide-flask-conical`,class:`size-4`}),r[9]||=d(`div`,null,[d(`b`,null,`还没有测试用例`),d(`p`,{style:{"margin-top":`3px`}},[y(` 项目里没有 `),d(`code`,{class:`mono`},`agile/tests.json`),y(`,或者它还没有登记用例。 按纪律,Coding Agent 每推完一个 task / story 就该把本次新增用例与执行结果写进来: 结构见 `),d(`code`,{class:`mono`},`scrum-planning`),y(` 的 `),d(`code`,{class:`mono`},`references/schema.md`),y(` 第 5 节。 `)])],-1)]))])}}}),[[`__scopeId`,`data-v-ba251daf`]]);export{j as default};
1
+ import{a as e,i as t,o as n,r as ee,s as r}from"#entry";import{t as te}from"./DJM7u8P3.js";import{t as ne}from"./CI0scS-N.js";import{At as i,K as a,S as o,U as s,Xt as c,Yt as l,b as u,d,f as re,gt as ie,i as f,lt as p,m,p as h,qt as g,u as _,ut as ae,xt as v,y}from"./BxuBMtk_.js";import{a as oe,c as se}from"./BygIGL69.js";var ce={class:`tests-page`},le={class:`page-anchor`,"aria-label":`页内跳转`},ue=[`href`,`onClick`],de={id:`tc-overview`,class:`kpis`},fe={class:`v`},pe={class:`v`},me={class:`v`},he={class:`v`},ge={class:`v`},_e={key:0,class:`callout soft`},ve={class:`layers`},ye={class:`layer-hd`},be={class:`tag tag-neutral`},xe={class:`layer-body`},Se={class:`ok`},Ce={class:`bad`},b={class:`dim`},x={class:`dim`},S={id:`tc-coverage`,class:`card panel`},C={class:`card-bd cover-grid`},w={class:`cover-main`},T={class:`cover-big`},E={class:`sub`},D={class:`bar`},O={class:`cover-sub`},k={class:`cover-side`},A={key:0,class:`foot dim`},we={id:`tc-matrix`,class:`card`},Te={class:`card-hd`},Ee={class:`tag tag-neutral`},De={class:`filters inline`},Oe=[`onClick`],ke={class:`n`},Ae={class:`card-bd matrix-wrap`},je={class:`tbl`},Me={class:`ttl`},Ne={class:`dim`},Pe={class:`foot dim`},Fe={key:0},Ie={id:`tc-cases`,class:`card`},Le={class:`card-hd`},Re={class:`tag tag-neutral`},ze={class:`card-bd`},Be={class:`filters`},Ve=[`onClick`],He={class:`n`},Ue=[`onClick`],We={class:`n`},Ge={class:`tbl cases`},Ke=[`onClick`],qe={class:`mono`},Je={key:0,class:`code mono`},Ye={class:`tag tag-neutral`},Xe={class:`dim lv`},Ze={class:`mono covers`},Qe={key:0,class:`dim`},$e={class:`dim`},et={class:`r mono dim`},tt={colspan:`6`},nt={class:`detail`},rt={key:0,class:`steps`},it={key:1,class:`dim`},at={class:`dim`},ot={key:0},st={key:1},ct={key:2},lt={key:0,class:`foot dim`},ut={key:1,class:`foot dim`},dt={id:`tc-gaps`,class:`card`},ft={class:`card-hd`},pt={class:`card-bd gap-grid`},mt={class:`h3`},ht={key:0,class:`gap-list`},gt={class:`dim`},_t={class:`gap-text`},vt={key:1,class:`foot dim`},yt={class:`h3`},bt={key:0,class:`gap-list`},xt={class:`mono`},St={key:0,class:`dim`},Ct={key:1,class:`foot dim`},wt={id:`tc-runs`,class:`card`},Tt={class:`card-hd`},Et={class:`tag tag-neutral`},Dt={class:`card-bd`},Ot={class:`tbl`},kt={class:`mono`},At={class:`mono`},jt={class:`dim`},Mt={class:`r mono`},Nt={class:`r mono ok`},Pt={class:`r mono dim`},Ft={class:`r mono dim`},It={class:`mono dim cov-cell`},Lt={key:0},Rt={key:0,class:`foot dim`},zt={key:1,class:`foot dim`},j=t(o({__name:`tests`,setup(t){let{testCases:o,testStats:j,requirement:M,matrixRows:N,lastRun:P,testRuns:F,coverageRows:I,LAYERS:L,LAYER_LABEL:R,LEVEL_LABEL:Bt,CASE_STATUS_LABEL:z,CASE_STATUS_COLOR:Vt,CASE_STATUS_DOT:Ht,storyById:Ut,STATE_LABEL:Wt,PRIORITY_COLOR:B,md:Gt}=r(),V=v(`all`),H=v(`all`),U=v(``),W=v(``),Kt=[{id:`tc-overview`,label:`概览`},{id:`tc-coverage`,label:`覆盖率`},{id:`tc-matrix`,label:`覆盖矩阵`},{id:`tc-cases`,label:`用例清单`},{id:`tc-gaps`,label:`缺口与风险`},{id:`tc-runs`,label:`执行记录`}],qt=e=>{let t=document.getElementById(e);t&&(t.scrollIntoView({behavior:`smooth`,block:`start`}),history.replaceState(null,``,`#${e}`))},Jt=[`#8a63f7`,`#3f7fd4`,`#6aa844`],G=_(()=>[{key:`all`,label:`全部`,count:j.value.total},...L.map(e=>({key:e,label:R[e],count:j.value.byLayer[e]?.total??0}))]),K=_(()=>{let e=U.value.trim().toLowerCase();return o.value.filter(t=>V.value!==`all`&&t.layer!==V.value||H.value!==`all`&&t.status!==H.value?!1:!e||[t.id,t.title,t.code,t.suiteName,...t.covers??[]].join(` `).toLowerCase().includes(e))}),Yt=_(()=>{let e=P.value?.totals;if(e){let t=e.total-(e.skipped??0);return t>0?Math.round(e.pass/t*100):0}let t=j.value.total-j.value.byStatus[`not-run`];return t>0?Math.round((j.value.byStatus.pass??0)/t*100):0}),q=v(`covered`),Xt=_(()=>N.value.filter(e=>q.value===`all`?!0:q.value===`covered`?e.covered>0:e.covered===0)),J=_(()=>N.value.filter(e=>e.covered===0).length),Zt=_(()=>[{key:`covered`,label:`有用例`,count:N.value.filter(e=>e.covered>0).length},{key:`missing`,label:`未覆盖`,count:J.value},{key:`all`,label:`全部`,count:N.value.length}]),Y=e=>I.value.find(t=>t.layer===e),X=_(()=>o.value.filter(e=>e.status===`fail`)),Z=_(()=>[`pass`,`fail`,`skipped`,`blocked`,`not-run`].map(e=>({key:e,label:z[e],count:j.value.byStatus[e]??0}))),Q=e=>typeof e==`number`?e>=1e3?`${(e/1e3).toFixed(1)}s`:`${e}ms`:`—`,Qt=e=>{W.value=W.value===e?``:e},$=e=>[...new Set((e.covers??[]).map(e=>e.replace(/-A\d+$/,``)))].map(e=>Ut.value.get(e)).filter(Boolean);return(t,r)=>{let _=ee,v=te,I=ne;return s(),m(`div`,ce,[d(`nav`,le,[r[2]||=d(`span`,{class:`anchor-label`},`跳到`,-1),(s(),m(f,null,a(Kt,e=>d(`a`,{key:e.id,href:`#${e.id}`,class:`anchor-chip`,onClick:se(t=>qt(e.id),[`prevent`])},c(e.label),9,ue)),64))]),d(`div`,de,[d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(0)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(0),size:`sm`},null,8,[`tone`]),r[3]||=d(`p`,{class:`k`},`用例总数`,-1),d(`p`,fe,[y(c(i(j).total),1),d(`small`,null,`自动 `+c(i(j).automated)+` / 手工 `+c(i(j).manual),1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(1)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(1),size:`sm`},null,8,[`tone`]),r[5]||=d(`p`,{class:`k`},`用例通过率`,-1),d(`p`,pe,[y(c(i(Yt)),1),r[4]||=d(`small`,null,`%`,-1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(2)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(2),size:`sm`},null,8,[`tone`]),r[6]||=d(`p`,{class:`k`},`需求覆盖`,-1),d(`p`,me,[y(c(i(M).covered),1),d(`small`,null,`/ `+c(i(M).total)+` 条验收`,1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(3)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(3),size:`sm`},null,8,[`tone`]),r[7]||=d(`p`,{class:`k`},`前端行覆盖率`,-1),d(`p`,he,[y(c(Y(`frontend`)?.lines??`—`),1),d(`small`,null,c(Y(`frontend`)?`%`:`未上报`),1)])],2),d(`div`,{class:g([`kpi`,(`cardToneClass`in t?t.cardToneClass:i(n))(4)])},[u(_,{tone:(`cardTone`in t?t.cardTone:i(e))(4),size:`sm`},null,8,[`tone`]),r[8]||=d(`p`,{class:`k`},`后端行覆盖率`,-1),d(`p`,ge,[y(c(Y(`backend`)?.lines??`—`),1),d(`small`,null,c(Y(`backend`)?`%`:`未上报`),1)])],2)]),i(o).length?(s(),m(f,{key:1},[d(`div`,ve,[(s(!0),m(f,null,a(i(L),(e,t)=>(s(),m(`div`,{key:e,class:`card layer-card`},[d(`div`,ye,[d(`span`,{class:`layer-dot`,style:l({background:Jt[t]})},null,4),d(`b`,null,c(i(R)[e]),1),d(`span`,be,c(i(j).byLayer[e]?.total??0),1)]),d(`div`,xe,[d(`span`,Se,`通过 `+c(i(j).byLayer[e]?.pass??0),1),d(`span`,Ce,`失败 `+c(i(j).byLayer[e]?.fail??0),1),d(`span`,b,`跳过 `+c(i(j).byLayer[e]?.skipped??0),1),d(`span`,x,`未跑 `+c(i(j).byLayer[e]?.notRun??0),1)])]))),128))]),d(`div`,S,[r[12]||=d(`div`,{class:`card-hd`},[d(`h2`,{class:`h2`},`覆盖率`),d(`span`,{class:`tag tag-neutral`},`需求口径`),d(`span`,{class:`dim tip`},`分母是非草稿 / 未取消故事的验收条数`)],-1),d(`div`,C,[d(`div`,w,[d(`p`,T,[y(c(i(M).covered),1),d(`span`,null,`/`+c(i(M).total),1)]),d(`p`,E,`验收已被用例覆盖 `+c(i(M).rate)+`%`,1),d(`div`,D,[d(`i`,{style:l({width:i(M).rate+`%`})},null,4)]),d(`p`,O,[r[10]||=y(` 其中最近一次通过验证 `,-1),d(`b`,null,c(i(M).verified),1),y(` / `+c(i(M).total)+`(`+c(i(M).verifiedRate)+`%) `,1)]),r[11]||=d(`p`,{class:`foot dim`},`有用例但最近一次失败的不算「验证通过」——覆盖与通过是两件事。`,-1)]),d(`div`,k,[(s(!0),m(f,null,a(i(Z),e=>(s(),m(`div`,{key:e.key,class:`stat-row`},[d(`i`,{class:`dot`,style:l({background:i(Ht)[e.key]})},null,4),d(`span`,null,c(e.label),1),d(`b`,null,c(e.count),1)]))),128)),i(P)?(s(),m(`p`,A,[y(` 最近一次:`+c(i(P).at)+` · `+c(i(P).command||`未记录命令`),1),i(P).env?(s(),m(f,{key:0},[y(` · `+c(i(P).env),1)],64)):h(``,!0)])):h(``,!0)])])]),d(`div`,we,[d(`div`,Te,[r[13]||=d(`h2`,{class:`h2`},`分层覆盖矩阵`,-1),d(`span`,Ee,c(i(N).length),1),r[14]||=d(`span`,{class:`dim tip`},`前端 / 后端 / E2E 三条泳道分开看,— 表示这一层没有用例`,-1),d(`div`,De,[(s(!0),m(f,null,a(i(Zt),e=>(s(),m(`button`,{key:e.key,class:g([`chip`,{on:i(q)===e.key}]),onClick:t=>q.value=e.key},[y(c(e.label),1),d(`span`,ke,c(e.count),1)],10,Oe))),128))])]),d(`div`,Ae,[d(`table`,je,[r[15]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`故事`),d(`th`,null,`优先级`),d(`th`,{class:`r`},`前端`),d(`th`,{class:`r`},`后端`),d(`th`,{class:`r`},`E2E`),d(`th`,{class:`r`},`验收覆盖`),d(`th`,null,`状态`)])],-1),d(`tbody`,null,[(s(!0),m(f,null,a(i(Xt),e=>(s(),m(`tr`,{key:e.id},[d(`td`,null,[u(I,{to:`/story/${e.id}`,class:`mono link`},{default:p(()=>[y(c(e.id),1)]),_:2},1032,[`to`]),d(`span`,Me,c(e.title),1)]),d(`td`,null,[d(`span`,{class:g([`tag`,`tag-${i(B)[e.priority]??`neutral`}`])},c(e.priority),3)]),d(`td`,{class:g([`r mono`,{zero:!e.layers.frontend}])},c(e.layers.frontend||`—`),3),d(`td`,{class:g([`r mono`,{zero:!e.layers.backend}])},c(e.layers.backend||`—`),3),d(`td`,{class:g([`r mono`,{zero:!e.layers.e2e}])},c(e.layers.e2e||`—`),3),d(`td`,{class:g([`r mono`,{bad:!e.allCovered}])},c(e.covered)+`/`+c(e.total),3),d(`td`,null,[d(`span`,Ne,c(i(Wt)[e.status]??e.status),1)])]))),128))])]),d(`p`,Pe,[r[16]||=y(` 一格 = 这一层覆盖了该故事几条验收;三个 — 全空就是完全没测。 `,-1),i(J)?(s(),m(`span`,Fe,`还有 `+c(i(J))+` 个故事一条用例都没有,切「未覆盖」查看。`,1)):h(``,!0)])])]),d(`div`,Ie,[d(`div`,Le,[r[17]||=d(`h2`,{class:`h2`},`用例清单`,-1),d(`span`,Re,c(i(K).length),1),ae(d(`input`,{"onUpdate:modelValue":r[0]||=e=>ie(U)?U.value=e:null,class:`input case-search`,placeholder:`搜编号 / 标题 / 文件 / 验收`,"aria-label":`搜索用例`},null,512),[[oe,i(U)]])]),d(`div`,ze,[d(`div`,Be,[(s(!0),m(f,null,a(i(G),e=>(s(),m(`button`,{key:e.key,class:g([`chip`,{on:i(V)===e.key}]),onClick:t=>V.value=e.key},[y(c(e.label),1),d(`span`,He,c(e.count),1)],10,Ve))),128)),r[18]||=d(`span`,{class:`sep`},null,-1),d(`button`,{class:g([`chip`,{on:i(H)===`all`}]),onClick:r[1]||=e=>H.value=`all`},`全部状态`,2),(s(!0),m(f,null,a(i(Z),e=>(s(),m(`button`,{key:e.key,class:g([`chip`,{on:i(H)===e.key}]),onClick:t=>H.value=e.key},[y(c(e.label),1),d(`span`,We,c(e.count),1)],10,Ue))),128))]),d(`table`,Ge,[r[23]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`编号`),d(`th`,null,`用例`),d(`th`,null,`层 / 级别`),d(`th`,null,`覆盖验收`),d(`th`,null,`方式`),d(`th`,null,`状态`),d(`th`,{class:`r`},`最近执行`)])],-1),d(`tbody`,null,[(s(!0),m(f,null,a(i(K),e=>(s(),m(f,{key:e.id},[d(`tr`,{class:`case-row`,onClick:t=>Qt(e.id)},[d(`td`,qe,c(e.id),1),d(`td`,null,[d(`b`,null,c(e.title),1),e.code?(s(),m(`span`,Je,c(e.code),1)):h(``,!0)]),d(`td`,null,[d(`span`,Ye,c(i(R)[e.layer]??e.layer),1),d(`span`,Xe,c(i(Bt)[e.level]??e.level),1)]),d(`td`,Ze,[(s(!0),m(f,null,a(e.covers??[],e=>(s(),m(`span`,{key:e,class:`cov-ref`},c(e),1))),128)),(e.covers??[]).length?h(``,!0):(s(),m(`span`,Qe,`—`))]),d(`td`,null,[d(`span`,$e,c(e.automated?`自动`:`手工`),1)]),d(`td`,null,[d(`span`,{class:g([`tag`,`tag-${i(Vt)[e.status]??`neutral`}`])},c(i(z)[e.status]??e.status),3)]),d(`td`,et,c(e.lastRun?i(Gt)(e.lastRun):`—`),1)],8,Ke),i(W)===e.id?(s(),m(`tr`,{key:e.id+`-d`,class:`detail-row`},[r[22]||=d(`td`,null,null,-1),d(`td`,tt,[d(`div`,nt,[d(`p`,null,[r[19]||=d(`b`,null,`预期:`,-1),y(c(e.expect),1)]),(e.steps??[]).length?(s(),m(`ol`,rt,[(s(!0),m(f,null,a(e.steps,(e,t)=>(s(),m(`li`,{key:t},c(e),1))),128))])):h(``,!0),e.note?(s(),m(`p`,it,[r[20]||=d(`b`,null,`备注:`,-1),y(c(e.note),1)])):h(``,!0),d(`p`,at,[r[21]||=y(` 覆盖故事: `,-1),(s(!0),m(f,null,a($(e),e=>(s(),re(I,{key:e.id,to:`/story/${e.id}`,class:`mono link`},{default:p(()=>[y(c(e.id),1)]),_:2},1032,[`to`]))),128)),$(e).length?(s(),m(`span`,ot,` · 套件 `+c(e.suiteName)+`(`+c(e.suiteId)+`)`,1)):(s(),m(`span`,st,`未关联故事 · 套件 `+c(e.suiteName)+`(`+c(e.suiteId)+`)`,1)),e.durationMs===void 0?h(``,!0):(s(),m(`span`,ct,` · 耗时 `+c(Q(e.durationMs)),1))])])])])):h(``,!0)],64))),128))])]),i(K).length?(s(),m(`p`,ut,`点一行展开预期与步骤;手工用例按「步骤 + 预期」交接给 QA。`)):(s(),m(`p`,lt,`当前筛选下没有用例。`))])]),d(`div`,dt,[d(`div`,ft,[r[24]||=d(`h2`,{class:`h2`},`缺口与风险`,-1),d(`span`,{class:g([`tag`,i(M).gaps.length||i(X).length?`tag-error`:`tag-success`])},c(i(M).gaps.length+i(X).length),3),r[25]||=d(`span`,{class:`dim tip`},`未覆盖的验收 + 最近一次失败的用例`,-1)]),d(`div`,pt,[d(`div`,null,[d(`p`,mt,[u(v,{name:`i-lucide-shield-alert`,class:`size-3`}),y(`没有任何用例覆盖的验收(`+c(i(M).gaps.length)+`)`,1)]),i(M).gaps.length?(s(),m(`ul`,ht,[(s(!0),m(f,null,a(i(M).gaps,e=>(s(),m(`li`,{key:e.ref},[d(`span`,{class:g([`tag`,`tag-${i(B)[e.priority]??`neutral`}`])},c(e.priority),3),u(I,{to:`/story/${e.storyId}`,class:`mono link`},{default:p(()=>[y(c(e.ref),1)]),_:2},1032,[`to`]),d(`span`,gt,c(e.storyTitle),1),d(`span`,_t,c(e.text),1)]))),128))])):(s(),m(`p`,vt,`每条验收都有对应用例。`))]),d(`div`,null,[d(`p`,yt,[u(v,{name:`i-lucide-circle-x`,class:`size-3`}),y(`最近一次失败的用例(`+c(i(X).length)+`)`,1)]),i(X).length?(s(),m(`ul`,bt,[(s(!0),m(f,null,a(i(X),e=>(s(),m(`li`,{key:e.id},[d(`span`,xt,c(e.id),1),d(`b`,null,c(e.title),1),e.note?(s(),m(`span`,St,`· `+c(e.note),1)):h(``,!0)]))),128))])):(s(),m(`p`,Ct,`没有失败用例。`))])])]),d(`div`,wt,[d(`div`,Tt,[r[26]||=d(`h2`,{class:`h2`},`执行记录`,-1),d(`span`,Et,c(i(F).length),1),r[27]||=d(`span`,{class:`dim tip`},`最近 20 次,最新一条在最后`,-1)]),d(`div`,Dt,[d(`table`,Ot,[r[28]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`时间`),d(`th`,null,`命令`),d(`th`,null,`环境`),d(`th`,{class:`r`},`总数`),d(`th`,{class:`r`},`通过`),d(`th`,{class:`r`},`失败`),d(`th`,{class:`r`},`跳过`),d(`th`,{class:`r`},`耗时`),d(`th`,null,`代码覆盖`)])],-1),d(`tbody`,null,[(s(!0),m(f,null,a(i(F),(e,t)=>(s(),m(`tr`,{key:e.id??e.at+t,class:g({last:t===i(F).length-1})},[d(`td`,kt,c(e.at),1),d(`td`,At,c(e.command||`—`),1),d(`td`,jt,c(e.env||`—`),1),d(`td`,Mt,c(e.totals?.total??`—`),1),d(`td`,Nt,c(e.totals?.pass??`—`),1),d(`td`,{class:g([`r mono`,{bad:e.totals?.fail}])},c(e.totals?.fail??`—`),3),d(`td`,Pt,c(e.totals?.skipped??`—`),1),d(`td`,Ft,c(Q(e.totals?.durationMs)),1),d(`td`,It,[(s(!0),m(f,null,a(e.coverage??{},(e,t)=>(s(),m(`span`,{key:t},c(i(R)[t]??t)+` `+c(e.lines??`—`)+`%`,1))),128)),Object.keys(e.coverage??{}).length?h(``,!0):(s(),m(`span`,Lt,`—`))])],2))),128))])]),i(F).length?(s(),m(`p`,zt,`覆盖率来自各层测试工具的报告,前端 / 后端分开,不做加权平均。`)):(s(),m(`p`,Rt,`还没有执行记录:跑完测试后把结果追加到 runs,页面上才有通过率与趋势。`))])])],64)):(s(),m(`div`,_e,[u(v,{name:`i-lucide-flask-conical`,class:`size-4`}),r[9]||=d(`div`,null,[d(`b`,null,`还没有测试用例`),d(`p`,{style:{"margin-top":`3px`}},[y(` 项目里没有 `),d(`code`,{class:`mono`},`agile/tests.json`),y(`,或者它还没有登记用例。 按纪律,Coding Agent 每推完一个 task / story 就该把本次新增用例与执行结果写进来: 结构见 `),d(`code`,{class:`mono`},`scrum-planning`),y(` 的 `),d(`code`,{class:`mono`},`references/schema.md`),y(` 第 5 节。 `)])],-1)]))])}}}),[[`__scopeId`,`data-v-d69ddc53`]]);export{j as default};
@@ -1 +1 @@
1
- import{t as e}from"./DJM7u8P3.js";import{t}from"./CI0scS-N.js";import{c as n,d as r,f as i,h as a,i as o,l as ee,m as s,p as te,s as c,t as l,u}from"#entry";import{At as d,B as f,I as p,K as m,N as ne,S as h,U as g,Xt as _,Yt as v,at as y,b,d as x,f as re,gt as ie,i as S,lt as ae,m as C,p as w,qt as T,u as E,ut as oe,v as se,xt as D,y as O,yt as ce}from"./BxuBMtk_.js";import{a as le,c as k,o as ue,s as de}from"./BygIGL69.js";var fe={class:`diagrams-page`},pe={key:0,class:`callout soft`},me={key:1,class:`dg-layout`},he={class:`dg-list`},ge={class:`dg-head`},_e={class:`dg-total mono`},ve={class:`dg-filter`},ye={class:`dg-tree`},be=[`aria-expanded`,`onClick`],xe={class:`dg-group-lb`},Se={class:`dg-group-n mono`},Ce={class:`dg-items`},we=[`onClick`,`onKeydown`],Te={class:`dg-name`},Ee={class:`mono`},De={key:0,class:`tag tag-warning`},Oe={key:0,class:`foot dim`},ke={class:`dg-main`},Ae={class:`dg-main-hd`},je={class:`dg-h2`},Me={class:`tag tag-neutral`},Ne={key:0,class:`tag tag-warning`,title:`图的更新时间早于故事最后一次测试通过`},Pe={class:`dim tip mono`},Fe=[`href`],Ie=[`src`,`alt`],Le={key:1,class:`dg-canvas-hint dim`},Re={class:`dg-zoom`},ze={class:`dg-zval mono`},Be=[`src`,`title`],Ve={class:`dg-meta`},He={key:0},Ue={key:1,class:`dim`},We={class:`dg-tags`},Ge={key:1,class:`dim`},Ke=[`href`],qe={key:3,class:`dim`},Je=[`disabled`],Ye={class:`mono dim dg-path`},A=o(h({__name:`diagrams`,setup(o){let h=l(),{diagrams:A,staleDiagrams:Xe,storyById:Ze,md:Qe,DIAGRAM_KINDS:$e,DIAGRAM_KIND_LABEL:j,DIAGRAM_KIND_ICON:et,DIAGRAM_KIND_DOT:tt}=c(),M=D(``),N=D(!1),P=D(``),F=()=>{let e=h.value?.query?.focus;typeof e==`string`&&e&&(P.value=e)};F(),y(()=>h.value?.query?.focus,F),y(()=>h.value?.path,F);let I=E(()=>u(A.value,{keyword:M.value,onlyStale:N.value,stale:Xe.value})),L=ce({}),nt=e=>{L[e]=!L[e]},rt=E(()=>{let e=new Map;for(let t of I.value){let n=e.get(t.kind);n?n.push(t):e.set(t.kind,[t])}return $e.filter(t=>e.has(t)).map(t=>({key:t,label:j[t],color:tt[t],items:e.get(t)??[]}))}),R=E(()=>I.value.find(e=>e.id===P.value)??I.value[0]??null);y(I,e=>{e.length&&(e.some(e=>e.id===P.value)||(P.value=e[0].id))},{immediate:!0});let it=e=>Xe.value.has(e),at=e=>`/api/agile/diagram?id=${encodeURIComponent(e)}`,z=e=>`/api/agile/diagram?id=${encodeURIComponent(e)}&format=svg`,ot=e=>{let t=/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?)$/.exec(e??``);return t?`${t[1]} / ${t[2]}`:`3 / 2`},st=e=>e.map(e=>Ze.value.get(e)).filter(Boolean),B=D(null),V=D({w:0,h:0}),H=D({scale:1,x:0,y:0}),U=D(1),W=D(``),G=D(!1),K=D(!1),ct=E(()=>s(H.value.scale)),q=E(()=>!!R.value?.svg&&!G.value),J=new Map,Y=null,X=()=>{let e=B.value;if(!e||!V.value.w||!V.value.h)return;let t=r(V.value,{width:e.clientWidth,height:e.clientHeight});H.value=t,U.value=t.scale},lt=async e=>{if(!e?.svg){W.value=``,G.value=!0;return}W.value=``;let t=J.get(e.id);if(t)W.value=t.url,V.value={w:t.w,h:t.h},G.value=!1,await ne(),X();else try{let t=await fetch(z(e.id)).then(e=>{if(!e.ok)throw Error(String(e.status));return e.text()}),n=/viewBox="([-\d.\s,]+)"/i.exec(t)?.[1]?.trim().split(/[\s,]+/).map(Number),r=n&&n[2]||1200,i=n&&n[3]||800,a=URL.createObjectURL(new Blob([t],{type:`image/svg+xml;charset=utf-8`}));J.set(e.id,{url:a,w:r,h:i}),W.value=a,V.value={w:r,h:i},G.value=!1,await ne(),X()}catch{W.value=``,G.value=!0}},ut=e=>{if(!q.value||!V.value.w)return;let t=B.value?.getBoundingClientRect();if(!t)return;let r=n(H.value.scale*Math.exp(-e.deltaY*.0015),U.value);r!==H.value.scale&&(H.value=a(H.value,r,{x:e.clientX-t.left,y:e.clientY-t.top}))},dt=e=>{let t=B.value;if(!t)return;let r=n(H.value.scale*e,U.value);H.value=a(H.value,r,{x:t.clientWidth/2,y:t.clientHeight/2})},ft=e=>{q.value&&(e.target?.closest?.(`.dg-zoom`)||(K.value=!0,Y={x:e.clientX,y:e.clientY,vx:H.value.x,vy:H.value.y},e.currentTarget.setPointerCapture?.(e.pointerId)))},pt=e=>{Y&&(H.value={...H.value,x:Y.vx+(e.clientX-Y.x),y:Y.vy+(e.clientY-Y.y)})},Z=e=>{if(Y){Y=null,K.value=!1;try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}}};y(()=>R.value?.id,()=>lt(R.value)),f(()=>lt(R.value));let Q,mt=()=>{!Q&&B.value&&typeof ResizeObserver<`u`&&(Q=new ResizeObserver(()=>{Math.abs(H.value.scale-U.value)<.001&&X()}),Q.observe(B.value))};f(mt),y(B,()=>mt()),p(()=>{Q?.disconnect(),Q=void 0;for(let e of J.values())URL.revokeObjectURL(e.url);J.clear()});let $=D(``),ht=async e=>{if(!$.value){$.value=e.id;try{let t=await fetch(z(e.id)).then(e=>{if(!e.ok)throw Error(`取不到 SVG(${e.status})`);return e.text()}),n=i(t),r=n?.[2]||1200,a=n?.[3]||800,o=ee(r,a),s=Math.round(r*o),c=Math.round(a*o),l=URL.createObjectURL(new Blob([te(t,s,c)],{type:`image/svg+xml;charset=utf-8`})),u=new Image;await new Promise((e,t)=>{u.onload=()=>e(),u.onerror=()=>t(Error(`SVG 无法加载`)),u.src=l});let d=document.createElement(`canvas`);d.width=s,d.height=c;let f=d.getContext(`2d`);if(!f)throw Error(`拿不到 canvas 上下文`);f.fillStyle=`#ffffff`,f.fillRect(0,0,s,c),f.drawImage(u,0,0,s,c),URL.revokeObjectURL(l);let p=await new Promise(e=>d.toBlob(e,`image/png`));if(!p)throw Error(`PNG 编码失败`);let m=document.createElement(`a`);m.href=URL.createObjectURL(p),m.download=`${e.id}-${e.title||`diagram`}.png`,m.click(),setTimeout(()=>URL.revokeObjectURL(m.href),1e3)}catch(e){alert(`导出 PNG 失败:${e.message}。可以先「下载 SVG」。`)}finally{$.value=``}}};return(n,r)=>{let i=e,a=t;return g(),C(`div`,fe,[d(A).length?(g(),C(`div`,me,[x(`aside`,he,[x(`div`,ge,[r[7]||=x(`h2`,{class:`dg-title`},`图例`,-1),x(`span`,_e,_(d(I).length),1),b(a,{to:`/tests`,class:`dim tip dg-head-link`},{default:ae(()=>[...r[6]||=[O(`看测试用例 →`,-1)]]),_:1})]),x(`div`,ve,[oe(x(`input`,{"onUpdate:modelValue":r[0]||=e=>ie(M)?M.value=e:null,class:`input`,placeholder:`搜标题 / 摘要 / 故事`,"aria-label":`搜索图例`},null,512),[[le,d(M)]]),x(`button`,{class:T([`chip`,{on:d(N)}]),onClick:r[1]||=e=>N.value=!d(N)},[b(i,{name:`i-lucide-clock-alert`,class:`size-3`}),r[8]||=O(`可能过期 `,-1)],2)]),x(`nav`,ye,[(g(!0),C(S,null,m(d(rt),e=>(g(),C(`section`,{key:e.key,class:`dg-group`},[x(`button`,{type:`button`,class:`dg-group-hd`,"aria-expanded":!d(L)[e.key],onClick:t=>nt(e.key)},[x(`i`,{class:`dot`,style:v({background:e.color})},null,4),x(`span`,xe,_(e.label),1),x(`span`,Se,_(e.items.length),1),b(i,{name:`i-lucide-chevron-down`,class:T([`dg-chev`,{fold:d(L)[e.key]}])},null,8,[`class`])],8,be),oe(x(`ul`,Ce,[(g(!0),C(S,null,m(e.items,e=>(g(),C(`li`,{key:e.id,class:T([`dg-item`,{on:d(R)?.id===e.id}]),onClick:t=>P.value=e.id,onKeydown:[de(k(t=>P.value=e.id,[`prevent`]),[`enter`]),de(k(t=>P.value=e.id,[`prevent`]),[`space`])],tabindex:`0`},[b(i,{name:d(et)[e.kind],class:`dg-ic`},null,8,[`name`]),x(`span`,Te,[x(`b`,null,_(e.title),1),x(`small`,Ee,_(e.id)+` · `+_(d(j)[e.kind]),1)]),it(e.id)?(g(),C(`span`,De,`旧`)):w(``,!0)],42,we))),128))],512),[[ue,!d(L)[e.key]]])]))),128))]),d(I).length?w(``,!0):(g(),C(`p`,Oe,`当前筛选下没有图例。`))]),x(`section`,ke,[d(R)?(g(),C(S,{key:0},[x(`div`,Ae,[x(`h2`,je,_(d(R).title),1),x(`span`,Me,_(d(j)[d(R).kind]),1),it(d(R).id)?(g(),C(`span`,Ne,` 可能过期 `)):w(``,!0),x(`span`,Pe,_(d(R).id)+` · 更新 `+_(d(Qe)(d(R).updatedAt)),1),x(`a`,{class:`btn btn-sm dg-open`,href:at(d(R).id),target:`_blank`,rel:`noopener`},[b(i,{name:`i-lucide-external-link`,class:`size-3.5`}),r[9]||=O(`新标签打开 `,-1)],8,Fe)]),x(`div`,{ref_key:`frameEl`,ref:B,class:T([`dg-frame`,{dragging:d(K),"has-canvas":d(q)}]),style:v({aspectRatio:ot(d(R).aspect)}),onWheel:k(ut,[`prevent`]),onPointerdown:ft,onPointermove:pt,onPointerup:Z,onPointercancel:Z,onPointerleave:Z,onDblclick:X},[d(q)?(g(),C(S,{key:0},[d(W)?(g(),C(`img`,{key:0,class:`dg-canvas-img`,src:d(W),alt:d(R).title,draggable:`false`,style:v({left:`${d(H).x}px`,top:`${d(H).y}px`,width:`${d(V).w*d(H).scale}px`,height:`${d(V).h*d(H).scale}px`})},null,12,Ie)):(g(),C(`p`,Le,`正在载入 SVG…`)),x(`div`,Re,[x(`button`,{type:`button`,class:`dg-zbtn`,title:`适应窗口(双击画布也行)`,onClick:k(X,[`prevent`])},`适应`),x(`button`,{type:`button`,class:`dg-zbtn`,title:`缩小`,onClick:r[2]||=k(e=>dt(1/1.25),[`prevent`])},`−`),x(`span`,ze,_(d(ct))+`%`,1),x(`button`,{type:`button`,class:`dg-zbtn`,title:`放大`,onClick:r[3]||=k(e=>dt(1.25),[`prevent`])},`+`)]),r[10]||=x(`span`,{class:`dg-hint mono`},`滚轮缩放 · 拖拽平移 · 双击复位`,-1)],64)):(g(),C(`iframe`,{key:1,src:at(d(R).id),title:d(R).title,sandbox:`allow-scripts`,loading:`lazy`,referrerpolicy:`no-referrer`},null,8,Be))],38),x(`div`,Ve,[d(R).summary?(g(),C(`p`,He,_(d(R).summary),1)):(g(),C(`p`,Ue,`没有写摘要——图本身能看懂的话可以不加。`)),x(`div`,We,[st(d(R).storyIds).length?(g(),C(S,{key:0},[r[11]||=x(`span`,{class:`dim`},`关联故事`,-1),(g(!0),C(S,null,m(st(d(R).storyIds),e=>(g(),re(a,{key:e.id,to:`/story/${e.id}`,class:`tag tag-primary mono`},{default:ae(()=>[O(_(e.id),1)]),_:2},1032,[`to`]))),128))],64)):(g(),C(`span`,Ge,`未关联故事`)),r[12]||=x(`span`,{class:`sep`},null,-1),d(R).svg?(g(),C(`a`,{key:2,class:`dl`,href:z(d(R).id),download:``},`下载 SVG`,8,Ke)):(g(),C(`span`,qe,`无 SVG 导出`)),d(R).svg?(g(),C(`button`,{key:4,class:`dl`,disabled:!!d($),onClick:r[4]||=e=>ht(d(R))},_(d($)===d(R).id?`导出中…`:`下载 PNG`),9,Je)):w(``,!0),x(`span`,Ye,_(d(R).file),1)])])],64)):w(``,!0)])])):(g(),C(`div`,pe,[b(i,{name:`i-lucide-network`,class:`size-4`}),r[5]||=se(`<div data-v-bd73a1fb><b data-v-bd73a1fb>还没有图例</b><p style="margin-top:3px;" data-v-bd73a1fb> 实现故事时遇到模块边界 / 鉴权 / 支付 / 数据模型这类改动,用内置的 <code class="mono" data-v-bd73a1fb>diagram-design</code> skill 出图, 再用 <code class="mono" data-v-bd73a1fb>node tools/diagram.mjs add &lt;file&gt; --title &quot;登录时序&quot; --kind sequence --story S-001</code> 登记;索引写在 <code class="mono" data-v-bd73a1fb>agile/diagrams.json</code>,产物在 <code class="mono" data-v-bd73a1fb>agile/diagrams/</code>。 </p></div>`,1)]))])}}}),[[`__scopeId`,`data-v-bd73a1fb`]]);export{A as default};
1
+ import{t as e}from"./DJM7u8P3.js";import{t}from"./CI0scS-N.js";import{c as n,d as r,f as i,h as a,i as o,l as ee,m as s,p as te,s as c,t as l,u}from"#entry";import{At as d,B as f,I as p,K as m,N as ne,S as h,U as g,Xt as _,Yt as v,at as y,b,d as x,f as re,gt as ie,i as S,lt as ae,m as C,p as w,qt as T,u as E,ut as oe,v as se,xt as D,y as O,yt as ce}from"./BxuBMtk_.js";import{a as le,c as k,o as ue,s as de}from"./BygIGL69.js";var fe={class:`diagrams-page`},pe={key:0,class:`callout soft`},me={key:1,class:`dg-layout`},he={class:`dg-list`},ge={class:`dg-head`},_e={class:`dg-total mono`},ve={class:`dg-filter`},ye={class:`dg-tree`},be=[`aria-expanded`,`onClick`],xe={class:`dg-group-lb`},Se={class:`dg-group-n mono`},Ce={class:`dg-items`},we=[`onClick`,`onKeydown`],Te={class:`dg-name`},Ee={class:`mono`},De={key:0,class:`tag tag-warning`},Oe={key:0,class:`foot dim`},ke={class:`dg-main`},Ae={class:`dg-main-hd`},je={class:`dg-h2`},Me={class:`tag tag-neutral`},Ne={key:0,class:`tag tag-warning`,title:`图的更新时间早于故事最后一次测试通过`},Pe={class:`dim tip mono`},Fe=[`href`],Ie={class:`dg-meta`},Le={key:0},Re={key:1,class:`dim`},ze={class:`dg-tags`},Be={key:1,class:`dim`},Ve=[`href`],He={key:3,class:`dim`},Ue=[`disabled`],We={class:`mono dim dg-path`},Ge=[`src`,`alt`],Ke={key:1,class:`dg-canvas-hint dim`},qe={class:`dg-zoom`},Je={class:`dg-zval mono`},Ye=[`src`,`title`],A=o(h({__name:`diagrams`,setup(o){let h=l(),{diagrams:A,staleDiagrams:Xe,storyById:Ze,md:Qe,DIAGRAM_KINDS:$e,DIAGRAM_KIND_LABEL:j,DIAGRAM_KIND_ICON:et,DIAGRAM_KIND_DOT:tt}=c(),M=D(``),N=D(!1),P=D(``),F=()=>{let e=h.value?.query?.focus;typeof e==`string`&&e&&(P.value=e)};F(),y(()=>h.value?.query?.focus,F),y(()=>h.value?.path,F);let I=E(()=>u(A.value,{keyword:M.value,onlyStale:N.value,stale:Xe.value})),L=ce({}),nt=e=>{L[e]=!L[e]},rt=E(()=>{let e=new Map;for(let t of I.value){let n=e.get(t.kind);n?n.push(t):e.set(t.kind,[t])}return $e.filter(t=>e.has(t)).map(t=>({key:t,label:j[t],color:tt[t],items:e.get(t)??[]}))}),R=E(()=>I.value.find(e=>e.id===P.value)??I.value[0]??null);y(I,e=>{e.length&&(e.some(e=>e.id===P.value)||(P.value=e[0].id))},{immediate:!0});let it=e=>Xe.value.has(e),at=e=>`/api/agile/diagram?id=${encodeURIComponent(e)}`,z=e=>`/api/agile/diagram?id=${encodeURIComponent(e)}&format=svg`,ot=e=>{let t=/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?)$/.exec(e??``);return t?`${t[1]} / ${t[2]}`:`3 / 2`},st=e=>e.map(e=>Ze.value.get(e)).filter(Boolean),B=D(null),V=D({w:0,h:0}),H=D({scale:1,x:0,y:0}),U=D(1),W=D(``),G=D(!1),K=D(!1),ct=E(()=>s(H.value.scale)),q=E(()=>!!R.value?.svg&&!G.value),J=new Map,Y=null,X=()=>{let e=B.value;if(!e||!V.value.w||!V.value.h)return;let t=r(V.value,{width:e.clientWidth,height:e.clientHeight});H.value=t,U.value=t.scale},lt=async e=>{if(!e?.svg){W.value=``,G.value=!0;return}W.value=``;let t=J.get(e.id);if(t)W.value=t.url,V.value={w:t.w,h:t.h},G.value=!1,await ne(),X();else try{let t=await fetch(z(e.id)).then(e=>{if(!e.ok)throw Error(String(e.status));return e.text()}),n=/viewBox="([-\d.\s,]+)"/i.exec(t)?.[1]?.trim().split(/[\s,]+/).map(Number),r=n&&n[2]||1200,i=n&&n[3]||800,a=URL.createObjectURL(new Blob([t],{type:`image/svg+xml;charset=utf-8`}));J.set(e.id,{url:a,w:r,h:i}),W.value=a,V.value={w:r,h:i},G.value=!1,await ne(),X()}catch{W.value=``,G.value=!0}},ut=e=>{if(!q.value||!V.value.w)return;let t=B.value?.getBoundingClientRect();if(!t)return;let r=n(H.value.scale*Math.exp(-e.deltaY*.0015),U.value);r!==H.value.scale&&(H.value=a(H.value,r,{x:e.clientX-t.left,y:e.clientY-t.top}))},dt=e=>{let t=B.value;if(!t)return;let r=n(H.value.scale*e,U.value);H.value=a(H.value,r,{x:t.clientWidth/2,y:t.clientHeight/2})},ft=e=>{q.value&&(e.target?.closest?.(`.dg-zoom`)||(K.value=!0,Y={x:e.clientX,y:e.clientY,vx:H.value.x,vy:H.value.y},e.currentTarget.setPointerCapture?.(e.pointerId)))},pt=e=>{Y&&(H.value={...H.value,x:Y.vx+(e.clientX-Y.x),y:Y.vy+(e.clientY-Y.y)})},Z=e=>{if(Y){Y=null,K.value=!1;try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}}};y(()=>R.value?.id,()=>lt(R.value)),f(()=>lt(R.value));let Q,mt=()=>{!Q&&B.value&&typeof ResizeObserver<`u`&&(Q=new ResizeObserver(()=>{Math.abs(H.value.scale-U.value)<.001&&X()}),Q.observe(B.value))};f(mt),y(B,()=>mt()),p(()=>{Q?.disconnect(),Q=void 0;for(let e of J.values())URL.revokeObjectURL(e.url);J.clear()});let $=D(``),ht=async e=>{if(!$.value){$.value=e.id;try{let t=await fetch(z(e.id)).then(e=>{if(!e.ok)throw Error(`取不到 SVG(${e.status})`);return e.text()}),n=i(t),r=n?.[2]||1200,a=n?.[3]||800,o=ee(r,a),s=Math.round(r*o),c=Math.round(a*o),l=URL.createObjectURL(new Blob([te(t,s,c)],{type:`image/svg+xml;charset=utf-8`})),u=new Image;await new Promise((e,t)=>{u.onload=()=>e(),u.onerror=()=>t(Error(`SVG 无法加载`)),u.src=l});let d=document.createElement(`canvas`);d.width=s,d.height=c;let f=d.getContext(`2d`);if(!f)throw Error(`拿不到 canvas 上下文`);f.fillStyle=`#ffffff`,f.fillRect(0,0,s,c),f.drawImage(u,0,0,s,c),URL.revokeObjectURL(l);let p=await new Promise(e=>d.toBlob(e,`image/png`));if(!p)throw Error(`PNG 编码失败`);let m=document.createElement(`a`);m.href=URL.createObjectURL(p),m.download=`${e.id}-${e.title||`diagram`}.png`,m.click(),setTimeout(()=>URL.revokeObjectURL(m.href),1e3)}catch(e){alert(`导出 PNG 失败:${e.message}。可以先「下载 SVG」。`)}finally{$.value=``}}};return(n,r)=>{let i=e,a=t;return g(),C(`div`,fe,[d(A).length?(g(),C(`div`,me,[x(`aside`,he,[x(`div`,ge,[r[7]||=x(`h2`,{class:`dg-title`},`图例`,-1),x(`span`,_e,_(d(I).length),1),b(a,{to:`/tests`,class:`dim tip dg-head-link`},{default:ae(()=>[...r[6]||=[O(`看测试用例 →`,-1)]]),_:1})]),x(`div`,ve,[oe(x(`input`,{"onUpdate:modelValue":r[0]||=e=>ie(M)?M.value=e:null,class:`input`,placeholder:`搜标题 / 摘要 / 故事`,"aria-label":`搜索图例`},null,512),[[le,d(M)]]),x(`button`,{class:T([`chip`,{on:d(N)}]),onClick:r[1]||=e=>N.value=!d(N)},[b(i,{name:`i-lucide-clock-alert`,class:`size-3`}),r[8]||=O(`可能过期 `,-1)],2)]),x(`nav`,ye,[(g(!0),C(S,null,m(d(rt),e=>(g(),C(`section`,{key:e.key,class:`dg-group`},[x(`button`,{type:`button`,class:`dg-group-hd`,"aria-expanded":!d(L)[e.key],onClick:t=>nt(e.key)},[x(`i`,{class:`dot`,style:v({background:e.color})},null,4),x(`span`,xe,_(e.label),1),x(`span`,Se,_(e.items.length),1),b(i,{name:`i-lucide-chevron-down`,class:T([`dg-chev`,{fold:d(L)[e.key]}])},null,8,[`class`])],8,be),oe(x(`ul`,Ce,[(g(!0),C(S,null,m(e.items,e=>(g(),C(`li`,{key:e.id,class:T([`dg-item`,{on:d(R)?.id===e.id}]),onClick:t=>P.value=e.id,onKeydown:[de(k(t=>P.value=e.id,[`prevent`]),[`enter`]),de(k(t=>P.value=e.id,[`prevent`]),[`space`])],tabindex:`0`},[b(i,{name:d(et)[e.kind],class:`dg-ic`},null,8,[`name`]),x(`span`,Te,[x(`b`,null,_(e.title),1),x(`small`,Ee,_(e.id)+` · `+_(d(j)[e.kind]),1)]),it(e.id)?(g(),C(`span`,De,`旧`)):w(``,!0)],42,we))),128))],512),[[ue,!d(L)[e.key]]])]))),128))]),d(I).length?w(``,!0):(g(),C(`p`,Oe,`当前筛选下没有图例。`))]),x(`section`,ke,[d(R)?(g(),C(S,{key:0},[x(`div`,Ae,[x(`h2`,je,_(d(R).title),1),x(`span`,Me,_(d(j)[d(R).kind]),1),it(d(R).id)?(g(),C(`span`,Ne,` 可能过期 `)):w(``,!0),x(`span`,Pe,_(d(R).id)+` · 更新 `+_(d(Qe)(d(R).updatedAt)),1),x(`a`,{class:`btn btn-sm dg-open`,href:at(d(R).id),target:`_blank`,rel:`noopener`},[b(i,{name:`i-lucide-external-link`,class:`size-3.5`}),r[9]||=O(`新标签打开 `,-1)],8,Fe)]),x(`div`,Ie,[d(R).summary?(g(),C(`p`,Le,_(d(R).summary),1)):(g(),C(`p`,Re,`没有写摘要——图本身能看懂的话可以不加。`)),x(`div`,ze,[st(d(R).storyIds).length?(g(),C(S,{key:0},[r[10]||=x(`span`,{class:`dim`},`关联故事`,-1),(g(!0),C(S,null,m(st(d(R).storyIds),e=>(g(),re(a,{key:e.id,to:`/story/${e.id}`,class:`tag tag-primary mono`},{default:ae(()=>[O(_(e.id),1)]),_:2},1032,[`to`]))),128))],64)):(g(),C(`span`,Be,`未关联故事`)),r[11]||=x(`span`,{class:`sep`},null,-1),d(R).svg?(g(),C(`a`,{key:2,class:`dl`,href:z(d(R).id),download:``},`下载 SVG`,8,Ve)):(g(),C(`span`,He,`无 SVG 导出`)),d(R).svg?(g(),C(`button`,{key:4,class:`dl`,disabled:!!d($),onClick:r[2]||=e=>ht(d(R))},_(d($)===d(R).id?`导出中…`:`下载 PNG`),9,Ue)):w(``,!0),x(`span`,We,_(d(R).file),1)])]),x(`div`,{ref_key:`frameEl`,ref:B,class:T([`dg-frame`,{dragging:d(K),"has-canvas":d(q)}]),style:v({"--dg-ratio":ot(d(R).aspect)}),onWheel:k(ut,[`prevent`]),onPointerdown:ft,onPointermove:pt,onPointerup:Z,onPointercancel:Z,onPointerleave:Z,onDblclick:X},[d(q)?(g(),C(S,{key:0},[d(W)?(g(),C(`img`,{key:0,class:`dg-canvas-img`,src:d(W),alt:d(R).title,draggable:`false`,style:v({left:`${d(H).x}px`,top:`${d(H).y}px`,width:`${d(V).w*d(H).scale}px`,height:`${d(V).h*d(H).scale}px`})},null,12,Ge)):(g(),C(`p`,Ke,`正在载入 SVG…`)),x(`div`,qe,[x(`button`,{type:`button`,class:`dg-zbtn`,title:`适应窗口(双击画布也行)`,onClick:k(X,[`prevent`])},`适应`),x(`button`,{type:`button`,class:`dg-zbtn`,title:`缩小`,onClick:r[3]||=k(e=>dt(1/1.25),[`prevent`])},`−`),x(`span`,Je,_(d(ct))+`%`,1),x(`button`,{type:`button`,class:`dg-zbtn`,title:`放大`,onClick:r[4]||=k(e=>dt(1.25),[`prevent`])},`+`)]),r[12]||=x(`span`,{class:`dg-hint mono`},`滚轮缩放 · 拖拽平移 · 双击复位`,-1)],64)):(g(),C(`iframe`,{key:1,src:at(d(R).id),title:d(R).title,sandbox:`allow-scripts`,loading:`lazy`,referrerpolicy:`no-referrer`},null,8,Ye))],38)],64)):w(``,!0)])])):(g(),C(`div`,pe,[b(i,{name:`i-lucide-network`,class:`size-4`}),r[5]||=se(`<div data-v-29e559e1><b data-v-29e559e1>还没有图例</b><p style="margin-top:3px;" data-v-29e559e1> 实现故事时遇到模块边界 / 鉴权 / 支付 / 数据模型这类改动,用内置的 <code class="mono" data-v-29e559e1>diagram-design</code> skill 出图, 再用 <code class="mono" data-v-29e559e1>node tools/diagram.mjs add &lt;file&gt; --title &quot;登录时序&quot; --kind sequence --story S-001</code> 登记;索引写在 <code class="mono" data-v-29e559e1>agile/diagrams.json</code>,产物在 <code class="mono" data-v-29e559e1>agile/diagrams/</code>。 </p></div>`,1)]))])}}}),[[`__scopeId`,`data-v-29e559e1`]]);export{A as default};
@@ -1 +1 @@
1
- import{a as e,i as t,o as n,r as ee,s as r}from"#entry";import{t as te}from"./DJM7u8P3.js";import{t as i}from"./CI0scS-N.js";import{At as a,K as o,S as s,U as c,Xt as l,Yt as u,b as d,d as f,f as p,i as m,lt as ne,m as h,p as g,qt as _,u as v,v as re,y}from"./BxuBMtk_.js";var b={class:`kpis`},ie={class:`v`},ae={class:`v`},oe={class:`v`},se={class:`v`},x={class:`v`},S={class:`card tl-wrap`},C={class:`card-hd tl-hd`},w={class:`h2`},T={class:`timeline`},E={key:0,class:`tl-today`},D={class:`tl-item`},O={class:`when`},k={class:`when-date mono`},A={class:`when-year`},j={class:`axis`},M={class:`node-top`},N={class:`tag tag-ghost`},P={key:0,class:`tag tag-neutral mono`},F={class:`node-title`},I={class:`criteria`},L={class:`nums`},R={class:`dim`},z={class:`mpct`},ce={class:`mss`},B={class:`st-id mono`},V={class:`st-title`},H={class:`st-state dim`},U={class:`st-pts dim`},W={key:0,class:`tl-today`},G=t(s({__name:`milestones`,setup(t){let{milestones:s,milestoneProgress:G,now:K,md:le,MS_LABEL:ue,MS_COLOR:de,KIND_LABEL:fe,KIND_ICON:pe,STATE_DOT:me,STATE_LABEL:he,diffDays:q}=r(),J=v(()=>[...s.value].sort((e,t)=>e.due<t.due?-1:+(e.due>t.due))),Y=e=>q(K,e),X=e=>{let t=G(e);return t.total?Math.round(t.done/t.total*100):0},Z=e=>e===`mvp`?`mint`:e===`release`?`lilac`:`ink`,ge=e=>({reached:`ok`,"at-risk":`risk`,planned:`plan`,missed:`miss`})[e]??`plan`,_e=[`日`,`一`,`二`,`三`,`四`,`五`,`六`],ve=e=>`周${_e[new Date(`${e}T00:00:00Z`).getUTCDay()]}`,ye=e=>{let t=Y(e);return t>0?`还剩 ${t} 天`:t===0?`今天到期`:`已过 ${-t} 天`},Q=v(()=>{let e=J.value.findIndex(e=>e.due>=K);return e<0?J.value.length:e}),$=v(()=>({mvp:s.value.filter(e=>e.kind===`mvp`).length,release:s.value.filter(e=>e.kind===`release`).length,checkpoint:s.value.filter(e=>e.kind===`checkpoint`).length,risk:s.value.filter(e=>e.status===`at-risk`||e.status===`missed`).length,reached:s.value.filter(e=>e.status===`reached`).length}));return(t,r)=>{let v=ee,K=te,q=i;return c(),h(`div`,null,[f(`div`,b,[f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(0)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(0),size:`sm`},null,8,[`tone`]),r[1]||=f(`p`,{class:`k`},`MVP 节点`,-1),f(`p`,ie,[y(l(a($).mvp),1),r[0]||=f(`small`,null,`个`,-1)])],2),f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(1)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(1),size:`sm`},null,8,[`tone`]),r[3]||=f(`p`,{class:`k`},`发布节点`,-1),f(`p`,ae,[y(l(a($).release),1),r[2]||=f(`small`,null,`个`,-1)])],2),f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(2)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(2),size:`sm`},null,8,[`tone`]),r[5]||=f(`p`,{class:`k`},`检查点`,-1),f(`p`,oe,[y(l(a($).checkpoint),1),r[4]||=f(`small`,null,`个`,-1)])],2),f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(3)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(3),size:`sm`},null,8,[`tone`]),r[6]||=f(`p`,{class:`k`},`已达成`,-1),f(`p`,se,[y(l(a($).reached),1),f(`small`,null,`/ `+l(a(s).length),1)])],2),f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(4)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(4),size:`sm`},null,8,[`tone`]),r[8]||=f(`p`,{class:`k`},`有风险 / 错过`,-1),f(`p`,x,[y(l(a($).risk),1),r[7]||=f(`small`,null,`个`,-1)])],2)]),f(`div`,S,[f(`div`,C,[f(`h2`,w,[d(K,{name:`i-lucide-git-commit-vertical`,class:`size-3.5`}),r[9]||=y(`时间线`,-1)]),r[10]||=re(`<span class="dim tip" data-v-0a133ef9>按到期日从早到晚 · 节点达成口径是「挂的故事全部完成」</span><div class="legend" data-v-0a133ef9><span class="lg" data-v-0a133ef9><i class="sw mint" data-v-0a133ef9></i>MVP</span><span class="lg" data-v-0a133ef9><i class="sw lilac" data-v-0a133ef9></i>发布</span><span class="lg" data-v-0a133ef9><i class="sw white" data-v-0a133ef9></i>检查点</span><i class="sep" data-v-0a133ef9></i><span class="lg" data-v-0a133ef9><i class="dot ok" data-v-0a133ef9></i>已达成</span><span class="lg" data-v-0a133ef9><i class="dot risk" data-v-0a133ef9></i>有风险</span><span class="lg" data-v-0a133ef9><i class="dot plan" data-v-0a133ef9></i>计划中</span></div>`,2)]),f(`div`,T,[(c(!0),h(m,null,o(a(J),(e,t)=>(c(),h(m,{key:e.id},[t===a(Q)?(c(),h(`div`,E,[...r[11]||=[f(`span`,{class:`today-when`},`今天`,-1),f(`span`,{class:`today-axis`},[f(`i`)],-1),f(`span`,{class:`today-line`},null,-1)]])):g(``,!0),f(`article`,D,[f(`div`,O,[f(`p`,k,l(a(le)(e.due)),1),f(`p`,A,l(ve(e.due)),1)]),f(`div`,j,[f(`span`,{class:_([`dot-lg`,ge(e.status)])},[e.status===`reached`?(c(),p(K,{key:0,name:`i-lucide-check`,class:`size-2.5`})):g(``,!0)],2)]),f(`div`,{class:_([`node`,`node-${Z(e.kind)}`])},[d(v,{tone:Z(e.kind),size:`xl`,min:3,max:5},null,8,[`tone`]),f(`div`,M,[f(`span`,N,l(e.id),1),f(`span`,{class:_([`tag`,`tag-${a(de)[e.status]}`])},l(a(ue)[e.status]),3),f(`span`,{class:_([`tag`,e.kind===`mvp`?`tag-mint`:e.kind===`release`?`tag-primary`:`tag-neutral`])},[d(K,{name:a(pe)[e.kind],class:`size-3`},null,8,[`name`]),y(l(a(fe)[e.kind]),1)],2),e.sprintId?(c(),h(`span`,P,l(e.sprintId),1)):g(``,!0),f(`span`,{class:_([`days`,{over:Y(e.due)<0,soon:Y(e.due)>=0&&Y(e.due)<=7}])},l(ye(e.due)),3)]),f(`h3`,F,l(e.title),1),f(`p`,I,l(e.criteria),1),f(`div`,L,[f(`span`,null,[f(`b`,null,l(a(G)(e).done)+`/`+l(a(G)(e).total),1),r[12]||=y(` 个故事`,-1)]),a(G)(e).cancelled?(c(),h(m,{key:0},[r[13]||=f(`span`,{class:`dim`},`·`,-1),f(`span`,R,l(a(G)(e).cancelled)+` 个已取消`,1)],64)):g(``,!0),r[14]||=f(`span`,{class:`dim`},`·`,-1),f(`span`,null,l(a(G)(e).points)+` 点`,1),f(`span`,z,l(X(e))+`%`,1)]),f(`div`,{class:_([`bar`,e.kind===`checkpoint`?``:Z(e.kind)])},[f(`i`,{style:u({width:X(e)+`%`})},null,4)],2),f(`ul`,ce,[(c(!0),h(m,null,o(a(G)(e).list,e=>(c(),h(`li`,{key:e.id},[d(q,{to:`/story/${e.id}`,class:`srow`},{default:ne(()=>[f(`i`,{class:`sdot`,style:u({background:a(me)[e.status]})},null,4),f(`span`,B,l(e.id),1),f(`span`,V,l(e.title),1),f(`span`,H,l(a(he)[e.status]),1),f(`span`,U,l(e.points),1)]),_:2},1032,[`to`])]))),128))])],2)])],64))),128)),a(Q)===a(J).length?(c(),h(`div`,W,[...r[15]||=[f(`span`,{class:`today-when`},`今天`,-1),f(`span`,{class:`today-axis`},[f(`i`)],-1),f(`span`,{class:`today-line`},null,-1)]])):g(``,!0)])])])}}}),[[`__scopeId`,`data-v-0a133ef9`]]);export{G as default};
1
+ import{a as e,i as t,o as n,r as ee,s as r}from"#entry";import{t as te}from"./DJM7u8P3.js";import{t as i}from"./CI0scS-N.js";import{At as a,K as o,S as s,U as c,Xt as l,Yt as u,b as d,d as f,f as p,i as m,lt as ne,m as h,p as g,qt as _,u as v,v as re,y}from"./BxuBMtk_.js";var b={class:`kpis`},ie={class:`v`},ae={class:`v`},oe={class:`v`},se={class:`v`},x={class:`v`},S={class:`card tl-wrap`},C={class:`card-hd tl-hd`},w={class:`h2`},T={class:`timeline`},E={key:0,class:`tl-today`},D={class:`tl-item`},O={class:`when`},k={class:`when-date mono`},A={class:`when-year`},j={class:`axis`},M={class:`node-top`},N={class:`tag tag-ghost`},P={key:0,class:`tag tag-neutral mono`},F={class:`node-title`},I={class:`criteria`},L={class:`nums`},R={class:`dim`},z={class:`mpct`},ce={class:`mss`},B={class:`st-id mono`},V={class:`st-title`},H={class:`st-state dim`},U={class:`st-pts dim`},W={key:0,class:`tl-today`},G=t(s({__name:`milestones`,setup(t){let{milestones:s,milestoneProgress:G,now:K,md:le,MS_LABEL:ue,MS_COLOR:de,KIND_LABEL:fe,KIND_ICON:pe,STATE_DOT:me,STATE_LABEL:he,diffDays:q}=r(),J=v(()=>[...s.value].sort((e,t)=>e.due<t.due?-1:+(e.due>t.due))),Y=e=>q(K,e),X=e=>{let t=G(e);return t.total?Math.round(t.done/t.total*100):0},Z=e=>e===`mvp`?`mint`:e===`release`?`lilac`:`ink`,ge=e=>({reached:`ok`,"at-risk":`risk`,planned:`plan`,missed:`miss`})[e]??`plan`,_e=[`日`,`一`,`二`,`三`,`四`,`五`,`六`],ve=e=>`周${_e[new Date(`${e}T00:00:00Z`).getUTCDay()]}`,ye=e=>{let t=Y(e);return t>0?`还剩 ${t} 天`:t===0?`今天到期`:`已过 ${-t} 天`},Q=v(()=>{let e=J.value.findIndex(e=>e.due>=K);return e<0?J.value.length:e}),$=v(()=>({mvp:s.value.filter(e=>e.kind===`mvp`).length,release:s.value.filter(e=>e.kind===`release`).length,checkpoint:s.value.filter(e=>e.kind===`checkpoint`).length,risk:s.value.filter(e=>e.status===`at-risk`||e.status===`missed`).length,reached:s.value.filter(e=>e.status===`reached`).length}));return(t,r)=>{let v=ee,K=te,q=i;return c(),h(`div`,null,[f(`div`,b,[f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(0)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(0),size:`sm`},null,8,[`tone`]),r[1]||=f(`p`,{class:`k`},`MVP 节点`,-1),f(`p`,ie,[y(l(a($).mvp),1),r[0]||=f(`small`,null,`个`,-1)])],2),f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(1)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(1),size:`sm`},null,8,[`tone`]),r[3]||=f(`p`,{class:`k`},`发布节点`,-1),f(`p`,ae,[y(l(a($).release),1),r[2]||=f(`small`,null,`个`,-1)])],2),f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(2)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(2),size:`sm`},null,8,[`tone`]),r[5]||=f(`p`,{class:`k`},`检查点`,-1),f(`p`,oe,[y(l(a($).checkpoint),1),r[4]||=f(`small`,null,`个`,-1)])],2),f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(3)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(3),size:`sm`},null,8,[`tone`]),r[6]||=f(`p`,{class:`k`},`已达成`,-1),f(`p`,se,[y(l(a($).reached),1),f(`small`,null,`/ `+l(a(s).length),1)])],2),f(`div`,{class:_([`kpi`,(`cardToneClass`in t?t.cardToneClass:a(n))(4)])},[d(v,{tone:(`cardTone`in t?t.cardTone:a(e))(4),size:`sm`},null,8,[`tone`]),r[8]||=f(`p`,{class:`k`},`有风险 / 错过`,-1),f(`p`,x,[y(l(a($).risk),1),r[7]||=f(`small`,null,`个`,-1)])],2)]),f(`div`,S,[f(`div`,C,[f(`h2`,w,[d(K,{name:`i-lucide-git-commit-vertical`,class:`size-3.5`}),r[9]||=y(`时间线`,-1)]),r[10]||=re(`<span class="dim tip" data-v-fcd79590>按到期日从早到晚 · 节点达成口径是「挂的故事全部完成」</span><div class="legend" data-v-fcd79590><span class="lg" data-v-fcd79590><i class="sw mint" data-v-fcd79590></i>MVP</span><span class="lg" data-v-fcd79590><i class="sw lilac" data-v-fcd79590></i>发布</span><span class="lg" data-v-fcd79590><i class="sw white" data-v-fcd79590></i>检查点</span><i class="sep" data-v-fcd79590></i><span class="lg" data-v-fcd79590><i class="dot ok" data-v-fcd79590></i>已达成</span><span class="lg" data-v-fcd79590><i class="dot risk" data-v-fcd79590></i>有风险</span><span class="lg" data-v-fcd79590><i class="dot plan" data-v-fcd79590></i>计划中</span></div>`,2)]),f(`div`,T,[(c(!0),h(m,null,o(a(J),(e,t)=>(c(),h(m,{key:e.id},[t===a(Q)?(c(),h(`div`,E,[...r[11]||=[f(`span`,{class:`today-when`},`今天`,-1),f(`span`,{class:`today-axis`},[f(`i`)],-1),f(`span`,{class:`today-line`},null,-1)]])):g(``,!0),f(`article`,D,[f(`div`,O,[f(`p`,k,l(a(le)(e.due)),1),f(`p`,A,l(ve(e.due)),1)]),f(`div`,j,[f(`span`,{class:_([`dot-lg`,ge(e.status)])},[e.status===`reached`?(c(),p(K,{key:0,name:`i-lucide-check`,class:`size-2.5`})):g(``,!0)],2)]),f(`div`,{class:_([`node`,`node-${Z(e.kind)}`])},[d(v,{tone:Z(e.kind),size:`xl`,min:3,max:5},null,8,[`tone`]),f(`div`,M,[f(`span`,N,l(e.id),1),f(`span`,{class:_([`tag`,`tag-${a(de)[e.status]}`])},l(a(ue)[e.status]),3),f(`span`,{class:_([`tag`,e.kind===`mvp`?`tag-mint`:e.kind===`release`?`tag-primary`:`tag-neutral`])},[d(K,{name:a(pe)[e.kind],class:`size-3`},null,8,[`name`]),y(l(a(fe)[e.kind]),1)],2),e.sprintId?(c(),h(`span`,P,l(e.sprintId),1)):g(``,!0),f(`span`,{class:_([`days`,{over:Y(e.due)<0,soon:Y(e.due)>=0&&Y(e.due)<=7}])},l(ye(e.due)),3)]),f(`h3`,F,l(e.title),1),f(`p`,I,l(e.criteria),1),f(`div`,L,[f(`span`,null,[f(`b`,null,l(a(G)(e).done)+`/`+l(a(G)(e).total),1),r[12]||=y(` 个故事`,-1)]),a(G)(e).cancelled?(c(),h(m,{key:0},[r[13]||=f(`span`,{class:`dim`},`·`,-1),f(`span`,R,l(a(G)(e).cancelled)+` 个已取消`,1)],64)):g(``,!0),r[14]||=f(`span`,{class:`dim`},`·`,-1),f(`span`,null,l(a(G)(e).points)+` 点`,1),f(`span`,z,l(X(e))+`%`,1)]),f(`div`,{class:_([`bar`,e.kind===`checkpoint`?``:Z(e.kind)])},[f(`i`,{style:u({width:X(e)+`%`})},null,4)],2),f(`ul`,ce,[(c(!0),h(m,null,o(a(G)(e).list,e=>(c(),h(`li`,{key:e.id},[d(q,{to:`/story/${e.id}`,class:`srow`},{default:ne(()=>[f(`i`,{class:`sdot`,style:u({background:a(me)[e.status]})},null,4),f(`span`,B,l(e.id),1),f(`span`,V,l(e.title),1),f(`span`,H,l(a(he)[e.status]),1),f(`span`,U,l(e.points),1)]),_:2},1032,[`to`])]))),128))])],2)])],64))),128)),a(Q)===a(J).length?(c(),h(`div`,W,[...r[15]||=[f(`span`,{class:`today-when`},`今天`,-1),f(`span`,{class:`today-axis`},[f(`i`)],-1),f(`span`,{class:`today-line`},null,-1)]])):g(``,!0)])])])}}}),[[`__scopeId`,`data-v-fcd79590`]]);export{G as default};
@@ -0,0 +1 @@
1
+ .back[data-v-a4bac36b]{margin-bottom:8px;margin-left:-8px}.hero[data-v-a4bac36b]{border-radius:var(--r-xl);margin-bottom:12px;padding:15px 17px 14px}.chips[data-v-a4bac36b]{flex-wrap:wrap;gap:5px;margin-bottom:10px;display:flex}.story-title[data-v-a4bac36b]{letter-spacing:-.028em;font-size:21px;font-weight:680;line-height:1.3}.narrative[data-v-a4bac36b]{color:var(--ink-2);max-width:88ch;margin:7px 0 13px;font-size:12.8px;line-height:1.6}.facts[data-v-a4bac36b]{grid-template-columns:repeat(auto-fit,minmax(122px,1fr));gap:7px;margin-bottom:12px;display:grid}.fact[data-v-a4bac36b]{background:var(--sunken-2);border:1px solid var(--line);border-radius:11px;flex-direction:column;gap:2px;min-width:0;padding:8px 11px;display:flex}.fact .k[data-v-a4bac36b]{letter-spacing:.07em;text-transform:uppercase;color:var(--ink-4);font-size:9.6px;font-weight:650}.fact b[data-v-a4bac36b]{letter-spacing:-.01em;flex-wrap:wrap;align-items:baseline;gap:3px;font-size:12.4px;font-weight:650;line-height:1.4;display:flex}.fact b small[data-v-a4bac36b]{white-space:nowrap;font-size:10px;font-weight:500}.hero-foot[data-v-a4bac36b]{align-items:center;gap:10px;display:flex}.hero-foot .dim[data-v-a4bac36b]{white-space:nowrap;font-size:10.8px}.hero-foot .bar[data-v-a4bac36b]{flex:1;max-width:320px}.cols[data-v-a4bac36b]{grid-template-columns:repeat(auto-fit,minmax(380px,1fr));gap:12px;display:grid}.block[data-v-a4bac36b]{border-radius:var(--r-lg);margin-bottom:12px;overflow:hidden}.bug[data-v-a4bac36b]{gap:11px;display:grid}.bug p[data-v-a4bac36b]{margin-top:3px;font-size:12.4px;line-height:1.6}.steps[data-v-a4bac36b]{background:var(--sunken);border:1px solid var(--line);border-radius:10px;padding:9px 11px}.dep-row[data-v-a4bac36b]{flex-wrap:wrap;gap:6px;margin-top:9px;display:flex}.dep[data-v-a4bac36b],.dep-row[data-v-a4bac36b]{align-items:center}.dep[data-v-a4bac36b]{border:1px solid var(--violet-line);background:var(--violet-soft);color:var(--violet-ink);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;gap:4px;max-width:100%;padding:3px 10px;font-size:11.4px;font-weight:600;display:inline-flex;overflow:hidden}.dep.ghost[data-v-a4bac36b]{border-color:var(--line-2);color:var(--ink-2);background:#fff}.dep[data-v-a4bac36b]:hover{border-color:#c7b6f9}.ac[data-v-a4bac36b]{counter-reset:ac;gap:10px;margin:0;padding:0;list-style:none;display:grid}.ac li[data-v-a4bac36b]{counter-increment:ac;background:var(--sunken-2);border:1px solid var(--line);border-radius:12px;padding:11px 13px 11px 42px;position:relative}.ac li[data-v-a4bac36b]:before{content:counter(ac);border:1px solid var(--violet-line);width:20px;height:20px;color:var(--violet-ink);background:#fff;border-radius:999px;place-items:center;font-size:10.4px;font-weight:700;display:grid;position:absolute;top:12px;left:12px}.ac-row[data-v-a4bac36b]{align-items:baseline;gap:8px;margin-top:3px;font-size:12.3px;line-height:1.6;display:flex}.ac-row[data-v-a4bac36b]:first-child{margin-top:0}.ac-row.verify[data-v-a4bac36b]{align-items:center;margin-top:8px;font-size:10.8px}.gw[data-v-a4bac36b]{flex:none;justify-content:center;width:46px}.task-hd[data-v-a4bac36b]{padding-bottom:10px}.task-title[data-v-a4bac36b]{min-width:0;font-size:12.8px;font-weight:650}.entries-ct[data-v-a4bac36b]{margin-left:auto;font-size:10.4px}.files[data-v-a4bac36b]{padding:7px 16px 0;font-size:10.4px}.entries[data-v-a4bac36b]{gap:8px;display:grid}.entry[data-v-a4bac36b]{background:var(--sunken-2);border:1px solid var(--line);border-left:3px solid var(--line-2);border-radius:12px;padding:10px 12px}.entry.red[data-v-a4bac36b]{border-left-color:#e08585}.entry.green[data-v-a4bac36b]{border-left-color:#8dc46a}.entry.refactor[data-v-a4bac36b]{border-left-color:var(--lilac-deep)}.entry-hd[data-v-a4bac36b]{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.date[data-v-a4bac36b]{font-size:10.4px}.dg-link .mono[data-v-a4bac36b],.result[data-v-a4bac36b]{margin-left:auto}.note[data-v-a4bac36b]{color:var(--ink-2);margin-top:6px;font-size:12.2px;line-height:1.6}.cmd[data-v-a4bac36b]{color:var(--violet-ink);background:#f4f0fe;border:1px solid #e5dbfd;border-radius:7px;align-items:center;gap:5px;margin-top:7px;padding:2px 8px;font-size:10.6px;display:inline-flex}.efiles[data-v-a4bac36b]{margin-top:6px;font-size:10.2px}.pager[data-v-a4bac36b]{grid-template-columns:1fr 1fr;gap:10px;margin-top:4px;display:grid}.pg[data-v-a4bac36b]{border-radius:var(--r-md);border:1px solid var(--line);box-shadow:var(--shadow-1);background:#fff;flex-direction:column;gap:3px;min-width:0;padding:10px 13px;transition:border-color .16s,transform .16s;display:flex}.pg[data-v-a4bac36b]:hover{border-color:#ded4fb;transform:translateY(-1px)}.pg.right[data-v-a4bac36b]{text-align:right;align-items:flex-end}.pg-k[data-v-a4bac36b]{letter-spacing:.05em;text-transform:uppercase;color:var(--ink-4);align-items:center;gap:4px;font-size:10.2px;font-weight:650;display:inline-flex}.pg-t[data-v-a4bac36b]{text-overflow:ellipsis;white-space:nowrap;max-width:100%;font-size:12.2px;font-weight:600;overflow:hidden}.dg-links[data-v-a4bac36b]{gap:4px;display:grid}.dg-link[data-v-a4bac36b]{color:var(--ink-2);border:1px solid #0000;border-radius:10px;align-items:center;gap:8px;padding:7px 9px;font-size:12px;display:flex}.dg-link[data-v-a4bac36b]:hover{background:var(--violet-soft);border-color:var(--violet-line);color:var(--violet-ink)}.dg-link .mono[data-v-a4bac36b]{font-size:10.4px}