oh-my-knowledge 0.36.0 → 0.37.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 (67) hide show
  1. package/README.md +5 -3
  2. package/README.zh.md +5 -3
  3. package/dist/assets/agent-skills/omk/SKILL.md +4 -2
  4. package/dist/assets/agent-skills/omk/references/commands.md +86 -3
  5. package/dist/cli/commands/doctor.js +19 -4
  6. package/dist/cli/commands/evolve.d.ts +11 -0
  7. package/dist/cli/commands/evolve.js +105 -5
  8. package/dist/cli/commands/list.d.ts +5 -26
  9. package/dist/cli/commands/list.js +17 -142
  10. package/dist/cli/commands/promote.d.ts +24 -0
  11. package/dist/cli/commands/promote.js +158 -0
  12. package/dist/cli/commands/rollback.d.ts +20 -0
  13. package/dist/cli/commands/rollback.js +95 -0
  14. package/dist/cli/commands/sample.d.ts +1 -0
  15. package/dist/cli/commands/sample.js +10 -4
  16. package/dist/cli/lib/cell-format.d.ts +17 -0
  17. package/dist/cli/lib/cell-format.js +19 -0
  18. package/dist/cli/lib/cmd-flags.d.ts +1 -0
  19. package/dist/cli/lib/i18n-dict/common.d.ts +1 -1
  20. package/dist/cli/lib/i18n-dict/common.js +8 -0
  21. package/dist/cli/lib/i18n-dict/list.d.ts +1 -1
  22. package/dist/cli/lib/i18n-dict/list.js +4 -0
  23. package/dist/cli/lib/i18n-dict/promote.d.ts +3 -0
  24. package/dist/cli/lib/i18n-dict/promote.js +54 -0
  25. package/dist/cli/lib/i18n-dict/rollback.d.ts +3 -0
  26. package/dist/cli/lib/i18n-dict/rollback.js +22 -0
  27. package/dist/cli/lib/i18n-dict.d.ts +3 -1
  28. package/dist/cli/lib/i18n-dict.js +4 -0
  29. package/dist/cli/lib/progress.d.ts +3 -0
  30. package/dist/cli/lib/progress.js +22 -0
  31. package/dist/cli/lib/source-probe.d.ts +15 -0
  32. package/dist/cli/lib/source-probe.js +129 -0
  33. package/dist/doctor/endpoint-rule.d.ts +60 -0
  34. package/dist/doctor/endpoint-rule.js +381 -0
  35. package/dist/doctor/health/load-custom-dimensions.d.ts +6 -0
  36. package/dist/doctor/health/load-custom-dimensions.js +43 -3
  37. package/dist/doctor/index.js +8 -1
  38. package/dist/executors/codex-cli.js +5 -1
  39. package/dist/managed/index.d.ts +1 -0
  40. package/dist/managed/index.js +1 -0
  41. package/dist/managed/list-view.d.ts +3 -0
  42. package/dist/managed/list-view.js +8 -4
  43. package/dist/managed/promote-gate.d.ts +40 -0
  44. package/dist/managed/promote-gate.js +37 -0
  45. package/dist/managed/store.d.ts +25 -2
  46. package/dist/managed/store.js +92 -3
  47. package/dist/renderer/doctor-detail-renderer.d.ts +9 -0
  48. package/dist/renderer/doctor-detail-renderer.js +114 -0
  49. package/dist/renderer/html-renderer.d.ts +3 -2
  50. package/dist/renderer/html-renderer.js +99 -99
  51. package/dist/renderer/icons.d.ts +29 -0
  52. package/dist/renderer/icons.js +66 -0
  53. package/dist/renderer/layout.js +81 -68
  54. package/dist/renderer/observation-inbox/styles.d.ts +1 -1
  55. package/dist/renderer/observation-inbox/styles.js +53 -53
  56. package/dist/renderer/report-shell.d.ts +77 -0
  57. package/dist/renderer/report-shell.js +223 -0
  58. package/dist/renderer/skill-detail-renderer.js +147 -352
  59. package/dist/renderer/skill-health-renderer.js +50 -73
  60. package/dist/renderer/skill-list-renderer.js +358 -306
  61. package/dist/renderer/summary.js +272 -162
  62. package/dist/renderer/test-view.d.ts +4 -3
  63. package/dist/renderer/test-view.js +386 -135
  64. package/dist/server/report-server.js +142 -28
  65. package/dist/types/doctor.d.ts +22 -0
  66. package/dist/types/managed.d.ts +17 -3
  67. package/package.json +1 -1
@@ -141,9 +141,9 @@ export const OBSERVATION_INBOX_STYLES = `
141
141
  gap: 6px;
142
142
  position: relative;
143
143
  }
144
- .inbox-card:hover { background: var(--bg-muted, rgba(58,58,58,.04)); }
144
+ .inbox-card:hover { background: var(--bg-muted, rgba(0,0,0,.04)); }
145
145
  .inbox-card.is-active {
146
- background: var(--info-bg, rgba(90,122,147,.08));
146
+ background: var(--info-bg, rgba(79,70,229,.08));
147
147
  }
148
148
  .inbox-card.is-active::before {
149
149
  content: '';
@@ -234,7 +234,7 @@ export const OBSERVATION_INBOX_STYLES = `
234
234
  font-size: 11px;
235
235
  padding: 2px 6px;
236
236
  border-radius: 4px;
237
- background: var(--bg-soft, rgba(58,58,58,.04));
237
+ background: var(--bg-soft, rgba(0,0,0,.04));
238
238
  color: var(--text-secondary);
239
239
  line-height: 1.4;
240
240
  }
@@ -276,7 +276,7 @@ export const OBSERVATION_INBOX_STYLES = `
276
276
  border-radius: 8px;
277
277
  padding: 10px 12px;
278
278
  margin-bottom: 12px;
279
- box-shadow: var(--shadow-sm, 0 1px 3px rgba(58,58,58,.06));
279
+ box-shadow: var(--shadow-sm, 0 1px 3px rgba(0,0,0,.06));
280
280
  }
281
281
  .inbox-detail-actions-row {
282
282
  display: flex;
@@ -424,7 +424,7 @@ export const OBSERVATION_INBOX_STYLES = `
424
424
  min-width: 38px;
425
425
  height: 20px;
426
426
  padding: 0 6px;
427
- background: var(--bg-muted, rgba(58,58,58,.04));
427
+ background: var(--bg-muted, rgba(0,0,0,.04));
428
428
  color: var(--text-secondary);
429
429
  font-size: 11px;
430
430
  border-radius: 4px;
@@ -442,7 +442,7 @@ export const OBSERVATION_INBOX_STYLES = `
442
442
  }
443
443
  .runtime-step-detail > summary:hover { color: var(--text-primary); }
444
444
  .runtime-step-detail-body { font-size: 12px; color: var(--text-secondary); line-height: 1.5; }
445
- .runtime-step-detail-body code { font-size: 11px; padding: 1px 4px; background: var(--bg-muted, rgba(58,58,58,.04)); border-radius: 3px; }
445
+ .runtime-step-detail-body code { font-size: 11px; padding: 1px 4px; background: var(--bg-muted, rgba(0,0,0,.04)); border-radius: 3px; }
446
446
  .runtime-step-detail-body p { margin: 4px 0 0; }
447
447
  .runtime-step-detail-body ul { margin: 4px 0 0; padding-left: 18px; }
448
448
  .runtime-rule-lite {
@@ -519,7 +519,7 @@ export const OBSERVATION_INBOX_STYLES = `
519
519
  padding: 7px 8px 7px 20px;
520
520
  border: 1px solid var(--border);
521
521
  border-radius: 6px;
522
- background: var(--bg-muted, rgba(58,58,58,.03));
522
+ background: var(--bg-muted, rgba(0,0,0,.03));
523
523
  }
524
524
  .runtime-rule-node::before {
525
525
  content: '';
@@ -686,7 +686,7 @@ export const OBSERVATION_INBOX_STYLES = `
686
686
  padding: 8px;
687
687
  border: 1px solid var(--border);
688
688
  border-radius: 5px;
689
- background: var(--bg-muted, rgba(58,58,58,.04));
689
+ background: var(--bg-muted, rgba(0,0,0,.04));
690
690
  color: var(--text-secondary);
691
691
  font-size: 11px;
692
692
  line-height: 1.45;
@@ -697,7 +697,7 @@ export const OBSERVATION_INBOX_STYLES = `
697
697
  border: 1px solid var(--border);
698
698
  border-radius: 5px;
699
699
  padding: 6px 7px 6px 20px;
700
- background: var(--bg-muted, rgba(58,58,58,.03));
700
+ background: var(--bg-muted, rgba(0,0,0,.03));
701
701
  }
702
702
  .runtime-rule-breakdown-item::before {
703
703
  content: '';
@@ -774,7 +774,7 @@ export const OBSERVATION_INBOX_STYLES = `
774
774
  border: 1px solid var(--border);
775
775
  border-radius: 5px;
776
776
  padding: 7px;
777
- background: var(--bg-muted, rgba(58,58,58,.03));
777
+ background: var(--bg-muted, rgba(0,0,0,.03));
778
778
  }
779
779
  .runtime-rule-breakdown-list strong,
780
780
  .runtime-rule-breakdown-list span {
@@ -811,7 +811,7 @@ export const OBSERVATION_INBOX_STYLES = `
811
811
  .runtime-rule-lite-notice span {
812
812
  border: 1px solid var(--border);
813
813
  border-radius: 5px;
814
- background: var(--bg-muted, rgba(58,58,58,.04));
814
+ background: var(--bg-muted, rgba(0,0,0,.04));
815
815
  padding: 4px 7px;
816
816
  }
817
817
  .runtime-rule-lite-section h5 {
@@ -911,7 +911,7 @@ export const OBSERVATION_INBOX_STYLES = `
911
911
  margin-left: -1px;
912
912
  padding: 4px 7px;
913
913
  border: 1px solid var(--border);
914
- background: var(--info-bg, rgba(90,122,147,.08));
914
+ background: var(--info-bg, rgba(79,70,229,.08));
915
915
  color: var(--accent);
916
916
  font-size: 11px;
917
917
  border-radius: 0 999px 999px 0;
@@ -923,7 +923,7 @@ export const OBSERVATION_INBOX_STYLES = `
923
923
  }
924
924
  .inbox-session-flow-chip:hover {
925
925
  border-color: var(--accent);
926
- background: rgba(90,122,147,.14);
926
+ background: rgba(79,70,229,.14);
927
927
  }
928
928
  .inbox-session-tab:hover { color: var(--text-primary); border-color: var(--border-hover, var(--border)); }
929
929
  .inbox-session-tab.is-active { background: var(--accent); color: #fff; border-color: var(--accent); }
@@ -954,7 +954,7 @@ export const OBSERVATION_INBOX_STYLES = `
954
954
  font-size: 9px;
955
955
  line-height: 1.25;
956
956
  font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
957
- box-shadow: var(--shadow-sm, 0 1px 3px rgba(58,58,58,.08));
957
+ box-shadow: var(--shadow-sm, 0 1px 3px rgba(0,0,0,.08));
958
958
  }
959
959
  .inbox-session-panes { width: 100%; }
960
960
  .inbox-session-pane { display: none; width: 100%; box-sizing: border-box; }
@@ -965,7 +965,7 @@ export const OBSERVATION_INBOX_STYLES = `
965
965
  flex-wrap: wrap;
966
966
  gap: 10px 14px;
967
967
  padding: 8px 12px;
968
- background: var(--bg-soft, rgba(58,58,58,.03));
968
+ background: var(--bg-soft, rgba(0,0,0,.03));
969
969
  border: 1px solid var(--border);
970
970
  border-radius: 6px;
971
971
  margin-bottom: 12px;
@@ -975,7 +975,7 @@ export const OBSERVATION_INBOX_STYLES = `
975
975
  .inbox-session-meta code { font-size: 11px; padding: 1px 5px; background: var(--bg-surface); border: 1px solid var(--border); border-radius: 4px; }
976
976
  .inbox-section-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
977
977
  .inbox-section-head-clickable { cursor: pointer; user-select: none; margin: -4px -6px 8px; padding: 4px 6px; border-radius: 6px; }
978
- .inbox-section-head-clickable:hover { background: var(--bg-soft, rgba(58,58,58,.04)); }
978
+ .inbox-section-head-clickable:hover { background: var(--bg-soft, rgba(0,0,0,.04)); }
979
979
  .inbox-section.is-collapsed .inbox-section-head-clickable { margin-bottom: 0; }
980
980
  .inbox-section-head h3 { font-size: 13px; margin: 0; color: var(--text-primary); flex-shrink: 0; }
981
981
  .inbox-section-summary {
@@ -989,7 +989,7 @@ export const OBSERVATION_INBOX_STYLES = `
989
989
  }
990
990
  .inbox-section-summary.is-attention { background: var(--red-bg); border-color: var(--red); color: var(--red); }
991
991
  .inbox-section-summary.is-ok { background: var(--green-bg); border-color: var(--green); color: var(--green); }
992
- .inbox-section-summary.is-neutral { background: var(--info-bg, rgba(90,122,147,.08)); border-color: var(--accent); color: var(--accent); }
992
+ .inbox-section-summary.is-neutral { background: var(--info-bg, rgba(79,70,229,.08)); border-color: var(--accent); color: var(--accent); }
993
993
  .inbox-section-hint { font-size: 11px; color: var(--text-muted); flex: 1 1 auto; min-width: 0; }
994
994
  .inbox-section-review {
995
995
  position: relative;
@@ -1013,7 +1013,7 @@ export const OBSERVATION_INBOX_STYLES = `
1013
1013
  .inbox-section-review-button:hover {
1014
1014
  border-color: var(--accent);
1015
1015
  color: var(--accent);
1016
- background: var(--info-bg, rgba(90,122,147,.08));
1016
+ background: var(--info-bg, rgba(79,70,229,.08));
1017
1017
  }
1018
1018
  .inbox-section-review-panel {
1019
1019
  position: absolute;
@@ -1087,7 +1087,7 @@ export const OBSERVATION_INBOX_STYLES = `
1087
1087
  border-radius: 6px;
1088
1088
  background: rgba(255, 255, 255, 0.92);
1089
1089
  border: 1px solid var(--border);
1090
- box-shadow: var(--shadow-sm, 0 1px 3px rgba(58,58,58,.08));
1090
+ box-shadow: var(--shadow-sm, 0 1px 3px rgba(0,0,0,.08));
1091
1091
  backdrop-filter: blur(6px);
1092
1092
  -webkit-backdrop-filter: blur(6px);
1093
1093
  line-height: 1.4;
@@ -1101,7 +1101,7 @@ export const OBSERVATION_INBOX_STYLES = `
1101
1101
  font-size: 10px;
1102
1102
  }
1103
1103
  .inbox-detail-nav a:hover {
1104
- background: var(--info-bg, rgba(90,122,147,.12));
1104
+ background: var(--info-bg, rgba(79,70,229,.12));
1105
1105
  color: var(--accent);
1106
1106
  border-color: var(--accent);
1107
1107
  }
@@ -1177,7 +1177,7 @@ export const OBSERVATION_INBOX_STYLES = `
1177
1177
  background: var(--info-bg, rgba(37,99,235,.08));
1178
1178
  border-color: rgba(37,99,235,.28);
1179
1179
  }
1180
- .inbox-flow-anchor:hover .inbox-flow-body { background: var(--bg-muted, rgba(58,58,58,.04)); }
1180
+ .inbox-flow-anchor:hover .inbox-flow-body { background: var(--bg-muted, rgba(0,0,0,.04)); }
1181
1181
  .inbox-flow-item.is-current .inbox-flow-anchor:hover .inbox-flow-body { background: var(--info-bg, rgba(37,99,235,.08)); }
1182
1182
  .inbox-flow-index {
1183
1183
  width: 22px; height: 22px;
@@ -1222,7 +1222,7 @@ export const OBSERVATION_INBOX_STYLES = `
1222
1222
  padding: 6px 8px;
1223
1223
  border: 1px solid var(--border);
1224
1224
  border-radius: 6px;
1225
- background: var(--bg-soft, rgba(58,58,58,.03));
1225
+ background: var(--bg-soft, rgba(0,0,0,.03));
1226
1226
  margin-bottom: 6px;
1227
1227
  font-size: 12px;
1228
1228
  }
@@ -1447,7 +1447,7 @@ export const OBSERVATION_INBOX_STYLES = `
1447
1447
  }
1448
1448
  .inbox-execution-node.is-current .inbox-execution-node-main {
1449
1449
  border-color: var(--accent);
1450
- background: var(--info-bg, rgba(90,122,147,.08));
1450
+ background: var(--info-bg, rgba(79,70,229,.08));
1451
1451
  }
1452
1452
  .inbox-execution-node-index {
1453
1453
  display: inline-flex;
@@ -1522,7 +1522,7 @@ export const OBSERVATION_INBOX_STYLES = `
1522
1522
  .inbox-skill-block {
1523
1523
  border: 1px solid var(--border);
1524
1524
  border-radius: 6px;
1525
- background: var(--bg-soft, rgba(58,58,58,.02));
1525
+ background: var(--bg-soft, rgba(0,0,0,.02));
1526
1526
  padding: 10px 12px;
1527
1527
  margin-bottom: 10px;
1528
1528
  scroll-margin-top: 12px;
@@ -1568,7 +1568,7 @@ export const OBSERVATION_INBOX_STYLES = `
1568
1568
  font-size: 11px;
1569
1569
  line-height: 1.4;
1570
1570
  border: 1px solid var(--border);
1571
- background: var(--bg-soft, rgba(58,58,58,.03));
1571
+ background: var(--bg-soft, rgba(0,0,0,.03));
1572
1572
  color: var(--text-secondary);
1573
1573
  }
1574
1574
  .inbox-data-health { font-weight: 700; }
@@ -1631,7 +1631,7 @@ export const OBSERVATION_INBOX_STYLES = `
1631
1631
  padding: 6px 8px;
1632
1632
  border: 1px solid var(--border);
1633
1633
  border-radius: 6px;
1634
- background: var(--bg-soft, rgba(58,58,58,.03));
1634
+ background: var(--bg-soft, rgba(0,0,0,.03));
1635
1635
  display: grid;
1636
1636
  gap: 6px;
1637
1637
  }
@@ -1686,7 +1686,7 @@ export const OBSERVATION_INBOX_STYLES = `
1686
1686
  padding: 3px 7px;
1687
1687
  border: 1px solid var(--border);
1688
1688
  border-radius: 999px;
1689
- background: var(--bg-soft, rgba(58,58,58,.03));
1689
+ background: var(--bg-soft, rgba(0,0,0,.03));
1690
1690
  color: var(--text-secondary);
1691
1691
  font-size: 11px;
1692
1692
  line-height: 1.45;
@@ -1811,7 +1811,7 @@ export const OBSERVATION_INBOX_STYLES = `
1811
1811
  padding: 7px 9px;
1812
1812
  border: 1px dashed var(--border);
1813
1813
  border-radius: 6px;
1814
- background: var(--bg-soft, rgba(58,58,58,.03));
1814
+ background: var(--bg-soft, rgba(0,0,0,.03));
1815
1815
  font-size: 11px;
1816
1816
  }
1817
1817
  .inbox-answer-meta-row { display: flex; gap: 6px; margin-bottom: 4px; line-height: 1.5; }
@@ -1995,7 +1995,7 @@ export const OBSERVATION_INBOX_STYLES = `
1995
1995
  border: 1px solid var(--border);
1996
1996
  border-radius: 10px;
1997
1997
  background: var(--bg-surface);
1998
- box-shadow: var(--shadow-md, 0 8px 24px rgba(58,58,58,.16));
1998
+ box-shadow: var(--shadow-md, 0 8px 24px rgba(0,0,0,.16));
1999
1999
  }
2000
2000
  .inbox-flow-popover-close {
2001
2001
  position: sticky;
@@ -2061,7 +2061,7 @@ export const OBSERVATION_INBOX_STYLES = `
2061
2061
  color: inherit;
2062
2062
  transition: background-color .12s, border-color .12s;
2063
2063
  }
2064
- .inbox-metric-card:hover { background: var(--info-bg, rgba(90,122,147,.06)); border-color: var(--accent); }
2064
+ .inbox-metric-card:hover { background: var(--info-bg, rgba(79,70,229,.06)); border-color: var(--accent); }
2065
2065
  .inbox-metric-card:hover .inbox-metric-card-hint { color: var(--accent); }
2066
2066
  .inbox-metric-card.is-anomaly { border-left: 3px solid var(--red); }
2067
2067
  .inbox-metric-card.is-anomaly strong { color: var(--red); }
@@ -2082,7 +2082,7 @@ export const OBSERVATION_INBOX_STYLES = `
2082
2082
  margin-bottom: 6px;
2083
2083
  padding: 4px 8px;
2084
2084
  border-left: 2px solid var(--accent);
2085
- background: var(--info-bg, rgba(90,122,147,.06));
2085
+ background: var(--info-bg, rgba(79,70,229,.06));
2086
2086
  border-radius: 0 4px 4px 0;
2087
2087
  }
2088
2088
  #inbox-metric-popover {
@@ -2095,7 +2095,7 @@ export const OBSERVATION_INBOX_STYLES = `
2095
2095
  background: var(--bg-surface);
2096
2096
  border: 1px solid var(--border);
2097
2097
  border-radius: 10px;
2098
- box-shadow: var(--shadow-md, 0 2px 12px rgba(58,58,58,.12));
2098
+ box-shadow: var(--shadow-md, 0 2px 12px rgba(0,0,0,.12));
2099
2099
  z-index: 200;
2100
2100
  padding: 0;
2101
2101
  overflow: hidden;
@@ -2652,7 +2652,7 @@ export const OBSERVATION_INBOX_STYLES = `
2652
2652
  align-items: start;
2653
2653
  margin: 4px 0 7px;
2654
2654
  padding: 6px 8px;
2655
- border: 1px solid rgba(148,163,184,.45);
2655
+ border: 1px solid rgba(107,114,128,.45);
2656
2656
  border-left: 3px solid var(--accent);
2657
2657
  border-radius: 7px;
2658
2658
  background: var(--bg-surface);
@@ -2849,7 +2849,7 @@ export const OBSERVATION_INBOX_STYLES = `
2849
2849
  flex-direction: column;
2850
2850
  gap: 3px;
2851
2851
  padding: 6px 7px;
2852
- border: 1px solid rgba(148,163,184,.35);
2852
+ border: 1px solid rgba(107,114,128,.35);
2853
2853
  border-radius: 7px;
2854
2854
  background: var(--bg-surface);
2855
2855
  }
@@ -3098,7 +3098,7 @@ export const OBSERVATION_INBOX_STYLES = `
3098
3098
  margin-left: 6px;
3099
3099
  padding: 1px 6px;
3100
3100
  border-radius: 999px;
3101
- background: rgba(148,163,184,.14);
3101
+ background: rgba(107,114,128,.14);
3102
3102
  color: var(--text-muted);
3103
3103
  font-size: 10px;
3104
3104
  font-weight: 700;
@@ -3525,7 +3525,7 @@ export const OBSERVATION_INBOX_STYLES = `
3525
3525
  .session-story-answer.is-attention,
3526
3526
  .session-story-node.is-attention {
3527
3527
  border-left-color: var(--red);
3528
- background: rgba(156,74,63,.06);
3528
+ background: rgba(220,38,38,.06);
3529
3529
  }
3530
3530
  .session-story-answer.is-unknown,
3531
3531
  .session-story-node.is-unknown {
@@ -3630,7 +3630,7 @@ export const OBSERVATION_INBOX_STYLES = `
3630
3630
  gap: 5px;
3631
3631
  margin-top: 7px;
3632
3632
  padding-top: 7px;
3633
- border-top: 1px solid rgba(148,163,184,.20);
3633
+ border-top: 1px solid rgba(107,114,128,.20);
3634
3634
  color: var(--text-muted);
3635
3635
  font-size: 11px;
3636
3636
  }
@@ -3667,15 +3667,15 @@ export const OBSERVATION_INBOX_STYLES = `
3667
3667
  font-weight: 700;
3668
3668
  }
3669
3669
  .soft-standard-status[data-soft-standard-status="author_confirmed"] {
3670
- background: rgba(16,185,129,.14);
3670
+ background: rgba(31,157,99,.14);
3671
3671
  color: var(--green);
3672
3672
  }
3673
3673
  .soft-standard-status[data-soft-standard-status="rejected"] {
3674
- background: rgba(239,68,68,.12);
3674
+ background: rgba(220,38,38,.12);
3675
3675
  color: var(--red);
3676
3676
  }
3677
3677
  .soft-standard-status[data-soft-standard-status="stale"] {
3678
- background: rgba(245,158,11,.16);
3678
+ background: rgba(217,119,6,.16);
3679
3679
  color: var(--yellow);
3680
3680
  }
3681
3681
  .soft-standard-actions {
@@ -3742,7 +3742,7 @@ export const OBSERVATION_INBOX_STYLES = `
3742
3742
  gap: 6px;
3743
3743
  margin-top: 8px;
3744
3744
  padding-top: 8px;
3745
- border-top: 1px solid rgba(148,163,184,.20);
3745
+ border-top: 1px solid rgba(107,114,128,.20);
3746
3746
  }
3747
3747
  .soft-standard-pending-item {
3748
3748
  padding: 6px 7px;
@@ -4036,14 +4036,14 @@ export const OBSERVATION_INBOX_STYLES = `
4036
4036
  opacity: .55;
4037
4037
  }
4038
4038
  .timeline-row[data-current-skill-window="0"] .timeline-card {
4039
- background: rgba(148,163,184,.04);
4040
- border-color: rgba(148,163,184,.18);
4039
+ background: rgba(107,114,128,.04);
4040
+ border-color: rgba(107,114,128,.18);
4041
4041
  }
4042
4042
  .timeline-row[data-current-skill-window="0"] .timeline-snippet {
4043
4043
  color: var(--text-muted);
4044
4044
  }
4045
4045
  .timeline-row[data-current-skill-window="0"]::before {
4046
- background: rgba(148,163,184,.25);
4046
+ background: rgba(107,114,128,.25);
4047
4047
  }
4048
4048
  .timeline-window-marker {
4049
4049
  display: flex;
@@ -4154,8 +4154,8 @@ export const OBSERVATION_INBOX_STYLES = `
4154
4154
  border-radius: 999px;
4155
4155
  font-size: 11px;
4156
4156
  line-height: 1.35;
4157
- border: 1px solid rgba(148,163,184,.16);
4158
- background: rgba(148,163,184,.08);
4157
+ border: 1px solid rgba(107,114,128,.16);
4158
+ background: rgba(107,114,128,.08);
4159
4159
  color: var(--text-secondary);
4160
4160
  white-space: nowrap;
4161
4161
  flex-shrink: 0;
@@ -4634,16 +4634,16 @@ export const OBSERVATION_INBOX_STYLES = `
4634
4634
  color: var(--red);
4635
4635
  }
4636
4636
  .skill-evidence-summary .summary-impact-sample {
4637
- background: rgba(148,163,184,.08);
4638
- border-color: rgba(148,163,184,.16);
4637
+ background: rgba(107,114,128,.08);
4638
+ border-color: rgba(107,114,128,.16);
4639
4639
  }
4640
4640
  .skill-evidence-summary .summary-impact-sample .summary-name,
4641
4641
  .skill-evidence-summary .summary-impact-sample .summary-count {
4642
4642
  color: var(--text-secondary);
4643
4643
  }
4644
4644
  .skill-evidence-summary .summary-impact-soft {
4645
- background: rgba(99,102,241,.08);
4646
- border-color: rgba(99,102,241,.18);
4645
+ background: rgba(79,70,229,.08);
4646
+ border-color: rgba(79,70,229,.18);
4647
4647
  }
4648
4648
  .skill-evidence-summary .summary-impact-soft .summary-name,
4649
4649
  .skill-evidence-summary .summary-impact-soft .summary-count {
@@ -5135,7 +5135,7 @@ export const OBSERVATION_INBOX_STYLES = `
5135
5135
  .metric-positive { background: rgba(22,163,74,.12); color: var(--green); border-color: rgba(22,163,74,.25); }
5136
5136
  .metric-completion { background: rgba(22,163,74,.10); color: var(--green); border-color: rgba(22,163,74,.22); }
5137
5137
  .metric-hard-rule { background: rgba(126,34,206,.12); color: #7e22ce; border-color: rgba(126,34,206,.25); }
5138
- .metric-repeated-execution { background: rgba(245,158,11,.13); color: #b45309; border-color: rgba(245,158,11,.28); }
5138
+ .metric-repeated-execution { background: rgba(217,119,6,.13); color: #b45309; border-color: rgba(217,119,6,.28); }
5139
5139
  .metric-hedging { background: rgba(14,165,233,.12); color: #0284c7; border-color: rgba(14,165,233,.25); }
5140
5140
  .metric-explicit { background: rgba(220,38,38,.12); color: var(--red); border-color: rgba(220,38,38,.25); }
5141
5141
  .metric-tool-use { background: rgba(202,138,4,.10); color: var(--yellow); border-color: rgba(202,138,4,.25); }
@@ -5172,9 +5172,9 @@ export const OBSERVATION_INBOX_STYLES = `
5172
5172
  .timeline-badge.metric-tool-failure,
5173
5173
  .timeline-badge.metric-skill-context,
5174
5174
  .timeline-badge.metric-neutral {
5175
- background: rgba(148,163,184,.08);
5175
+ background: rgba(107,114,128,.08);
5176
5176
  color: var(--text-secondary);
5177
- border-color: rgba(148,163,184,.16);
5177
+ border-color: rgba(107,114,128,.16);
5178
5178
  }
5179
5179
  .timeline-row.is-cta-focus .timeline-card {
5180
5180
  border-color: rgba(37,99,235,.62);
@@ -0,0 +1,77 @@
1
+ import type { Lang } from '../types/index.js';
2
+ export declare const DIM_COLORS: {
3
+ readonly doctor: "#2563eb";
4
+ readonly eval: "#7c3aed";
5
+ readonly observe: "#059669";
6
+ };
7
+ export declare function scoreColor(s: number): string;
8
+ /** 跨维度「综合健康」0-100 配色:≥85 绿 / ≥60 琥珀 / 其余红 / null 灰。
9
+ * 与 scoreColor(doctor 严格「100 才绿」)分开 —— 综合健康是聚合分,90 应读作"好"(绿),
10
+ * 而不是 doctor 那种"非满分即有问题"。Hero ring 与首页列表统一用它,避免同一个数两种颜色。 */
11
+ export declare function healthColor(score: number | null): string;
12
+ /** band → 十六进制色(绿/黄/红/灰)。供 hero 综合健康 ring、chip 状态点等复用。 */
13
+ export declare function bandHex(band: 'green' | 'yellow' | 'red' | 'gray'): string;
14
+ /** 一个维度 chip(doctor / eval / observe)。score 0-100,null=无分;href=null 表示当前页或无数据。 */
15
+ export interface SkillReportContextChip {
16
+ dim: keyof typeof DIM_COLORS;
17
+ label: string;
18
+ score: number | null;
19
+ band: 'green' | 'yellow' | 'red' | 'gray';
20
+ href: string | null;
21
+ active: boolean;
22
+ }
23
+ /** 「全部历史」弹框里的一条历史记录(doctor / eval 的某一次 run)。 */
24
+ export interface SkillReportHistoryItem {
25
+ dim: keyof typeof DIM_COLORS;
26
+ dateText: string;
27
+ scoreText: string;
28
+ /** 分数色档,用于一眼扫出哪次回归。 */
29
+ band: 'green' | 'yellow' | 'red' | 'gray';
30
+ metaText: string;
31
+ href: string;
32
+ current: boolean;
33
+ }
34
+ /** 报告页顶部的「skill 上下文」:三个维度互链 + 「全部历史」弹框。让同一 skill 的报告跨维度/跨轮次都能一跳到达。 */
35
+ export interface SkillReportContext {
36
+ /** 规范 skill 名(来自 skill-index entry)— 各报告页头部统一用它,避免 eval/doctor 名字不一致。 */
37
+ skillName: string;
38
+ /** 综合健康分(跨维度聚合,与首页列表同口径)。报告页只显单维度,这里把「总分」也带上。 */
39
+ overall: {
40
+ score: number | null;
41
+ band: 'green' | 'yellow' | 'red' | 'gray';
42
+ };
43
+ chips: SkillReportContextChip[];
44
+ /** 该 skill 的 doctor + eval 历次报告,供「全部历史」弹框选择。 */
45
+ history: SkillReportHistoryItem[];
46
+ }
47
+ export interface ReportShellOpts {
48
+ /** 维度:决定强调色。 */
49
+ dim: keyof typeof DIM_COLORS;
50
+ /** emoji 图标。 */
51
+ icon: string;
52
+ /** 报告类型标题,如「健康体检报告」。 */
53
+ kindTitle: string;
54
+ /** skill 名称。 */
55
+ skillName: string;
56
+ /** 副信息行(时间戳 / reportId 等)。 */
57
+ metaItems: string[];
58
+ /** 弧度填充用的 0-100 比例,null = 不显示 ring。 */
59
+ score: number | null;
60
+ /** 圆心显示文字。不传则显 score。eval 用它显原生 "4.09",doctor 显 "75"。 */
61
+ scoreText?: string;
62
+ /** 弧/数字/等级文字颜色覆盖。eval 按 /5 色档,不传则按 0-100 阈值。 */
63
+ ringColor?: string;
64
+ /** 综合分下方的文字(如「综合分 / 5」「健康分 / 100」)。 */
65
+ scoreLabel?: string;
66
+ /** 返回链接。 */
67
+ backHref: string;
68
+ backLabel: string;
69
+ /** 内容区 HTML。 */
70
+ body: string;
71
+ /** skill 上下文 chip 条(可选)— doctor/eval/observe 互链 + 回 hub。 */
72
+ skillContext?: SkillReportContext;
73
+ /** 额外 CSS。 */
74
+ extraCss?: string;
75
+ }
76
+ export declare function reportShell(opts: ReportShellOpts, lang?: Lang): string;
77
+ export declare const REPORT_SHELL_CSS = "\n/* \u2500\u2500 \u9762\u5305\u5C51(\u66FF\u6389\u88F8\u8FD4\u56DE\u94FE\u63A5) \u2500\u2500 */\n.rs-crumb{display:flex;align-items:center;gap:8px;margin-bottom:16px;font-size:13px;color:#637083}\n.rs-crumb-link{display:inline-flex;align-items:center;gap:6px;color:#637083;text-decoration:none}\n.rs-crumb-link:hover{color:#4f46e5;text-decoration:none}\n.rs-crumb-link svg{color:#9ca3af}\n.rs-crumb-link:hover svg{color:#4f46e5}\n.rs-crumb-sep{color:#c0c6d2}\n.rs-crumb-dim{color:#637083}\n.rs-crumb-cur{color:#182033;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.rs-crumb-spacer{flex:1}\n.rs-crumb-back{display:inline-flex;align-items:center;gap:5px;color:#9ca3af;text-decoration:none;flex-shrink:0}\n.rs-crumb-back:hover{color:#4f46e5;text-decoration:none}\n\n/* \u2500\u2500 skill \u7EF4\u5EA6\u5207\u6362\u5668(doctor/eval/observe \u4E92\u94FE)\u2014 \u5206\u6BB5\u63A7\u4EF6\u98CE \u2500\u2500 */\n.rs-dims{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0 0 16px}\n.rs-dims-seg{display:inline-flex;align-items:stretch;background:#fff;border:1px solid #e4e8f1;border-radius:10px;padding:3px;gap:2px;box-shadow:0 1px 2px rgba(31,41,55,3%)}\n.rs-dim{display:inline-flex;align-items:center;gap:7px;font-size:13px;padding:7px 14px;border-radius:7px;color:#637083;text-decoration:none;white-space:nowrap;transition:background .12s,color .12s}\na.rs-dim:hover{background:#f1f4f9;color:#182033}\n.rs-dim-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}\n.rs-dim-lbl{font-weight:500}\n/* \u5F53\u524D\u7EF4\u5EA6:\u6D45\u586B\u5145 + \u72B6\u6001\u70B9\u5DF2\u8868\u660E\u8EAB\u4EFD,\u6587\u5B57\u52A0\u91CD */\n.rs-dim--active{background:#f1f4f9;color:#182033;cursor:default}\n.rs-dim--active .rs-dim-lbl{font-weight:700}\n.rs-dim--empty{color:#b6bcc8;cursor:default}\n/* \u5168\u90E8\u5386\u53F2\u6309\u94AE */\n.rs-hist-btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:7px 13px;border-radius:9px;border:1px solid #e4e8f1;background:#fff;color:#637083;cursor:pointer;white-space:nowrap;font-family:inherit;transition:border-color .15s,color .15s}\n.rs-hist-btn:hover{border-color:#c7cedb;color:#182033}\n.rs-hist-ct{font-variant-numeric:tabular-nums;font-weight:700;color:#9ca3af;font-size:12px}\n/* \u5168\u90E8\u5386\u53F2\u5F39\u6846 */\n.rs-hist-overlay{display:none;position:fixed;inset:0;background:rgba(24,32,51,.32);z-index:50;align-items:flex-start;justify-content:center;padding:8vh 16px}\n.rs-hist-modal{background:#fff;border-radius:14px;box-shadow:0 24px 60px rgba(31,41,55,.22);width:100%;max-width:520px;max-height:76vh;display:flex;flex-direction:column;overflow:hidden}\n.rs-hist-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #eef1f6;font-size:14px;color:#182033}\n.rs-hist-x{background:transparent;border:none;color:#9ca3af;font-size:16px;cursor:pointer;line-height:1;padding:4px}\n.rs-hist-x:hover{color:#182033}\n.rs-hist-list{overflow-y:auto;padding:6px 10px 12px}\n.rs-hist-group{margin-top:8px}\n.rs-hist-group-h{display:flex;align-items:center;gap:7px;font-size:12px;color:#637083;font-weight:600;padding:8px 8px 6px}\n.rs-hist-group-dot{width:7px;height:7px;border-radius:50%}\n.rs-hist-group-h small{font-weight:500;color:#b6bcc8}\n.rs-hist-row{display:flex;align-items:baseline;gap:14px;padding:8px;border-radius:8px;text-decoration:none;color:#182033;font-size:13px}\n.rs-hist-row:hover{background:#f1f4f9}\n.rs-hist-row--cur{background:#f1f4f9;cursor:default}\n.rs-hist-date{font-variant-numeric:tabular-nums;color:#637083;min-width:88px;flex-shrink:0}\n.rs-hist-score{font-weight:700;font-variant-numeric:tabular-nums;font-family:\"SF Mono\",Menlo,monospace;min-width:72px;flex-shrink:0}\n.rs-hist-score--green{color:#1f9d63}.rs-hist-score--yellow{color:#d97706}.rs-hist-score--red{color:#dc2626}.rs-hist-score--gray{color:#9ca3af}\n.rs-hist-meta{flex:1;min-width:0;color:#9ca3af;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.rs-hist-go{color:#c0c6d2;font-size:13px;flex-shrink:0}\n.rs-hist-row:hover .rs-hist-go{color:#637083}\n.rs-hist-row--cur .rs-hist-go{color:#4f46e5;font-weight:600;font-size:12px}\n\n/* \u2500\u2500 Hero \u2500\u2500 */\n.rs-hero{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:20px 24px;background:#fff;border:1px solid #e4e8f1;border-radius:12px;box-shadow:0 8px 24px rgba(31,41,55,4%);margin-bottom:16px}\n@media(max-width:640px){.rs-hero{flex-direction:column;align-items:flex-start}}\n.rs-hero-left{display:flex;flex-direction:column;gap:4px;min-width:0}\n.rs-hero-kind{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#637083}\n.rs-hero-icon{display:inline-flex;align-items:center}\n.rs-hero-name{margin:0;font-size:20px;font-weight:700;color:#182033;letter-spacing:-.2px}\n.rs-hero-meta{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:4px;color:#9ca3af;font-size:12px;font-variant-numeric:tabular-nums}\n.rs-hero-meta span{display:inline-flex;align-items:center;gap:4px}\n.rs-hero-score{display:flex;flex-direction:column;align-items:flex-end;gap:2px;flex-shrink:0;line-height:1}\n.rs-hero-num{font-size:40px;font-weight:800;letter-spacing:-1.5px;font-variant-numeric:tabular-nums;line-height:1}\n.rs-hero-grade{font-size:12px;font-weight:600;color:#637083}\n\n/* \u2500\u2500 \u7EDF\u8BA1\u6761 \u2500\u2500 */\n.rs-stats{display:flex;flex-wrap:wrap;gap:20px;padding:14px 20px;background:#fff;border:1px solid #e4e8f1;border-radius:10px;box-shadow:0 8px 24px rgba(31,41,55,4%);margin-bottom:16px}\n.rs-stat{display:flex;align-items:baseline;gap:6px}\n.rs-stat-num{font-size:20px;font-weight:800;font-variant-numeric:tabular-nums;line-height:1}\n.rs-stat-label{font-size:12px;color:#637083}\n.rs-stat--pass .rs-stat-num{color:#1f9d63}\n.rs-stat--warn .rs-stat-num{color:#d97706}\n.rs-stat--fail .rs-stat-num{color:#dc2626}\n.rs-stat--total .rs-stat-num{color:#182033}\n\n/* \u2500\u2500 Panel\uFF08\u5185\u5BB9\u533A\u5757\uFF09 \u2500\u2500 */\n.rs-panel{background:#fff;border:1px solid #e4e8f1;border-radius:12px;box-shadow:0 8px 24px rgba(31,41,55,4%);padding:18px 20px;margin-bottom:16px}\n.rs-panel-title{display:flex;align-items:center;gap:8px;font-size:15px;font-weight:700;color:#182033;margin-bottom:14px}\n.rs-panel-title small{font-size:12px;font-weight:400;color:#9ca3af;margin-left:4px}\n\n/* \u2500\u2500 \u89C4\u5219 / \u7528\u4F8B:\u9762\u677F\u5185\u7684 hairline \u5217\u8868\u9879(\u65E0 tint \u76D2\u5B50,\u72B6\u6001\u9760\u5DE6\u4FA7\u8272\u70B9) \u2500\u2500 */\n.rs-card{border-bottom:1px solid #eef1f6;background:transparent;border-radius:8px;transition:background .12s}\n.rs-card:last-child{border-bottom:none}\ndetails.rs-card:not([open]):hover{background:#f9fafc}\ndetails.rs-card[open]{background:#fafbfd}\n.rs-card-head{display:flex;align-items:center;gap:10px;padding:12px 6px;cursor:pointer;list-style:none}\n.rs-card-head::-webkit-details-marker{display:none}\ndetails.rs-card>.rs-card-head::after{content:'\u203A';margin-left:4px;color:#c0c6d2;font-size:16px;transition:transform .15s;flex-shrink:0}\ndetails.rs-card[open]>.rs-card-head::after{transform:rotate(90deg)}\n.rs-card-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}\n.rs-card-dot--fail{background:#dc2626}\n.rs-card-dot--warn{background:#d97706}\n.rs-card-dot--pass{background:#1f9d63}\n.rs-card-dot--skip{background:#cbd2dd}\n.rs-card-name{flex:1;min-width:0;font-size:14px;font-weight:600;color:#182033;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.rs-card-badges{display:flex;gap:6px;flex-shrink:0}\n.rs-badge{font-size:11px;font-weight:600;padding:1px 8px;border-radius:10px}\n.rs-badge--fail{color:#dc2626;background:rgba(220,38,38,10%)}\n.rs-badge--warn{color:#d97706;background:rgba(217,119,6,10%)}\n.rs-badge--pass{color:#1f9d63;background:rgba(31,157,99,10%)}\n.rs-card-body{padding:0 6px 14px 24px}\n.rs-finding{margin-top:10px;font-size:13.5px;line-height:1.65}\n.rs-finding-desc{color:#374151;word-break:break-word}\n.rs-finding-sug{margin-top:6px;padding:8px 12px;background:rgba(79,70,229,.05);border-radius:6px;color:#4f46e5;font-size:12.5px;line-height:1.6;word-break:break-word}\n\n/* \u2500\u2500 \u6298\u53E0\u901A\u8FC7\u9879 \u2500\u2500 */\n.rs-fold{margin-top:10px}\n.rs-fold>summary{cursor:pointer;list-style:none;font-size:12.5px;color:#637083;padding:6px 0}\n.rs-fold>summary::-webkit-details-marker{display:none}\n.rs-fold>summary:hover{color:#182033}\n.rs-fold[open]>summary{margin-bottom:8px}\n\n/* \u2500\u2500 \u7A7A\u6001 \u2500\u2500 */\n.rs-empty{padding:32px 20px;text-align:center;color:#9ca3af;font-size:13px}\n";