@agile-team/wl-skills-gate 0.9.0 → 0.10.0

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 (51) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +74 -73
  3. package/assets/brand-tokens.json +144 -27
  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 -38
  11. package/assets/wl-gate-logo.svg +29 -37
  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 -11
  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-quality-setup.js +18 -0
  23. package/bin/wl-skills-gate.js +4 -1
  24. package/docs/17-onboarding.md +27 -11
  25. package/docs/README.md +2 -2
  26. package/lib/automation.js +23 -3
  27. package/lib/onboard-complete.js +1 -1
  28. package/lib/onboard-config.js +29 -3
  29. package/lib/onboard.js +1 -0
  30. package/lib/release-input.js +114 -0
  31. package/lib/release-set.js +27 -5
  32. package/lib/setup-central.js +351 -0
  33. package/lib/setup-modes.js +84 -0
  34. package/lib/setup.js +160 -0
  35. package/lib/workspace-init.js +307 -0
  36. package/package.json +3 -2
  37. package/scripts/lib-tests/onboard-complete.test.mjs +7 -5
  38. package/scripts/lib-tests/onboard.test.mjs +5 -4
  39. package/scripts/lib-tests/release-input.test.mjs +162 -0
  40. package/scripts/lib-tests/setup-central.test.mjs +229 -0
  41. package/scripts/lib-tests/setup.test.mjs +71 -0
  42. package/scripts/lib-tests/workspace-init.test.mjs +271 -0
  43. package/templates/launchers/setup.cmd +8 -0
  44. package/templates/launchers/setup.command +8 -0
  45. package/templates/launchers/setup.sh +8 -0
  46. package/templates/onboarding/automation/ide-tasks.json +70 -8
  47. package/templates/onboarding/automation/workspace-setup.mjs +72 -0
  48. package/templates/onboarding/backend/java-unit.mjs +1 -1
  49. package/templates/onboarding/backend/quality-tools.package.json +2 -2
  50. package/templates/platform/release-input-config.json +51 -0
  51. package/templates/quality/rules.lock.json +1 -1
@@ -1,38 +1,29 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 920 220" role="img" aria-labelledby="wl-gate-dark-title wl-gate-dark-desc">
2
- <title id="wl-gate-dark-title">WL Gate — WL Engineering</title>
3
- <desc id="wl-gate-dark-desc">WL Gate. Automated quality workflow. An open gate frames a geometric WL monogram and a mint check node, on a deep blue background.</desc>
4
- <defs>
5
- <linearGradient id="wl-gate-dark-background" x1="0" y1="0" x2="920" y2="220" gradientUnits="userSpaceOnUse">
6
- <stop stop-color="#0B2034"/>
7
- <stop offset="1" stop-color="#102D43"/>
8
- </linearGradient>
9
- <linearGradient id="wl-gate-dark-tile" x1="34" y1="30" x2="194" y2="190" gradientUnits="userSpaceOnUse">
10
- <stop stop-color="#1B405B"/>
11
- <stop offset="1" stop-color="#102B42"/>
12
- </linearGradient>
13
- </defs>
14
- <rect width="920" height="220" rx="28" fill="url(#wl-gate-dark-background)"/>
15
- <rect x=".75" y=".75" width="918.5" height="218.5" rx="27.25" fill="none" stroke="#9CC9D8" stroke-opacity=".12" stroke-width="1.5"/>
16
- <rect x="34" y="30" width="160" height="160" rx="36" fill="url(#wl-gate-dark-tile)"/>
17
- <rect x="34.75" y="30.75" width="158.5" height="158.5" rx="35.25" fill="none" stroke="#91C4D7" stroke-opacity=".16" stroke-width="1.5"/>
18
- <g transform="translate(50 46)" fill="none" stroke-linecap="round" stroke-linejoin="round">
19
- <g stroke="#F2F8FC">
20
- <path d="M18 106V22h92v19M18 106h60" stroke-width="9"/>
21
- <path d="m31 50 10 37 13-25 13 25 10-37M90 50v37h18" stroke-width="8"/>
22
- </g>
23
- <circle cx="105" cy="105" r="17" stroke="#49D9BA" stroke-width="7"/>
24
- <path d="m97 105 5 5 11-12" stroke="#49D9BA" stroke-width="6"/>
25
- </g>
26
- <g font-family="Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif">
27
- <text x="246" y="63" fill="#88B5C5" font-size="14" font-weight="700" letter-spacing="3.8">WL ENGINEERING</text>
28
- <text x="242" y="132" fill="#F2F8FC" font-size="66" font-weight="750" letter-spacing="-2.4">WL Gate</text>
29
- <text x="246" y="174" fill="#9EBDC9" font-size="20" font-weight="450" letter-spacing=".2">Automated quality workflow</text>
30
- </g>
31
- <g fill="none" stroke-linecap="round" stroke-linejoin="round">
32
- <path d="M739 110h95" stroke="#33596C" stroke-width="2"/>
33
- <circle cx="739" cy="110" r="6" fill="#102D43" stroke="#6A96A8" stroke-width="2"/>
34
- <circle cx="786" cy="110" r="6" fill="#102D43" stroke="#6A96A8" stroke-width="2"/>
35
- <circle cx="841" cy="110" r="17" fill="#153F45" stroke="#49D9BA" stroke-width="2"/>
36
- <path d="m834 110 5 5 9-10" stroke="#49D9BA" stroke-width="2.5"/>
37
- </g>
38
- </svg>
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>
@@ -1,37 +1,29 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 920 220" role="img" aria-labelledby="wl-gate-title wl-gate-desc">
2
- <title id="wl-gate-title">WL Gate — WL Engineering</title>
3
- <desc id="wl-gate-desc">WL Gate. Automated quality workflow. An open gate frames a geometric WL monogram and a mint check node.</desc>
4
- <defs>
5
- <linearGradient id="wl-gate-background" x1="0" y1="0" x2="920" y2="220" gradientUnits="userSpaceOnUse">
6
- <stop stop-color="#F7FAFC"/>
7
- <stop offset="1" stop-color="#EEF6F8"/>
8
- </linearGradient>
9
- <linearGradient id="wl-gate-tile" x1="34" y1="30" x2="194" y2="190" gradientUnits="userSpaceOnUse">
10
- <stop stop-color="#173B59"/>
11
- <stop offset="1" stop-color="#0C233A"/>
12
- </linearGradient>
13
- </defs>
14
- <rect width="920" height="220" rx="28" fill="url(#wl-gate-background)"/>
15
- <rect x=".75" y=".75" width="918.5" height="218.5" rx="27.25" fill="none" stroke="#173B59" stroke-opacity=".08" stroke-width="1.5"/>
16
- <rect x="34" y="30" width="160" height="160" rx="36" fill="url(#wl-gate-tile)"/>
17
- <g transform="translate(50 46)" fill="none" stroke-linecap="round" stroke-linejoin="round">
18
- <g stroke="#F2F8FC">
19
- <path d="M18 106V22h92v19M18 106h60" stroke-width="9"/>
20
- <path d="m31 50 10 37 13-25 13 25 10-37M90 50v37h18" stroke-width="8"/>
21
- </g>
22
- <circle cx="105" cy="105" r="17" stroke="#49D9BA" stroke-width="7"/>
23
- <path d="m97 105 5 5 11-12" stroke="#49D9BA" stroke-width="6"/>
24
- </g>
25
- <g font-family="Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif">
26
- <text x="246" y="63" fill="#3B6A80" font-size="14" font-weight="700" letter-spacing="3.8">WL ENGINEERING</text>
27
- <text x="242" y="132" fill="#102E46" font-size="66" font-weight="750" letter-spacing="-2.4">WL Gate</text>
28
- <text x="246" y="174" fill="#537083" font-size="20" font-weight="450" letter-spacing=".2">Automated quality workflow</text>
29
- </g>
30
- <g fill="none" stroke-linecap="round" stroke-linejoin="round">
31
- <path d="M739 110h95" stroke="#B9CFD6" stroke-width="2"/>
32
- <circle cx="739" cy="110" r="6" fill="#F2F8FA" stroke="#7296A5" stroke-width="2"/>
33
- <circle cx="786" cy="110" r="6" fill="#F2F8FA" stroke="#7296A5" stroke-width="2"/>
34
- <circle cx="841" cy="110" r="17" fill="#E0F5EE" stroke="#159D82" stroke-width="2"/>
35
- <path d="m834 110 5 5 9-10" stroke="#159D82" stroke-width="2.5"/>
36
- </g>
37
- </svg>
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>
@@ -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-kit</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-kit package, frontend 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="#9CC5FF" 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="#9CC5FF"/></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="#9CC5FF" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#9CC5FF" font-size="12" font-weight="600" letter-spacing="3.5">FRONTEND 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">kit</tspan></text>
20
+ <text x="400" y="236" fill="#8E9FAF" font-size="20" font-weight="400" letter-spacing=".2">Standards · Contracts · Workflows</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-kit</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#9CC5FF" 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="M20 21H42V43H20ZM54 21H76V43H54ZM20 55H42V77H20ZM65 51 80 66 65 81 50 66Z"/><path d="M54 21H76V28" 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-kit</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-kit package, frontend 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="#315E9F" 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="#315E9F"/></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="#315E9F" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#315E9F" font-size="12" font-weight="600" letter-spacing="3.5">FRONTEND 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">kit</tspan></text>
20
+ <text x="400" y="236" fill="#637686" font-size="20" font-weight="400" letter-spacing=".2">Standards · Contracts · Workflows</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-kit</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#315E9F" 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="M20 21H42V43H20ZM54 21H76V43H54ZM20 55H42V77H20ZM65 51 80 66 65 81 50 66Z"/><path d="M54 21H76V28" 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,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 168" fill="currentColor" role="img" aria-labelledby="title desc">
2
+ <title id="title">WL · World Leading</title><desc id="desc">Original World Leading monogram. Precision-cut W and forward-cut L. Optically spaced for small use.</desc>
3
+ <path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z" transform="translate(8 0)"/></svg>
@@ -1,11 +1,3 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" fill="none" role="img" aria-labelledby="wl-mark-title wl-mark-desc">
2
- <title id="wl-mark-title">WL</title>
3
- <desc id="wl-mark-desc">The WL Engineering monogram: geometric W and L inside an open gate, completed by a check node.</desc>
4
- <g stroke="currentColor" stroke-linecap="round" stroke-linejoin="round">
5
- <path d="M18 106V22h92v19" stroke-width="9"/>
6
- <path d="m31 50 10 37 13-25 13 25 10-37M90 50v37h18" stroke-width="8"/>
7
- <path d="M18 106h60" stroke-width="9"/>
8
- <circle cx="105" cy="105" r="17" stroke-width="7"/>
9
- <path d="m97 105 5 5 11-12" stroke-width="6"/>
10
- </g>
11
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 168" fill="currentColor" role="img" aria-labelledby="title desc">
2
+ <title id="title">WL · World Leading</title><desc id="desc">Original World Leading monogram. Precision-cut W and forward-cut L. Single-color master mark.</desc>
3
+ <path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/></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-test</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-test package, test 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="#E7A7B8" 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="#E7A7B8"/></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="#E7A7B8" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#E7A7B8" font-size="12" font-weight="600" letter-spacing="3.5">TEST 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">test</tspan></text>
20
+ <text x="400" y="236" fill="#8E9FAF" font-size="20" font-weight="400" letter-spacing=".2">Cases · Automation · Evidence</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-test</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#E7A7B8" 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="M18 21H78V77H18ZM18 39H78M36 39V77M56 39V77"/><path d="M25 49 29 53 34 46M42 65 46 69 52 61M63 49H71M63 65H71"/><path d="M26 29H32" stroke-width="3"/></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-test</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-test package, test 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="#A34262" 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="#A34262"/></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="#A34262" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#A34262" font-size="12" font-weight="600" letter-spacing="3.5">TEST 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">test</tspan></text>
20
+ <text x="400" y="236" fill="#637686" font-size="20" font-weight="400" letter-spacing=".2">Cases · Automation · Evidence</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-test</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#A34262" 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="M18 21H78V77H18ZM18 39H78M36 39V77M56 39V77"/><path d="M25 49 29 53 34 46M42 65 46 69 52 61M63 49H71M63 65H71"/><path d="M26 29H32" stroke-width="3"/></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-ui</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-ui package, interface quality, 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="#CCB8FF" 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="#CCB8FF"/></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="#CCB8FF" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#CCB8FF" font-size="12" font-weight="600" letter-spacing="3.5">INTERFACE QUALITY</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">ui</tspan></text>
20
+ <text x="400" y="236" fill="#8E9FAF" font-size="20" font-weight="400" letter-spacing=".2">Tokens · Layouts · Interaction</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-ui</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#CCB8FF" 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="M18 24H72L80 32V76H18Z"/><path d="M18 37H80M38 37V76M47 48H69M47 58H61"/><path d="M25 30H30" stroke-width="3"/></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-ui</title>
3
+ <desc id="desc">World Leading signature on the left. The skills-ui package, interface quality, 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="#7053A7" 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="#7053A7"/></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="#7053A7" stroke-opacity=".85" stroke-width="2"/>
17
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif">
18
+ <text x="400" y="88" fill="#7053A7" font-size="12" font-weight="600" letter-spacing="3.5">INTERFACE QUALITY</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">ui</tspan></text>
20
+ <text x="400" y="236" fill="#637686" font-size="20" font-weight="400" letter-spacing=".2">Tokens · Layouts · Interaction</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-ui</text>
24
+ <g transform="translate(1049 83) scale(1.68)" fill="none" stroke="#7053A7" 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="M18 24H72L80 32V76H18Z"/><path d="M18 37H80M38 37V76M47 48H69M47 58H61"/><path d="M25 30H30" stroke-width="3"/></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,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 160" role="img" aria-labelledby="title desc">
2
+ <title id="title">World Leading · WL</title><desc id="desc">World Leading master wordmark. The WL monogram and full brand name, independent of any product.</desc>
3
+ <g fill="#EEF1F2" transform="translate(12 10) scale(.87)"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/></g>
4
+ <path d="M250 36V127" fill="none" stroke="#8D9BAA" stroke-opacity=".35"/>
5
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif"><text x="290" y="82" fill="#EEF1F2" font-size="36" font-weight="500" letter-spacing="2.5">WORLD LEADING</text><text x="293" y="115" fill="#8D9BAA" font-size="11" font-weight="500" letter-spacing="4.8">ENGINEERING</text></g></svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 160" role="img" aria-labelledby="title desc">
2
+ <title id="title">World Leading · WL</title><desc id="desc">World Leading master wordmark. The WL monogram and full brand name, independent of any product.</desc>
3
+ <g fill="#172331" transform="translate(12 10) scale(.87)"><path d="M18 24H42L58 84L82 24H104L126 84L145 24H170L134 136H111L93 100L76 136H53Z"/><path d="M181 24H205L174 112H226L218 136H142Z"/></g>
4
+ <path d="M250 36V127" fill="none" stroke="#66717C" stroke-opacity=".35"/>
5
+ <g font-family="'Helvetica Neue', Inter, Helvetica, Arial, sans-serif"><text x="290" y="82" fill="#172331" font-size="36" font-weight="500" letter-spacing="2.5">WORLD LEADING</text><text x="293" y="115" fill="#66717C" font-size="11" font-weight="500" letter-spacing="4.8">ENGINEERING</text></g></svg>
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { createInterface } from "node:readline/promises";
3
+ import { runSetupCli } from "../lib/setup.js";
4
+
5
+ try {
6
+ let args = process.argv.slice(2);
7
+ if (!args.length) {
8
+ if (!process.stdin.isTTY || !process.stdout.isTTY) throw new Error("启动菜单需要交互终端;自动任务请明确指定 project/workspace/central/release-input 及其预览/确认参数");
9
+ console.log("\nWL · WORLD LEADING | 质量工程接入\n\n1 首次接入项目\n2 初始化已接项目的本机环境\n3 运维接线预检\n4 启动中央采集与操作入口(消息预览)\n5 生成组合发布输入\nEnter 退出\n");
10
+ const prompt = createInterface({ input: process.stdin, output: process.stdout });
11
+ const choice = (await prompt.question("请选择:")).trim(); prompt.close();
12
+ const modes = { "1": ["project"], "2": ["workspace"], "3": ["central"], "4": ["central", "--start", "--watch"], "5": ["release-input"] };
13
+ if (!choice) process.exit(0);
14
+ if (!modes[choice]) throw new Error("请选择1到5");
15
+ args = modes[choice];
16
+ }
17
+ process.exitCode = await runSetupCli(args);
18
+ } catch (error) { console.error(`[quality-setup] ${error.message}`); process.exitCode = 2; }
@@ -76,6 +76,9 @@ try {
76
76
  } else if (command === "onboard") {
77
77
  const { runOnboardCli } = await import("../lib/onboard.js");
78
78
  process.exitCode = await runOnboardCli(rest);
79
+ } else if (command === "setup") {
80
+ const { runSetupCli } = await import("../lib/setup.js");
81
+ process.exitCode = await runSetupCli(rest);
79
82
  } else if (command === "doctor") {
80
83
  const o = options(["--root", "--kind", "--out"]);
81
84
  if (o.positional.length) throw new Error("doctor 不接受位置参数");
@@ -293,5 +296,5 @@ try {
293
296
  if (rest.length) throw new Error("self-test 不接受额外参数");
294
297
  const { runAllFixtures } = await import("../scripts/run-fixtures.mjs");
295
298
  process.exitCode = await runAllFixtures();
296
- } else throw new Error("用法: wl-skills-gate <onboard|run|doctor|automation|control|collect-ci|review-facts|review-ci|review-collect|review-publish|lifecycle-build|lifecycle-review|governance|inspect|cost|fix|validate-report|commit-message|manifest|attest|attest-collected|release-set|deployment|review-draft|review-sign|verify-artifact|promote|promote-apply|self-test>,详见 docs/README.md");
299
+ } else throw new Error("用法: wl-skills-gate <setup|onboard|run|doctor|automation|control|collect-ci|review-facts|review-ci|review-collect|review-publish|lifecycle-build|lifecycle-review|governance|inspect|cost|fix|validate-report|commit-message|manifest|attest|attest-collected|release-set|deployment|review-draft|review-sign|verify-artifact|promote|promote-apply|self-test>,详见 docs/README.md");
297
300
  } catch (e) { console.error(`[${command || "wl-skills-gate"}] ${e.message}`); process.exitCode = 2; }
@@ -13,19 +13,28 @@
13
13
 
14
14
  ## 技术经理一次接入,开发者由 Hook 自动检查
15
15
 
16
- 完整接入使用 `--complete`,从已批准的固定 Gate 产物运行预览。下例 `$GATE_ROOT` 指该完整包目录,`$PROJECT_ROOT` 指实际 Git 仓库根;前后端使用同一入口。
16
+ 负责人从批准的完整包打开 `templates/launchers/setup.command` / `setup.cmd` / `setup.sh`,选择任务即可。首次项目接入使用 `setup project` 交互向导:选择真实 Git 根和批准 HTTPS 安装源,查看文件、依赖、Hook 与固定安装 argv,确认当前阶段。脚本管理本阶段计划摘要,出现安装后的新差异再展示确认。
17
17
 
18
- ```bash
19
- node "$GATE_ROOT/bin/wl-skills-gate.js" onboard --root "$PROJECT_ROOT" --complete --registry "$APPROVED_NPM_REGISTRY"
20
- ```
18
+ | 入口 | 自动执行 | 成功反馈 |
19
+ |---|---|---|
20
+ | `setup project` | 预检→批准配置/依赖安装→原生规则/POM/锁→doctor→真实Hook首扫和提交说明正反验证 | `quality-reports/setup/<sessionId>/result.html`;阶段原件与执行回执可追溯 |
21
+ | `setup workspace` | 按已提交 `quality/workspace.json` 与依赖锁安装,恢复本机 Hook,实际验收 | `quality-reports/onboarding/workspace-execution.json`;不覆盖项目策略 |
22
+ | `setup central` | 中央配置、来源、身份、凭据存在性、旧状态及部署回流预检 | 逐项状态、责任人和下一步;预检不联网、不启动、不发送 |
23
+ | `setup release-input` | 核验固定来源原件、签名、摘要、兼容证据,确认后生成组合输入 | `configHash` / `inputHash` 与实际输入文件;不代替授权或签发 |
21
24
 
22
- 接入界面可直接消费此 JSON,展示项目判定、每个文件的修改前后内容、依赖版本变化、Hook 激活、冲突与剩余验收。技术经理确认**这份具体计划**后,界面传回其实际摘要:
25
+ 非交互入口默认只读。`setup project --root PATH --registry URL --preview --json` 可用于预检;项目首次写入由交互逐阶段批准,自动任务可继续使用下文底层 `onboard` 契约。
23
26
 
24
- ```bash
25
- node "$GATE_ROOT/bin/wl-skills-gate.js" onboard --root "$PROJECT_ROOT" --complete --registry "$APPROVED_NPM_REGISTRY" --apply --plan-hash "$ONBOARD_PLAN_HASH" --confirm
26
- ```
27
+ ### 已接项目的新克隆
28
+
29
+ 首次接入完成后,将生成的工作副本清单、依赖锁、Hook、脚本与 IDE 任务一并审阅提交。新成员在 VS Code/Cursor 中选择 **wl-quality:初始化本机质量环境**。缺少本地 Gate 时入口先展示清单固定版本和批准源,确认后获取引导工具;随后展示项目初始化计划,确认后安装与验收。不得重跑首次接入来覆盖已经批准的项目策略。
30
+
31
+ **wl-quality:打开项目检查接入状态** 在允许自动任务的受信工作区打开时执行,只读、不联网、不安装。IDE 的 Workspace Trust 与自动任务许可由用户环境控制;Git clone 自身不会执行仓库脚本。首次初始化成功后,日常仍由 Hook 自动检查。
27
32
 
28
- 安装源必须是明确批准的 HTTPS URL;URL 不含凭据,认证由受控环境注入。完整接入计划依次展示固定 argv 安装(关闭生命周期脚本)、原生规则实际预览与同步、后端 POM 精确补丁、实际版本锁、doctor、真实 Git Hook 首扫、提交说明正反演练。两个入口命令只给接入负责人或接入界面使用。开发者正常提交/推送时,Hook 自动检查;IDE 提供“查看报告 / 预览机械修复 / 确认应用并复扫”操作,不要求输入质量命令。修复需要本人预览和确认。
33
+ ### 运维与发布输入
34
+
35
+ 中央交互先询问配置目录及独立Review签发是否分机,默认分机,不读取独立私钥。只预检时使用 `setup central`;经批准启动时使用 `setup central --start --watch`,消息仍只预览。真实发送另加 `--send`,启动确认会明确显示发送范围。非交互启动要求 `--config-dir DIR --start --watch --confirm --plan-hash HASH`;分机时加 `--separate-review-signer`。服务以前台受控任务运行,SIGINT/SIGTERM 清理本任务启动的服务,不安装系统服务、不改GitLab/Jenkins权限或密钥、不启动独立签发。
36
+
37
+ 发布负责人维护 `templates/platform/release-input-config.json` 的项目副本。`setup release-input --config FILE` 展示实际组件、SHA、作业和输出,确认后生成输入。非交互生成需 `--confirm --config-hash HASH --input-hash HASH`;原件变化会使旧确认失效。作者映射、兼容性结论、恢复方案仍由对应负责人批准。生成后的原件摘要在签发前再次复核。
29
38
 
30
39
  - 默认计划将尚未配置的本地 `core.hooksPath` 指向生成的 `.githooks`;应用后生效。已有仓库内 Hook 路径直接复用,`.husky/_` 映射到用户 `.husky` 文件。既有Husky9转发器通过计划中独立、固定资产的激活阶段生成,不执行整个自定义prepare脚本;未知版本或路径明确阻断。
31
40
  - 既有脚本与检查保留。发现旧 Hook 自动写源码或重复检查时列出迁移项;不会擅自删除或跳过。
@@ -33,7 +42,14 @@ node "$GATE_ROOT/bin/wl-skills-gate.js" onboard --root "$PROJECT_ROOT" --complet
33
42
  - 计划、项目 HEAD、文件、模板、接入实现或选择变化后,旧摘要失效。冲突、路径越界、符号链接均拒写;写入有备份、独占锁与失败回滚。
34
43
  - `--no-activate-hooks` 可显式只生成文件;此时不能登记自动检查已生效。预览与应用必须使用相同选项。
35
44
 
36
- ## 实际差异出现时,再确认同一入口
45
+ ## 底层自动任务契约与阶段确认
46
+
47
+ 交互向导自动调用以下同一底层契约;脚本集成者才需要管理摘要。
48
+
49
+ ```bash
50
+ node "$GATE_ROOT/bin/wl-skills-gate.js" onboard --root "$PROJECT_ROOT" --complete --registry "$APPROVED_NPM_REGISTRY"
51
+ node "$GATE_ROOT/bin/wl-skills-gate.js" onboard --root "$PROJECT_ROOT" --complete --registry "$APPROVED_NPM_REGISTRY" --apply --plan-hash "$ONBOARD_PLAN_HASH" --confirm
52
+ ```
37
53
 
38
54
  首次尚未安装固定包时,无法提前知道它们的真实规则差异。确认首份计划后只完成本地配置与固定清单安装,结果为 `native-approval-required`;接入界面重新调用同一预览,显示实际 Kit/UI/BD 差异和新摘要,负责人确认后继续。BD 刚同步而 POM 模板首次出现时,以 `pom-approval-required` 展示完整 before/after,再确认同一入口。后续不需要技术经理拼装多个 update、Maven、版本查询或 Hook 命令。
39
55
 
@@ -67,7 +83,7 @@ GitLab/Jenkins 权限、可信中央模板、候选/独立 Review、构建/部
67
83
 
68
84
  ## 维护单源
69
85
 
70
- - 唯一公共入口:`lib/onboard.js`;唯一配置引擎:`lib/onboard-config.js`;完整任务编排:`lib/onboard-complete.js`。
86
+ - 交互入口:`lib/setup.js` / `lib/setup-modes.js`;底层首次接入:`lib/onboard.js` / `lib/onboard-config.js` / `lib/onboard-complete.js`;新克隆:`lib/workspace-init.js`;中央预检:`lib/setup-central.js`;发布输入:`lib/release-input.js`。
71
87
  - 包内交付源:`templates/onboarding/{frontend,backend,automation}`。`templates/scripts-quality/run.mjs` 与 schema 同包核验。
72
88
  - 文档目录旧 `automation/configure.mjs` 仅兼容转发;不得再次复制实现。文档配套文件是审阅用样例副本,维护时与包内交付源核对摘要。
73
89
  - 本模块测试覆盖真实 Git Hook 拒绝、前后端位置、旧 Hook 复用、幂等、漂移拒绝、完整包独立交付;不把隔离测试计为业务项目或远端验收。
package/docs/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # wl-skills-gate 技术手册索引
2
2
 
3
- 当前版本 0.9.0;对照团队落地执行 V3.4。技术宣贯基线仍为 V3.1;团队具体操作单源见 [16 项目与运维入口](16-project-ci-integration.md),本索引提供工具契约与参数参考。
3
+ 当前版本 0.10.0;对照团队落地执行 V3.4。技术宣贯基线仍为 V3.1;团队具体操作单源见 [16 项目与运维入口](16-project-ci-integration.md),本索引提供工具契约与参数参考。
4
4
 
5
5
  授权声明见 [LICENSE](../LICENSE);公开获取不授予使用、复制、修改或再分发授权,申请入口为 [仓库 Issues](https://github.com/ChenyCHENYU/wl-skills-gate/issues)。
6
6
 
7
- 状态分开登记:**共享实现已验证 / 项目已接入 / 平台已验收 / 业务闭环已验收**。每个状态须有自己的实际证据;以下手册不将本地自测、模板或签名通过标成生产接线完成。
7
+ 状态分开登记:**共享实现已验证 / 项目已接入 / 远端接线已验收 / 业务闭环已验收**。每个状态须有自己的实际证据;以下手册不将本地自测、模板或签名通过标成生产接线完成。
8
8
 
9
9
  | 手册 | 对应要求 | 内容 |
10
10
  |---|---|---|
package/lib/automation.js CHANGED
@@ -241,7 +241,27 @@ export async function automationTick({ configFile, send = false, env = process.e
241
241
  }
242
242
 
243
243
  export function startAutomation({ configFile, send = false, onResult = (result) => process.stdout.write(JSON.stringify(result) + "\n"), ...options }) {
244
- const c = loadAutomationConfig(configFile); let stopped = false, timer;
245
- const next = async () => { try { onResult(await automationTick({ configFile, send, ...options })); } catch (error) { onResult({ status: "attention", stage: "scheduler", reason: error.message }); } if (!stopped) timer = setTimeout(next, c.intervalSeconds * 1000); };
246
- next(); return { stop() { stopped = true; clearTimeout(timer); } };
244
+ const c = loadAutomationConfig(configFile); let stopped = false, timer, inFlight = Promise.resolve();
245
+ const next = () => {
246
+ if (stopped) return inFlight;
247
+ inFlight = (async () => {
248
+ let result;
249
+ try { result = await automationTick({ configFile, send, ...options }); }
250
+ catch (error) { result = { status: "attention", stage: "scheduler", reason: error.message }; }
251
+ // The result handler can be asynchronous. Drain it together with the tick
252
+ // before acknowledging stop; a failed handler must not create an unhandled
253
+ // rejection or schedule more work whose result cannot be reported.
254
+ try { await onResult(result); }
255
+ catch { stopped = true; result = { status: "attention", stage: "result-handler", reason: "调度结果回调失败;已停止后续周期" }; }
256
+ if (!stopped) timer = setTimeout(next, c.intervalSeconds * 1000);
257
+ return result;
258
+ })();
259
+ return inFlight;
260
+ };
261
+ next();
262
+ return { stop() {
263
+ // Already-issued network requests and journaled actions cannot be undone.
264
+ // Stop new cycles immediately, then finish the current bounded transaction.
265
+ stopped = true; clearTimeout(timer); return inFlight;
266
+ } };
247
267
  }
@@ -44,7 +44,7 @@ function tool(root, kind, name) {
44
44
  const real = realpathSync(directory);
45
45
  if (!real.startsWith(root + path.sep)) throw new Error("原生工具实际路径在项目外,不执行");
46
46
  const pkg = JSON.parse(readFileSync(path.join(real, "package.json")));
47
- const expected = { gate: fixedVersion, kit: "2.33.0", ui: "1.22.0", bd: "0.41.0" }[name];
47
+ const expected = { gate: fixedVersion, kit: "2.33.1", ui: "1.22.1", bd: "0.41.1" }[name];
48
48
  if (pkg.name !== `@agile-team/wl-skills-${name}` || pkg.version !== expected) throw new Error(`原生工具 ${name} 版本不匹配`);
49
49
  return { root: real, sha256: artifactDigest(real), version: pkg.version };
50
50
  }