trackops 1.0.0 → 1.1.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 (72) hide show
  1. package/README.md +341 -232
  2. package/bin/trackops.js +102 -70
  3. package/lib/config.js +260 -35
  4. package/lib/control.js +518 -475
  5. package/lib/env.js +227 -0
  6. package/lib/i18n.js +61 -53
  7. package/lib/init.js +146 -55
  8. package/lib/locale.js +63 -0
  9. package/lib/opera-bootstrap.js +523 -0
  10. package/lib/opera.js +319 -170
  11. package/lib/registry.js +27 -13
  12. package/lib/release.js +56 -0
  13. package/lib/resources.js +42 -0
  14. package/lib/server.js +912 -418
  15. package/lib/skills.js +148 -124
  16. package/lib/workspace.js +260 -0
  17. package/locales/en.json +331 -139
  18. package/locales/es.json +331 -139
  19. package/package.json +14 -3
  20. package/scripts/skills-marketplace-smoke.js +124 -0
  21. package/scripts/smoke-tests.js +445 -0
  22. package/scripts/sync-skill-version.js +21 -0
  23. package/scripts/validate-skill.js +88 -0
  24. package/skills/trackops/SKILL.md +64 -0
  25. package/skills/trackops/agents/openai.yaml +3 -0
  26. package/skills/trackops/references/activation.md +39 -0
  27. package/skills/trackops/references/troubleshooting.md +34 -0
  28. package/skills/trackops/references/workflow.md +20 -0
  29. package/skills/trackops/scripts/bootstrap-trackops.js +201 -0
  30. package/skills/trackops/skill.json +29 -0
  31. package/templates/etapa/agent.md +2 -2
  32. package/templates/etapa/references/etapa-cycle.md +1 -1
  33. package/templates/opera/agent.md +1 -1
  34. package/templates/opera/en/agent.md +26 -0
  35. package/templates/opera/en/genesis.md +79 -0
  36. package/templates/opera/en/references/autonomy-and-recovery.md +23 -0
  37. package/templates/opera/en/references/opera-cycle.md +62 -0
  38. package/templates/opera/en/registry.md +28 -0
  39. package/templates/opera/en/router.md +39 -0
  40. package/templates/opera/genesis.md +79 -94
  41. package/templates/skills/changelog-updater/locales/en/SKILL.md +11 -0
  42. package/templates/skills/commiter/locales/en/SKILL.md +11 -0
  43. package/templates/skills/project-starter-skill/SKILL.md +5 -3
  44. package/templates/skills/project-starter-skill/locales/en/SKILL.md +24 -0
  45. package/ui/css/base.css +266 -0
  46. package/ui/css/charts.css +327 -0
  47. package/ui/css/components.css +570 -0
  48. package/ui/css/panels.css +956 -0
  49. package/ui/css/tokens.css +227 -0
  50. package/ui/favicon.svg +5 -0
  51. package/ui/index.html +91 -351
  52. package/ui/js/api.js +220 -0
  53. package/ui/js/app.js +200 -0
  54. package/ui/js/console-logger.js +172 -0
  55. package/ui/js/i18n.js +14 -0
  56. package/ui/js/icons.js +104 -0
  57. package/ui/js/onboarding.js +439 -0
  58. package/ui/js/router.js +125 -0
  59. package/ui/js/state.js +130 -0
  60. package/ui/js/theme.js +100 -0
  61. package/ui/js/time-tracker.js +248 -0
  62. package/ui/js/utils.js +175 -0
  63. package/ui/js/views/board.js +255 -0
  64. package/ui/js/views/execution.js +256 -0
  65. package/ui/js/views/flash.js +47 -0
  66. package/ui/js/views/insights.js +340 -0
  67. package/ui/js/views/overview.js +365 -0
  68. package/ui/js/views/settings.js +381 -0
  69. package/ui/js/views/sidebar.js +131 -0
  70. package/ui/js/views/skills.js +163 -0
  71. package/ui/js/views/tasks.js +406 -0
  72. package/ui/js/views/topbar.js +239 -0
@@ -0,0 +1,327 @@
1
+ /* ═══════════════════════════════════════════════════════
2
+ CHARTS — Gráficas SVG custom, bar charts, donut
3
+ ═══════════════════════════════════════════════════════ */
4
+
5
+ /* ───────────────────────────────────
6
+ CHART CARD CONTAINER
7
+ ─────────────────────────────────── */
8
+ .chart-card {
9
+ background: var(--surface-2);
10
+ border: 1px solid var(--border);
11
+ border-radius: var(--radius-xl);
12
+ padding: var(--space-5);
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: var(--space-4);
16
+ }
17
+
18
+ .chart-title {
19
+ font-size: var(--text-sm);
20
+ font-weight: 700;
21
+ color: var(--text-primary);
22
+ margin: 0;
23
+ }
24
+ .chart-subtitle {
25
+ font-size: var(--text-xs);
26
+ color: var(--text-muted);
27
+ }
28
+
29
+ /* ───────────────────────────────────
30
+ BAR CHARTS HORIZONTALES
31
+ ─────────────────────────────────── */
32
+ .bar-chart {
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: var(--space-3);
36
+ }
37
+
38
+ .bar-row {
39
+ display: grid;
40
+ grid-template-columns: 110px 1fr 36px;
41
+ align-items: center;
42
+ gap: var(--space-3);
43
+ }
44
+
45
+ .bar-label {
46
+ font-size: var(--text-xs);
47
+ font-weight: 600;
48
+ color: var(--text-secondary);
49
+ white-space: nowrap;
50
+ overflow: hidden;
51
+ text-overflow: ellipsis;
52
+ }
53
+
54
+ .bar-track {
55
+ height: 8px;
56
+ background: var(--surface-3);
57
+ border-radius: var(--radius-full);
58
+ overflow: hidden;
59
+ position: relative;
60
+ }
61
+
62
+ .bar-fill {
63
+ height: 100%;
64
+ border-radius: var(--radius-full);
65
+ background: linear-gradient(90deg, var(--accent), #818CF8);
66
+ transform-origin: left;
67
+ animation: barGrow 0.8s var(--ease-out) both;
68
+ }
69
+
70
+ .bar-fill.fill-success { background: linear-gradient(90deg, var(--success), #34D399); }
71
+ .bar-fill.fill-warning { background: linear-gradient(90deg, var(--warning), #FCD34D); }
72
+ .bar-fill.fill-danger { background: linear-gradient(90deg, var(--danger), #F87171); }
73
+ .bar-fill.fill-info { background: linear-gradient(90deg, var(--info), #60A5FA); }
74
+
75
+ .bar-value {
76
+ font-size: var(--text-xs);
77
+ font-weight: 700;
78
+ color: var(--text-secondary);
79
+ text-align: right;
80
+ font-family: var(--font-mono);
81
+ }
82
+
83
+ /* ───────────────────────────────────
84
+ ACTIVIDAD VERTICAL (barras semanales)
85
+ ─────────────────────────────────── */
86
+ .activity-chart {
87
+ display: flex;
88
+ align-items: flex-end;
89
+ gap: var(--space-2);
90
+ height: 120px;
91
+ }
92
+
93
+ .activity-bar-col {
94
+ flex: 1;
95
+ display: flex;
96
+ flex-direction: column;
97
+ align-items: center;
98
+ justify-content: flex-end;
99
+ gap: var(--space-1);
100
+ height: 100%;
101
+ }
102
+
103
+ .activity-bar {
104
+ width: 100%;
105
+ min-height: 4px;
106
+ 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%);
108
+ transform-origin: bottom;
109
+ animation: heightGrow 0.9s var(--ease-out) both;
110
+ transition: background var(--duration-fast);
111
+ }
112
+ .activity-bar:hover {
113
+ background: linear-gradient(180deg, var(--accent-hover) 0%, rgba(129,140,248,0.5) 100%);
114
+ }
115
+
116
+ .activity-bar-label {
117
+ font-size: 0.65rem;
118
+ font-family: var(--font-mono);
119
+ color: var(--text-muted);
120
+ text-align: center;
121
+ }
122
+
123
+ /* ───────────────────────────────────
124
+ DONUT CHART SVG
125
+ ─────────────────────────────────── */
126
+ .donut-svg {
127
+ overflow: visible;
128
+ }
129
+
130
+ .donut-track {
131
+ fill: none;
132
+ stroke: var(--surface-3);
133
+ stroke-width: 12;
134
+ }
135
+
136
+ .donut-arc {
137
+ fill: none;
138
+ stroke-width: 12;
139
+ stroke-linecap: round;
140
+ stroke-dashoffset: 0;
141
+ transform-origin: center;
142
+ transform: rotate(-90deg);
143
+ transition: stroke-dasharray 1.2s var(--ease-out);
144
+ }
145
+
146
+ .donut-arc.arc-completed { stroke: var(--success); }
147
+ .donut-arc.arc-progress { stroke: var(--accent); }
148
+ .donut-arc.arc-blocked { stroke: var(--danger); }
149
+ .donut-arc.arc-review { stroke: var(--warning); }
150
+
151
+ /* ───────────────────────────────────
152
+ PHASE PROGRESS BARS
153
+ ─────────────────────────────────── */
154
+ .phase-chart {
155
+ display: flex;
156
+ flex-direction: column;
157
+ gap: var(--space-4);
158
+ }
159
+
160
+ .phase-row {
161
+ display: flex;
162
+ flex-direction: column;
163
+ gap: var(--space-2);
164
+ }
165
+
166
+ .phase-row-header {
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: space-between;
170
+ }
171
+
172
+ .phase-name {
173
+ font-size: var(--text-xs);
174
+ font-weight: 700;
175
+ color: var(--text-secondary);
176
+ }
177
+
178
+ .phase-progress {
179
+ font-size: var(--text-xs);
180
+ font-family: var(--font-mono);
181
+ color: var(--text-muted);
182
+ }
183
+
184
+ .phase-track {
185
+ height: 6px;
186
+ background: var(--surface-3);
187
+ border-radius: var(--radius-full);
188
+ overflow: hidden;
189
+ }
190
+
191
+ .phase-fill {
192
+ height: 100%;
193
+ border-radius: var(--radius-full);
194
+ transform-origin: left;
195
+ animation: barGrow 1s var(--ease-out) both;
196
+ }
197
+
198
+ .phase-fill.done { background: var(--success); }
199
+ .phase-fill.active { background: linear-gradient(90deg, var(--accent) 0%, var(--accent-hover) 100%); }
200
+ .phase-fill.partial { background: var(--warning); }
201
+
202
+ /* ───────────────────────────────────
203
+ MINI SPARKLINE (para KPI cards)
204
+ ─────────────────────────────────── */
205
+ .sparkline-svg {
206
+ width: 100%;
207
+ height: 40px;
208
+ overflow: visible;
209
+ }
210
+
211
+ .sparkline-path {
212
+ fill: none;
213
+ stroke: var(--accent);
214
+ stroke-width: 2;
215
+ stroke-linecap: round;
216
+ stroke-linejoin: round;
217
+ }
218
+
219
+ .sparkline-area {
220
+ fill: url(#sparkGrad);
221
+ opacity: 0.3;
222
+ }
223
+
224
+ /* ───────────────────────────────────
225
+ TIME ENTRIES TIMELINE (mini)
226
+ ─────────────────────────────────── */
227
+ .time-entries {
228
+ display: flex;
229
+ flex-direction: column;
230
+ gap: var(--space-2);
231
+ }
232
+
233
+ .time-entry {
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: space-between;
237
+ gap: var(--space-3);
238
+ padding: var(--space-2) var(--space-3);
239
+ border-radius: var(--radius-md);
240
+ background: var(--surface-3);
241
+ border: 1px solid var(--border);
242
+ font-size: var(--text-xs);
243
+ }
244
+
245
+ .time-entry-task {
246
+ flex: 1;
247
+ min-width: 0;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ white-space: nowrap;
251
+ color: var(--text-secondary);
252
+ font-weight: 600;
253
+ }
254
+
255
+ .time-entry-duration {
256
+ font-family: var(--font-mono);
257
+ font-weight: 700;
258
+ color: var(--text-primary);
259
+ white-space: nowrap;
260
+ }
261
+
262
+ .time-entry-date {
263
+ color: var(--text-muted);
264
+ font-family: var(--font-mono);
265
+ white-space: nowrap;
266
+ }
267
+
268
+ /* ───────────────────────────────────
269
+ HEALTH RAIL (KPI health)
270
+ ─────────────────────────────────── */
271
+ .health-grid {
272
+ display: grid;
273
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
274
+ gap: var(--space-3);
275
+ }
276
+
277
+ .health-card {
278
+ background: var(--surface-3);
279
+ border: 1px solid var(--border);
280
+ border-radius: var(--radius-md);
281
+ padding: var(--space-4);
282
+ display: flex;
283
+ flex-direction: column;
284
+ gap: var(--space-2);
285
+ }
286
+
287
+ .health-card-label {
288
+ font-size: var(--text-xs);
289
+ font-weight: 700;
290
+ letter-spacing: 0.06em;
291
+ text-transform: uppercase;
292
+ color: var(--text-muted);
293
+ }
294
+
295
+ .health-card-value {
296
+ font-family: var(--font-heading);
297
+ font-size: var(--text-2xl);
298
+ font-weight: 800;
299
+ letter-spacing: -0.04em;
300
+ line-height: 1;
301
+ color: var(--text-primary);
302
+ }
303
+
304
+ .health-card-value.good { color: var(--success); }
305
+ .health-card-value.warn { color: var(--warning); }
306
+ .health-card-value.bad { color: var(--danger); }
307
+
308
+ /* ───────────────────────────────────
309
+ CHART TOOLTIP
310
+ ─────────────────────────────────── */
311
+ .chart-tooltip {
312
+ position: absolute;
313
+ background: var(--surface-2);
314
+ border: 1px solid var(--border-strong);
315
+ border-radius: var(--radius-md);
316
+ padding: var(--space-2) var(--space-3);
317
+ font-size: var(--text-xs);
318
+ font-weight: 600;
319
+ color: var(--text-primary);
320
+ pointer-events: none;
321
+ white-space: nowrap;
322
+ box-shadow: var(--shadow-md);
323
+ opacity: 0;
324
+ transition: opacity var(--duration-fast);
325
+ z-index: var(--z-panel);
326
+ }
327
+ .chart-tooltip.is-visible { opacity: 1; }