scrum-skills 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/.agents/skills/diagram-design/LICENSE +4 -0
  2. package/.agents/skills/diagram-design/SKILL.md +423 -0
  3. package/.agents/skills/diagram-design/UPSTREAM.json +88 -0
  4. package/.agents/skills/diagram-design/UPSTREAM.md +23 -0
  5. package/.agents/skills/diagram-design/assets/example-architecture-containment.html +205 -0
  6. package/.agents/skills/diagram-design/assets/example-architecture-delta.html +193 -0
  7. package/.agents/skills/diagram-design/assets/example-architecture.html +183 -0
  8. package/.agents/skills/diagram-design/assets/example-axonometric-plan-campus.html +108 -0
  9. package/.agents/skills/diagram-design/assets/example-axonometric-plan-coffee-shop.html +121 -0
  10. package/.agents/skills/diagram-design/assets/example-axonometric-plan-warehouse.html +127 -0
  11. package/.agents/skills/diagram-design/assets/example-axonometric-plan.html +114 -0
  12. package/.agents/skills/diagram-design/assets/example-bar.html +129 -0
  13. package/.agents/skills/diagram-design/assets/example-beeswarm.html +384 -0
  14. package/.agents/skills/diagram-design/assets/example-box-plot.html +127 -0
  15. package/.agents/skills/diagram-design/assets/example-bubble.html +147 -0
  16. package/.agents/skills/diagram-design/assets/example-bump.html +142 -0
  17. package/.agents/skills/diagram-design/assets/example-data-flow.html +143 -0
  18. package/.agents/skills/diagram-design/assets/example-datalake.html +269 -0
  19. package/.agents/skills/diagram-design/assets/example-db-schema.html +302 -0
  20. package/.agents/skills/diagram-design/assets/example-dependency.html +224 -0
  21. package/.agents/skills/diagram-design/assets/example-deployment.html +190 -0
  22. package/.agents/skills/diagram-design/assets/example-dp-integration.html +81 -0
  23. package/.agents/skills/diagram-design/assets/example-dp-security-matrix.html +88 -0
  24. package/.agents/skills/diagram-design/assets/example-er.html +202 -0
  25. package/.agents/skills/diagram-design/assets/example-exploded-ai-stack.html +85 -0
  26. package/.agents/skills/diagram-design/assets/example-exploded-keyboard.html +84 -0
  27. package/.agents/skills/diagram-design/assets/example-exploded-phone.html +83 -0
  28. package/.agents/skills/diagram-design/assets/example-exploded-unboxing.html +84 -0
  29. package/.agents/skills/diagram-design/assets/example-exploded.html +83 -0
  30. package/.agents/skills/diagram-design/assets/example-fishbone.html +152 -0
  31. package/.agents/skills/diagram-design/assets/example-flowchart.html +163 -0
  32. package/.agents/skills/diagram-design/assets/example-gantt.html +137 -0
  33. package/.agents/skills/diagram-design/assets/example-heatmap.html +224 -0
  34. package/.agents/skills/diagram-design/assets/example-high-level-vertical.html +325 -0
  35. package/.agents/skills/diagram-design/assets/example-high-level.html +301 -0
  36. package/.agents/skills/diagram-design/assets/example-import-drawio.html +185 -0
  37. package/.agents/skills/diagram-design/assets/example-import-excalidraw.html +70 -0
  38. package/.agents/skills/diagram-design/assets/example-import-mermaid.html +70 -0
  39. package/.agents/skills/diagram-design/assets/example-it-state.html +128 -0
  40. package/.agents/skills/diagram-design/assets/example-journey.html +148 -0
  41. package/.agents/skills/diagram-design/assets/example-kanban.html +174 -0
  42. package/.agents/skills/diagram-design/assets/example-layers.html +123 -0
  43. package/.agents/skills/diagram-design/assets/example-line.html +111 -0
  44. package/.agents/skills/diagram-design/assets/example-loop.html +100 -0
  45. package/.agents/skills/diagram-design/assets/example-marimekko.html +148 -0
  46. package/.agents/skills/diagram-design/assets/example-medallion.html +159 -0
  47. package/.agents/skills/diagram-design/assets/example-nested.html +136 -0
  48. package/.agents/skills/diagram-design/assets/example-org-chart.html +45 -0
  49. package/.agents/skills/diagram-design/assets/example-polar.html +116 -0
  50. package/.agents/skills/diagram-design/assets/example-process.html +64 -0
  51. package/.agents/skills/diagram-design/assets/example-pyramid.html +119 -0
  52. package/.agents/skills/diagram-design/assets/example-quadrant-consultant.html +166 -0
  53. package/.agents/skills/diagram-design/assets/example-quadrant.html +135 -0
  54. package/.agents/skills/diagram-design/assets/example-radar.html +139 -0
  55. package/.agents/skills/diagram-design/assets/example-ridgeline.html +104 -0
  56. package/.agents/skills/diagram-design/assets/example-sankey.html +150 -0
  57. package/.agents/skills/diagram-design/assets/example-scatter.html +141 -0
  58. package/.agents/skills/diagram-design/assets/example-sequence-oauth.html +227 -0
  59. package/.agents/skills/diagram-design/assets/example-sequence.html +222 -0
  60. package/.agents/skills/diagram-design/assets/example-service-blueprint.html +185 -0
  61. package/.agents/skills/diagram-design/assets/example-slopegraph.html +119 -0
  62. package/.agents/skills/diagram-design/assets/example-state-lifecycle.html +92 -0
  63. package/.agents/skills/diagram-design/assets/example-state.html +147 -0
  64. package/.agents/skills/diagram-design/assets/example-story-map.html +184 -0
  65. package/.agents/skills/diagram-design/assets/example-streamgraph.html +99 -0
  66. package/.agents/skills/diagram-design/assets/example-swimlane.html +172 -0
  67. package/.agents/skills/diagram-design/assets/example-timeline.html +135 -0
  68. package/.agents/skills/diagram-design/assets/example-tree-block-decomposition.html +151 -0
  69. package/.agents/skills/diagram-design/assets/example-tree.html +173 -0
  70. package/.agents/skills/diagram-design/assets/example-treemap.html +107 -0
  71. package/.agents/skills/diagram-design/assets/example-uml-class.html +188 -0
  72. package/.agents/skills/diagram-design/assets/example-venn.html +110 -0
  73. package/.agents/skills/diagram-design/assets/example-wardley.html +153 -0
  74. package/.agents/skills/diagram-design/assets/example-waterfall.html +129 -0
  75. package/.agents/skills/diagram-design/assets/template-dark.html +99 -0
  76. package/.agents/skills/diagram-design/assets/template-full.html +421 -0
  77. package/.agents/skills/diagram-design/assets/template-motion.html +448 -0
  78. package/.agents/skills/diagram-design/assets/template-terminal.html +188 -0
  79. package/.agents/skills/diagram-design/assets/template.html +100 -0
  80. package/.agents/skills/diagram-design/references/animation.md +143 -0
  81. package/.agents/skills/diagram-design/references/export-registry.md +78 -0
  82. package/.agents/skills/diagram-design/references/export.md +376 -0
  83. package/.agents/skills/diagram-design/references/import-drawio.md +181 -0
  84. package/.agents/skills/diagram-design/references/import-excalidraw.md +130 -0
  85. package/.agents/skills/diagram-design/references/import-mermaid.md +137 -0
  86. package/.agents/skills/diagram-design/references/layout-budget.md +97 -0
  87. package/.agents/skills/diagram-design/references/onboarding.md +368 -0
  88. package/.agents/skills/diagram-design/references/output-spec.md +277 -0
  89. package/.agents/skills/diagram-design/references/primitive-annotation.md +36 -0
  90. package/.agents/skills/diagram-design/references/primitive-icons.md +827 -0
  91. package/.agents/skills/diagram-design/references/primitive-sketchy.md +43 -0
  92. package/.agents/skills/diagram-design/references/primitive-terminal.md +76 -0
  93. package/.agents/skills/diagram-design/references/primitives-core.md +150 -0
  94. package/.agents/skills/diagram-design/references/profiles.md +183 -0
  95. package/.agents/skills/diagram-design/references/semantic-patterns.md +154 -0
  96. package/.agents/skills/diagram-design/references/style-guide.md +236 -0
  97. package/.agents/skills/diagram-design/references/style-vivid.md +148 -0
  98. package/.agents/skills/diagram-design/references/type-architecture-delta.md +143 -0
  99. package/.agents/skills/diagram-design/references/type-architecture.md +117 -0
  100. package/.agents/skills/diagram-design/references/type-axonometric-plan.md +83 -0
  101. package/.agents/skills/diagram-design/references/type-bar.md +108 -0
  102. package/.agents/skills/diagram-design/references/type-data-flow.md +371 -0
  103. package/.agents/skills/diagram-design/references/type-db-schema.md +48 -0
  104. package/.agents/skills/diagram-design/references/type-dependency.md +44 -0
  105. package/.agents/skills/diagram-design/references/type-deployment.md +45 -0
  106. package/.agents/skills/diagram-design/references/type-dp-integration.md +407 -0
  107. package/.agents/skills/diagram-design/references/type-dp-security-matrix.md +379 -0
  108. package/.agents/skills/diagram-design/references/type-er.md +25 -0
  109. package/.agents/skills/diagram-design/references/type-exploded.md +115 -0
  110. package/.agents/skills/diagram-design/references/type-fishbone.md +75 -0
  111. package/.agents/skills/diagram-design/references/type-flowchart.md +23 -0
  112. package/.agents/skills/diagram-design/references/type-gantt.md +45 -0
  113. package/.agents/skills/diagram-design/references/type-heatmap.md +80 -0
  114. package/.agents/skills/diagram-design/references/type-high-level.md +470 -0
  115. package/.agents/skills/diagram-design/references/type-it-state.md +468 -0
  116. package/.agents/skills/diagram-design/references/type-journey.md +55 -0
  117. package/.agents/skills/diagram-design/references/type-kanban.md +49 -0
  118. package/.agents/skills/diagram-design/references/type-layers.md +26 -0
  119. package/.agents/skills/diagram-design/references/type-line.md +337 -0
  120. package/.agents/skills/diagram-design/references/type-loop.md +223 -0
  121. package/.agents/skills/diagram-design/references/type-medallion.md +356 -0
  122. package/.agents/skills/diagram-design/references/type-nested.md +22 -0
  123. package/.agents/skills/diagram-design/references/type-org-chart.md +44 -0
  124. package/.agents/skills/diagram-design/references/type-polar.md +136 -0
  125. package/.agents/skills/diagram-design/references/type-process.md +490 -0
  126. package/.agents/skills/diagram-design/references/type-pyramid.md +33 -0
  127. package/.agents/skills/diagram-design/references/type-quadrant.md +81 -0
  128. package/.agents/skills/diagram-design/references/type-radar.md +82 -0
  129. package/.agents/skills/diagram-design/references/type-sankey.md +75 -0
  130. package/.agents/skills/diagram-design/references/type-scatter.md +276 -0
  131. package/.agents/skills/diagram-design/references/type-sequence.md +130 -0
  132. package/.agents/skills/diagram-design/references/type-service-blueprint.md +103 -0
  133. package/.agents/skills/diagram-design/references/type-state.md +30 -0
  134. package/.agents/skills/diagram-design/references/type-story-map.md +46 -0
  135. package/.agents/skills/diagram-design/references/type-swimlane.md +22 -0
  136. package/.agents/skills/diagram-design/references/type-timeline.md +20 -0
  137. package/.agents/skills/diagram-design/references/type-tree.md +24 -0
  138. package/.agents/skills/diagram-design/references/type-treemap.md +137 -0
  139. package/.agents/skills/diagram-design/references/type-uml-class.md +65 -0
  140. package/.agents/skills/diagram-design/references/type-venn.md +26 -0
  141. package/.agents/skills/diagram-design/references/type-wardley.md +39 -0
  142. package/.agents/skills/diagram-design/references/type-waterfall.md +75 -0
  143. package/.agents/skills/scrum-meta/SKILL.md +36 -36
  144. package/.agents/skills/scrum-planning/SKILL.md +61 -61
  145. package/.agents/skills/scrum-planning/references/schema.md +384 -336
  146. package/.agents/skills/scrum-report/SKILL.md +42 -42
  147. package/.agents/skills/scrum-sprint/SKILL.md +49 -49
  148. package/.agents/skills/scrum-tdd/SKILL.md +140 -127
  149. package/README.md +24 -1
  150. package/assets/board/200.html +1 -1
  151. package/assets/board/404.html +1 -1
  152. package/assets/board/_nuxt/4gQF_HS3.js +1 -0
  153. package/assets/board/_nuxt/5okfNy5D.js +1 -0
  154. package/assets/board/_nuxt/{Bb3Limos.js → B0C2jsdk.js} +1 -1
  155. package/assets/board/_nuxt/B1j6UC4U.js +1 -0
  156. package/assets/board/_nuxt/B3LKy6o2.js +1 -0
  157. package/assets/board/_nuxt/BAQQngAq.js +13 -0
  158. package/assets/board/_nuxt/BE6t7Q2m.js +1 -0
  159. package/assets/board/_nuxt/BGwhkDRl.js +1 -0
  160. package/assets/board/_nuxt/BLvbupFS.js +1 -0
  161. package/assets/board/_nuxt/BQgzP7ur.js +1 -0
  162. package/assets/board/_nuxt/BRZIF_wo.js +1 -0
  163. package/assets/board/_nuxt/BU8vdZUs.js +95 -0
  164. package/assets/board/_nuxt/BW3xJdEx.js +1 -0
  165. package/assets/board/_nuxt/{Cm9lkUvP.js → BY36DFyj.js} +1 -1
  166. package/assets/board/_nuxt/BZlZD94i.js +1 -0
  167. package/assets/board/_nuxt/BZvXNwev.js +3 -0
  168. package/assets/board/_nuxt/BiWrMOsL.js +1 -0
  169. package/assets/board/_nuxt/BkoKCNUY.js +1 -0
  170. package/assets/board/_nuxt/BlKmZhhF.js +1 -0
  171. package/assets/board/_nuxt/BmBpmU73.js +1 -0
  172. package/assets/board/_nuxt/BmrSh0rL.js +1 -0
  173. package/assets/board/_nuxt/BrWE0up6.js +1 -0
  174. package/assets/board/_nuxt/Bs52qkgk.js +1 -0
  175. package/assets/board/_nuxt/BuBzMkFZ.js +1 -0
  176. package/assets/board/_nuxt/Bubk0xn-.js +1 -0
  177. package/assets/board/_nuxt/BxuBMtk_.js +3 -0
  178. package/assets/board/_nuxt/By1KXXLR.js +1 -0
  179. package/assets/board/_nuxt/BygIGL69.js +2 -0
  180. package/assets/board/_nuxt/C-fx-vFO.js +1 -0
  181. package/assets/board/_nuxt/C1iO5KH3.js +1 -0
  182. package/assets/board/_nuxt/C2YPmTzt.js +1 -0
  183. package/assets/board/_nuxt/C3SpAhCW.js +1 -0
  184. package/assets/board/_nuxt/C3ZRWz5L.js +1 -0
  185. package/assets/board/_nuxt/C4WdPP6K.js +1 -0
  186. package/assets/board/_nuxt/C6o03JHe.js +1 -0
  187. package/assets/board/_nuxt/C8qB5llI.js +1 -0
  188. package/assets/board/_nuxt/C9MgRdhu.js +1 -0
  189. package/assets/board/_nuxt/CCA81-4P.js +1 -0
  190. package/assets/board/_nuxt/{D2O8Q8x9.js → CFCM18fF.js} +1 -1
  191. package/assets/board/_nuxt/CGXljzd_.js +1 -0
  192. package/assets/board/_nuxt/CI0scS-N.js +1 -0
  193. package/assets/board/_nuxt/CJs9B42o.js +1 -0
  194. package/assets/board/_nuxt/COmtTtfB.js +1 -0
  195. package/assets/board/_nuxt/CPYm4J_K.js +1 -0
  196. package/assets/board/_nuxt/CXG7GZes.js +1 -0
  197. package/assets/board/_nuxt/CYGiZn-X.js +1 -0
  198. package/assets/board/_nuxt/CaE8VlUp.js +1 -0
  199. package/assets/board/_nuxt/Cajxc4Dw.js +1 -0
  200. package/assets/board/_nuxt/CcGiNUgA.js +1 -0
  201. package/assets/board/_nuxt/Ccgv3lDj.js +1 -0
  202. package/assets/board/_nuxt/CdPGFZyy.js +1 -0
  203. package/assets/board/_nuxt/{DfR3IZN_.js → Cdf_T8Xa.js} +1 -1
  204. package/assets/board/_nuxt/CgQ30j_6.js +1 -0
  205. package/assets/board/_nuxt/Ck0-FqVI.js +1 -0
  206. package/assets/board/_nuxt/CkWKLtjO.js +1 -0
  207. package/assets/board/_nuxt/CoipdpDu.js +1 -0
  208. package/assets/board/_nuxt/Cq7hsCKB.js +1 -0
  209. package/assets/board/_nuxt/D166WVUG.js +1 -0
  210. package/assets/board/_nuxt/D1V1gysQ.js +1 -0
  211. package/assets/board/_nuxt/D4Dpzo9e.js +1 -0
  212. package/assets/board/_nuxt/D5i92OZO.js +1 -0
  213. package/assets/board/_nuxt/D6dUp4Nm.js +9 -0
  214. package/assets/board/_nuxt/DFQDFspC.js +1 -0
  215. package/assets/board/_nuxt/DHX2tw9J.js +1 -0
  216. package/assets/board/_nuxt/DJM7u8P3.js +1 -0
  217. package/assets/board/_nuxt/{BPTrRhcw.js → DLr85ebo.js} +1 -1
  218. package/assets/board/_nuxt/DOMM1wfl.js +1 -0
  219. package/assets/board/_nuxt/DU6ArlUN.js +1 -0
  220. package/assets/board/_nuxt/{B_SlFcWp.js → DUgGsde6.js} +1 -1
  221. package/assets/board/_nuxt/DV4ti-Pq.js +1 -0
  222. package/assets/board/_nuxt/D_ct-Stz.js +2 -0
  223. package/assets/board/_nuxt/DbWAComO.js +1 -0
  224. package/assets/board/_nuxt/DbwlcHAt.js +1 -0
  225. package/assets/board/_nuxt/Dki9VkAL.js +3 -0
  226. package/assets/board/_nuxt/DlNJhOoc.js +1 -0
  227. package/assets/board/_nuxt/Dmg78zOY.js +3 -0
  228. package/assets/board/_nuxt/DqG7CtD4.js +1 -0
  229. package/assets/board/_nuxt/DqUSsCJ2.js +1 -0
  230. package/assets/board/_nuxt/Du2F4WXh.js +1 -0
  231. package/assets/board/_nuxt/DuRiEXn4.js +1 -0
  232. package/assets/board/_nuxt/DwCE3305.js +1 -0
  233. package/assets/board/_nuxt/DwzGxoX2.js +1 -0
  234. package/assets/board/_nuxt/DxBwVNyP.js +2 -0
  235. package/assets/board/_nuxt/DzmVW5-D.js +1 -0
  236. package/assets/board/_nuxt/I-sGtDIB.js +6 -0
  237. package/assets/board/_nuxt/JU9-x68N.js +1 -0
  238. package/assets/board/_nuxt/Lozm7hhE.js +1 -0
  239. package/assets/board/_nuxt/MMsTMkcB.js +1 -0
  240. package/assets/board/_nuxt/MS7CGmCB.js +1 -0
  241. package/assets/board/_nuxt/OKKaKILz.js +1 -0
  242. package/assets/board/_nuxt/{Csqgy925.js → P6qlvBHA.js} +1 -1
  243. package/assets/board/_nuxt/SrNUvNwO.js +1 -0
  244. package/assets/board/_nuxt/{DSaWoFHS.js → SywdkA98.js} +1 -1
  245. package/assets/board/_nuxt/TBIRpVLG.js +1 -0
  246. package/assets/board/_nuxt/TlTrMIMm.js +1 -0
  247. package/assets/board/_nuxt/Utb4TVOl.js +1 -0
  248. package/assets/board/_nuxt/Zv9-SOQF.js +1 -0
  249. package/assets/board/_nuxt/_id_.B6iqDPxe.css +1 -0
  250. package/assets/board/_nuxt/b7xtxFRl.js +1 -0
  251. package/assets/board/_nuxt/builds/latest.json +1 -1
  252. package/assets/board/_nuxt/builds/meta/08bebe14-0f1b-4d2a-8de4-e84e122d10e9.json +1 -0
  253. package/assets/board/_nuxt/diagrams.pyhqNtmr.css +1 -0
  254. package/assets/board/_nuxt/{entry.CKHePurH.css → entry.BBv-sBnP.css} +1 -1
  255. package/assets/board/_nuxt/error-404.CgJNdpB5.css +1 -0
  256. package/assets/board/_nuxt/error-500.WYSoH44y.css +1 -0
  257. package/assets/board/_nuxt/jbri6q1p.js +1 -0
  258. package/assets/board/_nuxt/q_8bxRMt.js +1 -0
  259. package/assets/board/burndown/index.html +1 -1
  260. package/assets/board/diagrams/index.html +1 -0
  261. package/assets/board/epics/index.html +1 -1
  262. package/assets/board/gantt/index.html +1 -1
  263. package/assets/board/index.html +1 -1
  264. package/assets/board/last-change/index.html +1 -1
  265. package/assets/board/milestones/index.html +1 -1
  266. package/assets/board/tests/index.html +1 -1
  267. package/bin/scrum-skills.mjs +13 -0
  268. package/package.json +2 -1
  269. package/templates/AGENTS.md +10 -0
  270. package/tools/diagram-import.mjs +238 -0
  271. package/tools/diagram-lint.mjs +518 -0
  272. package/tools/diagram.mjs +299 -0
  273. package/tools/last-change.mjs +326 -326
  274. package/tools/projects.mjs +29 -4
  275. package/tools/serve.mjs +27 -1
  276. package/tools/validate.mjs +781 -664
  277. package/assets/board/_nuxt/1eqboJxR.js +0 -1
  278. package/assets/board/_nuxt/2K7ag6ES.js +0 -1
  279. package/assets/board/_nuxt/51OWHj8c.js +0 -2
  280. package/assets/board/_nuxt/6gFtTBwm.js +0 -1
  281. package/assets/board/_nuxt/B3jkABw9.js +0 -1
  282. package/assets/board/_nuxt/B5n2_jZN.js +0 -1
  283. package/assets/board/_nuxt/BDK2Hj7B.js +0 -1
  284. package/assets/board/_nuxt/BDcnzXHq.js +0 -1
  285. package/assets/board/_nuxt/BaG8y0Wt.js +0 -1
  286. package/assets/board/_nuxt/BbwJq5pb.js +0 -1
  287. package/assets/board/_nuxt/BgLeKwx0.js +0 -1
  288. package/assets/board/_nuxt/Bi9Axj3V.js +0 -1
  289. package/assets/board/_nuxt/BmxvtaMq.js +0 -1
  290. package/assets/board/_nuxt/BodFvto3.js +0 -1
  291. package/assets/board/_nuxt/BpWeHLuN.js +0 -1
  292. package/assets/board/_nuxt/BuOKDFiJ.js +0 -1
  293. package/assets/board/_nuxt/C40iTe-x.js +0 -1
  294. package/assets/board/_nuxt/C7K0R7F-.js +0 -2
  295. package/assets/board/_nuxt/C8vL692X.js +0 -1
  296. package/assets/board/_nuxt/C9StZL3D.js +0 -3
  297. package/assets/board/_nuxt/CGI_ZV79.js +0 -1
  298. package/assets/board/_nuxt/CJ2mz0WY.js +0 -1
  299. package/assets/board/_nuxt/CJMBJQuf.js +0 -1
  300. package/assets/board/_nuxt/CK-lOYG9.js +0 -1
  301. package/assets/board/_nuxt/CK9_veoz.js +0 -1
  302. package/assets/board/_nuxt/CLBcBrYf.js +0 -1
  303. package/assets/board/_nuxt/CMUi2-Lj.js +0 -1
  304. package/assets/board/_nuxt/COf6E6h4.js +0 -1
  305. package/assets/board/_nuxt/CPCUMJnF.js +0 -1
  306. package/assets/board/_nuxt/CPcKlmSm.js +0 -1
  307. package/assets/board/_nuxt/CQTvWh4i.js +0 -1
  308. package/assets/board/_nuxt/CSEEUF8S.js +0 -1
  309. package/assets/board/_nuxt/CSSb154I.js +0 -13
  310. package/assets/board/_nuxt/CgDTd7jS.js +0 -1
  311. package/assets/board/_nuxt/ChG76uh9.js +0 -1
  312. package/assets/board/_nuxt/Ci0qbkgh.js +0 -1
  313. package/assets/board/_nuxt/CqoQ__I_.js +0 -1
  314. package/assets/board/_nuxt/CuJUHLl8.js +0 -1
  315. package/assets/board/_nuxt/CvLiA4_O.js +0 -1
  316. package/assets/board/_nuxt/Cvs12oA0.js +0 -3
  317. package/assets/board/_nuxt/CyEXFe3V.js +0 -1
  318. package/assets/board/_nuxt/Cz6rZcLK.js +0 -1
  319. package/assets/board/_nuxt/D2FhHl1o.js +0 -1
  320. package/assets/board/_nuxt/D3YCAmfu.js +0 -1
  321. package/assets/board/_nuxt/D5CE81jK.js +0 -1
  322. package/assets/board/_nuxt/D75vbfSb.js +0 -1
  323. package/assets/board/_nuxt/D99LbGfb.js +0 -9
  324. package/assets/board/_nuxt/DEfLc7p3.js +0 -6
  325. package/assets/board/_nuxt/DF-nsa1Z.js +0 -1
  326. package/assets/board/_nuxt/DIc8yx98.js +0 -1
  327. package/assets/board/_nuxt/DLkAKotw.js +0 -1
  328. package/assets/board/_nuxt/DRPlYvb3.js +0 -1
  329. package/assets/board/_nuxt/DRlQgul3.js +0 -1
  330. package/assets/board/_nuxt/DSLbmoWa.js +0 -1
  331. package/assets/board/_nuxt/DWO9c9yp.js +0 -1
  332. package/assets/board/_nuxt/DZo3dYLJ.js +0 -3
  333. package/assets/board/_nuxt/D_S6N7_b.js +0 -1
  334. package/assets/board/_nuxt/DajA-Tkt.js +0 -1
  335. package/assets/board/_nuxt/DbHiyab-.js +0 -1
  336. package/assets/board/_nuxt/Dc7Ql6eE.js +0 -1
  337. package/assets/board/_nuxt/Dd9ZukPU.js +0 -1
  338. package/assets/board/_nuxt/Dg2LiqmN.js +0 -1
  339. package/assets/board/_nuxt/DhuleNnm.js +0 -1
  340. package/assets/board/_nuxt/DkI1Qxpp.js +0 -95
  341. package/assets/board/_nuxt/DnDHGSYI.js +0 -1
  342. package/assets/board/_nuxt/DpXJ_tCU.js +0 -1
  343. package/assets/board/_nuxt/DqZgF3hU.js +0 -1
  344. package/assets/board/_nuxt/DqcxvfbD.js +0 -1
  345. package/assets/board/_nuxt/DsA2lVci.js +0 -1
  346. package/assets/board/_nuxt/Dtsa-1NS.js +0 -1
  347. package/assets/board/_nuxt/Du91iq0p.js +0 -1
  348. package/assets/board/_nuxt/Dx1wcYFo.js +0 -1
  349. package/assets/board/_nuxt/EYTShbt4.js +0 -1
  350. package/assets/board/_nuxt/MaXJprwN.js +0 -1
  351. package/assets/board/_nuxt/P9x67aq2.js +0 -1
  352. package/assets/board/_nuxt/S08nFESZ.js +0 -3
  353. package/assets/board/_nuxt/V0uynWE2.js +0 -1
  354. package/assets/board/_nuxt/Vo4wMbnS.js +0 -1
  355. package/assets/board/_nuxt/ZVTqot-_.js +0 -1
  356. package/assets/board/_nuxt/ZngEd3HB.js +0 -1
  357. package/assets/board/_nuxt/_id_.B2NDKSlX.css +0 -1
  358. package/assets/board/_nuxt/assMu_Wn.js +0 -1
  359. package/assets/board/_nuxt/builds/meta/8e23aec9-5b67-4569-b8bf-d4f07e50ffdf.json +0 -1
  360. package/assets/board/_nuxt/error-404.BFmXOnCT.css +0 -1
  361. package/assets/board/_nuxt/error-500.BZ-DdjQ6.css +0 -1
  362. package/assets/board/_nuxt/rlePnzpc.js +0 -1
  363. package/assets/board/_nuxt/uKzCKCTq.js +0 -1
  364. package/assets/board/_nuxt/vwxaNGfc.js +0 -1
  365. package/assets/board/_nuxt/yh6sf_D5.js +0 -1
@@ -1,42 +1,42 @@
1
- ---
2
- name: scrum-report
3
- description: 从 agile/ 结构化数据生成可视化展示(看板、燃尽图、追溯链)。适用于查看进度、回顾、汇报、核对数据完整性等场景。
4
- ---
5
-
6
- # scrum-report:数据可视化
7
-
8
- ## 何时使用
9
-
10
- 用户想看进度、看板、燃尽图、某个 story 的实施追溯链,或要求核对数据时使用。
11
-
12
- ## 工具
13
-
14
- 启动本地 server(由 scrum-skills CLI 提供,零依赖,node ≥ 18):
15
-
16
- ```bash
17
- npx scrum-skills serve # 默认当前目录 http://localhost:4173
18
- npx scrum-skills serve . 8080 # 指定目录与端口
19
- ```
20
-
21
- server 读取 `agile/` 下的数据文件(backlog / sprints / journal,加可选的 tests / last-change),每次请求现取,不写文件。改了数据刷新页面即生效。
22
-
23
- ## 页面
24
-
25
- 渲染由 Nuxt 静态产物(`assets/board/`)负责,`tools/serve.mjs` 只提供 `/api/agile` 与静态托管,没有任何手写 HTML。
26
-
27
- - `/` 看板:六列(草稿 / 就绪 / 进行中 / 评审 / 完成 / 已取消),可按史诗、里程碑筛选,可按优先级 / WSJF / 点数重排;卡片显示 id、类型(功能·缺陷·技术债·调研)、优先级、阻塞标记、范围变更标记、点数与 WSJF、task 进度、MVP 标记
28
- - `/last-change` 最后更新:渲染 `agile/last-change.json` —— 变更清单(故事 / 任务 · 新增还是状态变更 · 涉及文件)、额外做的事、验证结果、调试入口与账号密码、测试前准备、逐条测试场景(步骤 + 验收标准)、说明与遗留;「查看历史」从 git 里列出该文件的每次提交,选中某版整页只读展示,顶部页签可在最新/各历史版本间切换;文件不存在时给空状态并说明谁来写
29
- - `/gantt` 甘特图:按迭代分带;浅色条是 `story.schedule` 计划区间,实心条是 journal 推出的真实执行区间;菱形是里程碑(MVP 琥珀色),红色虚线是今天;行内标出依赖数量与阻塞,图下列出依赖链与阻塞清单
30
- - `/milestones` 里程碑 / MVP 节点:按 kind 分组(mvp / release / checkpoint),显示达成口径、挂的故事、进度与剩余天数
31
- - `/burndown` 燃尽图:可选任意迭代;实线来自每个 task 最后一条 pass 的日期,虚线是理想线,逐日格子给出实际/理想剩余
32
- - `/tests` 测试用例:QA 交付视图——需求覆盖分子/分母(按验收条)、前端/后端/E2E 分层概览与故事×层矩阵、用例清单(可展开步骤与预期)、执行记录、缺口与风险(未覆盖验收 + 最近失败用例);数据来自 `agile/tests.json`,没有该文件时给空状态
33
- - `/story/S-001` 追溯链:acceptance → task → journal 每阶段(red/green/refactor)的完整记录,含测试命令与产出文件
34
-
35
- ## 纪律
36
-
37
- 1. 展示前先跑 `node tools/validate.mjs`,**校验不过的数据不许出报表**——先修数据
38
- 2. 报表只读 JSON,不许为展示改数据;发现数据缺漏时向用户报告并用 planning/sprint/tdd skill 补
39
- 3. 向用户汇报进度时引用具体 id(S-001、S-001-T2),不许说「差不多了」「快完成了」这类没有数据支撑的口径
40
- 4. 燃尽图数据来自 journal 的 date 字段;某 task 没写 journal 导致曲线缺点的,如实显示缺口并指出责任 story
41
- 5. 报覆盖率必须说清是哪一本账:需求覆盖(验收条)、用例通过(最近一次执行)、代码覆盖(各层工具报告,前端/后端分开),不许把三者合成一个「覆盖率」数
42
- 6. `/tests` 的缺口就是交付风险:汇报进度时一并说「N 条验收没用例」「M 条用例最近失败」,别只报通过率
1
+ ---
2
+ name: scrum-report
3
+ description: 从 agile/ 结构化数据生成可视化展示(看板、燃尽图、追溯链)。适用于查看进度、回顾、汇报、核对数据完整性等场景。
4
+ ---
5
+
6
+ # scrum-report:数据可视化
7
+
8
+ ## 何时使用
9
+
10
+ 用户想看进度、看板、燃尽图、某个 story 的实施追溯链,或要求核对数据时使用。
11
+
12
+ ## 工具
13
+
14
+ 启动本地 server(由 scrum-skills CLI 提供,零依赖,node ≥ 18):
15
+
16
+ ```bash
17
+ npx scrum-skills serve # 默认当前目录 http://localhost:4173
18
+ npx scrum-skills serve . 8080 # 指定目录与端口
19
+ ```
20
+
21
+ server 读取 `agile/` 下的数据文件(backlog / sprints / journal,加可选的 tests / last-change),每次请求现取,不写文件。改了数据刷新页面即生效。
22
+
23
+ ## 页面
24
+
25
+ 渲染由 Nuxt 静态产物(`assets/board/`)负责,`tools/serve.mjs` 只提供 `/api/agile` 与静态托管,没有任何手写 HTML。
26
+
27
+ - `/` 看板:六列(草稿 / 就绪 / 进行中 / 评审 / 完成 / 已取消),可按史诗、里程碑筛选,可按优先级 / WSJF / 点数重排;卡片显示 id、类型(功能·缺陷·技术债·调研)、优先级、阻塞标记、范围变更标记、点数与 WSJF、task 进度、MVP 标记
28
+ - `/last-change` 最后更新:渲染 `agile/last-change.json` —— 变更清单(故事 / 任务 · 新增还是状态变更 · 涉及文件)、额外做的事、验证结果、调试入口与账号密码、测试前准备、逐条测试场景(步骤 + 验收标准)、说明与遗留;「查看历史」从 git 里列出该文件的每次提交,选中某版整页只读展示,顶部页签可在最新/各历史版本间切换;文件不存在时给空状态并说明谁来写
29
+ - `/gantt` 甘特图:按迭代分带;浅色条是 `story.schedule` 计划区间,实心条是 journal 推出的真实执行区间;菱形是里程碑(MVP 琥珀色),红色虚线是今天;行内标出依赖数量与阻塞,图下列出依赖链与阻塞清单
30
+ - `/milestones` 里程碑 / MVP 节点:按 kind 分组(mvp / release / checkpoint),显示达成口径、挂的故事、进度与剩余天数
31
+ - `/burndown` 燃尽图:可选任意迭代;实线来自每个 task 最后一条 pass 的日期,虚线是理想线,逐日格子给出实际/理想剩余
32
+ - `/tests` 测试用例:QA 交付视图——需求覆盖分子/分母(按验收条)、前端/后端/E2E 分层概览与故事×层矩阵、用例清单(可展开步骤与预期)、执行记录、缺口与风险(未覆盖验收 + 最近失败用例);数据来自 `agile/tests.json`,没有该文件时给空状态
33
+ - `/story/S-001` 追溯链:acceptance → task → journal 每阶段(red/green/refactor)的完整记录,含测试命令与产出文件
34
+
35
+ ## 纪律
36
+
37
+ 1. 展示前先跑 `node tools/validate.mjs`,**校验不过的数据不许出报表**——先修数据
38
+ 2. 报表只读 JSON,不许为展示改数据;发现数据缺漏时向用户报告并用 planning/sprint/tdd skill 补
39
+ 3. 向用户汇报进度时引用具体 id(S-001、S-001-T2),不许说「差不多了」「快完成了」这类没有数据支撑的口径
40
+ 4. 燃尽图数据来自 journal 的 date 字段;某 task 没写 journal 导致曲线缺点的,如实显示缺口并指出责任 story
41
+ 5. 报覆盖率必须说清是哪一本账:需求覆盖(验收条)、用例通过(最近一次执行)、代码覆盖(各层工具报告,前端/后端分开),不许把三者合成一个「覆盖率」数
42
+ 6. `/tests` 的缺口就是交付风险:汇报进度时一并说「N 条验收没用例」「M 条用例最近失败」,别只报通过率
@@ -1,49 +1,49 @@
1
- ---
2
- name: scrum-sprint
3
- description: 管理 Sprint 迭代周期与 Story 状态流转,落库到 agile/sprints/。适用于排期、组建迭代、状态更新、每日进度同步等场景。
4
- ---
5
-
6
- # scrum-sprint:迭代排期与状态流转
7
-
8
- ## 何时使用
9
-
10
- 用户要求排期、组建/启动/收尾一个迭代、更新任务进度、回顾时使用本 skill。
11
-
12
- ## 前置
13
-
14
- 先读 `agile/backlog.json`(epics + stories)与 `agile/sprints.json`(sprints + milestones),掌握真实状态。**状态以文件为准,对话记忆一律作废。**
15
-
16
- ## 工作流
17
-
18
- ### 组建 Sprint
19
-
20
- 1. 从 backlog 中挑 `ready` 状态的 story(不满足 ready 的先回 scrum-planning 补验收标准)
21
- - 排序依据:`priority` 优先,同优先级比 WSJF(`value / points`)
22
- - **依赖检查**:`dependsOn` 里的故事必须已完成,否则别排进本迭代;**阻塞检查**:带 `blocked` 的先解决阻塞再排
23
- 2. 总点数不超过 `capacity`(默认 20,可和用户商量)
24
- 3. 往 `agile/sprints.json` 的 `sprints` 数组里追加一条,story 的 `sprintId` 同步更新;**id 按 planning skill `references/schema.md` 的「迭代编号规则」生成**(`R<发布周期>-S<期内冲刺号>`,如 `R1-S1`),不许另发明格式
25
- 4. 被选中的 story 状态改为 `in-progress`(或 sprint 启动时改)
26
- 5. 与迭代绑定的里程碑写进同文件 `milestones`:MVP 节点用 `kind: "mvp"`,`due` 落在迭代结束日附近,`stories` 列出决定该节点是否达成的那几个故事
27
-
28
- ### 状态流转(严格按状态机,见 planning skill 的 schema.md)
29
-
30
- - story: `draft → ready → in-progress → review → done`
31
- - task: `todo → red → green → refactored → done`
32
- - 每次流转必须同步落库并运行 `node tools/validate.mjs`
33
- - story 到 `review` 的条件:所有 task 为 `done`、验收标准逐条核对过,且**每条验收至少被一条用例覆盖**(`agile/tests.json`;缺口在 `/tests` 页「缺口与风险」里,没用的补用例,手工验的登记成 `automated: false`)
34
- - story 到 `done` 由用户确认,AI 不许自行关闭
35
-
36
- ### 收尾 / 回顾
37
-
38
- 1. sprint 到期:未完成 story 回 backlog(`sprintId` 置 null,状态回 `ready`),完成项保持 `done`
39
- 2. 生成回顾小结写入对话(做了什么/没做什么/为什么),不落文件除非用户要求
40
- 3. 里程碑到期没达成:状态改 `missed` 并写清差在哪几个故事;有风险但未到期改 `at-risk`;达成必须先把挂的故事推到 `done`
41
- - 迭代中途插入的需求,必须给该 story 打 `scopeChange: { kind: "added-mid-sprint", at, reason }`;拆分出来的打 `split`。否则燃尽图上的偏差会被误读成团队拖延
42
- 4. 建议用户运行 `node tools/serve.mjs` 看燃尽图(`/burndown`)与甘特图(`/gantt`)核对进度
43
-
44
- ## 硬约束
45
-
46
- - 一次只能有一个活跃 sprint(`start` 已过且 `end` 未到的最多一个)
47
- - 不许把 `draft` 状态的 story 排进 sprint(校验脚本会报错)
48
- - task 状态只能前进不能回退;发现做错了就新建 chore task 处理
49
- - 每次修改后必须校验,校验失败时先修复数据再继续对话
1
+ ---
2
+ name: scrum-sprint
3
+ description: 管理 Sprint 迭代周期与 Story 状态流转,落库到 agile/sprints/。适用于排期、组建迭代、状态更新、每日进度同步等场景。
4
+ ---
5
+
6
+ # scrum-sprint:迭代排期与状态流转
7
+
8
+ ## 何时使用
9
+
10
+ 用户要求排期、组建/启动/收尾一个迭代、更新任务进度、回顾时使用本 skill。
11
+
12
+ ## 前置
13
+
14
+ 先读 `agile/backlog.json`(epics + stories)与 `agile/sprints.json`(sprints + milestones),掌握真实状态。**状态以文件为准,对话记忆一律作废。**
15
+
16
+ ## 工作流
17
+
18
+ ### 组建 Sprint
19
+
20
+ 1. 从 backlog 中挑 `ready` 状态的 story(不满足 ready 的先回 scrum-planning 补验收标准)
21
+ - 排序依据:`priority` 优先,同优先级比 WSJF(`value / points`)
22
+ - **依赖检查**:`dependsOn` 里的故事必须已完成,否则别排进本迭代;**阻塞检查**:带 `blocked` 的先解决阻塞再排
23
+ 2. 总点数不超过 `capacity`(默认 20,可和用户商量)
24
+ 3. 往 `agile/sprints.json` 的 `sprints` 数组里追加一条,story 的 `sprintId` 同步更新;**id 按 planning skill `references/schema.md` 的「迭代编号规则」生成**(`R<发布周期>-S<期内冲刺号>`,如 `R1-S1`),不许另发明格式
25
+ 4. 被选中的 story 状态改为 `in-progress`(或 sprint 启动时改)
26
+ 5. 与迭代绑定的里程碑写进同文件 `milestones`:MVP 节点用 `kind: "mvp"`,`due` 落在迭代结束日附近,`stories` 列出决定该节点是否达成的那几个故事
27
+
28
+ ### 状态流转(严格按状态机,见 planning skill 的 schema.md)
29
+
30
+ - story: `draft → ready → in-progress → review → done`
31
+ - task: `todo → red → green → refactored → done`
32
+ - 每次流转必须同步落库并运行 `node tools/validate.mjs`
33
+ - story 到 `review` 的条件:所有 task 为 `done`、验收标准逐条核对过,且**每条验收至少被一条用例覆盖**(`agile/tests.json`;缺口在 `/tests` 页「缺口与风险」里,没用的补用例,手工验的登记成 `automated: false`)
34
+ - story 到 `done` 由用户确认,AI 不许自行关闭
35
+
36
+ ### 收尾 / 回顾
37
+
38
+ 1. sprint 到期:未完成 story 回 backlog(`sprintId` 置 null,状态回 `ready`),完成项保持 `done`
39
+ 2. 生成回顾小结写入对话(做了什么/没做什么/为什么),不落文件除非用户要求
40
+ 3. 里程碑到期没达成:状态改 `missed` 并写清差在哪几个故事;有风险但未到期改 `at-risk`;达成必须先把挂的故事推到 `done`
41
+ - 迭代中途插入的需求,必须给该 story 打 `scopeChange: { kind: "added-mid-sprint", at, reason }`;拆分出来的打 `split`。否则燃尽图上的偏差会被误读成团队拖延
42
+ 4. 建议用户运行 `node tools/serve.mjs` 看燃尽图(`/burndown`)与甘特图(`/gantt`)核对进度
43
+
44
+ ## 硬约束
45
+
46
+ - 一次只能有一个活跃 sprint(`start` 已过且 `end` 未到的最多一个)
47
+ - 不许把 `draft` 状态的 story 排进 sprint(校验脚本会报错)
48
+ - task 状态只能前进不能回退;发现做错了就新建 chore task 处理
49
+ - 每次修改后必须校验,校验失败时先修复数据再继续对话
@@ -1,127 +1,140 @@
1
- ---
2
- name: scrum-tdd
3
- description: 以 red-green-refactor TDD 循环驱动任务实施,并把每一步过程落库到 agile/journal/。适用于领取任务、写代码、跑测试、重构等实施场景。
4
- ---
5
-
6
- # scrum-tdd:TDD 驱动实施 + 过程落库
7
-
8
- ## 何时使用
9
-
10
- 领取 task 开始写代码时使用本 skill。**没有 task id 不开工**——先回 scrum-planning 建故事拆任务。
11
-
12
- ## 前置
13
-
14
- 1. 从 `agile/backlog.json` 读目标 story(验收标准 + task 列表)
15
- 2. 找到第一个非 `done` 的 task,确认其 `type`
16
- 3. 读 `agile/journal.json` 里该 task 的 entries(若有历史条目,从上次断点继续)
17
-
18
- ## Red-Green-Refactor 循环(每轮三阶段,顺序铁律)
19
-
20
- ### 🔴 Red(先写失败测试)
21
-
22
- 1. 按 acceptance 写一条会失败的测试(test 型 task 的本职;impl 型 task 先确认对应 test task 已 red)
23
- 2. 跑测试,**确认它因正确的原因失败**(不是语法错、不是环境错)
24
- 3. journal 追加 entry:`phase:"red"`、note 写测试意图、`result` 记 `fail: <原因>`
25
- 4. task 状态 → `red`
26
-
27
- ### 🟢 Green(最小实现让测试通过)
28
-
29
- 1. 写**刚好**让测试通过的实现,不许顺手加没测试覆盖的功能
30
- 2. 跑测试直到通过
31
- 3. journal 追加 `phase:"green"` entry,`result` 记 `pass: <统计>`
32
- 4. task 状态 → `green`
33
-
34
- ### 🔵 Refactor(在绿灯保护下清理)
35
-
36
- 1. 测试全绿的前提下消除重复、命名、结构问题;每步小改、改完立即跑测试
37
- 2. 有实质重构才写 journal entry(`phase:"refactor"`),零碎小改可并入 green entry
38
- 3. task 状态 → `refactored`(无实质重构可直接 `green → done`)
39
-
40
- ### ✅ Done(交工前真实验证,源自 superpowers 的 verification-before-completion)
41
-
42
- 1. 最后一次全量测试通过,journal 末条 `result` 为 `pass`
43
- 2. **不许凭断言关单**:「测试过了应该没问题」不算验证。有可运行入口的(页面/命令/接口)要真正跑起来按 acceptance 逐条核一遍;跑不了的也要向用户说明「验证到了哪一步、哪一步没法验」
44
- 3. 把本次新增 / 修改的用例与这一次的执行结果写进 `agile/tests.json`(见下节第 1 步),再推状态
45
- 4. task 状态 → `done`,`files` 补齐本次触碰的文件
46
- 5. story 的所有 task 都 done → 提醒用户进入 review(scrum-sprint skill)
47
-
48
- ## 交工汇报(每做完一项功能必做)
49
-
50
- task 推到 `done` 之后、向用户回话之前,三件事缺一不可。
51
-
52
- ### 1. 更新 `agile/tests.json`:本次用例 + 这一次的执行结果
53
-
54
- **什么时候写**:每个 task 到 `done` 都要写(不是攒到迭代末);story 送 `review` 前补齐该 story 的缺口。
55
-
56
- - 用例登记在 `suites[]` 下:suite 定 `layer`(`frontend` / `backend` / `e2e`)与 `level`(`unit` / `integration` / `e2e`),用例写 `title` / `expect`,`covers` 指向验收(`S-001-A1`,序号是 1 基);
57
- - 手工验证也要登记成 `automated: false` 的用例,`steps` 一步一条——QA 交接靠它;
58
- - 每次跑完测试往 `runs[]` 追加一条:`at`(到时分秒)、`command`、`env`、`totals`(total / pass / fail / skipped)、`failedCases`,有覆盖率报告就填 `coverage`(前端 / 后端分开;E2E 一般不报行覆盖);
59
- - 再把对应用例的 `status` 与 `lastRun` 刷成这次的结果(`not-run` 表示还没跑过);
60
- - 写完跑 `node tools/validate.mjs`:枚举、`covers` 引用、执行记录与用例状态一致性都会被查,报错口径见 schema 第 5 节;
61
- - **没真跑过不许写 `pass`**;失败了就写 `fail`,原因写进用例的 `note`。
62
-
63
- ### 2. 写 `agile/last-change.json`:先看 git,再决定覆盖还是合并
64
-
65
- **写之前必须先判断这个文件提交了没有**——上一次交付很可能还没 commit,直接覆盖就把它冲掉了:
66
-
67
- ```bash
68
- node tools/last-change.mjs check # 退出码 0 = 可整份覆盖,2 = 必须合并
69
- ```
70
-
71
- 用工具写最省事(它自己判状态、合并、写后校验、失败回滚):
72
-
73
- ```bash
74
- node tools/last-change.mjs write <本次记录.json> # 已提交 → 覆盖;未提交 → 并入旧记录
75
- ```
76
-
77
- - **已提交**(工作区干净)→ 上一次交付已在版本库里,整份覆盖,文件里只有本次交付;
78
- - **未提交 / 未跟踪 / 不是 git 仓库** → 把本次结果并进旧记录:`changes`·`extras`·`verification`·`preparation`·`scenarios` 按 key 去重(新的覆盖旧的、旧的顺序保留),`notes`·`open` 去重合并,`access` 按 url / 账号合并,并自动打上 `merged` + `mergedFrom` 说明并了哪几次;
79
- - 千万**不要**为了省事手动 `writeFileSync` 覆盖:那一步绕过 git 判断,丢的是别人还没提交的记录;
80
- - `at` 要**写到时分秒**(`YYYY-MM-DD HH:mm:ss`,本机时间)——「最近一次交付」在页面顶部标的就是它。`write` 发现缺 `at` 会自动补当前时间,但手写记录时得自己填;只写日期会吃一条 WARN,页面上也只显示到天。
81
-
82
- 不用工具时也得照这个顺序:`check` → 需要合并就先读旧文件再合并 → 写完跑 `node tools/validate.mjs`。
83
-
84
- 七个分区按需写(结构见 planning skill 的 `references/schema.md` 第 4 节),当前项目没有的那项直接省略,不许编:
85
-
86
- | 分区 | 写什么 |
87
- |---|---|
88
- | `changes` | 本次涉及的故事与任务:新增还是状态变更(`action` + `from`/`to`)、变更内容、涉及文件 |
89
- | `extras` | 计划外顺手做的事(修掉的小 bug、补的文档、重构) |
90
- | `verification` | 验证了哪些项、结果(`pass`/`fail`/`partial`/`skipped`)、依据 |
91
- | `access` | 调试访问地址(`urls`)与账号密码(`accounts`);没有账号体系就不写 accounts |
92
- | `preparation` | 用户自己跑起来之前要做的准备(装依赖、起服务、灌数据),带命令 |
93
- | `scenarios` | 一条测试场景一段:`steps` 是测试步骤,`expect` 是验收标准 |
94
- | `notes` / `open` | 使用说明与遗留问题 |
95
-
96
- 写完整份跑 `node tools/validate.mjs`:校验器会查 id 是否真实存在、枚举是否合法、场景有没有验收标准、调试地址是不是完整 http(s) 地址。
97
-
98
- ### 3. 按同一顺序回话给用户
99
-
100
- 变更表(故事/任务 · 新增还是状态变更 · 改了什么 · 涉及文件)→ 额外做的事 → 验证结果 → 账号密码与访问地址 → 测试前准备 → 逐条测试场景(步骤 + 验收标准)→ 说明。**缺哪项就不提那节,但不许只说「做完了」**,也不许用「应该没问题」代替验证记录。最后告诉用户:起 `node tools/serve.mjs` 后到 `/last-change` 页能看到同一份内容。
101
-
102
- ## 排障纪律(源自 superpowers 的 systematic-debugging)
103
-
104
- 测试意外失败、行为不符预期、bug 排查时:
105
-
106
- 1. **先读代码找根因,禁止试错式盲改**——不许靠猜着改再跑一遍碰运气
107
- 2. 四步走:读相关代码形成假设 → 加观测(日志/断点/最小复现)验证假设 → 确认根因 → 做最小修复
108
- 3. 修 bug 也走 TDD:先写一个复现该 bug 的失败测试(red),修复让它转绿(green)
109
- 4. 根因和假设写进 journal 的 `note`(为什么改这里),修复过程照常落 entry
110
-
111
- ## Journal 纪律
112
-
113
- - 每个 task 一条记录,放在 `agile/journal.json` 的 `journals` 数组里(按 `taskId` 找),**每次状态推进必须当场追加 entry**,不许攒到最后补
114
- - note 写「为什么」不写「什么」(文件名 git log 里都有)
115
- - 中断(用户喊停/上下文不够):journal 追加一条 note 说明断点在哪,task 状态留在当前阶段
116
-
117
- ## 硬约束
118
-
119
- - **没 red 过不许写实现**——task 直接从 todo 跳 green 属违规(校验脚本会查 journal 必须先有 red 后有 green)
120
- - 测试骗不过状态机:`done` 的 task journal 末条必须 pass
121
- - 不许为让测试通过而删除/跳过/弱化测试;确需改测试时在 journal 的 note 里说明理由
122
- - 一次只做一个 task 的一个阶段,禁止批量推进多个 task 状态
123
- - 交工前没做真实验证不许把 task 置 `done`(跑不起入口的须在 journal 里写明验证边界)
124
- - 没更新 `agile/tests.json` 不算交付完成:用例与执行结果和代码一样是交付物,`/tests` 页读的就是它
125
- - 用例状态不许编:`pass` 必须是真跑出来的,跟 `runs` 里的失败清单对不上会被校验器打回
126
- - 没写 `agile/last-change.json` 不算交付完成:交付说明和代码一样是交付物
127
- - 写它之前没查 git 状态(该合并却整份覆盖)同样算违规:会把上一次还没提交的记录冲掉
1
+ ---
2
+ name: scrum-tdd
3
+ description: 以 red-green-refactor TDD 循环驱动任务实施,并把每一步过程落库到 agile/journal/。适用于领取任务、写代码、跑测试、重构等实施场景。
4
+ ---
5
+
6
+ # scrum-tdd:TDD 驱动实施 + 过程落库
7
+
8
+ ## 何时使用
9
+
10
+ 领取 task 开始写代码时使用本 skill。**没有 task id 不开工**——先回 scrum-planning 建故事拆任务。
11
+
12
+ ## 前置
13
+
14
+ 1. 从 `agile/backlog.json` 读目标 story(验收标准 + task 列表)
15
+ 2. 找到第一个非 `done` 的 task,确认其 `type`
16
+ 3. 读 `agile/journal.json` 里该 task 的 entries(若有历史条目,从上次断点继续)
17
+
18
+ ## Red-Green-Refactor 循环(每轮三阶段,顺序铁律)
19
+
20
+ ### 🔴 Red(先写失败测试)
21
+
22
+ 1. 按 acceptance 写一条会失败的测试(test 型 task 的本职;impl 型 task 先确认对应 test task 已 red)
23
+ 2. 跑测试,**确认它因正确的原因失败**(不是语法错、不是环境错)
24
+ 3. journal 追加 entry:`phase:"red"`、note 写测试意图、`result` 记 `fail: <原因>`
25
+ 4. task 状态 → `red`
26
+
27
+ ### 🟢 Green(最小实现让测试通过)
28
+
29
+ 1. 写**刚好**让测试通过的实现,不许顺手加没测试覆盖的功能
30
+ 2. 跑测试直到通过
31
+ 3. journal 追加 `phase:"green"` entry,`result` 记 `pass: <统计>`
32
+ 4. task 状态 → `green`
33
+
34
+ ### 🔵 Refactor(在绿灯保护下清理)
35
+
36
+ 1. 测试全绿的前提下消除重复、命名、结构问题;每步小改、改完立即跑测试
37
+ 2. 有实质重构才写 journal entry(`phase:"refactor"`),零碎小改可并入 green entry
38
+ 3. task 状态 → `refactored`(无实质重构可直接 `green → done`)
39
+
40
+ ### ✅ Done(交工前真实验证,源自 superpowers 的 verification-before-completion)
41
+
42
+ 1. 最后一次全量测试通过,journal 末条 `result` 为 `pass`
43
+ 2. **不许凭断言关单**:「测试过了应该没问题」不算验证。有可运行入口的(页面/命令/接口)要真正跑起来按 acceptance 逐条核一遍;跑不了的也要向用户说明「验证到了哪一步、哪一步没法验」
44
+ 3. 把本次新增 / 修改的用例与这一次的执行结果写进 `agile/tests.json`(见下节第 1 步),再推状态
45
+ 4. task 状态 → `done`,`files` 补齐本次触碰的文件
46
+ 5. story 的所有 task 都 done → 提醒用户进入 review(scrum-sprint skill)
47
+
48
+ ## 架构图例(按需,但别偷懒)
49
+
50
+ 改动涉及**模块边界 / 鉴权 / 支付 / 数据模型 / 外部集成**时,交工前把图补齐:
51
+
52
+ 1. 读 `.agents/skills/diagram-design/SKILL.md`(已内置,**不要让用户去装**,也不要调 Python);
53
+ 2. 按它的 §3 选型表定类型,然后**必须先加载对应的 `references/type-<type>.md` 再画**(上游硬规则,跳过就会画成「圆角方块」);
54
+ 3. 产物落到 `agile/diagrams/`,用 `node tools/diagram.mjs add <file> --title "..." --kind sequence --story S-001` 登记;
55
+ 它会先跑 `node tools/diagram-lint.mjs` 质检(viewBox 越界 / 无障碍契约 / 动画契约),不过不许入库;
56
+ 4. **不要手改 `agile/diagrams.json`**:id、路径、时间戳都由工具写,手写必错;
57
+ 5. 老图要重画(`.mmd` / `.drawio` / `.excalidraw`)先 `node tools/diagram-import.mjs <file>` 压成节点与连线摘要,别把原始文件整个读进上下文。
58
+
59
+ 纯样式、文案、测试改动不画。图比故事旧(`updatedAt` 早于最后一次通过)时,校验器会给 WARN,记得重画。
60
+
61
+ ## 交工汇报(每做完一项功能必做)
62
+
63
+ task 推到 `done` 之后、向用户回话之前,三件事缺一不可。
64
+
65
+ ### 1. 更新 `agile/tests.json`:本次用例 + 这一次的执行结果
66
+
67
+ **什么时候写**:每个 task 到 `done` 都要写(不是攒到迭代末);story 送 `review` 前补齐该 story 的缺口。
68
+
69
+ - 用例登记在 `suites[]` 下:suite 定 `layer`(`frontend` / `backend` / `e2e`)与 `level`(`unit` / `integration` / `e2e`),用例写 `title` / `expect`,`covers` 指向验收(`S-001-A1`,序号是 1 基);
70
+ - 手工验证也要登记成 `automated: false` 的用例,`steps` 一步一条——QA 交接靠它;
71
+ - 每次跑完测试往 `runs[]` 追加一条:`at`(到时分秒)、`command`、`env`、`totals`(total / pass / fail / skipped)、`failedCases`,有覆盖率报告就填 `coverage`(前端 / 后端分开;E2E 一般不报行覆盖);
72
+ - 再把对应用例的 `status` 与 `lastRun` 刷成这次的结果(`not-run` 表示还没跑过);
73
+ - 写完跑 `node tools/validate.mjs`:枚举、`covers` 引用、执行记录与用例状态一致性都会被查,报错口径见 schema 第 5 节;
74
+ - **没真跑过不许写 `pass`**;失败了就写 `fail`,原因写进用例的 `note`。
75
+
76
+ ### 2. 写 `agile/last-change.json`:先看 git,再决定覆盖还是合并
77
+
78
+ **写之前必须先判断这个文件提交了没有**——上一次交付很可能还没 commit,直接覆盖就把它冲掉了:
79
+
80
+ ```bash
81
+ node tools/last-change.mjs check # 退出码 0 = 可整份覆盖,2 = 必须合并
82
+ ```
83
+
84
+ 用工具写最省事(它自己判状态、合并、写后校验、失败回滚):
85
+
86
+ ```bash
87
+ node tools/last-change.mjs write <本次记录.json> # 已提交 → 覆盖;未提交 → 并入旧记录
88
+ ```
89
+
90
+ - **已提交**(工作区干净)→ 上一次交付已在版本库里,整份覆盖,文件里只有本次交付;
91
+ - **未提交 / 未跟踪 / 不是 git 仓库** → 把本次结果并进旧记录:`changes`·`extras`·`verification`·`preparation`·`scenarios` 按 key 去重(新的覆盖旧的、旧的顺序保留),`notes`·`open` 去重合并,`access` 按 url / 账号合并,并自动打上 `merged` + `mergedFrom` 说明并了哪几次;
92
+ - 千万**不要**为了省事手动 `writeFileSync` 覆盖:那一步绕过 git 判断,丢的是别人还没提交的记录;
93
+ - `at` 要**写到时分秒**(`YYYY-MM-DD HH:mm:ss`,本机时间)——「最近一次交付」在页面顶部标的就是它。`write` 发现缺 `at` 会自动补当前时间,但手写记录时得自己填;只写日期会吃一条 WARN,页面上也只显示到天。
94
+
95
+ 不用工具时也得照这个顺序:`check` → 需要合并就先读旧文件再合并 → 写完跑 `node tools/validate.mjs`。
96
+
97
+ 七个分区按需写(结构见 planning skill 的 `references/schema.md` 第 4 节),当前项目没有的那项直接省略,不许编:
98
+
99
+ | 分区 | 写什么 |
100
+ |---|---|
101
+ | `changes` | 本次涉及的故事与任务:新增还是状态变更(`action` + `from`/`to`)、变更内容、涉及文件 |
102
+ | `extras` | 计划外顺手做的事(修掉的小 bug、补的文档、重构) |
103
+ | `verification` | 验证了哪些项、结果(`pass`/`fail`/`partial`/`skipped`)、依据 |
104
+ | `access` | 调试访问地址(`urls`)与账号密码(`accounts`);没有账号体系就不写 accounts |
105
+ | `preparation` | 用户自己跑起来之前要做的准备(装依赖、起服务、灌数据),带命令 |
106
+ | `scenarios` | 一条测试场景一段:`steps` 是测试步骤,`expect` 是验收标准 |
107
+ | `notes` / `open` | 使用说明与遗留问题 |
108
+
109
+ 写完整份跑 `node tools/validate.mjs`:校验器会查 id 是否真实存在、枚举是否合法、场景有没有验收标准、调试地址是不是完整 http(s) 地址。
110
+
111
+ ### 3. 按同一顺序回话给用户
112
+
113
+ 变更表(故事/任务 · 新增还是状态变更 · 改了什么 · 涉及文件)→ 额外做的事 → 验证结果 → 账号密码与访问地址 → 测试前准备 → 逐条测试场景(步骤 + 验收标准)→ 说明。**缺哪项就不提那节,但不许只说「做完了」**,也不许用「应该没问题」代替验证记录。最后告诉用户:起 `node tools/serve.mjs` 后到 `/last-change` 页能看到同一份内容。
114
+
115
+ ## 排障纪律(源自 superpowers 的 systematic-debugging)
116
+
117
+ 测试意外失败、行为不符预期、bug 排查时:
118
+
119
+ 1. **先读代码找根因,禁止试错式盲改**——不许靠猜着改再跑一遍碰运气
120
+ 2. 四步走:读相关代码形成假设 → 加观测(日志/断点/最小复现)验证假设 → 确认根因 → 做最小修复
121
+ 3. 修 bug 也走 TDD:先写一个复现该 bug 的失败测试(red),修复让它转绿(green)
122
+ 4. 根因和假设写进 journal 的 `note`(为什么改这里),修复过程照常落 entry
123
+
124
+ ## Journal 纪律
125
+
126
+ - 每个 task 一条记录,放在 `agile/journal.json` 的 `journals` 数组里(按 `taskId` 找),**每次状态推进必须当场追加 entry**,不许攒到最后补
127
+ - note 写「为什么」不写「什么」(文件名 git log 里都有)
128
+ - 中断(用户喊停/上下文不够):journal 追加一条 note 说明断点在哪,task 状态留在当前阶段
129
+
130
+ ## 硬约束
131
+
132
+ - **没 red 过不许写实现**——task 直接从 todo 跳 green 属违规(校验脚本会查 journal 必须先有 red 后有 green)
133
+ - 测试骗不过状态机:`done` 的 task journal 末条必须 pass
134
+ - 不许为让测试通过而删除/跳过/弱化测试;确需改测试时在 journal 的 note 里说明理由
135
+ - 一次只做一个 task 的一个阶段,禁止批量推进多个 task 状态
136
+ - 交工前没做真实验证不许把 task 置 `done`(跑不起入口的须在 journal 里写明验证边界)
137
+ - 没更新 `agile/tests.json` 不算交付完成:用例与执行结果和代码一样是交付物,`/tests` 页读的就是它
138
+ - 用例状态不许编:`pass` 必须是真跑出来的,跟 `runs` 里的失败清单对不上会被校验器打回
139
+ - 没写 `agile/last-change.json` 不算交付完成:交付说明和代码一样是交付物
140
+ - 写它之前没查 git 状态(该合并却整份覆盖)同样算违规:会把上一次还没提交的记录冲掉
package/README.md CHANGED
@@ -108,7 +108,8 @@ npx scrum-skills serve # → http://localhost:4173
108
108
  | `/milestones` 里程碑 / MVP | 按 kind 分组,显示达成口径、挂的故事、剩余天数 |
109
109
  | `/burndown` 燃尽图 | 实线=真实剩余,虚线=理想线,竖线标出**哪一天插了需求**(范围变更) |
110
110
  | `/tests` 测试用例 | QA 交付视图:需求覆盖(按验收条的分子/分母)、前端/后端/E2E 分层概览与**故事 × 层覆盖矩阵**、用例清单(可展开步骤与预期)、执行记录、缺口与风险(未覆盖验收 + 最近失败用例);没有 `agile/tests.json` 时给空状态并说明谁来写 |
111
- | `/story/:id` 追溯链 | 验收标准 → 任务 → 每条 red/green/refactor 记录,含测试命令与产出文件 |
111
+ | `/diagrams` 架构图例 | 「实现过程中顺手画的图」:左边按类型 / 关键词 / 是否过期筛,右边 sandbox iframe 预览;图挂在故事上,故事详情页有反向入口;没有 `agile/diagrams.json` 时给空状态并说明怎么登记 |
112
+ | `/story/:id` 追溯链 | 验收标准 → 任务 → 每条 red/green/refactor 记录,含测试命令与产出文件;底部有该故事的架构图例入口 |
112
113
 
113
114
  > **并排指标卡的配色顺序固定为 绿 → 蓝 → 紫 → 黑,卡片更多才往后用黄、红**。顺序只在 `apps/board/app/composables/model.ts` 的 `CARD_TONES` 里定义一次,页面写 `:class="cardToneClass(i)"`、光斑写 `:tone="cardTone(i)"`;黑卡是深底,文字要翻白。新增页面照着取色,别另起一套。
114
115
 
@@ -185,6 +186,7 @@ node tools/last-change.mjs write 记录.json --replace # 确认旧记录不要
185
186
  ## 本地开发
186
187
 
187
188
  ```bash
189
+ pnpm install # 一次装齐根包与 apps/board(pnpm workspace,见 pnpm-workspace.yaml)
188
190
  pnpm dev # Nuxt dev(HMR),读仓库根的 agile/(/api/ai 走 server/middleware)
189
191
  AGILE_DIR=/别的项目 pnpm dev # 看别的项目的数据
190
192
 
@@ -196,6 +198,27 @@ pnpm serve # 起看板(读目标目录的 agile/,同时
196
198
 
197
199
  看板源码在 `apps/board/`(Nuxt 4 + Nuxt UI,纯静态产物,无服务端、无外部字体/图标请求)。`assets/board/` 是构建产物,**不进 git**,发布前由 `prepublishOnly` 自动重建。
198
200
 
201
+ ## 架构图例(内置 diagram-design)
202
+
203
+ `.agents/skills/diagram-design/` 是内置的 [diagram-design](https://github.com/cathrynlavery/diagram-design)(MIT),
204
+ 用 `scrum-skills init` / `update` 自动带上,**不需要另外安装,也不依赖 Python**:
205
+
206
+ - 出图走 skill 的规范(45 类图型 + 设计铁律),产物是单文件自包含 HTML(内联 SVG);
207
+ - 入门前先过质检:`node tools/diagram-lint.mjs <file>`(上游 `self_check.py` 的 Node 移植,
208
+ 覆盖安全边界 / 文档完整性 / 无障碍契约 / viewBox 越界 / 动画契约);
209
+ - 入库:`node tools/diagram.mjs add <file> --title "登录时序" --kind sequence --story S-001`,
210
+ 它负责分配 id、拷进 `agile/diagrams/`、写索引、跑数据校验,失败整体回滚;
211
+ - 索引是 `agile/diagrams.json`,产物在 `agile/diagrams/`,看板 `/diagrams` 页按故事与图型浏览,
212
+ 列表悬停可放大预览,支持下载 SVG / PNG(PNG 由浏览器 canvas 现场栅格化,不引渲染依赖);
213
+ - 老图要重画时,`node tools/diagram-import.mjs <file>` 把 `.mmd` / `.drawio` / `.excalidraw`
214
+ 压成节点与连线摘要再交给规范重画。
215
+
216
+ 内置副本由 `node scripts/sync-diagram-skill.mjs` 从上游同步(裁剪示例变体、剔除 `scripts/` 的 Python 实现、
217
+ 把文档里的 Python 调用改写成上面的 Node 命令),来源与版本记在 `.agents/skills/diagram-design/UPSTREAM.json`。
218
+
199
219
  ## License
200
220
 
201
221
  MIT
222
+
223
+ 内置的 `diagram-design` skill 同样是 MIT,版权归其作者(cathrynlavery),原文见
224
+ `.agents/skills/diagram-design/LICENSE`。
@@ -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/DkI1Qxpp.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.CKHePurH.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DkI1Qxpp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D2O8Q8x9.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B3jkABw9.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/6gFtTBwm.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Csqgy925.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C7K0R7F-.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChG76uh9.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CJ2mz0WY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DEfLc7p3.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Dtsa-1NS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Ci0qbkgh.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bi9Axj3V.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/rlePnzpc.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DfR3IZN_.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/EYTShbt4.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BgLeKwx0.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><script type="module" src="/_nuxt/DkI1Qxpp.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/CSSb154I.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/B5n2_jZN.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/ZVTqot-_.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:"8e23aec9-5b67-4569-b8bf-d4f07e50ffdf",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793377640997,false]</script></body></html>
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/BU8vdZUs.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.BBv-sBnP.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BU8vdZUs.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/BU8vdZUs.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.CgJNdpB5.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/D1V1gysQ.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.WYSoH44y.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BGwhkDRl.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:"08bebe14-0f1b-4d2a-8de4-e84e122d10e9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793514377276,false]</script></body></html>
@@ -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/DkI1Qxpp.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.CKHePurH.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DkI1Qxpp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DK3Fl9T5.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D2O8Q8x9.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DZo3dYLJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/51OWHj8c.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B3jkABw9.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/6gFtTBwm.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DSaWoFHS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Csqgy925.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C7K0R7F-.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/ChG76uh9.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CJ2mz0WY.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DEfLc7p3.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DLkAKotw.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Vo4wMbnS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuJUHLl8.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CK9_veoz.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bb3Limos.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Dtsa-1NS.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Ci0qbkgh.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BuOKDFiJ.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D3YCAmfu.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/B_SlFcWp.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Bi9Axj3V.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/rlePnzpc.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DfR3IZN_.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/EYTShbt4.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BgLeKwx0.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C9StZL3D.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BPTrRhcw.js"><script type="module" src="/_nuxt/DkI1Qxpp.js" crossorigin></script><link rel="prefetch" as="script" crossorigin href="/_nuxt/CSSb154I.js"><link rel="prefetch" as="script" crossorigin href="/_nuxt/DHihWhf5.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-404.BFmXOnCT.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/B5n2_jZN.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.BZ-DdjQ6.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/ZVTqot-_.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:"8e23aec9-5b67-4569-b8bf-d4f07e50ffdf",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793377640997,false]</script></body></html>
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/BU8vdZUs.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.BBv-sBnP.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BU8vdZUs.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/BU8vdZUs.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.CgJNdpB5.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/D1V1gysQ.js"><link rel="prefetch" as="style" crossorigin href="/_nuxt/error-500.WYSoH44y.css"><link rel="prefetch" as="script" crossorigin href="/_nuxt/BGwhkDRl.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:"08bebe14-0f1b-4d2a-8de4-e84e122d10e9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1793514377276,false]</script></body></html>
@@ -0,0 +1 @@
1
+ import{t as e}from"./P6qlvBHA.js";import{At as t,U as n,d as r,m as i,nt as a,p as o,q as s,qt as c,u as l}from"./BxuBMtk_.js";import{n as u,t as d}from"./BE6t7Q2m.js";var f={slots:{root:`my-5`,preview:`flex justify-center border border-muted relative p-4 rounded-md`,code:`[&>div>pre]:rounded-t-none [&>div]:my-0`},variants:{code:{true:{preview:`border-b-0 rounded-b-none`}}}},p={__name:`ProseCodePreview`,props:{class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(p){let m=p,h=a(),g=u(`prose.codePreview`,m),_=e(),v=l(()=>d({extend:f,..._.ui?.prose?.codePreview||{}})({code:!!h.code}));return(e,a)=>(n(),i(`div`,{class:c(v.value.root({class:[t(g).ui?.root,t(g).class]}))},[r(`div`,{class:c(v.value.preview({class:[t(g).ui?.preview]}))},[s(e.$slots,`default`)],2),h.code?(n(),i(`div`,{key:0,class:c(v.value.code({class:[t(g).ui?.code]}))},[s(e.$slots,`code`)],2)):o(``,!0)],2))}};export{p as default};
@@ -0,0 +1 @@
1
+ import{t as e}from"./P6qlvBHA.js";import{U as t,f as n,p as r,u as i}from"./BxuBMtk_.js";import{t as a}from"./BW3xJdEx.js";import{t as o}from"./DJM7u8P3.js";var s={".editorconfig":`i-vscode-icons-file-type-editorconfig`,".env":`i-vscode-icons-file-type-dotenv`,".env.example":`i-vscode-icons-file-type-dotenv`,".eslintignore":`i-vscode-icons-file-type-eslint`,".eslintrc":`i-vscode-icons-file-type-eslint`,".eslintrc.cjs":`i-vscode-icons-file-type-eslint`,".gitignore":`i-vscode-icons-file-type-git`,".npmrc":`i-vscode-icons-file-type-npm`,".nuxtignore":`i-vscode-icons-file-type-nuxt`,".nuxtrc":`i-vscode-icons-file-type-nuxt`,".vscode/settings.json":`i-vscode-icons-file-type-vscode`,asm:`i-vscode-icons-file-type-assembly`,bicep:`i-vscode-icons-file-type-bicep`,bicepparam:`i-vscode-icons-file-type-bicep`,bun:`i-vscode-icons-file-type-bun`,cjs:`i-vscode-icons-file-type-js`,cs:`i-vscode-icons-file-type-csharp`,dart:`i-vscode-icons-file-type-dartlang`,deno:`i-vscode-icons-file-type-deno`,erl:`i-vscode-icons-file-type-erlang`,"eslint.config.cjs":`i-vscode-icons-file-type-eslint`,"eslint.config.js":`i-vscode-icons-file-type-eslint`,"eslint.config.mjs":`i-vscode-icons-file-type-eslint`,exs:`i-vscode-icons-file-type-elixir`,f:`i-vscode-icons-file-type-fortran`,fs:`i-vscode-icons-file-type-fsharp`,gleam:`i-vscode-icons-file-type-gleam`,go:`i-vscode-icons-file-type-go`,h:`i-vscode-icons-file-type-cppheader`,hs:`i-vscode-icons-file-type-haskell`,ico:`i-vscode-icons-file-type-favicon`,ino:`i-vscode-icons-file-type-arduino`,jl:`i-vscode-icons-file-type-julia`,js:`i-vscode-icons-file-type-js`,jsx:`i-vscode-icons-file-type-js`,kt:`i-vscode-icons-file-type-kotlin`,lsp:`i-vscode-icons-file-type-lisp`,md:`i-vscode-icons-file-type-markdown`,mjs:`i-vscode-icons-file-type-js`,npm:`i-vscode-icons-file-type-npm`,npx:`i-vscode-icons-file-type-npm`,nuxt:`i-vscode-icons-file-type-nuxt`,"nuxt.config.js":`i-vscode-icons-file-type-nuxt`,"nuxt.config.ts":`i-vscode-icons-file-type-nuxt`,"nuxt.schema.ts":`i-vscode-icons-file-type-nuxt`,"package.json":`i-vscode-icons-file-type-node`,pl:`i-vscode-icons-file-type-perl`,pnpm:`i-vscode-icons-file-type-pnpm`,ps1:`i-vscode-icons-file-type-powershell`,psd1:`i-vscode-icons-file-type-powershell`,psm1:`i-vscode-icons-file-type-powershell`,py:`i-vscode-icons-file-type-python`,rb:`i-vscode-icons-file-type-ruby`,rs:`i-vscode-icons-file-type-rust`,sbt:`i-vscode-icons-file-type-scala`,"tailwind.config.js":`i-vscode-icons-file-type-tailwind`,"tailwind.config.ts":`i-vscode-icons-file-type-tailwind`,terminal:`i-lucide-terminal`,ts:`i-vscode-icons-file-type-typescript`,"tsconfig.json":`i-vscode-icons-file-type-tsconfig`,tsx:`i-vscode-icons-file-type-typescript`,vue:`i-vscode-icons-file-type-vue`,yarn:`i-vscode-icons-file-type-yarn`,"yarn.lock":`i-vscode-icons-file-type-yarn`,yml:`i-vscode-icons-file-type-yaml`},c={__name:`ProseCodeIcon`,props:{icon:{type:null,required:!1},filename:{type:String,required:!1}},setup(c){let l=c,u=e(),d=i(()=>a(u.ui?.prose?.codeIcon||{},s)),f=i(()=>{if(l.icon)return l.icon;if(!l.filename)return;let e=l.filename.replace(/\s*\(.*\)\s*$/,``),t=e.includes(`.`)&&e.split(`.`).pop(),n=e.split(`/`).pop();return(n&&d.value[n.toLowerCase()])??(t&&(d.value[t]??`i-vscode-icons-file-type-${t}`))});return(e,i)=>f.value?(t(),n(o,{key:0,name:f.value},null,8,[`name`])):r(``,!0)}};export{c as default};
@@ -1 +1 @@
1
- import{r as e}from"./DLkAKotw.js";import{h as t}from"./CuJUHLl8.js";function n(e,t,n){let r=n.originalEvent.target,i=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&r.addEventListener(e,t,{once:!0}),r.dispatchEvent(i)}function r(n){let r=t(``,1e3);return{search:r,handleTypeaheadSearch:(t,i)=>{if(r.value+=t,n)n(t);else{let t=e(),n=i.map(e=>({...e,textValue:e.value?.textValue??e.ref.textContent?.trim()??``})),o=n.find(e=>e.ref===t),s=a(n.map(e=>e.textValue),r.value,o?.textValue),c=n.find(e=>e.textValue===s);return c&&c.ref.focus(),c?.ref}},resetTypeahead:()=>{r.value=``}}}function i(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function a(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,a=n?e.indexOf(n):-1,o=i(e,Math.max(a,0));r.length===1&&(o=o.filter(e=>e!==n));let s=o.find(e=>e.toLowerCase().startsWith(r.toLowerCase()));return s===n?void 0:s}export{r as n,n as r,a as t};
1
+ import{r as e}from"./CgQ30j_6.js";import{h as t}from"./BrWE0up6.js";function n(e,t,n){let r=n.originalEvent.target,i=new CustomEvent(e,{bubbles:!1,cancelable:!0,detail:n});t&&r.addEventListener(e,t,{once:!0}),r.dispatchEvent(i)}function r(n){let r=t(``,1e3);return{search:r,handleTypeaheadSearch:(t,i)=>{if(r.value+=t,n)n(t);else{let t=e(),n=i.map(e=>({...e,textValue:e.value?.textValue??e.ref.textContent?.trim()??``})),o=n.find(e=>e.ref===t),s=a(n.map(e=>e.textValue),r.value,o?.textValue),c=n.find(e=>e.textValue===s);return c&&c.ref.focus(),c?.ref}},resetTypeahead:()=>{r.value=``}}}function i(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function a(e,t,n){let r=t.length>1&&Array.from(t).every(e=>e===t[0])?t[0]:t,a=n?e.indexOf(n):-1,o=i(e,Math.max(a,0));r.length===1&&(o=o.filter(e=>e!==n));let s=o.find(e=>e.toLowerCase().startsWith(r.toLowerCase()));return s===n?void 0:s}export{r as n,n as r,a as t};