scrum-skills 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/scrum-planning/references/schema.md +3 -2
- package/.agents/skills/scrum-sprint/SKILL.md +1 -0
- package/README.md +1 -1
- package/assets/board/200.html +1 -1
- package/assets/board/404.html +1 -1
- package/assets/board/_nuxt/BgYBC1A-.js +1 -0
- package/assets/board/_nuxt/COK7QeK2.js +1 -0
- package/assets/board/_nuxt/{DKRYKLGF.js → CitsykCR.js} +4 -4
- package/assets/board/_nuxt/DPGo7nC4.js +3 -0
- package/assets/board/_nuxt/JybTzB-y.js +1 -0
- package/assets/board/_nuxt/_id_.JsxT0cgo.css +1 -0
- package/assets/board/_nuxt/builds/latest.json +1 -1
- package/assets/board/_nuxt/builds/meta/ef150044-a595-4b33-8a1a-103e86dccf28.json +1 -0
- package/assets/board/_nuxt/milestones.CCdemaYm.css +1 -0
- package/assets/board/burndown/index.html +1 -1
- package/assets/board/diagrams/index.html +1 -1
- package/assets/board/epics/index.html +1 -1
- package/assets/board/gantt/index.html +1 -1
- package/assets/board/index.html +1 -1
- package/assets/board/last-change/index.html +1 -1
- package/assets/board/milestones/index.html +1 -1
- package/assets/board/tests/index.html +1 -1
- package/package.json +1 -1
- package/tools/serve.mjs +3 -1
- package/tools/validate.mjs +4 -2
- package/assets/board/_nuxt/BKrRful0.js +0 -3
- package/assets/board/_nuxt/BbxmvdIF.js +0 -1
- package/assets/board/_nuxt/CtFknnHZ.js +0 -1
- package/assets/board/_nuxt/_id_.ItzoSaBL.css +0 -1
- package/assets/board/_nuxt/builds/meta/205ddf7c-da58-4213-ac80-82930a216157.json +0 -1
- package/assets/board/_nuxt/milestones.Civ3sMiQ.css +0 -1
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
"title": "MVP · 内测可登录",
|
|
105
105
|
"kind": "mvp | release | checkpoint",
|
|
106
106
|
"due": "2026-09-13",
|
|
107
|
-
"status": "planned | at-risk | reached | missed",
|
|
107
|
+
"status": "planned | at-risk | reached | missed | cancelled",
|
|
108
108
|
"sprintId": "R1-S1",
|
|
109
109
|
"criteria": "达成口径:怎样算这个节点到了",
|
|
110
110
|
"stories": ["S-001", "S-002"]
|
|
@@ -115,6 +115,7 @@
|
|
|
115
115
|
|
|
116
116
|
- **MVP 节点就是 `kind: "mvp"` 的里程碑**,不另设实体。
|
|
117
117
|
- `status: "reached"` 时挂的故事必须全部 `done/cancelled`,否则校验报错。
|
|
118
|
+
- `status: "cancelled"` 是**终态**:整个节点被业务取消(如「不做小程序提审」)时用它,既不是 `reached` 也不是 `missed`;**不要求**名下故事全部完成,但引用完整性、`kind` / `due` / `criteria` 照旧校验。看板显示「已取消」灰色节点,不计入已达成与风险数。
|
|
118
119
|
- `due` 早于今天但状态仍是 `planned` → WARN。
|
|
119
120
|
|
|
120
121
|
### 迭代编号规则(`sprints[].id`)
|
|
@@ -365,7 +366,7 @@ node tools/last-change.mjs write <记录.json> --replace # 确认旧记录不
|
|
|
365
366
|
- story: `draft → ready → in-progress → review → done`;不做了直接进 `cancelled`(已取消)终态(可回退,不可跳级;`done` 与 `cancelled` 都是终态)
|
|
366
367
|
- task: `todo → red → green → refactored → done`(只能前进;test 型可 `todo → green`)
|
|
367
368
|
- epic: 无强制流转,但 `done` 要求其下所有 story 均 `done/cancelled`
|
|
368
|
-
- milestone: `planned → at-risk → reached / missed`
|
|
369
|
+
- milestone: `planned → at-risk → reached / missed / cancelled`(`cancelled` 是整体取消的终态)
|
|
369
370
|
|
|
370
371
|
## 硬约束(校验器强制 / 警告)
|
|
371
372
|
|
|
@@ -38,6 +38,7 @@ description: 管理 Sprint 迭代周期与 Story 状态流转,落库到 agile/
|
|
|
38
38
|
1. sprint 到期:未完成 story 回 backlog(`sprintId` 置 null,状态回 `ready`),完成项保持 `done`
|
|
39
39
|
2. 生成回顾小结写入对话(做了什么/没做什么/为什么),不落文件除非用户要求
|
|
40
40
|
3. 里程碑到期没达成:状态改 `missed` 并写清差在哪几个故事;有风险但未到期改 `at-risk`;达成必须先把挂的故事推到 `done`
|
|
41
|
+
- 业务决定整个阶段不做了(不是没赶上):状态改 `cancelled` 并在 `note` 写清谁在什么时候拍的板、哪些成果保留;**不要**写成 `missed`,也不要为了通过校验硬置 `reached`
|
|
41
42
|
- 迭代中途插入的需求,必须给该 story 打 `scopeChange: { kind: "added-mid-sprint", at, reason }`;拆分出来的打 `split`。否则燃尽图上的偏差会被误读成团队拖延
|
|
42
43
|
4. 建议用户运行 `node tools/serve.mjs` 看燃尽图(`/burndown`)与甘特图(`/gantt`)核对进度
|
|
43
44
|
|
package/README.md
CHANGED
|
@@ -179,7 +179,7 @@ node tools/last-change.mjs write 记录.json --replace # 确认旧记录不要
|
|
|
179
179
|
- 测试资产(`agile/tests.json`,可选):`layer`/`level`/`status` 枚举合法、用例 id 唯一、`covers` 指向的验收必须存在且序号不越界、`taskId` 属于 covers 里的故事、`runs` 时间正序、最新一次 `failedCases` 必须对应 `status: fail`、覆盖率 0~100
|
|
180
180
|
- **收口纪律**(只查登记过用例的故事):done 的 `test` 型任务必须有对应用例;story 到 `review`/`done` 时每条验收必须被覆盖
|
|
181
181
|
- 迭代 id 格式与序号连续、同时只能有一个活跃迭代
|
|
182
|
-
- 里程碑 `reached`
|
|
182
|
+
- 里程碑 `reached` 时挂的故事必须全部完成;`cancelled` 是整体取消的终态,不要求故事完成(引用完整性照旧)
|
|
183
183
|
|
|
184
184
|
给 **WARN** 的(不阻塞):验收没绑验证任务、史诗缺 keyResults、计划区间超出迭代、承诺点数超容量、被阻塞的故事仍排在迭代里等。
|
|
185
185
|
|
package/assets/board/200.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CitsykCR.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.DplN301E.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CitsykCR.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CFCM18fF.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BxuBMtk_.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DxBwVNyP.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BygIGL69.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/SywdkA98.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BW3xJdEx.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/SrNUvNwO.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CI0scS-N.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D_ct-Stz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/P6qlvBHA.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CdPGFZyy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bubk0xn-.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DJM7u8P3.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DUgGsde6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BrWE0up6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BE6t7Q2m.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DqUSsCJ2.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/q_8bxRMt.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DFQDFspC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9MgRdhu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BQgzP7ur.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CgQ30j_6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DzmVW5-D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B0C2jsdk.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CYGiZn-X.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C3SpAhCW.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Cdf_T8Xa.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DV4ti-Pq.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CXG7GZes.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Dki9VkAL.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLr85ebo.js"><script type="module" src="/_nuxt/CitsykCR.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/I-sGtDIB.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BuBzMkFZ.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BAQQngAq.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.Y9imKiDC.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/1XlYaCp9.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.DufSBGVC.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BtzUbHO_.js"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="apple-touch-icon" href="/favicon.svg"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"ef150044-a595-4b33-8a1a-103e86dccf28",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1794120049158,false]</script></body></html>
|
package/assets/board/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>敏捷看板</title><script type="importmap">{"imports":{"#entry":"/_nuxt/CitsykCR.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.DplN301E.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CitsykCR.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CFCM18fF.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BxuBMtk_.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DxBwVNyP.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BygIGL69.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/SywdkA98.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BW3xJdEx.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/SrNUvNwO.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CI0scS-N.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D_ct-Stz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/P6qlvBHA.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CdPGFZyy.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bubk0xn-.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DJM7u8P3.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DUgGsde6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BrWE0up6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BE6t7Q2m.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DqUSsCJ2.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/q_8bxRMt.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DFQDFspC.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9MgRdhu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BQgzP7ur.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CgQ30j_6.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DzmVW5-D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B0C2jsdk.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CYGiZn-X.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C3SpAhCW.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Cdf_T8Xa.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DV4ti-Pq.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CXG7GZes.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Dki9VkAL.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLr85ebo.js"><script type="module" src="/_nuxt/CitsykCR.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/I-sGtDIB.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BuBzMkFZ.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BAQQngAq.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.Y9imKiDC.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/1XlYaCp9.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.DufSBGVC.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BtzUbHO_.js"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="apple-touch-icon" href="/favicon.svg"></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"ef150044-a595-4b33-8a1a-103e86dccf28",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1794120049158,false]</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=/(?:^|(?<=[\s。;;::,,))]))(?:\d{1,2}[.)、]|[((]\d{1,2}[))]|[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳]|[-*•·])\s+/gm,t=/(?<=[。;;])/,n=e=>typeof e==`string`?e.replace(/[\r\n]+/g,` `).replace(/\s{2,}/g,` `).trim():``,r=t=>t.match(e)?.length??0,i=20,a=e=>e.replace(/[;;,,]+$/,``).trim(),o=e=>e.length>1?e.map(a).filter(Boolean):e;function s(t){if(r(t)<2)return[];let a=t.split(e).map(n).filter(Boolean);return a.length>1&&a[0].length<=i&&/[::]$/.test(a[0])&&a.splice(0,2,`${a[0]}${a[1]}`),o(a)}function c(e){if(Array.isArray(e))return o(e.map(n).filter(Boolean));let r=n(e);if(!r)return[];let i=String(e).split(/\r?\n/).map(n).filter(Boolean);if(i.length>1)return o(i.flatMap(e=>{let t=s(e);return t.length?t:[e]}).filter(Boolean));let a=s(r);if(a.length>1)return a;let c=o(r.split(t).map(n).filter(Boolean));return c.length>1?c:[r]}export{c as t};
|
|
@@ -0,0 +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`},B={class:`mss`},ce={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`,cancelled:`off`})[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-75b2db69>按到期日从早到晚 · 节点达成口径是「挂的故事全部完成」</span><div class="legend" data-v-75b2db69><span class="lg" data-v-75b2db69><i class="sw mint" data-v-75b2db69></i>MVP</span><span class="lg" data-v-75b2db69><i class="sw lilac" data-v-75b2db69></i>发布</span><span class="lg" data-v-75b2db69><i class="sw white" data-v-75b2db69></i>检查点</span><i class="sep" data-v-75b2db69></i><span class="lg" data-v-75b2db69><i class="dot ok" data-v-75b2db69></i>已达成</span><span class="lg" data-v-75b2db69><i class="dot risk" data-v-75b2db69></i>有风险</span><span class="lg" data-v-75b2db69><i class="dot plan" data-v-75b2db69></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`})):e.status===`cancelled`?(c(),p(K,{key:1,name:`i-lucide-x`,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:e.status!==`cancelled`&&Y(e.due)<0,soon:e.status!==`cancelled`&&Y(e.due)>=0&&Y(e.due)<=7}])},l(e.status===`cancelled`?`不再跟踪`: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`,B,[(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`,ce,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-75b2db69`]]);export{G as default};
|