scrum-skills 0.3.0 → 0.3.2

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 (33) hide show
  1. package/.agents/skills/scrum-planning/references/schema.md +82 -4
  2. package/.agents/skills/scrum-report/SKILL.md +4 -1
  3. package/.agents/skills/scrum-sprint/SKILL.md +1 -1
  4. package/.agents/skills/scrum-tdd/SKILL.md +19 -5
  5. package/README.md +11 -7
  6. package/assets/board/200.html +1 -1
  7. package/assets/board/404.html +1 -1
  8. package/assets/board/_nuxt/BbwJq5pb.js +1 -0
  9. package/assets/board/_nuxt/{CkF353aX.js → DkI1Qxpp.js} +49 -49
  10. package/assets/board/_nuxt/S08nFESZ.js +3 -0
  11. package/assets/board/_nuxt/builds/latest.json +1 -1
  12. package/assets/board/_nuxt/builds/meta/8e23aec9-5b67-4569-b8bf-d4f07e50ffdf.json +1 -0
  13. package/assets/board/_nuxt/{entry.Dx3CNA--.css → entry.CKHePurH.css} +1 -1
  14. package/assets/board/_nuxt/last-change.1Su4GrCN.css +1 -0
  15. package/assets/board/_nuxt/tests.dXlUX16A.css +1 -0
  16. package/assets/board/burndown/index.html +1 -1
  17. package/assets/board/epics/index.html +1 -1
  18. package/assets/board/gantt/index.html +1 -1
  19. package/assets/board/index.html +1 -1
  20. package/assets/board/last-change/index.html +1 -1
  21. package/assets/board/milestones/index.html +1 -1
  22. package/assets/board/tests/index.html +1 -0
  23. package/bin/scrum-skills.mjs +4 -2
  24. package/package.json +1 -1
  25. package/templates/AGENTS.md +12 -7
  26. package/tools/agile-tools.mjs +9 -3
  27. package/tools/ai.mjs +5 -5
  28. package/tools/git-commit.mjs +216 -0
  29. package/tools/projects.mjs +23 -2
  30. package/tools/validate.mjs +161 -0
  31. package/assets/board/_nuxt/DrprggWq.js +0 -3
  32. package/assets/board/_nuxt/builds/meta/d7f0931f-32b3-4c23-b05f-7cbf5851b226.json +0 -1
  33. package/assets/board/_nuxt/last-change.8FndoiOt.css +0 -1
@@ -0,0 +1,3 @@
1
+ import{D as e,E as t,Ht as n,On as r,T as i,Zn as a,_ as o,b as s,bt as c,ct as l,er as ee,g as u,it as d,k as te,mt as f,o as p,qt as ne,tr as m,tt as re,u as ie,v as h,vn as g,y as _}from"./DZo3dYLJ.js";import{w as v}from"./51OWHj8c.js";import{t as ae}from"./CJ2mz0WY.js";import{t as oe}from"./rlePnzpc.js";import{O as y,i as se,s as ce}from"#entry";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 fe={class:`rule-top`},pe={class:`rule-ic`},me={class:`rule-state`},he={class:`mono`},ge={key:0},_e={class:`rule-cases`},ve={class:`case-when`},ye={class:`case-then`},be={key:1,class:`lc-hist-bar`},xe={class:`hist-badge`},Se={class:`hist-readonly mono`},Ce=[`title`,`disabled`,`onClick`],we={key:2,class:`card lc-empty`},Te={class:`em-ic`},Ee={key:3,class:`lc`},De={class:`lc-hero`},Oe={class:`hero-body`},ke={class:`hero-kicker`},Ae={class:`k-date mono`},je={key:0,class:`k-time mono`},Me={key:1,class:`k-today`},Ne=[`title`],Pe={class:`hero-title`},Fe={key:0,class:`hero-sum`},Ie={class:`hero-meta`},Le={class:`hero-aside`},Re={class:`ring-in`},ze={class:`lc-nav`,"aria-label":`分区导航`},Be=[`href`,`onClick`],Ve={class:`lc-nav-lb`},He={class:`lc-nav-ct`},Ue={id:`lc-changes`,class:`card sec`},We={class:`s-hd`},Ge={class:`s-ic`},Ke={class:`s-count`},qe={key:0,class:`sec-empty dim`},Je={key:1,class:`tbl-wrap`},Ye={class:`tbl lc-tbl`},Xe={class:`ent`},Ze={class:`ent-top`},Qe={key:0,class:`ent-title`},$e={key:0,class:`flow mono`},et={class:`fl`},tt={class:`fl`},nt={class:`cell-note`},rt={class:`chips`},it=[`title`],at={key:0,class:`dim`},ot={class:`two`},st={id:`lc-extras`,class:`card sec`},ct={class:`s-hd`},lt={class:`s-ic`},ut={class:`s-count`},dt={class:`sec-bd lc-extras`},ft={key:0,class:`dim`},pt={class:`x-body`},mt={class:`x-title`},ht={key:0,class:`x-detail`},gt={key:1,class:`chips x-files`},_t=[`title`],vt={id:`lc-checks`,class:`card sec`},yt={class:`s-hd`},bt={class:`s-ic tone-mint`},xt={class:`s-count`},St={class:`sec-bd lc-checks`},Ct={key:0,class:`dim`},wt={class:`v-body`},Tt={class:`v-what`},Et={key:0,class:`v-detail`},Dt={key:0,id:`lc-access`,class:`card sec lc-access`},Ot={class:`s-hd`},kt={class:`s-ic tone-sky`},At={class:`s-count`},jt={class:`sec-bd acc-grid`},Mt={key:0,class:`acc-col`},Nt={class:`u-head`},Pt=[`href`],Ft={class:`u-label`},It=[`onClick`],Lt={class:`u-url mono`},Rt={key:0,class:`u-note`},zt={key:1,class:`acc-col`},Bt={class:`a-head`},Vt={key:0,class:`a-role`},Ht={class:`a-user mono`},Ut=[`onClick`],Wt={class:`a-line`},Gt={key:0,class:`a-pass mono`},Kt={key:1,class:`a-none dim`},qt={key:0,class:`a-note`},Jt={key:1,id:`lc-prep`,class:`card sec lc-prep`},Yt={class:`s-hd`},Xt={class:`s-ic tone-amber`},Zt={class:`s-count`},Qt={class:`steps`},$t={class:`step-bd`},en={class:`step-text`},tn={key:0,class:`cmd-row`},nn={class:`cmd mono`},rn=[`onClick`],an={key:1,class:`step-note`},on={id:`lc-scenarios`,class:`lc-sc-sec`},sn={class:`s-hd solo`},cn={class:`s-ic tone-mint`},ln={class:`s-count`},un={key:0,class:`dim sec-empty`},dn={key:1,class:`lc-sc-grid`},fn={class:`sc-hd`},pn={class:`sc-id mono`},mn={class:`sc-title`},hn={key:0,class:`sc-body`},gn={class:`lc-sc-steps`},_n={class:`sc-acc`},vn={class:`sc-acc-h`},yn={class:`sc-acc-t`},bn={key:0,class:`sc-foot`},xn={key:0},Sn={key:1,class:`sc-ids`},Cn={class:`two`},wn={id:`lc-notes`,class:`card sec`},Tn={class:`s-hd`},En={class:`s-ic`},Dn={class:`s-count`},On={class:`sec-bd`},kn={key:0,class:`dim`},An={key:1,class:`lc-notes`},jn={key:0,id:`lc-open`,class:`card sec sec-warn`},Mn={class:`s-hd`},Nn={class:`s-ic`},Pn={class:`s-count`},Fn={class:`sec-bd`},In={class:`lc-notes warn`},Ln={class:`lc-hist`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lc-hist-title`},Rn={class:`lc-hist-hd`},zn={class:`lc-hist-hd-txt`},Bn={class:`lc-hist-sub`},Vn={key:0,class:`lc-hist-err`},Hn={key:1,class:`lc-hist-hint dim`},Un={key:2,class:`lc-hist-list`},Wn=[`disabled`,`onClick`],Gn={class:`hist-item-main`},Kn={class:`mono`},qn={class:`mono hist-item-hash`},Jn={key:0,class:`lc-hist-hint dim`},Yn={class:`lc-hist-ft`},Xn={class:`lc-hist lc-commit`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lc-commit-title`},Zn={class:`lc-hist-hd`},Qn=[`disabled`],$n={key:0,class:`cm-done`},er={class:`cm-done-ic`},tr={class:`cm-done-bd`},nr={class:`cm-done-t`},rr={class:`mono`},ir={class:`cm-done-s`},ar={class:`cm-done-n`},or={key:1,class:`cm-body`},sr={class:`cm-msg mono`},cr={class:`micro`},lr={key:0,class:`cm-hint dim`},ur={key:1,class:`cm-hint warn`},dr={key:2,class:`cm-hint warn`},fr={key:3,class:`cm-hint dim`},pr={key:4,class:`cm-files`},mr=[`title`],hr={key:2,class:`lc-hist-err`},gr={class:`lc-hist-ft`},_r={class:`dim`},vr={class:`cm-acts`},yr=[`disabled`],br=[`disabled`],S=se(te({__name:`last-change`,setup(te){let{lastChange:se,lastChangeGit:le,refresh:ue}=ce(),b=g(null),x=u(()=>b.value?.doc?.lastChange??se.value),S=u(()=>le.value),C=g([]),w=g(!1),T=g(!1),E=g(``),D=g(!1),xr=u(()=>b.value?[b.value]:[]);async function Sr(){if(!T.value){T.value=!0,E.value=``;try{let e=await y(`/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 O(){w.value=!0,C.value.length||await Sr()}async function k(e){if(!D.value){D.value=!0,E.value=``;try{b.value=await y(`/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 Cr(){b.value=null,window.scrollTo({top:0,behavior:`smooth`})}let A=g(null);n(b,async()=>{await re(),A.value?.querySelector(`.hist-tab.on`)?.scrollIntoView({inline:`nearest`,block:`nearest`})});function j(e){e.key===`Escape`&&(J.value?$():w.value&&=!1)}l(()=>window.addEventListener(`keydown`,j)),d(()=>window.removeEventListener(`keydown`,j));let wr={committed:{text:`已提交`,tone:`ok`},dirty:{text:`未提交改动`,tone:`warn`},untracked:{text:`未纳入版本库`,tone:`warn`},"no-git":{text:`非 git 仓库`,tone:`neutral`},missing:{text:`尚未生成`,tone:`neutral`}},M=u(()=>wr[S.value?.state??`missing`]??wr.missing),Tr=[{key:`committed`,when:`已提交`,then:`下次写入整份覆盖;上一版留在 git 历史里,点「查看历史」随时翻回来`},{key:`pending`,when:`未提交`,then:`下次写入合并:新交付接在旧记录后面,不冲掉还没入库的内容`}],Er=u(()=>{let e=S.value?.state;return e===`committed`?`committed`:e===`dirty`||e===`untracked`||e===`no-git`?`pending`:``}),Dr=u(()=>(x.value?.mergedFrom?.length??0)+1),Or=u(()=>(x.value?.mergedFrom??[]).map(e=>`${e.at??``} ${e.title??``}`.trim()).filter(Boolean).join(`
3
+ `)),kr={added:`新增`,updated:`状态变更`,removed:`移除`},Ar={story:`故事`,task:`任务`},jr={pass:`通过`,fail:`失败`,partial:`部分`,skipped:`未跑`},Mr={pass:`i-lucide-check`,fail:`i-lucide-x`,partial:`i-lucide-minus`,skipped:`i-lucide-minus`},N=u(()=>x.value?.changes??[]),P=u(()=>de(x.value??{})),F=u(()=>x.value?.extras??[]),I=u(()=>x.value?.verification??[]),L=u(()=>x.value?.scenarios??[]),R=u(()=>x.value?.preparation??[]),z=u(()=>x.value?.notes??[]),B=u(()=>x.value?.open??[]),V=u(()=>x.value?.access?.urls??[]),H=u(()=>x.value?.access?.accounts??[]),U=u(()=>I.value.filter(e=>e.result===`pass`).length),Nr=u(()=>I.value.length>0&&U.value===I.value.length),Pr=u(()=>I.value.length?Math.round(U.value/I.value.length*100):0),Fr=u(()=>[...new Set([...N.value.flatMap(e=>e.files??[]),...F.value.flatMap(e=>e.files??[])])]),Ir=e=>e.kind===`story`?e.id:e.id.replace(/-T\d+$/,``),Lr=u(()=>[{id:`lc-changes`,label:`变更清单`,icon:`i-lucide-git-commit-horizontal`,count:`${N.value.length}`,tone:`violet`},{id:`lc-extras`,label:`额外做的事`,icon:`i-lucide-sparkles`,count:`${F.value.length}`,tone:`peach`},{id:`lc-checks`,label:`验证结果`,icon:`i-lucide-badge-check`,count:`${U.value}/${I.value.length}`,tone:`mint`},...V.value.length||H.value.length?[{id:`lc-access`,label:`调试入口与账号`,icon:`i-lucide-key-round`,count:`${V.value.length+H.value.length}`,tone:`sky`}]:[],...R.value.length?[{id:`lc-prep`,label:`测试前准备`,icon:`i-lucide-terminal-square`,count:`${R.value.length}`,tone:`amber`}]:[],{id:`lc-scenarios`,label:`测试场景`,icon:`i-lucide-flask-conical`,count:`${L.value.length}`,tone:`teal`},{id:`lc-notes`,label:`说明`,icon:`i-lucide-message-square-more`,count:`${z.value.length}`,tone:`slate`},...B.value.length?[{id:`lc-open`,label:`还没做的`,icon:`i-lucide-list-todo`,count:`${B.value.length}`,tone:`rose`}]:[]]);function Rr(e){let t=document.getElementById(e);t&&(t.scrollIntoView({behavior:`smooth`,block:`start`}),history.replaceState(null,``,`#${e}`))}let W=new Date,zr=`${W.getFullYear()}-${String(W.getMonth()+1).padStart(2,`0`)}-${String(W.getDate()).padStart(2,`0`)}`,G=u(()=>(x.value?.at??``).slice(0,10)),Br=u(()=>{let e=(x.value?.at??``).slice(10).replace(/^[T ]/,``);return/^\d{2}:\d{2}/.test(e)?e:``}),Vr=u(()=>!!G.value&&G.value===zr),K=g(``);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=g(!1),Y=g(!1),X=g(``),Z=g(null),Q=g(null),Hr=u(()=>!!Z.value?.isRepo&&!Z.value?.blocked&&(Z.value?.files.length??0)>0&&!Y.value);async function Ur(){if(!Y.value){J.value=!0,X.value=``,Q.value=null,Z.value=null;try{Z.value=await y(`/api/agile/git/status`)}catch(e){X.value=e?.data?.error||e?.message||`读不到 git 状态`}}}function $(){Y.value||(J.value=!1,X.value=``,Q.value=null,Z.value=null)}async function Wr(){if(Hr.value){Y.value=!0,X.value=``;try{let{token:e}=await y(`/api/projects`);Q.value=await y(`/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,l)=>{let u=oe,d=ae;return f(),s(p,null,[r(b)?(f(),s(`div`,be,[o(`span`,xe,[e(u,{name:`i-lucide-history`,class:`hist-badge-ic`}),l[8]||=t(`历史版本`,-1)]),o(`span`,Se,[t(`只读 · `+m(r(b).short),1),r(b).date?(f(),s(p,{key:0},[t(` · `+m(r(b).date),1)],64)):_(``,!0)]),o(`div`,{ref_key:`tabsRef`,ref:A,class:`lc-hist-tabs`},[o(`button`,{class:`hist-tab`,onClick:Cr},`最新`),(f(!0),s(p,null,c(r(xr),e=>(f(),s(`button`,{key:e.hash,class:a([`hist-tab`,{on:r(b)?.hash===e.hash}]),title:`${e.date} ${e.subject??``}`,disabled:r(D),onClick:t=>k(e)},[t(m(e.short),1),o(`i`,null,m(e.date.slice(5,16)),1)],10,Ce))),128))],512),o(`button`,{class:`rule-btn`,onClick:O},[e(u,{name:`i-lucide-list`,class:`rule-btn-ic`}),l[9]||=t(`选择历史…`,-1)])])):(f(),s(`div`,{key:0,class:a([`lc-rule`,`is-${r(M).tone}`])},[o(`div`,fe,[o(`span`,pe,[e(u,{name:`i-lucide-git-branch`,class:`rule-svg`})]),l[6]||=o(`b`,{class:`rule-title`},`写入规则`,-1),l[7]||=o(`span`,{class:`rule-file mono`},`agile/last-change.json`,-1),o(`span`,me,[o(`i`,{class:a([`rule-dot`,`tone-${r(M).tone}`])},null,2),t(` 当前 `+m(r(M).text),1),r(S)?.state===`committed`&&r(S).hash?(f(),s(p,{key:0},[l[4]||=t(` · `,-1),o(`span`,he,m(r(S).hash),1)],64)):_(``,!0)]),o(`button`,{class:`rule-btn`,onClick:O},[e(u,{name:`i-lucide-history`,class:`rule-btn-ic`}),l[5]||=t(`查看历史 `,-1),r(C).length?(f(),s(`i`,ge,m(r(C).length),1)):_(``,!0)])]),o(`ul`,_e,[(f(),s(p,null,c(Tr,t=>o(`li`,{key:t.key,class:a([`rule-case`,{on:r(Er)===t.key}])},[o(`span`,ve,m(t.when),1),e(u,{name:`i-lucide-arrow-right`,class:`case-arrow`}),o(`span`,ye,m(t.then),1)],2)),64))])],2)),r(x)?(f(),s(`div`,Ee,[o(`header`,De,[o(`div`,Oe,[o(`p`,ke,[l[11]||=o(`span`,{class:`k-dot`},null,-1),l[12]||=t(`最近一次交付 `,-1),l[13]||=o(`span`,{class:`k-sep`},null,-1),o(`span`,Ae,m(r(G)),1),r(Br)?(f(),s(`span`,je,m(r(Br)),1)):_(``,!0),r(Vr)?(f(),s(`span`,Me,`今天`)):_(``,!0),r(x).merged?(f(),s(`span`,{key:2,class:`k-merged`,title:r(Or)},`合并记录 · `+m(r(Dr))+` 次交付`,9,Ne)):_(``,!0)]),o(`h2`,Pe,m(r(x).title),1),r(x).summary?(f(),s(`p`,Fe,m(r(x).summary),1)):_(``,!0),o(`div`,Ie,[o(`span`,null,[o(`b`,null,m(r(N).length),1),l[14]||=t(` 处变更`,-1)]),l[19]||=o(`i`,{class:`meta-sep`},null,-1),o(`span`,null,[o(`b`,null,m(r(Fr).length),1),l[15]||=t(` 个文件`,-1)]),l[20]||=o(`i`,{class:`meta-sep`},null,-1),o(`span`,null,[o(`b`,null,m(r(L).length),1),l[16]||=t(` 条测试场景`,-1)]),r(F).length?(f(),s(p,{key:0},[l[18]||=o(`i`,{class:`meta-sep`},null,-1),o(`span`,null,[o(`b`,null,m(r(F).length),1),l[17]||=t(` 项额外工作`,-1)])],64)):_(``,!0)])]),o(`div`,Le,[o(`div`,{class:a([`ring`,{warn:r(I).length&&!r(Nr)}]),style:ee({"--pct":r(Pr)})},[o(`div`,Re,[o(`b`,null,[t(m(r(U)),1),o(`small`,null,`/`+m(r(I).length||0),1)]),o(`span`,null,m(r(I).length?r(Nr)?`验证全通过`:`有未通过项`:`无验证记录`),1)])],6)])]),o(`nav`,ze,[(f(!0),s(p,null,c(r(Lr),t=>(f(),s(`a`,{key:t.id,class:a([`lc-nav-link`,`tone-${t.tone}`]),href:`#${t.id}`,onClick:v(e=>Rr(t.id),[`prevent`])},[e(u,{name:t.icon,class:`lc-nav-ic`},null,8,[`name`]),o(`span`,Ve,m(t.label),1),o(`b`,He,m(t.count),1)],10,Be))),128))]),o(`section`,Ue,[o(`div`,We,[o(`span`,Ge,[e(u,{name:`i-lucide-git-commit-horizontal`,class:`s-svg`})]),l[22]||=o(`h2`,{class:`s-title`},`变更清单`,-1),o(`span`,Ke,m(r(N).length),1),l[23]||=o(`span`,{class:`s-hint`},`故事与任务各自是新增还是状态变更、动过哪些文件`,-1),r(N).length?(f(),s(`button`,{key:0,class:a([`rule-btn s-copy`,{ok:r(K)===`commit`}]),title:`按 Conventional Commits 生成:首行是标题,正文每条变更带编号与名称`,onClick:l[0]||=e=>q(r(P),`commit`)},[e(u,{name:r(K)===`commit`?`i-lucide-check`:`i-lucide-clipboard-copy`,class:`rule-btn-ic`},null,8,[`name`]),t(` `+m(r(K)===`commit`?`已复制`:`复制变更信息`),1)],2)):_(``,!0),!r(b)&&r(N).length?(f(),s(`button`,{key:1,class:`rule-btn s-commit`,title:`把这次交付整份提交进本地仓库:git add -A + git commit,不 push`,onClick:Ur},[e(u,{name:`i-lucide-git-commit-vertical`,class:`rule-btn-ic`}),l[21]||=t(`自动提交 `,-1)])):_(``,!0)]),r(N).length?(f(),s(`div`,Je,[o(`table`,Ye,[l[25]||=o(`colgroup`,null,[o(`col`,{class:`c-ent`}),o(`col`,{class:`c-act`}),o(`col`),o(`col`,{class:`c-file`})],-1),l[26]||=o(`thead`,null,[o(`tr`,null,[o(`th`,null,`条目`),o(`th`,null,`变更`),o(`th`,null,`变更内容`),o(`th`,null,`涉及文件`)])],-1),o(`tbody`,null,[(f(!0),s(p,null,c(r(N),(n,r)=>(f(),s(`tr`,{key:`${n.kind}-${n.id}-${r}`},[o(`td`,null,[o(`div`,Xe,[o(`div`,Ze,[o(`span`,{class:a([`kind`,`kind-${n.kind}`])},m(Ar[n.kind]??n.kind),3),e(d,{to:`/story/${Ir(n)}`,class:`ent-id mono`},{default:ne(()=>[t(m(n.id),1)]),_:2},1032,[`to`])]),n.title?(f(),s(`p`,Qe,m(n.title),1)):_(``,!0)])]),o(`td`,null,[o(`span`,{class:a([`act`,`act-${n.action}`])},m(kr[n.action]??n.action),3),n.from||n.to?(f(),s(`p`,$e,[o(`span`,et,m(n.from??`—`),1),l[24]||=o(`i`,null,`→`,-1),o(`span`,tt,m(n.to??`—`),1)])):_(``,!0)]),o(`td`,nt,m(n.note??`—`),1),o(`td`,null,[o(`div`,rt,[(f(!0),s(p,null,c(n.files,e=>(f(),s(`span`,{key:e,class:`fchip mono`,title:e},m(e),9,it))),128)),n.files?.length?_(``,!0):(f(),s(`span`,at,`—`))])])]))),128))])])])):(f(),s(`p`,qe,`这次没有涉及任何故事或任务。`))]),o(`div`,ot,[o(`section`,st,[o(`div`,ct,[o(`span`,lt,[e(u,{name:`i-lucide-sparkles`,class:`s-svg`})]),l[27]||=o(`h2`,{class:`s-title`},`额外做的事`,-1),o(`span`,ut,m(r(F).length),1)]),o(`div`,dt,[r(F).length?_(``,!0):(f(),s(`p`,ft,`没有计划外的改动。`)),(f(!0),s(p,null,c(r(F),(e,t)=>(f(),s(`article`,{key:t,class:`x-item`},[l[28]||=o(`span`,{class:`x-mark`},null,-1),o(`div`,pt,[o(`p`,mt,m(e.title),1),e.detail?(f(),s(`p`,ht,m(e.detail),1)):_(``,!0),e.files?.length?(f(),s(`div`,gt,[(f(!0),s(p,null,c(e.files,e=>(f(),s(`span`,{key:e,class:`fchip mono`,title:e},m(e),9,_t))),128))])):_(``,!0)])]))),128))])]),o(`section`,vt,[o(`div`,yt,[o(`span`,bt,[e(u,{name:`i-lucide-badge-check`,class:`s-svg`})]),l[29]||=o(`h2`,{class:`s-title`},`验证结果`,-1),o(`span`,xt,m(r(U))+`/`+m(r(I).length),1)]),o(`div`,St,[r(I).length?_(``,!0):(f(),s(`p`,Ct,`这次没有留下验证记录。`)),(f(!0),s(p,null,c(r(I),(t,n)=>(f(),s(`div`,{key:n,class:`v-item`},[o(`span`,{class:a([`v-ic`,`v-${t.result}`])},[e(u,{name:Mr[t.result]??`i-lucide-circle`,class:`v-svg`},null,8,[`name`])],2),o(`div`,wt,[o(`p`,Tt,m(t.what),1),t.detail?(f(),s(`p`,Et,m(t.detail),1)):_(``,!0)]),o(`span`,{class:a([`v-res`,`v-${t.result}`])},m(jr[t.result]??t.result),3)]))),128))])])]),r(V).length||r(H).length?(f(),s(`section`,Dt,[o(`div`,Ot,[o(`span`,kt,[e(u,{name:`i-lucide-key-round`,class:`s-svg`})]),l[30]||=o(`h2`,{class:`s-title`},`调试入口与账号`,-1),o(`span`,At,m(r(V).length+r(H).length),1),l[31]||=o(`span`,{class:`s-hint`},`照着这一栏就能自己跑起来点一遍`,-1)]),o(`div`,jt,[r(V).length?(f(),s(`div`,Mt,[l[32]||=o(`p`,{class:`micro`},`访问地址`,-1),(f(!0),s(p,null,c(r(V),(n,i)=>(f(),s(`div`,{key:i,class:`u-item`},[o(`div`,Nt,[o(`a`,{href:n.url,target:`_blank`,rel:`noreferrer`,class:`u-link`},[o(`span`,Ft,m(n.label??`入口`),1),e(u,{name:`i-lucide-arrow-up-right`,class:`u-go`})],8,Pt),o(`button`,{class:a([`cpy`,{ok:r(K)===`url-${i}`}]),onClick:e=>q(n.url,`url-${i}`)},[e(u,{name:r(K)===`url-${i}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),t(` `+m(r(K)===`url-${i}`?`已复制`:`复制`),1)],10,It)]),o(`p`,Lt,m(n.url),1),n.note?(f(),s(`p`,Rt,m(n.note),1)):_(``,!0)]))),128))])):_(``,!0),r(H).length?(f(),s(`div`,zt,[l[34]||=o(`p`,{class:`micro`},`账号密码`,-1),(f(!0),s(p,null,c(r(H),(n,i)=>(f(),s(`div`,{key:i,class:`a-item`},[o(`div`,Bt,[n.role?(f(),s(`span`,Vt,m(n.role),1)):_(``,!0),o(`span`,Ht,m(n.username),1),o(`button`,{class:a([`cpy`,{ok:r(K)===`acc-${i}`}]),onClick:e=>q(n.password?`账号:${n.username}\n密码:${n.password}`:n.username,`acc-${i}`)},[e(u,{name:r(K)===`acc-${i}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),t(` `+m(r(K)===`acc-${i}`?`已复制`:`复制`),1)],10,Ut)]),o(`div`,Wt,[l[33]||=o(`span`,{class:`a-key`},`密码`,-1),n.password?(f(),s(`span`,Gt,m(n.password),1)):(f(),s(`span`,Kt,`无密码 / 走单点登录`))]),n.note?(f(),s(`p`,qt,m(n.note),1)):_(``,!0)]))),128))])):_(``,!0)])])):_(``,!0),r(R).length?(f(),s(`section`,Jt,[o(`div`,Yt,[o(`span`,Xt,[e(u,{name:`i-lucide-terminal-square`,class:`s-svg`})]),l[35]||=o(`h2`,{class:`s-title`},`测试前准备`,-1),o(`span`,Zt,m(r(R).length),1),l[36]||=o(`span`,{class:`s-hint`},`按顺序做完这些再开始点,命令可直接复制`,-1)]),o(`ol`,Qt,[(f(!0),s(p,null,c(r(R),(n,i)=>(f(),s(`li`,{key:i},[o(`div`,$t,[o(`p`,en,m(n.step),1),n.command?(f(),s(`div`,tn,[o(`code`,nn,m(n.command),1),o(`button`,{class:a([`cpy`,{ok:r(K)===`cmd-${i}`}]),onClick:e=>q(n.command??``,`cmd-${i}`)},[e(u,{name:r(K)===`cmd-${i}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),t(` `+m(r(K)===`cmd-${i}`?`已复制`:`复制`),1)],10,rn)])):_(``,!0),n.note?(f(),s(`p`,an,m(n.note),1)):_(``,!0)])]))),128))])])):_(``,!0),o(`section`,on,[o(`div`,sn,[o(`span`,cn,[e(u,{name:`i-lucide-flask-conical`,class:`s-svg`})]),l[37]||=o(`h2`,{class:`s-title`},`测试场景`,-1),o(`span`,ln,m(r(L).length),1),l[38]||=o(`span`,{class:`s-hint`},`一条一段:照着步骤走,末尾那句就是验收标准`,-1)]),r(L).length?(f(),s(`div`,dn,[(f(!0),s(p,null,c(r(L),(n,r)=>(f(),s(`article`,{key:n.id??r,class:`sc lc-sc`},[o(`header`,fn,[o(`span`,pn,m(n.id??`TC-${r+1}`),1),o(`h3`,mn,m(n.title),1)]),n.steps?.length?(f(),s(`div`,hn,[l[39]||=o(`p`,{class:`micro`},`测试步骤`,-1),o(`ol`,gn,[(f(!0),s(p,null,c(n.steps,(e,t)=>(f(),s(`li`,{key:t},m(e),1))),128))])])):_(``,!0),o(`div`,_n,[o(`p`,vn,[e(u,{name:`i-lucide-badge-check`,class:`sc-acc-ic`}),l[40]||=t(`验收标准`,-1)]),o(`p`,yn,m(n.expect),1),n.acceptance||n.storyIds?.length?(f(),s(`div`,bn,[n.acceptance?(f(),s(`span`,xn,`对应验收:`+m(n.acceptance),1)):_(``,!0),n.storyIds?.length?(f(),s(`span`,Sn,[(f(!0),s(p,null,c(n.storyIds,e=>(f(),h(d,{key:e,to:`/story/${e}`,class:`ent-id mono`},{default:ne(()=>[t(m(e),1)]),_:2},1032,[`to`]))),128))])):_(``,!0)])):_(``,!0)])]))),128))])):(f(),s(`p`,un,`这次没有单独列测试场景。`))]),o(`div`,Cn,[o(`section`,wn,[o(`div`,Tn,[o(`span`,En,[e(u,{name:`i-lucide-message-square-more`,class:`s-svg`})]),l[41]||=o(`h2`,{class:`s-title`},`说明`,-1),o(`span`,Dn,m(r(z).length),1)]),o(`div`,On,[r(z).length?(f(),s(`ul`,An,[(f(!0),s(p,null,c(r(z),(e,t)=>(f(),s(`li`,{key:t},m(e),1))),128))])):(f(),s(`p`,kn,`没有额外说明。`))])]),r(B).length?(f(),s(`section`,jn,[o(`div`,Mn,[o(`span`,Nn,[e(u,{name:`i-lucide-list-todo`,class:`s-svg`})]),l[42]||=o(`h2`,{class:`s-title`},`还没做的`,-1),o(`span`,Pn,m(r(B).length),1)]),o(`div`,Fn,[o(`ul`,In,[(f(!0),s(p,null,c(r(B),(e,t)=>(f(),s(`li`,{key:t},m(e),1))),128))])])])):_(``,!0)])])):(f(),s(`div`,we,[o(`span`,Te,[e(u,{name:`i-lucide-clipboard-list`,class:`em-svg`})]),l[10]||=i(`<h2 class="em-title" data-v-0c6b2b03>还没有交付记录</h2><p class="em-sub" data-v-0c6b2b03> 每完成一项功能,AI 都要把「改了哪些故事与任务、额外做了什么、验了什么、怎么测」 写进下面这个文件,这一页就会自动排出来。 </p><p class="em-path mono" data-v-0c6b2b03>agile/last-change.json</p><p class="em-note" data-v-0c6b2b03> 每次只保留最近一次(覆盖写,不追加)· 格式见 <span class="mono" data-v-0c6b2b03>.agents/skills/scrum-planning/references/schema.md</span> 第 4 节 </p>`,4)])),(f(),h(ie,{to:`body`},[r(w)?(f(),s(`div`,{key:0,class:`lc-hist-mask`,onClick:l[3]||=v(e=>w.value=!1,[`self`])},[o(`div`,Ln,[o(`header`,Rn,[o(`div`,zn,[l[46]||=o(`h3`,{id:`lc-hist-title`,class:`lc-hist-title`},`历史版本`,-1),o(`p`,Bn,[l[43]||=t(` 从 git 里读 `,-1),l[44]||=o(`span`,{class:`mono`},`agile/last-change.json`,-1),l[45]||=t(` 的提交记录 `,-1),r(C).length?(f(),s(p,{key:0},[t(`· 共 `+m(r(C).length)+` 版`,1)],64)):_(``,!0)])]),o(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,onClick:l[1]||=e=>w.value=!1},[e(u,{name:`i-lucide-x`,class:`lc-hist-x-ic`})])]),r(E)?(f(),s(`p`,Vn,m(r(E)),1)):r(T)?(f(),s(`div`,Hn,`正在读 git 历史…`)):(f(),s(`div`,Un,[(f(!0),s(p,null,c(r(C),(e,t)=>(f(),s(`button`,{key:e.hash,class:a([`hist-item`,{on:r(b)?.hash===e.hash}]),disabled:r(D),onClick:t=>k(e)},[o(`span`,{class:a([`hist-item-dot`,{live:t===0}])},null,2),o(`span`,Gn,[o(`b`,null,m(e.subject||`(没有提交说明)`),1),o(`i`,Kn,m(e.date),1)]),o(`span`,qn,m(e.short),1)],10,Wn))),128)),r(C).length?_(``,!0):(f(),s(`p`,Jn,` 这个文件还没有提交记录 —— 先 commit 一次,历史里才会出现版本。 `))])),o(`footer`,Yn,[l[47]||=o(`span`,{class:`dim`},`选一个版本即可在页面上只读查看,不会改动文件。`,-1),o(`button`,{class:`hist-close`,onClick:l[2]||=e=>w.value=!1},`关闭`)])])])):_(``,!0)])),(f(),h(ie,{to:`body`},[r(J)?(f(),s(`div`,{key:0,class:`lc-hist-mask`,onClick:v($,[`self`])},[o(`div`,Xn,[o(`header`,Zn,[l[48]||=o(`div`,{class:`lc-hist-hd-txt`},[o(`h3`,{id:`lc-commit-title`,class:`lc-hist-title`},`提交这次交付`),o(`p`,{class:`lc-hist-sub`},[t(` 将执行 `),o(`span`,{class:`mono`},`git add -A`),t(` + `),o(`span`,{class:`mono`},`git commit`),t(`,只提交到本地,不 push `)])],-1),o(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,disabled:r(Y),onClick:$},[e(u,{name:`i-lucide-x`,class:`lc-hist-x-ic`})],8,Qn)]),r(Q)?(f(),s(`div`,$n,[o(`span`,er,[e(u,{name:`i-lucide-check`,class:`cm-done-svg`})]),o(`div`,tr,[o(`p`,nr,[l[49]||=t(`已提交 `,-1),o(`span`,rr,m(r(Q).hash),1)]),o(`p`,ir,m(r(Q).subject),1),o(`p`,ar,m(r(Q).files)+` 个文件 · 分支 `+m(r(Q).branch??`分离头指针`),1)])])):(f(),s(`div`,or,[l[51]||=o(`p`,{class:`micro`},`提交信息`,-1),o(`pre`,sr,m(r(P)),1),o(`p`,cr,[l[50]||=t(` 将提交的文件`,-1),r(Z)?(f(),s(p,{key:0},[t(` · `+m(r(Z).files.length),1)],64)):_(``,!0)]),!r(Z)&&!r(X)?(f(),s(`p`,lr,`正在读 git 状态…`)):r(Z)&&!r(Z).isRepo?(f(),s(`p`,ur,`这个目录不是 git 仓库,没法自动提交。`)):r(Z)?.blocked?(f(),s(`p`,dr,m(r(Z).blocked),1)):r(Z)?.files.length?(f(),s(`ul`,pr,[(f(!0),s(p,null,c(r(Z).files,e=>(f(),s(`li`,{key:e.path,class:`cm-file`},[o(`span`,{class:a([`cm-code`,e.code===`??`?`cm-new`:`cm-mod`])},m(e.code),3),o(`span`,{class:`mono cm-path`,title:e.path},m(e.path),9,mr)]))),128))])):(f(),s(`p`,fr,`没有未提交的改动,不需要提交。`))])),r(X)?(f(),s(`p`,hr,m(r(X)),1)):_(``,!0),o(`footer`,gr,[o(`span`,_r,m(r(Z)?.branch?`当前分支 ${r(Z).branch}`:`提交后工作区应当是干净的`),1),o(`span`,vr,[o(`button`,{class:`hist-close`,disabled:r(Y),onClick:$},m(r(Q)?`关闭`:`取消`),9,yr),r(Q)?_(``,!0):(f(),s(`button`,{key:0,class:`cm-go`,disabled:!r(Hr),onClick:Wr},m(r(Y)?`提交中…`:`确认提交`),9,br))])])])])):_(``,!0)]))],64)}}}),[[`__scopeId`,`data-v-0c6b2b03`]]);export{S as default};
@@ -1 +1 @@
1
- {"id":"d7f0931f-32b3-4c23-b05f-7cbf5851b226","timestamp":1793369473533}
1
+ {"id":"8e23aec9-5b67-4569-b8bf-d4f07e50ffdf","timestamp":1793377637161}
@@ -0,0 +1 @@
1
+ {"id":"8e23aec9-5b67-4569-b8bf-d4f07e50ffdf","timestamp":1793377637161,"prerendered":[]}