scrum-skills 0.3.4 → 0.3.5

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 (61) hide show
  1. package/README.md +224 -224
  2. package/assets/board/200.html +1 -1
  3. package/assets/board/404.html +1 -1
  4. package/assets/board/_nuxt/{D1V1gysQ.js → 1XlYaCp9.js} +1 -1
  5. package/assets/board/_nuxt/BKrRful0.js +3 -0
  6. package/assets/board/_nuxt/{DwzGxoX2.js → BXL77dAA.js} +1 -1
  7. package/assets/board/_nuxt/{Utb4TVOl.js → BbxmvdIF.js} +1 -1
  8. package/assets/board/_nuxt/{DwCE3305.js → BizDeOK5.js} +1 -1
  9. package/assets/board/_nuxt/{BGwhkDRl.js → BtzUbHO_.js} +1 -1
  10. package/assets/board/_nuxt/{BmrSh0rL.js → COecDWbb.js} +1 -1
  11. package/assets/board/_nuxt/{CoipdpDu.js → ChUHb39z.js} +1 -1
  12. package/assets/board/_nuxt/{C-fx-vFO.js → CtFknnHZ.js} +1 -1
  13. package/assets/board/_nuxt/{BU8vdZUs.js → DKRYKLGF.js} +61 -50
  14. package/assets/board/_nuxt/{Cajxc4Dw.js → DZ--fXuU.js} +1 -1
  15. package/assets/board/_nuxt/D_ct-Stz.js +1 -1
  16. package/assets/board/_nuxt/_id_.ItzoSaBL.css +1 -0
  17. package/assets/board/_nuxt/builds/latest.json +1 -1
  18. package/assets/board/_nuxt/builds/meta/205ddf7c-da58-4213-ac80-82930a216157.json +1 -0
  19. package/assets/board/_nuxt/burndown.CT8fx1Ge.css +1 -0
  20. package/assets/board/_nuxt/diagrams.BWgRXpo3.css +1 -0
  21. package/assets/board/_nuxt/{entry.BBv-sBnP.css → entry.DplN301E.css} +1 -1
  22. package/assets/board/_nuxt/epics.CUeDIEa0.css +1 -0
  23. package/assets/board/_nuxt/error-404.Y9imKiDC.css +1 -0
  24. package/assets/board/_nuxt/error-500.DufSBGVC.css +1 -0
  25. package/assets/board/_nuxt/gantt.CiC2Ts1t.css +1 -0
  26. package/assets/board/_nuxt/last-change.Byf5fhdY.css +1 -0
  27. package/assets/board/_nuxt/milestones.Civ3sMiQ.css +1 -0
  28. package/assets/board/_nuxt/{b7xtxFRl.js → oSJF4yHw.js} +1 -1
  29. package/assets/board/_nuxt/pages.BshWbOyo.css +1 -0
  30. package/assets/board/_nuxt/tests.Ci9fBCka.css +1 -0
  31. package/assets/board/burndown/index.html +1 -1
  32. package/assets/board/diagrams/index.html +1 -1
  33. package/assets/board/epics/index.html +1 -1
  34. package/assets/board/favicon.svg +16 -16
  35. package/assets/board/gantt/index.html +1 -1
  36. package/assets/board/index.html +1 -1
  37. package/assets/board/last-change/index.html +1 -1
  38. package/assets/board/milestones/index.html +1 -1
  39. package/assets/board/tests/index.html +1 -1
  40. package/bin/scrum-skills.mjs +204 -204
  41. package/docs/ai-assistant-guide.md +1009 -1008
  42. package/package.json +41 -42
  43. package/templates/AGENTS.md +84 -84
  44. package/tools/agile-tools.mjs +510 -510
  45. package/tools/ai.mjs +508 -464
  46. package/tools/git-commit.mjs +216 -216
  47. package/tools/projects.mjs +240 -240
  48. package/tools/serve.mjs +180 -180
  49. package/assets/board/_nuxt/Dmg78zOY.js +0 -3
  50. package/assets/board/_nuxt/_id_.B6iqDPxe.css +0 -1
  51. package/assets/board/_nuxt/builds/meta/08bebe14-0f1b-4d2a-8de4-e84e122d10e9.json +0 -1
  52. package/assets/board/_nuxt/burndown.Do6IbM6o.css +0 -1
  53. package/assets/board/_nuxt/diagrams.pyhqNtmr.css +0 -1
  54. package/assets/board/_nuxt/epics.Dmessplu.css +0 -1
  55. package/assets/board/_nuxt/error-404.CgJNdpB5.css +0 -1
  56. package/assets/board/_nuxt/error-500.WYSoH44y.css +0 -1
  57. package/assets/board/_nuxt/gantt.Dmp00GUo.css +0 -1
  58. package/assets/board/_nuxt/last-change.1Su4GrCN.css +0 -1
  59. package/assets/board/_nuxt/milestones.U0xKCsEo.css +0 -1
  60. package/assets/board/_nuxt/pages.Dbj2IVk8.css +0 -1
  61. package/assets/board/_nuxt/tests.dXlUX16A.css +0 -1
@@ -0,0 +1,3 @@
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 ee,I as te,K as o,N as ne,S as re,U as s,Xt as c,Yt as ie,at as ae,b as l,d as u,f as d,i as f,lt as oe,m as p,p as m,qt as h,s as se,u as g,v as ce,xt as _,y as v}from"./BxuBMtk_.js";import{c as y}from"./BygIGL69.js";var le={added:`新增`,updated:`状态变更`,removed:`移除`},ue=`更新交付记录`,b=`变更`,x=e=>typeof e==`string`?e.replace(/\s+/g,` `).trim():``;function de(e){let t=Array.isArray(e?.changes)?e.changes:[],n=x(e?.title)||ue,r=t.some(e=>e?.action===`added`)?`feat`:`chore`,i=[];for(let e of t){let t=x(e?.id);if(!t)continue;let n=x(e.title)||x(e.note),r=le[e.action]||x(e.action)||b;e.action===`updated`&&(x(e.from)||x(e.to))&&(r+=` ${x(e.from)||`—`} → ${x(e.to)||`—`}`),i.push(`- ${t}${n?` ${n}`:``}(${r})`)}return i.length?`${r}: ${n}\n\n${i.join(`
2
+ `)}`:`${r}: ${n}`}var S=/(?:^|(?<=[\s。;;::,,))]))(?:\d{1,2}[.)、]|[((]\d{1,2}[))]|[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳]|[-*•·])\s+/gm,C=/(?<=[。;;])/,w=e=>typeof e==`string`?e.replace(/[\r\n]+/g,` `).replace(/\s{2,}/g,` `).trim():``,T=e=>e.match(S)?.length??0,E=20,D=e=>e.replace(/[;;,,]+$/,``).trim(),O=e=>e.length>1?e.map(D).filter(Boolean):e;function k(e){if(T(e)<2)return[];let t=e.split(S).map(w).filter(Boolean);return t.length>1&&t[0].length<=E&&/[::]$/.test(t[0])&&t.splice(0,2,`${t[0]}${t[1]}`),O(t)}function fe(e){if(Array.isArray(e))return O(e.map(w).filter(Boolean));let t=w(e);if(!t)return[];let n=String(e).split(/\r?\n/).map(w).filter(Boolean);if(n.length>1)return O(n.flatMap(e=>{let t=k(e);return t.length?t:[e]}).filter(Boolean));let r=k(t);if(r.length>1)return r;let i=O(t.split(C).map(w).filter(Boolean));return i.length>1?i:[t]}var pe={class:`rule-top`},me={class:`rule-ic`},he={class:`rule-state`},ge={class:`mono`},_e={key:0},ve={class:`rule-cases`},ye={class:`case-when`},be={class:`case-then`},xe={key:1,class:`lc-hist-bar`},Se={class:`hist-badge`},Ce={class:`hist-readonly mono`},we=[`title`,`disabled`,`onClick`],Te={key:2,class:`card lc-empty`},Ee={class:`em-ic`},De={key:3,class:`lc`},Oe={class:`lc-hero`},ke={class:`hero-body`},Ae={class:`hero-kicker`},je={class:`k-date mono`},Me={key:0,class:`k-time mono`},Ne={key:1,class:`k-today`},Pe=[`title`],Fe={class:`hero-title`},Ie={key:0,class:`hero-points`},Le={key:1,class:`hero-sum`},Re={class:`hero-meta`},ze={class:`hero-aside`},Be={class:`ring-in`},Ve={class:`lc-nav`,"aria-label":`分区导航`},He=[`href`,`onClick`],Ue={class:`lc-nav-lb`},We={class:`lc-nav-ct`},Ge={id:`lc-scenarios`,class:`lc-sc-sec`},Ke={class:`s-hd solo`},qe={class:`s-ic tone-mint`},Je={class:`s-count`},Ye={key:0,class:`dim sec-empty`},Xe={key:1,class:`lc-sc-grid`},Ze={class:`sc-hd`},Qe={class:`sc-id mono`},$e={class:`sc-title`},et={key:0,class:`sc-body`},tt={class:`lc-sc-steps`},nt={class:`sc-acc`},rt={class:`sc-acc-h`},it={class:`sc-acc-t`},at={key:0,class:`sc-foot`},ot={key:0},st={key:1,class:`sc-ids`},ct={key:0,id:`lc-access`,class:`card sec lc-access`},lt={class:`s-hd`},ut={class:`s-ic tone-sky`},dt={class:`s-count`},ft={class:`sec-bd acc-grid`},pt={key:0,class:`acc-col`},mt={class:`u-head`},ht=[`href`],gt={class:`u-label`},_t=[`onClick`],vt={class:`u-url mono`},yt={key:0,class:`u-note`},bt={key:1,class:`acc-col`},xt={class:`a-head`},St={key:0,class:`a-role`},Ct={class:`a-user mono`},wt=[`onClick`],Tt={class:`a-line`},Et={key:0,class:`a-pass mono`},Dt={key:1,class:`a-none dim`},Ot={key:0,class:`a-note`},kt={key:1,id:`lc-prep`,class:`card sec lc-prep`},At={class:`s-hd`},jt={class:`s-ic tone-amber`},Mt={class:`s-count`},Nt={class:`steps`},Pt={class:`step-bd`},Ft={class:`step-text`},It={key:0,class:`cmd-row`},Lt={class:`cmd mono`},Rt=[`onClick`],zt={key:1,class:`step-note`},Bt={id:`lc-changes`,class:`card sec`},Vt={class:`s-hd`},Ht={class:`s-ic`},Ut={class:`s-count`},Wt={key:0,class:`sec-empty dim`},Gt={key:1,class:`tbl-wrap`},Kt={class:`tbl lc-tbl`},qt={class:`ent`},Jt={class:`ent-top`},Yt={key:0,class:`ent-title`},Xt={key:0,class:`flow mono`},Zt={class:`fl`},Qt={class:`fl`},$t={class:`cell-note`},en={class:`chips`},tn=[`title`],nn={key:0,class:`dim`},rn={class:`two`},an={id:`lc-extras`,class:`card sec`},on={class:`s-hd`},sn={class:`s-ic`},cn={class:`s-count`},ln={class:`sec-bd lc-extras`},un={key:0,class:`dim`},dn={class:`x-body`},fn={class:`x-title`},pn={key:0,class:`x-detail`},mn={key:1,class:`chips x-files`},hn=[`title`],gn={id:`lc-checks`,class:`card sec`},_n={class:`s-hd`},vn={class:`s-ic tone-mint`},yn={class:`s-count`},bn={class:`sec-bd lc-checks`},xn={key:0,class:`dim`},Sn={class:`v-body`},Cn={class:`v-what`},wn={key:0,class:`v-detail`},Tn={class:`two`},En={id:`lc-notes`,class:`card sec`},Dn={class:`s-hd`},On={class:`s-ic`},kn={class:`s-count`},An={class:`sec-bd`},jn={key:0,class:`dim`},Mn={key:1,class:`lc-notes`},Nn={key:0,id:`lc-open`,class:`card sec sec-warn`},Pn={class:`s-hd`},Fn={class:`s-ic`},In={class:`s-count`},Ln={class:`sec-bd`},Rn={class:`lc-notes warn`},zn={class:`lc-hist`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lc-hist-title`},Bn={class:`lc-hist-hd`},Vn={class:`lc-hist-hd-txt`},Hn={class:`lc-hist-sub`},Un={key:0,class:`lc-hist-err`},Wn={key:1,class:`lc-hist-hint dim`},Gn={key:2,class:`lc-hist-list`},Kn=[`disabled`,`onClick`],qn={class:`hist-item-main`},Jn={class:`mono`},Yn={class:`mono hist-item-hash`},Xn={key:0,class:`lc-hist-hint dim`},Zn={class:`lc-hist-ft`},Qn={class:`lc-hist lc-commit`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lc-commit-title`},$n={class:`lc-hist-hd`},er=[`disabled`],tr={key:0,class:`cm-done`},nr={class:`cm-done-ic`},rr={class:`cm-done-bd`},ir={class:`cm-done-t`},ar={class:`mono`},or={class:`cm-done-s`},sr={class:`cm-done-n`},cr={key:1,class:`cm-body`},lr={class:`cm-msg mono`},ur={class:`micro`},dr={key:0,class:`cm-hint dim`},fr={key:1,class:`cm-hint warn`},pr={key:2,class:`cm-hint warn`},mr={key:3,class:`cm-hint dim`},hr={key:4,class:`cm-files`},gr=[`title`],_r={key:2,class:`lc-hist-err`},vr={class:`lc-hist-ft`},yr={class:`dim`},br={class:`cm-acts`},xr=[`disabled`],Sr=[`disabled`],A=r(re({__name:`last-change`,setup(r){let{lastChange:re,lastChangeGit:le,refresh:ue}=i(),b=_(null),x=g(()=>b.value?.doc?.lastChange??re.value),S=g(()=>le.value),C=_([]),w=_(!1),T=_(!1),E=_(``),D=_(!1),O=g(()=>b.value?[b.value]:[]);async function k(){if(!T.value){T.value=!0,E.value=``;try{let e=await n(`/api/agile/last-change/history`);C.value=e.entries??[]}catch(e){E.value=e?.data?.error||e?.message||`读不到 git 历史`}finally{T.value=!1}}}async function A(){w.value=!0,C.value.length||await k()}async function Cr(e){if(!D.value){D.value=!0,E.value=``;try{b.value=await n(`/api/agile/last-change/revision`,{query:{hash:e.hash}}),w.value=!1,window.scrollTo({top:0,behavior:`smooth`})}catch(e){E.value=e?.data?.error||e?.message||`取不到这个版本`}finally{D.value=!1}}}function wr(){b.value=null,window.scrollTo({top:0,behavior:`smooth`})}let Tr=_(null);ae(b,async()=>{await ne(),Tr.value?.querySelector(`.hist-tab.on`)?.scrollIntoView({inline:`nearest`,block:`nearest`})});function Er(e){e.key===`Escape`&&(J.value?$():w.value&&=!1)}ee(()=>window.addEventListener(`keydown`,Er)),te(()=>window.removeEventListener(`keydown`,Er));let Dr={committed:{text:`已提交`,tone:`ok`},dirty:{text:`未提交改动`,tone:`warn`},untracked:{text:`未纳入版本库`,tone:`warn`},"no-git":{text:`非 git 仓库`,tone:`neutral`},missing:{text:`尚未生成`,tone:`neutral`}},j=g(()=>Dr[S.value?.state??`missing`]??Dr.missing),Or=[{key:`committed`,when:`已提交`,then:`下次写入整份覆盖;上一版留在 git 历史里,点「查看历史」随时翻回来`},{key:`pending`,when:`未提交`,then:`下次写入合并:新交付接在旧记录后面,不冲掉还没入库的内容`}],kr=g(()=>{let e=S.value?.state;return e===`committed`?`committed`:e===`dirty`||e===`untracked`||e===`no-git`?`pending`:``}),M=g(()=>fe(x.value?.summary)),Ar=g(()=>(x.value?.mergedFrom?.length??0)+1),jr=g(()=>(x.value?.mergedFrom??[]).map(e=>`${e.at??``} ${e.title??``}`.trim()).filter(Boolean).join(`
3
+ `)),Mr={added:`新增`,updated:`状态变更`,removed:`移除`},Nr={story:`故事`,task:`任务`},Pr={pass:`通过`,fail:`失败`,partial:`部分`,skipped:`未跑`},Fr={pass:`i-lucide-check`,fail:`i-lucide-x`,partial:`i-lucide-minus`,skipped:`i-lucide-minus`},N=g(()=>x.value?.changes??[]),P=g(()=>de(x.value??{})),F=g(()=>x.value?.extras??[]),I=g(()=>x.value?.verification??[]),L=g(()=>x.value?.scenarios??[]),R=g(()=>x.value?.preparation??[]),z=g(()=>x.value?.notes??[]),B=g(()=>x.value?.open??[]),V=g(()=>x.value?.access?.urls??[]),H=g(()=>x.value?.access?.accounts??[]),U=g(()=>I.value.filter(e=>e.result===`pass`).length),Ir=g(()=>I.value.length>0&&U.value===I.value.length),Lr=g(()=>I.value.length?Math.round(U.value/I.value.length*100):0),Rr=g(()=>[...new Set([...N.value.flatMap(e=>e.files??[]),...F.value.flatMap(e=>e.files??[])])]),zr=e=>e.kind===`story`?e.id:e.id.replace(/-T\d+$/,``),Br=g(()=>[{id:`lc-scenarios`,label:`测试场景`,icon:`i-lucide-flask-conical`,count:`${L.value.length}`,tone:`teal`},...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-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`},{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 Vr(e){let t=document.getElementById(e);t&&(t.scrollIntoView({behavior:`smooth`,block:`start`}),history.replaceState(null,``,`#${e}`))}let W=new Date,Hr=`${W.getFullYear()}-${String(W.getMonth()+1).padStart(2,`0`)}-${String(W.getDate()).padStart(2,`0`)}`,G=g(()=>(x.value?.at??``).slice(0,10)),Ur=g(()=>{let e=(x.value?.at??``).slice(10).replace(/^[T ]/,``);return/^\d{2}:\d{2}/.test(e)?e:``}),Wr=g(()=>!!G.value&&G.value===Hr),K=_(``);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=_(!1),Y=_(!1),X=_(``),Z=_(null),Q=_(null),Gr=g(()=>!!Z.value?.isRepo&&!Z.value?.blocked&&(Z.value?.files.length??0)>0&&!Y.value);async function Kr(){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 qr(){if(Gr.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 ue()}catch(e){X.value=e?.data?.error||e?.message||`提交失败`}finally{Y.value=!1}}}return(n,r)=>{let i=e,ee=t;return s(),p(f,null,[a(b)?(s(),p(`div`,xe,[u(`span`,Se,[l(i,{name:`i-lucide-history`,class:`hist-badge-ic`}),r[8]||=v(`历史版本`,-1)]),u(`span`,Ce,[v(`只读 · `+c(a(b).short),1),a(b).date?(s(),p(f,{key:0},[v(` · `+c(a(b).date),1)],64)):m(``,!0)]),u(`div`,{ref_key:`tabsRef`,ref:Tr,class:`lc-hist-tabs`},[u(`button`,{class:`hist-tab`,onClick:wr},`最新`),(s(!0),p(f,null,o(a(O),e=>(s(),p(`button`,{key:e.hash,class:h([`hist-tab`,{on:a(b)?.hash===e.hash}]),title:`${e.date} ${e.subject??``}`,disabled:a(D),onClick:t=>Cr(e)},[v(c(e.short),1),u(`i`,null,c(e.date.slice(5,16)),1)],10,we))),128))],512),u(`button`,{class:`rule-btn`,onClick:A},[l(i,{name:`i-lucide-list`,class:`rule-btn-ic`}),r[9]||=v(`选择历史…`,-1)])])):(s(),p(`div`,{key:0,class:h([`lc-rule`,`is-${a(j).tone}`])},[u(`div`,pe,[u(`span`,me,[l(i,{name:`i-lucide-git-branch`,class:`rule-svg`})]),r[6]||=u(`b`,{class:`rule-title`},`写入规则`,-1),r[7]||=u(`span`,{class:`rule-file mono`},`agile/last-change.json`,-1),u(`span`,he,[u(`i`,{class:h([`rule-dot`,`tone-${a(j).tone}`])},null,2),v(` 当前 `+c(a(j).text),1),a(S)?.state===`committed`&&a(S).hash?(s(),p(f,{key:0},[r[4]||=v(` · `,-1),u(`span`,ge,c(a(S).hash),1)],64)):m(``,!0)]),u(`button`,{class:`rule-btn`,onClick:A},[l(i,{name:`i-lucide-history`,class:`rule-btn-ic`}),r[5]||=v(`查看历史 `,-1),a(C).length?(s(),p(`i`,_e,c(a(C).length),1)):m(``,!0)])]),u(`ul`,ve,[(s(),p(f,null,o(Or,e=>u(`li`,{key:e.key,class:h([`rule-case`,{on:a(kr)===e.key}])},[u(`span`,ye,c(e.when),1),l(i,{name:`i-lucide-arrow-right`,class:`case-arrow`}),u(`span`,be,c(e.then),1)],2)),64))])],2)),a(x)?(s(),p(`div`,De,[u(`header`,Oe,[u(`div`,ke,[u(`p`,Ae,[r[11]||=u(`span`,{class:`k-dot`},null,-1),r[12]||=v(`最近一次交付 `,-1),r[13]||=u(`span`,{class:`k-sep`},null,-1),u(`span`,je,c(a(G)),1),a(Ur)?(s(),p(`span`,Me,c(a(Ur)),1)):m(``,!0),a(Wr)?(s(),p(`span`,Ne,`今天`)):m(``,!0),a(x).merged?(s(),p(`span`,{key:2,class:`k-merged`,title:a(jr)},`合并记录 · `+c(a(Ar))+` 次交付`,9,Pe)):m(``,!0)]),u(`h2`,Fe,c(a(x).title),1),a(M).length>1?(s(),p(`ol`,Ie,[(s(!0),p(f,null,o(a(M),(e,t)=>(s(),p(`li`,{key:t},c(e),1))),128))])):a(M).length?(s(),p(`p`,Le,c(a(M)[0]),1)):m(``,!0),u(`div`,Re,[u(`span`,null,[u(`b`,null,c(a(N).length),1),r[14]||=v(` 处变更`,-1)]),r[19]||=u(`i`,{class:`meta-sep`},null,-1),u(`span`,null,[u(`b`,null,c(a(Rr).length),1),r[15]||=v(` 个文件`,-1)]),r[20]||=u(`i`,{class:`meta-sep`},null,-1),u(`span`,null,[u(`b`,null,c(a(L).length),1),r[16]||=v(` 条测试场景`,-1)]),a(F).length?(s(),p(f,{key:0},[r[18]||=u(`i`,{class:`meta-sep`},null,-1),u(`span`,null,[u(`b`,null,c(a(F).length),1),r[17]||=v(` 项额外工作`,-1)])],64)):m(``,!0)])]),u(`div`,ze,[u(`div`,{class:h([`ring`,{warn:a(I).length&&!a(Ir)}]),style:ie({"--pct":a(Lr)})},[u(`div`,Be,[u(`b`,null,[v(c(a(U)),1),u(`small`,null,`/`+c(a(I).length||0),1)]),u(`span`,null,c(a(I).length?a(Ir)?`验证全通过`:`有未通过项`:`无验证记录`),1)])],6)])]),u(`nav`,Ve,[(s(!0),p(f,null,o(a(Br),e=>(s(),p(`a`,{key:e.id,class:h([`lc-nav-link`,`tone-${e.tone}`]),href:`#${e.id}`,onClick:y(t=>Vr(e.id),[`prevent`])},[l(i,{name:e.icon,class:`lc-nav-ic`},null,8,[`name`]),u(`span`,Ue,c(e.label),1),u(`b`,We,c(e.count),1)],10,He))),128))]),u(`section`,Ge,[u(`div`,Ke,[u(`span`,qe,[l(i,{name:`i-lucide-flask-conical`,class:`s-svg`})]),r[21]||=u(`h2`,{class:`s-title`},`测试场景`,-1),u(`span`,Je,c(a(L).length),1),r[22]||=u(`span`,{class:`s-hint`},`一条一段:照着步骤走,末尾那句就是验收标准`,-1)]),a(L).length?(s(),p(`div`,Xe,[(s(!0),p(f,null,o(a(L),(e,t)=>(s(),p(`article`,{key:e.id??t,class:`sc lc-sc`},[u(`header`,Ze,[u(`span`,Qe,c(e.id??`TC-${t+1}`),1),u(`h3`,$e,c(e.title),1)]),e.steps?.length?(s(),p(`div`,et,[r[23]||=u(`p`,{class:`micro`},`测试步骤`,-1),u(`ol`,tt,[(s(!0),p(f,null,o(e.steps,(e,t)=>(s(),p(`li`,{key:t},c(e),1))),128))])])):m(``,!0),u(`div`,nt,[u(`p`,rt,[l(i,{name:`i-lucide-badge-check`,class:`sc-acc-ic`}),r[24]||=v(`验收标准`,-1)]),u(`p`,it,c(e.expect),1),e.acceptance||e.storyIds?.length?(s(),p(`div`,at,[e.acceptance?(s(),p(`span`,ot,`对应验收:`+c(e.acceptance),1)):m(``,!0),e.storyIds?.length?(s(),p(`span`,st,[(s(!0),p(f,null,o(e.storyIds,e=>(s(),d(ee,{key:e,to:`/story/${e}`,class:`ent-id mono`},{default:oe(()=>[v(c(e),1)]),_:2},1032,[`to`]))),128))])):m(``,!0)])):m(``,!0)])]))),128))])):(s(),p(`p`,Ye,`这次没有单独列测试场景。`))]),a(V).length||a(H).length?(s(),p(`section`,ct,[u(`div`,lt,[u(`span`,ut,[l(i,{name:`i-lucide-key-round`,class:`s-svg`})]),r[25]||=u(`h2`,{class:`s-title`},`调试入口与账号`,-1),u(`span`,dt,c(a(V).length+a(H).length),1),r[26]||=u(`span`,{class:`s-hint`},`照着这一栏就能自己跑起来点一遍`,-1)]),u(`div`,ft,[a(V).length?(s(),p(`div`,pt,[r[27]||=u(`p`,{class:`micro`},`访问地址`,-1),(s(!0),p(f,null,o(a(V),(e,t)=>(s(),p(`div`,{key:t,class:`u-item`},[u(`div`,mt,[u(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,class:`u-link`},[u(`span`,gt,c(e.label??`入口`),1),l(i,{name:`i-lucide-arrow-up-right`,class:`u-go`})],8,ht),u(`button`,{class:h([`cpy`,{ok:a(K)===`url-${t}`}]),onClick:n=>q(e.url,`url-${t}`)},[l(i,{name:a(K)===`url-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),v(` `+c(a(K)===`url-${t}`?`已复制`:`复制`),1)],10,_t)]),u(`p`,vt,c(e.url),1),e.note?(s(),p(`p`,yt,c(e.note),1)):m(``,!0)]))),128))])):m(``,!0),a(H).length?(s(),p(`div`,bt,[r[29]||=u(`p`,{class:`micro`},`账号密码`,-1),(s(!0),p(f,null,o(a(H),(e,t)=>(s(),p(`div`,{key:t,class:`a-item`},[u(`div`,xt,[e.role?(s(),p(`span`,St,c(e.role),1)):m(``,!0),u(`span`,Ct,c(e.username),1),u(`button`,{class:h([`cpy`,{ok:a(K)===`acc-${t}`}]),onClick:n=>q(e.password?`账号:${e.username}\n密码:${e.password}`:e.username,`acc-${t}`)},[l(i,{name:a(K)===`acc-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),v(` `+c(a(K)===`acc-${t}`?`已复制`:`复制`),1)],10,wt)]),u(`div`,Tt,[r[28]||=u(`span`,{class:`a-key`},`密码`,-1),e.password?(s(),p(`span`,Et,c(e.password),1)):(s(),p(`span`,Dt,`无密码 / 走单点登录`))]),e.note?(s(),p(`p`,Ot,c(e.note),1)):m(``,!0)]))),128))])):m(``,!0)])])):m(``,!0),a(R).length?(s(),p(`section`,kt,[u(`div`,At,[u(`span`,jt,[l(i,{name:`i-lucide-terminal-square`,class:`s-svg`})]),r[30]||=u(`h2`,{class:`s-title`},`测试前准备`,-1),u(`span`,Mt,c(a(R).length),1),r[31]||=u(`span`,{class:`s-hint`},`按顺序做完这些再开始点,命令可直接复制`,-1)]),u(`ol`,Nt,[(s(!0),p(f,null,o(a(R),(e,t)=>(s(),p(`li`,{key:t},[u(`div`,Pt,[u(`p`,Ft,c(e.step),1),e.command?(s(),p(`div`,It,[u(`code`,Lt,c(e.command),1),u(`button`,{class:h([`cpy`,{ok:a(K)===`cmd-${t}`}]),onClick:n=>q(e.command??``,`cmd-${t}`)},[l(i,{name:a(K)===`cmd-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),v(` `+c(a(K)===`cmd-${t}`?`已复制`:`复制`),1)],10,Rt)])):m(``,!0),e.note?(s(),p(`p`,zt,c(e.note),1)):m(``,!0)])]))),128))])])):m(``,!0),u(`section`,Bt,[u(`div`,Vt,[u(`span`,Ht,[l(i,{name:`i-lucide-git-commit-horizontal`,class:`s-svg`})]),r[33]||=u(`h2`,{class:`s-title`},`变更清单`,-1),u(`span`,Ut,c(a(N).length),1),r[34]||=u(`span`,{class:`s-hint`},`故事与任务各自是新增还是状态变更、动过哪些文件`,-1),a(N).length?(s(),p(`button`,{key:0,class:h([`rule-btn s-copy`,{ok:a(K)===`commit`}]),title:`按 Conventional Commits 生成:首行是标题,正文每条变更带编号与名称`,onClick:r[0]||=e=>q(a(P),`commit`)},[l(i,{name:a(K)===`commit`?`i-lucide-check`:`i-lucide-clipboard-copy`,class:`rule-btn-ic`},null,8,[`name`]),v(` `+c(a(K)===`commit`?`已复制`:`复制变更信息`),1)],2)):m(``,!0),!a(b)&&a(N).length?(s(),p(`button`,{key:1,class:`rule-btn s-commit`,title:`把这次交付整份提交进本地仓库:git add -A + git commit,不 push`,onClick:Kr},[l(i,{name:`i-lucide-git-commit-vertical`,class:`rule-btn-ic`}),r[32]||=v(`自动提交 `,-1)])):m(``,!0)]),a(N).length?(s(),p(`div`,Gt,[u(`table`,Kt,[r[36]||=u(`colgroup`,null,[u(`col`,{class:`c-ent`}),u(`col`,{class:`c-act`}),u(`col`),u(`col`,{class:`c-file`})],-1),r[37]||=u(`thead`,null,[u(`tr`,null,[u(`th`,null,`条目`),u(`th`,null,`变更`),u(`th`,null,`变更内容`),u(`th`,null,`涉及文件`)])],-1),u(`tbody`,null,[(s(!0),p(f,null,o(a(N),(e,t)=>(s(),p(`tr`,{key:`${e.kind}-${e.id}-${t}`},[u(`td`,null,[u(`div`,qt,[u(`div`,Jt,[u(`span`,{class:h([`kind`,`kind-${e.kind}`])},c(Nr[e.kind]??e.kind),3),l(ee,{to:`/story/${zr(e)}`,class:`ent-id mono`},{default:oe(()=>[v(c(e.id),1)]),_:2},1032,[`to`])]),e.title?(s(),p(`p`,Yt,c(e.title),1)):m(``,!0)])]),u(`td`,null,[u(`span`,{class:h([`act`,`act-${e.action}`])},c(Mr[e.action]??e.action),3),e.from||e.to?(s(),p(`p`,Xt,[u(`span`,Zt,c(e.from??`—`),1),r[35]||=u(`i`,null,`→`,-1),u(`span`,Qt,c(e.to??`—`),1)])):m(``,!0)]),u(`td`,$t,c(e.note??`—`),1),u(`td`,null,[u(`div`,en,[(s(!0),p(f,null,o(e.files,e=>(s(),p(`span`,{key:e,class:`fchip mono`,title:e},c(e),9,tn))),128)),e.files?.length?m(``,!0):(s(),p(`span`,nn,`—`))])])]))),128))])])])):(s(),p(`p`,Wt,`这次没有涉及任何故事或任务。`))]),u(`div`,rn,[u(`section`,an,[u(`div`,on,[u(`span`,sn,[l(i,{name:`i-lucide-sparkles`,class:`s-svg`})]),r[38]||=u(`h2`,{class:`s-title`},`额外做的事`,-1),u(`span`,cn,c(a(F).length),1)]),u(`div`,ln,[a(F).length?m(``,!0):(s(),p(`p`,un,`没有计划外的改动。`)),(s(!0),p(f,null,o(a(F),(e,t)=>(s(),p(`article`,{key:t,class:`x-item`},[r[39]||=u(`span`,{class:`x-mark`},null,-1),u(`div`,dn,[u(`p`,fn,c(e.title),1),e.detail?(s(),p(`p`,pn,c(e.detail),1)):m(``,!0),e.files?.length?(s(),p(`div`,mn,[(s(!0),p(f,null,o(e.files,e=>(s(),p(`span`,{key:e,class:`fchip mono`,title:e},c(e),9,hn))),128))])):m(``,!0)])]))),128))])]),u(`section`,gn,[u(`div`,_n,[u(`span`,vn,[l(i,{name:`i-lucide-badge-check`,class:`s-svg`})]),r[40]||=u(`h2`,{class:`s-title`},`验证结果`,-1),u(`span`,yn,c(a(U))+`/`+c(a(I).length),1)]),u(`div`,bn,[a(I).length?m(``,!0):(s(),p(`p`,xn,`这次没有留下验证记录。`)),(s(!0),p(f,null,o(a(I),(e,t)=>(s(),p(`div`,{key:t,class:`v-item`},[u(`span`,{class:h([`v-ic`,`v-${e.result}`])},[l(i,{name:Fr[e.result]??`i-lucide-circle`,class:`v-svg`},null,8,[`name`])],2),u(`div`,Sn,[u(`p`,Cn,c(e.what),1),e.detail?(s(),p(`p`,wn,c(e.detail),1)):m(``,!0)]),u(`span`,{class:h([`v-res`,`v-${e.result}`])},c(Pr[e.result]??e.result),3)]))),128))])])]),u(`div`,Tn,[u(`section`,En,[u(`div`,Dn,[u(`span`,On,[l(i,{name:`i-lucide-message-square-more`,class:`s-svg`})]),r[41]||=u(`h2`,{class:`s-title`},`说明`,-1),u(`span`,kn,c(a(z).length),1)]),u(`div`,An,[a(z).length?(s(),p(`ul`,Mn,[(s(!0),p(f,null,o(a(z),(e,t)=>(s(),p(`li`,{key:t},c(e),1))),128))])):(s(),p(`p`,jn,`没有额外说明。`))])]),a(B).length?(s(),p(`section`,Nn,[u(`div`,Pn,[u(`span`,Fn,[l(i,{name:`i-lucide-list-todo`,class:`s-svg`})]),r[42]||=u(`h2`,{class:`s-title`},`还没做的`,-1),u(`span`,In,c(a(B).length),1)]),u(`div`,Ln,[u(`ul`,Rn,[(s(!0),p(f,null,o(a(B),(e,t)=>(s(),p(`li`,{key:t},c(e),1))),128))])])])):m(``,!0)])])):(s(),p(`div`,Te,[u(`span`,Ee,[l(i,{name:`i-lucide-clipboard-list`,class:`em-svg`})]),r[10]||=ce(`<h2 class="em-title" data-v-0de58a93>还没有交付记录</h2><p class="em-sub" data-v-0de58a93> 每完成一项功能,AI 都要把「改了哪些故事与任务、额外做了什么、验了什么、怎么测」 写进下面这个文件,这一页就会自动排出来。 </p><p class="em-path mono" data-v-0de58a93>agile/last-change.json</p><p class="em-note" data-v-0de58a93> 每次只保留最近一次(覆盖写,不追加)· 格式见 <span class="mono" data-v-0de58a93>.agents/skills/scrum-planning/references/schema.md</span> 第 4 节 </p>`,4)])),(s(),d(se,{to:`body`},[a(w)?(s(),p(`div`,{key:0,class:`lc-hist-mask`,onClick:r[3]||=y(e=>w.value=!1,[`self`])},[u(`div`,zn,[u(`header`,Bn,[u(`div`,Vn,[r[46]||=u(`h3`,{id:`lc-hist-title`,class:`lc-hist-title`},`历史版本`,-1),u(`p`,Hn,[r[43]||=v(` 从 git 里读 `,-1),r[44]||=u(`span`,{class:`mono`},`agile/last-change.json`,-1),r[45]||=v(` 的提交记录 `,-1),a(C).length?(s(),p(f,{key:0},[v(`· 共 `+c(a(C).length)+` 版`,1)],64)):m(``,!0)])]),u(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,onClick:r[1]||=e=>w.value=!1},[l(i,{name:`i-lucide-x`,class:`lc-hist-x-ic`})])]),a(E)?(s(),p(`p`,Un,c(a(E)),1)):a(T)?(s(),p(`div`,Wn,`正在读 git 历史…`)):(s(),p(`div`,Gn,[(s(!0),p(f,null,o(a(C),(e,t)=>(s(),p(`button`,{key:e.hash,class:h([`hist-item`,{on:a(b)?.hash===e.hash}]),disabled:a(D),onClick:t=>Cr(e)},[u(`span`,{class:h([`hist-item-dot`,{live:t===0}])},null,2),u(`span`,qn,[u(`b`,null,c(e.subject||`(没有提交说明)`),1),u(`i`,Jn,c(e.date),1)]),u(`span`,Yn,c(e.short),1)],10,Kn))),128)),a(C).length?m(``,!0):(s(),p(`p`,Xn,` 这个文件还没有提交记录 —— 先 commit 一次,历史里才会出现版本。 `))])),u(`footer`,Zn,[r[47]||=u(`span`,{class:`dim`},`选一个版本即可在页面上只读查看,不会改动文件。`,-1),u(`button`,{class:`hist-close`,onClick:r[2]||=e=>w.value=!1},`关闭`)])])])):m(``,!0)])),(s(),d(se,{to:`body`},[a(J)?(s(),p(`div`,{key:0,class:`lc-hist-mask`,onClick:y($,[`self`])},[u(`div`,Qn,[u(`header`,$n,[r[48]||=u(`div`,{class:`lc-hist-hd-txt`},[u(`h3`,{id:`lc-commit-title`,class:`lc-hist-title`},`提交这次交付`),u(`p`,{class:`lc-hist-sub`},[v(` 将执行 `),u(`span`,{class:`mono`},`git add -A`),v(` + `),u(`span`,{class:`mono`},`git commit`),v(`,只提交到本地,不 push `)])],-1),u(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,disabled:a(Y),onClick:$},[l(i,{name:`i-lucide-x`,class:`lc-hist-x-ic`})],8,er)]),a(Q)?(s(),p(`div`,tr,[u(`span`,nr,[l(i,{name:`i-lucide-check`,class:`cm-done-svg`})]),u(`div`,rr,[u(`p`,ir,[r[49]||=v(`已提交 `,-1),u(`span`,ar,c(a(Q).hash),1)]),u(`p`,or,c(a(Q).subject),1),u(`p`,sr,c(a(Q).files)+` 个文件 · 分支 `+c(a(Q).branch??`分离头指针`),1)])])):(s(),p(`div`,cr,[r[51]||=u(`p`,{class:`micro`},`提交信息`,-1),u(`pre`,lr,c(a(P)),1),u(`p`,ur,[r[50]||=v(` 将提交的文件`,-1),a(Z)?(s(),p(f,{key:0},[v(` · `+c(a(Z).files.length),1)],64)):m(``,!0)]),!a(Z)&&!a(X)?(s(),p(`p`,dr,`正在读 git 状态…`)):a(Z)&&!a(Z).isRepo?(s(),p(`p`,fr,`这个目录不是 git 仓库,没法自动提交。`)):a(Z)?.blocked?(s(),p(`p`,pr,c(a(Z).blocked),1)):a(Z)?.files.length?(s(),p(`ul`,hr,[(s(!0),p(f,null,o(a(Z).files,e=>(s(),p(`li`,{key:e.path,class:`cm-file`},[u(`span`,{class:h([`cm-code`,e.code===`??`?`cm-new`:`cm-mod`])},c(e.code),3),u(`span`,{class:`mono cm-path`,title:e.path},c(e.path),9,gr)]))),128))])):(s(),p(`p`,mr,`没有未提交的改动,不需要提交。`))])),a(X)?(s(),p(`p`,_r,c(a(X)),1)):m(``,!0),u(`footer`,vr,[u(`span`,yr,c(a(Z)?.branch?`当前分支 ${a(Z).branch}`:`提交后工作区应当是干净的`),1),u(`span`,br,[u(`button`,{class:`hist-close`,disabled:a(Y),onClick:$},c(a(Q)?`关闭`:`取消`),9,xr),a(Q)?m(``,!0):(s(),p(`button`,{key:0,class:`cm-go`,disabled:!a(Gr),onClick:qr},c(a(Y)?`提交中…`:`确认提交`),9,Sr))])])])])):m(``,!0)]))],64)}}}),[[`__scopeId`,`data-v-0de58a93`]]);export{A 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={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
+ 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-2415570b><b data-v-2415570b>还没有图例</b><p style="margin-top:3px;" data-v-2415570b> 实现故事时遇到模块边界 / 鉴权 / 支付 / 数据模型这类改动,用内置的 <code class="mono" data-v-2415570b>diagram-design</code> skill 出图, 再用 <code class="mono" data-v-2415570b>node tools/diagram.mjs add &lt;file&gt; --title &quot;登录时序&quot; --kind sequence --story S-001</code> 登记;索引写在 <code class="mono" data-v-2415570b>agile/diagrams.json</code>,产物在 <code class="mono" data-v-2415570b>agile/diagrams/</code>。 </p></div>`,1)]))])}}}),[[`__scopeId`,`data-v-2415570b`]]);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-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};
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 +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-d69ddc53`]]);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-ba251daf`]]);export{j as default};
@@ -1 +1 @@
1
- import{n as e}from"./SrNUvNwO.js";import{U as t,Xt as n,d as r,m as i}from"./BxuBMtk_.js";import{i as a}from"#entry";var o={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`},s={class:`max-w-520px text-center`},c=[`textContent`],l=[`textContent`],u=[`textContent`],d=a({__name:`error-500`,props:{appName:{type:String,default:`Nuxt`},status:{type:Number,default:500},statusText:{type:String,default:`Internal server error`},description:{type:String,default:`This page is temporarily unavailable.`},refresh:{type:String,default:`Refresh this page`}},setup(a){let d=a;return e({title:`${d.status} - ${d.statusText} | ${d.appName}`,script:[],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{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}`}]}),(e,d)=>(t(),i(`div`,o,[r(`div`,s,[r(`h1`,{class:`font-medium leading-none mb-4 sm:text-[72px] tabular-nums text-[56px]`,textContent:n(a.status)},null,8,c),r(`h2`,{class:`font-semibold mb-2 sm:text-3xl text-2xl`,textContent:n(a.statusText)},null,8,l),r(`p`,{class:`mb-4 px-2 text-md text-neutral-500`,textContent:n(a.description)},null,8,u)])]))}},[[`__scopeId`,`data-v-07be29b1`]]);export{d as default};
1
+ import{n as e}from"./SrNUvNwO.js";import{U as t,Xt as n,d as r,m as i}from"./BxuBMtk_.js";import{i as a}from"#entry";var o={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`},s={class:`max-w-520px text-center`},c=[`textContent`],l=[`textContent`],u=[`textContent`],d=a({__name:`error-500`,props:{appName:{type:String,default:`Nuxt`},status:{type:Number,default:500},statusText:{type:String,default:`Internal server error`},description:{type:String,default:`This page is temporarily unavailable.`},refresh:{type:String,default:`Refresh this page`}},setup(a){let d=a;return e({title:`${d.status} - ${d.statusText} | ${d.appName}`,script:[],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{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}`}]}),(e,d)=>(t(),i(`div`,o,[r(`div`,s,[r(`h1`,{class:`font-medium leading-none mb-4 sm:text-[72px] tabular-nums text-[56px]`,textContent:n(a.status)},null,8,c),r(`h2`,{class:`font-semibold mb-2 sm:text-3xl text-2xl`,textContent:n(a.statusText)},null,8,l),r(`p`,{class:`mb-4 px-2 text-md text-neutral-500`,textContent:n(a.description)},null,8,u)])]))}},[[`__scopeId`,`data-v-d4411f5a`]]);export{d as default};
@@ -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-4bf98db6`]]);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-6cff08c9`]]);export{Y 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-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
+ 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 +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-a4bac36b`]]);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-8602d523`]]);export{R as default};