trackops 2.0.2 → 2.0.4

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 (48) hide show
  1. package/README.md +238 -0
  2. package/lib/init.js +2 -2
  3. package/lib/locale.js +41 -17
  4. package/lib/opera-bootstrap.js +68 -7
  5. package/lib/opera.js +10 -2
  6. package/lib/registry.js +18 -0
  7. package/lib/server.js +312 -207
  8. package/locales/en.json +4 -0
  9. package/locales/es.json +4 -0
  10. package/package.json +1 -1
  11. package/skills/trackops/SKILL.md +39 -4
  12. package/skills/trackops/agents/openai.yaml +2 -2
  13. package/skills/trackops/locales/en/SKILL.md +39 -4
  14. package/skills/trackops/locales/en/references/activation.md +15 -0
  15. package/skills/trackops/locales/en/references/troubleshooting.md +12 -0
  16. package/skills/trackops/references/activation.md +15 -0
  17. package/skills/trackops/references/troubleshooting.md +12 -0
  18. package/skills/trackops/skill.json +4 -4
  19. package/ui/css/base.css +19 -1
  20. package/ui/css/charts.css +106 -8
  21. package/ui/css/components.css +554 -17
  22. package/ui/css/onboarding.css +133 -0
  23. package/ui/css/panels.css +345 -406
  24. package/ui/css/terminal.css +125 -0
  25. package/ui/css/timeline.css +58 -0
  26. package/ui/css/tokens.css +170 -113
  27. package/ui/index.html +3 -0
  28. package/ui/js/api.js +49 -13
  29. package/ui/js/app.js +28 -32
  30. package/ui/js/charts.js +526 -0
  31. package/ui/js/filters.js +247 -0
  32. package/ui/js/icons.js +82 -57
  33. package/ui/js/keyboard.js +229 -0
  34. package/ui/js/onboarding.js +33 -42
  35. package/ui/js/router.js +20 -3
  36. package/ui/js/views/board.js +84 -114
  37. package/ui/js/views/dashboard.js +870 -0
  38. package/ui/js/views/projects.js +745 -0
  39. package/ui/js/views/scrum.js +476 -0
  40. package/ui/js/views/settings.js +197 -247
  41. package/ui/js/views/sidebar.js +37 -31
  42. package/ui/js/views/tasks.js +218 -101
  43. package/ui/js/views/timeline.js +265 -0
  44. package/ui/js/views/topbar.js +94 -107
  45. package/ui/app.js +0 -950
  46. package/ui/js/views/insights.js +0 -340
  47. package/ui/js/views/overview.js +0 -369
  48. package/ui/styles.css +0 -688
package/ui/styles.css DELETED
@@ -1,688 +0,0 @@
1
- :root {
2
- color-scheme: light;
3
- --bg: #f4efe6;
4
- --panel: rgba(255, 251, 246, 0.92);
5
- --panel-strong: rgba(251, 246, 238, 0.98);
6
- --ink: #1f2430;
7
- --muted: #5f6776;
8
- --line: rgba(31, 36, 48, 0.1);
9
- --accent: #0f8c82;
10
- --accent-2: #155e87;
11
- --warn: #bf6a32;
12
- --danger: #a34737;
13
- --success: #307159;
14
- --shadow-lg: 0 24px 60px rgba(40, 36, 28, 0.12);
15
- --shadow-md: 0 12px 28px rgba(40, 36, 28, 0.08);
16
- --radius-xl: 28px;
17
- --radius-lg: 22px;
18
- --radius-md: 16px;
19
- --font-ui: Aptos, "Segoe UI Variable", "Segoe UI", sans-serif;
20
- --font-mono: "Cascadia Code", Consolas, "SFMono-Regular", monospace;
21
- }
22
-
23
- * {
24
- box-sizing: border-box;
25
- }
26
-
27
- html,
28
- body {
29
- margin: 0;
30
- min-height: 100%;
31
- }
32
-
33
- body {
34
- font-family: var(--font-ui);
35
- color: var(--ink);
36
- background:
37
- radial-gradient(circle at top left, rgba(15, 140, 130, 0.16), transparent 28%),
38
- radial-gradient(circle at top right, rgba(191, 106, 50, 0.14), transparent 24%),
39
- linear-gradient(180deg, #fbf7f0 0%, #f1ebdf 56%, #f4efe6 100%);
40
- }
41
-
42
- button,
43
- input,
44
- textarea,
45
- select {
46
- font: inherit;
47
- }
48
-
49
- button {
50
- cursor: pointer;
51
- }
52
-
53
- .sr-only {
54
- position: absolute;
55
- width: 1px;
56
- height: 1px;
57
- padding: 0;
58
- margin: -1px;
59
- overflow: hidden;
60
- clip: rect(0, 0, 0, 0);
61
- white-space: nowrap;
62
- border: 0;
63
- }
64
-
65
- .app-shell {
66
- min-height: 100vh;
67
- padding: 24px;
68
- }
69
-
70
- .topbar,
71
- .tabs,
72
- .panel,
73
- .inset-panel {
74
- border: 1px solid rgba(255, 255, 255, 0.5);
75
- background: linear-gradient(180deg, var(--panel-strong), var(--panel));
76
- box-shadow: var(--shadow-md);
77
- }
78
-
79
- .topbar {
80
- display: flex;
81
- justify-content: space-between;
82
- gap: 18px;
83
- align-items: flex-start;
84
- padding: 26px 28px;
85
- border-radius: var(--radius-xl);
86
- box-shadow: var(--shadow-lg);
87
- backdrop-filter: blur(18px);
88
- }
89
-
90
- .brand-block h1,
91
- .details-summary h2,
92
- .panel-head h3 {
93
- margin: 0;
94
- letter-spacing: -0.04em;
95
- }
96
-
97
- .brand-block h1 {
98
- font-size: clamp(2.1rem, 4vw, 3.2rem);
99
- line-height: 0.95;
100
- }
101
-
102
- .eyebrow {
103
- margin: 0 0 8px;
104
- font-size: 0.76rem;
105
- font-weight: 800;
106
- letter-spacing: 0.16em;
107
- text-transform: uppercase;
108
- color: var(--accent);
109
- }
110
-
111
- .subtle,
112
- .label,
113
- .meta-text {
114
- color: var(--muted);
115
- }
116
-
117
- .subtle,
118
- .value-text {
119
- margin: 10px 0 0;
120
- }
121
-
122
- .topbar-actions,
123
- .project-switcher,
124
- .action-strip,
125
- .preset-row,
126
- .session-list,
127
- .form-actions,
128
- .tag-row {
129
- display: flex;
130
- gap: 10px;
131
- flex-wrap: wrap;
132
- }
133
-
134
- .topbar-actions {
135
- align-items: center;
136
- justify-content: flex-end;
137
- }
138
-
139
- .project-switcher select {
140
- min-width: 280px;
141
- }
142
-
143
- .primary-button,
144
- .ghost-button,
145
- .chip-button,
146
- .tab-button,
147
- .session-button {
148
- border: 1px solid transparent;
149
- border-radius: 999px;
150
- padding: 0.78rem 1.05rem;
151
- transition: transform 150ms ease, background 150ms ease, border-color 150ms ease;
152
- }
153
-
154
- .primary-button {
155
- color: white;
156
- background: linear-gradient(135deg, var(--accent) 0%, var(--accent-2) 100%);
157
- box-shadow: 0 12px 24px rgba(15, 140, 130, 0.22);
158
- }
159
-
160
- .ghost-button,
161
- .chip-button,
162
- .tab-button,
163
- .session-button {
164
- color: var(--ink);
165
- background: rgba(255, 255, 255, 0.68);
166
- border-color: rgba(31, 36, 48, 0.1);
167
- }
168
-
169
- .primary-button:hover,
170
- .ghost-button:hover,
171
- .chip-button:hover,
172
- .tab-button:hover,
173
- .task-card:hover,
174
- .session-button:hover {
175
- transform: translateY(-1px);
176
- }
177
-
178
- .primary-button:focus-visible,
179
- .ghost-button:focus-visible,
180
- .chip-button:focus-visible,
181
- .tab-button:focus-visible,
182
- .task-card:focus-visible,
183
- .session-button:focus-visible,
184
- input:focus-visible,
185
- textarea:focus-visible,
186
- select:focus-visible,
187
- summary:focus-visible {
188
- outline: 3px solid rgba(15, 140, 130, 0.24);
189
- outline-offset: 2px;
190
- }
191
-
192
- .runtime-badge,
193
- .secondary-badge,
194
- .phase-badge,
195
- .tag,
196
- .task-chip,
197
- .metric-pill {
198
- display: inline-flex;
199
- align-items: center;
200
- min-height: 34px;
201
- padding: 0 12px;
202
- border-radius: 999px;
203
- font-size: 0.82rem;
204
- font-weight: 700;
205
- border: 1px solid rgba(31, 36, 48, 0.08);
206
- background: rgba(255, 255, 255, 0.72);
207
- }
208
-
209
- .runtime-badge.is-clean,
210
- .phase-badge,
211
- .tag.success {
212
- color: var(--success);
213
- }
214
-
215
- .runtime-badge.is-dirty,
216
- .tag.warn {
217
- color: var(--warn);
218
- background: rgba(255, 244, 236, 0.92);
219
- }
220
-
221
- .tabs {
222
- display: flex;
223
- gap: 10px;
224
- padding: 10px;
225
- margin-top: 18px;
226
- border-radius: 999px;
227
- overflow-x: auto;
228
- }
229
-
230
- .tab-button {
231
- min-width: 132px;
232
- font-weight: 700;
233
- }
234
-
235
- .tab-button.is-active {
236
- color: white;
237
- background: linear-gradient(135deg, var(--accent) 0%, var(--accent-2) 100%);
238
- border-color: transparent;
239
- }
240
-
241
- .tab-shell {
242
- margin-top: 20px;
243
- }
244
-
245
- .tab-panel {
246
- display: grid;
247
- gap: 18px;
248
- }
249
-
250
- .summary-grid,
251
- .overview-grid,
252
- .charts-grid,
253
- .split-grid {
254
- display: grid;
255
- gap: 18px;
256
- }
257
-
258
- .summary-grid {
259
- grid-template-columns: repeat(4, minmax(0, 1fr));
260
- }
261
-
262
- .overview-grid {
263
- grid-template-columns: repeat(3, minmax(0, 1fr));
264
- }
265
-
266
- .charts-grid {
267
- grid-template-columns: repeat(3, minmax(0, 1fr));
268
- }
269
-
270
- .split-grid {
271
- grid-template-columns: minmax(0, 1.3fr) minmax(360px, 0.85fr);
272
- }
273
-
274
- .panel,
275
- .inset-panel {
276
- border-radius: var(--radius-xl);
277
- overflow: hidden;
278
- }
279
-
280
- .inset-panel {
281
- padding: 20px;
282
- }
283
-
284
- .panel-details > .details-summary {
285
- list-style: none;
286
- display: flex;
287
- justify-content: space-between;
288
- align-items: flex-start;
289
- gap: 16px;
290
- padding: 20px 22px;
291
- cursor: pointer;
292
- }
293
-
294
- .panel-details > .details-summary::-webkit-details-marker {
295
- display: none;
296
- }
297
-
298
- .details-body {
299
- padding: 0 22px 22px;
300
- }
301
-
302
- .panel-head.compact {
303
- padding: 0 0 14px;
304
- }
305
-
306
- .panel-head.compact h3 {
307
- font-size: 1.18rem;
308
- }
309
-
310
- .metric-card,
311
- .info-row,
312
- .decision-item,
313
- .activity-item,
314
- .finding-item,
315
- .task-snippet,
316
- .project-row,
317
- .chart-card,
318
- .health-card {
319
- padding: 16px;
320
- border-radius: var(--radius-md);
321
- background: rgba(255, 255, 255, 0.7);
322
- border: 1px solid rgba(31, 36, 48, 0.08);
323
- }
324
-
325
- .metric-card {
326
- position: relative;
327
- }
328
-
329
- .metric-card::after {
330
- content: "";
331
- position: absolute;
332
- inset: auto 16px 12px 16px;
333
- height: 3px;
334
- border-radius: 999px;
335
- background: linear-gradient(90deg, rgba(15, 140, 130, 0.26), rgba(21, 94, 135, 0.8));
336
- }
337
-
338
- .metric-value {
339
- margin: 16px 0 8px;
340
- font-size: clamp(1.9rem, 4vw, 2.6rem);
341
- font-weight: 800;
342
- letter-spacing: -0.06em;
343
- }
344
-
345
- .metric-support {
346
- font-size: 0.92rem;
347
- color: var(--muted);
348
- }
349
-
350
- .stack-list,
351
- .stack-form {
352
- display: grid;
353
- gap: 12px;
354
- }
355
-
356
- .inline-form {
357
- display: grid;
358
- grid-template-columns: minmax(0, 1fr) auto;
359
- gap: 10px;
360
- }
361
-
362
- .label {
363
- margin: 0 0 8px;
364
- font-size: 0.82rem;
365
- font-weight: 800;
366
- letter-spacing: 0.08em;
367
- text-transform: uppercase;
368
- }
369
-
370
- .project-row {
371
- display: flex;
372
- justify-content: space-between;
373
- gap: 14px;
374
- align-items: center;
375
- }
376
-
377
- .project-row.is-active {
378
- background: linear-gradient(180deg, rgba(229, 246, 243, 0.92), rgba(255, 255, 255, 0.9));
379
- }
380
-
381
- .project-row-meta {
382
- min-width: 0;
383
- }
384
-
385
- .project-row-meta strong,
386
- .task-title {
387
- display: block;
388
- margin-bottom: 6px;
389
- }
390
-
391
- .task-snippet strong,
392
- .project-row strong,
393
- .activity-item strong,
394
- .finding-item strong {
395
- font-weight: 800;
396
- }
397
-
398
- .chart-card {
399
- min-height: 240px;
400
- }
401
-
402
- .chart-bars,
403
- .chart-activity {
404
- display: grid;
405
- gap: 12px;
406
- }
407
-
408
- .chart-bar-row {
409
- display: grid;
410
- grid-template-columns: 120px minmax(0, 1fr) auto;
411
- gap: 10px;
412
- align-items: center;
413
- }
414
-
415
- .bar-track {
416
- height: 10px;
417
- border-radius: 999px;
418
- overflow: hidden;
419
- background: rgba(31, 36, 48, 0.08);
420
- }
421
-
422
- .bar-fill {
423
- height: 100%;
424
- border-radius: 999px;
425
- background: linear-gradient(90deg, var(--accent), var(--accent-2));
426
- }
427
-
428
- .chart-activity {
429
- grid-template-columns: repeat(10, minmax(0, 1fr));
430
- align-items: end;
431
- min-height: 170px;
432
- }
433
-
434
- .activity-bar-wrap {
435
- display: grid;
436
- gap: 8px;
437
- align-items: end;
438
- justify-items: center;
439
- }
440
-
441
- .activity-bar {
442
- width: 100%;
443
- min-height: 10px;
444
- border-radius: 14px 14px 6px 6px;
445
- background: linear-gradient(180deg, rgba(21, 94, 135, 0.94), rgba(15, 140, 130, 0.72));
446
- }
447
-
448
- .activity-label {
449
- font-size: 0.76rem;
450
- color: var(--muted);
451
- }
452
-
453
- .board-grid {
454
- display: grid;
455
- grid-auto-flow: column;
456
- grid-auto-columns: minmax(280px, 1fr);
457
- gap: 16px;
458
- overflow-x: auto;
459
- padding-bottom: 10px;
460
- }
461
-
462
- .board-column {
463
- min-height: 520px;
464
- padding: 16px;
465
- border-radius: var(--radius-lg);
466
- background: linear-gradient(180deg, rgba(245, 239, 230, 0.88), rgba(255, 252, 248, 0.62));
467
- border: 1px solid rgba(31, 36, 48, 0.08);
468
- }
469
-
470
- .board-column.is-drop-target {
471
- background: linear-gradient(180deg, rgba(227, 245, 241, 0.9), rgba(255, 252, 248, 0.8));
472
- }
473
-
474
- .column-head {
475
- display: flex;
476
- justify-content: space-between;
477
- gap: 12px;
478
- margin-bottom: 14px;
479
- }
480
-
481
- .column-title {
482
- margin: 0;
483
- font-size: 1rem;
484
- font-weight: 800;
485
- }
486
-
487
- .column-count {
488
- display: inline-flex;
489
- align-items: center;
490
- justify-content: center;
491
- min-width: 34px;
492
- height: 34px;
493
- border-radius: 999px;
494
- background: rgba(255, 255, 255, 0.84);
495
- font-size: 0.84rem;
496
- font-weight: 800;
497
- }
498
-
499
- .column-body {
500
- display: grid;
501
- gap: 12px;
502
- }
503
-
504
- .task-card {
505
- width: 100%;
506
- border: 1px solid rgba(31, 36, 48, 0.08);
507
- border-radius: var(--radius-lg);
508
- padding: 16px;
509
- background: rgba(255, 255, 255, 0.82);
510
- text-align: left;
511
- }
512
-
513
- .task-card.is-selected {
514
- border-color: rgba(15, 140, 130, 0.24);
515
- background: linear-gradient(180deg, rgba(229, 246, 243, 0.92), rgba(255, 255, 255, 0.88));
516
- }
517
-
518
- .task-card[data-status="blocked"] {
519
- background: rgba(255, 244, 239, 0.92);
520
- }
521
-
522
- .task-card[data-status="completed"] {
523
- background: rgba(244, 252, 248, 0.92);
524
- }
525
-
526
- .task-id {
527
- display: inline-block;
528
- margin-top: 6px;
529
- font-family: var(--font-mono);
530
- font-size: 0.77rem;
531
- color: var(--muted);
532
- }
533
-
534
- .task-summary {
535
- margin: 0 0 12px;
536
- min-height: 3.2em;
537
- font-size: 0.92rem;
538
- color: var(--muted);
539
- }
540
-
541
- .task-meta {
542
- display: flex;
543
- flex-wrap: wrap;
544
- gap: 8px;
545
- }
546
-
547
- .task-chip.priority-p0 {
548
- color: var(--danger);
549
- }
550
-
551
- .task-chip.priority-p1 {
552
- color: var(--warn);
553
- }
554
-
555
- .empty-state {
556
- padding: 18px 16px;
557
- border-radius: var(--radius-md);
558
- border: 1px dashed rgba(31, 36, 48, 0.18);
559
- text-align: center;
560
- color: var(--muted);
561
- background: rgba(255, 255, 255, 0.4);
562
- }
563
-
564
- .task-form,
565
- .field,
566
- .command-form,
567
- .form-grid.two-up {
568
- display: grid;
569
- gap: 12px;
570
- }
571
-
572
- .form-grid.two-up {
573
- grid-template-columns: repeat(2, minmax(0, 1fr));
574
- }
575
-
576
- .field label {
577
- font-size: 0.9rem;
578
- font-weight: 700;
579
- }
580
-
581
- .checkbox-field label {
582
- display: flex;
583
- gap: 10px;
584
- align-items: center;
585
- }
586
-
587
- input,
588
- textarea,
589
- select {
590
- width: 100%;
591
- border: 1px solid rgba(31, 36, 48, 0.12);
592
- border-radius: var(--radius-md);
593
- padding: 0.9rem 1rem;
594
- color: var(--ink);
595
- background: rgba(255, 255, 255, 0.8);
596
- }
597
-
598
- textarea {
599
- resize: vertical;
600
- }
601
-
602
- .command-form {
603
- grid-template-columns: minmax(0, 1fr) auto;
604
- }
605
-
606
- .session-button.is-selected {
607
- background: rgba(229, 246, 243, 0.94);
608
- border-color: rgba(15, 140, 130, 0.24);
609
- }
610
-
611
- .terminal-surface {
612
- margin-top: 14px;
613
- border-radius: var(--radius-lg);
614
- overflow: hidden;
615
- border: 1px solid rgba(16, 24, 40, 0.08);
616
- background:
617
- radial-gradient(circle at top right, rgba(15, 140, 130, 0.14), transparent 24%),
618
- linear-gradient(180deg, #10151d 0%, #151d27 100%);
619
- }
620
-
621
- .terminal-surface pre {
622
- margin: 0;
623
- min-height: 300px;
624
- max-height: 420px;
625
- overflow: auto;
626
- padding: 20px;
627
- font-family: var(--font-mono);
628
- font-size: 0.87rem;
629
- line-height: 1.55;
630
- color: #ddf5ee;
631
- }
632
-
633
- .flash {
634
- position: fixed;
635
- right: 24px;
636
- bottom: 24px;
637
- display: none;
638
- max-width: 420px;
639
- padding: 14px 16px;
640
- border-radius: 18px;
641
- background: rgba(28, 35, 47, 0.96);
642
- color: white;
643
- box-shadow: var(--shadow-lg);
644
- }
645
-
646
- .flash.is-visible {
647
- display: block;
648
- }
649
-
650
- .flash.is-error {
651
- background: rgba(163, 71, 55, 0.96);
652
- }
653
-
654
- @media (max-width: 1400px) {
655
- .overview-grid,
656
- .charts-grid {
657
- grid-template-columns: 1fr;
658
- }
659
-
660
- .split-grid {
661
- grid-template-columns: 1fr;
662
- }
663
- }
664
-
665
- @media (max-width: 980px) {
666
- .app-shell {
667
- padding: 16px;
668
- }
669
-
670
- .topbar {
671
- flex-direction: column;
672
- }
673
-
674
- .summary-grid,
675
- .form-grid.two-up,
676
- .inline-form,
677
- .command-form {
678
- grid-template-columns: 1fr;
679
- }
680
-
681
- .project-switcher select {
682
- min-width: 0;
683
- }
684
-
685
- .board-grid {
686
- grid-auto-columns: minmax(260px, 88vw);
687
- }
688
- }