scrum-skills 0.3.2 → 0.3.3

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 (384) hide show
  1. package/.agents/skills/diagram-design/LICENSE +4 -0
  2. package/.agents/skills/diagram-design/SKILL.md +413 -0
  3. package/.agents/skills/diagram-design/UPSTREAM.json +76 -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 +146 -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 +224 -201
  150. package/assets/board/200.html +1 -1
  151. package/assets/board/404.html +1 -1
  152. package/assets/board/_nuxt/1XlYaCp9.js +1 -0
  153. package/assets/board/_nuxt/4gQF_HS3.js +1 -0
  154. package/assets/board/_nuxt/5okfNy5D.js +1 -0
  155. package/assets/board/_nuxt/{Bb3Limos.js → B0C2jsdk.js} +1 -1
  156. package/assets/board/_nuxt/B1j6UC4U.js +1 -0
  157. package/assets/board/_nuxt/B3LKy6o2.js +1 -0
  158. package/assets/board/_nuxt/BAQQngAq.js +13 -0
  159. package/assets/board/_nuxt/BE6t7Q2m.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/BW3xJdEx.js +1 -0
  164. package/assets/board/_nuxt/{Cm9lkUvP.js → BY36DFyj.js} +1 -1
  165. package/assets/board/_nuxt/BZlZD94i.js +1 -0
  166. package/assets/board/_nuxt/BZvXNwev.js +3 -0
  167. package/assets/board/_nuxt/BbxmvdIF.js +1 -0
  168. package/assets/board/_nuxt/BiWrMOsL.js +1 -0
  169. package/assets/board/_nuxt/BizDeOK5.js +1 -0
  170. package/assets/board/_nuxt/BkcaOYQ_.js +95 -0
  171. package/assets/board/_nuxt/BkoKCNUY.js +1 -0
  172. package/assets/board/_nuxt/BlKmZhhF.js +1 -0
  173. package/assets/board/_nuxt/BmBpmU73.js +1 -0
  174. package/assets/board/_nuxt/BrWE0up6.js +1 -0
  175. package/assets/board/_nuxt/Bs52qkgk.js +1 -0
  176. package/assets/board/_nuxt/BtzUbHO_.js +1 -0
  177. package/assets/board/_nuxt/BuBzMkFZ.js +1 -0
  178. package/assets/board/_nuxt/Bubk0xn-.js +1 -0
  179. package/assets/board/_nuxt/BxuBMtk_.js +3 -0
  180. package/assets/board/_nuxt/By1KXXLR.js +1 -0
  181. package/assets/board/_nuxt/BygIGL69.js +2 -0
  182. package/assets/board/_nuxt/C1iO5KH3.js +1 -0
  183. package/assets/board/_nuxt/C2YPmTzt.js +1 -0
  184. package/assets/board/_nuxt/C3SpAhCW.js +1 -0
  185. package/assets/board/_nuxt/C3ZRWz5L.js +1 -0
  186. package/assets/board/_nuxt/C4WdPP6K.js +1 -0
  187. package/assets/board/_nuxt/C6o03JHe.js +1 -0
  188. package/assets/board/_nuxt/C8qB5llI.js +1 -0
  189. package/assets/board/_nuxt/C9MgRdhu.js +1 -0
  190. package/assets/board/_nuxt/CCA81-4P.js +1 -0
  191. package/assets/board/_nuxt/{D2O8Q8x9.js → CFCM18fF.js} +1 -1
  192. package/assets/board/_nuxt/CGXljzd_.js +1 -0
  193. package/assets/board/_nuxt/CI0scS-N.js +1 -0
  194. package/assets/board/_nuxt/CJs9B42o.js +1 -0
  195. package/assets/board/_nuxt/COecDWbb.js +1 -0
  196. package/assets/board/_nuxt/COmtTtfB.js +1 -0
  197. package/assets/board/_nuxt/CPYm4J_K.js +1 -0
  198. package/assets/board/_nuxt/CReA4TEB.js +3 -0
  199. package/assets/board/_nuxt/CXG7GZes.js +1 -0
  200. package/assets/board/_nuxt/CYGiZn-X.js +1 -0
  201. package/assets/board/_nuxt/CaE8VlUp.js +1 -0
  202. package/assets/board/_nuxt/CcGiNUgA.js +1 -0
  203. package/assets/board/_nuxt/Ccgv3lDj.js +1 -0
  204. package/assets/board/_nuxt/CdPGFZyy.js +1 -0
  205. package/assets/board/_nuxt/{DfR3IZN_.js → Cdf_T8Xa.js} +1 -1
  206. package/assets/board/_nuxt/CgQ30j_6.js +1 -0
  207. package/assets/board/_nuxt/ChUHb39z.js +1 -0
  208. package/assets/board/_nuxt/Ck0-FqVI.js +1 -0
  209. package/assets/board/_nuxt/CkWKLtjO.js +1 -0
  210. package/assets/board/_nuxt/Cq7hsCKB.js +1 -0
  211. package/assets/board/_nuxt/CtFknnHZ.js +1 -0
  212. package/assets/board/_nuxt/D166WVUG.js +1 -0
  213. package/assets/board/_nuxt/D4Dpzo9e.js +1 -0
  214. package/assets/board/_nuxt/D5i92OZO.js +1 -0
  215. package/assets/board/_nuxt/D6dUp4Nm.js +9 -0
  216. package/assets/board/_nuxt/DFQDFspC.js +1 -0
  217. package/assets/board/_nuxt/DHX2tw9J.js +1 -0
  218. package/assets/board/_nuxt/DJM7u8P3.js +1 -0
  219. package/assets/board/_nuxt/{BPTrRhcw.js → DLr85ebo.js} +1 -1
  220. package/assets/board/_nuxt/DOMM1wfl.js +1 -0
  221. package/assets/board/_nuxt/DU6ArlUN.js +1 -0
  222. package/assets/board/_nuxt/{B_SlFcWp.js → DUgGsde6.js} +1 -1
  223. package/assets/board/_nuxt/DV4ti-Pq.js +1 -0
  224. package/assets/board/_nuxt/DZ--fXuU.js +1 -0
  225. package/assets/board/_nuxt/D_ct-Stz.js +2 -0
  226. package/assets/board/_nuxt/DbWAComO.js +1 -0
  227. package/assets/board/_nuxt/DbwlcHAt.js +1 -0
  228. package/assets/board/_nuxt/DjzLR9Bl.js +1 -0
  229. package/assets/board/_nuxt/Dki9VkAL.js +3 -0
  230. package/assets/board/_nuxt/DlNJhOoc.js +1 -0
  231. package/assets/board/_nuxt/DqG7CtD4.js +1 -0
  232. package/assets/board/_nuxt/DqUSsCJ2.js +1 -0
  233. package/assets/board/_nuxt/Du2F4WXh.js +1 -0
  234. package/assets/board/_nuxt/DuRiEXn4.js +1 -0
  235. package/assets/board/_nuxt/DxBwVNyP.js +2 -0
  236. package/assets/board/_nuxt/DzmVW5-D.js +1 -0
  237. package/assets/board/_nuxt/I-sGtDIB.js +6 -0
  238. package/assets/board/_nuxt/JU9-x68N.js +1 -0
  239. package/assets/board/_nuxt/Lozm7hhE.js +1 -0
  240. package/assets/board/_nuxt/MMsTMkcB.js +1 -0
  241. package/assets/board/_nuxt/MS7CGmCB.js +1 -0
  242. package/assets/board/_nuxt/OKKaKILz.js +1 -0
  243. package/assets/board/_nuxt/{Csqgy925.js → P6qlvBHA.js} +1 -1
  244. package/assets/board/_nuxt/SrNUvNwO.js +1 -0
  245. package/assets/board/_nuxt/{DSaWoFHS.js → SywdkA98.js} +1 -1
  246. package/assets/board/_nuxt/TBIRpVLG.js +1 -0
  247. package/assets/board/_nuxt/TlTrMIMm.js +1 -0
  248. package/assets/board/_nuxt/Zv9-SOQF.js +1 -0
  249. package/assets/board/_nuxt/_id_.ItzoSaBL.css +1 -0
  250. package/assets/board/_nuxt/builds/latest.json +1 -1
  251. package/assets/board/_nuxt/builds/meta/2218461a-f45b-41d6-ae44-b0d2332a9511.json +1 -0
  252. package/assets/board/_nuxt/burndown.CT8fx1Ge.css +1 -0
  253. package/assets/board/_nuxt/diagrams.D1ybqBem.css +1 -0
  254. package/assets/board/_nuxt/{entry.CKHePurH.css → entry.BCuHiFgF.css} +1 -1
  255. package/assets/board/_nuxt/epics.CUeDIEa0.css +1 -0
  256. package/assets/board/_nuxt/error-404.Y9imKiDC.css +1 -0
  257. package/assets/board/_nuxt/error-500.DufSBGVC.css +1 -0
  258. package/assets/board/_nuxt/gantt.CiC2Ts1t.css +1 -0
  259. package/assets/board/_nuxt/jbri6q1p.js +1 -0
  260. package/assets/board/_nuxt/last-change.C05Vc3BF.css +1 -0
  261. package/assets/board/_nuxt/milestones.Civ3sMiQ.css +1 -0
  262. package/assets/board/_nuxt/oSJF4yHw.js +1 -0
  263. package/assets/board/_nuxt/pages.BshWbOyo.css +1 -0
  264. package/assets/board/_nuxt/q_8bxRMt.js +1 -0
  265. package/assets/board/_nuxt/tests.Ci9fBCka.css +1 -0
  266. package/assets/board/burndown/index.html +1 -1
  267. package/assets/board/diagrams/index.html +1 -0
  268. package/assets/board/epics/index.html +1 -1
  269. package/assets/board/favicon.svg +16 -16
  270. package/assets/board/gantt/index.html +1 -1
  271. package/assets/board/index.html +1 -1
  272. package/assets/board/last-change/index.html +1 -1
  273. package/assets/board/milestones/index.html +1 -1
  274. package/assets/board/tests/index.html +1 -1
  275. package/bin/scrum-skills.mjs +204 -191
  276. package/docs/ai-assistant-guide.md +1008 -1008
  277. package/package.json +42 -41
  278. package/templates/AGENTS.md +84 -74
  279. package/tools/agile-tools.mjs +510 -510
  280. package/tools/ai.mjs +464 -464
  281. package/tools/diagram-import.mjs +238 -0
  282. package/tools/diagram-lint.mjs +518 -0
  283. package/tools/diagram.mjs +299 -0
  284. package/tools/git-commit.mjs +216 -216
  285. package/tools/last-change.mjs +326 -326
  286. package/tools/projects.mjs +240 -215
  287. package/tools/serve.mjs +180 -154
  288. package/tools/validate.mjs +781 -664
  289. package/assets/board/_nuxt/1eqboJxR.js +0 -1
  290. package/assets/board/_nuxt/2K7ag6ES.js +0 -1
  291. package/assets/board/_nuxt/51OWHj8c.js +0 -2
  292. package/assets/board/_nuxt/6gFtTBwm.js +0 -1
  293. package/assets/board/_nuxt/B3jkABw9.js +0 -1
  294. package/assets/board/_nuxt/B5n2_jZN.js +0 -1
  295. package/assets/board/_nuxt/BDK2Hj7B.js +0 -1
  296. package/assets/board/_nuxt/BDcnzXHq.js +0 -1
  297. package/assets/board/_nuxt/BaG8y0Wt.js +0 -1
  298. package/assets/board/_nuxt/BbwJq5pb.js +0 -1
  299. package/assets/board/_nuxt/BgLeKwx0.js +0 -1
  300. package/assets/board/_nuxt/Bi9Axj3V.js +0 -1
  301. package/assets/board/_nuxt/BmxvtaMq.js +0 -1
  302. package/assets/board/_nuxt/BodFvto3.js +0 -1
  303. package/assets/board/_nuxt/BpWeHLuN.js +0 -1
  304. package/assets/board/_nuxt/BuOKDFiJ.js +0 -1
  305. package/assets/board/_nuxt/C40iTe-x.js +0 -1
  306. package/assets/board/_nuxt/C7K0R7F-.js +0 -2
  307. package/assets/board/_nuxt/C8vL692X.js +0 -1
  308. package/assets/board/_nuxt/C9StZL3D.js +0 -3
  309. package/assets/board/_nuxt/CGI_ZV79.js +0 -1
  310. package/assets/board/_nuxt/CJ2mz0WY.js +0 -1
  311. package/assets/board/_nuxt/CJMBJQuf.js +0 -1
  312. package/assets/board/_nuxt/CK-lOYG9.js +0 -1
  313. package/assets/board/_nuxt/CK9_veoz.js +0 -1
  314. package/assets/board/_nuxt/CLBcBrYf.js +0 -1
  315. package/assets/board/_nuxt/CMUi2-Lj.js +0 -1
  316. package/assets/board/_nuxt/COf6E6h4.js +0 -1
  317. package/assets/board/_nuxt/CPCUMJnF.js +0 -1
  318. package/assets/board/_nuxt/CPcKlmSm.js +0 -1
  319. package/assets/board/_nuxt/CQTvWh4i.js +0 -1
  320. package/assets/board/_nuxt/CSEEUF8S.js +0 -1
  321. package/assets/board/_nuxt/CSSb154I.js +0 -13
  322. package/assets/board/_nuxt/CgDTd7jS.js +0 -1
  323. package/assets/board/_nuxt/ChG76uh9.js +0 -1
  324. package/assets/board/_nuxt/Ci0qbkgh.js +0 -1
  325. package/assets/board/_nuxt/CqoQ__I_.js +0 -1
  326. package/assets/board/_nuxt/CuJUHLl8.js +0 -1
  327. package/assets/board/_nuxt/CvLiA4_O.js +0 -1
  328. package/assets/board/_nuxt/Cvs12oA0.js +0 -3
  329. package/assets/board/_nuxt/CyEXFe3V.js +0 -1
  330. package/assets/board/_nuxt/Cz6rZcLK.js +0 -1
  331. package/assets/board/_nuxt/D2FhHl1o.js +0 -1
  332. package/assets/board/_nuxt/D3YCAmfu.js +0 -1
  333. package/assets/board/_nuxt/D5CE81jK.js +0 -1
  334. package/assets/board/_nuxt/D75vbfSb.js +0 -1
  335. package/assets/board/_nuxt/D99LbGfb.js +0 -9
  336. package/assets/board/_nuxt/DEfLc7p3.js +0 -6
  337. package/assets/board/_nuxt/DF-nsa1Z.js +0 -1
  338. package/assets/board/_nuxt/DIc8yx98.js +0 -1
  339. package/assets/board/_nuxt/DLkAKotw.js +0 -1
  340. package/assets/board/_nuxt/DRPlYvb3.js +0 -1
  341. package/assets/board/_nuxt/DRlQgul3.js +0 -1
  342. package/assets/board/_nuxt/DSLbmoWa.js +0 -1
  343. package/assets/board/_nuxt/DWO9c9yp.js +0 -1
  344. package/assets/board/_nuxt/DZo3dYLJ.js +0 -3
  345. package/assets/board/_nuxt/D_S6N7_b.js +0 -1
  346. package/assets/board/_nuxt/DajA-Tkt.js +0 -1
  347. package/assets/board/_nuxt/DbHiyab-.js +0 -1
  348. package/assets/board/_nuxt/Dc7Ql6eE.js +0 -1
  349. package/assets/board/_nuxt/Dd9ZukPU.js +0 -1
  350. package/assets/board/_nuxt/Dg2LiqmN.js +0 -1
  351. package/assets/board/_nuxt/DhuleNnm.js +0 -1
  352. package/assets/board/_nuxt/DkI1Qxpp.js +0 -95
  353. package/assets/board/_nuxt/DnDHGSYI.js +0 -1
  354. package/assets/board/_nuxt/DpXJ_tCU.js +0 -1
  355. package/assets/board/_nuxt/DqZgF3hU.js +0 -1
  356. package/assets/board/_nuxt/DqcxvfbD.js +0 -1
  357. package/assets/board/_nuxt/DsA2lVci.js +0 -1
  358. package/assets/board/_nuxt/Dtsa-1NS.js +0 -1
  359. package/assets/board/_nuxt/Du91iq0p.js +0 -1
  360. package/assets/board/_nuxt/Dx1wcYFo.js +0 -1
  361. package/assets/board/_nuxt/EYTShbt4.js +0 -1
  362. package/assets/board/_nuxt/MaXJprwN.js +0 -1
  363. package/assets/board/_nuxt/P9x67aq2.js +0 -1
  364. package/assets/board/_nuxt/S08nFESZ.js +0 -3
  365. package/assets/board/_nuxt/V0uynWE2.js +0 -1
  366. package/assets/board/_nuxt/Vo4wMbnS.js +0 -1
  367. package/assets/board/_nuxt/ZVTqot-_.js +0 -1
  368. package/assets/board/_nuxt/ZngEd3HB.js +0 -1
  369. package/assets/board/_nuxt/_id_.B2NDKSlX.css +0 -1
  370. package/assets/board/_nuxt/assMu_Wn.js +0 -1
  371. package/assets/board/_nuxt/builds/meta/8e23aec9-5b67-4569-b8bf-d4f07e50ffdf.json +0 -1
  372. package/assets/board/_nuxt/burndown.Do6IbM6o.css +0 -1
  373. package/assets/board/_nuxt/epics.Dmessplu.css +0 -1
  374. package/assets/board/_nuxt/error-404.BFmXOnCT.css +0 -1
  375. package/assets/board/_nuxt/error-500.BZ-DdjQ6.css +0 -1
  376. package/assets/board/_nuxt/gantt.Dmp00GUo.css +0 -1
  377. package/assets/board/_nuxt/last-change.1Su4GrCN.css +0 -1
  378. package/assets/board/_nuxt/milestones.U0xKCsEo.css +0 -1
  379. package/assets/board/_nuxt/pages.Dbj2IVk8.css +0 -1
  380. package/assets/board/_nuxt/rlePnzpc.js +0 -1
  381. package/assets/board/_nuxt/tests.dXlUX16A.css +0 -1
  382. package/assets/board/_nuxt/uKzCKCTq.js +0 -1
  383. package/assets/board/_nuxt/vwxaNGfc.js +0 -1
  384. package/assets/board/_nuxt/yh6sf_D5.js +0 -1
@@ -1,216 +1,216 @@
1
- #!/usr/bin/env node
2
- /**
3
- * 「自动提交」:把这次交付整份提交进本地仓库(git add -A + git commit)。
4
- *
5
- * 只提交,不 push、不改任何文件内容。所以这里的全部力气都花在「别在错误的时机动手」:
6
- * · 不是 git 仓库 / 分离头指针 / 正在合并、摘取、回滚、变基 / 工作区有冲突 → 拒绝并说清原因;
7
- * · 工作区干净 → 拒绝,不造空提交;
8
- * · 提交信息首行必须是 Conventional Commits(feat: / fix: / chore: …),非法时连 git add 都不做。
9
- *
10
- * 用法(CLI 调试;看板走 /api/agile/git/* 两个接口):
11
- * node tools/git-commit.mjs status [目录]
12
- * node tools/git-commit.mjs commit <信息文件|-> [目录]
13
- */
14
- import { existsSync, readFileSync } from 'node:fs';
15
- import { resolve } from 'node:path';
16
- import { execFileSync } from 'node:child_process';
17
- import { pathToFileURL } from 'node:url';
18
-
19
- const TIMEOUT = 30000;
20
- const MAX_MESSAGE = 8000;
21
-
22
- /** 首行:type(scope)!: 内容。`!` 留给破坏性变更 */
23
- export const CONVENTIONAL_RE =
24
- /^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([^()\n]{1,32}\))?!?: \S/;
25
-
26
- /** 这些文件还在,说明仓库卡在某个多步操作中间,这时候提交会把半截状态钉进历史 */
27
- const IN_PROGRESS = [
28
- ['MERGE_HEAD', '正在合并(MERGE_HEAD 还在),先把冲突处理完再提交'],
29
- ['CHERRY_PICK_HEAD', '正在摘取提交(CHERRY_PICK_HEAD 还在),先处理完再提交'],
30
- ['REVERT_HEAD', '正在回滚提交(REVERT_HEAD 还在),先处理完再提交'],
31
- ['rebase-merge', '正在变基(rebase-merge 还在),先处理完再提交'],
32
- ['rebase-apply', '正在变基或应用补丁(rebase-apply 还在),先处理完再提交'],
33
- ];
34
-
35
- const CONFLICT_CODES = new Set(['DD', 'AU', 'UD', 'UA', 'DU', 'AA', 'UU']);
36
-
37
- /**
38
- * 统一走 execFileSync:参数按数组传,不经过 shell,中文路径也不被转义。
39
- * (git 默认会把非 ASCII 路径写成 "\346\226\207" 这种转义,看板上读不了)
40
- */
41
- const git = (root, args, opts = {}) =>
42
- execFileSync('git', ['-c', 'core.quotepath=false', '-C', root, ...args], {
43
- encoding: 'utf8',
44
- stdio: ['ignore', 'pipe', 'pipe'],
45
- timeout: TIMEOUT,
46
- windowsHide: true,
47
- ...opts,
48
- });
49
-
50
- const stderrOf = e => String(e?.stderr ?? e?.message ?? '').trim();
51
-
52
- const parseStatusLine = line => ({
53
- code: line.slice(0, 2).trim(),
54
- path: line.slice(3).replace(/^"(.*)"$/, '$1'),
55
- });
56
-
57
- /**
58
- * 提交前预览:这个目录能不能提交、提交了会带走哪些文件。
59
- * 永远不抛错——看板要把它整个显示出来,包括「不是仓库」这种情况。
60
- */
61
- export function commitPreview(root = process.cwd()) {
62
- const dir = resolve(root);
63
- const base = { root: dir, isRepo: false, branch: null, blocked: null, files: [], clean: true, conflicted: false };
64
-
65
- let inside = '';
66
- try {
67
- inside = git(dir, ['rev-parse', '--is-inside-work-tree']).trim();
68
- } catch {
69
- return base;
70
- }
71
- if (inside !== 'true') return base;
72
-
73
- let branch = null;
74
- try {
75
- branch = git(dir, ['rev-parse', '--abbrev-ref', 'HEAD']).trim() || null;
76
- } catch {
77
- // 空仓库还没有 HEAD:不算错误,首次提交照样能做
78
- }
79
- const detached = branch === 'HEAD';
80
-
81
- let gitDir = '';
82
- try {
83
- gitDir = git(dir, ['rev-parse', '--absolute-git-dir']).trim();
84
- } catch {}
85
-
86
- let files = [];
87
- try {
88
- files = git(dir, ['status', '--porcelain=v1', '-uall'])
89
- .split('\n')
90
- .filter(Boolean)
91
- .map(parseStatusLine);
92
- } catch {
93
- files = [];
94
- }
95
- const conflicted = files.some(f => CONFLICT_CODES.has(f.code));
96
-
97
- const inProgress = gitDir ? IN_PROGRESS.find(([name]) => existsSync(resolve(gitDir, name))) : null;
98
- let blocked = null;
99
- if (inProgress) blocked = inProgress[1];
100
- else if (detached) blocked = '当前是分离头指针(detached HEAD),在这里提交会丢,先切回分支';
101
- else if (conflicted) blocked = '工作区里还有冲突(UU / AA / DD),先把冲突解决完再提交';
102
-
103
- return {
104
- ...base,
105
- isRepo: true,
106
- branch: detached ? null : branch,
107
- blocked,
108
- files,
109
- clean: files.length === 0,
110
- conflicted,
111
- };
112
- }
113
-
114
- /**
115
- * 提交信息归一:CRLF → LF、去掉行尾空白、压掉连续空行。
116
- * 首行必须符合 Conventional Commits,空信息直接拒——不然会写出一个没意义的提交。
117
- */
118
- export function normalizeCommitMessage(message) {
119
- const text = String(message ?? '')
120
- .replace(/\r\n?/g, '\n')
121
- .replace(/[ \t]+$/gm, '')
122
- .replace(/\n{3,}/g, '\n\n')
123
- .trim();
124
- if (!text) throw new Error('提交信息是空的:先在弹窗里看清这次改了什么');
125
- const subject = text.split('\n')[0];
126
- if (!CONVENTIONAL_RE.test(subject)) {
127
- throw new Error(`提交信息首行要符合 Conventional Commits(形如 "feat: 一句话"),现在是「${subject.slice(0, 40)}」`);
128
- }
129
- if (text.length > MAX_MESSAGE) throw new Error(`提交信息太长了(${text.length} 字符,上限 ${MAX_MESSAGE}),删掉一些再提交`);
130
- return text;
131
- }
132
-
133
- /**
134
- * 真提交:add -A → commit -F -(多行信息走 stdin,避开 shell 引号)→ 回短 hash。
135
- * 任何一步失败都抛出人话,看板原样显示。
136
- */
137
- export function commitAll(root = process.cwd(), message = '') {
138
- const dir = resolve(root);
139
- const text = normalizeCommitMessage(message);
140
-
141
- const preview = commitPreview(dir);
142
- if (!preview.isRepo) throw new Error('这个目录不是 git 仓库,没法自动提交(先 git init)');
143
- if (preview.blocked) throw new Error(preview.blocked);
144
- if (preview.clean) throw new Error('没有未提交的改动,不需要提交');
145
-
146
- try {
147
- git(dir, ['add', '-A']);
148
- } catch (e) {
149
- throw new Error(`git add 失败:${stderrOf(e) || '未知原因'}`);
150
- }
151
-
152
- try {
153
- git(dir, ['commit', '-F', '-'], { stdio: ['pipe', 'pipe', 'pipe'], input: text });
154
- } catch (e) {
155
- const err = stderrOf(e);
156
- if (/who are you|auto-detect email|user\.name|user\.email/i.test(err)) {
157
- throw new Error('git 还没配提交身份,先跑:git config user.name "你的名字"、git config user.email "你的邮箱"');
158
- }
159
- throw new Error(`git commit 失败:${err || '未知原因'}`);
160
- }
161
-
162
- const hash = git(dir, ['rev-parse', '--short', 'HEAD']).trim();
163
- return {
164
- hash,
165
- subject: text.split('\n')[0],
166
- branch: preview.branch,
167
- files: preview.files.length,
168
- };
169
- }
170
-
171
- function main() {
172
- const [cmd, ...rest] = process.argv.slice(2);
173
- const positional = rest.filter(a => !a.startsWith('--'));
174
-
175
- if (cmd === 'status') {
176
- const p = commitPreview(positional[0] ?? process.cwd());
177
- if (!p.isRepo) {
178
- console.log('· 不是 git 仓库(没法自动提交)');
179
- process.exit(2);
180
- }
181
- console.log(`· 分支: ${p.branch ?? '(分离头指针)'}`);
182
- console.log(`· 待提交: ${p.files.length} 个文件`);
183
- for (const f of p.files) console.log(` ${f.code.padEnd(2)} ${f.path}`);
184
- if (p.blocked) console.log(`· 现在不能提交: ${p.blocked}`);
185
- process.exit(p.blocked ? 3 : 0);
186
- }
187
-
188
- if (cmd === 'commit') {
189
- const src = positional[0];
190
- if (!src) {
191
- console.error('用法: node tools/git-commit.mjs commit <信息文件|-> [目录]');
192
- process.exit(1);
193
- }
194
- let message;
195
- try {
196
- message = src === '-' ? readFileSync(0, 'utf8') : readFileSync(resolve(src), 'utf8');
197
- } catch (e) {
198
- console.error(`✘ 读不到提交信息文件: ${e.message}`);
199
- process.exit(3);
200
- }
201
- try {
202
- const r = commitAll(positional[1] ?? process.cwd(), message);
203
- console.log(`✔ 已提交 ${r.hash} · ${r.files} 个文件 · 分支 ${r.branch ?? '(分离头指针)'}`);
204
- return;
205
- } catch (e) {
206
- console.error(`✘ ${e.message}`);
207
- process.exit(4);
208
- }
209
- }
210
-
211
- console.error('用法:\n node tools/git-commit.mjs status [目录]\n node tools/git-commit.mjs commit <信息文件|-> [目录]');
212
- process.exit(1);
213
- }
214
-
215
- const entry = process.argv[1] ? pathToFileURL(resolve(process.argv[1])).href : '';
216
- if (entry && entry === import.meta.url) main();
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 「自动提交」:把这次交付整份提交进本地仓库(git add -A + git commit)。
4
+ *
5
+ * 只提交,不 push、不改任何文件内容。所以这里的全部力气都花在「别在错误的时机动手」:
6
+ * · 不是 git 仓库 / 分离头指针 / 正在合并、摘取、回滚、变基 / 工作区有冲突 → 拒绝并说清原因;
7
+ * · 工作区干净 → 拒绝,不造空提交;
8
+ * · 提交信息首行必须是 Conventional Commits(feat: / fix: / chore: …),非法时连 git add 都不做。
9
+ *
10
+ * 用法(CLI 调试;看板走 /api/agile/git/* 两个接口):
11
+ * node tools/git-commit.mjs status [目录]
12
+ * node tools/git-commit.mjs commit <信息文件|-> [目录]
13
+ */
14
+ import { existsSync, readFileSync } from 'node:fs';
15
+ import { resolve } from 'node:path';
16
+ import { execFileSync } from 'node:child_process';
17
+ import { pathToFileURL } from 'node:url';
18
+
19
+ const TIMEOUT = 30000;
20
+ const MAX_MESSAGE = 8000;
21
+
22
+ /** 首行:type(scope)!: 内容。`!` 留给破坏性变更 */
23
+ export const CONVENTIONAL_RE =
24
+ /^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)(\([^()\n]{1,32}\))?!?: \S/;
25
+
26
+ /** 这些文件还在,说明仓库卡在某个多步操作中间,这时候提交会把半截状态钉进历史 */
27
+ const IN_PROGRESS = [
28
+ ['MERGE_HEAD', '正在合并(MERGE_HEAD 还在),先把冲突处理完再提交'],
29
+ ['CHERRY_PICK_HEAD', '正在摘取提交(CHERRY_PICK_HEAD 还在),先处理完再提交'],
30
+ ['REVERT_HEAD', '正在回滚提交(REVERT_HEAD 还在),先处理完再提交'],
31
+ ['rebase-merge', '正在变基(rebase-merge 还在),先处理完再提交'],
32
+ ['rebase-apply', '正在变基或应用补丁(rebase-apply 还在),先处理完再提交'],
33
+ ];
34
+
35
+ const CONFLICT_CODES = new Set(['DD', 'AU', 'UD', 'UA', 'DU', 'AA', 'UU']);
36
+
37
+ /**
38
+ * 统一走 execFileSync:参数按数组传,不经过 shell,中文路径也不被转义。
39
+ * (git 默认会把非 ASCII 路径写成 "\346\226\207" 这种转义,看板上读不了)
40
+ */
41
+ const git = (root, args, opts = {}) =>
42
+ execFileSync('git', ['-c', 'core.quotepath=false', '-C', root, ...args], {
43
+ encoding: 'utf8',
44
+ stdio: ['ignore', 'pipe', 'pipe'],
45
+ timeout: TIMEOUT,
46
+ windowsHide: true,
47
+ ...opts,
48
+ });
49
+
50
+ const stderrOf = e => String(e?.stderr ?? e?.message ?? '').trim();
51
+
52
+ const parseStatusLine = line => ({
53
+ code: line.slice(0, 2).trim(),
54
+ path: line.slice(3).replace(/^"(.*)"$/, '$1'),
55
+ });
56
+
57
+ /**
58
+ * 提交前预览:这个目录能不能提交、提交了会带走哪些文件。
59
+ * 永远不抛错——看板要把它整个显示出来,包括「不是仓库」这种情况。
60
+ */
61
+ export function commitPreview(root = process.cwd()) {
62
+ const dir = resolve(root);
63
+ const base = { root: dir, isRepo: false, branch: null, blocked: null, files: [], clean: true, conflicted: false };
64
+
65
+ let inside = '';
66
+ try {
67
+ inside = git(dir, ['rev-parse', '--is-inside-work-tree']).trim();
68
+ } catch {
69
+ return base;
70
+ }
71
+ if (inside !== 'true') return base;
72
+
73
+ let branch = null;
74
+ try {
75
+ branch = git(dir, ['rev-parse', '--abbrev-ref', 'HEAD']).trim() || null;
76
+ } catch {
77
+ // 空仓库还没有 HEAD:不算错误,首次提交照样能做
78
+ }
79
+ const detached = branch === 'HEAD';
80
+
81
+ let gitDir = '';
82
+ try {
83
+ gitDir = git(dir, ['rev-parse', '--absolute-git-dir']).trim();
84
+ } catch {}
85
+
86
+ let files = [];
87
+ try {
88
+ files = git(dir, ['status', '--porcelain=v1', '-uall'])
89
+ .split('\n')
90
+ .filter(Boolean)
91
+ .map(parseStatusLine);
92
+ } catch {
93
+ files = [];
94
+ }
95
+ const conflicted = files.some(f => CONFLICT_CODES.has(f.code));
96
+
97
+ const inProgress = gitDir ? IN_PROGRESS.find(([name]) => existsSync(resolve(gitDir, name))) : null;
98
+ let blocked = null;
99
+ if (inProgress) blocked = inProgress[1];
100
+ else if (detached) blocked = '当前是分离头指针(detached HEAD),在这里提交会丢,先切回分支';
101
+ else if (conflicted) blocked = '工作区里还有冲突(UU / AA / DD),先把冲突解决完再提交';
102
+
103
+ return {
104
+ ...base,
105
+ isRepo: true,
106
+ branch: detached ? null : branch,
107
+ blocked,
108
+ files,
109
+ clean: files.length === 0,
110
+ conflicted,
111
+ };
112
+ }
113
+
114
+ /**
115
+ * 提交信息归一:CRLF → LF、去掉行尾空白、压掉连续空行。
116
+ * 首行必须符合 Conventional Commits,空信息直接拒——不然会写出一个没意义的提交。
117
+ */
118
+ export function normalizeCommitMessage(message) {
119
+ const text = String(message ?? '')
120
+ .replace(/\r\n?/g, '\n')
121
+ .replace(/[ \t]+$/gm, '')
122
+ .replace(/\n{3,}/g, '\n\n')
123
+ .trim();
124
+ if (!text) throw new Error('提交信息是空的:先在弹窗里看清这次改了什么');
125
+ const subject = text.split('\n')[0];
126
+ if (!CONVENTIONAL_RE.test(subject)) {
127
+ throw new Error(`提交信息首行要符合 Conventional Commits(形如 "feat: 一句话"),现在是「${subject.slice(0, 40)}」`);
128
+ }
129
+ if (text.length > MAX_MESSAGE) throw new Error(`提交信息太长了(${text.length} 字符,上限 ${MAX_MESSAGE}),删掉一些再提交`);
130
+ return text;
131
+ }
132
+
133
+ /**
134
+ * 真提交:add -A → commit -F -(多行信息走 stdin,避开 shell 引号)→ 回短 hash。
135
+ * 任何一步失败都抛出人话,看板原样显示。
136
+ */
137
+ export function commitAll(root = process.cwd(), message = '') {
138
+ const dir = resolve(root);
139
+ const text = normalizeCommitMessage(message);
140
+
141
+ const preview = commitPreview(dir);
142
+ if (!preview.isRepo) throw new Error('这个目录不是 git 仓库,没法自动提交(先 git init)');
143
+ if (preview.blocked) throw new Error(preview.blocked);
144
+ if (preview.clean) throw new Error('没有未提交的改动,不需要提交');
145
+
146
+ try {
147
+ git(dir, ['add', '-A']);
148
+ } catch (e) {
149
+ throw new Error(`git add 失败:${stderrOf(e) || '未知原因'}`);
150
+ }
151
+
152
+ try {
153
+ git(dir, ['commit', '-F', '-'], { stdio: ['pipe', 'pipe', 'pipe'], input: text });
154
+ } catch (e) {
155
+ const err = stderrOf(e);
156
+ if (/who are you|auto-detect email|user\.name|user\.email/i.test(err)) {
157
+ throw new Error('git 还没配提交身份,先跑:git config user.name "你的名字"、git config user.email "你的邮箱"');
158
+ }
159
+ throw new Error(`git commit 失败:${err || '未知原因'}`);
160
+ }
161
+
162
+ const hash = git(dir, ['rev-parse', '--short', 'HEAD']).trim();
163
+ return {
164
+ hash,
165
+ subject: text.split('\n')[0],
166
+ branch: preview.branch,
167
+ files: preview.files.length,
168
+ };
169
+ }
170
+
171
+ function main() {
172
+ const [cmd, ...rest] = process.argv.slice(2);
173
+ const positional = rest.filter(a => !a.startsWith('--'));
174
+
175
+ if (cmd === 'status') {
176
+ const p = commitPreview(positional[0] ?? process.cwd());
177
+ if (!p.isRepo) {
178
+ console.log('· 不是 git 仓库(没法自动提交)');
179
+ process.exit(2);
180
+ }
181
+ console.log(`· 分支: ${p.branch ?? '(分离头指针)'}`);
182
+ console.log(`· 待提交: ${p.files.length} 个文件`);
183
+ for (const f of p.files) console.log(` ${f.code.padEnd(2)} ${f.path}`);
184
+ if (p.blocked) console.log(`· 现在不能提交: ${p.blocked}`);
185
+ process.exit(p.blocked ? 3 : 0);
186
+ }
187
+
188
+ if (cmd === 'commit') {
189
+ const src = positional[0];
190
+ if (!src) {
191
+ console.error('用法: node tools/git-commit.mjs commit <信息文件|-> [目录]');
192
+ process.exit(1);
193
+ }
194
+ let message;
195
+ try {
196
+ message = src === '-' ? readFileSync(0, 'utf8') : readFileSync(resolve(src), 'utf8');
197
+ } catch (e) {
198
+ console.error(`✘ 读不到提交信息文件: ${e.message}`);
199
+ process.exit(3);
200
+ }
201
+ try {
202
+ const r = commitAll(positional[1] ?? process.cwd(), message);
203
+ console.log(`✔ 已提交 ${r.hash} · ${r.files} 个文件 · 分支 ${r.branch ?? '(分离头指针)'}`);
204
+ return;
205
+ } catch (e) {
206
+ console.error(`✘ ${e.message}`);
207
+ process.exit(4);
208
+ }
209
+ }
210
+
211
+ console.error('用法:\n node tools/git-commit.mjs status [目录]\n node tools/git-commit.mjs commit <信息文件|-> [目录]');
212
+ process.exit(1);
213
+ }
214
+
215
+ const entry = process.argv[1] ? pathToFileURL(resolve(process.argv[1])).href : '';
216
+ if (entry && entry === import.meta.url) main();