oxe-cc 1.11.0 → 1.14.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.
@@ -0,0 +1,1172 @@
1
+ <!doctype html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Mapa Interativo dos Artefatos OXE Build</title>
7
+ <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='6' fill='%232d7ff9'/%3E%3Ctext x='16' y='20' text-anchor='middle' font-family='Arial' font-size='10' font-weight='700' fill='white'%3EOXE%3C/text%3E%3C/svg%3E">
8
+ <style>
9
+ :root {
10
+ color-scheme: dark;
11
+ --bg: #0d141c;
12
+ --panel: #111b25;
13
+ --panel-2: #142231;
14
+ --line: #42556b;
15
+ --text: #e6edf5;
16
+ --muted: #8ea0b5;
17
+ --blue: #2d7ff9;
18
+ --cyan: #22b7d8;
19
+ --green: #21a979;
20
+ --orange: #f08b24;
21
+ --red: #df5b57;
22
+ --violet: #8757d9;
23
+ --yellow: #d5b243;
24
+ --shadow: 0 18px 52px rgba(0, 0, 0, .34);
25
+ }
26
+
27
+ * { box-sizing: border-box; }
28
+
29
+ body {
30
+ margin: 0;
31
+ min-height: 100vh;
32
+ overflow: hidden;
33
+ font-family: Inter, "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
34
+ color: var(--text);
35
+ background:
36
+ radial-gradient(circle at 10% 15%, rgba(45, 127, 249, .12), transparent 32%),
37
+ linear-gradient(135deg, #0b1119 0%, #101924 48%, #0b121b 100%);
38
+ }
39
+
40
+ button, input { font: inherit; }
41
+
42
+ .app {
43
+ display: grid;
44
+ grid-template-columns: 292px minmax(0, 1fr) 338px;
45
+ height: 100vh;
46
+ }
47
+
48
+ .sidebar,
49
+ .details {
50
+ background: rgba(13, 22, 32, .92);
51
+ border-color: rgba(136, 159, 184, .18);
52
+ border-style: solid;
53
+ backdrop-filter: blur(18px);
54
+ overflow: auto;
55
+ }
56
+
57
+ .sidebar {
58
+ border-width: 0 1px 0 0;
59
+ padding: 22px 18px;
60
+ }
61
+
62
+ .details {
63
+ border-width: 0 0 0 1px;
64
+ padding: 22px 18px;
65
+ }
66
+
67
+ .brand {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 12px;
71
+ margin-bottom: 22px;
72
+ }
73
+
74
+ .mark {
75
+ display: grid;
76
+ width: 42px;
77
+ height: 42px;
78
+ place-items: center;
79
+ border-radius: 8px;
80
+ color: white;
81
+ font-weight: 800;
82
+ letter-spacing: .04em;
83
+ background: linear-gradient(135deg, #2d7ff9, #21a979);
84
+ box-shadow: 0 12px 30px rgba(45, 127, 249, .28);
85
+ }
86
+
87
+ h1, h2, h3, p { margin: 0; }
88
+
89
+ h1 {
90
+ font-size: 17px;
91
+ line-height: 1.2;
92
+ letter-spacing: 0;
93
+ }
94
+
95
+ .subtitle {
96
+ margin-top: 4px;
97
+ color: var(--muted);
98
+ font-size: 12px;
99
+ line-height: 1.45;
100
+ }
101
+
102
+ .search {
103
+ position: relative;
104
+ margin-bottom: 20px;
105
+ }
106
+
107
+ .search input {
108
+ width: 100%;
109
+ height: 38px;
110
+ color: var(--text);
111
+ background: #0b141e;
112
+ border: 1px solid rgba(142, 160, 181, .22);
113
+ border-radius: 8px;
114
+ padding: 0 12px;
115
+ outline: none;
116
+ }
117
+
118
+ .search input:focus {
119
+ border-color: rgba(45, 127, 249, .85);
120
+ box-shadow: 0 0 0 3px rgba(45, 127, 249, .16);
121
+ }
122
+
123
+ .section {
124
+ margin-top: 20px;
125
+ }
126
+
127
+ .section h2 {
128
+ color: #f5f8fb;
129
+ font-size: 12px;
130
+ text-transform: uppercase;
131
+ letter-spacing: .08em;
132
+ margin-bottom: 10px;
133
+ }
134
+
135
+ .filters,
136
+ .views {
137
+ display: grid;
138
+ gap: 8px;
139
+ }
140
+
141
+ .chip,
142
+ .view-btn,
143
+ .tool-btn {
144
+ color: var(--text);
145
+ background: rgba(20, 34, 49, .92);
146
+ border: 1px solid rgba(142, 160, 181, .2);
147
+ border-radius: 8px;
148
+ cursor: pointer;
149
+ transition: transform .15s ease, border-color .15s ease, background .15s ease;
150
+ }
151
+
152
+ .chip,
153
+ .view-btn {
154
+ display: flex;
155
+ align-items: center;
156
+ justify-content: space-between;
157
+ min-height: 36px;
158
+ padding: 8px 10px;
159
+ text-align: left;
160
+ }
161
+
162
+ .chip:hover,
163
+ .view-btn:hover,
164
+ .tool-btn:hover {
165
+ transform: translateY(-1px);
166
+ border-color: rgba(255, 255, 255, .34);
167
+ }
168
+
169
+ .chip.active,
170
+ .view-btn.active {
171
+ background: rgba(45, 127, 249, .22);
172
+ border-color: rgba(45, 127, 249, .9);
173
+ }
174
+
175
+ .count {
176
+ min-width: 24px;
177
+ text-align: center;
178
+ color: var(--muted);
179
+ font-size: 11px;
180
+ border-radius: 999px;
181
+ padding: 2px 6px;
182
+ background: rgba(255, 255, 255, .06);
183
+ }
184
+
185
+ .legend {
186
+ display: grid;
187
+ grid-template-columns: 1fr 1fr;
188
+ gap: 8px;
189
+ }
190
+
191
+ .legend-item {
192
+ display: flex;
193
+ align-items: center;
194
+ gap: 8px;
195
+ color: var(--muted);
196
+ font-size: 12px;
197
+ }
198
+
199
+ .dot {
200
+ width: 10px;
201
+ height: 10px;
202
+ border-radius: 50%;
203
+ background: var(--dot);
204
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--dot), transparent 75%);
205
+ }
206
+
207
+ .workspace {
208
+ position: relative;
209
+ overflow: hidden;
210
+ background-color: var(--bg);
211
+ background-image:
212
+ linear-gradient(rgba(255,255,255,.035) 1px, transparent 1px),
213
+ linear-gradient(90deg, rgba(255,255,255,.035) 1px, transparent 1px);
214
+ background-size: 18px 18px;
215
+ }
216
+
217
+ .toolbar {
218
+ position: absolute;
219
+ z-index: 5;
220
+ top: 18px;
221
+ left: 18px;
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 8px;
225
+ padding: 8px;
226
+ background: rgba(12, 20, 30, .78);
227
+ border: 1px solid rgba(142, 160, 181, .16);
228
+ border-radius: 8px;
229
+ box-shadow: var(--shadow);
230
+ backdrop-filter: blur(14px);
231
+ }
232
+
233
+ .tool-btn {
234
+ display: grid;
235
+ width: 34px;
236
+ height: 34px;
237
+ place-items: center;
238
+ padding: 0;
239
+ font-size: 16px;
240
+ }
241
+
242
+ .zoom-readout {
243
+ min-width: 54px;
244
+ color: var(--muted);
245
+ text-align: center;
246
+ font-size: 12px;
247
+ }
248
+
249
+ .canvas {
250
+ position: absolute;
251
+ inset: 0;
252
+ transform-origin: 0 0;
253
+ will-change: transform;
254
+ }
255
+
256
+ svg.links {
257
+ position: absolute;
258
+ inset: 0;
259
+ width: 2400px;
260
+ height: 1260px;
261
+ overflow: visible;
262
+ pointer-events: none;
263
+ }
264
+
265
+ .edge {
266
+ fill: none;
267
+ stroke: rgba(142, 160, 181, .42);
268
+ stroke-width: 2;
269
+ marker-end: url(#arrow);
270
+ }
271
+
272
+ .edge.dim {
273
+ opacity: .13;
274
+ }
275
+
276
+ .edge.hot {
277
+ stroke: #9ac5ff;
278
+ stroke-width: 3;
279
+ filter: drop-shadow(0 0 8px rgba(45, 127, 249, .55));
280
+ opacity: 1;
281
+ }
282
+
283
+ .node {
284
+ position: absolute;
285
+ width: 196px;
286
+ min-height: 88px;
287
+ background: rgba(17, 27, 37, .96);
288
+ border: 1px solid rgba(255, 255, 255, .14);
289
+ border-top: 4px solid var(--accent);
290
+ border-radius: 8px;
291
+ box-shadow: 0 20px 40px rgba(0, 0, 0, .26);
292
+ cursor: pointer;
293
+ user-select: none;
294
+ transition: transform .12s ease, box-shadow .12s ease, opacity .15s ease, border-color .15s ease;
295
+ }
296
+
297
+ .node:hover {
298
+ transform: translateY(-2px);
299
+ border-color: rgba(255, 255, 255, .42);
300
+ box-shadow: 0 24px 48px rgba(0, 0, 0, .34);
301
+ }
302
+
303
+ .node.selected {
304
+ border-color: #fff;
305
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, .18), 0 24px 58px rgba(0, 0, 0, .4);
306
+ }
307
+
308
+ .node.dim {
309
+ opacity: .18;
310
+ }
311
+
312
+ .node.hidden {
313
+ display: none;
314
+ }
315
+
316
+ .node-head {
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: space-between;
320
+ gap: 8px;
321
+ padding: 9px 10px 7px;
322
+ border-bottom: 1px solid rgba(255, 255, 255, .08);
323
+ }
324
+
325
+ .node-type {
326
+ color: rgba(255, 255, 255, .72);
327
+ font-size: 10px;
328
+ text-transform: uppercase;
329
+ letter-spacing: .08em;
330
+ }
331
+
332
+ .port {
333
+ width: 10px;
334
+ height: 10px;
335
+ border: 2px solid rgba(255,255,255,.72);
336
+ border-radius: 50%;
337
+ background: var(--accent);
338
+ flex: 0 0 auto;
339
+ }
340
+
341
+ .node-body {
342
+ padding: 10px;
343
+ }
344
+
345
+ .node-title {
346
+ color: #fff;
347
+ font-size: 14px;
348
+ line-height: 1.15;
349
+ font-weight: 720;
350
+ letter-spacing: 0;
351
+ }
352
+
353
+ .node-summary {
354
+ margin-top: 8px;
355
+ color: var(--muted);
356
+ font-size: 11px;
357
+ line-height: 1.35;
358
+ }
359
+
360
+ .status-card {
361
+ margin-top: 16px;
362
+ padding: 12px;
363
+ background: rgba(20, 34, 49, .72);
364
+ border: 1px solid rgba(142, 160, 181, .16);
365
+ border-radius: 8px;
366
+ }
367
+
368
+ .status-card strong {
369
+ display: block;
370
+ margin-bottom: 6px;
371
+ font-size: 13px;
372
+ }
373
+
374
+ .status-card p,
375
+ .detail-copy,
376
+ .detail-list li {
377
+ color: var(--muted);
378
+ font-size: 12px;
379
+ line-height: 1.48;
380
+ }
381
+
382
+ .details h2 {
383
+ font-size: 18px;
384
+ line-height: 1.2;
385
+ margin-bottom: 6px;
386
+ }
387
+
388
+ .detail-type {
389
+ display: inline-flex;
390
+ align-items: center;
391
+ gap: 8px;
392
+ color: #fff;
393
+ font-size: 12px;
394
+ margin-bottom: 14px;
395
+ padding: 5px 8px;
396
+ border: 1px solid color-mix(in srgb, var(--accent), transparent 52%);
397
+ border-radius: 999px;
398
+ background: color-mix(in srgb, var(--accent), transparent 84%);
399
+ }
400
+
401
+ .path {
402
+ display: block;
403
+ width: 100%;
404
+ margin: 14px 0;
405
+ padding: 10px;
406
+ color: #cfe1f5;
407
+ background: #0a121a;
408
+ border: 1px solid rgba(142, 160, 181, .16);
409
+ border-radius: 8px;
410
+ font-family: "Cascadia Code", Consolas, monospace;
411
+ font-size: 11px;
412
+ white-space: normal;
413
+ overflow-wrap: anywhere;
414
+ }
415
+
416
+ .detail-group {
417
+ margin-top: 18px;
418
+ }
419
+
420
+ .detail-group h3 {
421
+ margin-bottom: 8px;
422
+ font-size: 12px;
423
+ text-transform: uppercase;
424
+ letter-spacing: .08em;
425
+ color: #f1f5fa;
426
+ }
427
+
428
+ .detail-list {
429
+ display: grid;
430
+ gap: 7px;
431
+ padding: 0;
432
+ margin: 0;
433
+ list-style: none;
434
+ }
435
+
436
+ .detail-list li {
437
+ padding: 8px 9px;
438
+ background: rgba(20, 34, 49, .7);
439
+ border: 1px solid rgba(142, 160, 181, .14);
440
+ border-radius: 8px;
441
+ }
442
+
443
+ .mobile-note {
444
+ display: none;
445
+ position: absolute;
446
+ right: 14px;
447
+ bottom: 14px;
448
+ left: 14px;
449
+ z-index: 10;
450
+ padding: 10px 12px;
451
+ color: var(--muted);
452
+ background: rgba(12, 20, 30, .92);
453
+ border: 1px solid rgba(142, 160, 181, .18);
454
+ border-radius: 8px;
455
+ }
456
+
457
+ @media (max-width: 1040px) {
458
+ .app {
459
+ grid-template-columns: 250px minmax(0, 1fr);
460
+ }
461
+
462
+ .details {
463
+ display: none;
464
+ }
465
+ }
466
+
467
+ @media (max-width: 760px) {
468
+ body {
469
+ overflow: auto;
470
+ }
471
+
472
+ .app {
473
+ grid-template-columns: 1fr;
474
+ height: auto;
475
+ min-height: 100vh;
476
+ }
477
+
478
+ .sidebar {
479
+ border-width: 0 0 1px 0;
480
+ }
481
+
482
+ .workspace {
483
+ height: 72vh;
484
+ }
485
+
486
+ .details {
487
+ display: block;
488
+ border-width: 1px 0 0 0;
489
+ }
490
+
491
+ .mobile-note {
492
+ display: block;
493
+ }
494
+ }
495
+ </style>
496
+ </head>
497
+ <body>
498
+ <main class="app">
499
+ <aside class="sidebar">
500
+ <div class="brand">
501
+ <div class="mark">OXE</div>
502
+ <div>
503
+ <h1>Mapa de comunicação</h1>
504
+ <p class="subtitle">Artefatos, workflows, runtime, agentes e integrações do OXE Build.</p>
505
+ </div>
506
+ </div>
507
+
508
+ <label class="search" aria-label="Buscar no mapa">
509
+ <input id="search" type="search" placeholder="Buscar artefato, fluxo ou path">
510
+ </label>
511
+
512
+ <section class="section">
513
+ <h2>Visões</h2>
514
+ <div class="views" id="views"></div>
515
+ </section>
516
+
517
+ <section class="section">
518
+ <h2>Tipos</h2>
519
+ <div class="filters" id="filters"></div>
520
+ </section>
521
+
522
+ <section class="section">
523
+ <h2>Legenda</h2>
524
+ <div class="legend" id="legend"></div>
525
+ </section>
526
+
527
+ <div class="status-card">
528
+ <strong>Como ler</strong>
529
+ <p>As setas indicam consumo, produção ou projeção. Clique em um nó para destacar dependências e saídas; use as visões para focar no ciclo, runtime, agentes ou release.</p>
530
+ </div>
531
+ </aside>
532
+
533
+ <section class="workspace" id="workspace" aria-label="Mapa visual interativo dos artefatos OXE">
534
+ <div class="toolbar" aria-label="Controles do mapa">
535
+ <button class="tool-btn" id="zoomOut" title="Diminuir zoom">-</button>
536
+ <span class="zoom-readout" id="zoomLabel">100%</span>
537
+ <button class="tool-btn" id="zoomIn" title="Aumentar zoom">+</button>
538
+ <button class="tool-btn" id="reset" title="Centralizar">⌂</button>
539
+ </div>
540
+ <div class="canvas" id="canvas">
541
+ <svg class="links" id="links" viewBox="0 0 2400 1260" aria-hidden="true">
542
+ <defs>
543
+ <marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto" markerUnits="strokeWidth">
544
+ <path d="M0,0 L0,6 L9,3 z" fill="rgba(142, 160, 181, .7)"></path>
545
+ </marker>
546
+ </defs>
547
+ </svg>
548
+ </div>
549
+ <div class="mobile-note">Arraste para navegar pelo mapa. Toque em um cartão para ver suas conexões.</div>
550
+ </section>
551
+
552
+ <aside class="details" id="details" style="--accent: var(--blue)">
553
+ <h2>Selecione um artefato</h2>
554
+ <span class="detail-type"><span class="dot" style="--dot: var(--blue)"></span>Visão geral</span>
555
+ <p class="detail-copy">O mapa parte dos comandos e workflows canônicos, atravessa os artefatos em `.oxe/`, passa pelo runtime enterprise e termina nas integrações, SDK e gates de release.</p>
556
+ <div class="detail-group">
557
+ <h3>Atalhos úteis</h3>
558
+ <ul class="detail-list">
559
+ <li>`/oxe-spec -> /oxe-plan -> /oxe-execute -> /oxe-verify` é o ciclo principal.</li>
560
+ <li>`oxe-cc runtime` compila, verifica, projeta e promove runs.</li>
561
+ <li>`oxe/workflows/**` é a fonte canônica; wrappers são projeções.</li>
562
+ </ul>
563
+ </div>
564
+ </aside>
565
+ </main>
566
+
567
+ <script>
568
+ const colors = {
569
+ cli: "var(--violet)",
570
+ workflow: "var(--blue)",
571
+ artifact: "var(--green)",
572
+ runtime: "var(--cyan)",
573
+ agent: "var(--orange)",
574
+ integration: "var(--yellow)",
575
+ release: "var(--red)"
576
+ };
577
+
578
+ const labels = {
579
+ cli: "Entrada",
580
+ workflow: "Workflow",
581
+ artifact: "Artefato",
582
+ runtime: "Runtime",
583
+ agent: "Agente",
584
+ integration: "Integração",
585
+ release: "Release"
586
+ };
587
+
588
+ const nodes = [
589
+ {
590
+ id: "user",
591
+ title: "Usuário / IDE",
592
+ type: "cli",
593
+ x: 60,
594
+ y: 420,
595
+ path: "Cursor, Copilot, Claude, Gemini, Codex, Windsurf, Antigravity",
596
+ summary: "Inicia comandos OXE em linguagem natural ou slash commands.",
597
+ details: "A entrada do usuário chega por wrappers de IDE/CLI, mas o estado real continua em `.oxe/` e os workflows canônicos ficam em `oxe/workflows/`.",
598
+ produces: ["Pedidos de spec", "Pedidos de plano", "Execução", "Verificação"],
599
+ consumes: ["Status do ciclo", "Resultados de verify", "Dashboard"]
600
+ },
601
+ {
602
+ id: "cli",
603
+ title: "oxe-cc CLI",
604
+ type: "cli",
605
+ x: 310,
606
+ y: 420,
607
+ path: "bin/oxe-cc.js",
608
+ summary: "Instala, diagnostica, sincroniza, controla runtime e expõe comandos administrativos.",
609
+ details: "Ponto executável do pacote npm. Orquestra `install`, `doctor`, `status`, `update`, `runtime`, `dashboard`, `context` e gates de release.",
610
+ produces: ["Workflows instalados", "Manifests", "Relatórios", "Context packs"],
611
+ consumes: ["package.json", "bin/lib/*.cjs", "oxe/workflows/**", ".oxe/config.json"]
612
+ },
613
+ {
614
+ id: "canonical",
615
+ title: "Workflows canônicos",
616
+ type: "workflow",
617
+ x: 575,
618
+ y: 385,
619
+ path: "oxe/workflows/*.md",
620
+ summary: "Fonte primária de comportamento de `/oxe-*`.",
621
+ details: "Cada passo OXE deve seguir seu arquivo canônico sem atalhos. Os wrappers de runtime apontam para estes documentos.",
622
+ produces: ["Fluxo spec-plan-execute-verify", "Regras runtime-first", "Contratos por comando"],
623
+ consumes: ["References", "Templates", "Personas", "Contratos de raciocínio"]
624
+ },
625
+ {
626
+ id: "contracts",
627
+ title: "Contratos de raciocínio",
628
+ type: "workflow",
629
+ x: 575,
630
+ y: 570,
631
+ path: "oxe/workflows/references/workflow-runtime-contracts.json",
632
+ summary: "Mapeia cada workflow para modo, artefatos exigidos e contexto.",
633
+ details: "Define `discovery`, `planning`, `execution`, `review` e `status`, além de required/optional artifacts e context tiers por workflow.",
634
+ produces: ["Metadados cognitivos", "Context tiers", "Bloqueios formais"],
635
+ consumes: ["reasoning-*.md", "workflow metadata"]
636
+ },
637
+ {
638
+ id: "wrappers",
639
+ title: "Wrappers por runtime",
640
+ type: "integration",
641
+ x: 850,
642
+ y: 330,
643
+ path: "commands/oxe, .github/prompts, .cursor/commands, .claude/commands",
644
+ summary: "Projeções para IDEs e CLIs, derivadas dos workflows.",
645
+ details: "Permitem que cada ambiente invoque o mesmo comportamento sem duplicar a lógica canônica.",
646
+ produces: ["Slash commands", "Prompt files", "Instruções de agente"],
647
+ consumes: ["oxe/workflows/**", "metadata OXE"]
648
+ },
649
+ {
650
+ id: "templates",
651
+ title: "Templates de artefatos",
652
+ type: "artifact",
653
+ x: 850,
654
+ y: 545,
655
+ path: "oxe/templates/*.template.*",
656
+ summary: "Esqueleto dos arquivos persistidos em `.oxe/`.",
657
+ details: "Padroniza SPEC, PLAN, VERIFY, STATE, EXECUTION-RUNTIME, checkpoints, capabilities, swarm e release docs.",
658
+ produces: [".oxe/*.md", ".oxe/*.json", "Estrutura inicial de sessão"],
659
+ consumes: ["Workflows", "Config", "Sessão ativa"]
660
+ },
661
+ {
662
+ id: "config",
663
+ title: "Config e estado",
664
+ type: "artifact",
665
+ x: 1120,
666
+ y: 170,
667
+ path: ".oxe/config.json, .oxe/STATE.md",
668
+ summary: "Define perfil e cursor operacional do projeto.",
669
+ details: "`config.json` controla profile e defaults. `STATE.md` aponta sessão, fase, workstream e leitura de continuidade.",
670
+ produces: ["Perfil balanced/strict/fast/legacy", "Sessão ativa", "Próximo passo"],
671
+ consumes: ["Templates", "Comandos administrativos"]
672
+ },
673
+ {
674
+ id: "spec",
675
+ title: "SPEC / QUICK",
676
+ type: "artifact",
677
+ x: 1120,
678
+ y: 345,
679
+ path: ".oxe/SPEC.md, .oxe/QUICK.md",
680
+ summary: "Converte objetivo em requisitos, escopo e critérios.",
681
+ details: "`/oxe-spec` gera requisitos estruturados e roteiro. `/oxe-quick` cobre mudanças pequenas com menos cerimônia.",
682
+ produces: ["Requisitos R-ID", "Critérios de aceite", "Escopo aprovado"],
683
+ consumes: ["Discussão", "Pesquisa", "Codebase scan", "Visual inputs"]
684
+ },
685
+ {
686
+ id: "plan",
687
+ title: "PLAN e plan-agents",
688
+ type: "artifact",
689
+ x: 1120,
690
+ y: 525,
691
+ path: ".oxe/PLAN.md, .oxe/plan-agents.json",
692
+ summary: "Quebra requisitos em ondas, tarefas, validação e agentes.",
693
+ details: "`/oxe-plan` produz tarefas verificáveis. Com `--agents`, gera blueprints PDDA com role, persona, model_hint e ownership.",
694
+ produces: ["Ondas", "Implementation packs", "Blueprints de agentes"],
695
+ consumes: ["SPEC", "Context packs", "Personas", "Schemas"]
696
+ },
697
+ {
698
+ id: "execute",
699
+ title: "EXECUTION-RUNTIME",
700
+ type: "artifact",
701
+ x: 1120,
702
+ y: 710,
703
+ path: ".oxe/EXECUTION-RUNTIME.md, .oxe/ACTIVE-RUN.json",
704
+ summary: "Registra run, checkpoints, eventos e progresso de execução.",
705
+ details: "`/oxe-execute` é runtime-first quando disponível. O markdown vira projeção derivada do estado operacional.",
706
+ produces: ["Active run", "Checkpoints", "Eventos", "Mutations log"],
707
+ consumes: ["PLAN", "Runtime", "Agentes", "Evidence"]
708
+ },
709
+ {
710
+ id: "verify",
711
+ title: "VERIFY e gaps",
712
+ type: "artifact",
713
+ x: 1120,
714
+ y: 890,
715
+ path: ".oxe/VERIFY.md, .oxe/VALIDATION-GAPS.md",
716
+ summary: "Fecha critérios, riscos residuais, gaps e retro.",
717
+ details: "`/oxe-verify` valida implementação por camadas, podendo acionar gaps, security, UI review, PR review e retro automática.",
718
+ produces: ["Resultado de validação", "Risk ledger", "Gaps", "Lessons"],
719
+ consumes: ["SPEC", "PLAN", "Runtime verify", "Evidence store"]
720
+ },
721
+ {
722
+ id: "runtime",
723
+ title: "Runtime enterprise",
724
+ type: "runtime",
725
+ x: 1395,
726
+ y: 460,
727
+ path: "packages/runtime/src, lib/runtime",
728
+ summary: "ExecutionGraph, scheduler, gates, evidence, policy e promotion.",
729
+ details: "O runtime TypeScript compila para CJS em `lib/runtime` e executa operações robustas de run, verify, gates, recovery e promoção.",
730
+ produces: ["Compiled graph", "Run state", "Verification manifest", "Gates"],
731
+ consumes: ["PLAN", "Artifacts", "Policies", "Workspace strategies"]
732
+ },
733
+ {
734
+ id: "graph",
735
+ title: "Compiler e projection",
736
+ type: "runtime",
737
+ x: 1665,
738
+ y: 300,
739
+ path: "lib/runtime/compiler, lib/runtime/projection",
740
+ summary: "Transforma artefatos em grafo executável e projeções markdown.",
741
+ details: "O compiler estrutura o trabalho como grafo; projection mantém artefatos legíveis sem virar fonte paralela de verdade.",
742
+ produces: ["ExecutionGraph", "Projeções de artefato", "Estado legível"],
743
+ consumes: ["SPEC", "PLAN", "Workflow contracts"]
744
+ },
745
+ {
746
+ id: "scheduler",
747
+ title: "Scheduler multi-agente",
748
+ type: "runtime",
749
+ x: 1665,
750
+ y: 500,
751
+ path: "lib/runtime/scheduler",
752
+ summary: "Coordena agentes, ownership, handoffs e heartbeat.",
753
+ details: "Gerencia estratégias parallel, competitive e cooperative, além de journal, registry, roles e coordenação multi-agent.",
754
+ produces: ["Agent status", "Run journal", "Handoffs"],
755
+ consumes: ["plan-agents.json", "Personas", "Work items"]
756
+ },
757
+ {
758
+ id: "evidence",
759
+ title: "Evidence, gates e policy",
760
+ type: "runtime",
761
+ x: 1665,
762
+ y: 700,
763
+ path: "lib/runtime/evidence, gate, policy, audit",
764
+ summary: "Guarda evidências, aplica decisões e registra auditoria.",
765
+ details: "Sustenta `runtime verify`, risk ledger, policy packs, gate-manager e trilha auditável para decisões de promoção.",
766
+ produces: ["Evidence store", "Gate decisions", "Audit trail"],
767
+ consumes: ["Testes", "Work items", "Verification criteria"]
768
+ },
769
+ {
770
+ id: "agents",
771
+ title: "Personas e agentes OXE",
772
+ type: "agent",
773
+ x: 1395,
774
+ y: 745,
775
+ path: "oxe/personas, oxe/agents, .oxe/agents",
776
+ summary: "Especialistas de planejamento, execução, verificação, UI, DB e debug.",
777
+ details: "As 8 personas builtin e agentes OXE dão postura operacional específica para cada domínio da entrega.",
778
+ produces: ["Análises especializadas", "Execução por domínio", "Auditorias"],
779
+ consumes: ["PLAN", "Context packs", "Agent blueprints"]
780
+ },
781
+ {
782
+ id: "context",
783
+ title: "Context packs e memória",
784
+ type: "artifact",
785
+ x: 1395,
786
+ y: 180,
787
+ path: ".oxe/context, .oxe/codebase, .oxe/global, .oxe/memory",
788
+ summary: "Compacta conhecimento do projeto para leitura rápida e consistente.",
789
+ details: "Guarda mapas de codebase, summaries, lessons, observations e memória persistente entre sessões.",
790
+ produces: ["Packs por workflow", "Resumo de sessão", "Lessons"],
791
+ consumes: ["Scan", "Retro", "Distill", "Observações"]
792
+ },
793
+ {
794
+ id: "sdk",
795
+ title: "SDK programático",
796
+ type: "integration",
797
+ x: 1935,
798
+ y: 365,
799
+ path: "lib/sdk/index.cjs",
800
+ summary: "API para scripts, CI e integrações internas.",
801
+ details: "Expõe doctor, health, workflows, install, manifest, agents, verifyRun e bridges operacionais do runtime.",
802
+ produces: ["APIs estáveis", "Integrações CI", "Automação externa"],
803
+ consumes: ["bin/lib", "lib/runtime", "workflow metadata"]
804
+ },
805
+ {
806
+ id: "dashboard",
807
+ title: "Dashboard local",
808
+ type: "integration",
809
+ x: 1935,
810
+ y: 565,
811
+ path: "oxe-cc dashboard, .oxe/dashboard",
812
+ summary: "Visão web dos artefatos reais, gates, ondas e aprovação.",
813
+ details: "Lê os arquivos OXE reais e mostra ciclo principal, mapa de artefatos, active run, trace log, handoffs, evidências e promotion state.",
814
+ produces: ["Visão operacional", "Revisão de equipe", "Aprovação visual"],
815
+ consumes: [".oxe/STATE.md", ".oxe/PLAN.md", ".oxe/runs", ".oxe/VERIFY.md"]
816
+ },
817
+ {
818
+ id: "release",
819
+ title: "Release gates",
820
+ type: "release",
821
+ x: 1935,
822
+ y: 770,
823
+ path: "npm test, release:pack-check, doctor --release",
824
+ summary: "Impede publicação com drift ou artefatos inválidos.",
825
+ details: "O gate local exige runtime compilado, árvore canônica, contratos válidos, wrappers sincronizados e relatórios `.oxe/release/*.json`.",
826
+ produces: ["release-manifest.json", "runtime reports", "multi-agent reports"],
827
+ consumes: ["Test suite", "Package files", "Runtime build", "Workflows"]
828
+ },
829
+ {
830
+ id: "npm",
831
+ title: "Pacote npm oxe-cc",
832
+ type: "release",
833
+ x: 2180,
834
+ y: 585,
835
+ path: "package.json files[]",
836
+ summary: "Distribui CLI, SDK, workflows, assets, docs e integrações.",
837
+ details: "Empacota `bin`, `lib`, `oxe`, `assets`, `.cursor`, `.github`, `commands`, `docs`, runtime source e documentação.",
838
+ produces: ["npx oxe-cc@latest", "Instalação em projetos", "Atualizações"],
839
+ consumes: ["Release gates", "Manifest", "Package whitelist"]
840
+ }
841
+ ];
842
+
843
+ const edges = [
844
+ ["user", "cli", "invoca"],
845
+ ["cli", "canonical", "resolve"],
846
+ ["canonical", "contracts", "declara"],
847
+ ["canonical", "wrappers", "projeta"],
848
+ ["canonical", "templates", "materializa"],
849
+ ["wrappers", "user", "expõe"],
850
+ ["templates", "config", "cria"],
851
+ ["templates", "spec", "cria"],
852
+ ["templates", "plan", "cria"],
853
+ ["templates", "execute", "cria"],
854
+ ["templates", "verify", "cria"],
855
+ ["config", "spec", "orienta"],
856
+ ["spec", "plan", "alimenta"],
857
+ ["plan", "execute", "direciona"],
858
+ ["execute", "verify", "evidencia"],
859
+ ["verify", "context", "retroalimenta"],
860
+ ["context", "spec", "informa"],
861
+ ["context", "plan", "informa"],
862
+ ["context", "agents", "contextualiza"],
863
+ ["plan", "runtime", "compila"],
864
+ ["execute", "runtime", "controla"],
865
+ ["runtime", "graph", "usa"],
866
+ ["runtime", "scheduler", "usa"],
867
+ ["runtime", "evidence", "usa"],
868
+ ["agents", "scheduler", "executa"],
869
+ ["scheduler", "execute", "atualiza"],
870
+ ["evidence", "verify", "prova"],
871
+ ["graph", "execute", "projeta"],
872
+ ["runtime", "sdk", "reexporta"],
873
+ ["runtime", "dashboard", "expõe"],
874
+ ["verify", "release", "libera"],
875
+ ["sdk", "release", "suporta"],
876
+ ["release", "npm", "publica"],
877
+ ["npm", "cli", "instala"]
878
+ ];
879
+
880
+ const views = {
881
+ all: { label: "Mapa completo", nodes: nodes.map(n => n.id) },
882
+ cycle: { label: "Ciclo principal", nodes: ["user", "cli", "canonical", "templates", "config", "spec", "plan", "execute", "verify", "context"] },
883
+ runtime: { label: "Runtime-first", nodes: ["plan", "execute", "verify", "runtime", "graph", "scheduler", "evidence", "dashboard", "sdk"] },
884
+ agents: { label: "Multi-agente", nodes: ["plan", "agents", "scheduler", "execute", "evidence", "verify", "context"] },
885
+ install: { label: "Instalação IDE", nodes: ["user", "cli", "canonical", "contracts", "wrappers", "sdk", "npm"] },
886
+ release: { label: "Publicação", nodes: ["canonical", "contracts", "runtime", "evidence", "verify", "sdk", "release", "npm"] }
887
+ };
888
+
889
+ const canvas = document.getElementById("canvas");
890
+ const links = document.getElementById("links");
891
+ const workspace = document.getElementById("workspace");
892
+ const details = document.getElementById("details");
893
+ const filtersEl = document.getElementById("filters");
894
+ const legendEl = document.getElementById("legend");
895
+ const viewsEl = document.getElementById("views");
896
+ const searchEl = document.getElementById("search");
897
+ const zoomLabel = document.getElementById("zoomLabel");
898
+
899
+ const nodeMap = new Map(nodes.map(node => [node.id, node]));
900
+ const activeTypes = new Set(Object.keys(labels));
901
+ let selectedId = null;
902
+ let activeView = "all";
903
+ let query = "";
904
+ let scale = 0.72;
905
+ let pan = { x: 18, y: 38 };
906
+ let dragging = false;
907
+ let dragStart = { x: 0, y: 0 };
908
+ let panStart = { x: 0, y: 0 };
909
+
910
+ function renderFilters() {
911
+ filtersEl.innerHTML = "";
912
+ Object.entries(labels).forEach(([type, label]) => {
913
+ const count = nodes.filter(node => node.type === type).length;
914
+ const button = document.createElement("button");
915
+ button.className = "chip active";
916
+ button.dataset.type = type;
917
+ button.innerHTML = `<span><span class="dot" style="--dot:${colors[type]}"></span> ${label}</span><span class="count">${count}</span>`;
918
+ button.addEventListener("click", () => {
919
+ if (activeTypes.has(type)) {
920
+ activeTypes.delete(type);
921
+ button.classList.remove("active");
922
+ } else {
923
+ activeTypes.add(type);
924
+ button.classList.add("active");
925
+ }
926
+ updateVisibility();
927
+ });
928
+ filtersEl.appendChild(button);
929
+ });
930
+ }
931
+
932
+ function renderLegend() {
933
+ legendEl.innerHTML = "";
934
+ Object.entries(labels).forEach(([type, label]) => {
935
+ const item = document.createElement("div");
936
+ item.className = "legend-item";
937
+ item.innerHTML = `<span class="dot" style="--dot:${colors[type]}"></span><span>${label}</span>`;
938
+ legendEl.appendChild(item);
939
+ });
940
+ }
941
+
942
+ function renderViews() {
943
+ viewsEl.innerHTML = "";
944
+ Object.entries(views).forEach(([id, view]) => {
945
+ const button = document.createElement("button");
946
+ button.className = `view-btn${id === activeView ? " active" : ""}`;
947
+ button.dataset.view = id;
948
+ button.innerHTML = `<span>${view.label}</span><span class="count">${view.nodes.length}</span>`;
949
+ button.addEventListener("click", () => {
950
+ activeView = id;
951
+ document.querySelectorAll(".view-btn").forEach(btn => btn.classList.toggle("active", btn.dataset.view === id));
952
+ selectedId = null;
953
+ fitView(id);
954
+ updateVisibility();
955
+ });
956
+ viewsEl.appendChild(button);
957
+ });
958
+ }
959
+
960
+ function renderNodes() {
961
+ nodes.forEach(node => {
962
+ const el = document.createElement("article");
963
+ el.className = "node";
964
+ el.id = `node-${node.id}`;
965
+ el.dataset.id = node.id;
966
+ el.dataset.type = node.type;
967
+ el.style.left = `${node.x}px`;
968
+ el.style.top = `${node.y}px`;
969
+ el.style.setProperty("--accent", colors[node.type]);
970
+ el.innerHTML = `
971
+ <div class="node-head">
972
+ <span class="node-type">${labels[node.type]}</span>
973
+ <span class="port"></span>
974
+ </div>
975
+ <div class="node-body">
976
+ <div class="node-title">${node.title}</div>
977
+ <div class="node-summary">${node.summary}</div>
978
+ </div>
979
+ `;
980
+ el.addEventListener("click", event => {
981
+ event.stopPropagation();
982
+ selectedId = node.id;
983
+ updateDetails(node);
984
+ updateVisibility();
985
+ });
986
+ canvas.appendChild(el);
987
+ });
988
+ }
989
+
990
+ function renderEdges() {
991
+ const frag = document.createDocumentFragment();
992
+ edges.forEach(([from, to, label], index) => {
993
+ const a = nodeMap.get(from);
994
+ const b = nodeMap.get(to);
995
+ const x1 = a.x + 196;
996
+ const y1 = a.y + 44;
997
+ const x2 = b.x;
998
+ const y2 = b.y + 44;
999
+ const gap = Math.max(80, Math.abs(x2 - x1) * .42);
1000
+ const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
1001
+ path.setAttribute("d", `M ${x1} ${y1} C ${x1 + gap} ${y1}, ${x2 - gap} ${y2}, ${x2} ${y2}`);
1002
+ path.setAttribute("class", "edge");
1003
+ path.dataset.from = from;
1004
+ path.dataset.to = to;
1005
+ path.dataset.label = label;
1006
+ path.dataset.index = String(index);
1007
+ frag.appendChild(path);
1008
+ });
1009
+ links.appendChild(frag);
1010
+ }
1011
+
1012
+ function matchesQuery(node) {
1013
+ if (!query) return true;
1014
+ const haystack = `${node.title} ${node.type} ${node.path} ${node.summary} ${node.details}`.toLowerCase();
1015
+ return haystack.includes(query);
1016
+ }
1017
+
1018
+ function nodeInView(node) {
1019
+ return activeView === "all" || views[activeView].nodes.includes(node.id);
1020
+ }
1021
+
1022
+ function connectedToSelected(id) {
1023
+ return edges.some(([from, to]) => (from === selectedId && to === id) || (to === selectedId && from === id));
1024
+ }
1025
+
1026
+ function updateVisibility() {
1027
+ const visible = new Set();
1028
+ nodes.forEach(node => {
1029
+ const el = document.getElementById(`node-${node.id}`);
1030
+ const isVisible = activeTypes.has(node.type) && nodeInView(node) && matchesQuery(node);
1031
+ el.classList.toggle("hidden", !isVisible);
1032
+ if (isVisible) visible.add(node.id);
1033
+
1034
+ const shouldDim = selectedId && node.id !== selectedId && !connectedToSelected(node.id);
1035
+ el.classList.toggle("dim", Boolean(isVisible && shouldDim));
1036
+ el.classList.toggle("selected", node.id === selectedId);
1037
+ });
1038
+
1039
+ links.querySelectorAll(".edge").forEach(edge => {
1040
+ const from = edge.dataset.from;
1041
+ const to = edge.dataset.to;
1042
+ const edgeVisible = visible.has(from) && visible.has(to);
1043
+ edge.style.display = edgeVisible ? "block" : "none";
1044
+ const hot = selectedId && (from === selectedId || to === selectedId);
1045
+ edge.classList.toggle("hot", Boolean(hot));
1046
+ edge.classList.toggle("dim", Boolean(selectedId && !hot));
1047
+ });
1048
+ }
1049
+
1050
+ function updateDetails(node) {
1051
+ details.style.setProperty("--accent", colors[node.type]);
1052
+ const incoming = edges.filter(([, to]) => to === node.id).map(([from, , label]) => `${nodeMap.get(from).title} -> ${label}`);
1053
+ const outgoing = edges.filter(([from]) => from === node.id).map(([, to, label]) => `${label} -> ${nodeMap.get(to).title}`);
1054
+ details.innerHTML = `
1055
+ <h2>${node.title}</h2>
1056
+ <span class="detail-type"><span class="dot" style="--dot:${colors[node.type]}"></span>${labels[node.type]}</span>
1057
+ <p class="detail-copy">${node.details}</p>
1058
+ <code class="path">${node.path}</code>
1059
+ <div class="detail-group">
1060
+ <h3>Produz ou atualiza</h3>
1061
+ <ul class="detail-list">${node.produces.map(item => `<li>${item}</li>`).join("")}</ul>
1062
+ </div>
1063
+ <div class="detail-group">
1064
+ <h3>Consome ou depende</h3>
1065
+ <ul class="detail-list">${node.consumes.map(item => `<li>${item}</li>`).join("")}</ul>
1066
+ </div>
1067
+ <div class="detail-group">
1068
+ <h3>Entradas no mapa</h3>
1069
+ <ul class="detail-list">${(incoming.length ? incoming : ["Sem entrada direta nesta visão."]).map(item => `<li>${item}</li>`).join("")}</ul>
1070
+ </div>
1071
+ <div class="detail-group">
1072
+ <h3>Saídas no mapa</h3>
1073
+ <ul class="detail-list">${(outgoing.length ? outgoing : ["Sem saída direta nesta visão."]).map(item => `<li>${item}</li>`).join("")}</ul>
1074
+ </div>
1075
+ `;
1076
+ }
1077
+
1078
+ function applyTransform() {
1079
+ canvas.style.transform = `translate(${pan.x}px, ${pan.y}px) scale(${scale})`;
1080
+ zoomLabel.textContent = `${Math.round(scale * 100)}%`;
1081
+ }
1082
+
1083
+ function fitView(id) {
1084
+ const viewNodes = (id === "all" ? nodes : nodes.filter(node => views[id].nodes.includes(node.id)));
1085
+ const minX = Math.min(...viewNodes.map(node => node.x));
1086
+ const minY = Math.min(...viewNodes.map(node => node.y));
1087
+ const maxX = Math.max(...viewNodes.map(node => node.x + 196));
1088
+ const maxY = Math.max(...viewNodes.map(node => node.y + 110));
1089
+ const width = maxX - minX;
1090
+ const height = maxY - minY;
1091
+ const scaleX = (workspace.clientWidth - 80) / width;
1092
+ const scaleY = (workspace.clientHeight - 90) / height;
1093
+ scale = Math.min(.92, Math.max(.42, Math.min(scaleX, scaleY)));
1094
+ pan = {
1095
+ x: Math.max(12, (workspace.clientWidth - width * scale) / 2 - minX * scale),
1096
+ y: Math.max(24, (workspace.clientHeight - height * scale) / 2 - minY * scale)
1097
+ };
1098
+ applyTransform();
1099
+ }
1100
+
1101
+ searchEl.addEventListener("input", event => {
1102
+ query = event.target.value.trim().toLowerCase();
1103
+ selectedId = null;
1104
+ updateVisibility();
1105
+ });
1106
+
1107
+ document.getElementById("zoomIn").addEventListener("click", () => {
1108
+ scale = Math.min(1.35, scale + .1);
1109
+ applyTransform();
1110
+ });
1111
+
1112
+ document.getElementById("zoomOut").addEventListener("click", () => {
1113
+ scale = Math.max(.35, scale - .1);
1114
+ applyTransform();
1115
+ });
1116
+
1117
+ document.getElementById("reset").addEventListener("click", () => {
1118
+ activeView = "all";
1119
+ selectedId = null;
1120
+ document.querySelectorAll(".view-btn").forEach(btn => btn.classList.toggle("active", btn.dataset.view === "all"));
1121
+ fitView("all");
1122
+ updateVisibility();
1123
+ });
1124
+
1125
+ workspace.addEventListener("pointerdown", event => {
1126
+ if (event.target.closest(".node") || event.target.closest(".toolbar")) return;
1127
+ dragging = true;
1128
+ dragStart = { x: event.clientX, y: event.clientY };
1129
+ panStart = { ...pan };
1130
+ workspace.setPointerCapture(event.pointerId);
1131
+ });
1132
+
1133
+ workspace.addEventListener("pointermove", event => {
1134
+ if (!dragging) return;
1135
+ pan = {
1136
+ x: panStart.x + event.clientX - dragStart.x,
1137
+ y: panStart.y + event.clientY - dragStart.y
1138
+ };
1139
+ applyTransform();
1140
+ });
1141
+
1142
+ workspace.addEventListener("pointerup", event => {
1143
+ dragging = false;
1144
+ if (workspace.hasPointerCapture(event.pointerId)) workspace.releasePointerCapture(event.pointerId);
1145
+ });
1146
+
1147
+ workspace.addEventListener("wheel", event => {
1148
+ event.preventDefault();
1149
+ const direction = event.deltaY > 0 ? -1 : 1;
1150
+ const nextScale = Math.min(1.35, Math.max(.35, scale + direction * .06));
1151
+ const rect = workspace.getBoundingClientRect();
1152
+ const mx = event.clientX - rect.left;
1153
+ const my = event.clientY - rect.top;
1154
+ const worldX = (mx - pan.x) / scale;
1155
+ const worldY = (my - pan.y) / scale;
1156
+ scale = nextScale;
1157
+ pan = { x: mx - worldX * scale, y: my - worldY * scale };
1158
+ applyTransform();
1159
+ }, { passive: false });
1160
+
1161
+ window.addEventListener("resize", () => fitView(activeView));
1162
+
1163
+ renderFilters();
1164
+ renderLegend();
1165
+ renderViews();
1166
+ renderEdges();
1167
+ renderNodes();
1168
+ fitView("all");
1169
+ updateVisibility();
1170
+ </script>
1171
+ </body>
1172
+ </html>