trackops 2.0.3 → 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 (45) 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/locales/en/references/activation.md +15 -0
  12. package/skills/trackops/locales/en/references/troubleshooting.md +12 -0
  13. package/skills/trackops/references/activation.md +15 -0
  14. package/skills/trackops/references/troubleshooting.md +12 -0
  15. package/skills/trackops/skill.json +2 -2
  16. package/ui/css/base.css +19 -1
  17. package/ui/css/charts.css +106 -8
  18. package/ui/css/components.css +554 -17
  19. package/ui/css/onboarding.css +133 -0
  20. package/ui/css/panels.css +345 -406
  21. package/ui/css/terminal.css +125 -0
  22. package/ui/css/timeline.css +58 -0
  23. package/ui/css/tokens.css +170 -113
  24. package/ui/index.html +3 -0
  25. package/ui/js/api.js +49 -13
  26. package/ui/js/app.js +28 -32
  27. package/ui/js/charts.js +526 -0
  28. package/ui/js/filters.js +247 -0
  29. package/ui/js/icons.js +82 -57
  30. package/ui/js/keyboard.js +229 -0
  31. package/ui/js/onboarding.js +33 -42
  32. package/ui/js/router.js +20 -3
  33. package/ui/js/views/board.js +84 -114
  34. package/ui/js/views/dashboard.js +870 -0
  35. package/ui/js/views/projects.js +745 -0
  36. package/ui/js/views/scrum.js +476 -0
  37. package/ui/js/views/settings.js +197 -247
  38. package/ui/js/views/sidebar.js +37 -31
  39. package/ui/js/views/tasks.js +218 -101
  40. package/ui/js/views/timeline.js +265 -0
  41. package/ui/js/views/topbar.js +94 -107
  42. package/ui/app.js +0 -950
  43. package/ui/js/views/insights.js +0 -340
  44. package/ui/js/views/overview.js +0 -369
  45. package/ui/styles.css +0 -688
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trackops",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "Operational project control with task management, document generation, multi-project dashboard, and optional OPERA methodology",
5
5
  "main": "lib/control.js",
6
6
  "bin": {
@@ -73,3 +73,18 @@ trackops locale get
73
73
  trackops locale set en
74
74
  trackops doctor locale
75
75
  ```
76
+
77
+ ## Uninstall
78
+
79
+ Global:
80
+
81
+ ```bash
82
+ npx skills remove --global trackops -y
83
+ npm uninstall -g trackops
84
+ ```
85
+
86
+ Local:
87
+
88
+ - there is no `trackops uninstall` command yet
89
+ - review and remove `.trackops-workspace.json`, `ops/`, and `app/.env` if it was only the bridge
90
+ - do not delete `/.env` or `/.env.example` without checking whether the project still needs them
@@ -53,3 +53,15 @@ Check that both files exist and contain usable data:
53
53
  - Run `trackops env status`.
54
54
  - Run `trackops env sync`.
55
55
  - If bridge mode is `copy`, do not edit `app/.env` directly.
56
+
57
+ ## I want to remove TrackOps completely
58
+
59
+ - Remove the global skill:
60
+ `npx skills remove --global trackops -y`
61
+ - Remove the global runtime:
62
+ `npm uninstall -g trackops`
63
+ - Inside the repository, local removal is still manual:
64
+ - review `.trackops-workspace.json`
65
+ - review `ops/`
66
+ - review `app/.env` if it was only the bridge
67
+ - Do not delete `/.env` or `/.env.example` before checking whether the project still depends on them
@@ -73,3 +73,18 @@ trackops locale get
73
73
  trackops locale set es
74
74
  trackops doctor locale
75
75
  ```
76
+
77
+ ## Desinstalacion
78
+
79
+ Global:
80
+
81
+ ```bash
82
+ npx skills remove --global trackops -y
83
+ npm uninstall -g trackops
84
+ ```
85
+
86
+ Local:
87
+
88
+ - no existe todavia `trackops uninstall`
89
+ - revisa y elimina manualmente `.trackops-workspace.json`, `ops/` y `app/.env` si solo era bridge
90
+ - no borres `/.env` ni `/.env.example` sin revisar si el proyecto sigue necesitandolos
@@ -53,3 +53,15 @@ Comprueba que existan ambos archivos y contengan datos utiles:
53
53
  - Ejecuta `trackops env status`.
54
54
  - Ejecuta `trackops env sync`.
55
55
  - Si el modo bridge es `copy`, no edites `app/.env` directamente.
56
+
57
+ ## Quiero quitar TrackOps por completo
58
+
59
+ - Quita la skill global:
60
+ `npx skills remove --global trackops -y`
61
+ - Quita el runtime global:
62
+ `npm uninstall -g trackops`
63
+ - En el repo, la retirada local sigue siendo manual:
64
+ - revisa `.trackops-workspace.json`
65
+ - revisa `ops/`
66
+ - revisa `app/.env` si era solo bridge
67
+ - No borres `/.env` ni `/.env.example` sin comprobar antes si el proyecto sigue dependiendo de ellos
@@ -2,8 +2,8 @@
2
2
  "name": "trackops",
3
3
  "shortDescription": "Global TrackOps skill that explains TrackOps, requires explicit runtime install, and guides per-repository activation.",
4
4
  "description": "Explains what TrackOps does, installs the global skill layer, requires explicit runtime installation with npm, supports Spanish and English, activates TrackOps repository by repository, and routes OPERA onboarding into either direct bootstrap or agent-led discovery.",
5
- "skillVersion": "2.0.3",
6
- "trackopsVersion": "2.0.3",
5
+ "skillVersion": "2.0.4",
6
+ "trackopsVersion": "2.0.4",
7
7
  "npmPackage": "trackops",
8
8
  "bootstrapPolicy": "explicit_install",
9
9
  "supportedAgentsV1": [
package/ui/css/base.css CHANGED
@@ -20,7 +20,8 @@ body {
20
20
  font-family: var(--font-ui);
21
21
  font-size: var(--text-base);
22
22
  color: var(--text-primary);
23
- background-color: var(--surface-0);
23
+ background: var(--bg-gradient);
24
+ background-attachment: fixed;
24
25
  line-height: 1.55;
25
26
  min-height: 100dvh;
26
27
  overflow-x: hidden;
@@ -69,6 +70,12 @@ body {
69
70
  "sidebar topbar"
70
71
  "sidebar content";
71
72
  min-height: 100dvh;
73
+ transition: grid-template-columns var(--duration-slow) var(--ease-out);
74
+ }
75
+
76
+ .app-shell:has(.sidebar:hover),
77
+ .app-shell:has(.sidebar:focus-within) {
78
+ grid-template-columns: var(--sidebar-width-expanded) 1fr;
72
79
  }
73
80
 
74
81
  #sidebar {
@@ -95,6 +102,7 @@ body {
95
102
  padding: var(--content-pad);
96
103
  min-height: calc(100dvh - var(--topbar-height));
97
104
  overflow-y: auto;
105
+ scroll-behavior: smooth;
98
106
  }
99
107
 
100
108
  /* ── Tipografía ── */
@@ -236,6 +244,16 @@ ul, ol { list-style: none; }
236
244
  .text-warning { color: var(--warning); }
237
245
  .text-danger { color: var(--danger); }
238
246
 
247
+ /* ── Reduced motion (WCAG 2.2 AA) ── */
248
+ @media (prefers-reduced-motion: reduce) {
249
+ *, *::before, *::after {
250
+ animation-duration: 0.01ms !important;
251
+ animation-iteration-count: 1 !important;
252
+ transition-duration: 0.01ms !important;
253
+ scroll-behavior: auto !important;
254
+ }
255
+ }
256
+
239
257
  /* ── Responsive: sidebar colapsable en pantallas menores a 1024px ── */
240
258
  @media (max-width: 1024px) {
241
259
  .app-shell {
package/ui/css/charts.css CHANGED
@@ -6,13 +6,25 @@
6
6
  CHART CARD CONTAINER
7
7
  ─────────────────────────────────── */
8
8
  .chart-card {
9
- background: var(--surface-2);
10
- border: 1px solid var(--border);
9
+ background: var(--glass-bg);
10
+ backdrop-filter: blur(var(--glass-blur));
11
+ -webkit-backdrop-filter: blur(var(--glass-blur));
12
+ border: 1px solid var(--glass-border);
11
13
  border-radius: var(--radius-xl);
12
14
  padding: var(--space-5);
13
15
  display: flex;
14
16
  flex-direction: column;
15
17
  gap: var(--space-4);
18
+ box-shadow: var(--glass-shadow), var(--glass-inner);
19
+ transition:
20
+ border-color var(--duration-base) var(--ease-out),
21
+ box-shadow var(--duration-base) var(--ease-out),
22
+ transform var(--duration-base) var(--ease-out);
23
+ }
24
+ .chart-card:hover {
25
+ border-color: var(--glass-border-hover);
26
+ box-shadow: var(--shadow-sm);
27
+ transform: translateY(-2px);
16
28
  }
17
29
 
18
30
  .chart-title {
@@ -62,7 +74,7 @@
62
74
  .bar-fill {
63
75
  height: 100%;
64
76
  border-radius: var(--radius-full);
65
- background: linear-gradient(90deg, var(--accent), #818CF8);
77
+ background: linear-gradient(90deg, var(--accent) 0%, var(--accent-hover) 100%);
66
78
  transform-origin: left;
67
79
  animation: barGrow 0.8s var(--ease-out) both;
68
80
  }
@@ -104,13 +116,13 @@
104
116
  width: 100%;
105
117
  min-height: 4px;
106
118
  border-radius: var(--radius-xs) var(--radius-xs) 2px 2px;
107
- background: linear-gradient(180deg, var(--accent) 0%, rgba(99,102,241,0.4) 100%);
119
+ background: linear-gradient(180deg, var(--accent) 0%, rgba(59,130,246,0.4) 100%);
108
120
  transform-origin: bottom;
109
121
  animation: heightGrow 0.9s var(--ease-out) both;
110
122
  transition: background var(--duration-fast);
111
123
  }
112
124
  .activity-bar:hover {
113
- background: linear-gradient(180deg, var(--accent-hover) 0%, rgba(129,140,248,0.5) 100%);
125
+ background: linear-gradient(180deg, var(--accent-hover) 0%, rgba(96,165,250,0.5) 100%);
114
126
  }
115
127
 
116
128
  .activity-bar-label {
@@ -129,7 +141,7 @@
129
141
 
130
142
  .donut-track {
131
143
  fill: none;
132
- stroke: var(--surface-3);
144
+ stroke: rgba(255,255,255,0.06);
133
145
  stroke-width: 12;
134
146
  }
135
147
 
@@ -275,8 +287,10 @@
275
287
  }
276
288
 
277
289
  .health-card {
278
- background: var(--surface-3);
279
- border: 1px solid var(--border);
290
+ background: var(--glass-bg-subtle);
291
+ backdrop-filter: blur(var(--glass-blur-sm));
292
+ -webkit-backdrop-filter: blur(var(--glass-blur-sm));
293
+ border: 1px solid var(--glass-border);
280
294
  border-radius: var(--radius-md);
281
295
  padding: var(--space-4);
282
296
  display: flex;
@@ -325,3 +339,87 @@
325
339
  z-index: var(--z-panel);
326
340
  }
327
341
  .chart-tooltip.is-visible { opacity: 1; }
342
+
343
+ /* ───────────────────────────────────
344
+ PERIOD SELECTOR
345
+ ─────────────────────────────────── */
346
+ .period-selector {
347
+ display: flex;
348
+ gap: var(--space-1);
349
+ background: var(--surface-3);
350
+ border-radius: var(--radius-full);
351
+ padding: 2px;
352
+ border: 1px solid var(--border);
353
+ }
354
+ .period-btn {
355
+ padding: 0.3rem 0.85rem;
356
+ font-size: var(--text-xs);
357
+ font-weight: 600;
358
+ border-radius: var(--radius-full);
359
+ color: var(--text-secondary);
360
+ transition:
361
+ background var(--duration-fast) var(--ease-out),
362
+ color var(--duration-fast) var(--ease-out);
363
+ }
364
+ .period-btn:hover {
365
+ color: var(--text-primary);
366
+ background: var(--surface-4);
367
+ }
368
+ .period-btn.is-active {
369
+ background: var(--accent);
370
+ color: white;
371
+ box-shadow: var(--shadow-sm);
372
+ }
373
+
374
+ /* ───────────────────────────────────
375
+ LINE / AREA CHART SVG
376
+ ─────────────────────────────────── */
377
+ .line-chart-container {
378
+ position: relative;
379
+ overflow: visible;
380
+ }
381
+ .line-chart-container svg {
382
+ display: block;
383
+ overflow: visible;
384
+ }
385
+
386
+ /* ───────────────────────────────────
387
+ HEATMAP CHART
388
+ ─────────────────────────────────── */
389
+ .heatmap-container {
390
+ overflow-x: auto;
391
+ scrollbar-width: thin;
392
+ scrollbar-color: var(--surface-3) transparent;
393
+ }
394
+ .heatmap-container svg {
395
+ display: block;
396
+ }
397
+ .heatmap-label {
398
+ font-family: var(--font-mono);
399
+ font-size: 10px;
400
+ fill: var(--text-muted);
401
+ }
402
+
403
+ /* ───────────────────────────────────
404
+ DEPENDENCY GRAPH
405
+ ─────────────────────────────────── */
406
+ .dep-graph-container {
407
+ overflow-x: auto;
408
+ padding: var(--space-3) 0;
409
+ }
410
+ .dep-graph-container svg {
411
+ display: block;
412
+ }
413
+
414
+ /* ───────────────────────────────────
415
+ CHART WRAPPER (responsive)
416
+ ─────────────────────────────────── */
417
+ .chart-wrapper {
418
+ position: relative;
419
+ width: 100%;
420
+ min-height: 200px;
421
+ }
422
+ .chart-wrapper svg {
423
+ width: 100%;
424
+ height: auto;
425
+ }