laminark 0.1.0 → 2.21.7

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/.claude-plugin/marketplace.json +15 -0
  2. package/README.md +71 -36
  3. package/package.json +7 -9
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/dist/hooks/handler.d.ts +1 -3
  6. package/plugin/dist/hooks/handler.d.ts.map +1 -1
  7. package/plugin/dist/hooks/handler.js +22 -310
  8. package/plugin/dist/hooks/handler.js.map +1 -1
  9. package/plugin/dist/index.d.ts +1 -3
  10. package/plugin/dist/index.d.ts.map +1 -1
  11. package/plugin/dist/index.js +392 -1895
  12. package/plugin/dist/index.js.map +1 -1
  13. package/plugin/dist/{observations-CorAAc1A.d.mts → observations-Ch0nc47i.d.mts} +1 -23
  14. package/plugin/dist/observations-Ch0nc47i.d.mts.map +1 -0
  15. package/plugin/dist/{tool-registry-e710BvXq.mjs → tool-registry-CZ3mJ4iR.mjs} +13 -932
  16. package/plugin/dist/tool-registry-CZ3mJ4iR.mjs.map +1 -0
  17. package/plugin/hooks/hooks.json +6 -6
  18. package/plugin/scripts/README.md +1 -19
  19. package/plugin/scripts/bump-version.sh +3 -1
  20. package/plugin/scripts/ensure-deps.sh +2 -5
  21. package/plugin/scripts/install.sh +39 -115
  22. package/plugin/scripts/local-install.sh +58 -93
  23. package/plugin/scripts/setup-tmpdir.sh +65 -0
  24. package/plugin/scripts/uninstall.sh +38 -76
  25. package/plugin/scripts/update.sh +69 -20
  26. package/plugin/scripts/verify-install.sh +25 -69
  27. package/plugin/ui/activity.js +0 -12
  28. package/plugin/ui/app.js +54 -24
  29. package/plugin/ui/graph.js +186 -413
  30. package/plugin/ui/help.js +172 -876
  31. package/plugin/ui/index.html +242 -506
  32. package/plugin/ui/settings.js +17 -781
  33. package/plugin/ui/styles.css +44 -990
  34. package/plugin/ui/timeline.js +2 -2
  35. package/plugin/CLAUDE.md +0 -10
  36. package/plugin/commands/recall.md +0 -55
  37. package/plugin/commands/remember.md +0 -34
  38. package/plugin/commands/resume.md +0 -45
  39. package/plugin/commands/stash.md +0 -34
  40. package/plugin/commands/status.md +0 -33
  41. package/plugin/dist/observations-CorAAc1A.d.mts.map +0 -1
  42. package/plugin/dist/tool-registry-e710BvXq.mjs.map +0 -1
  43. package/plugin/laminark.db +0 -0
  44. package/plugin/package.json +0 -17
  45. package/plugin/scripts/dev-sync.sh +0 -58
  46. package/plugin/ui/help/activity-feed.png +0 -0
  47. package/plugin/ui/help/analysis-panel.png +0 -0
  48. package/plugin/ui/help/graph-toolbar.png +0 -0
  49. package/plugin/ui/help/graph-view.png +0 -0
  50. package/plugin/ui/help/settings.png +0 -0
  51. package/plugin/ui/help/timeline.png +0 -0
  52. package/plugin/ui/tools.js +0 -826
@@ -840,7 +840,7 @@ body {
840
840
  height: 100%;
841
841
  }
842
842
 
843
- /* Graph legend — collapsed by default, expands on hover */
843
+ /* Graph legend */
844
844
  .graph-legend {
845
845
  position: absolute;
846
846
  bottom: 16px;
@@ -848,22 +848,14 @@ body {
848
848
  background: rgba(13, 17, 23, 0.85);
849
849
  border: 1px solid var(--border);
850
850
  border-radius: 8px;
851
- padding: 6px;
851
+ padding: 12px;
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: 0;
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
857
  gap: 6px;
858
+ pointer-events: auto;
867
859
  }
868
860
 
869
861
  .graph-legend-title {
@@ -872,12 +864,6 @@ body {
872
864
  text-transform: uppercase;
873
865
  letter-spacing: 0.05em;
874
866
  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 {
881
867
  margin-bottom: 2px;
882
868
  }
883
869
 
@@ -889,15 +875,6 @@ body {
889
875
  font-size: 12px;
890
876
  color: var(--text);
891
877
  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;
901
878
  }
902
879
 
903
880
  .legend-color {
@@ -1261,74 +1238,13 @@ body {
1261
1238
 
1262
1239
  /* Settings view */
1263
1240
  #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);
1285
1241
  overflow-y: auto;
1286
1242
  }
1287
1243
 
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;
1244
+ .settings-container {
1245
+ max-width: 720px;
1246
+ margin: 0 auto;
1322
1247
  padding: 24px;
1323
- min-width: 0;
1324
- }
1325
-
1326
- .settings-panel {
1327
- display: none;
1328
- }
1329
-
1330
- .settings-panel.active {
1331
- display: block;
1332
1248
  }
1333
1249
 
1334
1250
  .settings-heading {
@@ -1374,14 +1290,6 @@ body {
1374
1290
  letter-spacing: 0.04em;
1375
1291
  }
1376
1292
 
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
-
1385
1293
  /* Success message */
1386
1294
  .settings-success {
1387
1295
  padding: 10px 14px;
@@ -2092,135 +2000,28 @@ body {
2092
2000
  }
2093
2001
 
2094
2002
  /* =========================================================================
2095
- * Help View — Sidebar Tree Layout
2003
+ * Help View
2096
2004
  * ========================================================================= */
2097
2005
 
2098
2006
  #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;
2126
2007
  overflow-y: auto;
2127
- padding: 8px 0;
2128
- }
2129
-
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
2008
  }
2206
2009
 
2207
- /* Content area */
2208
- .help-content-area {
2209
- flex: 1;
2210
- overflow-y: auto;
2211
- padding: 24px 32px;
2212
- min-width: 0;
2010
+ .help-container {
2011
+ max-width: 760px;
2012
+ margin: 0 auto;
2013
+ padding: 24px;
2213
2014
  }
2214
2015
 
2215
2016
  .help-section {
2216
- margin-bottom: 0;
2017
+ margin-bottom: 32px;
2217
2018
  }
2218
2019
 
2219
2020
  .help-section-title {
2220
- font-size: 18px;
2021
+ font-size: 16px;
2221
2022
  font-weight: 600;
2222
2023
  color: var(--text);
2223
- margin-bottom: 16px;
2024
+ margin-bottom: 12px;
2224
2025
  padding-bottom: 8px;
2225
2026
  border-bottom: 1px solid var(--border);
2226
2027
  }
@@ -2695,103 +2496,6 @@ body {
2695
2496
  color: var(--warning);
2696
2497
  }
2697
2498
 
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
-
2795
2499
  /* =========================================================================
2796
2500
  * D3.js Graph SVG Styles
2797
2501
  * ========================================================================= */
@@ -3147,710 +2851,60 @@ g.node-group.search-match path.node-shape {
3147
2851
  }
3148
2852
 
3149
2853
  /* ====================================================================
3150
- Graph Freeze Button (pause/resume live updates)
2854
+ Path Overlay Styles
3151
2855
  ==================================================================== */
3152
2856
 
3153
- .graph-freeze-btn {
3154
- width: 32px;
3155
- height: 32px;
3156
- background: rgba(13, 17, 23, 0.85);
2857
+ .paths-toggle-btn {
2858
+ background: transparent;
3157
2859
  border: 1px solid var(--border);
3158
- border-radius: var(--radius);
3159
2860
  color: var(--text-muted);
2861
+ padding: 4px 6px;
2862
+ border-radius: var(--radius);
3160
2863
  cursor: pointer;
3161
2864
  display: flex;
3162
2865
  align-items: center;
3163
2866
  justify-content: center;
3164
- backdrop-filter: blur(8px);
3165
- -webkit-backdrop-filter: blur(8px);
3166
- transition: color var(--transition), border-color var(--transition), background var(--transition);
2867
+ transition: all var(--transition);
3167
2868
  }
3168
2869
 
3169
- .graph-freeze-btn:hover {
2870
+ .paths-toggle-btn:hover {
3170
2871
  color: var(--text);
3171
2872
  border-color: var(--text-muted);
3172
2873
  }
3173
2874
 
3174
- .graph-freeze-btn.active {
3175
- color: var(--warning);
3176
- border-color: var(--warning);
3177
- background: rgba(210, 153, 34, 0.12);
2875
+ .paths-toggle-btn.active {
2876
+ color: var(--accent);
2877
+ border-color: var(--accent);
2878
+ background: rgba(88, 166, 255, 0.1);
3178
2879
  }
3179
2880
 
3180
- /* ====================================================================
3181
- Graph Sync Button (stale data indicator)
3182
- ==================================================================== */
2881
+ /* Animated dashed line for active paths */
2882
+ .path-line-active {
2883
+ animation: path-dash-flow 1.5s linear infinite;
2884
+ }
3183
2885
 
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;
3203
- }
3204
-
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;
3211
- }
3212
-
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));
3270
- }
3271
-
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);
3288
- pointer-events: none;
3289
- }
3290
-
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;
2886
+ @keyframes path-dash-flow {
2887
+ to {
2888
+ stroke-dashoffset: -20;
2889
+ }
3551
2890
  }
3552
2891
 
3553
- /* Tool nodes */
3554
- .tool-node {
3555
- transition: opacity 0.15s;
2892
+ /* Waypoint markers */
2893
+ .waypoint-marker circle {
2894
+ transition: r 0.15s ease;
3556
2895
  }
3557
2896
 
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));
2897
+ .waypoint-marker:hover circle {
2898
+ filter: brightness(1.3);
3562
2899
  }
3563
2900
 
3564
- /* Tool edges */
3565
- .tool-edge {
2901
+ /* Path label */
2902
+ .path-label {
2903
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3566
2904
  pointer-events: none;
3567
2905
  }
3568
2906
 
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;
2907
+ /* Path trail group */
2908
+ .path-trail {
2909
+ pointer-events: all;
3856
2910
  }