@grifhinz/logics-manager 2.1.2 → 2.3.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 (49) hide show
  1. package/README.md +106 -4
  2. package/VERSION +1 -1
  3. package/clients/README.md +9 -0
  4. package/clients/shared-web/media/css/board.css +658 -0
  5. package/clients/shared-web/media/css/details.css +457 -0
  6. package/clients/shared-web/media/css/layout.css +123 -0
  7. package/clients/shared-web/media/css/toolbar.css +576 -0
  8. package/clients/shared-web/media/harnessApi.js +324 -0
  9. package/clients/shared-web/media/hostApi.js +213 -0
  10. package/clients/shared-web/media/hostApiContract.js +55 -0
  11. package/clients/shared-web/media/icon.png +0 -0
  12. package/clients/shared-web/media/layoutController.js +246 -0
  13. package/clients/shared-web/media/logics.svg +7 -0
  14. package/clients/shared-web/media/logicsModel.js +910 -0
  15. package/clients/shared-web/media/main.css +112 -0
  16. package/clients/shared-web/media/main.js +3 -0
  17. package/clients/shared-web/media/mainApp.js +1005 -0
  18. package/clients/shared-web/media/mainCore.js +604 -0
  19. package/clients/shared-web/media/mainInteractionHandlers.js +324 -0
  20. package/clients/shared-web/media/mainInteractions.js +378 -0
  21. package/clients/shared-web/media/renderBoard.js +3 -0
  22. package/clients/shared-web/media/renderBoardApp.js +1339 -0
  23. package/clients/shared-web/media/renderDetails.js +685 -0
  24. package/clients/shared-web/media/renderMarkdown.js +449 -0
  25. package/clients/shared-web/media/toolsPanelLayout.js +172 -0
  26. package/clients/shared-web/media/uiStatus.js +54 -0
  27. package/clients/shared-web/media/webviewChrome.js +405 -0
  28. package/clients/shared-web/media/webviewPersistence.js +116 -0
  29. package/clients/shared-web/media/webviewSelectors.js +491 -0
  30. package/clients/viewer/README.md +5 -0
  31. package/clients/viewer/browser-host.js +847 -0
  32. package/clients/viewer/index.html +237 -0
  33. package/clients/viewer/viewer.css +433 -0
  34. package/logics_manager/assist.py +94 -63
  35. package/logics_manager/assist_handoff.py +132 -0
  36. package/logics_manager/assist_surface.py +38 -0
  37. package/logics_manager/cli.py +152 -12
  38. package/logics_manager/cli_output.py +18 -0
  39. package/logics_manager/flow.py +1360 -84
  40. package/logics_manager/flow_evidence.py +63 -0
  41. package/logics_manager/index.py +3 -7
  42. package/logics_manager/insights.py +418 -0
  43. package/logics_manager/mcp.py +50 -0
  44. package/logics_manager/path_utils.py +31 -0
  45. package/logics_manager/sync.py +24 -12
  46. package/logics_manager/update_check.py +138 -0
  47. package/logics_manager/viewer.py +533 -0
  48. package/package.json +12 -6
  49. package/pyproject.toml +1 -1
@@ -0,0 +1,457 @@
1
+ .details {
2
+ width: 300px;
3
+ border-left: 1px solid var(--vscode-panel-border, #333333);
4
+ background: var(--vscode-sideBar-background, #252526);
5
+ padding: 12px;
6
+ display: grid;
7
+ grid-template-rows: auto minmax(0, 1fr) auto;
8
+ gap: 12px;
9
+ position: relative;
10
+ bottom: auto;
11
+ align-self: stretch;
12
+ min-height: 0;
13
+ overflow: hidden;
14
+ }
15
+
16
+ .details__header {
17
+ display: flex;
18
+ align-items: flex-start;
19
+ justify-content: space-between;
20
+ gap: 10px;
21
+ }
22
+
23
+ .details__header-copy {
24
+ min-width: 0;
25
+ flex: 1 1 auto;
26
+ }
27
+
28
+ .details__header-eyebrow {
29
+ margin-bottom: 4px;
30
+ font-size: 11px;
31
+ font-weight: 700;
32
+ letter-spacing: 0.08em;
33
+ text-transform: uppercase;
34
+ color: var(--vscode-descriptionForeground, #9da5b4);
35
+ }
36
+
37
+ .details__header-title {
38
+ display: flex;
39
+ flex-direction: column;
40
+ gap: 2px;
41
+ flex: 1 1 auto;
42
+ min-width: 0;
43
+ white-space: normal;
44
+ overflow-wrap: anywhere;
45
+ word-break: break-word;
46
+ }
47
+
48
+ .details__header-title-main {
49
+ font-size: 20px;
50
+ font-weight: 700;
51
+ color: var(--vscode-foreground, #d4d4d4);
52
+ line-height: 1.2;
53
+ }
54
+
55
+ .details__header-title-file {
56
+ font-size: 11px;
57
+ color: var(--vscode-descriptionForeground, #9da5b4);
58
+ line-height: 1.3;
59
+ }
60
+
61
+ .details__toggle {
62
+ width: 26px;
63
+ height: 26px;
64
+ border: 1px solid var(--vscode-panel-border, #333333);
65
+ border-radius: 6px;
66
+ background: transparent;
67
+ color: var(--vscode-foreground, #d4d4d4);
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: center;
71
+ padding: 0;
72
+ cursor: pointer;
73
+ }
74
+
75
+ .details__toggle-icon {
76
+ width: 16px;
77
+ height: 16px;
78
+ display: block;
79
+ transition: transform 0.15s ease;
80
+ }
81
+
82
+ .details--collapsed .details__toggle-icon {
83
+ transform: rotate(-90deg);
84
+ }
85
+
86
+ .details__body {
87
+ flex: 1 1 auto;
88
+ min-height: 0;
89
+ overflow-y: auto;
90
+ overflow-x: hidden;
91
+ }
92
+
93
+ .details--collapsed .details__body {
94
+ display: none;
95
+ }
96
+
97
+ .details--collapsed .details__header-title-file {
98
+ display: none;
99
+ }
100
+
101
+ .details--collapsed {
102
+ grid-template-rows: auto;
103
+ gap: 0;
104
+ }
105
+
106
+ .details__actions {
107
+ display: grid;
108
+ grid-template-columns: repeat(2, minmax(0, 1fr));
109
+ gap: 8px;
110
+ align-items: stretch;
111
+ align-self: end;
112
+ padding-top: 8px;
113
+ border-top: 1px solid var(--vscode-panel-border, #333333);
114
+ background: var(--vscode-sideBar-background, #252526);
115
+ }
116
+
117
+ .details--collapsed .details__actions {
118
+ display: none;
119
+ }
120
+
121
+ .details--collapsed .read-preview__path {
122
+ display: none;
123
+ }
124
+
125
+ .details__actions .btn {
126
+ min-height: 34px;
127
+ }
128
+
129
+ .details__actions .btn[data-action="mark-obsolete"],
130
+ .details__actions .btn[data-action="change-status"] {
131
+ grid-column: 1 / -1;
132
+ }
133
+
134
+ .details__empty {
135
+ font-size: 12px;
136
+ color: var(--vscode-descriptionForeground, #9da5b4);
137
+ }
138
+
139
+ .details__title {
140
+ font-size: 14px;
141
+ margin-bottom: 8px;
142
+ }
143
+
144
+ .details__section-header {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 8px;
148
+ margin-bottom: 8px;
149
+ }
150
+
151
+ .details__section-title {
152
+ display: flex;
153
+ align-items: center;
154
+ justify-content: space-between;
155
+ gap: 8px;
156
+ font-size: 14px;
157
+ margin: 0;
158
+ color: var(--vscode-foreground, #d4d4d4);
159
+ background: transparent;
160
+ border: none;
161
+ padding: 0;
162
+ width: auto;
163
+ flex: 1;
164
+ text-align: left;
165
+ cursor: pointer;
166
+ }
167
+
168
+ .details__section-add {
169
+ width: 22px;
170
+ height: 22px;
171
+ border: 1px solid var(--vscode-panel-border, #333333);
172
+ border-radius: 4px;
173
+ background: transparent;
174
+ color: var(--vscode-foreground, #d4d4d4);
175
+ cursor: pointer;
176
+ line-height: 1;
177
+ font-size: 14px;
178
+ padding: 0;
179
+ }
180
+
181
+ .details__section-chevron {
182
+ width: 14px;
183
+ height: 14px;
184
+ color: var(--vscode-descriptionForeground, #9da5b4);
185
+ display: block;
186
+ transition: transform 0.15s ease;
187
+ }
188
+
189
+ .details__section--collapsed .details__section-chevron {
190
+ transform: rotate(-90deg);
191
+ }
192
+
193
+ .details__section--collapsed .details__references,
194
+ .details__section--collapsed .details__indicators,
195
+ .details__section--collapsed .details__dependency-map {
196
+ display: none;
197
+ }
198
+
199
+ .details__list {
200
+ display: grid;
201
+ gap: 8px;
202
+ font-size: 12px;
203
+ color: var(--vscode-descriptionForeground, #9da5b4);
204
+ }
205
+
206
+ .details__list-row {
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: flex-start;
210
+ gap: 8px;
211
+ }
212
+
213
+ .details__list-row--name {
214
+ align-items: flex-start;
215
+ flex-direction: column;
216
+ gap: 6px;
217
+ }
218
+
219
+ .details__list-row > span:first-child {
220
+ font-size: 11px;
221
+ font-weight: 700;
222
+ letter-spacing: 0.06em;
223
+ text-transform: uppercase;
224
+ color: var(--vscode-descriptionForeground, #9da5b4);
225
+ }
226
+
227
+ .details__name-value-wrap {
228
+ display: flex;
229
+ align-items: flex-start;
230
+ justify-content: flex-start;
231
+ flex: 1 1 auto;
232
+ gap: 6px;
233
+ min-width: 0;
234
+ width: 100%;
235
+ }
236
+
237
+ .details__name-value,
238
+ .details__list-value {
239
+ color: var(--vscode-foreground, #d4d4d4);
240
+ }
241
+
242
+ .details__name-value {
243
+ font-family: var(--vscode-editor-font-family, var(--vscode-font-family, "Segoe UI", sans-serif));
244
+ min-width: 0;
245
+ white-space: normal;
246
+ overflow-wrap: anywhere;
247
+ word-break: break-word;
248
+ text-align: left;
249
+ font-size: 11px;
250
+ line-height: 1.4;
251
+ color: var(--vscode-descriptionForeground, #9da5b4);
252
+ }
253
+
254
+ .details__rename {
255
+ width: 22px;
256
+ height: 22px;
257
+ border: 1px solid var(--vscode-panel-border, #333333);
258
+ border-radius: 4px;
259
+ background: transparent;
260
+ color: var(--vscode-foreground, #d4d4d4);
261
+ display: inline-flex;
262
+ align-items: center;
263
+ justify-content: center;
264
+ padding: 0;
265
+ cursor: pointer;
266
+ flex-shrink: 0;
267
+ }
268
+
269
+ .details__rename svg {
270
+ width: 13px;
271
+ height: 13px;
272
+ display: block;
273
+ }
274
+
275
+ .details__section {
276
+ margin-top: 12px;
277
+ border-top: 1px solid var(--vscode-panel-border, #333333);
278
+ padding-top: 10px;
279
+ }
280
+
281
+ .details__references,
282
+ .details__indicators {
283
+ display: grid;
284
+ gap: 6px;
285
+ font-size: 12px;
286
+ color: var(--vscode-descriptionForeground, #9da5b4);
287
+ }
288
+
289
+ .details__inline-cta {
290
+ justify-self: start;
291
+ border: 1px dashed var(--vscode-panel-border, #333333);
292
+ background: transparent;
293
+ color: var(--vscode-descriptionForeground, #9da5b4);
294
+ border-radius: 6px;
295
+ padding: 6px 8px;
296
+ font-size: 12px;
297
+ cursor: pointer;
298
+ }
299
+
300
+ .details__inline-cta--primary {
301
+ font-weight: 600;
302
+ }
303
+
304
+ .details__reference,
305
+ .details__indicator {
306
+ display: grid;
307
+ grid-template-columns: minmax(96px, 116px) minmax(0, 1fr);
308
+ align-items: start;
309
+ gap: 8px;
310
+ color: var(--vscode-descriptionForeground, #9da5b4);
311
+ }
312
+
313
+ .details__indicator-label,
314
+ .details__indicator-value,
315
+ .details__reference > div,
316
+ .details__reference > span {
317
+ min-width: 0;
318
+ }
319
+
320
+ .details__indicator-label,
321
+ .details__reference > div {
322
+ color: var(--vscode-descriptionForeground, #9da5b4);
323
+ overflow-wrap: normal;
324
+ word-break: normal;
325
+ white-space: normal;
326
+ }
327
+
328
+ .details__indicator-value,
329
+ .details__reference > span {
330
+ color: var(--vscode-foreground, #d4d4d4);
331
+ text-align: left;
332
+ justify-self: stretch;
333
+ display: flex;
334
+ flex-direction: column;
335
+ align-items: flex-start;
336
+ gap: 6px;
337
+ overflow-wrap: anywhere;
338
+ word-break: break-word;
339
+ }
340
+
341
+ .details__indicator-text {
342
+ min-width: 0;
343
+ width: 100%;
344
+ overflow-wrap: anywhere;
345
+ word-break: break-word;
346
+ }
347
+
348
+ .details__indicator-actions {
349
+ display: flex;
350
+ flex-wrap: wrap;
351
+ gap: 6px;
352
+ align-items: flex-start;
353
+ min-width: 0;
354
+ }
355
+
356
+ .details__indicator-actions .details__inline-cta {
357
+ margin-top: 0;
358
+ }
359
+
360
+ .details__reason-card {
361
+ display: grid;
362
+ gap: 6px;
363
+ padding: 10px;
364
+ border: 1px solid var(--vscode-panel-border, #333333);
365
+ border-radius: 8px;
366
+ background: color-mix(in srgb, var(--vscode-editorWidget-background, #202020) 82%, transparent);
367
+ }
368
+
369
+ .details__reason-card--primary {
370
+ border-color: rgba(248, 113, 113, 0.4);
371
+ }
372
+
373
+ .details__reason-badge {
374
+ display: inline-flex;
375
+ justify-self: start;
376
+ align-items: center;
377
+ min-height: 18px;
378
+ padding: 1px 8px;
379
+ border-radius: 999px;
380
+ font-size: 10px;
381
+ font-weight: 700;
382
+ letter-spacing: 0.04em;
383
+ text-transform: uppercase;
384
+ color: #fee2e2;
385
+ background: rgba(220, 38, 38, 0.2);
386
+ border: 1px solid rgba(248, 113, 113, 0.35);
387
+ }
388
+
389
+ .details__reason-description,
390
+ .details__reason-remediation {
391
+ font-size: 12px;
392
+ line-height: 1.45;
393
+ color: var(--vscode-descriptionForeground, #9da5b4);
394
+ }
395
+
396
+ .details__reason-description {
397
+ color: var(--vscode-foreground, #d4d4d4);
398
+ }
399
+
400
+ .details__pack-toolbar {
401
+ display: flex;
402
+ flex-wrap: wrap;
403
+ gap: 8px;
404
+ }
405
+
406
+ .details__pack-preview {
407
+ margin: 0;
408
+ padding: 10px;
409
+ border-radius: 8px;
410
+ border: 1px solid var(--vscode-panel-border, #333333);
411
+ background: color-mix(in srgb, var(--vscode-editorWidget-background, #202020) 86%, transparent);
412
+ color: var(--vscode-foreground, #d4d4d4);
413
+ font-size: 11px;
414
+ line-height: 1.5;
415
+ white-space: pre-wrap;
416
+ overflow-wrap: anywhere;
417
+ }
418
+
419
+ .details__dependency-map {
420
+ display: grid;
421
+ gap: 10px;
422
+ }
423
+
424
+ .details__map-group {
425
+ display: grid;
426
+ gap: 6px;
427
+ }
428
+
429
+ .details__map-group-label {
430
+ font-size: 11px;
431
+ font-weight: 700;
432
+ letter-spacing: 0.06em;
433
+ text-transform: uppercase;
434
+ color: var(--vscode-descriptionForeground, #9da5b4);
435
+ }
436
+
437
+ .details__map-nodes {
438
+ display: flex;
439
+ flex-wrap: wrap;
440
+ gap: 6px;
441
+ }
442
+
443
+ .details__map-node {
444
+ border: 1px solid var(--vscode-panel-border, #333333);
445
+ border-radius: 999px;
446
+ background: transparent;
447
+ color: var(--vscode-foreground, #d4d4d4);
448
+ padding: 5px 9px;
449
+ font-size: 11px;
450
+ cursor: pointer;
451
+ }
452
+
453
+ .details__map-node--current {
454
+ background: rgba(14, 99, 156, 0.2);
455
+ border-color: rgba(56, 189, 248, 0.3);
456
+ cursor: default;
457
+ }
@@ -0,0 +1,123 @@
1
+ .layout {
2
+ display: flex;
3
+ min-height: 0;
4
+ overflow: hidden;
5
+ }
6
+
7
+ .layout__main {
8
+ flex: 1 1 auto;
9
+ min-width: 0;
10
+ min-height: 0;
11
+ display: flex;
12
+ overflow: hidden;
13
+ position: relative;
14
+ }
15
+
16
+ .layout--horizontal {
17
+ flex-direction: row;
18
+ }
19
+
20
+ .layout--stacked {
21
+ flex-direction: column;
22
+ position: relative;
23
+ }
24
+
25
+ .splitter {
26
+ display: none;
27
+ position: relative;
28
+ flex: 0 0 14px;
29
+ height: 14px;
30
+ width: 100%;
31
+ background: transparent;
32
+ cursor: row-resize;
33
+ touch-action: none;
34
+ z-index: 3;
35
+ }
36
+
37
+ .splitter::before {
38
+ content: "";
39
+ position: absolute;
40
+ left: 12px;
41
+ right: 12px;
42
+ top: 50%;
43
+ height: 2px;
44
+ transform: translateY(-50%);
45
+ background: var(--vscode-panel-border, #333333);
46
+ border-radius: 999px;
47
+ }
48
+
49
+ .splitter::after {
50
+ content: "";
51
+ position: absolute;
52
+ left: 50%;
53
+ top: 50%;
54
+ width: 42px;
55
+ height: 2px;
56
+ transform: translate(-50%, -50%);
57
+ background: var(--vscode-descriptionForeground, #9da5b4);
58
+ border-radius: 999px;
59
+ box-shadow:
60
+ 0 -4px 0 var(--vscode-descriptionForeground, #9da5b4),
61
+ 0 4px 0 var(--vscode-descriptionForeground, #9da5b4);
62
+ }
63
+
64
+ .splitter:hover::before,
65
+ .splitter--dragging::before {
66
+ background: var(--vscode-button-background, #0e639c);
67
+ }
68
+
69
+ .splitter:hover::after,
70
+ .splitter--dragging::after {
71
+ background: var(--vscode-button-background, #0e639c);
72
+ box-shadow:
73
+ 0 -4px 0 var(--vscode-button-background, #0e639c),
74
+ 0 4px 0 var(--vscode-button-background, #0e639c);
75
+ }
76
+
77
+ .layout--stacked .splitter {
78
+ display: block;
79
+ position: absolute;
80
+ left: 0;
81
+ right: 0;
82
+ width: 100%;
83
+ }
84
+
85
+ .layout--horizontal .splitter {
86
+ display: none !important;
87
+ }
88
+
89
+ .layout--stacked.layout--split-disabled .splitter {
90
+ display: none;
91
+ }
92
+
93
+ .layout--stacked .layout__main {
94
+ flex: 1 1 auto;
95
+ min-height: 0;
96
+ z-index: 0;
97
+ }
98
+
99
+ .layout--horizontal .layout__main {
100
+ min-width: 0;
101
+ min-height: 0;
102
+ }
103
+
104
+ .layout--horizontal .details {
105
+ flex: 0 0 300px;
106
+ min-height: 0;
107
+ }
108
+
109
+ .layout--stacked .details {
110
+ min-height: 220px;
111
+ border-top: none;
112
+ position: absolute;
113
+ left: 0;
114
+ right: 0;
115
+ bottom: 0;
116
+ overflow: hidden;
117
+ z-index: 2;
118
+ }
119
+
120
+ .is-resizing {
121
+ cursor: row-resize;
122
+ user-select: none;
123
+ }