@agile-team/wl-skills-gate 0.6.1 → 0.9.1

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 (173) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +101 -54
  3. package/assets/brand-tokens.json +162 -0
  4. package/assets/wl-bd-logo-dark.svg +29 -0
  5. package/assets/wl-bd-logo.svg +29 -0
  6. package/assets/wl-brand-lockup-dark.svg +1 -0
  7. package/assets/wl-brand-lockup.svg +1 -0
  8. package/assets/wl-design-logo-dark.svg +29 -0
  9. package/assets/wl-design-logo.svg +29 -0
  10. package/assets/wl-gate-logo-dark.svg +29 -0
  11. package/assets/wl-gate-logo.svg +29 -0
  12. package/assets/wl-kit-logo-dark.svg +29 -0
  13. package/assets/wl-kit-logo.svg +29 -0
  14. package/assets/wl-mark-small.svg +3 -0
  15. package/assets/wl-mark.svg +3 -0
  16. package/assets/wl-test-logo-dark.svg +29 -0
  17. package/assets/wl-test-logo.svg +29 -0
  18. package/assets/wl-ui-logo-dark.svg +29 -0
  19. package/assets/wl-ui-logo.svg +29 -0
  20. package/assets/wl-wordmark-dark.svg +5 -0
  21. package/assets/wl-wordmark.svg +5 -0
  22. package/bin/wl-skills-gate.js +180 -8
  23. package/docs/01-quick-start.md +2 -2
  24. package/docs/02-config.md +7 -3
  25. package/docs/05-adapters.md +12 -2
  26. package/docs/06-gitlab.md +7 -5
  27. package/docs/09-selftest-coverage.md +4 -2
  28. package/docs/10-enforcement.md +2 -2
  29. package/docs/13-quality-cost-and-isolation.md +6 -6
  30. package/docs/14-low-token-execution.md +8 -8
  31. package/docs/15-java-report-triage.md +1 -1
  32. package/docs/16-project-ci-integration.md +64 -0
  33. package/docs/17-onboarding.md +75 -0
  34. package/docs/18-ci-source.md +42 -0
  35. package/docs/19-nine-dimension-review.md +105 -0
  36. package/docs/README.md +14 -8
  37. package/fixtures/onboarding/README.md +3 -0
  38. package/fixtures/onboarding/quality-audit-profile.xml +51 -0
  39. package/fixtures/onboarding/quality-unit-profile.xml +101 -0
  40. package/lib/adapters/cmd-json.js +12 -10
  41. package/lib/adapters/java-xml.js +3 -2
  42. package/lib/adapters/junit.js +78 -13
  43. package/lib/adapters/raw-json.js +4 -3
  44. package/lib/adapters/sarif.js +3 -3
  45. package/lib/automation.js +247 -0
  46. package/lib/ci-discovery.js +227 -0
  47. package/lib/ci-source.js +203 -0
  48. package/lib/config.js +7 -4
  49. package/lib/control-deployment.js +44 -0
  50. package/lib/control-service.js +244 -0
  51. package/lib/control-store.js +120 -0
  52. package/lib/deployment-delivery.js +89 -0
  53. package/lib/deployment-queue.js +101 -0
  54. package/lib/deployment.js +217 -0
  55. package/lib/doctor.js +110 -0
  56. package/lib/evidence.js +59 -7
  57. package/lib/fix.js +61 -9
  58. package/lib/governance-notifications.js +45 -0
  59. package/lib/governance.js +521 -0
  60. package/lib/identity.js +49 -0
  61. package/lib/lifecycle-source.js +161 -0
  62. package/lib/onboard-complete.js +333 -0
  63. package/lib/onboard-config.js +556 -0
  64. package/lib/onboard-environment.js +37 -0
  65. package/lib/onboard-legacy.js +43 -0
  66. package/lib/onboard-lifecycle.js +117 -0
  67. package/lib/onboard-registry.js +93 -0
  68. package/lib/onboard.js +118 -0
  69. package/lib/promote.js +17 -5
  70. package/lib/release-set.js +138 -0
  71. package/lib/report-input.js +22 -8
  72. package/lib/report-producers.js +37 -19
  73. package/lib/report-selection.js +136 -0
  74. package/lib/review-additions.js +159 -0
  75. package/lib/review-auto.js +75 -0
  76. package/lib/review-ci.js +119 -0
  77. package/lib/review-collect.js +146 -0
  78. package/lib/review-facts.js +160 -0
  79. package/lib/review-live.js +30 -0
  80. package/lib/review-publication.js +85 -0
  81. package/lib/review-publish.js +191 -0
  82. package/lib/review.js +376 -0
  83. package/lib/run.js +28 -5
  84. package/lib/yaml-lite.js +5 -0
  85. package/package.json +6 -4
  86. package/schemas/quality-summary.schema.json +22 -0
  87. package/scripts/lib-tests/automation.test.mjs +126 -0
  88. package/scripts/lib-tests/ci-discovery.test.mjs +123 -0
  89. package/scripts/lib-tests/ci-source.test.mjs +153 -0
  90. package/scripts/lib-tests/control-review.test.mjs +110 -0
  91. package/scripts/lib-tests/control-service.test.mjs +88 -0
  92. package/scripts/lib-tests/control-store.test.mjs +77 -0
  93. package/scripts/lib-tests/deployment-http.test.mjs +66 -0
  94. package/scripts/lib-tests/deployment.test.mjs +250 -0
  95. package/scripts/lib-tests/doctor.test.mjs +106 -0
  96. package/scripts/lib-tests/fix-state.test.mjs +55 -0
  97. package/scripts/lib-tests/governance-lifecycle.test.mjs +131 -0
  98. package/scripts/lib-tests/governance.test.mjs +240 -0
  99. package/scripts/lib-tests/java-unit-wrapper.test.mjs +107 -0
  100. package/scripts/lib-tests/junit-evidence.test.mjs +214 -0
  101. package/scripts/lib-tests/lifecycle-source.test.mjs +135 -0
  102. package/scripts/lib-tests/onboard-complete.test.mjs +324 -0
  103. package/scripts/lib-tests/onboard-registry.test.mjs +51 -0
  104. package/scripts/lib-tests/onboard-review-facts.test.mjs +89 -0
  105. package/scripts/lib-tests/onboard.test.mjs +180 -0
  106. package/scripts/lib-tests/review-additions.test.mjs +98 -0
  107. package/scripts/lib-tests/review-auto.test.mjs +94 -0
  108. package/scripts/lib-tests/review-ci.test.mjs +72 -0
  109. package/scripts/lib-tests/review-collect.test.mjs +61 -0
  110. package/scripts/lib-tests/review-facts.test.mjs +44 -0
  111. package/scripts/lib-tests/review-publication.test.mjs +47 -0
  112. package/scripts/lib-tests/review-publish.test.mjs +89 -0
  113. package/scripts/lib-tests/review.test.mjs +212 -0
  114. package/scripts/lib-tests/yaml-lite.test.mjs +21 -0
  115. package/scripts/run-integration.mjs +49 -7
  116. package/scripts/test-support/control-review-fixture.mjs +57 -0
  117. package/scripts/test-support/review-collect-fixture.mjs +47 -0
  118. package/templates/ci/Jenkinsfile +58 -0
  119. package/templates/ci/Jenkinsfile.attest +32 -0
  120. package/templates/ci/Jenkinsfile.automation +20 -0
  121. package/templates/ci/Jenkinsfile.deployment +78 -0
  122. package/templates/ci/Jenkinsfile.release-sign +26 -0
  123. package/templates/ci/Jenkinsfile.review-sign +30 -0
  124. package/templates/ci/central-review.sh +10 -0
  125. package/templates/ci/controlled-deployment-http.mjs +72 -0
  126. package/templates/ci/create-deployment-facts.mjs +7 -0
  127. package/templates/ci/deployment-http.json +14 -0
  128. package/templates/ci/gitlab-backend.yml +40 -0
  129. package/templates/ci/gitlab-frontend.yml +32 -0
  130. package/templates/ci/produce-review-facts.mjs +15 -0
  131. package/templates/ci/publish-reviews.mjs +5 -0
  132. package/templates/ci/sign-collected-release.mjs +7 -0
  133. package/templates/ci/wl-quality-automation.service +18 -0
  134. package/templates/ci/wl-quality-control.service +18 -0
  135. package/templates/onboarding/automation/ide-tasks.json +31 -0
  136. package/templates/onboarding/automation/project-actions.mjs +266 -0
  137. package/templates/onboarding/backend/java-unit.mjs +84 -0
  138. package/templates/onboarding/backend/java-unit.plan.json +15 -0
  139. package/templates/onboarding/backend/policy.yml +63 -0
  140. package/templates/onboarding/backend/quality-tools.package.json +9 -0
  141. package/templates/onboarding/backend/run.mjs +10 -0
  142. package/templates/onboarding/frontend/policy.yml +40 -0
  143. package/templates/onboarding/legacy/backend-commit-msg.sh +21 -0
  144. package/templates/onboarding/legacy/frontend-common-core-postinstall.mjs +52 -0
  145. package/templates/onboarding/legacy/frontend-enforce-pnpm.mjs +9 -0
  146. package/templates/onboarding/legacy/frontend-pre-commit.sh +15 -0
  147. package/templates/onboarding/legacy/frontend-pre-push.sh +16 -0
  148. package/templates/platform/README.md +33 -0
  149. package/templates/platform/action.example.json +15 -0
  150. package/templates/platform/automation-config.json +66 -0
  151. package/templates/platform/ci-source.backend.json +40 -0
  152. package/templates/platform/ci-source.frontend.json +42 -0
  153. package/templates/platform/ci-source.gitlab.json +18 -0
  154. package/templates/platform/ci-source.jenkins.json +31 -0
  155. package/templates/platform/control-config.json +48 -0
  156. package/templates/platform/deployment-config.json +92 -0
  157. package/templates/platform/event.example.json +17 -0
  158. package/templates/platform/expectations.example.json +16 -0
  159. package/templates/platform/governance-config.json +106 -0
  160. package/templates/platform/lifecycle-event.example.json +29 -0
  161. package/templates/platform/review-ci.backend.json +6 -0
  162. package/templates/platform/review-ci.frontend.json +6 -0
  163. package/templates/platform/review-collector.backend.json +59 -0
  164. package/templates/platform/review-collector.frontend.json +67 -0
  165. package/templates/platform/review-policy.backend.json +72 -0
  166. package/templates/platform/review-policy.frontend.json +71 -0
  167. package/templates/platform/review-publish-config.json +45 -0
  168. package/templates/quality/java-unit.plan.json +13 -0
  169. package/templates/quality/review-evidence.plan.json +11 -0
  170. package/templates/quality/review-input.example.json +25 -0
  171. package/templates/quality/review-policy.json +15 -0
  172. package/templates/quality/rules.lock.json +1 -1
  173. package/templates/scripts-quality/java-unit.mjs +83 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,33 @@
1
+ ## [0.9.1] — 2026-10-15
2
+
3
+ - 重写 README:按实际能力梳理定位、接入步骤、使用场景与验证入口,完整细节保留在对应手册。
4
+ - 统一 World Leading 精密工业系列 Logo,提供深浅色版本并纳入 npm 发布内容。
5
+ - 接入固定依赖同步至 Kit 2.33.1、UI 1.22.1、BD 0.41.1,完整接入同时核对对应实际安装版本。
6
+
7
+ # 0.9.0 — 2026-10-15
8
+
9
+ - 修复接入环境与依赖准备、候选Review上下文和索引、删除/暂存区修复恢复、真实阻断与必要环境关闭、消息隔离。
10
+ - 补齐真实CI发现与可恢复调度、九维原件采集/补证/认证确认、授权前CI重新核验、OIDC处理页与投递恢复。
11
+ - 补齐独立签发、前后端组合与API/数据库/顺序约束、单次部署授权、实际冒烟和显式故障恢复。
12
+ - 重整README为接入、运行流程与文档入口,提供可复用的WL系列字标及Gate品牌资产。
13
+ - 本地源码和独立tgz分别验收;业务仓库、远端权限/群/SSO与真实业务必测仍以现场回执确认。
14
+
15
+ # 0.8.0 — 2026-10-15(本地交付候选,未发布)
16
+
17
+ - Gate 收入版本化前后端接入资产和 onboard,识别实际项目、显示完整差异并绑定确认;quality-tools 明确为后端私有 Node 依赖目录。
18
+ - 九维 Review 草稿、同口径修前修后对比、原始证据重算和逐维独立授权;正式签发及晋级强制要求 v2 记录,旧的仅身份/SHA批准不再放行。
19
+ - 固定 GitLab/Jenkins API 只读采集、真实 SHA/ref/全部必需作业与精确工件校验;拒绝 WebHook 自报成功、allow_failure、缺项、取消/跳过旧报告和采集中漂移。
20
+ - 飞书分类卡片、Review/构建/部署独立事实流共用签名台账与待发箱;构建成功、投递成功不会关闭质量问题。
21
+ - 文档明确包内实现、项目实接、远端权限/身份/存储与业务复验的验收责任;本地候选不代表 registry 发布或生产已接通。
22
+
23
+ # 0.7.0 — 2026-10-13(源码修订,未发布)
24
+
25
+ - JUnit 多模块明确 files/reportDirs/requiredSuites,报告全集、必测计数、生产一次和终轮摘要验证;拒绝旧 XML、源码覆盖、解析损坏与后续篡改。
26
+ - doctor 只读预检项目接线,Java 单测包装器明确模块/报告全集与依赖准备,补充前后端 GitLab 和 Jenkins 接线片段。
27
+ - governance 最小中央签名事件台账、独立复核关闭、漏跑对账、自然分钟 SLA、消息摘要/认证跳转、飞书签名与企业微信投递;默认预览。并发租约、未知投递和死信显式失败。
28
+ - 台账固定配置/公钥身份,动作和通知绑定当前 revision;拒绝过期卡片、输出路径别名与损坏台账。平台 API/SSO 查询、真实接线、服务和群投递仍须操作手册实测。
29
+ - 同步 V3 三份文档职责与精选 code-scan-kit 规则已正式集成的定位;无需 AI API。
30
+
1
31
  # 0.6.1 — 2026-10-12
2
32
 
3
33
  - npm 发布访问策略改为 public;公开获取与使用授权分开,保留 UNLICENSED,不授予开源许可。
package/README.md CHANGED
@@ -1,79 +1,126 @@
1
- # wl-skills-gate
1
+ <p align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/ChenyCHENYU/wl-skills-gate/main/assets/wl-gate-logo-dark.svg" />
4
+ <img src="https://raw.githubusercontent.com/ChenyCHENYU/wl-skills-gate/main/assets/wl-gate-logo.svg" width="100%" alt="WL skills-gate · World Leading · Quality Automation" />
5
+ </picture>
6
+ </p>
2
7
 
3
- 统一质量门禁引擎,当前版本 **0.6.1**。对应《工程化与代码质量管控体系-落地执行(V3)》V3.2 主体、V3.3 附录 B/C 及质量成本与隔离增补;包配置为 npm 公开发布;公开获取不授予使用授权,使用前须取得 AGILE TEAM 事先书面授权,详见 [LICENSE](LICENSE)。发布流程核验版本与工件摘要。
8
+ <p align="center"><strong>让项目检查、修复复扫、九维 Review 与构建发布接成一条可验证的质量流程。</strong></p>
4
9
 
5
- 包集中维护检查执行、结果归一、门禁裁决、修复计划和证据验证。项目引用固定版本;平台分别配置检查、Review、证明签发、分支更新、部署、台账与通知的权限。代码自测通过不代表内网接线已验收。
10
+ <p align="center">
11
+ <a href="https://www.npmjs.com/package/@agile-team/wl-skills-gate"><img src="https://img.shields.io/npm/v/@agile-team/wl-skills-gate?color=087A7D&label=npm" alt="npm version" /></a>
12
+ <img src="https://img.shields.io/badge/Node.js-%E2%89%A522.12-172634" alt="Node.js 22.12 or later" />
13
+ <img src="https://img.shields.io/badge/runtime_dependencies-0-087A7D" alt="Zero runtime dependencies" />
14
+ </p>
6
15
 
7
- 完整手册见 [docs/README.md](docs/README.md),当前接入建议见 [质量分级、执行成本与测试隔离](docs/13-quality-cost-and-isolation.md) 和 [低 token 执行](docs/14-low-token-execution.md)。11/12 手册保留为历史验证记录,既有 test-qa 接入尚未自动升级。
16
+ <p align="center">
17
+ <a href="#快速接入">快速接入</a> · <a href="#日常怎么用">日常流程</a> · <a href="#流水线怎么接">流水线接线</a> · <a href="./docs/README.md">技术手册</a>
18
+ </p>
8
19
 
9
- 日常目标是提前发现缺陷并减少返工:静态检查不修改业务源码,自动修复需独立明确执行;构建和测试在隔离 Runner 运行。新增缺陷与质量底线阻断,历史问题按审批治理,警告保留责任与时限。源码未变不代表没有外部系统副作用。
20
+ ## 解决什么
10
21
 
11
- 共享 `cmd-json` 已支持 Kit/UI/BD 原生 JSON 转换及文件描述符接收大报告;`java-xml` 统一解析 Checkstyle、PMD、P3C、SpotBugs,保留真实原生身份并由 Gate 单源风险表分级。七项 PMD 安全/正确性底线不可基线化;SpotBugs 表征泄露与构造期异常保留为需上下文复核的 warning,不自动豁免整类。多模块源定位须声明项目内 `sourceRoots`,缺失/歧义/符号链接拒绝,不能任取同名文件。详见 [Java 原生报告分级与复核](docs/15-java-report-triage.md)。项目无需各自维护这些解析脚本。类型、关键测试、权限/数据底线仍不能放进历史基线。
22
+ Gate 是质量执行与裁决层,复用项目已有检查器和适用的 WL 规则包。检查、报告、机械修复、复扫和通知由脚本执行,不调用大模型 API。
12
23
 
13
- 质量扫描默认由确定性脚本执行,包内没有大模型 API 调用。Hook、CI 裁决、报告归档和通知模板无需 AI;策略中的自定义命令仍须由平台审查。AI 阅读命令输出、规则和源码会消耗上下文,不能将“脚本没有调用模型”说成整个 AI 会话零 token。完整报告留作工件,AI 先用 `inspect` 看摘要,再按需分页读取问题;不因阅读分页重跑扫描。Java XML 可显式共用本轮一次生产;离线 cost 从既有工件汇总耗时,宿主实际 usage 不可获取时保持未知。Kit/UI 的 resultCursor 源码优化同步完成,业务安装态尚未升级。
24
+ | 场景 | Gate 提供什么 | 能看到什么 |
25
+ | --- | --- | --- |
26
+ | 日常提交 | Hook 自动运行分档检查 | 问题位置、规则、修复建议与阻断原因 |
27
+ | 问题整改 | 预览方案 → 本人确认 → 白名单脚本 → 复扫 | 修前修后变化、剩余问题与回归项 |
28
+ | Code Review | 汇总九维证据,生成待确认草稿 | 非作者逐维确认后的正式 Review |
29
+ | 合并与发布 | 核验候选 SHA、必需检查、Review、制品和目标环境 | 绑定本次代码与制品的放行或拒绝结果 |
30
+ | 问题跟进 | 分类通知、认领、超时对账、独立复验 | 可追溯的处理与关闭记录 |
14
31
 
15
- ## 能力与边界
32
+ **九维范围:** 提交 · 分支 · 编码 · UI 与交互 · Code Review · 测试 · 扫描门禁 · CI/CD · 工程治理。
16
33
 
17
- | 能力 | 命令 | 当前边界 |
18
- |---|---|---|
19
- | 三档检查 | `run --profile fast/standard/release` | 退出码 0/1/2;失败也归档;release 要求真实干净 HEAD、合法环境、最低检查集与实际工具版本锁 |
20
- | 报告 | `validate-report` | JSON/Markdown/HTML;Code Quality JSON 自动导出;JUnit 保留真实生产者 XML,不能拿转换后的计数替代原始测试报告 |
21
- | 精简查询 | `inspect <quality-summary.json>` | 默认摘要;按规则/等级/状态分页;默认 12,000 UTF-8 字节上限;只读现有报告,保留原判定与全量计数,不能替代可信门禁证据 |
22
- | 成本统计 | `cost <artifact-dir> --out <metrics.json>` | 离线汇总各档/各检查 P50/P95、共享生产次数、候选重复;真实 usage 可选导入,缺失保持未知,不调用模型 |
23
- | 机械修复 | `fix --plan`、`fix --apply --confirm` | standard 全量报告;文件快照、白名单、防漂移、异常回滚、强制复扫;只进入待复验,不能自动关闭业务问题 |
24
- | 候选检查 | `promote` | 在无特权 Runner 中合并、准备依赖、检查并归档 bundle;不更新共享分支 |
25
- | 受控晋级 | `promote-apply` | 核验签名证明和独立 Review,在新 bare 仓库中核验最新远端 HEAD 后核验父提交后以批准的旧 HEAD 条件更新;不运行项目脚本或 Hook |
26
- | 制品清单 | `manifest` | 绑定真实 HEAD、环境、实际文件/目录及可选配置、数据脚本摘要 |
27
- | 证明签发 | `attest` | 受控独立作业签发 Ed25519 证明;仅签通过的 standard/release 证据 |
28
- | Review 签发 | `review-sign` | 受控 Reviewer 作业,身份取自平台认证;非作者、候选绑定、阻断问题已处置 |
29
- | 部署验证 | `verify-artifact` | 固定公钥、签发者和作业 ID、SHA、release 档、环境、策略/基线/例外、时效、真实制品摘要全部核验 |
30
- | 自测 | `self-test`、`npm test` | self-test 只跑 29 个 fixture;npm test 额外跑单元与本地 Git/签名/制品集成 |
34
+ ## 快速接入
31
35
 
32
- ## 先只读试运行
36
+ 由技术经理在**实际 Git 项目根目录**接入一次。准备 Node.js ≥22.12、项目固定的包管理器和原有构建工具;安装源使用团队批准的 HTTPS registry。
33
37
 
34
- 取得事先书面授权并按授权范围使用后,可从公共 npm registry 安装固定版本:
38
+ ### 1. 预览项目接入计划
35
39
 
36
40
  ```bash
37
- # 公开获取不构成使用授权;先申请授权,再按其约定使用。
38
- pnpm add -D --save-exact @agile-team/wl-skills-gate@0.6.1
39
- # 按真实技术栈配置 quality/policy.yml 和 rules.lock.json;工具需实际安装。
40
- pnpm exec wl-skills-gate run --profile standard
41
- pnpm exec wl-skills-gate validate-report quality-reports/quality-summary.json
42
- # 给人工/AI 查看现有报告,不再执行扫描;完整报告仍独立归档。
43
- pnpm exec wl-skills-gate inspect quality-reports/quality-summary.json
44
- pnpm exec wl-skills-gate inspect quality-reports/quality-summary.json --view findings --status new --limit 10
41
+ npx --yes @agile-team/wl-skills-gate@latest onboard \
42
+ --root . --complete --registry https://registry.npmjs.org
45
43
  ```
46
44
 
47
- Gate 自身零依赖。前端仍需 ESLint/TypeScript 和工程检查器;后端 Runner 仍需 JDK/Maven/Node 与实际质量 profile。只有已安装且适用的规则包进入版本锁,不安装无关兄弟包。
45
+ 查看识别的项目类型、依赖版本、文件差异、Hook 和阻断项。脚本与模板随 Gate 包交付,无需从文档复制拼装。
48
46
 
49
- 退出码:0=passed;1=blocked;2=invalid。1/2 都停止后续晋级和部署,报告用 `when: always` 归档。无效证据不能当成“没有问题”。
47
+ | 项目 | 依赖装在哪里 | 业务构建 |
48
+ | --- | --- | --- |
49
+ | PC Vue 管理端,如 `wl-ui-produce` | 项目 `package.json`:Gate / Kit / UI | 保留原前端构建 |
50
+ | Java/Maven,如 `wl-produce` | `quality-tools/package.json`:Gate / BD | 保留 Maven,Node 工具不进入 jar |
50
51
 
51
- ## 0.5.x → 0.6 迁移
52
+ `quality-tools/` 只是 Java 仓库里的 Node 工具依赖目录。内置后端配套针对 `wl-produce` PL 模块;其他 Maven 项目先由负责人配置模块与必测。移动端、UniApp 不套用 PC 配套。
52
53
 
53
- - 保留原 CLI、主模块和直接 lib 路径;Gate 仍可独立安装,扫描器和规则包按真实技术栈分别配置。
54
- - P3C 使用 `format: p3c`;XML 的 PMD 引擎版本与 P3C 提供者版本分开记录,未提供的版本保持未知。
55
- - SpotBugs 多模块配置显式 `sourceRoots`。未配置只兼容实际存在的单模块 `src/main/java`;缺失、歧义和符号链接定位返回 invalid。
56
- - 成员身份进入 Java 指纹,旧成员基线可能需要重新审查。七项 PMD 底线不可基线/豁免;SpotBugs 四类上下文复核 warning 保留发现,不自动排除。
57
- - `rules.lock.json` 的 Gate 版本须与实际安装版本一致;模板中的检查器版本占位值仍需替换为真实版本。
54
+ ### 2. 确认并应用这份计划
58
55
 
59
- ## 打包与版本冻结
56
+ ```bash
57
+ npx --yes @agile-team/wl-skills-gate@latest onboard \
58
+ --root . --complete --registry https://registry.npmjs.org \
59
+ --apply --plan-hash "<本次返回的 planHash>" --confirm
60
+ ```
61
+
62
+ 程序按计划安装固定依赖、同步规则、配置 Hook、执行首扫与提交说明正反验证。首次安装后如出现原生规则或 POM 新差异,会返回新的待确认阶段;用同一入口重新预览、确认后续跑。
63
+
64
+ ### 3. 验证本地与远端效果
65
+
66
+ | 验收点 | 成功依据 |
67
+ | --- | --- |
68
+ | 本地接入 | 返回 `local-validated-awaiting-remote-acceptance`;首扫通过、合规提交说明通过、违规说明被拦截 |
69
+ | 首份质量报告 | 打开 `quality-reports/quality-report.html`;结构化结果在 `quality-summary.json` |
70
+ | 接入执行记录 | `quality-reports/onboarding/execution.json` 显示本次实际阶段与结果 |
71
+ | 远端强制检查 | 按下节接线,在真实 MR / 构建中验证失败拒绝、通过放行与消息送达 |
72
+
73
+ 本地接入通过后,再完成 CI、Review、通知和部署验收。完整步骤与状态说明见 [接入指南](./docs/17-onboarding.md)。
74
+
75
+ ## 日常怎么用
76
+
77
+ 开发者正常提交、推送;Hook 自动检查。以 `wl-ui-produce` 修改订单列表为例:
78
+
79
+ | 步骤 | 开发者 / 负责人做什么 | 系统给出什么 |
80
+ | --- | --- | --- |
81
+ | 提交前 | 按原流程暂存、提交代码 | 快速检查;有阻断显示具体位置和建议 |
82
+ | 推送前 | 正常推送 | 标准检查、HTML 报告;已配置 Review 策略时自动生成九维草稿 |
83
+ | 处理问题 | 在已生成的编辑器任务中选择“预览脚本修复”,核对并确认 | 执行批准的机械脚本、自动复扫,展示差异;语义问题保留人工处理 |
84
+ | 发起 Review | 非作者查看代码、补齐实际交互与业务证据、逐维确认 | 绑定当前候选与证据的正式 Review |
85
+ | 构建发布 | 通过受控流水线推进 | 核验本次候选、检查和制品;部署后独立复验再关闭问题 |
86
+
87
+ 同口径的修前修后报告才展示质量变化。扫描通过、Review 确认、发布授权和问题关闭分别核验;一项通过不会代替其余步骤。
88
+
89
+ ## 流水线怎么接
90
+
91
+ 由 GitLab / Jenkins 维护者接线,项目负责人确认规则与必测,通知负责人配置群与分类。执行模板都在本包中。
92
+
93
+ | 接线内容 | 入口 | 验证方式 |
94
+ | --- | --- | --- |
95
+ | GitLab MR、候选与受保护分支 | [CI 模板](./templates/ci) · [GitLab 指南](./docs/06-gitlab.md) | 违规候选不能合并,真实必需作业齐全 |
96
+ | Jenkins 构建、制品与部署 | [Jenkins 指南](./docs/07-jenkins.md) | SHA、制品摘要、目标环境一致,缺证据拒绝推进 |
97
+ | 真实 CI 证据、身份与 Review | [可信 CI 采集](./docs/18-ci-source.md) · [九维 Review](./docs/19-nine-dimension-review.md) | 旧报告、缺证据、自审与过期批准被拒绝 |
98
+ | 飞书通知、认领、超时与复验 | [中央执行接线](./templates/platform/README.md) | 实际送达、失败重试、认领和独立关闭均留记录 |
99
+
100
+ 项目检查作业与受控签发、部署、通知作业隔离。Hook 提供早反馈;服务端强制检查负责防绕过。
60
101
 
61
- 使用 Node ≥20 执行 `npm test` 后运行 `npm pack --ignore-scripts --json --pack-destination <工件目录>`;对这个 tgz 独立安装、调用 CLI/自测并校验哈希,再提交和发布同一产物。`files` 包含所有运行模块、schema、模板、手册、fixture 与自测脚本,不依赖兄弟包源码。
102
+ ## 按需深入
62
103
 
63
- npm 发布访问策略为 `public`,授权状态仍为 `UNLICENSED`。未经 AGILE TEAM 事先书面授权,不得使用、复制、修改或再分发;公开获取不等于使用授权。授权申请通过 [仓库 Issues](https://github.com/ChenyCHENYU/wl-skills-gate/issues),完整条款见 [LICENSE](LICENSE)。源仓库为 [ChenyCHENYU/wl-skills-gate](https://github.com/ChenyCHENYU/wl-skills-gate),默认分支 `main`;仓库推送与 npm 发布由发布流程分别核验。平台接线、真实权限、部署和群通知仍按下文单独验收。
104
+ | 要做什么 | 文档 |
105
+ | --- | --- |
106
+ | 调整检查器、范围、等级与例外 | [策略配置](./docs/02-config.md) · [适配器](./docs/05-adapters.md) |
107
+ | 维护修复白名单、漂移检查与回滚 | [修复闭环](./docs/04-fix-loop.md) |
108
+ | 只读定位问题,减少重复扫描与上下文 | [低 token 执行](./docs/14-low-token-execution.md) · [Java 报告分级](./docs/15-java-report-triage.md) |
109
+ | 排查接入与环境问题 | [项目与运维集成](./docs/16-project-ci-integration.md) · [完整索引](./docs/README.md) |
64
110
 
65
- ## 0.4 → 0.5 迁移
111
+ 检查退出码:`0` 通过,`1` 质量阻断,`2` 执行或证据无效。后两者都需要处理,不得以历史绿报告替代本轮结果。
66
112
 
67
- - `promote --push`、`--allow-any` 禁用,更新分支改走隔离的 `promote-apply`。
68
- - `run` 生成的是 `unsigned-gate-result`;部署拒收 unsigned。签发与检查使用不同凭据和执行环境。
69
- - `verify-artifact` 必须提供固定公钥、受控期望、环境、清单与实际制品根目录,详见 [Jenkins](docs/07-jenkins.md)。
70
- - `cmd-json` 默认成功退出码为 `[0]`;工具“发现问题返回 1”需显式登记 `[0,1]`,且报告有相应问题证据。
71
- - 基线项增加 `severity`、`occurrenceCount`。blocker、类型/关键测试等质量底线不能基线化或豁免。
72
- - 旧修复计划需重新生成。报告中的任意 `fixCommand` 不再执行;仅使用内置 ESLint 修复或政策登记的 fixer。
73
- - 必需测试跳过、零用例、计数与明细不一致会阻断。部分暂存存在未暂存修改时,快检拒绝。
113
+ ## WL 系列
74
114
 
75
- ## 平台待接入能力
115
+ **WL = World Leading。** 按职责组合,未使用的包无需安装。
76
116
 
77
- 受保护分支、固定 CI/Runner、签发密钥与授权、平台作业来源查询、独立 Review、双仓发布组合、真实业务/UI/性能验证、台账与飞书/企业微信通知均需平台接线和实测。本包不自动创建这些权限或服务。
117
+ | 包 | 职责 |
118
+ | --- | --- |
119
+ | **Gate** | 统一接入、检查裁决、修复复扫、Review 与发布证据 |
120
+ | [Kit](https://github.com/ChenyCHENYU/wl-skills-kit) | PC Vue 管理端需求、契约、代码生成与工程规范 |
121
+ | [UI](https://github.com/ChenyCHENYU/wl-skills-ui) | PC 管理端设计令牌、样式与交互质量 |
122
+ | [BD](https://github.com/ChenyCHENYU/wl-skills-bd) | Java 后端规范、契约与检查能力 |
123
+ | [Test](https://github.com/ChenyCHENYU/wl-skills-test) | 测试设计、执行与结果验证 |
124
+ | [Design](https://github.com/ChenyCHENYU/wl-skills-design) | 需求与设计模型、交付契约 |
78
125
 
79
- D1~D4(台账、责任路由、通知、SLA 升级)属于首期,与前后端样板同步验收。先证明一个真实问题从发现到复验关闭,再推广项目数量。
126
+ 使用授权见 [LICENSE](./LICENSE)。问题反馈请附包版本、执行命令和脱敏报告,提交至 [Issues](https://github.com/ChenyCHENYU/wl-skills-gate/issues)。
@@ -0,0 +1,162 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "brand": "World Leading",
4
+ "acronym": "WL",
5
+ "series": "World Leading",
6
+ "product": "skills-gate",
7
+ "tagline": "Automated quality workflow",
8
+ "mark": {
9
+ "file": "wl-mark.svg",
10
+ "viewBox": "0 0 256 168",
11
+ "color": "currentColor",
12
+ "minimumWidthPx": 48,
13
+ "smallVariant": {
14
+ "file": "wl-mark-small.svg",
15
+ "minimumWidthPx": 32,
16
+ "opticalAdjustment": "L moves 8 viewBox units to preserve a 2px gap at 32px width"
17
+ },
18
+ "clearSpace": "At least half the cap height",
19
+ "construction": {
20
+ "wPath": "M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z",
21
+ "lPath": "M181 24H205L174 112H226L218 136H142Z",
22
+ "language": "Precision-cut W and forward-cut L; preserve geometry across products"
23
+ }
24
+ },
25
+ "wordmark": {
26
+ "light": "wl-wordmark.svg",
27
+ "dark": "wl-wordmark-dark.svg",
28
+ "viewBox": "0 0 760 160"
29
+ },
30
+ "banner": {
31
+ "viewBox": "0 0 1280 340",
32
+ "light": "wl-gate-logo.svg",
33
+ "dark": "wl-gate-logo-dark.svg",
34
+ "cornerRadius": 16
35
+ },
36
+ "palette": {
37
+ "obsidian": "#0B1119",
38
+ "graphite": "#111E2C",
39
+ "ink": "#172634",
40
+ "platinum": "#F0F4F6",
41
+ "silver": "#B8C3CE",
42
+ "paper": "#F7F8F8",
43
+ "gateLight": "#087A7D",
44
+ "gateDark": "#8DDEDC",
45
+ "textMutedLight": "#637686",
46
+ "textMutedDark": "#8E9FAF"
47
+ },
48
+ "typography": {
49
+ "family": "Helvetica Neue, Inter, Helvetica, Arial, sans-serif",
50
+ "productSize": 90,
51
+ "productWeight": 550,
52
+ "productTracking": -4,
53
+ "brandSize": 16,
54
+ "brandTracking": 3.15,
55
+ "taglineSize": 20
56
+ },
57
+ "extension": {
58
+ "shared": [
59
+ "WL monogram",
60
+ "WORLD LEADING below the monogram",
61
+ "Fixed brand/product zones",
62
+ "Product title with skills- prefix",
63
+ "Metadata and glyph grid"
64
+ ],
65
+ "perProduct": [
66
+ "Package suffix",
67
+ "Module accent",
68
+ "Functional geometric symbol",
69
+ "Functional tagline",
70
+ "Exact npm package identifier"
71
+ ],
72
+ "accentSuggestions": {
73
+ "gate": "#8DDEDC",
74
+ "kit": "#9CC5FF",
75
+ "ui": "#CCB8FF",
76
+ "test": "#E7A7B8",
77
+ "design": "#EAAF8A",
78
+ "bd": "#DFC291"
79
+ },
80
+ "examples": [
81
+ "skills-gate",
82
+ "skills-kit",
83
+ "skills-ui",
84
+ "skills-test",
85
+ "skills-design",
86
+ "skills-bd"
87
+ ]
88
+ },
89
+ "production": {
90
+ "smallMarks": "Single flat color, no gradients",
91
+ "lightTheme": "Flat ink mark",
92
+ "darkTheme": "Subtle silver gradient is optional in banners",
93
+ "masterFiles": "All assets are native editable SVG"
94
+ },
95
+ "brandLockup": {
96
+ "light": "wl-brand-lockup.svg",
97
+ "dark": "wl-brand-lockup-dark.svg",
98
+ "arrangement": "WL above WORLD LEADING"
99
+ },
100
+ "packageFamily": {
101
+ "gate": {
102
+ "displayName": "skills-gate",
103
+ "npmName": "@agile-team/wl-skills-gate",
104
+ "category": "QUALITY AUTOMATION",
105
+ "tagline": "Checks · Review · Release",
106
+ "darkAccent": "#8DDEDC",
107
+ "lightAccent": "#087A7D",
108
+ "light": "wl-gate-logo.svg",
109
+ "dark": "wl-gate-logo-dark.svg"
110
+ },
111
+ "kit": {
112
+ "displayName": "skills-kit",
113
+ "npmName": "@agile-team/wl-skills-kit",
114
+ "category": "FRONTEND ENGINEERING",
115
+ "tagline": "Standards · Contracts · Workflows",
116
+ "darkAccent": "#9CC5FF",
117
+ "lightAccent": "#315E9F",
118
+ "light": "wl-kit-logo.svg",
119
+ "dark": "wl-kit-logo-dark.svg"
120
+ },
121
+ "ui": {
122
+ "displayName": "skills-ui",
123
+ "npmName": "@agile-team/wl-skills-ui",
124
+ "category": "INTERFACE QUALITY",
125
+ "tagline": "Tokens · Layouts · Interaction",
126
+ "darkAccent": "#CCB8FF",
127
+ "lightAccent": "#7053A7",
128
+ "light": "wl-ui-logo.svg",
129
+ "dark": "wl-ui-logo-dark.svg"
130
+ },
131
+ "test": {
132
+ "displayName": "skills-test",
133
+ "npmName": "@agile-team/wl-skills-test",
134
+ "category": "TEST ENGINEERING",
135
+ "tagline": "Cases · Automation · Evidence",
136
+ "darkAccent": "#E7A7B8",
137
+ "lightAccent": "#A34262",
138
+ "light": "wl-test-logo.svg",
139
+ "dark": "wl-test-logo-dark.svg"
140
+ },
141
+ "design": {
142
+ "displayName": "skills-design",
143
+ "npmName": "@agile-team/wl-skills-design",
144
+ "category": "PRODUCT DESIGN",
145
+ "tagline": "Requirements · Flows · Prototypes",
146
+ "darkAccent": "#EAAF8A",
147
+ "lightAccent": "#A45C2B",
148
+ "light": "wl-design-logo.svg",
149
+ "dark": "wl-design-logo-dark.svg"
150
+ },
151
+ "bd": {
152
+ "displayName": "skills-bd",
153
+ "npmName": "@agile-team/wl-skills-bd",
154
+ "category": "BACKEND ENGINEERING",
155
+ "tagline": "Java · Contracts · Quality",
156
+ "darkAccent": "#DFC291",
157
+ "lightAccent": "#886331",
158
+ "light": "wl-bd-logo.svg",
159
+ "dark": "wl-bd-logo-dark.svg"
160
+ }
161
+ }
162
+ }
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 340" role="img" aria-labelledby="title desc">
2
+ <title id="title">WL · World Leading · skills-bd</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-bd package, backend engineering, on the right. Shared precision industrial identity.</desc>
4
+ <defs>
5
+ <linearGradient id="surface" x1="0" y1="0" x2="1280" y2="340" gradientUnits="userSpaceOnUse"><stop stop-color="#0B1119"/><stop offset="1" stop-color="#111E2C"/></linearGradient>
6
+ <linearGradient id="metal" x1="0" y1="22" x2="200" y2="149" gradientUnits="userSpaceOnUse"><stop stop-color="#F7FAFA"/><stop offset=".58" stop-color="#B4C3CE"/><stop offset="1" stop-color="#E7EEF2"/></linearGradient>
7
+ <linearGradient id="rule" gradientUnits="userSpaceOnUse" x1="400" y1="281" x2="1218" y2="281"><stop stop-color="#52677C" stop-opacity=".4"/><stop offset="1" stop-color="#52677C" stop-opacity=".12"/></linearGradient>
8
+ <clipPath id="canvas"><rect width="1280" height="340" rx="16"/></clipPath>
9
+ </defs>
10
+ <g clip-path="url(#canvas)">
11
+ <rect width="1280" height="340" fill="url(#surface)"/>
12
+ <path d="M1247 0H1280V340H1148Z" fill="#DFC291" opacity=".035"/>
13
+ <g transform="translate(60 58) scale(1.12)" fill="url(#metal)"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/><path d="M174 112H226L218 136H166Z" fill="#DFC291"/></g>
14
+ <text x="195" y="258" text-anchor="middle" fill="#9CAAB8" font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif" font-size="16" font-weight="500" letter-spacing="3.15">WORLD LEADING</text>
15
+ <path d="M352 72V278" stroke="#52677C" stroke-opacity=".35"/>
16
+ <path d="M352 153V192" stroke="#DFC291" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#DFC291" font-size="12" font-weight="600" letter-spacing="3.5">BACKEND ENGINEERING</text>
19
+ <text x="393" y="187" font-size="90" letter-spacing="-4"><tspan fill="#9CAAB8" font-weight="350">skills-</tspan><tspan fill="#F0F4F6" font-weight="550">bd</tspan></text>
20
+ <text x="400" y="236" fill="#8E9FAF" font-size="20" font-weight="400" letter-spacing=".2">Java · Contracts · Quality</text>
21
+ </g>
22
+ <path d="M400 281H1218" stroke="url(#rule)"/>
23
+ <text x="400" y="311" fill="#8E9FAF" font-family="'SFMono-Regular', Consolas, 'Liberation Mono', monospace" font-size="13" letter-spacing=".15">@agile-team/wl-skills-bd</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#DFC291" stroke-linecap="square" stroke-linejoin="miter">
25
+ <path d="M8 23V8H23M73 8H88V23M88 73V88H73M23 88H8V73" stroke-width=".8" opacity=".22"/>
26
+ <g stroke-width="2" opacity=".85"><path d="M17 35 48 19 79 35 48 51ZM17 49 48 65 79 49M17 63 48 79 79 63"/><path d="M48 19 63 27" stroke-width="4"/></g>
27
+ </g>
28
+ <rect x=".5" y=".5" width="1279" height="339" rx="15.5" fill="none" stroke="#52677C" stroke-opacity=".2"/>
29
+ </g></svg>
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 340" role="img" aria-labelledby="title desc">
2
+ <title id="title">WL · World Leading · skills-bd</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-bd package, backend engineering, on the right. Shared precision industrial identity.</desc>
4
+ <defs>
5
+ <linearGradient id="surface" x1="0" y1="0" x2="1280" y2="340" gradientUnits="userSpaceOnUse"><stop stop-color="#F7F8F8"/><stop offset="1" stop-color="#EFF2F4"/></linearGradient>
6
+ <linearGradient id="metal" x1="0" y1="22" x2="200" y2="149" gradientUnits="userSpaceOnUse"><stop stop-color="#21394D"/><stop offset=".58" stop-color="#0C2031"/><stop offset="1" stop-color="#284156"/></linearGradient>
7
+ <linearGradient id="rule" gradientUnits="userSpaceOnUse" x1="400" y1="281" x2="1218" y2="281"><stop stop-color="#AEBCC6" stop-opacity=".4"/><stop offset="1" stop-color="#AEBCC6" stop-opacity=".12"/></linearGradient>
8
+ <clipPath id="canvas"><rect width="1280" height="340" rx="16"/></clipPath>
9
+ </defs>
10
+ <g clip-path="url(#canvas)">
11
+ <rect width="1280" height="340" fill="url(#surface)"/>
12
+ <path d="M1247 0H1280V340H1148Z" fill="#886331" opacity=".04"/>
13
+ <g transform="translate(60 58) scale(1.12)" fill="#172634"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/><path d="M174 112H226L218 136H166Z" fill="#886331"/></g>
14
+ <text x="195" y="258" text-anchor="middle" fill="#687A89" font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif" font-size="16" font-weight="500" letter-spacing="3.15">WORLD LEADING</text>
15
+ <path d="M352 72V278" stroke="#AEBCC6" stroke-opacity=".35"/>
16
+ <path d="M352 153V192" stroke="#886331" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#886331" font-size="12" font-weight="600" letter-spacing="3.5">BACKEND ENGINEERING</text>
19
+ <text x="393" y="187" font-size="90" letter-spacing="-4"><tspan fill="#687A89" font-weight="350">skills-</tspan><tspan fill="#172634" font-weight="550">bd</tspan></text>
20
+ <text x="400" y="236" fill="#637686" font-size="20" font-weight="400" letter-spacing=".2">Java · Contracts · Quality</text>
21
+ </g>
22
+ <path d="M400 281H1218" stroke="url(#rule)"/>
23
+ <text x="400" y="311" fill="#637686" font-family="'SFMono-Regular', Consolas, 'Liberation Mono', monospace" font-size="13" letter-spacing=".15">@agile-team/wl-skills-bd</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#886331" stroke-linecap="square" stroke-linejoin="miter">
25
+ <path d="M8 23V8H23M73 8H88V23M88 73V88H73M23 88H8V73" stroke-width=".8" opacity=".22"/>
26
+ <g stroke-width="2" opacity=".85"><path d="M17 35 48 19 79 35 48 51ZM17 49 48 65 79 49M17 63 48 79 79 63"/><path d="M48 19 63 27" stroke-width="4"/></g>
27
+ </g>
28
+ <rect x=".5" y=".5" width="1279" height="339" rx="15.5" fill="none" stroke="#AEBCC6" stroke-opacity=".2"/>
29
+ </g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 224" role="img" aria-labelledby="title desc"><title id="title">WL · World Leading</title><desc id="desc">Fixed World Leading parent-brand lockup. WL monogram above WORLD LEADING.</desc><g fill="#EEF1F2"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/></g><text x="122" y="187" text-anchor="middle" fill="#EEF1F2" font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif" font-size="12" font-weight="500" letter-spacing="2.9">WORLD LEADING</text></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 224" role="img" aria-labelledby="title desc"><title id="title">WL · World Leading</title><desc id="desc">Fixed World Leading parent-brand lockup. WL monogram above WORLD LEADING.</desc><g fill="#172634"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/></g><text x="122" y="187" text-anchor="middle" fill="#172634" font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif" font-size="12" font-weight="500" letter-spacing="2.9">WORLD LEADING</text></svg>
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 340" role="img" aria-labelledby="title desc">
2
+ <title id="title">WL · World Leading · skills-design</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-design package, product design, on the right. Shared precision industrial identity.</desc>
4
+ <defs>
5
+ <linearGradient id="surface" x1="0" y1="0" x2="1280" y2="340" gradientUnits="userSpaceOnUse"><stop stop-color="#0B1119"/><stop offset="1" stop-color="#111E2C"/></linearGradient>
6
+ <linearGradient id="metal" x1="0" y1="22" x2="200" y2="149" gradientUnits="userSpaceOnUse"><stop stop-color="#F7FAFA"/><stop offset=".58" stop-color="#B4C3CE"/><stop offset="1" stop-color="#E7EEF2"/></linearGradient>
7
+ <linearGradient id="rule" gradientUnits="userSpaceOnUse" x1="400" y1="281" x2="1218" y2="281"><stop stop-color="#52677C" stop-opacity=".4"/><stop offset="1" stop-color="#52677C" stop-opacity=".12"/></linearGradient>
8
+ <clipPath id="canvas"><rect width="1280" height="340" rx="16"/></clipPath>
9
+ </defs>
10
+ <g clip-path="url(#canvas)">
11
+ <rect width="1280" height="340" fill="url(#surface)"/>
12
+ <path d="M1247 0H1280V340H1148Z" fill="#EAAF8A" opacity=".035"/>
13
+ <g transform="translate(60 58) scale(1.12)" fill="url(#metal)"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/><path d="M174 112H226L218 136H166Z" fill="#EAAF8A"/></g>
14
+ <text x="195" y="258" text-anchor="middle" fill="#9CAAB8" font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif" font-size="16" font-weight="500" letter-spacing="3.15">WORLD LEADING</text>
15
+ <path d="M352 72V278" stroke="#52677C" stroke-opacity=".35"/>
16
+ <path d="M352 153V192" stroke="#EAAF8A" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#EAAF8A" font-size="12" font-weight="600" letter-spacing="3.5">PRODUCT DESIGN</text>
19
+ <text x="393" y="187" font-size="90" letter-spacing="-4"><tspan fill="#9CAAB8" font-weight="350">skills-</tspan><tspan fill="#F0F4F6" font-weight="550">design</tspan></text>
20
+ <text x="400" y="236" fill="#8E9FAF" font-size="20" font-weight="400" letter-spacing=".2">Requirements · Flows · Prototypes</text>
21
+ </g>
22
+ <path d="M400 281H1218" stroke="url(#rule)"/>
23
+ <text x="400" y="311" fill="#8E9FAF" font-family="'SFMono-Regular', Consolas, 'Liberation Mono', monospace" font-size="13" letter-spacing=".15">@agile-team/wl-skills-design</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#EAAF8A" stroke-linecap="square" stroke-linejoin="miter">
25
+ <path d="M8 23V8H23M73 8H88V23M88 73V88H73M23 88H8V73" stroke-width=".8" opacity=".22"/>
26
+ <g stroke-width="2" opacity=".85"><path d="M17 17H39V39H17ZM57 57H79V79H57ZM57 17H79V39H57ZM17 57H39V79H17ZM39 28H57M28 39V57M68 39V57M39 68H57"/><path d="M57 28 51 24M57 28 51 32"/><path d="M68 57 64 51M68 57 72 51"/></g>
27
+ </g>
28
+ <rect x=".5" y=".5" width="1279" height="339" rx="15.5" fill="none" stroke="#52677C" stroke-opacity=".2"/>
29
+ </g></svg>
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 340" role="img" aria-labelledby="title desc">
2
+ <title id="title">WL · World Leading · skills-design</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-design package, product design, on the right. Shared precision industrial identity.</desc>
4
+ <defs>
5
+ <linearGradient id="surface" x1="0" y1="0" x2="1280" y2="340" gradientUnits="userSpaceOnUse"><stop stop-color="#F7F8F8"/><stop offset="1" stop-color="#EFF2F4"/></linearGradient>
6
+ <linearGradient id="metal" x1="0" y1="22" x2="200" y2="149" gradientUnits="userSpaceOnUse"><stop stop-color="#21394D"/><stop offset=".58" stop-color="#0C2031"/><stop offset="1" stop-color="#284156"/></linearGradient>
7
+ <linearGradient id="rule" gradientUnits="userSpaceOnUse" x1="400" y1="281" x2="1218" y2="281"><stop stop-color="#AEBCC6" stop-opacity=".4"/><stop offset="1" stop-color="#AEBCC6" stop-opacity=".12"/></linearGradient>
8
+ <clipPath id="canvas"><rect width="1280" height="340" rx="16"/></clipPath>
9
+ </defs>
10
+ <g clip-path="url(#canvas)">
11
+ <rect width="1280" height="340" fill="url(#surface)"/>
12
+ <path d="M1247 0H1280V340H1148Z" fill="#A45C2B" opacity=".04"/>
13
+ <g transform="translate(60 58) scale(1.12)" fill="#172634"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/><path d="M174 112H226L218 136H166Z" fill="#A45C2B"/></g>
14
+ <text x="195" y="258" text-anchor="middle" fill="#687A89" font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif" font-size="16" font-weight="500" letter-spacing="3.15">WORLD LEADING</text>
15
+ <path d="M352 72V278" stroke="#AEBCC6" stroke-opacity=".35"/>
16
+ <path d="M352 153V192" stroke="#A45C2B" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#A45C2B" font-size="12" font-weight="600" letter-spacing="3.5">PRODUCT DESIGN</text>
19
+ <text x="393" y="187" font-size="90" letter-spacing="-4"><tspan fill="#687A89" font-weight="350">skills-</tspan><tspan fill="#172634" font-weight="550">design</tspan></text>
20
+ <text x="400" y="236" fill="#637686" font-size="20" font-weight="400" letter-spacing=".2">Requirements · Flows · Prototypes</text>
21
+ </g>
22
+ <path d="M400 281H1218" stroke="url(#rule)"/>
23
+ <text x="400" y="311" fill="#637686" font-family="'SFMono-Regular', Consolas, 'Liberation Mono', monospace" font-size="13" letter-spacing=".15">@agile-team/wl-skills-design</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#A45C2B" stroke-linecap="square" stroke-linejoin="miter">
25
+ <path d="M8 23V8H23M73 8H88V23M88 73V88H73M23 88H8V73" stroke-width=".8" opacity=".22"/>
26
+ <g stroke-width="2" opacity=".85"><path d="M17 17H39V39H17ZM57 57H79V79H57ZM57 17H79V39H57ZM17 57H39V79H17ZM39 28H57M28 39V57M68 39V57M39 68H57"/><path d="M57 28 51 24M57 28 51 32"/><path d="M68 57 64 51M68 57 72 51"/></g>
27
+ </g>
28
+ <rect x=".5" y=".5" width="1279" height="339" rx="15.5" fill="none" stroke="#AEBCC6" stroke-opacity=".2"/>
29
+ </g></svg>
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 340" role="img" aria-labelledby="title desc">
2
+ <title id="title">WL · World Leading · skills-gate</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-gate package, quality automation, on the right. Shared precision industrial identity.</desc>
4
+ <defs>
5
+ <linearGradient id="surface" x1="0" y1="0" x2="1280" y2="340" gradientUnits="userSpaceOnUse"><stop stop-color="#0B1119"/><stop offset="1" stop-color="#111E2C"/></linearGradient>
6
+ <linearGradient id="metal" x1="0" y1="22" x2="200" y2="149" gradientUnits="userSpaceOnUse"><stop stop-color="#F7FAFA"/><stop offset=".58" stop-color="#B4C3CE"/><stop offset="1" stop-color="#E7EEF2"/></linearGradient>
7
+ <linearGradient id="rule" gradientUnits="userSpaceOnUse" x1="400" y1="281" x2="1218" y2="281"><stop stop-color="#52677C" stop-opacity=".4"/><stop offset="1" stop-color="#52677C" stop-opacity=".12"/></linearGradient>
8
+ <clipPath id="canvas"><rect width="1280" height="340" rx="16"/></clipPath>
9
+ </defs>
10
+ <g clip-path="url(#canvas)">
11
+ <rect width="1280" height="340" fill="url(#surface)"/>
12
+ <path d="M1247 0H1280V340H1148Z" fill="#8DDEDC" opacity=".035"/>
13
+ <g transform="translate(60 58) scale(1.12)" fill="url(#metal)"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/><path d="M174 112H226L218 136H166Z" fill="#8DDEDC"/></g>
14
+ <text x="195" y="258" text-anchor="middle" fill="#9CAAB8" font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif" font-size="16" font-weight="500" letter-spacing="3.15">WORLD LEADING</text>
15
+ <path d="M352 72V278" stroke="#52677C" stroke-opacity=".35"/>
16
+ <path d="M352 153V192" stroke="#8DDEDC" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#8DDEDC" font-size="12" font-weight="600" letter-spacing="3.5">QUALITY AUTOMATION</text>
19
+ <text x="393" y="187" font-size="90" letter-spacing="-4"><tspan fill="#9CAAB8" font-weight="350">skills-</tspan><tspan fill="#F0F4F6" font-weight="550">gate</tspan></text>
20
+ <text x="400" y="236" fill="#8E9FAF" font-size="20" font-weight="400" letter-spacing=".2">Checks · Review · Release</text>
21
+ </g>
22
+ <path d="M400 281H1218" stroke="url(#rule)"/>
23
+ <text x="400" y="311" fill="#8E9FAF" font-family="'SFMono-Regular', Consolas, 'Liberation Mono', monospace" font-size="13" letter-spacing=".15">@agile-team/wl-skills-gate</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#8DDEDC" stroke-linecap="square" stroke-linejoin="miter">
25
+ <path d="M8 23V8H23M73 8H88V23M88 73V88H73M23 88H8V73" stroke-width=".8" opacity=".22"/>
26
+ <g stroke-width="2" opacity=".85"><path d="M23 76V22H73V76M16 76H31M65 76H80"/><path d="M48 39V59"/><path d="M41 22H55" stroke-width="4"/></g>
27
+ </g>
28
+ <rect x=".5" y=".5" width="1279" height="339" rx="15.5" fill="none" stroke="#52677C" stroke-opacity=".2"/>
29
+ </g></svg>
@@ -0,0 +1,29 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 340" role="img" aria-labelledby="title desc">
2
+ <title id="title">WL · World Leading · skills-gate</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-gate package, quality automation, on the right. Shared precision industrial identity.</desc>
4
+ <defs>
5
+ <linearGradient id="surface" x1="0" y1="0" x2="1280" y2="340" gradientUnits="userSpaceOnUse"><stop stop-color="#F7F8F8"/><stop offset="1" stop-color="#EFF2F4"/></linearGradient>
6
+ <linearGradient id="metal" x1="0" y1="22" x2="200" y2="149" gradientUnits="userSpaceOnUse"><stop stop-color="#21394D"/><stop offset=".58" stop-color="#0C2031"/><stop offset="1" stop-color="#284156"/></linearGradient>
7
+ <linearGradient id="rule" gradientUnits="userSpaceOnUse" x1="400" y1="281" x2="1218" y2="281"><stop stop-color="#AEBCC6" stop-opacity=".4"/><stop offset="1" stop-color="#AEBCC6" stop-opacity=".12"/></linearGradient>
8
+ <clipPath id="canvas"><rect width="1280" height="340" rx="16"/></clipPath>
9
+ </defs>
10
+ <g clip-path="url(#canvas)">
11
+ <rect width="1280" height="340" fill="url(#surface)"/>
12
+ <path d="M1247 0H1280V340H1148Z" fill="#087A7D" opacity=".04"/>
13
+ <g transform="translate(60 58) scale(1.12)" fill="#172634"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/><path d="M174 112H226L218 136H166Z" fill="#087A7D"/></g>
14
+ <text x="195" y="258" text-anchor="middle" fill="#687A89" font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif" font-size="16" font-weight="500" letter-spacing="3.15">WORLD LEADING</text>
15
+ <path d="M352 72V278" stroke="#AEBCC6" stroke-opacity=".35"/>
16
+ <path d="M352 153V192" stroke="#087A7D" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#087A7D" font-size="12" font-weight="600" letter-spacing="3.5">QUALITY AUTOMATION</text>
19
+ <text x="393" y="187" font-size="90" letter-spacing="-4"><tspan fill="#687A89" font-weight="350">skills-</tspan><tspan fill="#172634" font-weight="550">gate</tspan></text>
20
+ <text x="400" y="236" fill="#637686" font-size="20" font-weight="400" letter-spacing=".2">Checks · Review · Release</text>
21
+ </g>
22
+ <path d="M400 281H1218" stroke="url(#rule)"/>
23
+ <text x="400" y="311" fill="#637686" font-family="'SFMono-Regular', Consolas, 'Liberation Mono', monospace" font-size="13" letter-spacing=".15">@agile-team/wl-skills-gate</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#087A7D" stroke-linecap="square" stroke-linejoin="miter">
25
+ <path d="M8 23V8H23M73 8H88V23M88 73V88H73M23 88H8V73" stroke-width=".8" opacity=".22"/>
26
+ <g stroke-width="2" opacity=".85"><path d="M23 76V22H73V76M16 76H31M65 76H80"/><path d="M48 39V59"/><path d="M41 22H55" stroke-width="4"/></g>
27
+ </g>
28
+ <rect x=".5" y=".5" width="1279" height="339" rx="15.5" fill="none" stroke="#AEBCC6" stroke-opacity=".2"/>
29
+ </g></svg>