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.
Files changed (40) hide show
  1. package/.github/dependabot.yml +31 -0
  2. package/.github/workflows/ci.yml +141 -56
  3. package/.github/workflows/release.yml +114 -89
  4. package/CHANGELOG.md +866 -754
  5. package/README.md +600 -736
  6. package/bin/lib/oxe-agent-install.cjs +299 -284
  7. package/bin/lib/oxe-artifact-catalog.cjs +376 -0
  8. package/bin/lib/oxe-command-registry.cjs +31 -0
  9. package/bin/lib/oxe-context-engine.cjs +11 -11
  10. package/bin/lib/oxe-core-command-handlers.cjs +82 -0
  11. package/bin/lib/oxe-dashboard.cjs +140 -140
  12. package/bin/lib/oxe-manifest.cjs +20 -20
  13. package/bin/lib/oxe-npm-version.cjs +6 -4
  14. package/bin/lib/oxe-plugin-cli.cjs +95 -0
  15. package/bin/lib/oxe-plugins.cjs +94 -3
  16. package/bin/lib/oxe-process.cjs +67 -0
  17. package/bin/lib/oxe-project-health.cjs +2846 -2781
  18. package/bin/lib/oxe-runtime-semantics.cjs +68 -69
  19. package/bin/oxe-cc.js +369 -353
  20. package/docs/INTEGRATION.md +182 -0
  21. package/docs/QUALITY-GATES.md +46 -0
  22. package/docs/RELEASE-READINESS.md +86 -61
  23. package/docs/RUNTIME-SMOKE-MATRIX.md +137 -135
  24. package/docs/oxe-artifact-map.html +1172 -0
  25. package/lib/sdk/index.cjs +20 -0
  26. package/lib/sdk/index.d.ts +971 -876
  27. package/lib/sdk/index.types.ts +933 -0
  28. package/oxe/templates/PLUGINS.md +8 -1
  29. package/oxe/templates/STATE-REFERENCE.md +125 -0
  30. package/oxe/templates/STATE.md +11 -121
  31. package/oxe/workflows/help.md +2 -0
  32. package/package.json +129 -108
  33. package/packages/runtime/package.json +18 -18
  34. package/packages/runtime/src/evidence/evidence-store.ts +2 -2
  35. package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +728 -728
  36. package/packages/runtime/src/workspace/strategies/git-worktree.ts +24 -24
  37. package/packages/runtime/tsconfig.json +8 -2
  38. package/vscode-extension/.vscodeignore +2 -0
  39. package/vscode-extension/package.json +193 -185
  40. 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 test
9
- npm run scan:assets
10
- npm run build:vscode-ext
11
- npm run release:pack-check
12
- npx oxe-cc doctor --release --write-manifest
13
- ```
14
-
15
- O `doctor --release` deve bloquear a publicação quando encontrar:
16
-
17
- - árvore canónica `oxe/workflows/`, `oxe/workflows/references/` ou `commands/oxe/` ausente
18
- - `workflow-runtime-contracts.json` ausente ou inválido
19
- - drift de versão entre `package.json`, `packages/runtime/package.json`, `vscode-extension/package.json`, `README.md`, `CHANGELOG.md` e banner
20
- - topo do `CHANGELOG` ausente, sem data ou sem highlights
21
- - runtime não compilado em `lib/runtime/index.js`
22
- - wrappers dirty após `sync-runtime-metadata` e `sync:cursor`
23
- - drift semântico entre workflows canónicos e superfícies geradas
24
- - ausência ou falha dos relatórios obrigatórios da release
25
- - tarball npm contendo `.tgz`, `.vsix`, `.oxe/` ou sem arquivos obrigatórios do pacote
26
-
27
- ## Relatórios obrigatórios
28
-
29
- Todos os artefatos abaixo devem existir em `.oxe/release/`:
30
-
31
- - `release-manifest.json`
32
- - `runtime-smoke-report.json`
33
- - `runtime-real-report.json`
34
- - `recovery-fixture-report.json`
35
- - `multi-agent-soak-report.json`
36
- - `multi-agent-real-report.json` para versões `>=1.9.1`
37
-
38
- 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.
39
-
40
- ## Defaults estáveis desta publicação
41
-
42
- - `execute` e `verify`: `runtime-first`
43
- - `promotion`: somente `pr_draft`
44
- - `multi-agent`: GA apenas com `git_worktree`
45
- - `branch_push`: capability avançada, fora da superfície estável
46
-
47
- ## CI
48
-
49
- O pipeline de CI e o pipeline de release devem rodar o mesmo gate:
50
-
51
- 1. `npm test`
52
- 2. `npm run scan:assets`
53
- 3. `npm run release:pack-check`
54
- 4. `npm run release:doctor`
55
-
56
- Se qualquer etapa falhar, a release não está pronta.
57
-
58
- ## Observações operacionais
59
-
60
- - `status` e `status --full` distinguem agora `workspaceMode: product_package` de `workspaceMode: oxe_project`.
61
- - 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
+ # 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.