oxe-cc 1.5.1 → 1.7.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 (125) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +45 -0
  3. package/README.md +19 -15
  4. package/bin/lib/oxe-agent-install.cjs +125 -24
  5. package/bin/lib/oxe-dashboard.cjs +21 -5
  6. package/bin/lib/oxe-project-health.cjs +120 -42
  7. package/bin/lib/oxe-release.cjs +77 -4
  8. package/bin/oxe-cc.js +155 -78
  9. package/commands/oxe/debug.md +6 -1
  10. package/commands/oxe/discuss.md +7 -2
  11. package/commands/oxe/execute.md +7 -2
  12. package/commands/oxe/plan-agent.md +7 -2
  13. package/commands/oxe/plan.md +7 -2
  14. package/commands/oxe/scan.md +6 -1
  15. package/commands/oxe/spec.md +6 -1
  16. package/commands/oxe/verify.md +6 -1
  17. package/docs/CONTENT-MIGRATION-AUDIT.md +49 -0
  18. package/docs/RELEASE-READINESS.md +8 -0
  19. package/docs/RUNTIME-SMOKE-MATRIX.md +9 -2
  20. package/lib/runtime/compiler/graph-compiler.js +32 -0
  21. package/lib/runtime/context/context-pack-builder.d.ts +15 -0
  22. package/lib/runtime/context/context-pack-builder.js +78 -0
  23. package/lib/runtime/events/catalog.d.ts +1 -1
  24. package/lib/runtime/events/catalog.js +5 -0
  25. package/lib/runtime/executor/action-tool-map.d.ts +3 -0
  26. package/lib/runtime/executor/action-tool-map.js +41 -0
  27. package/lib/runtime/executor/built-in-tools.d.ts +8 -0
  28. package/lib/runtime/executor/built-in-tools.js +267 -0
  29. package/lib/runtime/executor/index.d.ts +6 -0
  30. package/lib/runtime/executor/index.js +12 -0
  31. package/lib/runtime/executor/llm-task-executor.d.ts +29 -0
  32. package/lib/runtime/executor/llm-task-executor.js +138 -0
  33. package/lib/runtime/executor/node-prompt-builder.d.ts +3 -0
  34. package/lib/runtime/executor/node-prompt-builder.js +36 -0
  35. package/lib/runtime/executor/stream-completion.d.ts +38 -0
  36. package/lib/runtime/executor/stream-completion.js +105 -0
  37. package/lib/runtime/index.d.ts +1 -0
  38. package/lib/runtime/index.js +2 -0
  39. package/lib/runtime/models/failure.d.ts +5 -0
  40. package/lib/runtime/models/failure.js +2 -0
  41. package/lib/runtime/plugins/capability-adapter.d.ts +9 -0
  42. package/lib/runtime/plugins/capability-adapter.js +111 -8
  43. package/lib/runtime/plugins/plugin-abi.d.ts +8 -0
  44. package/lib/runtime/plugins/plugin-registry.d.ts +2 -1
  45. package/lib/runtime/plugins/plugin-registry.js +6 -1
  46. package/lib/runtime/reducers/run-state-reducer.js +39 -2
  47. package/lib/runtime/scheduler/scheduler.d.ts +14 -2
  48. package/lib/runtime/scheduler/scheduler.js +131 -11
  49. package/lib/runtime/verification/verification-manifest.d.ts +5 -2
  50. package/lib/sdk/index.cjs +10 -5
  51. package/lib/sdk/index.d.ts +21 -10
  52. package/oxe/agents/oxe-assumptions-analyzer.md +136 -0
  53. package/oxe/agents/oxe-codebase-mapper.md +142 -0
  54. package/oxe/agents/oxe-debugger.md +145 -0
  55. package/oxe/agents/oxe-executor.md +139 -0
  56. package/oxe/agents/oxe-integration-checker.md +142 -0
  57. package/oxe/agents/oxe-plan-checker.md +143 -0
  58. package/oxe/agents/oxe-planner.md +151 -0
  59. package/oxe/agents/oxe-research-synthesizer.md +146 -0
  60. package/oxe/agents/oxe-researcher.md +163 -0
  61. package/oxe/agents/oxe-ui-auditor.md +151 -0
  62. package/oxe/agents/oxe-ui-checker.md +157 -0
  63. package/oxe/agents/oxe-ui-researcher.md +179 -0
  64. package/oxe/agents/oxe-validation-auditor.md +154 -0
  65. package/oxe/agents/oxe-verifier.md +132 -0
  66. package/oxe/personas/README.md +91 -39
  67. package/oxe/personas/architect.md +149 -37
  68. package/oxe/personas/db-specialist.md +149 -36
  69. package/oxe/personas/debugger.md +155 -38
  70. package/oxe/personas/executor.md +164 -38
  71. package/oxe/personas/planner.md +165 -36
  72. package/oxe/personas/researcher.md +148 -35
  73. package/oxe/personas/ui-specialist.md +164 -36
  74. package/oxe/personas/verifier.md +174 -39
  75. package/oxe/templates/CONFIG.md +3 -3
  76. package/oxe/templates/EXECUTION-RUNTIME.template.md +1 -1
  77. package/oxe/templates/FIXTURE-PACK.template.json +29 -22
  78. package/oxe/templates/FIXTURE-PACK.template.md +20 -11
  79. package/oxe/templates/IMPLEMENTATION-PACK.template.json +55 -39
  80. package/oxe/templates/IMPLEMENTATION-PACK.template.md +28 -16
  81. package/oxe/templates/INVESTIGATION.template.md +38 -38
  82. package/oxe/templates/PLAN.template.md +63 -32
  83. package/oxe/templates/REFERENCE-ANCHORS.template.md +18 -14
  84. package/oxe/templates/RESEARCH.template.md +11 -11
  85. package/oxe/templates/SPEC.template.md +6 -6
  86. package/oxe/templates/SUMMARY.template.md +33 -3
  87. package/oxe/templates/config.template.json +1 -1
  88. package/oxe/workflows/debug.md +9 -7
  89. package/oxe/workflows/execute.md +31 -28
  90. package/oxe/workflows/forensics.md +5 -3
  91. package/oxe/workflows/milestone.md +12 -12
  92. package/oxe/workflows/next.md +1 -1
  93. package/oxe/workflows/plan.md +409 -132
  94. package/oxe/workflows/references/adaptive-discovery.md +27 -27
  95. package/oxe/workflows/references/flow-robustness-contract.md +80 -80
  96. package/oxe/workflows/references/session-path-resolution.md +71 -71
  97. package/oxe/workflows/references/workflow-runtime-contracts.json +127 -127
  98. package/oxe/workflows/scan.md +355 -69
  99. package/oxe/workflows/spec.md +302 -9
  100. package/oxe/workflows/ui-review.md +5 -4
  101. package/oxe/workflows/ui-spec.md +4 -3
  102. package/oxe/workflows/verify.md +12 -9
  103. package/oxe/workflows/workstream.md +16 -16
  104. package/package.json +1 -1
  105. package/packages/runtime/package.json +1 -1
  106. package/packages/runtime/src/compiler/graph-compiler.ts +40 -0
  107. package/packages/runtime/src/context/context-pack-builder.ts +80 -0
  108. package/packages/runtime/src/events/catalog.ts +5 -0
  109. package/packages/runtime/src/executor/action-tool-map.ts +46 -0
  110. package/packages/runtime/src/executor/built-in-tools.ts +276 -0
  111. package/packages/runtime/src/executor/index.ts +6 -0
  112. package/packages/runtime/src/executor/llm-task-executor.ts +194 -0
  113. package/packages/runtime/src/executor/node-prompt-builder.ts +45 -0
  114. package/packages/runtime/src/executor/stream-completion.ts +145 -0
  115. package/packages/runtime/src/index.ts +3 -0
  116. package/packages/runtime/src/models/failure.ts +11 -0
  117. package/packages/runtime/src/plugins/capability-adapter.ts +117 -10
  118. package/packages/runtime/src/plugins/plugin-abi.ts +9 -0
  119. package/packages/runtime/src/plugins/plugin-registry.ts +10 -1
  120. package/packages/runtime/src/reducers/run-state-reducer.ts +59 -2
  121. package/packages/runtime/src/scheduler/scheduler.ts +152 -14
  122. package/packages/runtime/src/verification/verification-manifest.ts +12 -8
  123. package/vscode-extension/oxe-agents-1.6.0.vsix +0 -0
  124. package/vscode-extension/oxe-agents-1.7.0.vsix +0 -0
  125. package/vscode-extension/package.json +1 -1
@@ -5,6 +5,7 @@ const path = require('path');
5
5
  const { spawnSync } = require('child_process');
6
6
 
7
7
  const oxeManifest = require('./oxe-manifest.cjs');
8
+ const runtimeSemantics = require('./oxe-runtime-semantics.cjs');
8
9
 
9
10
  const REQUIRED_RUNTIMES = [
10
11
  'cursor',
@@ -269,6 +270,8 @@ function loadRuntimeSmokeReport(projectRoot) {
269
270
  && item.oxe_present
270
271
  && item.workflow_resolution_ok
271
272
  && item.wrapper_drift_ok !== false
273
+ && item.extra_checks_ok !== false
274
+ && item.agent_checks_ok !== false
272
275
  && item.uninstall_ok
273
276
  );
274
277
  });
@@ -301,11 +304,42 @@ function readVersionSnapshot(projectRoot) {
301
304
  };
302
305
  }
303
306
 
307
+ function inspectCanonicalSource(projectRoot) {
308
+ const workflowsDir = path.join(projectRoot, 'oxe', 'workflows');
309
+ const referencesDir = path.join(workflowsDir, 'references');
310
+ const contractsPath = path.join(referencesDir, 'workflow-runtime-contracts.json');
311
+ const commandsDir = path.join(projectRoot, 'commands', 'oxe');
312
+ const workflowFiles = fs.existsSync(workflowsDir)
313
+ ? fs.readdirSync(workflowsDir).filter((name) => name.endsWith('.md'))
314
+ : [];
315
+ const registryIssues = runtimeSemantics.validateWorkflowContractsRegistry();
316
+ return {
317
+ workflowsDir,
318
+ referencesDir,
319
+ contractsPath,
320
+ commandsDir,
321
+ workflowsPresent: fs.existsSync(workflowsDir),
322
+ referencesPresent: fs.existsSync(referencesDir),
323
+ commandsPresent: fs.existsSync(commandsDir),
324
+ contractsPresent: fs.existsSync(contractsPath),
325
+ workflowCount: workflowFiles.length,
326
+ contractVersion: runtimeSemantics.CONTRACT_VERSION,
327
+ registryIssues,
328
+ ok: fs.existsSync(workflowsDir)
329
+ && fs.existsSync(referencesDir)
330
+ && fs.existsSync(commandsDir)
331
+ && fs.existsSync(contractsPath)
332
+ && workflowFiles.length > 0
333
+ && registryIssues.length === 0,
334
+ };
335
+ }
336
+
304
337
  function buildReleaseManifest(projectRoot, options = {}) {
305
338
  const packageRoot = path.resolve(options.packageRoot || projectRoot);
306
339
  const paths = releasePaths(projectRoot);
307
340
  const versions = readVersionSnapshot(projectRoot);
308
341
  const runtimeEntry = path.join(packageRoot, 'lib', 'runtime', 'index.js');
342
+ const canonicalSource = inspectCanonicalSource(projectRoot);
309
343
  const wrapperSync = options.skipWrapperSync ? {
310
344
  before: collectWrapperHashes(projectRoot),
311
345
  after: collectWrapperHashes(projectRoot),
@@ -313,6 +347,7 @@ function buildReleaseManifest(projectRoot, options = {}) {
313
347
  mismatches: [],
314
348
  ok: true,
315
349
  } : syncWrappers(projectRoot, packageRoot);
350
+ const semanticsAudit = runtimeSemantics.auditRuntimeTargets(projectRoot);
316
351
  const smoke = loadRuntimeSmokeReport(projectRoot);
317
352
  const recovery = loadRecoveryFixtureReport(projectRoot);
318
353
  const multiAgent = loadMultiAgentSoakReport(projectRoot);
@@ -332,6 +367,12 @@ function buildReleaseManifest(projectRoot, options = {}) {
332
367
  path: runtimeEntry,
333
368
  ok: fs.existsSync(runtimeEntry),
334
369
  },
370
+ canonical_source: canonicalSource,
371
+ semantics: {
372
+ contractVersion: runtimeSemantics.CONTRACT_VERSION,
373
+ registryPath: runtimeSemantics.CONTRACTS_PATH,
374
+ audit: semanticsAudit,
375
+ },
335
376
  wrappers: {
336
377
  hash_before_sync: wrapperSync.before,
337
378
  hash_after_sync: wrapperSync.after,
@@ -354,8 +395,8 @@ function buildReleaseManifest(projectRoot, options = {}) {
354
395
  return manifest;
355
396
  }
356
397
 
357
- function checkReleaseConsistency(projectRoot, options = {}) {
358
- const manifest = buildReleaseManifest(projectRoot, options);
398
+ function evaluateReleaseManifest(manifest, options = {}) {
399
+ const enforceSync = options.enforceSync !== false;
359
400
  const blockers = [];
360
401
  const warnings = [];
361
402
  const versions = manifest.versions;
@@ -378,10 +419,22 @@ function checkReleaseConsistency(projectRoot, options = {}) {
378
419
  if (!versions.changelog.date) blockers.push('CHANGELOG.md topo sem data');
379
420
  if (!versions.changelog.hasHighlights) blockers.push('CHANGELOG.md topo sem highlights');
380
421
  }
422
+ const canonical = manifest.canonical_source || {};
423
+ if (!canonical.ok) {
424
+ blockers.push('árvore canónica ausente ou inválida');
425
+ }
426
+ if (!canonical.workflowsPresent) blockers.push('oxe/workflows ausente');
427
+ if (!canonical.referencesPresent) blockers.push('oxe/workflows/references ausente');
428
+ if (!canonical.commandsPresent) blockers.push('commands/oxe ausente');
429
+ if (!canonical.contractsPresent) blockers.push('workflow-runtime-contracts.json ausente');
430
+ if (canonical.workflowCount === 0) blockers.push('oxe/workflows sem workflows canónicos');
431
+ if (Array.isArray(canonical.registryIssues) && canonical.registryIssues.length) {
432
+ blockers.push('workflow-runtime-contracts.json inválido');
433
+ }
381
434
  if (!manifest.runtime_compiled.ok) {
382
435
  blockers.push('runtime não compilado (lib/runtime/index.js ausente)');
383
436
  }
384
- if (!manifest.wrappers.sync.ok) {
437
+ if (enforceSync && !manifest.wrappers.sync.ok) {
385
438
  if (manifest.wrappers.sync.scripts.some((entry) => !entry.ok)) {
386
439
  blockers.push('sync de wrappers falhou');
387
440
  }
@@ -389,6 +442,10 @@ function checkReleaseConsistency(projectRoot, options = {}) {
389
442
  blockers.push('wrappers ficam dirty após sync-runtime-metadata/sync:cursor');
390
443
  }
391
444
  }
445
+ const semanticsAudit = manifest.semantics && manifest.semantics.audit;
446
+ if (!semanticsAudit || semanticsAudit.ok !== true) {
447
+ blockers.push('drift semântico entre workflows e wrappers');
448
+ }
392
449
  if (!manifest.reports.runtime_smoke.present || !manifest.reports.runtime_smoke.ok) {
393
450
  blockers.push('runtime smoke matrix incompleta ou com falhas');
394
451
  }
@@ -406,10 +463,23 @@ function checkReleaseConsistency(projectRoot, options = {}) {
406
463
  blockers,
407
464
  warnings,
408
465
  manifest,
409
- manifestPath: releasePaths(projectRoot).manifest,
466
+ manifestPath: releasePaths(manifest.project_root).manifest,
410
467
  };
411
468
  }
412
469
 
470
+ function checkReleaseConsistency(projectRoot, options = {}) {
471
+ const manifest = buildReleaseManifest(projectRoot, options);
472
+ return evaluateReleaseManifest(manifest, { enforceSync: true });
473
+ }
474
+
475
+ function inspectReleaseReadiness(projectRoot, options = {}) {
476
+ const manifest = buildReleaseManifest(projectRoot, {
477
+ ...options,
478
+ skipWrapperSync: true,
479
+ });
480
+ return evaluateReleaseManifest(manifest, { enforceSync: false });
481
+ }
482
+
413
483
  module.exports = {
414
484
  REQUIRED_RUNTIMES,
415
485
  WRAPPER_TARGETS,
@@ -419,5 +489,8 @@ module.exports = {
419
489
  loadRecoveryFixtureReport,
420
490
  loadMultiAgentSoakReport,
421
491
  buildReleaseManifest,
492
+ inspectCanonicalSource,
493
+ evaluateReleaseManifest,
494
+ inspectReleaseReadiness,
422
495
  checkReleaseConsistency,
423
496
  };
package/bin/oxe-cc.js CHANGED
@@ -1668,10 +1668,11 @@ function runStatusFull(target) {
1668
1668
  sp = oxeHealth.scopedOxePaths(target, activeSession);
1669
1669
  }
1670
1670
 
1671
- printSection('OXE ▸ status --full');
1672
- console.log(` ${c ? green : ''}Projeto:${c ? reset : ''} ${c ? cyan : ''}${target}${c ? reset : ''}`);
1673
- console.log(` ${c ? green : ''}Sessão:${c ? reset : ''} ${c ? cyan : ''}${activeSession || 'modo legado'}${c ? reset : ''}`);
1674
- console.log(` ${c ? green : ''}Fase:${c ? reset : ''} ${report.phase || ''}`);
1671
+ printSection('OXE ▸ status --full');
1672
+ console.log(` ${c ? green : ''}Projeto:${c ? reset : ''} ${c ? cyan : ''}${target}${c ? reset : ''}`);
1673
+ console.log(` ${c ? green : ''}Sessão:${c ? reset : ''} ${c ? cyan : ''}${activeSession || 'modo legado'}${c ? reset : ''}`);
1674
+ console.log(` ${c ? green : ''}Workspace mode:${c ? reset : ''} ${report.workspaceMode || 'oxe_project'}`);
1675
+ console.log(` ${c ? green : ''}Fase:${c ? reset : ''} ${report.phase || '—'}`);
1675
1676
 
1676
1677
  const healthColor = report.healthStatus === 'healthy' ? green : report.healthStatus === 'warning' ? yellow : red;
1677
1678
  console.log(` ${c ? green : ''}Saúde:${c ? reset : ''} ${c ? healthColor : ''}${report.healthStatus}${c ? reset : ''}`);
@@ -1701,23 +1702,40 @@ function runStatusFull(target) {
1701
1702
  console.log(` ${coverageCell(codebaseExists, 'codebase scan')} ${coverageCell(specExists, 'SPEC.md')} ${coverageCell(planExists, 'PLAN.md')} ${coverageCell(verifyExists, 'VERIFY.md')} ${coverageCell(lessonsExists, 'LESSONS.md')}`);
1702
1703
 
1703
1704
  // Readiness gate
1704
- const ready = specExists
1705
- && planExists
1706
- && report.executionRationalityReady
1707
- && !report.planWarn.length
1708
- && !report.runtimeWarn.length;
1709
- const gateColor = ready ? green : yellow;
1710
- console.log(`\n ${c ? yellow : ''}Readiness gate${c ? reset : ''}`);
1711
- console.log(` ${c ? gateColor : ''}${ready ? '✓ Pronto para executar' : '✗ Não pronto para executar'}${c ? reset : ''}`);
1712
- if (!specExists) console.log(` ${c ? dim : ''} • SPEC.md ausente — rode /oxe-spec${c ? reset : ''}`);
1713
- if (!planExists) console.log(` ${c ? dim : ''} PLAN.md ausente — rode /oxe-plan${c ? reset : ''}`);
1714
- if (report.planWarn.length) {
1715
- for (const w of report.planWarn) {
1716
- console.log(` ${c ? yellow : ''} • ${w}${c ? reset : ''}`);
1705
+ const packageMode = report.workspaceMode === 'product_package';
1706
+ const ready = packageMode
1707
+ ? Boolean(report.releaseReadiness && report.releaseReadiness.ok)
1708
+ : specExists
1709
+ && planExists
1710
+ && report.executionRationalityReady
1711
+ && !report.planWarn.length
1712
+ && !report.runtimeWarn.length;
1713
+ const gateColor = ready ? green : yellow;
1714
+ console.log(`\n ${c ? yellow : ''}Readiness gate${c ? reset : ''}`);
1715
+ console.log(` ${c ? gateColor : ''}${ready ? (packageMode ? '✓ Pronto para publicar' : '✓ Pronto para executar') : (packageMode ? '✗ Não pronto para publicar' : '✗ Não pronto para executar')}${c ? reset : ''}`);
1716
+ if (packageMode) {
1717
+ const releaseReadiness = report.releaseReadiness || { blockers: [], warnings: [] };
1718
+ if (Array.isArray(releaseReadiness.blockers) && releaseReadiness.blockers.length) {
1719
+ for (const blocker of releaseReadiness.blockers) {
1720
+ console.log(` ${c ? red : ''} • ${blocker}${c ? reset : ''}`);
1721
+ }
1722
+ }
1723
+ if (Array.isArray(releaseReadiness.warnings) && releaseReadiness.warnings.length) {
1724
+ for (const warning of releaseReadiness.warnings) {
1725
+ console.log(` ${c ? yellow : ''} • ${warning}${c ? reset : ''}`);
1726
+ }
1727
+ }
1728
+ } else {
1729
+ if (!specExists) console.log(` ${c ? dim : ''} • SPEC.md ausente — rode /oxe-spec${c ? reset : ''}`);
1730
+ if (!planExists) console.log(` ${c ? dim : ''} • PLAN.md ausente — rode /oxe-plan${c ? reset : ''}`);
1731
+ if (report.planWarn.length) {
1732
+ for (const w of report.planWarn) {
1733
+ console.log(` ${c ? yellow : ''} • ${w}${c ? reset : ''}`);
1734
+ }
1735
+ }
1736
+ if (planExists) {
1737
+ console.log(` ${c ? dim : ''} • Artefatos racionais:${c ? reset : ''} implementation=${report.implementationPackReady ? 'ok' : 'pendente'} · anchors=${report.referenceAnchorsReady ? 'ok' : 'pendente'} · fixtures=${report.fixturePackReady ? 'ok' : 'pendente'}`);
1717
1738
  }
1718
- }
1719
- if (planExists) {
1720
- console.log(` ${c ? dim : ''} • Artefatos racionais:${c ? reset : ''} implementation=${report.implementationPackReady ? 'ok' : 'pendente'} · anchors=${report.referenceAnchorsReady ? 'ok' : 'pendente'} · fixtures=${report.fixturePackReady ? 'ok' : 'pendente'}`);
1721
1739
  }
1722
1740
 
1723
1741
  // Active run summary
@@ -1804,7 +1822,7 @@ function runStatusFull(target) {
1804
1822
  }
1805
1823
 
1806
1824
  // Plan self-evaluation
1807
- if (report.planSelfEvaluation) {
1825
+ if (!packageMode && report.planSelfEvaluation) {
1808
1826
  const pse = report.planSelfEvaluation;
1809
1827
  const threshold = report.planConfidenceThreshold || 90;
1810
1828
  console.log(`\n ${c ? yellow : ''}Autoavaliação do plano${c ? reset : ''}`);
@@ -1840,11 +1858,13 @@ function runStatus(target, opts = {}) {
1840
1858
  const next = report.next;
1841
1859
 
1842
1860
  if (opts.json) {
1843
- /** @type {Record<string, unknown>} */
1844
- const payload = {
1845
- oxeStatusSchema: 5,
1846
- projectRoot: path.resolve(target),
1847
- nextStep: report.next.step,
1861
+ /** @type {Record<string, unknown>} */
1862
+ const payload = {
1863
+ oxeStatusSchema: 5,
1864
+ projectRoot: path.resolve(target),
1865
+ workspaceMode: report.workspaceMode || 'oxe_project',
1866
+ releaseReadiness: report.releaseReadiness || null,
1867
+ nextStep: report.next.step,
1848
1868
  cursorCmd: report.next.cursorCmd,
1849
1869
  reason: report.next.reason,
1850
1870
  artifacts: report.next.artifacts,
@@ -1921,9 +1941,10 @@ function runStatus(target, opts = {}) {
1921
1941
  return;
1922
1942
  }
1923
1943
 
1924
- printSection('OXE ▸ status');
1925
- const c = useAnsiColors();
1926
- console.log(` ${c ? green : ''}Projeto:${c ? reset : ''} ${c ? cyan : ''}${target}${c ? reset : ''}`);
1944
+ printSection('OXE ▸ status');
1945
+ const c = useAnsiColors();
1946
+ console.log(` ${c ? green : ''}Projeto:${c ? reset : ''} ${c ? cyan : ''}${target}${c ? reset : ''}`);
1947
+ console.log(` ${c ? dim : ''}Workspace mode:${c ? reset : ''} ${report.workspaceMode || 'oxe_project'}`);
1927
1948
 
1928
1949
  const wfTgt = oxeWorkflows.resolveWorkflowsDir(target);
1929
1950
  if (!wfTgt) {
@@ -1954,16 +1975,24 @@ function runStatus(target, opts = {}) {
1954
1975
  }
1955
1976
 
1956
1977
  // Explicit blockage diagnosis
1957
- const specMissing = !fs.existsSync(path.join(target, '.oxe', 'SPEC.md'));
1958
- const planMissing = !fs.existsSync(path.join(target, '.oxe', 'PLAN.md'));
1959
- const verifyMissing = !fs.existsSync(path.join(target, '.oxe', 'VERIFY.md'));
1960
- if (specMissing) {
1961
- console.log(` ${c ? yellow : ''}⚠ Bloqueio:${c ? reset : ''} SPEC.md ausente — rode ${c ? cyan : ''}/oxe-spec${c ? reset : ''} antes de planejar`);
1962
- } else if (planMissing) {
1963
- console.log(` ${c ? yellow : ''}⚠ Bloqueio:${c ? reset : ''} PLAN.md ausente — rode ${c ? cyan : ''}/oxe-plan${c ? reset : ''}`);
1964
- } else if (verifyMissing && !planMissing) {
1965
- console.log(` ${c ? dim : ''}Obs.:${c ? reset : ''} VERIFY.md ainda não gerado — rode ${c ? cyan : ''}/oxe-verify${c ? reset : ''} após executar`);
1966
- }
1978
+ const packageMode = report.workspaceMode === 'product_package';
1979
+ const specMissing = !fs.existsSync(path.join(target, '.oxe', 'SPEC.md'));
1980
+ const planMissing = !fs.existsSync(path.join(target, '.oxe', 'PLAN.md'));
1981
+ const verifyMissing = !fs.existsSync(path.join(target, '.oxe', 'VERIFY.md'));
1982
+ if (packageMode) {
1983
+ const releaseReadiness = report.releaseReadiness || { ok: false, blockers: [], warnings: [] };
1984
+ if (!releaseReadiness.ok && Array.isArray(releaseReadiness.blockers) && releaseReadiness.blockers.length) {
1985
+ console.log(` ${c ? yellow : ''} Release blockers:${c ? reset : ''} ${releaseReadiness.blockers[0]}`);
1986
+ } else if (Array.isArray(releaseReadiness.warnings) && releaseReadiness.warnings.length) {
1987
+ console.log(` ${c ? dim : ''}Obs.:${c ? reset : ''} release warnings ativas — ${releaseReadiness.warnings[0]}`);
1988
+ }
1989
+ } else if (specMissing) {
1990
+ console.log(` ${c ? yellow : ''}⚠ Bloqueio:${c ? reset : ''} SPEC.md ausente — rode ${c ? cyan : ''}/oxe-spec${c ? reset : ''} antes de planejar`);
1991
+ } else if (planMissing) {
1992
+ console.log(` ${c ? yellow : ''}⚠ Bloqueio:${c ? reset : ''} PLAN.md ausente — rode ${c ? cyan : ''}/oxe-plan${c ? reset : ''}`);
1993
+ } else if (verifyMissing && !planMissing) {
1994
+ console.log(` ${c ? dim : ''}Obs.:${c ? reset : ''} VERIFY.md ainda não gerado — rode ${c ? cyan : ''}/oxe-verify${c ? reset : ''} após executar`);
1995
+ }
1967
1996
 
1968
1997
  if (opts.hints) {
1969
1998
  console.log(`\n ${c ? cyan : ''}Lembretes (rotina OXE)${reset}`);
@@ -2701,10 +2730,14 @@ function runInstall(opts) {
2701
2730
  copyDir(path.join(PKG_ROOT, 'oxe', 'templates'), path.join(nested, 'templates'), copyOpts, true);
2702
2731
  // Personas: copiar para .oxe/personas/ (não sobrescreve personalizações do projeto)
2703
2732
  const personasSrc = path.join(PKG_ROOT, 'oxe', 'personas');
2704
- if (fs.existsSync(personasSrc)) {
2705
- copyDir(personasSrc, path.join(nested, 'personas'), copyOpts, false);
2706
- }
2707
- // Schemas: copiar para .oxe/schemas/ (ex.: plan-agents.schema.json para validação local)
2733
+ if (fs.existsSync(personasSrc)) {
2734
+ copyDir(personasSrc, path.join(nested, 'personas'), copyOpts, false);
2735
+ }
2736
+ const agentsSrc = path.join(PKG_ROOT, 'oxe', 'agents');
2737
+ if (fs.existsSync(agentsSrc)) {
2738
+ copyDir(agentsSrc, path.join(nested, 'agents'), copyOpts, false);
2739
+ }
2740
+ // Schemas: copiar para .oxe/schemas/ (ex.: plan-agents.schema.json para validação local)
2708
2741
  const schemasSrc = path.join(PKG_ROOT, 'oxe', 'schemas');
2709
2742
  if (fs.existsSync(schemasSrc)) {
2710
2743
  copyDir(schemasSrc, path.join(nested, 'schemas'), copyOpts, false);
@@ -2719,10 +2752,11 @@ function runInstall(opts) {
2719
2752
  if (fs.existsSync(cRules)) copyDir(cRules, path.join(cursorBase, 'rules'), copyOpts, idePathRewrite);
2720
2753
  }
2721
2754
 
2722
- const doAgentClis = opts.copilotCli || opts.allAgents;
2723
- if (doAgentClis) {
2724
- const cCmd = path.join(PKG_ROOT, '.cursor', 'commands');
2725
- const clBase = installClaudeBase(opts);
2755
+ const doAgentClis = opts.copilotCli || opts.allAgents;
2756
+ if (doAgentClis) {
2757
+ const cCmd = path.join(PKG_ROOT, '.cursor', 'commands');
2758
+ const canonicalAgents = path.join(PKG_ROOT, 'oxe', 'agents');
2759
+ const clBase = installClaudeBase(opts);
2726
2760
  const cpHome = installCopilotCliHome(opts);
2727
2761
  const clDest = path.join(clBase, 'commands');
2728
2762
  const cpCmdDest = path.join(cpHome, 'commands');
@@ -2731,16 +2765,24 @@ function runInstall(opts) {
2731
2765
  console.log(
2732
2766
  ` ${c ? green : ''}cli${c ? reset : ''} ${c ? dim : ''}Claude/Copilot: skills em${c ? reset : ''} ${c ? cyan : ''}${cpSkills}${c ? reset : ''} ${c ? dim : ''}(/oxe, /oxe-scan, …); comandos .md:${c ? reset : ''} ${c ? cyan : ''}${clDest}${c ? reset : ''} ${c ? dim : ''}+${c ? reset : ''} ${c ? cyan : ''}${cpCmdDest}${c ? reset : ''}`
2733
2767
  );
2734
- installOxeCopilotCliSkills(cCmd, cpHome, copyOpts, idePathRewrite);
2735
- copyDir(cCmd, clDest, copyOpts, idePathRewrite);
2736
- copyDir(cCmd, cpCmdDest, copyOpts, idePathRewrite);
2737
- } else {
2768
+ installOxeCopilotCliSkills(cCmd, cpHome, copyOpts, idePathRewrite);
2769
+ copyDir(cCmd, clDest, copyOpts, idePathRewrite);
2770
+ copyDir(cCmd, cpCmdDest, copyOpts, idePathRewrite);
2771
+ if (fs.existsSync(canonicalAgents)) {
2772
+ oxeAgentInstall.installCanonicalAgentMarkdowns(
2773
+ canonicalAgents,
2774
+ agentPaths.claudeAgentsDir,
2775
+ copyOpts
2776
+ );
2777
+ }
2778
+ } else {
2738
2779
  console.warn(`${yellow}aviso:${reset} pasta ausente ${cCmd} — ignorando comandos CLI`);
2739
2780
  }
2740
2781
  }
2741
2782
 
2742
- const cCmdAgents = path.join(PKG_ROOT, '.cursor', 'commands');
2743
- if (fs.existsSync(cCmdAgents) && (opts.allAgents || anyGranularAgent(opts))) {
2783
+ const cCmdAgents = path.join(PKG_ROOT, '.cursor', 'commands');
2784
+ const canonicalAgents = path.join(PKG_ROOT, 'oxe', 'agents');
2785
+ if (fs.existsSync(cCmdAgents) && (opts.allAgents || anyGranularAgent(opts))) {
2744
2786
  const logO = (d) => console.log(`${dim}omitido${reset} ${d} (já existe — use --force)`);
2745
2787
  const logW = (msg) => console.log(`${dim}agents${reset} ${msg}`);
2746
2788
  console.log(
@@ -2758,27 +2800,41 @@ function runInstall(opts) {
2758
2800
  if (opts.agentCodex || opts.allAgents) {
2759
2801
  oxeAgentInstall.installCodexPrompts(cCmdAgents, agentPaths, copyOpts, idePathRewrite, logO, logW);
2760
2802
  }
2761
- if (opts.agentAntigravity || opts.allAgents) {
2762
- oxeAgentInstall.installSkillTreeFromCursorCommands(
2803
+ if (opts.agentAntigravity || opts.allAgents) {
2804
+ oxeAgentInstall.installSkillTreeFromCursorCommands(
2763
2805
  cCmdAgents,
2764
2806
  agentPaths.antigravitySkillsRoot,
2765
2807
  copyOpts,
2766
2808
  idePathRewrite,
2767
2809
  logO,
2768
- logW
2769
- );
2770
- }
2771
- if (opts.agentCodex || opts.allAgents) {
2772
- oxeAgentInstall.installSkillTreeFromCursorCommands(
2810
+ logW
2811
+ );
2812
+ oxeAgentInstall.installCanonicalAgentSkills(
2813
+ canonicalAgents,
2814
+ agentPaths.antigravitySkillsRoot,
2815
+ copyOpts,
2816
+ logO,
2817
+ logW
2818
+ );
2819
+ }
2820
+ if (opts.agentCodex || opts.allAgents) {
2821
+ oxeAgentInstall.installSkillTreeFromCursorCommands(
2773
2822
  cCmdAgents,
2774
2823
  agentPaths.codexAgentsSkillsRoot,
2775
2824
  copyOpts,
2776
2825
  idePathRewrite,
2777
2826
  logO,
2778
- logW
2779
- );
2780
- }
2781
- }
2827
+ logW
2828
+ );
2829
+ oxeAgentInstall.installCanonicalAgentSkills(
2830
+ canonicalAgents,
2831
+ agentPaths.codexAgentsSkillsRoot,
2832
+ copyOpts,
2833
+ logO,
2834
+ logW
2835
+ );
2836
+ }
2837
+ }
2782
2838
 
2783
2839
  if (opts.copilot) {
2784
2840
  const gh = path.join(PKG_ROOT, '.github');
@@ -2868,10 +2924,11 @@ function runInstall(opts) {
2868
2924
  addTracked(copilotPromptsDirPath(opts), (n) => n.startsWith('oxe-'));
2869
2925
  trackFile(copilotWorkspaceManifestPath(opts));
2870
2926
  }
2871
- trackFile(runtimeSemanticsManifestPath(opts));
2872
- if (opts.copilotCli || opts.allAgents) {
2873
- addTracked(path.join(installClaudeBase(opts), 'commands'), (n) => oxeAgentInstall.isOxeCommandMarkdownName(n));
2874
- addTracked(path.join(cpCliHome, 'commands'), (n) => oxeAgentInstall.isOxeCommandMarkdownName(n));
2927
+ trackFile(runtimeSemanticsManifestPath(opts));
2928
+ if (opts.copilotCli || opts.allAgents) {
2929
+ addTracked(path.join(installClaudeBase(opts), 'commands'), (n) => oxeAgentInstall.isOxeCommandMarkdownName(n));
2930
+ addTracked(agentPaths.claudeAgentsDir, (n) => oxeAgentInstall.isOxeAgentMarkdownName(n));
2931
+ addTracked(path.join(cpCliHome, 'commands'), (n) => oxeAgentInstall.isOxeCommandMarkdownName(n));
2875
2932
  const skRoot = path.join(cpCliHome, 'skills');
2876
2933
  if (fs.existsSync(skRoot)) {
2877
2934
  for (const sub of fs.readdirSync(skRoot, { withFileTypes: true })) {
@@ -3007,8 +3064,8 @@ function uninstallLocalIdeFromProject(u, removedPaths) {
3007
3064
  track(manifest);
3008
3065
  }
3009
3066
 
3010
- if (u.copilotCli || u.allAgents) {
3011
- for (const base of [path.join(proj, '.claude'), path.join(proj, '.copilot')]) {
3067
+ if (u.copilotCli || u.allAgents) {
3068
+ for (const base of [path.join(proj, '.claude'), path.join(proj, '.copilot')]) {
3012
3069
  const cmdDir = path.join(base, 'commands');
3013
3070
  if (!fs.existsSync(cmdDir)) continue;
3014
3071
  for (const name of fs.readdirSync(cmdDir)) {
@@ -3017,9 +3074,19 @@ function uninstallLocalIdeFromProject(u, removedPaths) {
3017
3074
  unlinkQuiet(p, u);
3018
3075
  track(p);
3019
3076
  }
3020
- }
3021
- }
3022
- const skillsRoot = path.join(proj, '.copilot', 'skills');
3077
+ }
3078
+ }
3079
+ const claudeAgentsDir = path.join(proj, '.claude', 'agents');
3080
+ if (fs.existsSync(claudeAgentsDir)) {
3081
+ for (const name of fs.readdirSync(claudeAgentsDir)) {
3082
+ if (oxeAgentInstall.isOxeAgentMarkdownName(name)) {
3083
+ const p = path.join(claudeAgentsDir, name);
3084
+ unlinkQuiet(p, u);
3085
+ track(p);
3086
+ }
3087
+ }
3088
+ }
3089
+ const skillsRoot = path.join(proj, '.copilot', 'skills');
3023
3090
  if (fs.existsSync(skillsRoot)) {
3024
3091
  for (const ent of fs.readdirSync(skillsRoot, { withFileTypes: true })) {
3025
3092
  if (!ent.isDirectory() || !/^oxe($|-)/.test(ent.name)) continue;
@@ -3342,8 +3409,8 @@ function runUninstall(u) {
3342
3409
  cleanupLegacyCopilotVsCode(ideOpts, u, removedPaths);
3343
3410
  }
3344
3411
 
3345
- if (u.copilotCli) {
3346
- for (const base of [claudeUserDir(ideOpts), copilotUserDir(ideOpts)]) {
3412
+ if (u.copilotCli) {
3413
+ for (const base of [claudeUserDir(ideOpts), copilotUserDir(ideOpts)]) {
3347
3414
  const cmdDir = path.join(base, 'commands');
3348
3415
  if (!fs.existsSync(cmdDir)) continue;
3349
3416
  for (const name of fs.readdirSync(cmdDir)) {
@@ -3352,9 +3419,19 @@ function runUninstall(u) {
3352
3419
  unlinkQuiet(p, u);
3353
3420
  removedPaths.push(p);
3354
3421
  }
3355
- }
3356
- }
3357
- const skillsRoot = path.join(copilotUserDir(ideOpts), 'skills');
3422
+ }
3423
+ }
3424
+ const claudeAgentsDir = path.join(claudeUserDir(ideOpts), 'agents');
3425
+ if (fs.existsSync(claudeAgentsDir)) {
3426
+ for (const name of fs.readdirSync(claudeAgentsDir)) {
3427
+ if (oxeAgentInstall.isOxeAgentMarkdownName(name)) {
3428
+ const p = path.join(claudeAgentsDir, name);
3429
+ unlinkQuiet(p, u);
3430
+ removedPaths.push(p);
3431
+ }
3432
+ }
3433
+ }
3434
+ const skillsRoot = path.join(copilotUserDir(ideOpts), 'skills');
3358
3435
  if (fs.existsSync(skillsRoot)) {
3359
3436
  for (const ent of fs.readdirSync(skillsRoot, { withFileTypes: true })) {
3360
3437
  if (!ent.isDirectory() || !/^oxe($|-)/.test(ent.name)) continue;
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  name: oxe:debug
3
- description: "[DEPRECATED v1.1.0] Incorporado por /oxe-execute. Use: /oxe-execute --debug"
3
+ description: >
4
+ Diagnóstica falhas com metodologia RCA: hipóteses explícitas → evidência → reprodução controlada
5
+ → causa raiz → hotfix mínimo. Não corrige sintomas — rasteia até a causa raiz antes de propor
6
+ qualquer mudança. Documenta o diagnóstico completo em DEBUG.md (sintoma, hipóteses testadas,
7
+ root cause, hotfix aplicado, evidência de resolução). Após o hotfix, orienta execução de
8
+ /oxe-verify para confirmar que os critérios A* afetados ainda passam.
4
9
  argument-hint: "[Tn ou erro/stack]"
5
10
  allowed-tools:
6
11
  - Read
@@ -1,7 +1,12 @@
1
1
  ---
2
2
  name: oxe:discuss
3
- description: Perguntas objetivas antes do plano — .oxe/DISCUSS.md
4
- argument-hint: "[contexto ou respostas]"
3
+ description: >
4
+ Conduz sessão estruturada de resolução de decisões técnicas antes do planejamento. Identifica
5
+ trade-offs relevantes, apresenta alternativas com critérios objetivos, registra a decisão
6
+ escolhida com motivo e impacto em DISCUSS.md como D-NN. Cada D-NN fechado aqui é vinculado a
7
+ tarefas Tn no PLAN.md e verificado pelo Verificador após execução. Usar quando: `discuss_before_plan`
8
+ está ativo no config, há decisão arquitetural aberta, ou o Arquiteto sinalizou bloqueio.
9
+ argument-hint: "[decisão a tomar | contexto do trade-off | D-NN a reabrir]"
5
10
  allowed-tools:
6
11
  - Read
7
12
  - Bash
@@ -1,7 +1,12 @@
1
1
  ---
2
2
  name: oxe:execute
3
- description: "Executar plano A/B/C. Flags: --note (obs), --debug, --deep-diagnosis, --checkpoint '<nome>', --iterative"
4
- argument-hint: "[A|B|C | --note 'texto' | --debug | --deep-diagnosis | --checkpoint '<nome>' | --iterative]"
3
+ description: >
4
+ Executa as tarefas do PLAN.md onda por onda, com write set mínimo e verificação obrigatória
5
+ antes de avançar. Compila o grafo de execução via LlmTaskExecutor, respeita dependências entre
6
+ tarefas, particiona tools idempotentes (paralelas) e mutáveis (seriais), e registra evidência
7
+ auditável por Tn. Modo --debug ativa diagnóstico de falha inline. --checkpoint '<nome>' cria
8
+ ponto de restauração antes de ondas de alto risco.
9
+ argument-hint: "[onda|Tn | --debug | --deep-diagnosis | --checkpoint '<nome>' | --note 'texto' | --iterative]"
5
10
  allowed-tools:
6
11
  - Read
7
12
  - Bash
@@ -1,7 +1,12 @@
1
1
  ---
2
2
  name: oxe:plan-agent
3
- description: Gera PLAN.md e plan-agents.json (blueprint de agentes e ondas)
4
- argument-hint: "[--replan se existe PLAN.md]"
3
+ description: >
4
+ Gera PLAN.md e plan-agents.json blueprint de execução multi-agente com ondas paralelas.
5
+ Cada agente recebe persona (executor, db-specialist, ui-specialist, etc.), escopo de tarefas,
6
+ dependências entre agentes e lifecycle state rastreável. Ideal para planos com 3+ domínios
7
+ distintos (backend, frontend, banco) onde paralelismo real de agentes é possível. --replan
8
+ regenera o runId, preserva tarefas concluídas e alinha STATE.md.
9
+ argument-hint: "[--replan | <contexto adicional de domínios>]"
5
10
  allowed-tools:
6
11
  - Read
7
12
  - Write
@@ -1,7 +1,12 @@
1
1
  ---
2
2
  name: oxe:plan
3
- description: Gera PLAN.md a partir da SPEC com tarefas atômicas e verificação por item
4
- argument-hint: "[--replan se existe PLAN.md]"
3
+ description: >
4
+ Decompõe os critérios A* da SPEC em tarefas GraphNode com mutation_scope explícito, action_type
5
+ correto e verify command determinístico. Projeta ondas que maximizam paralelismo respeitando
6
+ dependências e mutation_scope disjunto. Aplica rubrica de confiança em 6 dimensões e quality gate
7
+ de 19 itens. Gera IMPLEMENTATION-PACK, REFERENCE-ANCHORS e FIXTURE-PACK junto com o PLAN.md.
8
+ --replan preserva histórico e atualiza tarefas sem apagar o trabalho anterior.
9
+ argument-hint: "[--replan | --agents (gera blueprint de agentes junto)]"
5
10
  allowed-tools:
6
11
  - Read
7
12
  - Write
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  name: oxe:scan
3
- description: "[DEPRECATED v1.1.0] Incorporado por /oxe-spec. Use: /oxe-spec --refresh (incremental) ou /oxe-spec --full (completo)"
3
+ description: >
4
+ Analisa o codebase e produz os sete documentos em .oxe/codebase/ (OVERVIEW, STACK, STRUCTURE,
5
+ TESTING, INTEGRATIONS, CONVENTIONS, CONCERNS). Detecta padrão arquitetural dominante, domínios
6
+ funcionais e sugere profile scale-adaptive. Modo bootstrap (do zero) ou refresh (incremental).
7
+ Cada documento passa por gate de qualidade com critérios e anti-padrões por tipo. O mapa
8
+ resultante alimenta spec, plan e o contexto do LlmTaskExecutor.
4
9
  argument-hint: "[área opcional, ex. auth, api]"
5
10
  allowed-tools:
6
11
  - Read
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  name: oxe:spec
3
- description: "Spec em 5 fases. Flags: --refresh (scan incremental), --full (scan completo), --research (spike), --ui (gera UI-SPEC)"
3
+ description: >
4
+ Conduz as 5 fases do processo de especificação: perguntas (blocos coesos por domínio), pesquisa
5
+ (investigação de incertezas técnicas), requisitos (tabela R-ID com v1/v2/fora e critérios A*
6
+ verificáveis), elevação de robustez (checklist de segurança por domínio AUTH/API/DB/FRONTEND/FILE),
7
+ e aprovação com roteiro ROADMAP.md. Flags: --refresh (atualiza codebase/ antes), --full (scan
8
+ completo), --research (Fase 2 explícita), --ui (gera UI-SPEC.md ao final).
4
9
  argument-hint: "[descrição da feature | --refresh | --full | --research | --ui]"
5
10
  allowed-tools:
6
11
  - Read
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  name: oxe:verify
3
- description: "Valida e fecha o ciclo (retro automática). Flags: --gaps, --security, --ui, --pr, --diff, --skip-retro"
3
+ description: >
4
+ Audita a implementação em quatro camadas: pré-execução (ambiente e commits), por tarefa Tn
5
+ (verify command de cada task), por critério A* (cobertura completa da SPEC), e fidelidade de
6
+ decisões D-NN. Produz VERIFY.md com evidência observável por critério, classifica findings por
7
+ severidade, gera checklist UAT para validação humana, e fecha o ciclo com retro automática.
8
+ --security adiciona auditoria de segurança baseline. --gaps foca em A* sem cobertura.
4
9
  argument-hint: "[Tn | --gaps | --security | --ui | --pr | --diff branchA...branchB | --skip-retro]"
5
10
  allowed-tools:
6
11
  - Read