laminark 2.21.7 → 2.21.9

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 (52) hide show
  1. package/README.md +36 -71
  2. package/package.json +9 -7
  3. package/plugin/.claude-plugin/plugin.json +1 -1
  4. package/plugin/CLAUDE.md +10 -0
  5. package/plugin/commands/recall.md +55 -0
  6. package/plugin/commands/remember.md +34 -0
  7. package/plugin/commands/resume.md +45 -0
  8. package/plugin/commands/stash.md +34 -0
  9. package/plugin/commands/status.md +33 -0
  10. package/plugin/dist/hooks/handler.d.ts +3 -1
  11. package/plugin/dist/hooks/handler.d.ts.map +1 -1
  12. package/plugin/dist/hooks/handler.js +312 -23
  13. package/plugin/dist/hooks/handler.js.map +1 -1
  14. package/plugin/dist/index.d.ts +3 -1
  15. package/plugin/dist/index.d.ts.map +1 -1
  16. package/plugin/dist/index.js +2111 -525
  17. package/plugin/dist/index.js.map +1 -1
  18. package/plugin/dist/{observations-Ch0nc47i.d.mts → observations-CorAAc1A.d.mts} +23 -1
  19. package/plugin/dist/observations-CorAAc1A.d.mts.map +1 -0
  20. package/plugin/dist/{tool-registry-CZ3mJ4iR.mjs → tool-registry-D8un_AcG.mjs} +932 -13
  21. package/plugin/dist/tool-registry-D8un_AcG.mjs.map +1 -0
  22. package/plugin/hooks/hooks.json +6 -6
  23. package/plugin/laminark.db +0 -0
  24. package/plugin/package.json +17 -0
  25. package/plugin/scripts/README.md +19 -1
  26. package/plugin/scripts/bump-version.sh +24 -19
  27. package/plugin/scripts/dev-sync.sh +58 -0
  28. package/plugin/scripts/ensure-deps.sh +5 -2
  29. package/plugin/scripts/install.sh +115 -39
  30. package/plugin/scripts/local-install.sh +93 -58
  31. package/plugin/scripts/uninstall.sh +76 -38
  32. package/plugin/scripts/update.sh +20 -69
  33. package/plugin/scripts/verify-install.sh +69 -25
  34. package/plugin/ui/activity.js +12 -0
  35. package/plugin/ui/app.js +24 -54
  36. package/plugin/ui/graph.js +413 -186
  37. package/plugin/ui/help/activity-feed.png +0 -0
  38. package/plugin/ui/help/analysis-panel.png +0 -0
  39. package/plugin/ui/help/graph-toolbar.png +0 -0
  40. package/plugin/ui/help/graph-view.png +0 -0
  41. package/plugin/ui/help/settings.png +0 -0
  42. package/plugin/ui/help/timeline.png +0 -0
  43. package/plugin/ui/help.js +876 -172
  44. package/plugin/ui/index.html +506 -242
  45. package/plugin/ui/settings.js +781 -17
  46. package/plugin/ui/styles.css +990 -44
  47. package/plugin/ui/timeline.js +2 -2
  48. package/plugin/ui/tools.js +826 -0
  49. package/.claude-plugin/marketplace.json +0 -15
  50. package/plugin/dist/observations-Ch0nc47i.d.mts.map +0 -1
  51. package/plugin/dist/tool-registry-CZ3mJ4iR.mjs.map +0 -1
  52. package/plugin/scripts/setup-tmpdir.sh +0 -65
@@ -840,7 +840,7 @@ body {
840
840
  height: 100%;
841
841
  }
842
842
 
843
- /* Graph legend */
843
+ /* Graph legend — collapsed by default, expands on hover */
844
844
  .graph-legend {
845
845
  position: absolute;
846
846
  bottom: 16px;
@@ -848,14 +848,22 @@ body {
848
848
  background: rgba(13, 17, 23, 0.85);
849
849
  border: 1px solid var(--border);
850
850
  border-radius: 8px;
851
- padding: 12px;
851
+ padding: 6px;
852
852
  backdrop-filter: blur(8px);
853
853
  -webkit-backdrop-filter: blur(8px);
854
854
  z-index: 5;
855
855
  display: flex;
856
856
  flex-direction: column;
857
- gap: 6px;
857
+ gap: 0;
858
858
  pointer-events: auto;
859
+ overflow: hidden;
860
+ transition: padding 200ms ease, gap 200ms ease;
861
+ cursor: default;
862
+ }
863
+
864
+ .graph-legend:hover {
865
+ padding: 12px;
866
+ gap: 6px;
859
867
  }
860
868
 
861
869
  .graph-legend-title {
@@ -864,6 +872,12 @@ body {
864
872
  text-transform: uppercase;
865
873
  letter-spacing: 0.05em;
866
874
  color: var(--text-muted);
875
+ margin-bottom: 0;
876
+ white-space: nowrap;
877
+ transition: margin-bottom 200ms ease;
878
+ }
879
+
880
+ .graph-legend:hover .graph-legend-title {
867
881
  margin-bottom: 2px;
868
882
  }
869
883
 
@@ -875,6 +889,15 @@ body {
875
889
  font-size: 12px;
876
890
  color: var(--text);
877
891
  line-height: 1;
892
+ max-height: 0;
893
+ opacity: 0;
894
+ overflow: hidden;
895
+ transition: max-height 200ms ease, opacity 200ms ease;
896
+ }
897
+
898
+ .graph-legend:hover .graph-legend-item {
899
+ max-height: 20px;
900
+ opacity: 1;
878
901
  }
879
902
 
880
903
  .legend-color {
@@ -1238,13 +1261,74 @@ body {
1238
1261
 
1239
1262
  /* Settings view */
1240
1263
  #settings-view {
1264
+ overflow: hidden;
1265
+ }
1266
+
1267
+ #settings-view.active {
1268
+ display: flex;
1269
+ }
1270
+
1271
+ .settings-layout {
1272
+ display: flex;
1273
+ flex: 1;
1274
+ min-height: 0;
1275
+ }
1276
+
1277
+ .settings-sidebar {
1278
+ width: 200px;
1279
+ flex-shrink: 0;
1280
+ border-right: 1px solid var(--border);
1281
+ display: flex;
1282
+ flex-direction: column;
1283
+ padding: 12px 0;
1284
+ background: var(--surface);
1241
1285
  overflow-y: auto;
1242
1286
  }
1243
1287
 
1244
- .settings-container {
1245
- max-width: 720px;
1246
- margin: 0 auto;
1288
+ .settings-sidebar-item {
1289
+ padding: 10px 16px;
1290
+ cursor: pointer;
1291
+ font-size: 13px;
1292
+ font-weight: 500;
1293
+ color: var(--text-muted);
1294
+ border-radius: 4px;
1295
+ margin: 2px 8px;
1296
+ transition: background 0.15s, color 0.15s;
1297
+ user-select: none;
1298
+ }
1299
+
1300
+ .settings-sidebar-item:hover {
1301
+ background: rgba(255, 255, 255, 0.04);
1302
+ color: var(--text);
1303
+ }
1304
+
1305
+ .settings-sidebar-item.active {
1306
+ background: rgba(88, 166, 255, 0.1);
1307
+ color: var(--accent);
1308
+ }
1309
+
1310
+ .settings-sidebar-item-danger {
1311
+ margin-top: auto;
1312
+ }
1313
+
1314
+ .settings-sidebar-item-danger.active {
1315
+ background: rgba(248, 81, 73, 0.1);
1316
+ color: var(--danger);
1317
+ }
1318
+
1319
+ .settings-content {
1320
+ flex: 1;
1321
+ overflow-y: auto;
1247
1322
  padding: 24px;
1323
+ min-width: 0;
1324
+ }
1325
+
1326
+ .settings-panel {
1327
+ display: none;
1328
+ }
1329
+
1330
+ .settings-panel.active {
1331
+ display: block;
1248
1332
  }
1249
1333
 
1250
1334
  .settings-heading {
@@ -1290,6 +1374,14 @@ body {
1290
1374
  letter-spacing: 0.04em;
1291
1375
  }
1292
1376
 
1377
+ .system-info-grid {
1378
+ grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
1379
+ }
1380
+
1381
+ .system-info-grid .stat-value {
1382
+ font-size: 16px;
1383
+ }
1384
+
1293
1385
  /* Success message */
1294
1386
  .settings-success {
1295
1387
  padding: 10px 14px;
@@ -2000,28 +2092,135 @@ body {
2000
2092
  }
2001
2093
 
2002
2094
  /* =========================================================================
2003
- * Help View
2095
+ * Help View — Sidebar Tree Layout
2004
2096
  * ========================================================================= */
2005
2097
 
2006
2098
  #help-view {
2099
+ overflow: hidden;
2100
+ }
2101
+
2102
+ #help-view.active {
2103
+ display: flex;
2104
+ flex-direction: row;
2105
+ }
2106
+
2107
+ /* Sidebar */
2108
+ .help-sidebar {
2109
+ width: 240px;
2110
+ flex-shrink: 0;
2111
+ border-right: 1px solid var(--border);
2112
+ display: flex;
2113
+ flex-direction: column;
2114
+ overflow: hidden;
2115
+ background: var(--surface);
2116
+ }
2117
+
2118
+ .help-sidebar-search {
2119
+ padding: 12px;
2120
+ border-bottom: 1px solid var(--border);
2121
+ flex-shrink: 0;
2122
+ }
2123
+
2124
+ .help-tree-container {
2125
+ flex: 1;
2007
2126
  overflow-y: auto;
2127
+ padding: 8px 0;
2008
2128
  }
2009
2129
 
2010
- .help-container {
2011
- max-width: 760px;
2012
- margin: 0 auto;
2013
- padding: 24px;
2130
+ .help-tree {
2131
+ list-style: none;
2132
+ padding: 0;
2133
+ margin: 0;
2134
+ }
2135
+
2136
+ .help-tree-item {
2137
+ user-select: none;
2138
+ }
2139
+
2140
+ .help-tree-label {
2141
+ display: flex;
2142
+ align-items: center;
2143
+ gap: 6px;
2144
+ padding: 7px 12px;
2145
+ cursor: pointer;
2146
+ font-size: 13px;
2147
+ color: var(--text-muted);
2148
+ border-radius: 4px;
2149
+ margin: 0 8px;
2150
+ transition: background 0.15s, color 0.15s;
2151
+ }
2152
+
2153
+ .help-tree-label:hover {
2154
+ background: rgba(255, 255, 255, 0.04);
2155
+ color: var(--text);
2156
+ }
2157
+
2158
+ .help-tree-label.active {
2159
+ background: rgba(88, 166, 255, 0.1);
2160
+ color: var(--accent);
2161
+ }
2162
+
2163
+ .help-tree-toggle {
2164
+ width: 16px;
2165
+ flex-shrink: 0;
2166
+ font-size: 10px;
2167
+ color: var(--text-muted);
2168
+ transition: transform 0.15s;
2169
+ text-align: center;
2170
+ }
2171
+
2172
+ .help-tree-item.expanded > .help-tree-label .help-tree-toggle {
2173
+ transform: rotate(90deg);
2174
+ }
2175
+
2176
+ .help-tree-children {
2177
+ list-style: none;
2178
+ padding: 0 0 0 20px;
2179
+ margin: 0;
2180
+ display: none;
2181
+ }
2182
+
2183
+ .help-tree-item.expanded > .help-tree-children {
2184
+ display: block;
2185
+ }
2186
+
2187
+ .help-tree-child-label {
2188
+ display: block;
2189
+ padding: 5px 12px;
2190
+ cursor: pointer;
2191
+ font-size: 12px;
2192
+ color: var(--text-muted);
2193
+ border-radius: 4px;
2194
+ margin: 0 8px;
2195
+ transition: background 0.15s, color 0.15s;
2196
+ }
2197
+
2198
+ .help-tree-child-label:hover {
2199
+ background: rgba(255, 255, 255, 0.04);
2200
+ color: var(--text);
2201
+ }
2202
+
2203
+ .help-tree-child-label.active {
2204
+ color: var(--accent);
2205
+ }
2206
+
2207
+ /* Content area */
2208
+ .help-content-area {
2209
+ flex: 1;
2210
+ overflow-y: auto;
2211
+ padding: 24px 32px;
2212
+ min-width: 0;
2014
2213
  }
2015
2214
 
2016
2215
  .help-section {
2017
- margin-bottom: 32px;
2216
+ margin-bottom: 0;
2018
2217
  }
2019
2218
 
2020
2219
  .help-section-title {
2021
- font-size: 16px;
2220
+ font-size: 18px;
2022
2221
  font-weight: 600;
2023
2222
  color: var(--text);
2024
- margin-bottom: 12px;
2223
+ margin-bottom: 16px;
2025
2224
  padding-bottom: 8px;
2026
2225
  border-bottom: 1px solid var(--border);
2027
2226
  }
@@ -2496,6 +2695,103 @@ body {
2496
2695
  color: var(--warning);
2497
2696
  }
2498
2697
 
2698
+ /* Cross-Project Access dual-list widget */
2699
+ .cross-access-lists {
2700
+ display: flex;
2701
+ gap: 16px;
2702
+ margin-bottom: 16px;
2703
+ }
2704
+
2705
+ .cross-access-list {
2706
+ flex: 1;
2707
+ border: 1px solid var(--border);
2708
+ border-radius: var(--radius);
2709
+ overflow: hidden;
2710
+ display: flex;
2711
+ flex-direction: column;
2712
+ }
2713
+
2714
+ .cross-access-list-header {
2715
+ background: var(--surface);
2716
+ border-bottom: 1px solid var(--border);
2717
+ padding: 8px 12px;
2718
+ font-size: 12px;
2719
+ font-weight: 600;
2720
+ color: var(--text-muted);
2721
+ text-transform: uppercase;
2722
+ letter-spacing: 0.5px;
2723
+ }
2724
+
2725
+ .cross-access-items {
2726
+ list-style: none;
2727
+ max-height: 200px;
2728
+ overflow-y: auto;
2729
+ min-height: 60px;
2730
+ }
2731
+
2732
+ .cross-access-items:empty::after {
2733
+ content: '(none)';
2734
+ display: block;
2735
+ padding: 12px;
2736
+ color: var(--text-muted);
2737
+ font-style: italic;
2738
+ font-size: 13px;
2739
+ }
2740
+
2741
+ .cross-access-item {
2742
+ display: flex;
2743
+ align-items: center;
2744
+ justify-content: space-between;
2745
+ padding: 6px 12px;
2746
+ border-bottom: 1px solid var(--border);
2747
+ transition: background var(--transition);
2748
+ }
2749
+
2750
+ .cross-access-item:last-child {
2751
+ border-bottom: none;
2752
+ }
2753
+
2754
+ .cross-access-item:hover {
2755
+ background: rgba(88, 166, 255, 0.06);
2756
+ }
2757
+
2758
+ .cross-access-item-name {
2759
+ font-size: 13px;
2760
+ color: var(--text);
2761
+ overflow: hidden;
2762
+ text-overflow: ellipsis;
2763
+ white-space: nowrap;
2764
+ }
2765
+
2766
+ .cross-access-add-btn,
2767
+ .cross-access-remove-btn {
2768
+ background: none;
2769
+ border: 1px solid var(--border);
2770
+ border-radius: 4px;
2771
+ color: var(--text-muted);
2772
+ cursor: pointer;
2773
+ font-size: 14px;
2774
+ width: 26px;
2775
+ height: 26px;
2776
+ display: flex;
2777
+ align-items: center;
2778
+ justify-content: center;
2779
+ flex-shrink: 0;
2780
+ transition: all var(--transition);
2781
+ }
2782
+
2783
+ .cross-access-add-btn:hover {
2784
+ border-color: var(--accent);
2785
+ color: var(--accent);
2786
+ background: rgba(88, 166, 255, 0.1);
2787
+ }
2788
+
2789
+ .cross-access-remove-btn:hover {
2790
+ border-color: var(--danger);
2791
+ color: var(--danger);
2792
+ background: rgba(248, 81, 73, 0.1);
2793
+ }
2794
+
2499
2795
  /* =========================================================================
2500
2796
  * D3.js Graph SVG Styles
2501
2797
  * ========================================================================= */
@@ -2851,60 +3147,710 @@ g.node-group.search-match path.node-shape {
2851
3147
  }
2852
3148
 
2853
3149
  /* ====================================================================
2854
- Path Overlay Styles
3150
+ Graph Freeze Button (pause/resume live updates)
2855
3151
  ==================================================================== */
2856
3152
 
2857
- .paths-toggle-btn {
2858
- background: transparent;
3153
+ .graph-freeze-btn {
3154
+ width: 32px;
3155
+ height: 32px;
3156
+ background: rgba(13, 17, 23, 0.85);
2859
3157
  border: 1px solid var(--border);
2860
- color: var(--text-muted);
2861
- padding: 4px 6px;
2862
3158
  border-radius: var(--radius);
3159
+ color: var(--text-muted);
2863
3160
  cursor: pointer;
2864
3161
  display: flex;
2865
3162
  align-items: center;
2866
3163
  justify-content: center;
2867
- transition: all var(--transition);
3164
+ backdrop-filter: blur(8px);
3165
+ -webkit-backdrop-filter: blur(8px);
3166
+ transition: color var(--transition), border-color var(--transition), background var(--transition);
2868
3167
  }
2869
3168
 
2870
- .paths-toggle-btn:hover {
3169
+ .graph-freeze-btn:hover {
2871
3170
  color: var(--text);
2872
3171
  border-color: var(--text-muted);
2873
3172
  }
2874
3173
 
2875
- .paths-toggle-btn.active {
2876
- color: var(--accent);
2877
- border-color: var(--accent);
2878
- background: rgba(88, 166, 255, 0.1);
3174
+ .graph-freeze-btn.active {
3175
+ color: var(--warning);
3176
+ border-color: var(--warning);
3177
+ background: rgba(210, 153, 34, 0.12);
2879
3178
  }
2880
3179
 
2881
- /* Animated dashed line for active paths */
2882
- .path-line-active {
2883
- animation: path-dash-flow 1.5s linear infinite;
2884
- }
3180
+ /* ====================================================================
3181
+ Graph Sync Button (stale data indicator)
3182
+ ==================================================================== */
2885
3183
 
2886
- @keyframes path-dash-flow {
2887
- to {
2888
- stroke-dashoffset: -20;
2889
- }
3184
+ .graph-sync-btn {
3185
+ position: absolute;
3186
+ top: 16px;
3187
+ left: 50%;
3188
+ transform: translateX(-50%);
3189
+ background: rgba(13, 17, 23, 0.85);
3190
+ border: 1px solid var(--border);
3191
+ border-radius: var(--radius);
3192
+ color: var(--text-muted);
3193
+ padding: 4px 12px;
3194
+ font-size: 12px;
3195
+ cursor: pointer;
3196
+ z-index: 6;
3197
+ display: flex;
3198
+ align-items: center;
3199
+ gap: 6px;
3200
+ backdrop-filter: blur(8px);
3201
+ -webkit-backdrop-filter: blur(8px);
3202
+ transition: all 200ms ease;
2890
3203
  }
2891
3204
 
2892
- /* Waypoint markers */
2893
- .waypoint-marker circle {
2894
- transition: r 0.15s ease;
3205
+ .graph-sync-btn.hidden { display: none; }
3206
+
3207
+ .graph-sync-btn.stale {
3208
+ border-color: var(--warning);
3209
+ color: var(--warning);
3210
+ animation: pulse 2s infinite;
2895
3211
  }
2896
3212
 
2897
- .waypoint-marker:hover circle {
2898
- filter: brightness(1.3);
3213
+ .graph-sync-btn:hover {
3214
+ color: var(--text);
3215
+ border-color: var(--text-muted);
3216
+ }
3217
+
3218
+ .graph-sync-btn.stale:hover {
3219
+ border-color: var(--warning);
3220
+ color: var(--text);
3221
+ }
3222
+
3223
+ /* ====================================================================
3224
+ Pathfinder Styles
3225
+ ==================================================================== */
3226
+
3227
+ .paths-toggle-btn {
3228
+ background: transparent;
3229
+ border: 1px solid var(--border);
3230
+ color: var(--text-muted);
3231
+ padding: 4px 6px;
3232
+ border-radius: var(--radius);
3233
+ cursor: pointer;
3234
+ display: flex;
3235
+ align-items: center;
3236
+ justify-content: center;
3237
+ transition: all var(--transition);
3238
+ }
3239
+
3240
+ .paths-toggle-btn:hover {
3241
+ color: var(--text);
3242
+ border-color: var(--text-muted);
3243
+ }
3244
+
3245
+ .paths-toggle-btn.active {
3246
+ color: var(--color-reference);
3247
+ border-color: var(--color-reference);
3248
+ background: rgba(240, 136, 62, 0.1);
3249
+ }
3250
+
3251
+ /* Pathfinder start/end node indicators */
3252
+ g.node-group.pathfinder-start path.node-shape {
3253
+ stroke: #3fb950;
3254
+ stroke-width: 3.5;
3255
+ filter: drop-shadow(0 0 6px rgba(63, 185, 80, 0.7));
3256
+ }
3257
+
3258
+ g.node-group.pathfinder-end path.node-shape {
3259
+ stroke: #f85149;
3260
+ stroke-width: 3.5;
3261
+ filter: drop-shadow(0 0 6px rgba(248, 81, 73, 0.7));
3262
+ }
3263
+
3264
+ /* Path-highlighted edges */
3265
+ line.edge.path-highlight {
3266
+ stroke: #f0883e !important;
3267
+ stroke-width: 3.5 !important;
3268
+ opacity: 1 !important;
3269
+ filter: drop-shadow(0 0 3px rgba(240, 136, 62, 0.6));
2899
3270
  }
2900
3271
 
2901
- /* Path label */
2902
- .path-label {
2903
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3272
+ /* Pathfinder info bar */
3273
+ .pathfinder-info {
3274
+ position: absolute;
3275
+ bottom: 16px;
3276
+ left: 50%;
3277
+ transform: translateX(-50%);
3278
+ background: rgba(13, 17, 23, 0.9);
3279
+ border: 1px solid var(--border);
3280
+ border-radius: 20px;
3281
+ padding: 6px 16px;
3282
+ font-size: 12px;
3283
+ color: var(--text);
3284
+ white-space: nowrap;
3285
+ z-index: 6;
3286
+ backdrop-filter: blur(8px);
3287
+ -webkit-backdrop-filter: blur(8px);
2904
3288
  pointer-events: none;
2905
3289
  }
2906
3290
 
2907
- /* Path trail group */
2908
- .path-trail {
2909
- pointer-events: all;
3291
+ /* =========================================================================
3292
+ * Help View — Enhanced Documentation
3293
+ * ========================================================================= */
3294
+
3295
+ /* Help sidebar search input */
3296
+ .help-search-input {
3297
+ width: 100%;
3298
+ padding: 6px 10px;
3299
+ background: var(--bg);
3300
+ border: 1px solid var(--border);
3301
+ border-radius: 14px;
3302
+ color: var(--text);
3303
+ font-size: 12px;
3304
+ font-family: inherit;
3305
+ transition: border-color var(--transition);
3306
+ }
3307
+
3308
+ .help-search-input:focus {
3309
+ border-color: var(--accent);
3310
+ outline: none;
3311
+ }
3312
+
3313
+ .help-search-input::placeholder {
3314
+ color: var(--text-muted);
3315
+ }
3316
+
3317
+ /* Subsection titles (h3-level) */
3318
+ .help-subsection-title {
3319
+ font-size: 14px;
3320
+ font-weight: 600;
3321
+ color: var(--text);
3322
+ margin: 16px 0 8px;
3323
+ }
3324
+
3325
+ /* Styled bullet list */
3326
+ .help-list {
3327
+ list-style: none;
3328
+ margin: 8px 0 16px;
3329
+ }
3330
+
3331
+ .help-list li {
3332
+ position: relative;
3333
+ padding-left: 16px;
3334
+ font-size: 13px;
3335
+ color: var(--text);
3336
+ line-height: 1.6;
3337
+ margin-bottom: 4px;
3338
+ }
3339
+
3340
+ .help-list li::before {
3341
+ content: '\2022';
3342
+ position: absolute;
3343
+ left: 0;
3344
+ color: var(--accent);
3345
+ }
3346
+
3347
+ /* Tip / note callout box */
3348
+ .help-tip {
3349
+ padding: 10px 14px;
3350
+ margin: 12px 0;
3351
+ background: rgba(88, 166, 255, 0.06);
3352
+ border-left: 3px solid var(--accent);
3353
+ border-radius: 0 var(--radius) var(--radius) 0;
3354
+ font-size: 13px;
3355
+ color: var(--text);
3356
+ line-height: 1.5;
3357
+ }
3358
+
3359
+ .help-tip strong {
3360
+ color: var(--accent);
3361
+ }
3362
+
3363
+ /* Screenshot containers */
3364
+ .help-screenshot {
3365
+ margin: 12px 0;
3366
+ border: 1px solid var(--border);
3367
+ border-radius: var(--radius);
3368
+ overflow: hidden;
3369
+ max-width: 100%;
3370
+ }
3371
+
3372
+ .help-screenshot img {
3373
+ display: block;
3374
+ width: 100%;
3375
+ height: auto;
3376
+ }
3377
+
3378
+ .help-screenshot-caption {
3379
+ padding: 6px 12px;
3380
+ font-size: 11px;
3381
+ color: var(--text-muted);
3382
+ background: var(--surface);
3383
+ text-align: center;
3384
+ }
3385
+
3386
+ /* Cross-links */
3387
+ .help-crosslinks {
3388
+ margin-top: 16px;
3389
+ padding-top: 8px;
3390
+ border-top: 1px solid var(--border);
3391
+ font-size: 12px;
3392
+ color: var(--text-muted);
3393
+ }
3394
+
3395
+ .help-crosslink {
3396
+ color: var(--accent);
3397
+ cursor: pointer;
3398
+ text-decoration: none;
3399
+ margin-left: 4px;
3400
+ transition: color var(--transition);
3401
+ }
3402
+
3403
+ .help-crosslink:hover {
3404
+ color: var(--accent-hover);
3405
+ text-decoration: underline;
3406
+ }
3407
+
3408
+ /* No results state for search */
3409
+ .help-no-results {
3410
+ text-align: center;
3411
+ color: var(--text-muted);
3412
+ padding: 48px 16px;
3413
+ font-size: 14px;
3414
+ }
3415
+
3416
+ /* Help table (key-value, shortcuts) */
3417
+ .help-table {
3418
+ width: 100%;
3419
+ border-collapse: collapse;
3420
+ margin: 8px 0;
3421
+ }
3422
+
3423
+ .help-table td {
3424
+ padding: 6px 8px;
3425
+ font-size: 13px;
3426
+ border-bottom: 1px solid rgba(48, 54, 61, 0.5);
3427
+ vertical-align: top;
3428
+ }
3429
+
3430
+ .help-table td:first-child {
3431
+ white-space: nowrap;
3432
+ width: 180px;
3433
+ color: var(--text);
3434
+ }
3435
+
3436
+ .help-table td:last-child {
3437
+ color: var(--text-muted);
3438
+ }
3439
+
3440
+ /* =========================================================================
3441
+ Tool Topology View
3442
+ ========================================================================= */
3443
+
3444
+ /* Toolbar */
3445
+ .tools-toolbar {
3446
+ display: flex;
3447
+ align-items: center;
3448
+ justify-content: space-between;
3449
+ gap: 12px;
3450
+ padding: 6px 16px;
3451
+ background: var(--surface);
3452
+ border-bottom: 1px solid var(--border);
3453
+ flex-shrink: 0;
3454
+ }
3455
+
3456
+ .tools-toolbar-left,
3457
+ .tools-toolbar-right {
3458
+ display: flex;
3459
+ align-items: center;
3460
+ gap: 8px;
3461
+ }
3462
+
3463
+ .tools-layout-btn {
3464
+ padding: 4px 12px;
3465
+ background: transparent;
3466
+ border: 1px solid var(--border);
3467
+ border-radius: var(--radius);
3468
+ color: var(--text-muted);
3469
+ font-size: 12px;
3470
+ cursor: pointer;
3471
+ transition: all var(--transition);
3472
+ }
3473
+
3474
+ .tools-layout-btn:hover {
3475
+ border-color: var(--text-muted);
3476
+ color: var(--text);
3477
+ }
3478
+
3479
+ .tools-layout-btn.active {
3480
+ border-color: var(--accent);
3481
+ color: var(--accent);
3482
+ background: rgba(88, 166, 255, 0.08);
3483
+ }
3484
+
3485
+ .tools-separator {
3486
+ color: var(--border);
3487
+ font-size: 14px;
3488
+ }
3489
+
3490
+ .tools-toggle-label {
3491
+ display: flex;
3492
+ align-items: center;
3493
+ gap: 6px;
3494
+ color: var(--text-muted);
3495
+ font-size: 12px;
3496
+ cursor: pointer;
3497
+ }
3498
+
3499
+ .tools-toggle-label input[type="checkbox"] {
3500
+ accent-color: var(--accent);
3501
+ }
3502
+
3503
+ .tools-filter-select {
3504
+ padding: 4px 8px;
3505
+ background: var(--bg);
3506
+ border: 1px solid var(--border);
3507
+ border-radius: var(--radius);
3508
+ color: var(--text);
3509
+ font-size: 12px;
3510
+ cursor: pointer;
3511
+ }
3512
+
3513
+ .tools-filter-select:focus {
3514
+ border-color: var(--accent);
3515
+ outline: none;
3516
+ }
3517
+
3518
+ /* Content area */
3519
+ #tools-view.active {
3520
+ display: flex;
3521
+ flex-direction: column;
3522
+ }
3523
+
3524
+ .tools-content-row {
3525
+ display: flex;
3526
+ flex: 1;
3527
+ min-height: 0;
3528
+ position: relative;
3529
+ }
3530
+
3531
+ .tools-graph-area {
3532
+ flex: 1;
3533
+ position: relative;
3534
+ overflow: hidden;
3535
+ }
3536
+
3537
+ #tools-svg {
3538
+ width: 100%;
3539
+ height: 100%;
3540
+ display: block;
3541
+ background: var(--bg);
3542
+ }
3543
+
3544
+ .tools-graph-stats {
3545
+ position: absolute;
3546
+ bottom: 8px;
3547
+ left: 12px;
3548
+ font-size: 11px;
3549
+ color: var(--text-muted);
3550
+ pointer-events: none;
3551
+ }
3552
+
3553
+ /* Tool nodes */
3554
+ .tool-node {
3555
+ transition: opacity 0.15s;
3556
+ }
3557
+
3558
+ .tool-node.selected {
3559
+ stroke: #ffffff !important;
3560
+ stroke-width: 3 !important;
3561
+ filter: drop-shadow(0 0 6px rgba(88, 166, 255, 0.5));
3562
+ }
3563
+
3564
+ /* Tool edges */
3565
+ .tool-edge {
3566
+ pointer-events: none;
3567
+ }
3568
+
3569
+ /* Tool labels */
3570
+ .tool-label {
3571
+ user-select: none;
3572
+ }
3573
+
3574
+ /* Detail panel */
3575
+ .tools-detail-panel {
3576
+ width: var(--panel-width);
3577
+ background: var(--surface);
3578
+ border-left: 1px solid var(--border);
3579
+ overflow-y: auto;
3580
+ transition: transform var(--transition);
3581
+ flex-shrink: 0;
3582
+ }
3583
+
3584
+ .tools-detail-panel.hidden {
3585
+ display: none;
3586
+ }
3587
+
3588
+ .tool-status-badge {
3589
+ display: inline-block;
3590
+ padding: 1px 8px;
3591
+ border-radius: 10px;
3592
+ font-size: 11px;
3593
+ font-weight: 500;
3594
+ }
3595
+
3596
+ .tool-status-badge.active {
3597
+ background: rgba(63, 185, 80, 0.15);
3598
+ color: var(--success);
3599
+ }
3600
+
3601
+ .tool-status-badge.stale {
3602
+ background: rgba(210, 153, 34, 0.15);
3603
+ color: var(--warning);
3604
+ }
3605
+
3606
+ .tool-status-badge.demoted {
3607
+ background: rgba(248, 81, 73, 0.15);
3608
+ color: var(--danger);
3609
+ }
3610
+
3611
+ .tool-description {
3612
+ color: var(--text-muted);
3613
+ font-size: 12px;
3614
+ line-height: 1.5;
3615
+ margin: 4px 0;
3616
+ }
3617
+
3618
+ .tool-co-occurring-item {
3619
+ display: flex;
3620
+ justify-content: space-between;
3621
+ align-items: center;
3622
+ padding: 4px 0;
3623
+ color: var(--text);
3624
+ font-size: 12px;
3625
+ transition: color var(--transition);
3626
+ }
3627
+
3628
+ .tool-co-occurring-item:hover {
3629
+ color: var(--accent);
3630
+ }
3631
+
3632
+ .tool-co-name {
3633
+ flex: 1;
3634
+ min-width: 0;
3635
+ overflow: hidden;
3636
+ text-overflow: ellipsis;
3637
+ white-space: nowrap;
3638
+ }
3639
+
3640
+ .tool-co-count {
3641
+ color: var(--text-muted);
3642
+ font-size: 11px;
3643
+ margin-left: 8px;
3644
+ flex-shrink: 0;
3645
+ }
3646
+
3647
+ /* Session flow strip */
3648
+ .tools-session-strip {
3649
+ flex-shrink: 0;
3650
+ background: var(--surface);
3651
+ border-top: 1px solid var(--border);
3652
+ padding: 8px 16px;
3653
+ max-height: 140px;
3654
+ overflow-y: auto;
3655
+ }
3656
+
3657
+ .tools-session-strip-label {
3658
+ font-size: 11px;
3659
+ color: var(--text-muted);
3660
+ font-weight: 500;
3661
+ margin-bottom: 6px;
3662
+ text-transform: uppercase;
3663
+ letter-spacing: 0.05em;
3664
+ }
3665
+
3666
+ .tools-session-strip-content {
3667
+ display: flex;
3668
+ flex-direction: column;
3669
+ gap: 4px;
3670
+ }
3671
+
3672
+ .tools-session-item {
3673
+ display: flex;
3674
+ align-items: center;
3675
+ gap: 8px;
3676
+ }
3677
+
3678
+ .tools-session-id {
3679
+ color: var(--text-muted);
3680
+ font-size: 10px;
3681
+ font-family: monospace;
3682
+ flex-shrink: 0;
3683
+ width: 60px;
3684
+ }
3685
+
3686
+ .tools-session-tools {
3687
+ display: flex;
3688
+ align-items: center;
3689
+ gap: 4px;
3690
+ overflow-x: auto;
3691
+ flex: 1;
3692
+ min-width: 0;
3693
+ }
3694
+
3695
+ .tools-session-arrow {
3696
+ color: var(--text-muted);
3697
+ font-size: 10px;
3698
+ flex-shrink: 0;
3699
+ opacity: 0.5;
3700
+ }
3701
+
3702
+ .tools-session-chip {
3703
+ display: inline-block;
3704
+ padding: 1px 6px;
3705
+ border: 1px solid var(--border);
3706
+ border-radius: 3px;
3707
+ font-size: 10px;
3708
+ color: var(--text);
3709
+ white-space: nowrap;
3710
+ flex-shrink: 0;
3711
+ }
3712
+
3713
+ .tools-session-more {
3714
+ color: var(--text-muted);
3715
+ font-size: 10px;
3716
+ flex-shrink: 0;
3717
+ }
3718
+
3719
+ .tools-session-empty {
3720
+ color: var(--text-muted);
3721
+ font-size: 12px;
3722
+ }
3723
+
3724
+ /* =========================================================================
3725
+ Database Hygiene
3726
+ ========================================================================= */
3727
+
3728
+ .hygiene-summary-row {
3729
+ display: flex;
3730
+ gap: 16px;
3731
+ margin-bottom: 12px;
3732
+ flex-wrap: wrap;
3733
+ }
3734
+
3735
+ .hygiene-stat {
3736
+ font-size: 13px;
3737
+ color: var(--text-muted);
3738
+ }
3739
+
3740
+ .hygiene-stat strong {
3741
+ color: var(--text);
3742
+ }
3743
+
3744
+ .hygiene-stat.hy-high strong {
3745
+ color: #f85149;
3746
+ }
3747
+
3748
+ .hygiene-stat.hy-medium strong {
3749
+ color: #d29922;
3750
+ }
3751
+
3752
+ .hygiene-table-wrap {
3753
+ max-height: 400px;
3754
+ overflow-y: auto;
3755
+ border: 1px solid var(--border);
3756
+ border-radius: 6px;
3757
+ }
3758
+
3759
+ .hygiene-table {
3760
+ width: 100%;
3761
+ border-collapse: collapse;
3762
+ font-size: 12px;
3763
+ }
3764
+
3765
+ .hygiene-table th {
3766
+ position: sticky;
3767
+ top: 0;
3768
+ background: var(--bg-secondary);
3769
+ padding: 6px 8px;
3770
+ text-align: left;
3771
+ font-weight: 500;
3772
+ font-size: 11px;
3773
+ color: var(--text-muted);
3774
+ border-bottom: 1px solid var(--border);
3775
+ }
3776
+
3777
+ .hygiene-table td {
3778
+ padding: 5px 8px;
3779
+ border-bottom: 1px solid rgba(48, 54, 61, 0.3);
3780
+ vertical-align: top;
3781
+ }
3782
+
3783
+ .hygiene-table .mono {
3784
+ font-family: var(--font-mono, monospace);
3785
+ font-size: 11px;
3786
+ }
3787
+
3788
+ .hygiene-preview {
3789
+ max-width: 300px;
3790
+ overflow: hidden;
3791
+ text-overflow: ellipsis;
3792
+ white-space: nowrap;
3793
+ color: var(--text-muted);
3794
+ font-size: 11px;
3795
+ }
3796
+
3797
+ .hy-row-high {
3798
+ background: rgba(248, 81, 73, 0.06);
3799
+ }
3800
+
3801
+ .hy-row-medium {
3802
+ background: rgba(210, 153, 34, 0.06);
3803
+ }
3804
+
3805
+ .hy-signal {
3806
+ display: inline-block;
3807
+ font-size: 10px;
3808
+ padding: 1px 5px;
3809
+ border-radius: 3px;
3810
+ background: rgba(110, 118, 129, 0.2);
3811
+ color: var(--text-muted);
3812
+ margin-right: 2px;
3813
+ }
3814
+
3815
+ .hygiene-signals {
3816
+ white-space: nowrap;
3817
+ }
3818
+
3819
+ .hygiene-distribution {
3820
+ margin: 8px 0;
3821
+ }
3822
+
3823
+ .hygiene-histogram {
3824
+ display: flex;
3825
+ align-items: flex-end;
3826
+ gap: 3px;
3827
+ height: 100px;
3828
+ padding: 4px 0;
3829
+ }
3830
+
3831
+ .hygiene-histogram-bar-wrap {
3832
+ flex: 1;
3833
+ display: flex;
3834
+ flex-direction: column;
3835
+ align-items: center;
3836
+ height: 100%;
3837
+ justify-content: flex-end;
3838
+ }
3839
+
3840
+ .hygiene-histogram-bar {
3841
+ width: 100%;
3842
+ min-height: 2px;
3843
+ background: var(--accent, #58a6ff);
3844
+ border-radius: 2px 2px 0 0;
3845
+ transition: height 0.2s ease;
3846
+ }
3847
+
3848
+ .hygiene-histogram-bar:hover {
3849
+ background: var(--accent-hover, #79b8ff);
3850
+ }
3851
+
3852
+ .hygiene-histogram-label {
3853
+ font-size: 10px;
3854
+ color: var(--text-muted, #8b949e);
3855
+ margin-top: 2px;
2910
3856
  }