diff --git a/AGENTS.md b/AGENTS.md index 03c4360..03f3387 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,7 +16,7 @@ - 状态管理使用 Pinia。 - 路由使用 Vue Router。 - 请求封装使用 Axios,并集中在 `src/services/**`。 -- BPMN 展示使用 `bpmn-js`,不手写替代渲染器。 +- 发布流程展示以后端 `run.steps` 为准,前端只展示步骤状态、节点详情和日志,不维护流程图 XML 渲染器。 - 不新增前端 mock 数据或接口失败降级;项目、发布、refs、流程和 Agent 调用统一走后端 API。 ## API 与安全边界 @@ -25,9 +25,9 @@ - 前端不得直接调用 Jenkins、Gitea、企微、飞书或模型供应商;统一通过后端 API。 - API 契约以 `/Users/mac033/Desktop/my-project/devops-platform-docs/devops-platform-implementation-tracker.md` 和后端 OpenAPI 为准。 -## BPMN 与 Agent 边界 +## 发布流程与 Agent 边界 -- BPMN 组件只展示流程图、节点状态和节点详情,不推进状态机。 -- `step.bpmnNodeId` 必须与 BPMN XML 节点 id 一致。 +- 发布步骤组件只展示后端步骤、节点状态和节点详情,不推进状态机。 +- 后端返回的节点标识在前端统一映射为 `step.nodeId`,仅用于展示和定位步骤。 - Agent 只能作为全局右侧抽屉工具存在,不作为独立侧边栏路由;能力只允许 DevOps 场景:发布风险摘要、失败诊断、Runbook 问答、发布说明草稿和事故复盘草稿。 - 禁止在前端新增泛聊天入口。 diff --git a/README.md b/README.md index fcb9395..9ac0f8e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DevOps 运维平台前端 -Vue 3 + Vite + TypeScript 实现的 DevOps 运维控制台第一阶段,用于管理本地项目和 DevOps 平台自身的发布状态、Jenkins/Gitea/通知平台/LLM 接入状态、BPMN 流程展示和 Agent 辅助能力。 +Vue 3 + Vite + TypeScript 实现的 DevOps 运维控制台第一阶段,用于管理本地项目和 DevOps 平台自身的发布状态、Jenkins/Gitea/通知平台/LLM 接入状态、发布步骤轨迹和 Agent 辅助能力。 ## 当前范围 @@ -12,7 +12,7 @@ Vue 3 + Vite + TypeScript 实现的 DevOps 运维控制台第一阶段,用于 - 发布中心包含项目、环境、后端返回的 ref/tag、备注、发布前检查、生产发布回滚/窗口/通知确认、触发、取消、重试和 Jenkins 状态同步入口。 - 运行记录展示状态概览、项目/环境/状态/关键词筛选、Jenkins queue/build、Build URL、开始/结束时间、执行提示、失败摘要和日志摘要,并提供超级管理员导入 Jenkins 直接构建记录的入口。 - 系统配置页展示集成配置、Agent 密钥状态、通知 outbox 和审计日志概览,支持通知投递与审计记录筛选,用于定位配置缺失、通知失败和敏感操作。 -- BPMN 状态区使用后端流程 XML 和 run steps 作为状态来源,左侧展示节点输出或 Jenkins 构建日志,右侧粘性展示进度统计、节点时间线和详情面板。 +- 发布步骤轨迹区使用后端 run steps 作为状态来源,左侧展示节点输出或 Jenkins 构建日志,右侧粘性展示进度统计、节点时间线和详情面板。 - Agent 作为全局工具从顶部打开,只包含发布风险摘要、失败诊断、Runbook 问答、发布说明草稿和事故复盘草稿,并通过后端 Agent API 创建调用记录。 ## 技术栈 @@ -24,7 +24,6 @@ Vue 3 + Vite + TypeScript 实现的 DevOps 运维控制台第一阶段,用于 - Pinia - Vue Router - Axios -- bpmn-js ## 本地启动 @@ -54,10 +53,10 @@ pnpm build - 通知 webhook - LLM API key/baseURL/model -## BPMN 边界 +## 发布步骤边界 -- 前端只负责 BPMN XML 展示和节点状态高亮。 -- `run.steps[].bpmnNodeId` 必须与 BPMN XML 节点 id 一致。 +- 前端只负责后端 `run.steps` 的状态、节点详情和日志展示,不渲染流程图 XML。 +- 后端返回的节点标识在前端统一映射为 `run.steps[].nodeId`,用于步骤选择、详情定位和日志联动。 - 流程推进、失败停留、审计日志和状态机由后端负责。 ## Agent 边界 diff --git a/RTK.md b/RTK.md index 5189370..527cafd 100644 --- a/RTK.md +++ b/RTK.md @@ -19,8 +19,8 @@ - `/overview`:总览,展示值班焦点、优先 Run 队列、项目发布健康、服务状态和项目环境快捷入口。 - `/projects`:项目配置,展示项目可发布性概览、发布态/权限筛选、Gitea 仓库、Jenkins Job、通知通道、环境策略和上下文跳转。 - `/members`:成员权限,仅超级管理员可见,展示账号/构建权限/安全状态概览,支持成员筛选,并维护普通成员、项目权限和密码重置消息。 -- `/releases`:发布中心,提供发布参数、后端 ref/tag 选择、发布前检查、生产发布确认、触发、取消、重试和 BPMN 流程状态。 -- `/runs`:运行记录,展示 run 状态概览、筛选列表、执行详情、流程轨迹,并支持超级管理员导入 Jenkins 直接构建记录。 +- `/releases`:发布中心,提供发布参数、后端 ref/tag 选择、发布前检查、生产发布确认、触发、取消、重试和发布步骤轨迹。 +- `/runs`:运行记录,展示 run 状态概览、筛选列表、执行详情、步骤轨迹,并支持超级管理员导入 Jenkins 直接构建记录。 - 顶部 Agent 按钮:打开全局右侧抽屉,只保留 DevOps 场景能力;`/agent` 仅重定向到总览,不作为独立侧边栏入口。 - `/settings`:系统配置,展示集成配置、Agent、通知 outbox 和审计日志概览,支持通知/审计筛选,并维护后端 Agent 模型配置。 @@ -37,7 +37,7 @@ - 发布中心触发按钮接入后端发布单创建接口。 - 运行记录接入后端 run/step 查询接口。 - Jenkins 直接构建不由前端直连 Jenkins;运行记录页调用后端 `/deploy-runs/import-jenkins` 扫描已纳管 job 并导入 run。 -- BPMN XML 由后端流程定义接口返回。 +- 发布步骤轨迹以后端 run steps 为准,前端不再拉取或渲染流程图 XML。 - Agent 面板调用后端 Agent proxy,前端只传 DevOps 场景参数。 - Agent 配置页调用后端 `/agent/config`,前端不持久化 key、baseURL 或 model。 - Agent 能力限定为发布风险摘要、失败诊断、Runbook 问答、发布说明草稿和事故复盘草稿。 diff --git a/package.json b/package.json index 1f6f586..cd71752 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.2", "axios": "^1.17.0", - "bpmn-js": "^18.18.0", "element-plus": "^2.14.1", "pinia": "^3.0.4", "vue": "^3.5.34", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eecc278..e40b5ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ importers: axios: specifier: ^1.17.0 version: 1.17.0 - bpmn-js: - specifier: ^18.18.0 - version: 18.18.0 element-plus: specifier: ^2.14.1 version: 2.14.1(vue@3.5.38(typescript@6.0.3)) @@ -89,9 +86,6 @@ packages: resolution: {integrity: sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==} engines: {node: ^22.18.0 || >=24.11.0} - '@bpmn-io/diagram-js-ui@0.2.4': - resolution: {integrity: sha512-I678ZGtoH7z7FgzFhzzppM9ThsJ3Lh83kW3GjhjG3xyYciIPYHMaHK1MABP8F69H9pFZpViM6t4qUo8dwrVz0w==} - '@ctrl/tinycolor@4.2.0': resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} engines: {node: '>=14'} @@ -388,13 +382,6 @@ packages: birpc@2.9.0: resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} - bpmn-js@18.18.0: - resolution: {integrity: sha512-3pTiqc5M+CRtXCvBjRBFEewqNKDnx0ytuCLucvMRfdhes/EuVr4memcsi6ql+q/1RUbycOL9MyfNcgrwSfnA1w==} - - bpmn-moddle@10.0.0: - resolution: {integrity: sha512-vXePD5jkatcILmM3zwJG/m6IIHIghTGB7WvgcdEraEw8E8VdJHrTgrvBUhbzqaXJpnsGQz15QS936xeBY6l9aA==} - engines: {node: '>= 20.12'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -403,10 +390,6 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -444,22 +427,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - diagram-js-direct-editing@3.4.0: - resolution: {integrity: sha512-eXfd+nxJr5xt3YlCrs+E53mPi+gqBWRBkAXkR99ZPL7Pl0B3H5nkv/uiwx4Q4vJU/Sp8Jy3zVdhP/Y2c6loTjw==} - peerDependencies: - diagram-js: '*' - - diagram-js@15.17.0: - resolution: {integrity: sha512-wOlnfzd7MmcUMwIpJiCiFScQ04hQMx4Ribir0ky4cfNgzwr7V1dhi7MdFuLyaMdseglMkBU7YYoqmzCDR8+JCw==} - - didi@11.0.0: - resolution: {integrity: sha512-PzCfRzQttvFpVcYMbSF7h8EsWjeJpVjWH4qDhB5LkMi1ILvHq4Ob0vhM2wLFziPkbUBi+PAo7ODbe2sacR7nJQ==} - engines: {node: '>= 20.12'} - - domify@3.0.0: - resolution: {integrity: sha512-bs2yO68JDFOm6rKv8f0EnrM2cENduhRkpqOtt/s5l5JBA/eqGBZCzLPmdYoHtJ6utgLGgcBajFsEQbl12pT0lQ==} - engines: {node: '>=20'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -552,20 +519,10 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - htm@3.1.1: - resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - ids@3.0.2: - resolution: {integrity: sha512-t6YJP4mdC+GHF96Nbis/4FEANhP/8VWmYMvUuYpXvSdrhg5hpIVbq2XZlOA3UWTbtdwPCi0q7jEXOdHkAnqOnw==} - engines: {node: '>= 20.12'} - - inherits-browser@0.1.0: - resolution: {integrity: sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==} - is-what@5.5.0: resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} engines: {node: '>=18'} @@ -689,27 +646,12 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - min-dash@5.0.0: - resolution: {integrity: sha512-EGuoBnVL7/Fnv2sqakpX5WGmZehZ3YMmLayT7sM8E9DRU74kkeyMg4Rik1lsOkR2GbFNeBca4/L+UfU6gF0Edw==} - - min-dom@5.3.0: - resolution: {integrity: sha512-0w5FEBgPAyHhmFojW3zxd7we3D+m5XYS3E/06OyvxmbHJoiQVa4Nagj6RWvoAKYRw5xth6cP5TMePc5cR1M9hA==} - mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - moddle-xml@12.0.0: - resolution: {integrity: sha512-NJc2+sCe4tvuGlaUBcoZcYf6j9f+z+qxHOyGm/LB3ZrlJXVPPHoBTg/KXgDRCufdBJhJ3AheFs3QU/abABNzRg==} - engines: {node: '>= 18'} - peerDependencies: - moddle: '>= 6.2.0' - - moddle@8.1.0: - resolution: {integrity: sha512-dBddc1CNuZHgro8nQWwfPZ2BkyLWdnxoNpPu9d+XKPN96DAiiBOeBw527ft++ebDuFez5PMdaR3pgUgoOaUGrA==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -724,16 +666,9 @@ packages: normalize-wheel-es@1.2.0: resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} - object-refs@0.4.0: - resolution: {integrity: sha512-6kJqKWryKZmtte6QYvouas0/EIJKPI1/MMIuRsiBlNuhIMfqYTggzX2F1AJ2+cDs288xyi9GL7FyasHINR98BQ==} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-intersection@4.1.0: - resolution: {integrity: sha512-urUP6WvhnxbHPdHYl6L7Yrc6+1ny6uOFKPCzPxTSUSYGHG0o94RmI7SvMMaScNAM5RtTf08bg4skc6/kjfne3A==} - engines: {node: '>= 14.20'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -769,9 +704,6 @@ packages: resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} - preact@10.29.2: - resolution: {integrity: sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==} - proxy-from-env@2.1.0: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} @@ -791,10 +723,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - saxen@11.0.2: - resolution: {integrity: sha512-WDb4gqac8uiJzOdOdVpr9NWh9NrJMm7Brn5GX2Poj+mjE/QTXqYQENr8T/mom54dDDgbd3QjwTg23TRHYiWXRA==} - engines: {node: '>= 20.12'} - scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} @@ -810,10 +738,6 @@ packages: resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} engines: {node: '>=16'} - tiny-svg@4.1.4: - resolution: {integrity: sha512-cBaEACCbouYrQc9RG+eTXnPYosX1Ijqty/I6DdXovwDd89Pwu4jcmpOR7BuFEF9YCcd7/AWwasE0207WMK7hdw==} - engines: {node: '>= 20'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -966,11 +890,6 @@ snapshots: '@babel/helper-string-parser': 8.0.0-rc.6 '@babel/helper-validator-identifier': 8.0.0-rc.6 - '@bpmn-io/diagram-js-ui@0.2.4': - dependencies: - htm: 3.1.1 - preact: 10.29.2 - '@ctrl/tinycolor@4.2.0': {} '@element-plus/icons-vue@2.3.2(vue@3.5.38(typescript@6.0.3))': @@ -1282,23 +1201,6 @@ snapshots: birpc@2.9.0: {} - bpmn-js@18.18.0: - dependencies: - bpmn-moddle: 10.0.0 - diagram-js: 15.17.0 - diagram-js-direct-editing: 3.4.0(diagram-js@15.17.0) - ids: 3.0.2 - inherits-browser: 0.1.0 - min-dash: 5.0.0 - min-dom: 5.3.0 - tiny-svg: 4.1.4 - - bpmn-moddle@10.0.0: - dependencies: - min-dash: 5.0.0 - moddle: 8.1.0 - moddle-xml: 12.0.0(moddle@8.1.0) - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -1308,8 +1210,6 @@ snapshots: dependencies: readdirp: 5.0.0 - clsx@2.1.1: {} - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -1334,28 +1234,6 @@ snapshots: detect-libc@2.1.2: {} - diagram-js-direct-editing@3.4.0(diagram-js@15.17.0): - dependencies: - diagram-js: 15.17.0 - min-dash: 5.0.0 - min-dom: 5.3.0 - - diagram-js@15.17.0: - dependencies: - '@bpmn-io/diagram-js-ui': 0.2.4 - clsx: 2.1.1 - didi: 11.0.0 - inherits-browser: 0.1.0 - min-dash: 5.0.0 - min-dom: 5.3.0 - object-refs: 0.4.0 - path-intersection: 4.1.0 - tiny-svg: 4.1.4 - - didi@11.0.0: {} - - domify@3.0.0: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -1453,8 +1331,6 @@ snapshots: hookable@5.5.3: {} - htm@3.1.1: {} - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -1462,10 +1338,6 @@ snapshots: transitivePeerDependencies: - supports-color - ids@3.0.2: {} - - inherits-browser@0.1.0: {} - is-what@5.5.0: {} jsesc@3.1.0: {} @@ -1555,13 +1427,6 @@ snapshots: dependencies: mime-db: 1.52.0 - min-dash@5.0.0: {} - - min-dom@5.3.0: - dependencies: - domify: 3.0.0 - min-dash: 5.0.0 - mitt@3.0.1: {} mlly@1.8.2: @@ -1571,16 +1436,6 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.4 - moddle-xml@12.0.0(moddle@8.1.0): - dependencies: - min-dash: 5.0.0 - moddle: 8.1.0 - saxen: 11.0.2 - - moddle@8.1.0: - dependencies: - min-dash: 5.0.0 - ms@2.1.3: {} muggle-string@0.4.1: {} @@ -1589,12 +1444,8 @@ snapshots: normalize-wheel-es@1.2.0: {} - object-refs@0.4.0: {} - path-browserify@1.0.1: {} - path-intersection@4.1.0: {} - pathe@2.0.3: {} perfect-debounce@1.0.0: {} @@ -1630,8 +1481,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.29.2: {} - proxy-from-env@2.1.0: {} quansync@0.2.11: {} @@ -1661,8 +1510,6 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.3 '@rolldown/binding-win32-x64-msvc': 1.0.3 - saxen@11.0.2: {} - scule@1.3.0: {} source-map-js@1.2.1: {} @@ -1673,8 +1520,6 @@ snapshots: dependencies: copy-anything: 4.0.5 - tiny-svg@4.1.4: {} - tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.4) diff --git a/src/components/BpmnStatusViewer.vue b/src/components/PipelineStatusViewer.vue similarity index 95% rename from src/components/BpmnStatusViewer.vue rename to src/components/PipelineStatusViewer.vue index c1688e4..f7dd1cd 100644 --- a/src/components/BpmnStatusViewer.vue +++ b/src/components/PipelineStatusViewer.vue @@ -7,7 +7,6 @@ import type { JenkinsBuildLog, PipelineStep, ReleaseRun, StepStatus } from '../t import StatusPill from './StatusPill.vue' const props = defineProps<{ - xml: string steps: PipelineStep[] run?: ReleaseRun }>() @@ -22,7 +21,7 @@ type StatusMeta = { type OutputMode = 'step' | 'jenkins' const maxRenderedLogLines = 520 -const selectedNodeId = ref('') +const selectedStepNodeId = ref('') const terminalOutputEl = ref() const outputMode = ref('step') const logLoading = ref(false) @@ -104,11 +103,11 @@ const currentStep = computed(() => { }) const selectedStep = computed(() => { - if (!selectedNodeId.value) { + if (!selectedStepNodeId.value) { return currentStep.value } - return findStep(selectedNodeId.value) ?? currentStep.value + return findStep(selectedStepNodeId.value) ?? currentStep.value }) const stepStats = computed(() => { @@ -140,8 +139,6 @@ const isActiveRun = computed( () => props.run?.status === 'queued' || props.run?.status === 'running', ) -const processSourceText = computed(() => (props.xml ? 'BPMN XML 已加载' : '等待 BPMN XML')) - const terminalTitle = computed(() => { if (outputMode.value === 'jenkins') { return hasJenkinsBuildNumber.value @@ -160,14 +157,14 @@ const terminalSubtitle = computed(() => { const buildText = hasJenkinsBuildNumber.value ? `Build #${props.run?.jenkinsBuildNumber}` : '' const queueText = props.run?.jenkinsQueueId ? `Queue ${props.run.jenkinsQueueId}` : '' - return [buildText, queueText, processSourceText.value].filter(Boolean).join(' · ') + return [buildText, queueText].filter(Boolean).join(' · ') || '等待 Jenkins 日志来源' } if (!selectedStep.value) { - return processSourceText.value + return '等待后端步骤' } - return `${selectedStep.value.owner} · ${selectedStep.value.bpmnNodeId}` + return `${selectedStep.value.owner} · 节点 ${selectedStep.value.nodeId}` }) const logRefreshStateText = computed(() => { @@ -193,7 +190,7 @@ const stepOutputText = computed(() => { `# ${step.name}`, `owner=${step.owner}`, `status=${statusMeta[step.status].label}`, - `bpmnNodeId=${step.bpmnNodeId}`, + `nodeId=${step.nodeId}`, `duration=${step.duration}`, step.startedAt ? `startedAt=${step.startedAt}` : '', step.finishedAt ? `finishedAt=${step.finishedAt}` : '', @@ -238,7 +235,7 @@ const terminalEmptyHint = computed(() => { }) function findStep(nodeId: string) { - return props.steps.find((step) => step.bpmnNodeId === nodeId) + return props.steps.find((step) => step.nodeId === nodeId) } function statusClass(status: StepStatus): string { @@ -246,11 +243,11 @@ function statusClass(status: StepStatus): string { } function isSelectedStep(step: PipelineStep): boolean { - return selectedStep.value?.bpmnNodeId === step.bpmnNodeId + return selectedStep.value?.nodeId === step.nodeId } function selectStep(step: PipelineStep) { - selectedNodeId.value = step.bpmnNodeId + selectedStepNodeId.value = step.nodeId if (step.owner === 'Jenkins') { outputMode.value = 'jenkins' @@ -401,7 +398,7 @@ watch( watch( () => `${props.run?.id ?? 'none'}:${currentStep.value?.id ?? 'none'}:${currentStep.value?.status ?? 'none'}`, () => { - if (selectedNodeId.value || currentStep.value?.owner !== 'Jenkins') { + if (selectedStepNodeId.value || currentStep.value?.owner !== 'Jenkins') { return } @@ -430,7 +427,7 @@ onBeforeUnmount(() => {