scrum-skills 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/.agents/skills/scrum-planning/references/schema.md +3 -2
  2. package/.agents/skills/scrum-sprint/SKILL.md +1 -0
  3. package/README.md +3 -3
  4. package/assets/board/200.html +1 -1
  5. package/assets/board/404.html +1 -1
  6. package/assets/board/_nuxt/D5AHQ-N9.js +3 -0
  7. package/assets/board/_nuxt/D_ct-Stz.js +1 -1
  8. package/assets/board/_nuxt/{BU8vdZUs.js → Dh0tYNMD.js} +61 -50
  9. package/assets/board/_nuxt/NtgBvUDk.js +1 -0
  10. package/assets/board/_nuxt/builds/latest.json +1 -1
  11. package/assets/board/_nuxt/builds/meta/36a46dc2-c9fd-444c-a454-4487435c77b9.json +1 -0
  12. package/assets/board/_nuxt/{entry.BBv-sBnP.css → entry.Birf8F5Z.css} +1 -1
  13. package/assets/board/_nuxt/last-change._l3ydJ-o.css +1 -0
  14. package/assets/board/_nuxt/milestones.Bp6jmeAm.css +1 -0
  15. package/assets/board/burndown/index.html +1 -1
  16. package/assets/board/diagrams/index.html +1 -1
  17. package/assets/board/epics/index.html +1 -1
  18. package/assets/board/gantt/index.html +1 -1
  19. package/assets/board/index.html +1 -1
  20. package/assets/board/last-change/index.html +1 -1
  21. package/assets/board/milestones/index.html +1 -1
  22. package/assets/board/tests/index.html +1 -1
  23. package/bin/scrum-skills.mjs +0 -0
  24. package/docs/ai-assistant-guide.md +2 -1
  25. package/package.json +41 -42
  26. package/tools/ai.mjs +46 -2
  27. package/tools/serve.mjs +3 -1
  28. package/tools/validate.mjs +4 -2
  29. package/assets/board/_nuxt/Dmg78zOY.js +0 -3
  30. package/assets/board/_nuxt/Utb4TVOl.js +0 -1
  31. package/assets/board/_nuxt/builds/meta/08bebe14-0f1b-4d2a-8de4-e84e122d10e9.json +0 -1
  32. package/assets/board/_nuxt/last-change.1Su4GrCN.css +0 -1
  33. package/assets/board/_nuxt/milestones.U0xKCsEo.css +0 -1
@@ -104,7 +104,7 @@
104
104
  "title": "MVP · 内测可登录",
105
105
  "kind": "mvp | release | checkpoint",
106
106
  "due": "2026-09-13",
107
- "status": "planned | at-risk | reached | missed",
107
+ "status": "planned | at-risk | reached | missed | cancelled",
108
108
  "sprintId": "R1-S1",
109
109
  "criteria": "达成口径:怎样算这个节点到了",
110
110
  "stories": ["S-001", "S-002"]
@@ -115,6 +115,7 @@
115
115
 
116
116
  - **MVP 节点就是 `kind: "mvp"` 的里程碑**,不另设实体。
117
117
  - `status: "reached"` 时挂的故事必须全部 `done/cancelled`,否则校验报错。
118
+ - `status: "cancelled"` 是**终态**:整个节点被业务取消(如「不做小程序提审」)时用它,既不是 `reached` 也不是 `missed`;**不要求**名下故事全部完成,但引用完整性、`kind` / `due` / `criteria` 照旧校验。看板显示「已取消」灰色节点,不计入已达成与风险数。
118
119
  - `due` 早于今天但状态仍是 `planned` → WARN。
119
120
 
120
121
  ### 迭代编号规则(`sprints[].id`)
@@ -365,7 +366,7 @@ node tools/last-change.mjs write <记录.json> --replace # 确认旧记录不
365
366
  - story: `draft → ready → in-progress → review → done`;不做了直接进 `cancelled`(已取消)终态(可回退,不可跳级;`done` 与 `cancelled` 都是终态)
366
367
  - task: `todo → red → green → refactored → done`(只能前进;test 型可 `todo → green`)
367
368
  - epic: 无强制流转,但 `done` 要求其下所有 story 均 `done/cancelled`
368
- - milestone: `planned → at-risk → reached / missed`
369
+ - milestone: `planned → at-risk → reached / missed / cancelled`(`cancelled` 是整体取消的终态)
369
370
 
370
371
  ## 硬约束(校验器强制 / 警告)
371
372
 
@@ -38,6 +38,7 @@ description: 管理 Sprint 迭代周期与 Story 状态流转,落库到 agile/
38
38
  1. sprint 到期:未完成 story 回 backlog(`sprintId` 置 null,状态回 `ready`),完成项保持 `done`
39
39
  2. 生成回顾小结写入对话(做了什么/没做什么/为什么),不落文件除非用户要求
40
40
  3. 里程碑到期没达成:状态改 `missed` 并写清差在哪几个故事;有风险但未到期改 `at-risk`;达成必须先把挂的故事推到 `done`
41
+ - 业务决定整个阶段不做了(不是没赶上):状态改 `cancelled` 并在 `note` 写清谁在什么时候拍的板、哪些成果保留;**不要**写成 `missed`,也不要为了通过校验硬置 `reached`
41
42
  - 迭代中途插入的需求,必须给该 story 打 `scopeChange: { kind: "added-mid-sprint", at, reason }`;拆分出来的打 `split`。否则燃尽图上的偏差会被误读成团队拖延
42
43
  4. 建议用户运行 `node tools/serve.mjs` 看燃尽图(`/burndown`)与甘特图(`/gantt`)核对进度
43
44
 
package/README.md CHANGED
@@ -122,7 +122,7 @@ npx scrum-skills serve # → http://localhost:4173
122
122
  | 字段 | 说明 |
123
123
  |---|---|
124
124
  | 服务商 | DeepSeek / OpenAI / Moonshot / 硅基流动 / 本地 Ollama / 自定义,选中后自动带出接口地址与模型名 |
125
- | 接口地址 · API Key · 模型名 | OpenAI 兼容端点即可;Ollama 可以留空 Key |
125
+ | 接口地址 · API Key · 模型名 | OpenAI 兼容端点即可;Ollama 可以留空 Key。填好 Key 后「模型名」右侧的「拉取列表」可点,直接从接口拉回模型 id 选一个(本地地址免 Key) |
126
126
  | 系统提示词 · 温度 | 系统提示词默认留空:内置说明只讲「能碰哪些数据 / 两个工具 / 四条回答纪律」,不写人设也不提厂商;温度默认 0.3(改数据这类活不需要发挥) |
127
127
  | 工具调用轮数上限 | 默认 30:模型连着调工具时跑到上限会强制收口一轮 |
128
128
  | 上下文上限 · 超长自动压缩 | 默认 256000 token;超了先把老对话压掉,系统提示词与当前提问永远保留 |
@@ -179,7 +179,7 @@ node tools/last-change.mjs write 记录.json --replace # 确认旧记录不要
179
179
  - 测试资产(`agile/tests.json`,可选):`layer`/`level`/`status` 枚举合法、用例 id 唯一、`covers` 指向的验收必须存在且序号不越界、`taskId` 属于 covers 里的故事、`runs` 时间正序、最新一次 `failedCases` 必须对应 `status: fail`、覆盖率 0~100
180
180
  - **收口纪律**(只查登记过用例的故事):done 的 `test` 型任务必须有对应用例;story 到 `review`/`done` 时每条验收必须被覆盖
181
181
  - 迭代 id 格式与序号连续、同时只能有一个活跃迭代
182
- - 里程碑 `reached` 时挂的故事必须全部完成
182
+ - 里程碑 `reached` 时挂的故事必须全部完成;`cancelled` 是整体取消的终态,不要求故事完成(引用完整性照旧)
183
183
 
184
184
  给 **WARN** 的(不阻塞):验收没绑验证任务、史诗缺 keyResults、计划区间超出迭代、承诺点数超容量、被阻塞的故事仍排在迭代里等。
185
185
 
@@ -192,7 +192,7 @@ AGILE_DIR=/别的项目 pnpm dev # 看别的项目的数据
192
192
 
193
193
  pnpm build # 构建看板静态产物 → assets/board
194
194
  pnpm validate # 只校验数据
195
- pnpm test # 回归测试(校验器 / 测试资产与覆盖计算 / 看板皮肤与配色 / 布局回归 / 卡片操作 / 项目目录 / 最后更新页与历史版本 / 交付说明写入策略 / 提交信息与自动提交 / AI 服务与面板,204 个用例)
195
+ pnpm test # 回归测试(校验器 / 测试资产与覆盖计算 / 看板皮肤与配色 / 布局回归 / 卡片操作 / 项目目录 / 最后更新页与历史版本 / 交付说明写入策略 / 提交信息与自动提交 / AI 服务与面板,293 个用例)
196
196
  pnpm serve # 起看板(读目标目录的 agile/,同时提供 /api/ai)
197
197
  ```
198
198
 
@@ -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/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
+ <!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/Dh0tYNMD.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.Birf8F5Z.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Dh0tYNMD.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/Dh0tYNMD.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:"36a46dc2-c9fd-444c-a454-4487435c77b9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1794057692706,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/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
+ <!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/Dh0tYNMD.js"}}</script><link rel="stylesheet" href="/_nuxt/entry.Birf8F5Z.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Dh0tYNMD.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/Dh0tYNMD.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:"36a46dc2-c9fd-444c-a454-4487435c77b9",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1794057692707,false]</script></body></html>
@@ -0,0 +1,3 @@
1
+ import{t as e}from"./DJM7u8P3.js";import{t}from"./CI0scS-N.js";import{I as n,i as r,s as i}from"#entry";import{At as a,B as ee,I as te,K as o,N as ne,S as re,U as s,Xt as c,Yt as ie,at as ae,b as l,d as u,f as d,i as f,lt as oe,m as p,p as m,qt as h,s as se,u as g,v as ce,xt as _,y as v}from"./BxuBMtk_.js";import{c as y}from"./BygIGL69.js";var le={added:`新增`,updated:`状态变更`,removed:`移除`},ue=`更新交付记录`,b=`变更`,x=e=>typeof e==`string`?e.replace(/\s+/g,` `).trim():``;function de(e){let t=Array.isArray(e?.changes)?e.changes:[],n=x(e?.title)||ue,r=t.some(e=>e?.action===`added`)?`feat`:`chore`,i=[];for(let e of t){let t=x(e?.id);if(!t)continue;let n=x(e.title)||x(e.note),r=le[e.action]||x(e.action)||b;e.action===`updated`&&(x(e.from)||x(e.to))&&(r+=` ${x(e.from)||`—`} → ${x(e.to)||`—`}`),i.push(`- ${t}${n?` ${n}`:``}(${r})`)}return i.length?`${r}: ${n}\n\n${i.join(`
2
+ `)}`:`${r}: ${n}`}var S=/(?:^|(?<=[\s。;;::,,))]))(?:\d{1,2}[.)、]|[((]\d{1,2}[))]|[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳]|[-*•·])\s+/gm,C=/(?<=[。;;])/,w=e=>typeof e==`string`?e.replace(/[\r\n]+/g,` `).replace(/\s{2,}/g,` `).trim():``,T=e=>e.match(S)?.length??0,E=20,D=e=>e.replace(/[;;,,]+$/,``).trim(),O=e=>e.length>1?e.map(D).filter(Boolean):e;function k(e){if(T(e)<2)return[];let t=e.split(S).map(w).filter(Boolean);return t.length>1&&t[0].length<=E&&/[::]$/.test(t[0])&&t.splice(0,2,`${t[0]}${t[1]}`),O(t)}function fe(e){if(Array.isArray(e))return O(e.map(w).filter(Boolean));let t=w(e);if(!t)return[];let n=String(e).split(/\r?\n/).map(w).filter(Boolean);if(n.length>1)return O(n.flatMap(e=>{let t=k(e);return t.length?t:[e]}).filter(Boolean));let r=k(t);if(r.length>1)return r;let i=O(t.split(C).map(w).filter(Boolean));return i.length>1?i:[t]}var pe={class:`rule-top`},me={class:`rule-ic`},he={class:`rule-state`},ge={class:`mono`},_e={key:0},ve={class:`rule-cases`},ye={class:`case-when`},be={class:`case-then`},xe={key:1,class:`lc-hist-bar`},Se={class:`hist-badge`},Ce={class:`hist-readonly mono`},we=[`title`,`disabled`,`onClick`],Te={key:2,class:`card lc-empty`},Ee={class:`em-ic`},De={key:3,class:`lc`},Oe={class:`lc-hero`},ke={class:`hero-body`},Ae={class:`hero-kicker`},je={class:`k-date mono`},Me={key:0,class:`k-time mono`},Ne={key:1,class:`k-today`},Pe=[`title`],Fe={class:`hero-title`},Ie={key:0,class:`hero-points`},Le={key:1,class:`hero-sum`},Re={class:`hero-meta`},ze={class:`hero-aside`},Be={class:`ring-in`},Ve={class:`lc-nav`,"aria-label":`分区导航`},He=[`href`,`onClick`],Ue={class:`lc-nav-lb`},We={class:`lc-nav-ct`},Ge={id:`lc-scenarios`,class:`lc-sc-sec`},Ke={class:`s-hd solo`},qe={class:`s-ic tone-mint`},Je={class:`s-count`},Ye={key:0,class:`dim sec-empty`},Xe={key:1,class:`lc-sc-grid`},Ze={class:`sc-hd`},Qe={class:`sc-id mono`},$e={class:`sc-title`},et={key:0,class:`sc-body`},tt={class:`lc-sc-steps`},nt={class:`sc-acc`},rt={class:`sc-acc-h`},it={class:`sc-acc-t`},at={key:0,class:`sc-foot`},ot={key:0},st={key:1,class:`sc-ids`},ct={key:0,id:`lc-access`,class:`card sec lc-access`},lt={class:`s-hd`},ut={class:`s-ic tone-sky`},dt={class:`s-count`},ft={class:`sec-bd acc-grid`},pt={key:0,class:`acc-col`},mt={class:`u-head`},ht=[`href`],gt={class:`u-label`},_t=[`onClick`],vt={class:`u-url mono`},yt={key:0,class:`u-note`},bt={key:1,class:`acc-col`},xt={class:`a-head`},St={key:0,class:`a-role`},Ct={class:`a-user mono`},wt=[`onClick`],Tt={class:`a-line`},Et={key:0,class:`a-pass mono`},Dt={key:1,class:`a-none dim`},Ot={key:0,class:`a-note`},kt={key:1,id:`lc-prep`,class:`card sec lc-prep`},At={class:`s-hd`},jt={class:`s-ic tone-amber`},Mt={class:`s-count`},Nt={class:`steps`},Pt={class:`step-bd`},Ft={class:`step-text`},It={key:0,class:`cmd-row`},Lt={class:`cmd mono`},Rt=[`onClick`],zt={key:1,class:`step-note`},Bt={id:`lc-changes`,class:`card sec`},Vt={class:`s-hd`},Ht={class:`s-ic`},Ut={class:`s-count`},Wt={key:0,class:`sec-empty dim`},Gt={key:1,class:`tbl-wrap`},Kt={class:`tbl lc-tbl`},qt={class:`ent`},Jt={class:`ent-top`},Yt={key:0,class:`ent-title`},Xt={key:0,class:`flow mono`},Zt={class:`fl`},Qt={class:`fl`},$t={class:`cell-note`},en={class:`chips`},tn=[`title`],nn={key:0,class:`dim`},rn={class:`two`},an={id:`lc-extras`,class:`card sec`},on={class:`s-hd`},sn={class:`s-ic`},cn={class:`s-count`},ln={class:`sec-bd lc-extras`},un={key:0,class:`dim`},dn={class:`x-body`},fn={class:`x-title`},pn={key:0,class:`x-detail`},mn={key:1,class:`chips x-files`},hn=[`title`],gn={id:`lc-checks`,class:`card sec`},_n={class:`s-hd`},vn={class:`s-ic tone-mint`},yn={class:`s-count`},bn={class:`sec-bd lc-checks`},xn={key:0,class:`dim`},Sn={class:`v-body`},Cn={class:`v-what`},wn={key:0,class:`v-detail`},Tn={class:`two`},En={id:`lc-notes`,class:`card sec`},Dn={class:`s-hd`},On={class:`s-ic`},kn={class:`s-count`},An={class:`sec-bd`},jn={key:0,class:`dim`},Mn={key:1,class:`lc-notes`},Nn={key:0,id:`lc-open`,class:`card sec sec-warn`},Pn={class:`s-hd`},Fn={class:`s-ic`},In={class:`s-count`},Ln={class:`sec-bd`},Rn={class:`lc-notes warn`},zn={class:`lc-hist`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lc-hist-title`},Bn={class:`lc-hist-hd`},Vn={class:`lc-hist-hd-txt`},Hn={class:`lc-hist-sub`},Un={key:0,class:`lc-hist-err`},Wn={key:1,class:`lc-hist-hint dim`},Gn={key:2,class:`lc-hist-list`},Kn=[`disabled`,`onClick`],qn={class:`hist-item-main`},Jn={class:`mono`},Yn={class:`mono hist-item-hash`},Xn={key:0,class:`lc-hist-hint dim`},Zn={class:`lc-hist-ft`},Qn={class:`lc-hist lc-commit`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lc-commit-title`},$n={class:`lc-hist-hd`},er=[`disabled`],tr={key:0,class:`cm-done`},nr={class:`cm-done-ic`},rr={class:`cm-done-bd`},ir={class:`cm-done-t`},ar={class:`mono`},or={class:`cm-done-s`},sr={class:`cm-done-n`},cr={key:1,class:`cm-body`},lr={class:`cm-msg mono`},ur={class:`micro`},dr={key:0,class:`cm-hint dim`},fr={key:1,class:`cm-hint warn`},pr={key:2,class:`cm-hint warn`},mr={key:3,class:`cm-hint dim`},hr={key:4,class:`cm-files`},gr=[`title`],_r={key:2,class:`lc-hist-err`},vr={class:`lc-hist-ft`},yr={class:`dim`},br={class:`cm-acts`},xr=[`disabled`],Sr=[`disabled`],A=r(re({__name:`last-change`,setup(r){let{lastChange:re,lastChangeGit:le,refresh:ue}=i(),b=_(null),x=g(()=>b.value?.doc?.lastChange??re.value),S=g(()=>le.value),C=_([]),w=_(!1),T=_(!1),E=_(``),D=_(!1),O=g(()=>b.value?[b.value]:[]);async function k(){if(!T.value){T.value=!0,E.value=``;try{let e=await n(`/api/agile/last-change/history`);C.value=e.entries??[]}catch(e){E.value=e?.data?.error||e?.message||`读不到 git 历史`}finally{T.value=!1}}}async function A(){w.value=!0,C.value.length||await k()}async function Cr(e){if(!D.value){D.value=!0,E.value=``;try{b.value=await n(`/api/agile/last-change/revision`,{query:{hash:e.hash}}),w.value=!1,window.scrollTo({top:0,behavior:`smooth`})}catch(e){E.value=e?.data?.error||e?.message||`取不到这个版本`}finally{D.value=!1}}}function wr(){b.value=null,window.scrollTo({top:0,behavior:`smooth`})}let Tr=_(null);ae(b,async()=>{await ne(),Tr.value?.querySelector(`.hist-tab.on`)?.scrollIntoView({inline:`nearest`,block:`nearest`})});function Er(e){e.key===`Escape`&&(J.value?$():w.value&&=!1)}ee(()=>window.addEventListener(`keydown`,Er)),te(()=>window.removeEventListener(`keydown`,Er));let Dr={committed:{text:`已提交`,tone:`ok`},dirty:{text:`未提交改动`,tone:`warn`},untracked:{text:`未纳入版本库`,tone:`warn`},"no-git":{text:`非 git 仓库`,tone:`neutral`},missing:{text:`尚未生成`,tone:`neutral`}},j=g(()=>Dr[S.value?.state??`missing`]??Dr.missing),Or=[{key:`committed`,when:`已提交`,then:`下次写入整份覆盖;上一版留在 git 历史里,点「查看历史」随时翻回来`},{key:`pending`,when:`未提交`,then:`下次写入合并:新交付接在旧记录后面,不冲掉还没入库的内容`}],kr=g(()=>{let e=S.value?.state;return e===`committed`?`committed`:e===`dirty`||e===`untracked`||e===`no-git`?`pending`:``}),M=g(()=>fe(x.value?.summary)),Ar=g(()=>(x.value?.mergedFrom?.length??0)+1),jr=g(()=>(x.value?.mergedFrom??[]).map(e=>`${e.at??``} ${e.title??``}`.trim()).filter(Boolean).join(`
3
+ `)),Mr={added:`新增`,updated:`状态变更`,removed:`移除`},Nr={story:`故事`,task:`任务`},Pr={pass:`通过`,fail:`失败`,partial:`部分`,skipped:`未跑`},Fr={pass:`i-lucide-check`,fail:`i-lucide-x`,partial:`i-lucide-minus`,skipped:`i-lucide-minus`},N=g(()=>x.value?.changes??[]),P=g(()=>de(x.value??{})),F=g(()=>x.value?.extras??[]),I=g(()=>x.value?.verification??[]),L=g(()=>x.value?.scenarios??[]),R=g(()=>x.value?.preparation??[]),z=g(()=>x.value?.notes??[]),B=g(()=>x.value?.open??[]),V=g(()=>x.value?.access?.urls??[]),H=g(()=>x.value?.access?.accounts??[]),U=g(()=>I.value.filter(e=>e.result===`pass`).length),Ir=g(()=>I.value.length>0&&U.value===I.value.length),Lr=g(()=>I.value.length?Math.round(U.value/I.value.length*100):0),Rr=g(()=>[...new Set([...N.value.flatMap(e=>e.files??[]),...F.value.flatMap(e=>e.files??[])])]),zr=e=>e.kind===`story`?e.id:e.id.replace(/-T\d+$/,``),Br=g(()=>[{id:`lc-scenarios`,label:`测试场景`,icon:`i-lucide-flask-conical`,count:`${L.value.length}`,tone:`teal`},...V.value.length||H.value.length?[{id:`lc-access`,label:`调试入口与账号`,icon:`i-lucide-key-round`,count:`${V.value.length+H.value.length}`,tone:`sky`}]:[],...R.value.length?[{id:`lc-prep`,label:`测试前准备`,icon:`i-lucide-terminal-square`,count:`${R.value.length}`,tone:`amber`}]:[],{id:`lc-changes`,label:`变更清单`,icon:`i-lucide-git-commit-horizontal`,count:`${N.value.length}`,tone:`violet`},{id:`lc-extras`,label:`额外做的事`,icon:`i-lucide-sparkles`,count:`${F.value.length}`,tone:`peach`},{id:`lc-checks`,label:`验证结果`,icon:`i-lucide-badge-check`,count:`${U.value}/${I.value.length}`,tone:`mint`},{id:`lc-notes`,label:`说明`,icon:`i-lucide-message-square-more`,count:`${z.value.length}`,tone:`slate`},...B.value.length?[{id:`lc-open`,label:`还没做的`,icon:`i-lucide-list-todo`,count:`${B.value.length}`,tone:`rose`}]:[]]);function Vr(e){let t=document.getElementById(e);t&&(t.scrollIntoView({behavior:`smooth`,block:`start`}),history.replaceState(null,``,`#${e}`))}let W=new Date,Hr=`${W.getFullYear()}-${String(W.getMonth()+1).padStart(2,`0`)}-${String(W.getDate()).padStart(2,`0`)}`,G=g(()=>(x.value?.at??``).slice(0,10)),Ur=g(()=>{let e=(x.value?.at??``).slice(10).replace(/^[T ]/,``);return/^\d{2}:\d{2}/.test(e)?e:``}),Wr=g(()=>!!G.value&&G.value===Hr),K=_(``);async function q(e,t){try{await navigator.clipboard.writeText(e),K.value=t,setTimeout(()=>{K.value===t&&(K.value=``)},1600)}catch{K.value=``}}let J=_(!1),Y=_(!1),X=_(``),Z=_(null),Q=_(null),Gr=g(()=>!!Z.value?.isRepo&&!Z.value?.blocked&&(Z.value?.files.length??0)>0&&!Y.value);async function Kr(){if(!Y.value){J.value=!0,X.value=``,Q.value=null,Z.value=null;try{Z.value=await n(`/api/agile/git/status`)}catch(e){X.value=e?.data?.error||e?.message||`读不到 git 状态`}}}function $(){Y.value||(J.value=!1,X.value=``,Q.value=null,Z.value=null)}async function qr(){if(Gr.value){Y.value=!0,X.value=``;try{let{token:e}=await n(`/api/projects`);Q.value=await n(`/api/agile/git/commit`,{method:`POST`,headers:{"x-project-token":e},body:{message:P.value}}),await ue()}catch(e){X.value=e?.data?.error||e?.message||`提交失败`}finally{Y.value=!1}}}return(n,r)=>{let i=e,ee=t;return s(),p(f,null,[a(b)?(s(),p(`div`,xe,[u(`span`,Se,[l(i,{name:`i-lucide-history`,class:`hist-badge-ic`}),r[8]||=v(`历史版本`,-1)]),u(`span`,Ce,[v(`只读 · `+c(a(b).short),1),a(b).date?(s(),p(f,{key:0},[v(` · `+c(a(b).date),1)],64)):m(``,!0)]),u(`div`,{ref_key:`tabsRef`,ref:Tr,class:`lc-hist-tabs`},[u(`button`,{class:`hist-tab`,onClick:wr},`最新`),(s(!0),p(f,null,o(a(O),e=>(s(),p(`button`,{key:e.hash,class:h([`hist-tab`,{on:a(b)?.hash===e.hash}]),title:`${e.date} ${e.subject??``}`,disabled:a(D),onClick:t=>Cr(e)},[v(c(e.short),1),u(`i`,null,c(e.date.slice(5,16)),1)],10,we))),128))],512),u(`button`,{class:`rule-btn`,onClick:A},[l(i,{name:`i-lucide-list`,class:`rule-btn-ic`}),r[9]||=v(`选择历史…`,-1)])])):(s(),p(`div`,{key:0,class:h([`lc-rule`,`is-${a(j).tone}`])},[u(`div`,pe,[u(`span`,me,[l(i,{name:`i-lucide-git-branch`,class:`rule-svg`})]),r[6]||=u(`b`,{class:`rule-title`},`写入规则`,-1),r[7]||=u(`span`,{class:`rule-file mono`},`agile/last-change.json`,-1),u(`span`,he,[u(`i`,{class:h([`rule-dot`,`tone-${a(j).tone}`])},null,2),v(` 当前 `+c(a(j).text),1),a(S)?.state===`committed`&&a(S).hash?(s(),p(f,{key:0},[r[4]||=v(` · `,-1),u(`span`,ge,c(a(S).hash),1)],64)):m(``,!0)]),u(`button`,{class:`rule-btn`,onClick:A},[l(i,{name:`i-lucide-history`,class:`rule-btn-ic`}),r[5]||=v(`查看历史 `,-1),a(C).length?(s(),p(`i`,_e,c(a(C).length),1)):m(``,!0)])]),u(`ul`,ve,[(s(),p(f,null,o(Or,e=>u(`li`,{key:e.key,class:h([`rule-case`,{on:a(kr)===e.key}])},[u(`span`,ye,c(e.when),1),l(i,{name:`i-lucide-arrow-right`,class:`case-arrow`}),u(`span`,be,c(e.then),1)],2)),64))])],2)),a(x)?(s(),p(`div`,De,[u(`header`,Oe,[u(`div`,ke,[u(`p`,Ae,[r[11]||=u(`span`,{class:`k-dot`},null,-1),r[12]||=v(`最近一次交付 `,-1),r[13]||=u(`span`,{class:`k-sep`},null,-1),u(`span`,je,c(a(G)),1),a(Ur)?(s(),p(`span`,Me,c(a(Ur)),1)):m(``,!0),a(Wr)?(s(),p(`span`,Ne,`今天`)):m(``,!0),a(x).merged?(s(),p(`span`,{key:2,class:`k-merged`,title:a(jr)},`合并记录 · `+c(a(Ar))+` 次交付`,9,Pe)):m(``,!0)]),u(`h2`,Fe,c(a(x).title),1),a(M).length>1?(s(),p(`ol`,Ie,[(s(!0),p(f,null,o(a(M),(e,t)=>(s(),p(`li`,{key:t},c(e),1))),128))])):a(M).length?(s(),p(`p`,Le,c(a(M)[0]),1)):m(``,!0),u(`div`,Re,[u(`span`,null,[u(`b`,null,c(a(N).length),1),r[14]||=v(` 处变更`,-1)]),r[19]||=u(`i`,{class:`meta-sep`},null,-1),u(`span`,null,[u(`b`,null,c(a(Rr).length),1),r[15]||=v(` 个文件`,-1)]),r[20]||=u(`i`,{class:`meta-sep`},null,-1),u(`span`,null,[u(`b`,null,c(a(L).length),1),r[16]||=v(` 条测试场景`,-1)]),a(F).length?(s(),p(f,{key:0},[r[18]||=u(`i`,{class:`meta-sep`},null,-1),u(`span`,null,[u(`b`,null,c(a(F).length),1),r[17]||=v(` 项额外工作`,-1)])],64)):m(``,!0)])]),u(`div`,ze,[u(`div`,{class:h([`ring`,{warn:a(I).length&&!a(Ir)}]),style:ie({"--pct":a(Lr)})},[u(`div`,Be,[u(`b`,null,[v(c(a(U)),1),u(`small`,null,`/`+c(a(I).length||0),1)]),u(`span`,null,c(a(I).length?a(Ir)?`验证全通过`:`有未通过项`:`无验证记录`),1)])],6)])]),u(`nav`,Ve,[(s(!0),p(f,null,o(a(Br),e=>(s(),p(`a`,{key:e.id,class:h([`lc-nav-link`,`tone-${e.tone}`]),href:`#${e.id}`,onClick:y(t=>Vr(e.id),[`prevent`])},[l(i,{name:e.icon,class:`lc-nav-ic`},null,8,[`name`]),u(`span`,Ue,c(e.label),1),u(`b`,We,c(e.count),1)],10,He))),128))]),u(`section`,Ge,[u(`div`,Ke,[u(`span`,qe,[l(i,{name:`i-lucide-flask-conical`,class:`s-svg`})]),r[21]||=u(`h2`,{class:`s-title`},`测试场景`,-1),u(`span`,Je,c(a(L).length),1),r[22]||=u(`span`,{class:`s-hint`},`一条一段:照着步骤走,末尾那句就是验收标准`,-1)]),a(L).length?(s(),p(`div`,Xe,[(s(!0),p(f,null,o(a(L),(e,t)=>(s(),p(`article`,{key:e.id??t,class:`sc lc-sc`},[u(`header`,Ze,[u(`span`,Qe,c(e.id??`TC-${t+1}`),1),u(`h3`,$e,c(e.title),1)]),e.steps?.length?(s(),p(`div`,et,[r[23]||=u(`p`,{class:`micro`},`测试步骤`,-1),u(`ol`,tt,[(s(!0),p(f,null,o(e.steps,(e,t)=>(s(),p(`li`,{key:t},c(e),1))),128))])])):m(``,!0),u(`div`,nt,[u(`p`,rt,[l(i,{name:`i-lucide-badge-check`,class:`sc-acc-ic`}),r[24]||=v(`验收标准`,-1)]),u(`p`,it,c(e.expect),1),e.acceptance||e.storyIds?.length?(s(),p(`div`,at,[e.acceptance?(s(),p(`span`,ot,`对应验收:`+c(e.acceptance),1)):m(``,!0),e.storyIds?.length?(s(),p(`span`,st,[(s(!0),p(f,null,o(e.storyIds,e=>(s(),d(ee,{key:e,to:`/story/${e}`,class:`ent-id mono`},{default:oe(()=>[v(c(e),1)]),_:2},1032,[`to`]))),128))])):m(``,!0)])):m(``,!0)])]))),128))])):(s(),p(`p`,Ye,`这次没有单独列测试场景。`))]),a(V).length||a(H).length?(s(),p(`section`,ct,[u(`div`,lt,[u(`span`,ut,[l(i,{name:`i-lucide-key-round`,class:`s-svg`})]),r[25]||=u(`h2`,{class:`s-title`},`调试入口与账号`,-1),u(`span`,dt,c(a(V).length+a(H).length),1),r[26]||=u(`span`,{class:`s-hint`},`照着这一栏就能自己跑起来点一遍`,-1)]),u(`div`,ft,[a(V).length?(s(),p(`div`,pt,[r[27]||=u(`p`,{class:`micro`},`访问地址`,-1),(s(!0),p(f,null,o(a(V),(e,t)=>(s(),p(`div`,{key:t,class:`u-item`},[u(`div`,mt,[u(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,class:`u-link`},[u(`span`,gt,c(e.label??`入口`),1),l(i,{name:`i-lucide-arrow-up-right`,class:`u-go`})],8,ht),u(`button`,{class:h([`cpy`,{ok:a(K)===`url-${t}`}]),onClick:n=>q(e.url,`url-${t}`)},[l(i,{name:a(K)===`url-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),v(` `+c(a(K)===`url-${t}`?`已复制`:`复制`),1)],10,_t)]),u(`p`,vt,c(e.url),1),e.note?(s(),p(`p`,yt,c(e.note),1)):m(``,!0)]))),128))])):m(``,!0),a(H).length?(s(),p(`div`,bt,[r[29]||=u(`p`,{class:`micro`},`账号密码`,-1),(s(!0),p(f,null,o(a(H),(e,t)=>(s(),p(`div`,{key:t,class:`a-item`},[u(`div`,xt,[e.role?(s(),p(`span`,St,c(e.role),1)):m(``,!0),u(`span`,Ct,c(e.username),1),u(`button`,{class:h([`cpy`,{ok:a(K)===`acc-${t}`}]),onClick:n=>q(e.password?`账号:${e.username}\n密码:${e.password}`:e.username,`acc-${t}`)},[l(i,{name:a(K)===`acc-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),v(` `+c(a(K)===`acc-${t}`?`已复制`:`复制`),1)],10,wt)]),u(`div`,Tt,[r[28]||=u(`span`,{class:`a-key`},`密码`,-1),e.password?(s(),p(`span`,Et,c(e.password),1)):(s(),p(`span`,Dt,`无密码 / 走单点登录`))]),e.note?(s(),p(`p`,Ot,c(e.note),1)):m(``,!0)]))),128))])):m(``,!0)])])):m(``,!0),a(R).length?(s(),p(`section`,kt,[u(`div`,At,[u(`span`,jt,[l(i,{name:`i-lucide-terminal-square`,class:`s-svg`})]),r[30]||=u(`h2`,{class:`s-title`},`测试前准备`,-1),u(`span`,Mt,c(a(R).length),1),r[31]||=u(`span`,{class:`s-hint`},`按顺序做完这些再开始点,命令可直接复制`,-1)]),u(`ol`,Nt,[(s(!0),p(f,null,o(a(R),(e,t)=>(s(),p(`li`,{key:t},[u(`div`,Pt,[u(`p`,Ft,c(e.step),1),e.command?(s(),p(`div`,It,[u(`code`,Lt,c(e.command),1),u(`button`,{class:h([`cpy`,{ok:a(K)===`cmd-${t}`}]),onClick:n=>q(e.command??``,`cmd-${t}`)},[l(i,{name:a(K)===`cmd-${t}`?`i-lucide-check`:`i-lucide-copy`,class:`cpy-ic`},null,8,[`name`]),v(` `+c(a(K)===`cmd-${t}`?`已复制`:`复制`),1)],10,Rt)])):m(``,!0),e.note?(s(),p(`p`,zt,c(e.note),1)):m(``,!0)])]))),128))])])):m(``,!0),u(`section`,Bt,[u(`div`,Vt,[u(`span`,Ht,[l(i,{name:`i-lucide-git-commit-horizontal`,class:`s-svg`})]),r[33]||=u(`h2`,{class:`s-title`},`变更清单`,-1),u(`span`,Ut,c(a(N).length),1),r[34]||=u(`span`,{class:`s-hint`},`故事与任务各自是新增还是状态变更、动过哪些文件`,-1),a(N).length?(s(),p(`button`,{key:0,class:h([`rule-btn s-copy`,{ok:a(K)===`commit`}]),title:`按 Conventional Commits 生成:首行是标题,正文每条变更带编号与名称`,onClick:r[0]||=e=>q(a(P),`commit`)},[l(i,{name:a(K)===`commit`?`i-lucide-check`:`i-lucide-clipboard-copy`,class:`rule-btn-ic`},null,8,[`name`]),v(` `+c(a(K)===`commit`?`已复制`:`复制变更信息`),1)],2)):m(``,!0),!a(b)&&a(N).length?(s(),p(`button`,{key:1,class:`rule-btn s-commit`,title:`把这次交付整份提交进本地仓库:git add -A + git commit,不 push`,onClick:Kr},[l(i,{name:`i-lucide-git-commit-vertical`,class:`rule-btn-ic`}),r[32]||=v(`自动提交 `,-1)])):m(``,!0)]),a(N).length?(s(),p(`div`,Gt,[u(`table`,Kt,[r[36]||=u(`colgroup`,null,[u(`col`,{class:`c-ent`}),u(`col`,{class:`c-act`}),u(`col`),u(`col`,{class:`c-file`})],-1),r[37]||=u(`thead`,null,[u(`tr`,null,[u(`th`,null,`条目`),u(`th`,null,`变更`),u(`th`,null,`变更内容`),u(`th`,null,`涉及文件`)])],-1),u(`tbody`,null,[(s(!0),p(f,null,o(a(N),(e,t)=>(s(),p(`tr`,{key:`${e.kind}-${e.id}-${t}`},[u(`td`,null,[u(`div`,qt,[u(`div`,Jt,[u(`span`,{class:h([`kind`,`kind-${e.kind}`])},c(Nr[e.kind]??e.kind),3),l(ee,{to:`/story/${zr(e)}`,class:`ent-id mono`},{default:oe(()=>[v(c(e.id),1)]),_:2},1032,[`to`])]),e.title?(s(),p(`p`,Yt,c(e.title),1)):m(``,!0)])]),u(`td`,null,[u(`span`,{class:h([`act`,`act-${e.action}`])},c(Mr[e.action]??e.action),3),e.from||e.to?(s(),p(`p`,Xt,[u(`span`,Zt,c(e.from??`—`),1),r[35]||=u(`i`,null,`→`,-1),u(`span`,Qt,c(e.to??`—`),1)])):m(``,!0)]),u(`td`,$t,c(e.note??`—`),1),u(`td`,null,[u(`div`,en,[(s(!0),p(f,null,o(e.files,e=>(s(),p(`span`,{key:e,class:`fchip mono`,title:e},c(e),9,tn))),128)),e.files?.length?m(``,!0):(s(),p(`span`,nn,`—`))])])]))),128))])])])):(s(),p(`p`,Wt,`这次没有涉及任何故事或任务。`))]),u(`div`,rn,[u(`section`,an,[u(`div`,on,[u(`span`,sn,[l(i,{name:`i-lucide-sparkles`,class:`s-svg`})]),r[38]||=u(`h2`,{class:`s-title`},`额外做的事`,-1),u(`span`,cn,c(a(F).length),1)]),u(`div`,ln,[a(F).length?m(``,!0):(s(),p(`p`,un,`没有计划外的改动。`)),(s(!0),p(f,null,o(a(F),(e,t)=>(s(),p(`article`,{key:t,class:`x-item`},[r[39]||=u(`span`,{class:`x-mark`},null,-1),u(`div`,dn,[u(`p`,fn,c(e.title),1),e.detail?(s(),p(`p`,pn,c(e.detail),1)):m(``,!0),e.files?.length?(s(),p(`div`,mn,[(s(!0),p(f,null,o(e.files,e=>(s(),p(`span`,{key:e,class:`fchip mono`,title:e},c(e),9,hn))),128))])):m(``,!0)])]))),128))])]),u(`section`,gn,[u(`div`,_n,[u(`span`,vn,[l(i,{name:`i-lucide-badge-check`,class:`s-svg`})]),r[40]||=u(`h2`,{class:`s-title`},`验证结果`,-1),u(`span`,yn,c(a(U))+`/`+c(a(I).length),1)]),u(`div`,bn,[a(I).length?m(``,!0):(s(),p(`p`,xn,`这次没有留下验证记录。`)),(s(!0),p(f,null,o(a(I),(e,t)=>(s(),p(`div`,{key:t,class:`v-item`},[u(`span`,{class:h([`v-ic`,`v-${e.result}`])},[l(i,{name:Fr[e.result]??`i-lucide-circle`,class:`v-svg`},null,8,[`name`])],2),u(`div`,Sn,[u(`p`,Cn,c(e.what),1),e.detail?(s(),p(`p`,wn,c(e.detail),1)):m(``,!0)]),u(`span`,{class:h([`v-res`,`v-${e.result}`])},c(Pr[e.result]??e.result),3)]))),128))])])]),u(`div`,Tn,[u(`section`,En,[u(`div`,Dn,[u(`span`,On,[l(i,{name:`i-lucide-message-square-more`,class:`s-svg`})]),r[41]||=u(`h2`,{class:`s-title`},`说明`,-1),u(`span`,kn,c(a(z).length),1)]),u(`div`,An,[a(z).length?(s(),p(`ul`,Mn,[(s(!0),p(f,null,o(a(z),(e,t)=>(s(),p(`li`,{key:t},c(e),1))),128))])):(s(),p(`p`,jn,`没有额外说明。`))])]),a(B).length?(s(),p(`section`,Nn,[u(`div`,Pn,[u(`span`,Fn,[l(i,{name:`i-lucide-list-todo`,class:`s-svg`})]),r[42]||=u(`h2`,{class:`s-title`},`还没做的`,-1),u(`span`,In,c(a(B).length),1)]),u(`div`,Ln,[u(`ul`,Rn,[(s(!0),p(f,null,o(a(B),(e,t)=>(s(),p(`li`,{key:t},c(e),1))),128))])])])):m(``,!0)])])):(s(),p(`div`,Te,[u(`span`,Ee,[l(i,{name:`i-lucide-clipboard-list`,class:`em-svg`})]),r[10]||=ce(`<h2 class="em-title" data-v-b54cd3a2>还没有交付记录</h2><p class="em-sub" data-v-b54cd3a2> 每完成一项功能,AI 都要把「改了哪些故事与任务、额外做了什么、验了什么、怎么测」 写进下面这个文件,这一页就会自动排出来。 </p><p class="em-path mono" data-v-b54cd3a2>agile/last-change.json</p><p class="em-note" data-v-b54cd3a2> 每次只保留最近一次(覆盖写,不追加)· 格式见 <span class="mono" data-v-b54cd3a2>.agents/skills/scrum-planning/references/schema.md</span> 第 4 节 </p>`,4)])),(s(),d(se,{to:`body`},[a(w)?(s(),p(`div`,{key:0,class:`lc-hist-mask`,onClick:r[3]||=y(e=>w.value=!1,[`self`])},[u(`div`,zn,[u(`header`,Bn,[u(`div`,Vn,[r[46]||=u(`h3`,{id:`lc-hist-title`,class:`lc-hist-title`},`历史版本`,-1),u(`p`,Hn,[r[43]||=v(` 从 git 里读 `,-1),r[44]||=u(`span`,{class:`mono`},`agile/last-change.json`,-1),r[45]||=v(` 的提交记录 `,-1),a(C).length?(s(),p(f,{key:0},[v(`· 共 `+c(a(C).length)+` 版`,1)],64)):m(``,!0)])]),u(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,onClick:r[1]||=e=>w.value=!1},[l(i,{name:`i-lucide-x`,class:`lc-hist-x-ic`})])]),a(E)?(s(),p(`p`,Un,c(a(E)),1)):a(T)?(s(),p(`div`,Wn,`正在读 git 历史…`)):(s(),p(`div`,Gn,[(s(!0),p(f,null,o(a(C),(e,t)=>(s(),p(`button`,{key:e.hash,class:h([`hist-item`,{on:a(b)?.hash===e.hash}]),disabled:a(D),onClick:t=>Cr(e)},[u(`span`,{class:h([`hist-item-dot`,{live:t===0}])},null,2),u(`span`,qn,[u(`b`,null,c(e.subject||`(没有提交说明)`),1),u(`i`,Jn,c(e.date),1)]),u(`span`,Yn,c(e.short),1)],10,Kn))),128)),a(C).length?m(``,!0):(s(),p(`p`,Xn,` 这个文件还没有提交记录 —— 先 commit 一次,历史里才会出现版本。 `))])),u(`footer`,Zn,[r[47]||=u(`span`,{class:`dim`},`选一个版本即可在页面上只读查看,不会改动文件。`,-1),u(`button`,{class:`hist-close`,onClick:r[2]||=e=>w.value=!1},`关闭`)])])])):m(``,!0)])),(s(),d(se,{to:`body`},[a(J)?(s(),p(`div`,{key:0,class:`lc-hist-mask`,onClick:y($,[`self`])},[u(`div`,Qn,[u(`header`,$n,[r[48]||=u(`div`,{class:`lc-hist-hd-txt`},[u(`h3`,{id:`lc-commit-title`,class:`lc-hist-title`},`提交这次交付`),u(`p`,{class:`lc-hist-sub`},[v(` 将执行 `),u(`span`,{class:`mono`},`git add -A`),v(` + `),u(`span`,{class:`mono`},`git commit`),v(`,只提交到本地,不 push `)])],-1),u(`button`,{class:`lc-hist-x`,"aria-label":`关闭`,disabled:a(Y),onClick:$},[l(i,{name:`i-lucide-x`,class:`lc-hist-x-ic`})],8,er)]),a(Q)?(s(),p(`div`,tr,[u(`span`,nr,[l(i,{name:`i-lucide-check`,class:`cm-done-svg`})]),u(`div`,rr,[u(`p`,ir,[r[49]||=v(`已提交 `,-1),u(`span`,ar,c(a(Q).hash),1)]),u(`p`,or,c(a(Q).subject),1),u(`p`,sr,c(a(Q).files)+` 个文件 · 分支 `+c(a(Q).branch??`分离头指针`),1)])])):(s(),p(`div`,cr,[r[51]||=u(`p`,{class:`micro`},`提交信息`,-1),u(`pre`,lr,c(a(P)),1),u(`p`,ur,[r[50]||=v(` 将提交的文件`,-1),a(Z)?(s(),p(f,{key:0},[v(` · `+c(a(Z).files.length),1)],64)):m(``,!0)]),!a(Z)&&!a(X)?(s(),p(`p`,dr,`正在读 git 状态…`)):a(Z)&&!a(Z).isRepo?(s(),p(`p`,fr,`这个目录不是 git 仓库,没法自动提交。`)):a(Z)?.blocked?(s(),p(`p`,pr,c(a(Z).blocked),1)):a(Z)?.files.length?(s(),p(`ul`,hr,[(s(!0),p(f,null,o(a(Z).files,e=>(s(),p(`li`,{key:e.path,class:`cm-file`},[u(`span`,{class:h([`cm-code`,e.code===`??`?`cm-new`:`cm-mod`])},c(e.code),3),u(`span`,{class:`mono cm-path`,title:e.path},c(e.path),9,gr)]))),128))])):(s(),p(`p`,mr,`没有未提交的改动,不需要提交。`))])),a(X)?(s(),p(`p`,_r,c(a(X)),1)):m(``,!0),u(`footer`,vr,[u(`span`,yr,c(a(Z)?.branch?`当前分支 ${a(Z).branch}`:`提交后工作区应当是干净的`),1),u(`span`,br,[u(`button`,{class:`hist-close`,disabled:a(Y),onClick:$},c(a(Q)?`关闭`:`取消`),9,xr),a(Q)?m(``,!0):(s(),p(`button`,{key:0,class:`cm-go`,disabled:!a(Gr),onClick:qr},c(a(Y)?`提交中…`:`确认提交`),9,Sr))])])])])):m(``,!0)]))],64)}}}),[[`__scopeId`,`data-v-b54cd3a2`]]);export{A as default};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./I-sGtDIB.js","./BuBzMkFZ.js","./BxuBMtk_.js","./DK3Fl9T5.js","./CFCM18fF.js","./DxBwVNyP.js","./BygIGL69.js","./SywdkA98.js","./BW3xJdEx.js","./SrNUvNwO.js","./CI0scS-N.js","./P6qlvBHA.js","./CdPGFZyy.js","./DJM7u8P3.js","./DUgGsde6.js","./BrWE0up6.js","./BE6t7Q2m.js","./DqUSsCJ2.js","./q_8bxRMt.js","./DFQDFspC.js","./C9MgRdhu.js","./BQgzP7ur.js","./CgQ30j_6.js","./DzmVW5-D.js","./B0C2jsdk.js","./CYGiZn-X.js","./C3SpAhCW.js","./Cdf_T8Xa.js","./DV4ti-Pq.js","./CXG7GZes.js","./Dki9VkAL.js","./DLr85ebo.js","./Bubk0xn-.js","./entry.BBv-sBnP.css","./C1iO5KH3.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./I-sGtDIB.js","./BuBzMkFZ.js","./BxuBMtk_.js","./DK3Fl9T5.js","./CFCM18fF.js","./DxBwVNyP.js","./BygIGL69.js","./SywdkA98.js","./BW3xJdEx.js","./SrNUvNwO.js","./CI0scS-N.js","./P6qlvBHA.js","./CdPGFZyy.js","./DJM7u8P3.js","./DUgGsde6.js","./BrWE0up6.js","./BE6t7Q2m.js","./DqUSsCJ2.js","./q_8bxRMt.js","./DFQDFspC.js","./C9MgRdhu.js","./BQgzP7ur.js","./CgQ30j_6.js","./DzmVW5-D.js","./B0C2jsdk.js","./CYGiZn-X.js","./C3SpAhCW.js","./Cdf_T8Xa.js","./DV4ti-Pq.js","./CXG7GZes.js","./Dki9VkAL.js","./DLr85ebo.js","./Bubk0xn-.js","./entry.Birf8F5Z.css","./C1iO5KH3.js"])))=>i.map(i=>d[i]);
2
2
  import{t as e}from"./DK3Fl9T5.js";import{t}from"./P6qlvBHA.js";import{b as n,o as r,v as i,y as a}from"./CFCM18fF.js";import{C as o,E as s,Et as c,S as l,at as u,et as d,gt as f,u as p,x as m}from"./BxuBMtk_.js";import{t as h}from"./CdPGFZyy.js";import"./SrNUvNwO.js";import{n as g,t as _}from"./Bubk0xn-.js";var v=`modulepreload`,y=function(e,t){return new URL(e,t).href},b={},x=function(e){return e.pathname.endsWith(`.css`)},S=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},C=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=y(t,n);let r=s(t),i=x(r);return S(b,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:v,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},w=n({docsBase:i,reporters:a}),T=`$s`;function E(...e){let t=typeof e[e.length-1]==`string`?e.pop():void 0;typeof e[0]!=`string`&&e.unshift(t);let[n,i]=e;if(!n||typeof n!=`string`)throw w.NUXT_E7009({key:n});if(i!==void 0&&typeof i!=`function`)throw w.NUXT_E7007({type:typeof i});let a=T+n,o=r(),s=c(o.payload.state,a);if(i&&(o._state[a]??={_default:i}),s.value===void 0&&i){let e=i();if(f(e))return o.payload.state[a]=e,s;s.value=e}return s}function D(e){let t=e.length,n=0,r=0,i=8997,a=0,o=33826,s=0,c=40164,l=0,u=52210;for(;n<t;)i^=e.charCodeAt(n++),r=i*435,a=o*435,s=c*435,l=u*435,s+=i<<8,l+=o<<8,a+=r>>>16,i=r&65535,s+=a>>>16,o=a&65535,u=l+(s>>>16)&65535,c=s&65535;return{high:(u<<16|c)>>>0,low:(o<<16|i)>>>0}}function O(e){let{high:t,low:n}=D(e);return BigInt(t)<<32n|BigInt(n)}var k=`0123456789abcdef`;Array.from({length:256},(e,t)=>k.charAt(t>>4)+k.charAt(t&15));function A(e){return O(e).toString(36)}var j=new Map;function M(e){let t=e();if(typeof t==`function`){let e=d(),n=E(`nuxt-icon-customize`,()=>({})),r=A(t.toString());o()?.vnode.el&&n.value[e]&&j.set(r,n.value[e])}return p(()=>{let t=e();if(typeof t!=`function`)return;let n=A(t.toString());return j.get(n)||n})}function N(e){return e.replace(/([^\w-])/g,`\\$1`)}function P(e){return e.replace(/[\\^$.*+?()[\]{}|]/g,`\\$&`)}function F(e,t,n){let r=`\\.${P(N(t))}(?:[\\w-]|\\\\.)*`,i=RegExp(`(?:^|[{};])\\s*(?::where\\((${r})\\)|(${r}))\\s*\\{`,`g`);for(let t of e.querySelectorAll(`style`)){let e=(t.textContent||``).replace(/\/\*[\s\S]*?\*\//g,``);for(let t of e.matchAll(i))n.add(t[1]||t[2])}}function I(e,t){let n=e=>{if(e=e.replace(/^:where\((.*)\)$/,`$1`).trim(),e.startsWith(`.`))return e},r=e=>{if(e?.length)for(let i of e){i?.cssRules&&r(i.cssRules);let e=i?.selectorText;if(typeof e==`string`){let r=n(e);r&&t.add(r)}}};for(let t of e.styleSheets)try{r(t.cssRules||t.rules)}catch{}}function L(e,t=globalThis.document){let n=new Set,r;return t&&F(t,e,n),{has(e){return n.has(e)?!0:(r||(r=new Set,t&&I(t,r)),r.has(e))},add(e){n.add(e)}}}function R(e,t,n){if(n){t.appendChild(e);return}let r=t.querySelector(`style, link[rel="stylesheet"]`);r?t.insertBefore(e,r):t.appendChild(e)}var z;function B(){return z?Promise.resolve(z):C(()=>import(`./I-sGtDIB.js`).then(e=>z=e),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33]),import.meta.url)}var V,H=l({name:`NuxtIconCss`,props:{name:{type:String,required:!0},customize:{type:[Function,Boolean,null],default:null,required:!1}},setup(e){let n=r(),i=t().icon,a=M(()=>e.customize),o=p(()=>{if(!e.name)return``;let t=i.cssSelectorPrefix+e.name;return a.value?t+`--customized-`+a.value:t});function c(e,t){if(!t)return;let r=e.getIcon(t);if(r)return r;let i=n.payload?.data?.[t];if(i)return e.addIcon(t,i),i}let l=p(()=>`.`+N(o.value));function d(t,n,r=!0,a=l.value){i.cssWherePseudo&&(a=`:where(${a})`);let o=t.getCachedIconCSS(n,a,_(e.customize,i.customize));return i.cssLayer&&r?`@layer ${i.cssLayer} { ${o} }`:o}{let t=V||=L(i.cssSelectorPrefix);async function n(e,n,r,a){if(t.has(a)||typeof document>`u`)return;let o=document.createElement(`style`);o.textContent=d(e,n,!0,a),R(o,document.head,i.cssLayer),t.add(a)}u(()=>e.name,e=>{let r=l.value;if(t.has(r))return;let i=t=>{let i=c(t,e);i?n(t,i,e,r):t.loadIcon(e,-1).then(i=>{i&&n(t,i,e,r)}).catch(()=>null)};z?i(z):B().then(i).catch(()=>null)},{immediate:!0})}return h(),()=>s(`span`,{class:[`iconify`,o.value]})}}),U=m(()=>C(()=>import(`./C1iO5KH3.js`).then(e=>e.NuxtIconSvg),__vite__mapDeps([34,12,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,1,33]),import.meta.url)),W=e({default:()=>G}),G=l({name:`NuxtIcon`,props:{name:{type:String,required:!0},mode:{type:String,required:!1,default:null},size:{type:[Number,String],required:!1,default:null},customize:{type:[Function,Boolean,null],default:null,required:!1}},setup(e,{slots:n}){let i=r(),a=t().icon,o=g(()=>e.name),c=p(()=>i.vueApp?.component(o.value)||((e.mode||a.mode)===`svg`?U:H)),l=p(()=>{let t=e.size||a.size;return t?{fontSize:Number.isNaN(+t)?t:t+`px`}:null});return()=>s(c.value,{...a.attrs,name:o.value,class:a.class,style:l.value,customize:e.customize},n)}});export{C as a,E as i,W as n,A as r,G as t};