trackops 2.0.3 → 2.0.5

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 (103) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +695 -402
  3. package/bin/trackops.js +116 -116
  4. package/lib/config.js +326 -326
  5. package/lib/control.js +208 -208
  6. package/lib/env.js +244 -244
  7. package/lib/init.js +325 -325
  8. package/lib/locale.js +24 -0
  9. package/lib/opera-bootstrap.js +941 -874
  10. package/lib/opera.js +494 -477
  11. package/lib/preferences.js +74 -74
  12. package/lib/registry.js +214 -196
  13. package/lib/release.js +56 -56
  14. package/lib/runtime-state.js +144 -144
  15. package/lib/server.js +312 -207
  16. package/lib/skills.js +74 -57
  17. package/lib/workspace.js +260 -260
  18. package/locales/en.json +192 -166
  19. package/locales/es.json +192 -166
  20. package/package.json +61 -58
  21. package/scripts/postinstall-locale.js +21 -21
  22. package/scripts/skills-marketplace-smoke.js +124 -124
  23. package/scripts/smoke-tests.js +558 -554
  24. package/scripts/sync-skill-version.js +21 -21
  25. package/scripts/validate-skill.js +103 -103
  26. package/skills/trackops/SKILL.md +126 -122
  27. package/skills/trackops/agents/openai.yaml +7 -7
  28. package/skills/trackops/locales/en/SKILL.md +126 -122
  29. package/skills/trackops/locales/en/references/activation.md +94 -75
  30. package/skills/trackops/locales/en/references/troubleshooting.md +73 -55
  31. package/skills/trackops/locales/en/references/workflow.md +55 -32
  32. package/skills/trackops/references/activation.md +94 -75
  33. package/skills/trackops/references/troubleshooting.md +73 -55
  34. package/skills/trackops/references/workflow.md +55 -32
  35. package/skills/trackops/skill.json +29 -29
  36. package/templates/hooks/post-checkout +2 -2
  37. package/templates/hooks/post-commit +2 -2
  38. package/templates/hooks/post-merge +2 -2
  39. package/templates/opera/agent.md +28 -27
  40. package/templates/opera/architecture/dependency-graph.md +24 -24
  41. package/templates/opera/architecture/runtime-automation.md +24 -24
  42. package/templates/opera/architecture/runtime-operations.md +34 -34
  43. package/templates/opera/en/agent.md +22 -21
  44. package/templates/opera/en/architecture/dependency-graph.md +24 -24
  45. package/templates/opera/en/architecture/runtime-automation.md +24 -24
  46. package/templates/opera/en/architecture/runtime-operations.md +34 -34
  47. package/templates/opera/en/reviews/delivery-audit.md +18 -18
  48. package/templates/opera/en/reviews/integration-audit.md +18 -18
  49. package/templates/opera/en/router.md +24 -19
  50. package/templates/opera/references/autonomy-and-recovery.md +117 -117
  51. package/templates/opera/references/opera-cycle.md +193 -193
  52. package/templates/opera/registry.md +28 -28
  53. package/templates/opera/reviews/delivery-audit.md +18 -18
  54. package/templates/opera/reviews/integration-audit.md +18 -18
  55. package/templates/opera/router.md +54 -49
  56. package/templates/skills/changelog-updater/SKILL.md +69 -69
  57. package/templates/skills/commiter/SKILL.md +99 -99
  58. package/templates/skills/opera-contract-auditor/SKILL.md +38 -38
  59. package/templates/skills/opera-contract-auditor/locales/en/SKILL.md +38 -38
  60. package/templates/skills/opera-policy-guard/SKILL.md +26 -26
  61. package/templates/skills/opera-policy-guard/locales/en/SKILL.md +26 -26
  62. package/templates/skills/opera-skill/SKILL.md +279 -0
  63. package/templates/skills/opera-skill/locales/en/SKILL.md +279 -0
  64. package/templates/skills/opera-skill/locales/en/references/phase-dod.md +138 -0
  65. package/templates/skills/opera-skill/references/phase-dod.md +138 -0
  66. package/templates/skills/project-starter-skill/SKILL.md +150 -131
  67. package/templates/skills/project-starter-skill/locales/en/SKILL.md +143 -105
  68. package/templates/skills/project-starter-skill/references/opera-cycle.md +195 -193
  69. package/ui/css/base.css +284 -266
  70. package/ui/css/charts.css +425 -327
  71. package/ui/css/components.css +1107 -570
  72. package/ui/css/onboarding.css +133 -0
  73. package/ui/css/panels.css +345 -406
  74. package/ui/css/terminal.css +125 -0
  75. package/ui/css/timeline.css +58 -0
  76. package/ui/css/tokens.css +284 -227
  77. package/ui/favicon.svg +5 -5
  78. package/ui/index.html +99 -96
  79. package/ui/js/api.js +49 -13
  80. package/ui/js/app.js +28 -32
  81. package/ui/js/charts.js +526 -0
  82. package/ui/js/console-logger.js +172 -172
  83. package/ui/js/filters.js +247 -0
  84. package/ui/js/icons.js +129 -104
  85. package/ui/js/keyboard.js +229 -0
  86. package/ui/js/onboarding.js +33 -42
  87. package/ui/js/router.js +142 -125
  88. package/ui/js/theme.js +100 -100
  89. package/ui/js/time-tracker.js +248 -248
  90. package/ui/js/views/board.js +84 -114
  91. package/ui/js/views/dashboard.js +870 -0
  92. package/ui/js/views/flash.js +47 -47
  93. package/ui/js/views/projects.js +745 -0
  94. package/ui/js/views/scrum.js +476 -0
  95. package/ui/js/views/settings.js +153 -203
  96. package/ui/js/views/sidebar.js +37 -31
  97. package/ui/js/views/tasks.js +218 -101
  98. package/ui/js/views/timeline.js +265 -0
  99. package/ui/js/views/topbar.js +94 -107
  100. package/ui/app.js +0 -950
  101. package/ui/js/views/insights.js +0 -340
  102. package/ui/js/views/overview.js +0 -369
  103. package/ui/styles.css +0 -688
package/ui/css/base.css CHANGED
@@ -1,266 +1,284 @@
1
- /* ═══════════════════════════════════════════════════════
2
- BASE — Reset + Layout + Tipografía global
3
- ═══════════════════════════════════════════════════════ */
4
-
5
- /* ── Google Fonts se cargan en index.html ── */
6
-
7
- *, *::before, *::after {
8
- box-sizing: border-box;
9
- margin: 0;
10
- padding: 0;
11
- }
12
-
13
- html {
14
- font-size: 16px;
15
- scroll-behavior: smooth;
16
- -webkit-text-size-adjust: 100%;
17
- }
18
-
19
- body {
20
- font-family: var(--font-ui);
21
- font-size: var(--text-base);
22
- color: var(--text-primary);
23
- background-color: var(--surface-0);
24
- line-height: 1.55;
25
- min-height: 100dvh;
26
- overflow-x: hidden;
27
- -webkit-font-smoothing: antialiased;
28
- -moz-osx-font-smoothing: grayscale;
29
- }
30
-
31
- /* ── Accesibilidad: Skip link ── */
32
- .skip-link {
33
- position: absolute;
34
- top: -100%;
35
- left: var(--space-4);
36
- z-index: var(--z-onboard);
37
- padding: var(--space-2) var(--space-4);
38
- background: var(--accent);
39
- color: white;
40
- font-weight: 700;
41
- font-size: var(--text-sm);
42
- border-radius: var(--radius-md);
43
- text-decoration: none;
44
- transition: top var(--duration-base) var(--ease-out);
45
- }
46
- .skip-link:focus {
47
- top: var(--space-4);
48
- }
49
-
50
- /* ── Accesibilidad: Visually hidden ── */
51
- .sr-only {
52
- position: absolute;
53
- width: 1px;
54
- height: 1px;
55
- padding: 0;
56
- margin: -1px;
57
- overflow: hidden;
58
- clip: rect(0,0,0,0);
59
- white-space: nowrap;
60
- border: 0;
61
- }
62
-
63
- /* ── Layout principal: sidebar fija + contenido ── */
64
- .app-shell {
65
- display: grid;
66
- grid-template-columns: var(--sidebar-width) 1fr;
67
- grid-template-rows: var(--topbar-height) 1fr;
68
- grid-template-areas:
69
- "sidebar topbar"
70
- "sidebar content";
71
- min-height: 100dvh;
72
- }
73
-
74
- #sidebar {
75
- grid-area: sidebar;
76
- position: fixed;
77
- top: 0;
78
- left: 0;
79
- width: var(--sidebar-width);
80
- height: 100dvh;
81
- z-index: var(--z-sidebar);
82
- overflow-y: auto;
83
- overflow-x: hidden;
84
- }
85
-
86
- #topbar {
87
- grid-area: topbar;
88
- position: sticky;
89
- top: 0;
90
- z-index: var(--z-topbar);
91
- }
92
-
93
- #view-container {
94
- grid-area: content;
95
- padding: var(--content-pad);
96
- min-height: calc(100dvh - var(--topbar-height));
97
- overflow-y: auto;
98
- }
99
-
100
- /* ── Tipografía ── */
101
- h1, h2, h3, h4, h5, h6 {
102
- font-family: var(--font-heading);
103
- font-weight: 700;
104
- line-height: 1.15;
105
- letter-spacing: -0.02em;
106
- color: var(--text-primary);
107
- }
108
-
109
- h1 { font-size: var(--text-3xl); }
110
- h2 { font-size: var(--text-2xl); }
111
- h3 { font-size: var(--text-xl); }
112
- h4 { font-size: var(--text-lg); }
113
- h5 { font-size: var(--text-md); }
114
- h6 { font-size: var(--text-base); }
115
-
116
- p { margin: 0; }
117
-
118
- code, pre, .mono {
119
- font-family: var(--font-mono);
120
- }
121
-
122
- a {
123
- color: var(--accent);
124
- text-decoration: none;
125
- transition: color var(--duration-fast) var(--ease-out);
126
- }
127
- a:hover { color: var(--accent-hover); }
128
-
129
- button, input, textarea, select {
130
- font: inherit;
131
- color: inherit;
132
- }
133
- button { cursor: pointer; border: none; background: none; }
134
-
135
- img, svg { display: block; max-width: 100%; }
136
-
137
- ul, ol { list-style: none; }
138
-
139
- /* ── Scrollbars personalizadas (idénticas a la web) ── */
140
- ::-webkit-scrollbar { width: 5px; height: 5px; }
141
- ::-webkit-scrollbar-track { background: var(--surface-1); }
142
- ::-webkit-scrollbar-thumb { background: var(--surface-3); border-radius: var(--radius-full); }
143
- ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
144
-
145
- /* ── Focus outline accesible ── */
146
- :focus-visible {
147
- outline: 2px solid var(--accent);
148
- outline-offset: 2px;
149
- border-radius: var(--radius-xs);
150
- }
151
-
152
- /* ── Selección de texto ── */
153
- ::selection {
154
- background: var(--accent);
155
- color: white;
156
- }
157
-
158
- /* ── Animaciones de entrada ── */
159
- @keyframes fadeInUp {
160
- from { opacity: 0; transform: translateY(12px); }
161
- to { opacity: 1; transform: translateY(0); }
162
- }
163
-
164
- @keyframes fadeIn {
165
- from { opacity: 0; }
166
- to { opacity: 1; }
167
- }
168
-
169
- @keyframes pulse {
170
- 0%, 100% { opacity: 1; }
171
- 50% { opacity: 0.5; }
172
- }
173
-
174
- @keyframes spin {
175
- to { transform: rotate(360deg); }
176
- }
177
-
178
- @keyframes slideInRight {
179
- from { opacity: 0; transform: translateX(20px); }
180
- to { opacity: 1; transform: translateX(0); }
181
- }
182
-
183
- @keyframes slideInLeft {
184
- from { opacity: 0; transform: translateX(-20px); }
185
- to { opacity: 1; transform: translateX(0); }
186
- }
187
-
188
- @keyframes dash {
189
- to { stroke-dashoffset: 0; }
190
- }
191
-
192
- @keyframes barGrow {
193
- from { transform: scaleX(0); }
194
- to { transform: scaleX(1); }
195
- }
196
-
197
- @keyframes heightGrow {
198
- from { transform: scaleY(0); }
199
- to { transform: scaleY(1); }
200
- }
201
-
202
- /* ── Clases de utilidad ── */
203
- .view-enter { animation: fadeInUp var(--duration-slow) var(--ease-out) both; }
204
- .stagger-1 { animation-delay: 0.05s; }
205
- .stagger-2 { animation-delay: 0.10s; }
206
- .stagger-3 { animation-delay: 0.15s; }
207
- .stagger-4 { animation-delay: 0.20s; }
208
- .stagger-5 { animation-delay: 0.25s; }
209
-
210
- .truncate {
211
- overflow: hidden;
212
- text-overflow: ellipsis;
213
- white-space: nowrap;
214
- }
215
-
216
- .eyebrow {
217
- font-size: var(--text-xs);
218
- font-weight: 700;
219
- letter-spacing: 0.12em;
220
- text-transform: uppercase;
221
- color: var(--accent);
222
- }
223
-
224
- .label-sm {
225
- font-size: var(--text-xs);
226
- font-weight: 600;
227
- letter-spacing: 0.06em;
228
- text-transform: uppercase;
229
- color: var(--text-muted);
230
- }
231
-
232
- .text-muted { color: var(--text-muted); }
233
- .text-second { color: var(--text-secondary); }
234
- .text-accent { color: var(--accent); }
235
- .text-success { color: var(--success); }
236
- .text-warning { color: var(--warning); }
237
- .text-danger { color: var(--danger); }
238
-
239
- /* ── Responsive: sidebar colapsable en pantallas menores a 1024px ── */
240
- @media (max-width: 1024px) {
241
- .app-shell {
242
- grid-template-columns: 1fr;
243
- grid-template-areas:
244
- "topbar"
245
- "content";
246
- }
247
- #sidebar {
248
- transform: translateX(-100%);
249
- transition: transform var(--duration-slow) var(--ease-out);
250
- }
251
- #sidebar.is-open {
252
- transform: translateX(0);
253
- box-shadow: var(--shadow-xl);
254
- }
255
- #view-container {
256
- padding: var(--space-4);
257
- }
258
- }
259
-
260
- /* ── Divider ── */
261
- .divider {
262
- height: 1px;
263
- background: var(--border);
264
- border: none;
265
- margin: var(--space-4) 0;
266
- }
1
+ /* ═══════════════════════════════════════════════════════
2
+ BASE — Reset + Layout + Tipografía global
3
+ ═══════════════════════════════════════════════════════ */
4
+
5
+ /* ── Google Fonts se cargan en index.html ── */
6
+
7
+ *, *::before, *::after {
8
+ box-sizing: border-box;
9
+ margin: 0;
10
+ padding: 0;
11
+ }
12
+
13
+ html {
14
+ font-size: 16px;
15
+ scroll-behavior: smooth;
16
+ -webkit-text-size-adjust: 100%;
17
+ }
18
+
19
+ body {
20
+ font-family: var(--font-ui);
21
+ font-size: var(--text-base);
22
+ color: var(--text-primary);
23
+ background: var(--bg-gradient);
24
+ background-attachment: fixed;
25
+ line-height: 1.55;
26
+ min-height: 100dvh;
27
+ overflow-x: hidden;
28
+ -webkit-font-smoothing: antialiased;
29
+ -moz-osx-font-smoothing: grayscale;
30
+ }
31
+
32
+ /* ── Accesibilidad: Skip link ── */
33
+ .skip-link {
34
+ position: absolute;
35
+ top: -100%;
36
+ left: var(--space-4);
37
+ z-index: var(--z-onboard);
38
+ padding: var(--space-2) var(--space-4);
39
+ background: var(--accent);
40
+ color: white;
41
+ font-weight: 700;
42
+ font-size: var(--text-sm);
43
+ border-radius: var(--radius-md);
44
+ text-decoration: none;
45
+ transition: top var(--duration-base) var(--ease-out);
46
+ }
47
+ .skip-link:focus {
48
+ top: var(--space-4);
49
+ }
50
+
51
+ /* ── Accesibilidad: Visually hidden ── */
52
+ .sr-only {
53
+ position: absolute;
54
+ width: 1px;
55
+ height: 1px;
56
+ padding: 0;
57
+ margin: -1px;
58
+ overflow: hidden;
59
+ clip: rect(0,0,0,0);
60
+ white-space: nowrap;
61
+ border: 0;
62
+ }
63
+
64
+ /* ── Layout principal: sidebar fija + contenido ── */
65
+ .app-shell {
66
+ display: grid;
67
+ grid-template-columns: var(--sidebar-width) 1fr;
68
+ grid-template-rows: var(--topbar-height) 1fr;
69
+ grid-template-areas:
70
+ "sidebar topbar"
71
+ "sidebar content";
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;
79
+ }
80
+
81
+ #sidebar {
82
+ grid-area: sidebar;
83
+ position: fixed;
84
+ top: 0;
85
+ left: 0;
86
+ width: var(--sidebar-width);
87
+ height: 100dvh;
88
+ z-index: var(--z-sidebar);
89
+ overflow-y: auto;
90
+ overflow-x: hidden;
91
+ }
92
+
93
+ #topbar {
94
+ grid-area: topbar;
95
+ position: sticky;
96
+ top: 0;
97
+ z-index: var(--z-topbar);
98
+ }
99
+
100
+ #view-container {
101
+ grid-area: content;
102
+ padding: var(--content-pad);
103
+ min-height: calc(100dvh - var(--topbar-height));
104
+ overflow-y: auto;
105
+ scroll-behavior: smooth;
106
+ }
107
+
108
+ /* ── Tipografía ── */
109
+ h1, h2, h3, h4, h5, h6 {
110
+ font-family: var(--font-heading);
111
+ font-weight: 700;
112
+ line-height: 1.15;
113
+ letter-spacing: -0.02em;
114
+ color: var(--text-primary);
115
+ }
116
+
117
+ h1 { font-size: var(--text-3xl); }
118
+ h2 { font-size: var(--text-2xl); }
119
+ h3 { font-size: var(--text-xl); }
120
+ h4 { font-size: var(--text-lg); }
121
+ h5 { font-size: var(--text-md); }
122
+ h6 { font-size: var(--text-base); }
123
+
124
+ p { margin: 0; }
125
+
126
+ code, pre, .mono {
127
+ font-family: var(--font-mono);
128
+ }
129
+
130
+ a {
131
+ color: var(--accent);
132
+ text-decoration: none;
133
+ transition: color var(--duration-fast) var(--ease-out);
134
+ }
135
+ a:hover { color: var(--accent-hover); }
136
+
137
+ button, input, textarea, select {
138
+ font: inherit;
139
+ color: inherit;
140
+ }
141
+ button { cursor: pointer; border: none; background: none; }
142
+
143
+ img, svg { display: block; max-width: 100%; }
144
+
145
+ ul, ol { list-style: none; }
146
+
147
+ /* ── Scrollbars personalizadas (idénticas a la web) ── */
148
+ ::-webkit-scrollbar { width: 5px; height: 5px; }
149
+ ::-webkit-scrollbar-track { background: var(--surface-1); }
150
+ ::-webkit-scrollbar-thumb { background: var(--surface-3); border-radius: var(--radius-full); }
151
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
152
+
153
+ /* ── Focus outline accesible ── */
154
+ :focus-visible {
155
+ outline: 2px solid var(--accent);
156
+ outline-offset: 2px;
157
+ border-radius: var(--radius-xs);
158
+ }
159
+
160
+ /* ── Selección de texto ── */
161
+ ::selection {
162
+ background: var(--accent);
163
+ color: white;
164
+ }
165
+
166
+ /* ── Animaciones de entrada ── */
167
+ @keyframes fadeInUp {
168
+ from { opacity: 0; transform: translateY(12px); }
169
+ to { opacity: 1; transform: translateY(0); }
170
+ }
171
+
172
+ @keyframes fadeIn {
173
+ from { opacity: 0; }
174
+ to { opacity: 1; }
175
+ }
176
+
177
+ @keyframes pulse {
178
+ 0%, 100% { opacity: 1; }
179
+ 50% { opacity: 0.5; }
180
+ }
181
+
182
+ @keyframes spin {
183
+ to { transform: rotate(360deg); }
184
+ }
185
+
186
+ @keyframes slideInRight {
187
+ from { opacity: 0; transform: translateX(20px); }
188
+ to { opacity: 1; transform: translateX(0); }
189
+ }
190
+
191
+ @keyframes slideInLeft {
192
+ from { opacity: 0; transform: translateX(-20px); }
193
+ to { opacity: 1; transform: translateX(0); }
194
+ }
195
+
196
+ @keyframes dash {
197
+ to { stroke-dashoffset: 0; }
198
+ }
199
+
200
+ @keyframes barGrow {
201
+ from { transform: scaleX(0); }
202
+ to { transform: scaleX(1); }
203
+ }
204
+
205
+ @keyframes heightGrow {
206
+ from { transform: scaleY(0); }
207
+ to { transform: scaleY(1); }
208
+ }
209
+
210
+ /* ── Clases de utilidad ── */
211
+ .view-enter { animation: fadeInUp var(--duration-slow) var(--ease-out) both; }
212
+ .stagger-1 { animation-delay: 0.05s; }
213
+ .stagger-2 { animation-delay: 0.10s; }
214
+ .stagger-3 { animation-delay: 0.15s; }
215
+ .stagger-4 { animation-delay: 0.20s; }
216
+ .stagger-5 { animation-delay: 0.25s; }
217
+
218
+ .truncate {
219
+ overflow: hidden;
220
+ text-overflow: ellipsis;
221
+ white-space: nowrap;
222
+ }
223
+
224
+ .eyebrow {
225
+ font-size: var(--text-xs);
226
+ font-weight: 700;
227
+ letter-spacing: 0.12em;
228
+ text-transform: uppercase;
229
+ color: var(--accent);
230
+ }
231
+
232
+ .label-sm {
233
+ font-size: var(--text-xs);
234
+ font-weight: 600;
235
+ letter-spacing: 0.06em;
236
+ text-transform: uppercase;
237
+ color: var(--text-muted);
238
+ }
239
+
240
+ .text-muted { color: var(--text-muted); }
241
+ .text-second { color: var(--text-secondary); }
242
+ .text-accent { color: var(--accent); }
243
+ .text-success { color: var(--success); }
244
+ .text-warning { color: var(--warning); }
245
+ .text-danger { color: var(--danger); }
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
+
257
+ /* ── Responsive: sidebar colapsable en pantallas menores a 1024px ── */
258
+ @media (max-width: 1024px) {
259
+ .app-shell {
260
+ grid-template-columns: 1fr;
261
+ grid-template-areas:
262
+ "topbar"
263
+ "content";
264
+ }
265
+ #sidebar {
266
+ transform: translateX(-100%);
267
+ transition: transform var(--duration-slow) var(--ease-out);
268
+ }
269
+ #sidebar.is-open {
270
+ transform: translateX(0);
271
+ box-shadow: var(--shadow-xl);
272
+ }
273
+ #view-container {
274
+ padding: var(--space-4);
275
+ }
276
+ }
277
+
278
+ /* ── Divider ── */
279
+ .divider {
280
+ height: 1px;
281
+ background: var(--border);
282
+ border: none;
283
+ margin: var(--space-4) 0;
284
+ }