trackops 2.0.4 → 2.0.6

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 (92) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +660 -575
  3. package/bin/trackops.js +127 -106
  4. package/lib/cli-format.js +118 -0
  5. package/lib/config.js +352 -326
  6. package/lib/control.js +408 -246
  7. package/lib/env.js +234 -222
  8. package/lib/i18n.js +5 -4
  9. package/lib/init.js +390 -282
  10. package/lib/locale.js +41 -41
  11. package/lib/opera-bootstrap.js +1066 -880
  12. package/lib/opera.js +615 -444
  13. package/lib/preferences.js +74 -74
  14. package/lib/registry.js +214 -214
  15. package/lib/release.js +56 -56
  16. package/lib/runtime-state.js +144 -144
  17. package/lib/skills.js +114 -89
  18. package/lib/workspace.js +259 -248
  19. package/locales/en.json +311 -167
  20. package/locales/es.json +314 -170
  21. package/package.json +61 -58
  22. package/scripts/postinstall-locale.js +21 -21
  23. package/scripts/skills-marketplace-smoke.js +124 -124
  24. package/scripts/smoke-tests.js +563 -517
  25. package/scripts/sync-skill-version.js +21 -21
  26. package/scripts/validate-skill.js +103 -103
  27. package/skills/trackops/SKILL.md +126 -122
  28. package/skills/trackops/agents/openai.yaml +7 -7
  29. package/skills/trackops/locales/en/SKILL.md +126 -122
  30. package/skills/trackops/locales/en/references/activation.md +94 -90
  31. package/skills/trackops/locales/en/references/troubleshooting.md +73 -67
  32. package/skills/trackops/locales/en/references/workflow.md +55 -32
  33. package/skills/trackops/references/activation.md +94 -90
  34. package/skills/trackops/references/troubleshooting.md +73 -67
  35. package/skills/trackops/references/workflow.md +55 -32
  36. package/skills/trackops/skill.json +29 -29
  37. package/templates/hooks/post-checkout +2 -2
  38. package/templates/hooks/post-commit +2 -2
  39. package/templates/hooks/post-merge +2 -2
  40. package/templates/opera/agent.md +28 -27
  41. package/templates/opera/architecture/dependency-graph.md +24 -24
  42. package/templates/opera/architecture/runtime-automation.md +24 -24
  43. package/templates/opera/architecture/runtime-operations.md +34 -34
  44. package/templates/opera/en/agent.md +22 -21
  45. package/templates/opera/en/architecture/dependency-graph.md +24 -24
  46. package/templates/opera/en/architecture/runtime-automation.md +24 -24
  47. package/templates/opera/en/architecture/runtime-operations.md +34 -34
  48. package/templates/opera/en/reviews/delivery-audit.md +18 -18
  49. package/templates/opera/en/reviews/integration-audit.md +18 -18
  50. package/templates/opera/en/router.md +24 -19
  51. package/templates/opera/references/autonomy-and-recovery.md +117 -117
  52. package/templates/opera/references/opera-cycle.md +193 -193
  53. package/templates/opera/registry.md +28 -28
  54. package/templates/opera/reviews/delivery-audit.md +18 -18
  55. package/templates/opera/reviews/integration-audit.md +18 -18
  56. package/templates/opera/router.md +54 -49
  57. package/templates/skills/changelog-updater/SKILL.md +69 -69
  58. package/templates/skills/commiter/SKILL.md +99 -99
  59. package/templates/skills/opera-contract-auditor/SKILL.md +38 -38
  60. package/templates/skills/opera-contract-auditor/locales/en/SKILL.md +38 -38
  61. package/templates/skills/opera-policy-guard/SKILL.md +26 -26
  62. package/templates/skills/opera-policy-guard/locales/en/SKILL.md +26 -26
  63. package/templates/skills/opera-skill/SKILL.md +279 -0
  64. package/templates/skills/opera-skill/locales/en/SKILL.md +279 -0
  65. package/templates/skills/opera-skill/locales/en/references/phase-dod.md +138 -0
  66. package/templates/skills/opera-skill/references/phase-dod.md +138 -0
  67. package/templates/skills/project-starter-skill/SKILL.md +150 -131
  68. package/templates/skills/project-starter-skill/locales/en/SKILL.md +143 -105
  69. package/templates/skills/project-starter-skill/references/opera-cycle.md +195 -193
  70. package/ui/css/base.css +284 -284
  71. package/ui/css/charts.css +425 -425
  72. package/ui/css/components.css +1107 -1107
  73. package/ui/css/onboarding.css +133 -133
  74. package/ui/css/terminal.css +125 -125
  75. package/ui/css/timeline.css +58 -58
  76. package/ui/css/tokens.css +284 -284
  77. package/ui/favicon.svg +5 -5
  78. package/ui/index.html +99 -99
  79. package/ui/js/charts.js +526 -526
  80. package/ui/js/console-logger.js +172 -172
  81. package/ui/js/filters.js +247 -247
  82. package/ui/js/icons.js +129 -129
  83. package/ui/js/keyboard.js +229 -229
  84. package/ui/js/router.js +142 -142
  85. package/ui/js/theme.js +100 -100
  86. package/ui/js/time-tracker.js +248 -248
  87. package/ui/js/views/dashboard.js +870 -870
  88. package/ui/js/views/flash.js +47 -47
  89. package/ui/js/views/projects.js +745 -745
  90. package/ui/js/views/scrum.js +476 -476
  91. package/ui/js/views/settings.js +331 -331
  92. package/ui/js/views/timeline.js +265 -265
package/ui/css/base.css CHANGED
@@ -1,284 +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: 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
- }
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
+ }