oxe-cc 1.12.0 → 1.16.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/.github/dependabot.yml +31 -0
- package/.github/workflows/ci.yml +141 -56
- package/.github/workflows/release.yml +114 -89
- package/CHANGELOG.md +866 -754
- package/README.md +600 -736
- package/bin/lib/oxe-agent-install.cjs +299 -284
- package/bin/lib/oxe-artifact-catalog.cjs +376 -0
- package/bin/lib/oxe-command-registry.cjs +31 -0
- package/bin/lib/oxe-context-engine.cjs +11 -11
- package/bin/lib/oxe-core-command-handlers.cjs +82 -0
- package/bin/lib/oxe-dashboard.cjs +140 -140
- package/bin/lib/oxe-manifest.cjs +20 -20
- package/bin/lib/oxe-npm-version.cjs +6 -4
- package/bin/lib/oxe-plugin-cli.cjs +95 -0
- package/bin/lib/oxe-plugins.cjs +94 -3
- package/bin/lib/oxe-process.cjs +67 -0
- package/bin/lib/oxe-project-health.cjs +2846 -2781
- package/bin/lib/oxe-runtime-semantics.cjs +68 -69
- package/bin/oxe-cc.js +369 -353
- package/docs/INTEGRATION.md +182 -0
- package/docs/QUALITY-GATES.md +46 -0
- package/docs/RELEASE-READINESS.md +86 -61
- package/docs/RUNTIME-SMOKE-MATRIX.md +137 -135
- package/docs/oxe-artifact-map.html +1172 -0
- package/lib/sdk/index.cjs +20 -0
- package/lib/sdk/index.d.ts +971 -876
- package/lib/sdk/index.types.ts +933 -0
- package/oxe/templates/PLUGINS.md +8 -1
- package/oxe/templates/STATE-REFERENCE.md +125 -0
- package/oxe/templates/STATE.md +11 -121
- package/oxe/workflows/help.md +2 -0
- package/package.json +129 -108
- package/packages/runtime/package.json +18 -18
- package/packages/runtime/src/evidence/evidence-store.ts +2 -2
- package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +728 -728
- package/packages/runtime/src/workspace/strategies/git-worktree.ts +24 -24
- package/packages/runtime/tsconfig.json +8 -2
- package/vscode-extension/.vscodeignore +2 -0
- package/vscode-extension/package.json +193 -185
- package/vscode-extension/src/extension.js +11 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Integração com hosts (IDEs, OXESpace, …)
|
|
2
|
+
|
|
3
|
+
Este documento descreve o **contrato estável** que o `oxe-cc` expõe para um *host* — um app que embute o oxe-cc e mostra o estado de um projeto OXE (ex.: o [OXESpace](https://github.com/propagno) embute o painel OXE).
|
|
4
|
+
|
|
5
|
+
O `oxe-cc` e o host têm **releases independentes**. Para que evoluam sem se quebrar:
|
|
6
|
+
|
|
7
|
+
- Toda saída de máquina é **versionada** com um campo `oxe*Schema` próprio (independente da versão do pacote).
|
|
8
|
+
- Os campos são **aditivos**: campos novos podem aparecer; campos existentes não mudam de tipo nem somem dentro da mesma `*Schema`.
|
|
9
|
+
- O host deve **degradar graciosamente**: detectar a versão / o schema e usar o caminho antigo quando um recurso novo não existir.
|
|
10
|
+
|
|
11
|
+
Detecte a versão com `oxe --version` (imprime `oxe-cc vX.Y.Z`). Tabela de disponibilidade:
|
|
12
|
+
|
|
13
|
+
| Recurso | Desde | Schema |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `status --json` (completo) | 1.0 | `oxeStatusSchema: 5` |
|
|
16
|
+
| `status --json --summary` | 1.13.0 | `oxeSummarySchema: 1` |
|
|
17
|
+
| `agentSkills[]` no `status --json` + `agentSkills` no summary | 1.13.0 | — |
|
|
18
|
+
| `events --tail --json` | 1.14.0 | `oxeEventsSchema: 1` |
|
|
19
|
+
| `dashboard --json` + `--port 0` efêmero | 1.14.0 | `oxeDashboardSchema: 1` |
|
|
20
|
+
| `map --json` (mapa de artefatos do `.oxe/`) | 1.15.0 | `oxeMapSchema: 1` |
|
|
21
|
+
|
|
22
|
+
> **Estável:** `status --json --summary`, `agentSkills`, `events --json`, `dashboard --json`, `map --json`.
|
|
23
|
+
> **Experimental (pode mudar):** o conteúdo de `payload` dentro de cada evento; o HTML servido pelo dashboard; o corpo de `status --json` completo (`oxeStatusSchema`) além dos campos listados abaixo.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 1. Glance barato — `status --json --summary`
|
|
28
|
+
|
|
29
|
+
Em vez do `status --json` completo (~100KB), use a projeção compacta no *hot path* (atualizações frequentes):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
oxe status --json --summary --dir <projeto>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```jsonc
|
|
36
|
+
{
|
|
37
|
+
"oxeSummarySchema": 1,
|
|
38
|
+
"projectRoot": "/abs/path",
|
|
39
|
+
"workspaceMode": "oxe_project",
|
|
40
|
+
"phase": "execute",
|
|
41
|
+
"healthStatus": "warning",
|
|
42
|
+
"activeSession": "sessions/s003-foo",
|
|
43
|
+
"nextStep": "execute",
|
|
44
|
+
"cursorCmd": "/oxe-execute",
|
|
45
|
+
"reason": "…",
|
|
46
|
+
"eventsCount": 42,
|
|
47
|
+
"warningsCount": 7,
|
|
48
|
+
"agentSkills": [ { "agent": "copilot-cli", "skillsInstalled": false } ]
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
O `status --json` completo (`oxeStatusSchema: 5`) continua disponível para a vista detalhada (diagnósticos, `criticalExecutionGaps`, `planSelfEvaluation`, artefatos, `agentSkills[]` detalhado).
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 2. Skills por-agente — `agentSkills`
|
|
57
|
+
|
|
58
|
+
O summary traz um `agentSkills` compacto (`{ agent, skillsInstalled }`). O `status --json` completo traz a forma detalhada:
|
|
59
|
+
|
|
60
|
+
```jsonc
|
|
61
|
+
{
|
|
62
|
+
"agent": "copilot-cli", // copilot-vscode | codex | copilot-cli | cursor | …
|
|
63
|
+
"detected": true, // o agente está configurado neste ambiente
|
|
64
|
+
"skillsInstalled": false, // as skills /oxe-* estão instaladas neste workspace
|
|
65
|
+
"skillsPath": "/abs/.../skills",
|
|
66
|
+
"status": "no_skills",
|
|
67
|
+
"issues": ["…"] // por que falhou (caminho ausente, frontmatter, versão)
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Via SDK, sem shell: `require('oxe-cc').health.agentSkillsReport(target)`.
|
|
72
|
+
|
|
73
|
+
**Uso típico do host:** se algum agente relevante tem `skillsInstalled:false`, ofereça instalar as skills daquele agente **antes** de lançá-lo (resolve o "Failed to load N skills"). Hoje o host dispara a instalação via os comandos `install` do oxe-cc (no terminal); uma saída `install --json` silenciosa está planejada (ver §5).
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 3. Reatividade — observar eventos
|
|
78
|
+
|
|
79
|
+
O `oxe-cc` mantém um log **append-only** em:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
.oxe/OXE-EVENTS.ndjson # projeto sem sessão ativa
|
|
83
|
+
.oxe/<session>/execution/OXE-EVENTS.ndjson # quando há sessão ativa (ex.: sessions/s003-foo)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Cada linha é um JSON (NDJSON). Campos estáveis por evento:
|
|
87
|
+
|
|
88
|
+
```jsonc
|
|
89
|
+
{
|
|
90
|
+
"event_id": "evt-...", // único; use como cursor em --since
|
|
91
|
+
"type": "RunStarted", // RunStarted, WorkItemReady, ToolInvoked, GateRequested, RunCompleted, …
|
|
92
|
+
"timestamp": "2026-05-30T10:00:00.000Z",
|
|
93
|
+
"run_id": "run-1" | null,
|
|
94
|
+
"session_id": "sessions/s003-foo" | null,
|
|
95
|
+
"wave_id": 1 | null,
|
|
96
|
+
"task_id": "T1" | null,
|
|
97
|
+
"payload": { /* experimental — específico do tipo */ }
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Padrão recomendado (reativo + barato):**
|
|
102
|
+
|
|
103
|
+
1. O host faz `fs.watch` do `OXE-EVENTS.ndjson` (com debounce ~400ms).
|
|
104
|
+
2. A cada mudança, re-chama `status --json --summary` para atualizar a UI.
|
|
105
|
+
3. Um poll lento de segurança (~15s) cobre o caso de o watch falhar (rede/symlink).
|
|
106
|
+
|
|
107
|
+
Para **ler os eventos** sem reparsear o arquivo inteiro, use o comando read-only:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
oxe events --tail 50 --json --dir <projeto>
|
|
111
|
+
oxe events --since evt-abc123 --json --dir <projeto> # só os novos desde um event_id
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```jsonc
|
|
115
|
+
{
|
|
116
|
+
"oxeEventsSchema": 1,
|
|
117
|
+
"projectRoot": "/abs/path",
|
|
118
|
+
"activeSession": "sessions/s003-foo" | null,
|
|
119
|
+
"summary": { "total": 3, "byType": { "RunStarted": 1, "…": 1 }, "lastEvent": { /* … */ } },
|
|
120
|
+
"events": [ /* … */ ]
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Via SDK: `oxe.operational.readEvents(root, session)` e `oxe.operational.summarizeEvents(events)`.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 4. Dashboard embutível — `dashboard --json`
|
|
129
|
+
|
|
130
|
+
O dashboard é um servidor HTTP local (serve `/` HTML + `/api/context` + endpoints de review/runtime). Para embutir num webview/iframe, suba-o em modo host:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
oxe dashboard --no-open --port 0 --json --dir <projeto>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
A **primeira linha** do stdout é, assim que o servidor está ouvindo, e o processo **continua servindo** até ser morto:
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{"oxeDashboardSchema":1,"projectRoot":"/abs/path","url":"http://127.0.0.1:52555/","port":52555,"readOnly":false}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
- `--port 0` → o SO escolhe uma porta efêmera; leia a porta real do `port`/`url`.
|
|
143
|
+
- `--read-only` → UI visual sem persistir mudanças (embed seguro).
|
|
144
|
+
- O servidor é localhost-only (`127.0.0.1`), sem autenticação — adequado a embed local.
|
|
145
|
+
|
|
146
|
+
**Ciclo de vida (host):** faça spawn do processo, leia a primeira linha JSON, carregue `url` no webview, e **mate o processo** ao fechar o workspace/app. Fallback para versões < 1.14: rode `dashboard` sem `--json` e raspe a linha `URL: …`, ou abra no navegador externo.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 5. Mapa de artefatos — `map --json`
|
|
151
|
+
|
|
152
|
+
A partir da `1.15.0` o `.oxe/` é **enxuto no install** (só `STATE.md`, `config.json` e o `README.md`-legenda); o resto nasce sob demanda. Para projetar o estado real do diretório — o que já existe, o que está disponível sob demanda, e o estado de cada item — use:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
oxe map --json --dir <projeto>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```jsonc
|
|
159
|
+
{
|
|
160
|
+
"oxeMapSchema": 1,
|
|
161
|
+
"projectRoot": "/abs/path",
|
|
162
|
+
"oxeExists": true,
|
|
163
|
+
"groups": [ { "key": "core", "label": "…", "present": [ … ], "available": [ … ] } ],
|
|
164
|
+
"present": [ { "path": "STATE.md", "kind": "file", "purpose": "…", "createdBy": "install", "group": "core", "state": "active" } ],
|
|
165
|
+
"available": [ { "path": "codebase/", "kind": "dir", "purpose": "…", "createdBy": "scan", "group": "discovery", "state": "absent" } ],
|
|
166
|
+
"extras": ["WHATEVER.md"],
|
|
167
|
+
"counts": { "total": 56, "present": 6, "active": 5, "empty": 1, "stale": 0, "available": 50, "extras": 1 }
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
- `state`: `active` (com conteúdo) · `empty` (existe mas vazio/zero-byte) · `stale` (scan desatualizado) · `absent` (disponível sob demanda).
|
|
172
|
+
- `createdBy`: a origem do artefato (workflow/CLI/kernel) — use `SOURCE_LABELS` no SDK para rótulos amigáveis.
|
|
173
|
+
- O mesmo modelo está no SDK: `require('oxe-cc').artifacts.buildMapModel(projectRoot)` e `renderLegend()` (o conteúdo do `.oxe/README.md`).
|
|
174
|
+
|
|
175
|
+
O texto humano (`oxe map`, sem `--json`) imprime a árvore anotada e agrupa os itens "disponível sob demanda" por comando de origem.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 6. Roadmap de integração (ainda não estável)
|
|
180
|
+
|
|
181
|
+
- **`install … --json`** — saída idempotente `{ ok, agents:[{agent, installedPaths[]}], skipped[], errors[] }` para instalar skills sem terminal. Hoje a instalação é via os comandos `install` (no terminal) + reconferir com `agentSkills`.
|
|
182
|
+
- **`events --follow` / streaming (SSE)** — hoje a reatividade é via `fs.watch` + `events --tail`/`--since`.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# OXE quality gates
|
|
2
|
+
|
|
3
|
+
O pipeline de qualidade produz evidência legível por máquina e por pessoas em:
|
|
4
|
+
|
|
5
|
+
- `.oxe/release/quality-gates-report.json`
|
|
6
|
+
- `.oxe/release/quality-gates-report.md`
|
|
7
|
+
- `coverage/coverage-summary.json`
|
|
8
|
+
|
|
9
|
+
O relatório registra resultado e duração de cada gate, cobertura, tamanho e quantidade de arquivos do pacote npm e tamanho do VSIX. Cada indicador é comparado ao baseline verificado da versão 1.15.0. A comparação é informativa; os thresholds e ratchets executáveis continuam sendo a fonte de bloqueio.
|
|
10
|
+
|
|
11
|
+
## Execução local
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
node scripts/quality-report.cjs reset
|
|
15
|
+
node scripts/quality-report.cjs exec --name tests -- npm run test:coverage
|
|
16
|
+
node scripts/quality-report.cjs exec --name extension-host -- npm test --workspace oxe-agents
|
|
17
|
+
node scripts/quality-report.cjs exec --name vsix -- npm run build:vscode-ext
|
|
18
|
+
node scripts/quality-report.cjs finalize
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`exec` sempre grava o resultado antes de devolver o exit code do processo filho. `finalize` também devolve código diferente de zero quando algum gate falhou ou quando cobertura, pacote npm ou VSIX estão ausentes. Com isso, a telemetria nunca transforma uma execução vermelha em sucesso.
|
|
22
|
+
|
|
23
|
+
## Extension Host
|
|
24
|
+
|
|
25
|
+
O teste usa `@vscode/test-electron` e executa as fontes de produção no VS Code 1.95.3 real. Ele comprova:
|
|
26
|
+
|
|
27
|
+
- descoberta da extensão `oxe-cc.oxe-agents`;
|
|
28
|
+
- ativação no Extension Development Host;
|
|
29
|
+
- contrato e registro efetivo dos 13 chat participants.
|
|
30
|
+
|
|
31
|
+
O Copilot Chat proprietário não é baixado no CI. Uma extensão fixture mínima, com o mesmo identificador de dependência, é carregada como segundo development path. Ela apenas satisfaz a resolução da dependência; não substitui nem altera o manifesto OXE. Portanto, o teste não valida autenticação, disponibilidade de modelos, quotas ou respostas reais do Copilot. Esses comportamentos exigem um smoke separado com credenciais.
|
|
32
|
+
|
|
33
|
+
## Segurança da automação
|
|
34
|
+
|
|
35
|
+
Os workflows aplicam permissões mínimas, timeouts, cancelamento de CI obsoleta, ações fixadas por SHA completo e `persist-credentials: false`. A publicação npm usa OIDC Trusted Publishing, Node 22.14+ e npm 11.5.1+, sem token de escrita persistente. Antes da primeira release, o pacote `oxe-cc` precisa autorizar `.github/workflows/release.yml` como trusted publisher no npm e o environment GitHub `npm` deve existir.
|
|
36
|
+
|
|
37
|
+
Dependabot monitora o lockfile único do workspace npm e os SHAs das GitHub Actions. O comentário de versão na mesma linha de cada SHA permite que o Dependabot preserve a identificação da release.
|
|
38
|
+
|
|
39
|
+
Referências oficiais:
|
|
40
|
+
|
|
41
|
+
- [GitHub: Secure use reference](https://docs.github.com/en/actions/reference/security/secure-use)
|
|
42
|
+
- [GitHub: concurrency](https://docs.github.com/en/actions/concepts/workflows-and-actions/concurrency)
|
|
43
|
+
- [GitHub: Dependabot para Actions](https://docs.github.com/en/code-security/how-tos/secure-your-supply-chain/secure-your-dependencies/auto-update-actions)
|
|
44
|
+
- [VS Code: Testing Extensions](https://code.visualstudio.com/api/working-with-extensions/testing-extension)
|
|
45
|
+
- [VS Code: Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration)
|
|
46
|
+
- [npm: Trusted publishing](https://docs.npmjs.com/trusted-publishers/)
|
|
@@ -1,61 +1,86 @@
|
|
|
1
|
-
# Release Readiness — OXE
|
|
2
|
-
|
|
3
|
-
Este é o contrato mínimo para publicar uma versão estável do OXE sem drift entre pacote, runtime, wrappers e operação enterprise.
|
|
4
|
-
|
|
5
|
-
## Gate local
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm
|
|
9
|
-
npm run
|
|
10
|
-
npm run
|
|
11
|
-
npm run
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- `
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `multi-agent
|
|
45
|
-
- `
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
O
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
##
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
1
|
+
# Release Readiness — OXE
|
|
2
|
+
|
|
3
|
+
Este é o contrato mínimo para publicar uma versão estável do OXE sem drift entre pacote, runtime, wrappers e operação enterprise.
|
|
4
|
+
|
|
5
|
+
## Gate local
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm run lint
|
|
9
|
+
npm run format:check
|
|
10
|
+
npm run test:sdk-types
|
|
11
|
+
npm run test:coverage
|
|
12
|
+
npm run test:packed-consumer
|
|
13
|
+
npm run test:vscode-ext
|
|
14
|
+
npm audit
|
|
15
|
+
npm run scan:assets
|
|
16
|
+
npm run build:vscode-ext
|
|
17
|
+
npm run release:pack-check
|
|
18
|
+
npx oxe-cc doctor --release --write-manifest
|
|
19
|
+
npm run quality:report
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`test:coverage` já executa `npm test` e aplica o ratchet global e dos módulos críticos. `test:packed-consumer` valida o pacote instalado em projeto temporário limpo. `test:vscode-ext` ativa a extensão num VS Code Extension Host real. `test:sdk-types` bloqueia drift do contrato TypeScript público. Lint e `format:check` são somente leitura.
|
|
23
|
+
|
|
24
|
+
O `doctor --release` deve bloquear a publicação quando encontrar:
|
|
25
|
+
|
|
26
|
+
- árvore canónica `oxe/workflows/`, `oxe/workflows/references/` ou `commands/oxe/` ausente
|
|
27
|
+
- `workflow-runtime-contracts.json` ausente ou inválido
|
|
28
|
+
- drift de versão entre `package.json`, `packages/runtime/package.json`, `vscode-extension/package.json`, `README.md`, `CHANGELOG.md` e banner
|
|
29
|
+
- topo do `CHANGELOG` ausente, sem data ou sem highlights
|
|
30
|
+
- runtime não compilado em `lib/runtime/index.js`
|
|
31
|
+
- wrappers dirty após `sync-runtime-metadata` e `sync:cursor`
|
|
32
|
+
- drift semântico entre workflows canónicos e superfícies geradas
|
|
33
|
+
- ausência ou falha dos relatórios obrigatórios da release
|
|
34
|
+
- tarball npm contendo `.tgz`, `.vsix`, `.oxe/` ou sem arquivos obrigatórios do pacote
|
|
35
|
+
|
|
36
|
+
## Relatórios obrigatórios
|
|
37
|
+
|
|
38
|
+
Todos os artefatos abaixo devem existir em `.oxe/release/`:
|
|
39
|
+
|
|
40
|
+
- `release-manifest.json`
|
|
41
|
+
- `runtime-smoke-report.json`
|
|
42
|
+
- `runtime-real-report.json`
|
|
43
|
+
- `recovery-fixture-report.json`
|
|
44
|
+
- `multi-agent-soak-report.json`
|
|
45
|
+
- `multi-agent-real-report.json` para versões `>=1.9.1`
|
|
46
|
+
|
|
47
|
+
Na linha `>=1.10.0`, `runtime-real-report.json` deve cobrir cenários representativos além do happy path simples: multi-wave, multi-file, verify parcial, gate pendente e promoção bloqueada. O `multi-agent-real-report.json` deve provar merge com evidência, diff summary, arquivos aplicados e verify status por task; o release doctor valida esse conteúdo, não apenas a presença do arquivo.
|
|
48
|
+
|
|
49
|
+
O nome `runtime-real` indica que os cenários atravessam o runtime operacional verdadeiro, em vez de mocks do runtime. A suíte continua sendo local e determinística: não chama um modelo externo. A integração live com um provedor LLM é validada separadamente por `npm run test:runtime-llm`; esse teste é opt-in, exige configuração explícita de credenciais/provedor e não integra o gate determinístico de publicação.
|
|
50
|
+
|
|
51
|
+
## Defaults estáveis desta publicação
|
|
52
|
+
|
|
53
|
+
- `execute` e `verify`: `runtime-first`
|
|
54
|
+
- `promotion`: somente `pr_draft`
|
|
55
|
+
- `multi-agent`: GA apenas com `git_worktree`
|
|
56
|
+
- `branch_push`: capability avançada, fora da superfície estável
|
|
57
|
+
|
|
58
|
+
## CI
|
|
59
|
+
|
|
60
|
+
O pipeline de CI e o pipeline de release devem rodar o mesmo gate:
|
|
61
|
+
|
|
62
|
+
1. `npm run lint`
|
|
63
|
+
2. `npm run format:check`
|
|
64
|
+
3. `npm run test:sdk-types`
|
|
65
|
+
4. `npm run test:coverage` (inclui `npm test`)
|
|
66
|
+
5. `npm run test:packed-consumer`
|
|
67
|
+
6. `npm run test:vscode-ext`
|
|
68
|
+
7. `npm audit`
|
|
69
|
+
8. `npm run scan:assets`
|
|
70
|
+
9. `npm run build:vscode-ext`
|
|
71
|
+
10. `npm run release:pack-check`
|
|
72
|
+
11. `npm run release:manifest` (doctor de release com `--write-manifest`)
|
|
73
|
+
12. `npm run quality:report`
|
|
74
|
+
|
|
75
|
+
Se qualquer etapa falhar, a release não está pronta.
|
|
76
|
+
|
|
77
|
+
O gate completo roda em Node 20. Um job de compatibilidade separado compila o runtime e executa os testes raiz em Node 18 e 22, cobrindo o `engines.node >=18` sem triplicar as suítes pesadas do runtime e da release.
|
|
78
|
+
|
|
79
|
+
Em checkout limpo, um único `npm ci` na raiz instala as dependências da raiz, do runtime e da extensão por npm workspaces. Não mantenha lockfiles aninhados: o `package-lock.json` raiz é a fonte única de resolução.
|
|
80
|
+
|
|
81
|
+
O workflow de release valida a tag, executa os gates, empacota o VSIX e cria a GitHub Release sem publicar no npm. A promoção ao registry é manual e posterior. As GitHub Actions ficam fixadas por SHA, e o Dependabot acompanha as revisões desses SHAs.
|
|
82
|
+
|
|
83
|
+
## Observações operacionais
|
|
84
|
+
|
|
85
|
+
- `status` e `status --full` distinguem agora `workspaceMode: product_package` de `workspaceMode: oxe_project`.
|
|
86
|
+
- 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.
|