oxe-cc 1.5.1 → 1.6.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.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +27 -0
- package/README.md +16 -14
- package/bin/lib/oxe-dashboard.cjs +21 -5
- package/bin/lib/oxe-project-health.cjs +120 -42
- package/bin/lib/oxe-release.cjs +76 -4
- package/bin/oxe-cc.js +68 -39
- package/docs/RELEASE-READINESS.md +8 -0
- package/docs/RUNTIME-SMOKE-MATRIX.md +9 -2
- package/lib/sdk/index.cjs +10 -5
- package/lib/sdk/index.d.ts +21 -10
- package/oxe/templates/CONFIG.md +3 -3
- package/oxe/templates/EXECUTION-RUNTIME.template.md +1 -1
- package/oxe/templates/FIXTURE-PACK.template.json +34 -34
- package/oxe/templates/FIXTURE-PACK.template.md +21 -21
- package/oxe/templates/IMPLEMENTATION-PACK.template.json +52 -52
- package/oxe/templates/IMPLEMENTATION-PACK.template.md +36 -36
- package/oxe/templates/INVESTIGATION.template.md +38 -38
- package/oxe/templates/PLAN.template.md +46 -46
- package/oxe/templates/REFERENCE-ANCHORS.template.md +24 -24
- package/oxe/templates/RESEARCH.template.md +11 -11
- package/oxe/templates/SPEC.template.md +6 -6
- package/oxe/templates/SUMMARY.template.md +20 -20
- package/oxe/templates/config.template.json +1 -1
- package/oxe/workflows/execute.md +36 -36
- package/oxe/workflows/milestone.md +12 -12
- package/oxe/workflows/next.md +1 -1
- package/oxe/workflows/plan.md +132 -132
- package/oxe/workflows/references/adaptive-discovery.md +27 -27
- package/oxe/workflows/references/flow-robustness-contract.md +80 -80
- package/oxe/workflows/references/session-path-resolution.md +71 -71
- package/oxe/workflows/references/workflow-runtime-contracts.json +127 -127
- package/oxe/workflows/verify.md +4 -4
- package/oxe/workflows/workstream.md +16 -16
- package/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/vscode-extension/oxe-agents-1.6.0.vsix +0 -0
- package/vscode-extension/package.json +1 -1
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 : ''}
|
|
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
|
|
1705
|
-
|
|
1706
|
-
&& report.
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
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
|
-
|
|
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
|
|
1958
|
-
const
|
|
1959
|
-
const
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
}
|
|
1965
|
-
|
|
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}`);
|
|
@@ -13,10 +13,13 @@ npx oxe-cc doctor --release --write-manifest
|
|
|
13
13
|
|
|
14
14
|
O `doctor --release` deve bloquear a publicação quando encontrar:
|
|
15
15
|
|
|
16
|
+
- árvore canónica `oxe/workflows/`, `oxe/workflows/references/` ou `commands/oxe/` ausente
|
|
17
|
+
- `workflow-runtime-contracts.json` ausente ou inválido
|
|
16
18
|
- drift de versão entre `package.json`, `packages/runtime/package.json`, `vscode-extension/package.json`, `README.md`, `CHANGELOG.md` e banner
|
|
17
19
|
- topo do `CHANGELOG` ausente, sem data ou sem highlights
|
|
18
20
|
- runtime não compilado em `lib/runtime/index.js`
|
|
19
21
|
- wrappers dirty após `sync-runtime-metadata` e `sync:cursor`
|
|
22
|
+
- drift semântico entre workflows canónicos e superfícies geradas
|
|
20
23
|
- ausência ou falha dos relatórios obrigatórios da release
|
|
21
24
|
|
|
22
25
|
## Relatórios obrigatórios
|
|
@@ -44,3 +47,8 @@ O pipeline de CI e o pipeline de release devem rodar o mesmo gate:
|
|
|
44
47
|
3. `npm run release:doctor`
|
|
45
48
|
|
|
46
49
|
Se qualquer etapa falhar, a release não está pronta.
|
|
50
|
+
|
|
51
|
+
## Observações operacionais
|
|
52
|
+
|
|
53
|
+
- `status` e `status --full` distinguem agora `workspaceMode: product_package` de `workspaceMode: oxe_project`.
|
|
54
|
+
- No repositório do pacote, readiness passa a ser de publicação; o CLI deixa de bloquear por ausência de `PLAN.md` executável quando não há ciclo ativo declarado.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# OXE — Runtime Smoke Matrix
|
|
2
2
|
|
|
3
|
-
> Estado de suporte por runtime de IA. Atualizado em v1.
|
|
3
|
+
> Estado de suporte por runtime de IA. Atualizado em v1.6.0.
|
|
4
4
|
>
|
|
5
5
|
> `✓` = suportado e testado | `~` = suportado parcialmente | `✗` = não suportado | `?` = não testado
|
|
6
6
|
|
|
@@ -60,11 +60,18 @@ Este documento descreve a matrix estável da release. O artefato operacional con
|
|
|
60
60
|
|
|
61
61
|
### Codex CLI
|
|
62
62
|
|
|
63
|
-
- Lê `.
|
|
63
|
+
- Lê `.codex/prompts/` como entrypoint e depende também de skills em `.agents/skills/oxe/`
|
|
64
|
+
- A smoke matrix desta release valida **prompts e skills**; falha se um dos dois lados estiver ausente ou sem a política de resolução de workflow
|
|
64
65
|
- `verify` parcial: gera VERIFY.md mas evidências são menos detalhadas (sem análise de AST)
|
|
65
66
|
- `runtime-first` não suportado: Codex CLI não tem acesso a subprocessos Node
|
|
66
67
|
- **Limitação:** não suporta contexto multi-arquivo simultâneo em tasks longas
|
|
67
68
|
|
|
69
|
+
### Escopo de instalação
|
|
70
|
+
|
|
71
|
+
- `--local` define o layout do repositório (`oxe/` + `.oxe/` vs só `.oxe/`)
|
|
72
|
+
- `--ide-local` define que a integração do runtime deve ser instalada no próprio projeto
|
|
73
|
+
- Para Codex, `install --codex --ide-local` é o fluxo correto quando a intenção é materializar `.codex/` e `.agents/` no repositório atual
|
|
74
|
+
|
|
68
75
|
### Gemini CLI
|
|
69
76
|
|
|
70
77
|
- `plan` e `execute` parciais: segue o fluxo mas pode divergir dos critérios A* do SPEC
|
package/lib/sdk/index.cjs
CHANGED
|
@@ -552,11 +552,13 @@ module.exports = {
|
|
|
552
552
|
deprecateLowEffectiveness,
|
|
553
553
|
|
|
554
554
|
/** Estado do projeto, SPEC/PLAN, fase, config. */
|
|
555
|
-
health: {
|
|
556
|
-
loadOxeConfigMerged: health.loadOxeConfigMerged,
|
|
557
|
-
validateConfigShape: health.validateConfigShape,
|
|
558
|
-
buildHealthReport: health.buildHealthReport,
|
|
559
|
-
|
|
555
|
+
health: {
|
|
556
|
+
loadOxeConfigMerged: health.loadOxeConfigMerged,
|
|
557
|
+
validateConfigShape: health.validateConfigShape,
|
|
558
|
+
buildHealthReport: health.buildHealthReport,
|
|
559
|
+
detectWorkspaceMode: health.detectWorkspaceMode,
|
|
560
|
+
shouldSuppressExecutionWorkspaceGates: health.shouldSuppressExecutionWorkspaceGates,
|
|
561
|
+
suggestNextStep: health.suggestNextStep,
|
|
560
562
|
oxePaths: health.oxePaths,
|
|
561
563
|
parseStatePhase: health.parseStatePhase,
|
|
562
564
|
parseLastScanDate: health.parseLastScanDate,
|
|
@@ -658,6 +660,9 @@ module.exports = {
|
|
|
658
660
|
loadRecoveryFixtureReport: release.loadRecoveryFixtureReport,
|
|
659
661
|
loadMultiAgentSoakReport: release.loadMultiAgentSoakReport,
|
|
660
662
|
buildReleaseManifest: release.buildReleaseManifest,
|
|
663
|
+
inspectCanonicalSource: release.inspectCanonicalSource,
|
|
664
|
+
evaluateReleaseManifest: release.evaluateReleaseManifest,
|
|
665
|
+
inspectReleaseReadiness: release.inspectReleaseReadiness,
|
|
661
666
|
checkReleaseConsistency: release.checkReleaseConsistency,
|
|
662
667
|
},
|
|
663
668
|
|
package/lib/sdk/index.d.ts
CHANGED
|
@@ -160,6 +160,8 @@ export interface MultiAgentStatusSummary {
|
|
|
160
160
|
summary?: Record<string, unknown> | null;
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
+
export type WorkspaceMode = 'product_package' | 'oxe_project';
|
|
164
|
+
|
|
163
165
|
export interface ReleaseManifest {
|
|
164
166
|
schema_version: number;
|
|
165
167
|
generated_at: string;
|
|
@@ -168,6 +170,8 @@ export interface ReleaseManifest {
|
|
|
168
170
|
release_contract: Record<string, unknown>;
|
|
169
171
|
versions: Record<string, unknown>;
|
|
170
172
|
runtime_compiled: { path: string; ok: boolean };
|
|
173
|
+
canonical_source?: Record<string, unknown>;
|
|
174
|
+
semantics?: Record<string, unknown>;
|
|
171
175
|
wrappers: Record<string, unknown>;
|
|
172
176
|
reports: Record<string, unknown>;
|
|
173
177
|
}
|
|
@@ -283,8 +287,9 @@ export interface ExecutionRationalitySummary {
|
|
|
283
287
|
}
|
|
284
288
|
|
|
285
289
|
/** Relatório retornado por `health.buildHealthReport` e incluído em `runDoctorChecks`.healthReport. */
|
|
286
|
-
export interface OxeHealthReport {
|
|
287
|
-
|
|
290
|
+
export interface OxeHealthReport {
|
|
291
|
+
workspaceMode?: WorkspaceMode;
|
|
292
|
+
configPath: string | null;
|
|
288
293
|
configParseError: string | null;
|
|
289
294
|
unknownConfigKeys: string[];
|
|
290
295
|
typeErrors: string[];
|
|
@@ -334,9 +339,10 @@ export interface OxeHealthReport {
|
|
|
334
339
|
contextWarn?: string[];
|
|
335
340
|
semanticsWarn?: string[];
|
|
336
341
|
contextPacks?: Record<string, ContextPackSummary>;
|
|
337
|
-
contextQuality?: ContextQualitySummary;
|
|
338
|
-
semanticsDrift?: SemanticsDriftSummary;
|
|
339
|
-
|
|
342
|
+
contextQuality?: ContextQualitySummary;
|
|
343
|
+
semanticsDrift?: SemanticsDriftSummary;
|
|
344
|
+
releaseReadiness?: ReleaseConsistencyResult | null;
|
|
345
|
+
packFreshness?: Record<string, PackFreshness>;
|
|
340
346
|
activeSummaryRefs?: { project: string | null; session: string | null; phase: string | null };
|
|
341
347
|
scanFocusGlobs?: unknown;
|
|
342
348
|
scanIgnoreGlobs?: unknown;
|
|
@@ -689,11 +695,13 @@ export interface OxeSdk {
|
|
|
689
695
|
timeoutMs?: number;
|
|
690
696
|
}) => Promise<Record<string, unknown>>;
|
|
691
697
|
|
|
692
|
-
health: {
|
|
693
|
-
loadOxeConfigMerged: (targetProject: string) => { config: Record<string, unknown>; path: string | null; parseError: string | null; sources: { system: string | null; user: string | null; project: string | null } };
|
|
694
|
-
validateConfigShape: (cfg: Record<string, unknown>) => { unknownKeys: string[]; typeErrors: string[] };
|
|
695
|
-
buildHealthReport: (target: string) => OxeHealthReport;
|
|
696
|
-
|
|
698
|
+
health: {
|
|
699
|
+
loadOxeConfigMerged: (targetProject: string) => { config: Record<string, unknown>; path: string | null; parseError: string | null; sources: { system: string | null; user: string | null; project: string | null } };
|
|
700
|
+
validateConfigShape: (cfg: Record<string, unknown>) => { unknownKeys: string[]; typeErrors: string[] };
|
|
701
|
+
buildHealthReport: (target: string) => OxeHealthReport;
|
|
702
|
+
detectWorkspaceMode: (target: string) => { workspaceMode: WorkspaceMode; packageName: string | null; canonicalTreePresent: boolean; commandsTreePresent: boolean };
|
|
703
|
+
shouldSuppressExecutionWorkspaceGates: (workspaceMode: WorkspaceMode, phase?: string | null, activeSession?: string | null, activeRun?: Record<string, unknown> | null) => boolean;
|
|
704
|
+
suggestNextStep: (target: string, cfg?: { discuss_before_plan?: boolean }) => OxeNextSuggestion;
|
|
697
705
|
oxePaths: (target: string) => Record<string, string>;
|
|
698
706
|
parseStatePhase: (stateText: string) => string | null;
|
|
699
707
|
parseLastScanDate: (stateText: string) => Date | null;
|
|
@@ -787,6 +795,9 @@ export interface OxeSdk {
|
|
|
787
795
|
loadRecoveryFixtureReport: (projectRoot: string) => RuntimeSmokeReport;
|
|
788
796
|
loadMultiAgentSoakReport: (projectRoot: string) => RuntimeSmokeReport;
|
|
789
797
|
buildReleaseManifest: (projectRoot: string, options?: Record<string, unknown>) => ReleaseManifest;
|
|
798
|
+
inspectCanonicalSource: (projectRoot: string) => Record<string, unknown>;
|
|
799
|
+
evaluateReleaseManifest: (manifest: ReleaseManifest, options?: Record<string, unknown>) => ReleaseConsistencyResult;
|
|
800
|
+
inspectReleaseReadiness: (projectRoot: string, options?: Record<string, unknown>) => ReleaseConsistencyResult;
|
|
790
801
|
checkReleaseConsistency: (projectRoot: string, options?: Record<string, unknown>) => ReleaseConsistencyResult;
|
|
791
802
|
};
|
|
792
803
|
|
package/oxe/templates/CONFIG.md
CHANGED
|
@@ -8,9 +8,9 @@ Copie `oxe/templates/config.template.json` para **`.oxe/config.json`** no seu pr
|
|
|
8
8
|
|-------|------|-------------|
|
|
9
9
|
| `profile` | string | Profile de execução: `balanced` (padrão) \| `strict` \| `fast` \| `legacy`. Expande automaticamente outras keys — keys explícitas prevalecem. Ver tabela abaixo. |
|
|
10
10
|
| `discuss_before_plan` | boolean | Se `true`, o fluxo recomenda **`oxe:discuss`** entre spec e plan. |
|
|
11
|
-
| `verification_depth` | string | Profundidade da verificação: `standard` (padrão) \| `thorough` (ativa Camada 5 — validate-gaps automático) \| `quick` (skip camadas 3–4 e UAT). |
|
|
12
|
-
| `plan_confidence_threshold` | number | Limiar mínimo de confiança para o `execute` aceitar um `PLAN.md`. Padrão canónico: `90`, com gate estrito (`Confiança` precisa ser **maior que** o limiar). Valores menores que 90 não reduzem esse gate. |
|
|
13
|
-
| `security_in_verify` | boolean | Se `true`, executa auditoria OWASP automaticamente no **verify** como **Camada 6** (produz `.oxe/SECURITY.md`). Achados P0 bloqueiam `verify_complete`. Padrão: `false`. |
|
|
11
|
+
| `verification_depth` | string | Profundidade da verificação: `standard` (padrão) \| `thorough` (ativa Camada 5 — validate-gaps automático) \| `quick` (skip camadas 3–4 e UAT). |
|
|
12
|
+
| `plan_confidence_threshold` | number | Limiar mínimo de confiança para o `execute` aceitar um `PLAN.md`. Padrão canónico: `90`, com gate estrito (`Confiança` precisa ser **maior que** o limiar). Valores menores que 90 não reduzem esse gate. |
|
|
13
|
+
| `security_in_verify` | boolean | Se `true`, executa auditoria OWASP automaticamente no **verify** como **Camada 6** (produz `.oxe/SECURITY.md`). Achados P0 bloqueiam `verify_complete`. Padrão: `false`. |
|
|
14
14
|
| `after_verify_suggest_pr` | boolean | Se `true`, o workflow **verify** inclui checklist de PR no fim. |
|
|
15
15
|
| `after_verify_draft_commit` | boolean | Se `true`, o **verify** propõe rascunho de mensagem de commit alinhado aos critérios de aceite. |
|
|
16
16
|
| `after_verify_suggest_uat` | boolean | Se `true`, o **verify** gera checklist UAT (Camada 4). Ativo automaticamente com `profile: strict`. |
|
|
@@ -16,7 +16,7 @@ updated: YYYY-MM-DD
|
|
|
16
16
|
- **Active run:** `.oxe/ACTIVE-RUN.json` ou artefato equivalente de sessão
|
|
17
17
|
- **Trace log:** `.oxe/OXE-EVENTS.ndjson` ou artefato equivalente de sessão
|
|
18
18
|
- **Autoavaliação do plano:** melhor=`sim|não` | confiança=`NN%`
|
|
19
|
-
- **Limiar de execução:** `>90%`
|
|
19
|
+
- **Limiar de execução:** `>90%`
|
|
20
20
|
|
|
21
21
|
## Onda atual
|
|
22
22
|
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schema_version": "1",
|
|
3
|
-
"generated_at": "YYYY-MM-DDTHH:MM:SSZ",
|
|
4
|
-
"ready": false,
|
|
5
|
-
"critical_gaps": [],
|
|
6
|
-
"fixtures": [
|
|
7
|
-
{
|
|
8
|
-
"id": "FX-01",
|
|
9
|
-
"task_id": "T1",
|
|
10
|
-
"status": "ready",
|
|
11
|
-
"inputs": [
|
|
12
|
-
{
|
|
13
|
-
"kind": "payload",
|
|
14
|
-
"ref": ".oxe/investigations/fixtures/example-input.json",
|
|
15
|
-
"summary": "payload base para validar o fluxo"
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"expected_outputs": [
|
|
19
|
-
{
|
|
20
|
-
"kind": "status",
|
|
21
|
-
"summary": "deve concluir sem erro e persistir o artefato esperado"
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
|
-
"expected_checks": [
|
|
25
|
-
"npm test -- example"
|
|
26
|
-
],
|
|
27
|
-
"critical_fields": [
|
|
28
|
-
"id",
|
|
29
|
-
"status"
|
|
30
|
-
],
|
|
31
|
-
"critical_gaps": []
|
|
32
|
-
}
|
|
33
|
-
]
|
|
34
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1",
|
|
3
|
+
"generated_at": "YYYY-MM-DDTHH:MM:SSZ",
|
|
4
|
+
"ready": false,
|
|
5
|
+
"critical_gaps": [],
|
|
6
|
+
"fixtures": [
|
|
7
|
+
{
|
|
8
|
+
"id": "FX-01",
|
|
9
|
+
"task_id": "T1",
|
|
10
|
+
"status": "ready",
|
|
11
|
+
"inputs": [
|
|
12
|
+
{
|
|
13
|
+
"kind": "payload",
|
|
14
|
+
"ref": ".oxe/investigations/fixtures/example-input.json",
|
|
15
|
+
"summary": "payload base para validar o fluxo"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"expected_outputs": [
|
|
19
|
+
{
|
|
20
|
+
"kind": "status",
|
|
21
|
+
"summary": "deve concluir sem erro e persistir o artefato esperado"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"expected_checks": [
|
|
25
|
+
"npm test -- example"
|
|
26
|
+
],
|
|
27
|
+
"critical_fields": [
|
|
28
|
+
"id",
|
|
29
|
+
"status"
|
|
30
|
+
],
|
|
31
|
+
"critical_gaps": []
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
# OXE — Fixture Pack
|
|
2
|
-
|
|
3
|
-
> Fixtures mínimos para reduzir improviso em parsing, integração, transformação, migração e builders.
|
|
4
|
-
|
|
5
|
-
## Status
|
|
6
|
-
|
|
7
|
-
- **Status:** ready | not_ready | not_applicable
|
|
8
|
-
- **Critical gaps abertos:** nenhum | listar
|
|
9
|
-
|
|
10
|
-
## Fixtures
|
|
11
|
-
|
|
12
|
-
### FX-01 — T1
|
|
13
|
-
|
|
14
|
-
- **Task:** T1
|
|
15
|
-
- **Status:** ready | missing | not_applicable
|
|
16
|
-
- **Inputs:** payload, arquivo exemplo, query, blob ou mensagem
|
|
17
|
-
- **Expected outputs:** linha, evento, arquivo, rowset, status etc.
|
|
18
|
-
- **Expected checks:** `...`
|
|
19
|
-
- **Campos críticos / offsets:** ...
|
|
20
|
-
- **Smoke command:** `...`
|
|
21
|
-
- **Critical gaps:** nenhum | listar
|
|
1
|
+
# OXE — Fixture Pack
|
|
2
|
+
|
|
3
|
+
> Fixtures mínimos para reduzir improviso em parsing, integração, transformação, migração e builders.
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
|
|
7
|
+
- **Status:** ready | not_ready | not_applicable
|
|
8
|
+
- **Critical gaps abertos:** nenhum | listar
|
|
9
|
+
|
|
10
|
+
## Fixtures
|
|
11
|
+
|
|
12
|
+
### FX-01 — T1
|
|
13
|
+
|
|
14
|
+
- **Task:** T1
|
|
15
|
+
- **Status:** ready | missing | not_applicable
|
|
16
|
+
- **Inputs:** payload, arquivo exemplo, query, blob ou mensagem
|
|
17
|
+
- **Expected outputs:** linha, evento, arquivo, rowset, status etc.
|
|
18
|
+
- **Expected checks:** `...`
|
|
19
|
+
- **Campos críticos / offsets:** ...
|
|
20
|
+
- **Smoke command:** `...`
|
|
21
|
+
- **Critical gaps:** nenhum | listar
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schema_version": "1",
|
|
3
|
-
"generated_at": "YYYY-MM-DDTHH:MM:SSZ",
|
|
4
|
-
"ready": false,
|
|
5
|
-
"critical_gaps": [],
|
|
6
|
-
"tasks": [
|
|
7
|
-
{
|
|
8
|
-
"id": "T1",
|
|
9
|
-
"title": "substituir pelo título da tarefa",
|
|
10
|
-
"mode": "mutating",
|
|
11
|
-
"ready": false,
|
|
12
|
-
"exact_paths": [
|
|
13
|
-
"src/example.ts"
|
|
14
|
-
],
|
|
15
|
-
"write_set": "closed",
|
|
16
|
-
"symbols": [
|
|
17
|
-
{
|
|
18
|
-
"kind": "function",
|
|
19
|
-
"name": "exampleHandler",
|
|
20
|
-
"path": "src/example.ts",
|
|
21
|
-
"signature": "(input: ExampleInput) => ExampleOutput"
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
|
-
"contracts": [
|
|
25
|
-
{
|
|
26
|
-
"name": "example-contract",
|
|
27
|
-
"input_shape": "ExampleInput",
|
|
28
|
-
"output_shape": "ExampleOutput",
|
|
29
|
-
"invariants": [
|
|
30
|
-
"não perder campos obrigatórios"
|
|
31
|
-
],
|
|
32
|
-
"not_allowed": [
|
|
33
|
-
"mutar schema fora do write set"
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
],
|
|
37
|
-
"snippets": [
|
|
38
|
-
{
|
|
39
|
-
"source_ref": "not_applicable",
|
|
40
|
-
"path": "not_applicable",
|
|
41
|
-
"summary": "not_applicable",
|
|
42
|
-
"status": "not_applicable"
|
|
43
|
-
}
|
|
44
|
-
],
|
|
45
|
-
"expected_checks": [
|
|
46
|
-
"npm test -- example"
|
|
47
|
-
],
|
|
48
|
-
"requires_fixture": false,
|
|
49
|
-
"critical_gaps": []
|
|
50
|
-
}
|
|
51
|
-
]
|
|
52
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1",
|
|
3
|
+
"generated_at": "YYYY-MM-DDTHH:MM:SSZ",
|
|
4
|
+
"ready": false,
|
|
5
|
+
"critical_gaps": [],
|
|
6
|
+
"tasks": [
|
|
7
|
+
{
|
|
8
|
+
"id": "T1",
|
|
9
|
+
"title": "substituir pelo título da tarefa",
|
|
10
|
+
"mode": "mutating",
|
|
11
|
+
"ready": false,
|
|
12
|
+
"exact_paths": [
|
|
13
|
+
"src/example.ts"
|
|
14
|
+
],
|
|
15
|
+
"write_set": "closed",
|
|
16
|
+
"symbols": [
|
|
17
|
+
{
|
|
18
|
+
"kind": "function",
|
|
19
|
+
"name": "exampleHandler",
|
|
20
|
+
"path": "src/example.ts",
|
|
21
|
+
"signature": "(input: ExampleInput) => ExampleOutput"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"contracts": [
|
|
25
|
+
{
|
|
26
|
+
"name": "example-contract",
|
|
27
|
+
"input_shape": "ExampleInput",
|
|
28
|
+
"output_shape": "ExampleOutput",
|
|
29
|
+
"invariants": [
|
|
30
|
+
"não perder campos obrigatórios"
|
|
31
|
+
],
|
|
32
|
+
"not_allowed": [
|
|
33
|
+
"mutar schema fora do write set"
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"snippets": [
|
|
38
|
+
{
|
|
39
|
+
"source_ref": "not_applicable",
|
|
40
|
+
"path": "not_applicable",
|
|
41
|
+
"summary": "not_applicable",
|
|
42
|
+
"status": "not_applicable"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"expected_checks": [
|
|
46
|
+
"npm test -- example"
|
|
47
|
+
],
|
|
48
|
+
"requires_fixture": false,
|
|
49
|
+
"critical_gaps": []
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
# OXE — Implementation Pack
|
|
2
|
-
|
|
3
|
-
> Contrato racional de implementação por tarefa. Este arquivo complementa o `PLAN.md` e fecha write-set, symbols, contracts e checks esperados antes do `/oxe-execute`.
|
|
4
|
-
|
|
5
|
-
## Status
|
|
6
|
-
|
|
7
|
-
- **Status:** ready | not_ready | not_applicable
|
|
8
|
-
- **Critical gaps abertos:** nenhum | listar
|
|
9
|
-
- **Fonte:** `PLAN.md` + código real + anchors locais
|
|
10
|
-
|
|
11
|
-
## Tarefas
|
|
12
|
-
|
|
13
|
-
### T1 — (título)
|
|
14
|
-
|
|
15
|
-
- **Mode:** mutating | docs_only | external | not_applicable
|
|
16
|
-
- **Ready:** true | false
|
|
17
|
-
- **Exact paths:** `src/...`, `config/...`
|
|
18
|
-
- **Write set:** closed | external | not_applicable
|
|
19
|
-
- **Symbols alvo:**
|
|
20
|
-
- `kind:name(path)` — assinatura ou shape esperado
|
|
21
|
-
- **Contracts:**
|
|
22
|
-
- **Nome:** (ex.: payload parser)
|
|
23
|
-
- **Entrada:** ...
|
|
24
|
-
- **Saída:** ...
|
|
25
|
-
- **Invariants:** ...
|
|
26
|
-
- **Not allowed:** ...
|
|
27
|
-
- **Expected checks:**
|
|
28
|
-
- `...`
|
|
29
|
-
- **Requires fixture:** true | false
|
|
30
|
-
- **Snippet/base local:** path ou `not_applicable`
|
|
31
|
-
- **Critical gaps:** nenhum | listar
|
|
32
|
-
|
|
33
|
-
## Observações
|
|
34
|
-
|
|
35
|
-
- Use caminhos exatos; não usar `...`.
|
|
36
|
-
- Tarefa mutável sem `symbols`, `contracts`, `write_set: closed` e `expected_checks` não deve sustentar confiança `> 90%`.
|
|
1
|
+
# OXE — Implementation Pack
|
|
2
|
+
|
|
3
|
+
> Contrato racional de implementação por tarefa. Este arquivo complementa o `PLAN.md` e fecha write-set, symbols, contracts e checks esperados antes do `/oxe-execute`.
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
|
|
7
|
+
- **Status:** ready | not_ready | not_applicable
|
|
8
|
+
- **Critical gaps abertos:** nenhum | listar
|
|
9
|
+
- **Fonte:** `PLAN.md` + código real + anchors locais
|
|
10
|
+
|
|
11
|
+
## Tarefas
|
|
12
|
+
|
|
13
|
+
### T1 — (título)
|
|
14
|
+
|
|
15
|
+
- **Mode:** mutating | docs_only | external | not_applicable
|
|
16
|
+
- **Ready:** true | false
|
|
17
|
+
- **Exact paths:** `src/...`, `config/...`
|
|
18
|
+
- **Write set:** closed | external | not_applicable
|
|
19
|
+
- **Symbols alvo:**
|
|
20
|
+
- `kind:name(path)` — assinatura ou shape esperado
|
|
21
|
+
- **Contracts:**
|
|
22
|
+
- **Nome:** (ex.: payload parser)
|
|
23
|
+
- **Entrada:** ...
|
|
24
|
+
- **Saída:** ...
|
|
25
|
+
- **Invariants:** ...
|
|
26
|
+
- **Not allowed:** ...
|
|
27
|
+
- **Expected checks:**
|
|
28
|
+
- `...`
|
|
29
|
+
- **Requires fixture:** true | false
|
|
30
|
+
- **Snippet/base local:** path ou `not_applicable`
|
|
31
|
+
- **Critical gaps:** nenhum | listar
|
|
32
|
+
|
|
33
|
+
## Observações
|
|
34
|
+
|
|
35
|
+
- Use caminhos exatos; não usar `...`.
|
|
36
|
+
- Tarefa mutável sem `symbols`, `contracts`, `write_set: closed` e `expected_checks` não deve sustentar confiança `> 90%`.
|