oxe-cc 1.7.0 → 1.8.3

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 (44) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/README.md +37 -37
  3. package/bin/lib/oxe-agent-install.cjs +24 -8
  4. package/bin/lib/oxe-manifest.cjs +20 -13
  5. package/bin/lib/oxe-operational.cjs +234 -41
  6. package/bin/lib/oxe-project-health.cjs +219 -52
  7. package/bin/lib/oxe-rationality.cjs +9 -7
  8. package/bin/oxe-cc.js +443 -236
  9. package/lib/runtime/compiler/graph-compiler.js +1 -1
  10. package/lib/runtime/executor/action-tool-map.js +4 -0
  11. package/lib/runtime/executor/built-in-tools.js +27 -0
  12. package/lib/runtime/executor/llm-task-executor.d.ts +4 -1
  13. package/lib/runtime/executor/llm-task-executor.js +41 -5
  14. package/lib/runtime/executor/node-prompt-builder.d.ts +4 -1
  15. package/lib/runtime/executor/node-prompt-builder.js +13 -2
  16. package/lib/runtime/models/failure.d.ts +1 -1
  17. package/lib/runtime/scheduler/scheduler.d.ts +5 -1
  18. package/lib/runtime/scheduler/scheduler.js +82 -14
  19. package/lib/runtime/verification/verification-compiler.js +7 -5
  20. package/lib/sdk/index.cjs +48 -44
  21. package/oxe/templates/PLAN.template.md +23 -9
  22. package/oxe/templates/SPEC.template.md +55 -22
  23. package/oxe/workflows/plan.md +18 -6
  24. package/oxe/workflows/spec.md +31 -9
  25. package/package.json +103 -100
  26. package/packages/runtime/package.json +14 -14
  27. package/packages/runtime/src/compiler/graph-compiler.ts +1 -1
  28. package/packages/runtime/src/evidence/evidence-store.ts +2 -2
  29. package/packages/runtime/src/executor/action-tool-map.ts +4 -0
  30. package/packages/runtime/src/executor/built-in-tools.ts +29 -0
  31. package/packages/runtime/src/executor/llm-task-executor.ts +46 -4
  32. package/packages/runtime/src/executor/node-prompt-builder.ts +18 -1
  33. package/packages/runtime/src/models/failure.ts +2 -0
  34. package/packages/runtime/src/scheduler/scheduler.ts +93 -15
  35. package/packages/runtime/src/verification/verification-compiler.ts +7 -5
  36. package/vscode-extension/package.json +184 -184
  37. package/vscode-extension/oxe-agents-0.9.1.vsix +0 -0
  38. package/vscode-extension/oxe-agents-0.9.2.vsix +0 -0
  39. package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
  40. package/vscode-extension/oxe-agents-1.4.0.vsix +0 -0
  41. package/vscode-extension/oxe-agents-1.5.0.vsix +0 -0
  42. package/vscode-extension/oxe-agents-1.5.1.vsix +0 -0
  43. package/vscode-extension/oxe-agents-1.6.0.vsix +0 -0
  44. package/vscode-extension/oxe-agents-1.7.0.vsix +0 -0
@@ -15,16 +15,31 @@ inputs: []
15
15
 
16
16
  > Substitua os placeholders. Remova seções vazias se não se aplicarem.
17
17
 
18
- ## Objetivo
19
-
20
- (Uma frase: o que entregar.)
21
-
22
- ## Contexto
23
-
24
- - Repositório / produto: …
25
- - Links úteis: …
26
- - Tipo de demanda: feature | bugfix | refactor | research | ops | mixed
27
- - Incertezas estruturadas: …
18
+ ## Objetivo
19
+
20
+ (Uma frase: o que entregar.)
21
+
22
+ ## Outcome esperado
23
+
24
+ - Usuário ou operador principal: …
25
+ - Resultado observável ao final da entrega: …
26
+ - Medida de sucesso principal:
27
+
28
+ ## Contexto
29
+
30
+ - Repositório / produto: …
31
+ - Links úteis: …
32
+ - Tipo de demanda: feature | bugfix | refactor | research | ops | mixed
33
+ - Incertezas estruturadas: …
34
+ - Restrições técnicas obrigatórias: …
35
+ - Tecnologias proibidas ou evitadas: …
36
+
37
+ ## Público e experiência
38
+
39
+ - Público-alvo primário: …
40
+ - Nível de conhecimento esperado: iniciante | intermediário | avançado
41
+ - Contexto de uso: desktop | mobile | ambos | CLI | backoffice | batch
42
+ - Tom ou padrão de experiência esperado: …
28
43
 
29
44
  ## Escopo
30
45
 
@@ -36,26 +51,44 @@ inputs: []
36
51
 
37
52
  - …
38
53
 
39
- ## Critérios de aceite
40
-
41
- Use **IDs estáveis** (A1, A2, …) para o plano e o verify vincularem cada tarefa a um critério. Cada critério deve ser **testável ou observável** (comando, checklist ou critério objetivo).
54
+ ## Critérios de aceite
55
+
56
+ Use **IDs estáveis** (A1, A2, …) para o plano e o verify vincularem cada tarefa a um critério. Cada critério deve ser **testável ou observável** (comando, checklist ou critério objetivo).
42
57
 
43
58
  | ID | Critério | Como verificar |
44
59
  |----|----------|----------------|
45
- | A1 | (ex.: Dado … quando … então …) | (ex.: `npm test`, teste manual X) |
46
- | A2 | … | … |
47
-
48
- ## Suposições
49
-
50
- - …
60
+ | A1 | (ex.: Dado … quando … então …) | (ex.: `npm test`, teste manual X) |
61
+ | A2 | … | … |
62
+
63
+ ## Setup externo e pré-condições
64
+
65
+ - Contas, variáveis de ambiente, filas, bancos, VPN, dashboards ou recursos cloud necessários:
66
+ - Pré-condições bloqueantes para executar ou validar: …
67
+
68
+ ## Conteúdo e fluxos obrigatórios
69
+
70
+ - Fluxos obrigatórios da v1: …
71
+ - Estados obrigatórios: loading | empty | error | success | disabled | not_applicable
72
+ - Conteúdo mínimo obrigatório por área/módulo: …
73
+ - Exemplos concretos que devem existir na entrega: …
74
+
75
+ ## Suposições
76
+
77
+ - …
51
78
 
52
79
  ## Riscos
53
80
 
54
81
  - …
55
82
 
56
- ## Referências no código
57
-
58
- - Caminhos / módulos: …
83
+ ## Referências no código
84
+
85
+ - Caminhos / módulos: …
86
+
87
+ ## Contratos esperados para o plano
88
+
89
+ - Arquivos ou áreas que o plano deverá fechar com write-set explícito: …
90
+ - Fixtures, anchors ou exemplos locais obrigatórios antes de executar: …
91
+ - Decisões que não podem ser deixadas para o executor: …
59
92
 
60
93
  ---
61
94
 
@@ -48,11 +48,16 @@ Fixtures mínimos por fluxo/tarefa de risco:
48
48
  - queries/checks de validação e smoke commands.
49
49
  - negative cases mínimos para validação de erro, limite ou regressão principal.
50
50
 
51
- Regra de readiness:
52
- - `IMPLEMENTATION-PACK` precisa estar `ready`;
53
- - `REFERENCE-ANCHORS` não pode ter âncora crítica em `missing|stale|conflicting`;
54
- - `FIXTURE-PACK` é obrigatório para tarefas mutáveis com parser/layout/integração/transformação/fila/migração/builder;
55
- - qualquer `critical_gap` aberto derruba a prontidão executável do plano.
51
+ Regra de readiness:
52
+ - `IMPLEMENTATION-PACK` precisa estar `ready`;
53
+ - `REFERENCE-ANCHORS` não pode ter âncora crítica em `missing|stale|conflicting`;
54
+ - `FIXTURE-PACK` é obrigatório para tarefas mutáveis com parser/layout/integração/transformação/fila/migração/builder;
55
+ - qualquer `critical_gap` aberto derruba a prontidão executável do plano.
56
+
57
+ **Contrato adicional para app/UI estático:** quando a trilha for página HTML/CSS/JS, dashboard, microsite, app sem framework ou experiência educacional:
58
+ - o `IMPLEMENTATION-PACK` deve fechar seções obrigatórias da interface, comportamento por interação, estado persistido e modelo de conteúdo;
59
+ - o `REFERENCE-ANCHORS` deve apontar para snippets, predecessores ou contratos locais/materializados que reduzam improviso visual e estrutural;
60
+ - o `FIXTURE-PACK` deve incluir ao menos exemplos de conteúdo, estados da interface e checks de responsividade/console limpo quando a UI for parte central do aceite.
56
61
  </execution_rational_artifacts>
57
62
 
58
63
  <plan_iteration_contract>
@@ -177,7 +182,14 @@ Depois do resumo e antes das tarefas, o `PLAN.md` deve conter também:
177
182
 
178
183
  **Princípio test-first:** escreva o `Verificar` antes de escrever o `Implementar`. A pergunta é: "Como saberei que está pronto?" — a resposta define o target; `Implementar` é o caminho mínimo até esse target.
179
184
 
180
- **Contrato racional por tarefa:** se a tarefa for mutável ou tecnicamente relevante, o `PLAN.md` sozinho não basta. O `IMPLEMENTATION-PACK` deve fechar o write-set, os symbols e os checks; o `REFERENCE-ANCHORS` deve materializar evidência externa; o `FIXTURE-PACK` deve reduzir improviso em parsing/integração/transformação.
185
+ **Contrato racional por tarefa:** se a tarefa for mutável ou tecnicamente relevante, o `PLAN.md` sozinho não basta. O `IMPLEMENTATION-PACK` deve fechar o write-set, os symbols e os checks; o `REFERENCE-ANCHORS` deve materializar evidência externa; o `FIXTURE-PACK` deve reduzir improviso em parsing/integração/transformação.
186
+
187
+ **Contrato racional de densidade operacional:** plano com tarefa mutável ainda vaga (`...`, "ajustar onde necessário", "melhorar interface", "organizar conteúdo") não sustenta `Confiança > 90%`. Para passar do gate, o plano precisa fechar:
188
+ - arquivos alvo exatos ou padrão restrito;
189
+ - symbols/estruturas esperadas;
190
+ - sequência mínima de implementação;
191
+ - verificação observável por tarefa;
192
+ - fixture ou anchor quando o risco for de UI, integração, parsing, contrato ou transformação.
181
193
 
182
194
  **Projetos sem suíte de testes única (legado):** o bloco **Verificar** pode usar `Comando: —` e **Manual** com Grep, leitura de paths ou checklist — ver exemplos em **`oxe/workflows/references/legacy-brownfield.md`**. Todo critério **A*** da SPEC deve aparecer em **Aceite vinculado** de alguma tarefa ou como gap explícito.
183
195
 
@@ -30,9 +30,24 @@ Se **`.oxe/config.json`** tiver `discuss_before_plan: true`: mencionar no final
30
30
 
31
31
  **Discovery adaptativo:** antes da primeira pergunta, aplicar `oxe/workflows/references/adaptive-discovery.md`. Classificar a demanda, modular os blocos de perguntas conforme o domínio, limitar rodadas e consolidar incertezas estruturadas que depois alimentarão a confiança do plano.
32
32
 
33
- **Rastreabilidade forte:** todo requisito `R-ID` precisa apontar para pelo menos um critério `A*` verificável, ou aparecer como v2/fora com justificativa. Critério sem método de verificação não entra como v1.
34
-
35
- **Setup externo:** quando o sucesso depender de conta, variável de ambiente, dashboard, fila, banco, credencial, VPN ou recurso cloud, registrar em SPEC a seção **Setup externo e pré-condições**. O plano deve transformar isso em checkpoint ou tarefa explícita; não deixar como suposição solta.
33
+ **Rastreabilidade forte:** todo requisito `R-ID` precisa apontar para pelo menos um critério `A*` verificável, ou aparecer como v2/fora com justificativa. Critério sem método de verificação não entra como v1.
34
+
35
+ **Setup externo:** quando o sucesso depender de conta, variável de ambiente, dashboard, fila, banco, credencial, VPN ou recurso cloud, registrar em SPEC a seção **Setup externo e pré-condições**. O plano deve transformar isso em checkpoint ou tarefa explícita; não deixar como suposição solta.
36
+
37
+ **Contrato de indução da SPEC:** a SPEC deve sair forte o suficiente para que o usuário não precise compensar lacunas "no braço" durante o PLAN. Sempre extrair ou materializar explicitamente:
38
+ - público-alvo primário;
39
+ - outcome esperado observável;
40
+ - restrições técnicas obrigatórias e proibições relevantes;
41
+ - fluxos obrigatórios da v1;
42
+ - conteúdo mínimo exigido por área;
43
+ - exemplos mínimos esperados quando o pedido tocar UI, app, material didático, integração ou contrato público.
44
+
45
+ **Demandas de produto/app/UI:** quando o pedido for uma aplicação, página, dashboard, fluxo visual ou experiência educacional, a SPEC deve congelar antes do PLAN:
46
+ - blocos obrigatórios da interface;
47
+ - estados principais (`loading`, `empty`, `error`, `success` quando aplicável);
48
+ - interações mínimas esperadas;
49
+ - regras objetivas de responsividade e acessibilidade;
50
+ - critérios de aceite verificáveis por comportamento visível, não só por intenção narrativa.
36
51
 
37
52
  **Resolução de sessão:** antes de ler ou escrever artefatos desta trilha, resolver `active_session` em `.oxe/STATE.md` conforme `oxe/workflows/references/session-path-resolution.md`. Com sessão ativa:
38
53
  - `SPEC.md`, `ROADMAP.md` e `DISCUSS.md` vivem em `.oxe/<active_session>/spec/`
@@ -183,7 +198,7 @@ Complemento adaptativo para a Fase 1. Quando o domínio for confirmado (via scan
183
198
 
184
199
  ---
185
200
 
186
- ### Domínio: UI e Frontend
201
+ ### Domínio: UI e Frontend
187
202
 
188
203
  *Adicionar ao Bloco B quando o escopo toca interface de usuário:*
189
204
 
@@ -195,11 +210,18 @@ Complemento adaptativo para a Fase 1. Quando o domínio for confirmado (via scan
195
210
  - Há internacionalização (i18n) ou múltiplos idiomas a suportar?
196
211
  - Qual a estratégia de tratamento de erros visível ao usuário?
197
212
 
198
- *Critérios A* a sugerir:*
199
- - `A-N: Componente exibe loading state enquanto dados carregam`
200
- - `A-N: Erro de API exibe mensagem legível, não stack trace`
201
- - `A-N: Formulário desabilita submit enquanto request está em andamento`
202
- - `A-N: Todos os campos de formulário têm label associada (WCAG básico)`
213
+ *Critérios A* a sugerir:*
214
+ - `A-N: Componente exibe loading state enquanto dados carregam`
215
+ - `A-N: Erro de API exibe mensagem legível, não stack trace`
216
+ - `A-N: Formulário desabilita submit enquanto request está em andamento`
217
+ - `A-N: Todos os campos de formulário têm label associada (WCAG básico)`
218
+
219
+ *Para páginas estáticas, apps sem framework ou experiências didáticas, também perguntar:*
220
+ - Quais blocos da página são obrigatórios acima da dobra e abaixo da dobra?
221
+ - O conteúdo é mais exploratório, guiado passo a passo, ou ambos?
222
+ - Quais interações precisam existir obrigatoriamente na v1?
223
+ - O progresso do usuário precisa persistir entre reloads?
224
+ - Há exemplos de conteúdo, visualização ou exercícios mínimos que a aplicação precisa materializar?
203
225
 
204
226
  ---
205
227
 
package/package.json CHANGED
@@ -1,100 +1,103 @@
1
- {
2
- "name": "oxe-cc",
3
- "version": "1.7.0",
4
- "description": "OXE — spec-driven workflows in .oxe/ with runtime enterprise, evidence-first verification and multi-runtime integrations (npx)",
5
- "license": "MIT",
6
- "author": "",
7
- "homepage": "https://www.npmjs.com/package/oxe-cc",
8
- "bugs": {
9
- "url": "https://github.com/propagno/oxe-build/issues"
10
- },
11
- "repository": {
12
- "type": "git",
13
- "url": "git+https://github.com/propagno/oxe-build.git"
14
- },
15
- "keywords": [
16
- "cursor",
17
- "github-copilot",
18
- "copilot",
19
- "claude",
20
- "claude-code",
21
- "opencode",
22
- "gemini-cli",
23
- "codex",
24
- "windsurf",
25
- "antigravity",
26
- "spec-driven",
27
- "context-engineering",
28
- "ai-agents",
29
- "oxe"
30
- ],
31
- "engines": {
32
- "node": ">=18.0.0"
33
- },
34
- "main": "lib/sdk/index.cjs",
35
- "exports": {
36
- ".": "./lib/sdk/index.cjs",
37
- "./package.json": "./package.json"
38
- },
39
- "types": "lib/sdk/index.d.ts",
40
- "bin": {
41
- "oxe-cc": "bin/oxe-cc.js",
42
- "oxe": "bin/oxe-cc.js"
43
- },
44
- "files": [
45
- "bin",
46
- "lib",
47
- "oxe",
48
- "assets",
49
- ".cursor",
50
- ".github",
51
- "commands",
52
- "vscode-extension",
53
- "docs",
54
- "QUICKSTART.md",
55
- "packages/runtime/src",
56
- "packages/runtime/package.json",
57
- "packages/runtime/tsconfig.json",
58
- "AGENTS.md",
59
- "README.md",
60
- "CHANGELOG.md"
61
- ],
62
- "scripts": {
63
- "build:runtime": "cd packages/runtime && npm run build",
64
- "sync:runtime-metadata": "node scripts/sync-runtime-metadata.cjs",
65
- "sync:cursor": "node scripts/sync-cursor-from-prompts.cjs",
66
- "release:doctor": "node scripts/release-doctor.cjs",
67
- "release:manifest": "node scripts/release-doctor.cjs --write-manifest",
68
- "test:root": "node --test tests/install.test.cjs tests/oxe-project-health.test.cjs tests/oxe-dashboard.test.cjs tests/oxe-operational.test.cjs tests/oxe-azure.test.cjs tests/oxe-sdk.test.cjs tests/oxe-manifest.test.cjs tests/oxe-agent-install.test.cjs tests/oxe-install-resolve-full.test.cjs tests/oxe-health-extended.test.cjs tests/oxe-workflows-edge.test.cjs tests/oxe-sdk-edge.test.cjs tests/oxe-cli-edge.test.cjs tests/oxe-npm-version.test.cjs tests/oxe-scripts.test.cjs tests/oxe-retro-health.test.cjs tests/oxe-security-permissions.test.cjs tests/oxe-runtime-semantics.test.cjs tests/oxe-plugins.test.cjs",
69
- "test:runtime": "cd packages/runtime && npm test",
70
- "test:runtime-smoke": "node scripts/runtime-smoke-matrix.cjs",
71
- "test:recovery-fixtures": "node scripts/run-recovery-fixtures.cjs",
72
- "test:multi-agent-soak": "node scripts/run-multi-agent-soak.cjs",
73
- "test": "npm run build:runtime && npm run test:root && npm run test:runtime && npm run test:runtime-smoke && npm run test:recovery-fixtures && npm run test:multi-agent-soak",
74
- "test:coverage": "c8 --check-coverage --lines 82 --functions 85 --branches 58 --statements 82 npm test",
75
- "scan:assets": "node scripts/oxe-assets-scan.cjs",
76
- "build:vscode-ext": "cd vscode-extension && npx @vscode/vsce package --no-yarn --allow-missing-repository",
77
- "prepublishOnly": "npm test && npm run scan:assets && npm run build:vscode-ext && npm run release:manifest && node bin/oxe-cc.js --version"
78
- },
79
- "c8": {
80
- "all": true,
81
- "include": [
82
- "bin/oxe-cc.js",
83
- "bin/lib/**/*.cjs",
84
- "lib/**/*.cjs",
85
- "scripts/**/*.cjs"
86
- ],
87
- "exclude": [
88
- "**/node_modules/**"
89
- ],
90
- "reporter": [
91
- "text-summary"
92
- ]
93
- },
94
- "devDependencies": {
95
- "c8": "^11.0.0"
96
- },
97
- "dependencies": {
98
- "semver": "^7.7.4"
99
- }
100
- }
1
+ {
2
+ "name": "oxe-cc",
3
+ "version": "1.8.3",
4
+ "description": "OXE — spec-driven workflows in .oxe/ with runtime enterprise, evidence-first verification and multi-runtime integrations (npx)",
5
+ "license": "MIT",
6
+ "author": "",
7
+ "homepage": "https://www.npmjs.com/package/oxe-cc",
8
+ "bugs": {
9
+ "url": "https://github.com/propagno/oxe-build/issues"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/propagno/oxe-build.git"
14
+ },
15
+ "keywords": [
16
+ "cursor",
17
+ "github-copilot",
18
+ "copilot",
19
+ "claude",
20
+ "claude-code",
21
+ "opencode",
22
+ "gemini-cli",
23
+ "codex",
24
+ "windsurf",
25
+ "antigravity",
26
+ "spec-driven",
27
+ "context-engineering",
28
+ "ai-agents",
29
+ "oxe"
30
+ ],
31
+ "engines": {
32
+ "node": ">=18.0.0"
33
+ },
34
+ "main": "lib/sdk/index.cjs",
35
+ "exports": {
36
+ ".": "./lib/sdk/index.cjs",
37
+ "./package.json": "./package.json"
38
+ },
39
+ "types": "lib/sdk/index.d.ts",
40
+ "bin": {
41
+ "oxe-cc": "bin/oxe-cc.js",
42
+ "oxe": "bin/oxe-cc.js"
43
+ },
44
+ "files": [
45
+ "bin",
46
+ "lib",
47
+ "oxe",
48
+ "assets",
49
+ ".cursor",
50
+ ".github",
51
+ "commands",
52
+ "vscode-extension/package.json",
53
+ "vscode-extension/.vscodeignore",
54
+ "vscode-extension/LICENSE",
55
+ "vscode-extension/src",
56
+ "docs",
57
+ "QUICKSTART.md",
58
+ "packages/runtime/src",
59
+ "packages/runtime/package.json",
60
+ "packages/runtime/tsconfig.json",
61
+ "AGENTS.md",
62
+ "README.md",
63
+ "CHANGELOG.md"
64
+ ],
65
+ "scripts": {
66
+ "build:runtime": "cd packages/runtime && npm run build",
67
+ "sync:runtime-metadata": "node scripts/sync-runtime-metadata.cjs",
68
+ "sync:cursor": "node scripts/sync-cursor-from-prompts.cjs",
69
+ "release:doctor": "node scripts/release-doctor.cjs",
70
+ "release:manifest": "node scripts/release-doctor.cjs --write-manifest",
71
+ "test:root": "node --test tests/install.test.cjs tests/oxe-project-health.test.cjs tests/oxe-dashboard.test.cjs tests/oxe-operational.test.cjs tests/oxe-azure.test.cjs tests/oxe-sdk.test.cjs tests/oxe-manifest.test.cjs tests/oxe-agent-install.test.cjs tests/oxe-install-resolve-full.test.cjs tests/oxe-health-extended.test.cjs tests/oxe-workflows-edge.test.cjs tests/oxe-sdk-edge.test.cjs tests/oxe-cli-edge.test.cjs tests/oxe-npm-version.test.cjs tests/oxe-scripts.test.cjs tests/oxe-retro-health.test.cjs tests/oxe-security-permissions.test.cjs tests/oxe-runtime-semantics.test.cjs tests/oxe-plugins.test.cjs",
72
+ "test:runtime": "cd packages/runtime && npm test",
73
+ "test:runtime-smoke": "node scripts/runtime-smoke-matrix.cjs",
74
+ "test:recovery-fixtures": "node scripts/run-recovery-fixtures.cjs",
75
+ "test:multi-agent-soak": "node scripts/run-multi-agent-soak.cjs",
76
+ "test": "npm run build:runtime && npm run test:root && npm run test:runtime && npm run test:runtime-smoke && npm run test:recovery-fixtures && npm run test:multi-agent-soak",
77
+ "test:coverage": "c8 --check-coverage --lines 82 --functions 85 --branches 58 --statements 82 npm test",
78
+ "scan:assets": "node scripts/oxe-assets-scan.cjs",
79
+ "build:vscode-ext": "cd vscode-extension && npx @vscode/vsce package --no-yarn --allow-missing-repository",
80
+ "prepublishOnly": "npm test && npm run scan:assets && npm run build:vscode-ext && npm run release:manifest && node bin/oxe-cc.js --version"
81
+ },
82
+ "c8": {
83
+ "all": true,
84
+ "include": [
85
+ "bin/oxe-cc.js",
86
+ "bin/lib/**/*.cjs",
87
+ "lib/**/*.cjs",
88
+ "scripts/**/*.cjs"
89
+ ],
90
+ "exclude": [
91
+ "**/node_modules/**"
92
+ ],
93
+ "reporter": [
94
+ "text-summary"
95
+ ]
96
+ },
97
+ "devDependencies": {
98
+ "c8": "^11.0.0"
99
+ },
100
+ "dependencies": {
101
+ "semver": "^7.7.4"
102
+ }
103
+ }
@@ -1,18 +1,18 @@
1
- {
1
+ {
2
2
  "name": "@oxe/runtime",
3
- "version": "1.7.0",
3
+ "version": "1.8.3",
4
4
  "private": true,
5
5
  "license": "MIT",
6
6
  "description": "OXE agentic execution engine — enterprise runtime core",
7
- "main": "../../lib/runtime/index.js",
8
- "types": "../../lib/runtime/index.d.ts",
9
- "scripts": {
10
- "build": "tsc",
11
- "test": "tsc --project tsconfig.test.json && node --test dist-tests/tests/*.test.js",
12
- "clean": "node -e \"const fs=require('fs');['../../lib/runtime','dist-tests'].forEach(d=>{try{fs.rmSync(d,{recursive:true})}catch{}});\""
13
- },
14
- "devDependencies": {
15
- "@types/node": "^25.6.0",
16
- "typescript": "^5.4.5"
17
- }
18
- }
7
+ "main": "../../lib/runtime/index.js",
8
+ "types": "../../lib/runtime/index.d.ts",
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "test": "tsc --project tsconfig.test.json && node --test dist-tests/tests/*.test.js",
12
+ "clean": "node -e \"const fs=require('fs');['../../lib/runtime','dist-tests'].forEach(d=>{try{fs.rmSync(d,{recursive:true})}catch{}});\""
13
+ },
14
+ "devDependencies": {
15
+ "@types/node": "^25.6.0",
16
+ "typescript": "^5.4.5"
17
+ }
18
+ }
@@ -123,7 +123,7 @@ export function compile(
123
123
  mutation_scope: task.files,
124
124
  actions: buildActions(task),
125
125
  verify: {
126
- must_pass: task.verifyCommand ? ['tests'] : [],
126
+ must_pass: task.verifyCommand ? (task.aceite.length > 0 ? task.aceite : ['tests']) : [],
127
127
  acceptance_refs: task.aceite,
128
128
  command: task.verifyCommand,
129
129
  },
@@ -75,8 +75,8 @@ export class EvidenceStore {
75
75
  const ext = EXT_MAP[type] ?? 'bin';
76
76
 
77
77
  const existing = this.readIndex(run_id, work_item_id, attempt_number);
78
- const seq = existing.filter((e) => e.type === type).length + 1;
79
- const filename = seq === 1 ? `${type}.${ext}` : `${type}-${seq}.${ext}`;
78
+ const seq = existing.filter((e) => e.type === type).length + 1;
79
+ const filename = seq === 1 ? `${type}.${ext}` : `${type}-${seq}.${ext}`;
80
80
  const filePath = path.join(dir, filename);
81
81
 
82
82
  fs.writeFileSync(filePath, buf);
@@ -42,5 +42,9 @@ export function selectToolsForActions(actions: Action[]): ToolSchema[] {
42
42
  }
43
43
  }
44
44
  }
45
+ // finish_task is always available so the LLM can signal authoritative completion
46
+ if (!seen.has('finish_task') && BUILT_IN_TOOLS.finish_task) {
47
+ result.push(BUILT_IN_TOOLS.finish_task.schema);
48
+ }
45
49
  return result;
46
50
  }
@@ -262,6 +262,34 @@ function runShell(command: string, cwd: string, timeoutMs: number): Promise<stri
262
262
  });
263
263
  }
264
264
 
265
+ // ─── finish_task ──────────────────────────────────────────────────────────────
266
+
267
+ const finishTask: BuiltInToolHandler = {
268
+ idempotent: true,
269
+ schema: {
270
+ type: 'function',
271
+ function: {
272
+ name: 'finish_task',
273
+ description: 'Signal that the task is complete. Call this when ALL required actions have been performed.',
274
+ parameters: {
275
+ type: 'object',
276
+ properties: {
277
+ summary: { type: 'string', description: 'Summary of what was accomplished' },
278
+ evidence_paths: { type: 'array', items: { type: 'string' }, description: 'Paths to files created or modified' },
279
+ },
280
+ required: ['summary'],
281
+ },
282
+ },
283
+ },
284
+ async execute(args, _cwd) {
285
+ return JSON.stringify({
286
+ __finish_task__: true,
287
+ summary: String(args.summary || ''),
288
+ evidence_paths: Array.isArray(args.evidence_paths) ? args.evidence_paths : [],
289
+ });
290
+ },
291
+ };
292
+
265
293
  // ─── Registry ─────────────────────────────────────────────────────────────────
266
294
 
267
295
  export const BUILT_IN_TOOLS: Record<string, BuiltInToolHandler> = {
@@ -271,6 +299,7 @@ export const BUILT_IN_TOOLS: Record<string, BuiltInToolHandler> = {
271
299
  glob,
272
300
  grep,
273
301
  run_command: runCommand,
302
+ finish_task: finishTask,
274
303
  };
275
304
 
276
305
  export const ALL_BUILT_IN_SCHEMAS: ToolSchema[] = Object.values(BUILT_IN_TOOLS).map((t) => t.schema);
@@ -32,9 +32,13 @@ export interface LlmExecutorEvent {
32
32
  detail?: Record<string, unknown>;
33
33
  }
34
34
 
35
+ export interface LlmExecuteOptions {
36
+ previousError?: string | null;
37
+ }
38
+
35
39
  const DEFAULT_SYSTEM_PROMPT =
36
40
  'You are a precise software engineering agent. Use the tools provided to complete the task. ' +
37
- 'When the task is done, summarize what was accomplished in your final message without calling any tools.';
41
+ 'When all actions are done, call finish_task with a summary of what was accomplished.';
38
42
 
39
43
  export class LlmTaskExecutor implements TaskExecutor {
40
44
  constructor(
@@ -48,8 +52,9 @@ export class LlmTaskExecutor implements TaskExecutor {
48
52
  lease: WorkspaceLease,
49
53
  runId: string,
50
54
  attempt: number,
55
+ options: LlmExecuteOptions = {},
51
56
  ): Promise<TaskResult> {
52
- const prompt = buildNodePrompt(node, lease, runId, attempt);
57
+ const prompt = buildNodePrompt(node, lease, runId, attempt, { previousError: options.previousError ?? null });
53
58
  const tools = selectToolsForActions(node.actions);
54
59
  const cwd = lease.root_path;
55
60
  const maxTurns = this.provider.maxTurns ?? 10;
@@ -62,8 +67,11 @@ export class LlmTaskExecutor implements TaskExecutor {
62
67
 
63
68
  let finalOutput = '';
64
69
  const evidencePaths: string[] = [];
70
+ let completedByFinishTask = false;
71
+ let finishTaskSummary = '';
65
72
 
66
- for (let turn = 0; turn < maxTurns; turn++) {
73
+ let turn = 0;
74
+ for (; turn < maxTurns; turn++) {
67
75
  this.emit({ type: 'turn_start', nodeId: node.id, attempt, detail: { turn } });
68
76
 
69
77
  let response;
@@ -105,13 +113,47 @@ export class LlmTaskExecutor implements TaskExecutor {
105
113
  }
106
114
 
107
115
  messages.push(...concurrentResults, ...serialResults);
116
+
117
+ // Detect finish_task call — authoritative completion signal
118
+ const allResults = [...concurrentResults, ...serialResults];
119
+ const finishResult = allResults.find((r) => r.name === 'finish_task');
120
+ if (finishResult) {
121
+ try {
122
+ const parsed = JSON.parse(finishResult.content as string);
123
+ if (parsed.__finish_task__) {
124
+ completedByFinishTask = true;
125
+ finishTaskSummary = parsed.summary || '';
126
+ if (Array.isArray(parsed.evidence_paths)) {
127
+ evidencePaths.push(...parsed.evidence_paths.filter((p: unknown) => typeof p === 'string'));
128
+ }
129
+ }
130
+ } catch { /* ignore parse errors */ }
131
+ if (completedByFinishTask) break;
132
+ }
133
+ }
134
+
135
+ const completedBy = completedByFinishTask
136
+ ? 'finish_task'
137
+ : turn < maxTurns
138
+ ? 'no_tool_call'
139
+ : 'turn_limit_exhausted';
140
+
141
+ if (completedBy === 'turn_limit_exhausted') {
142
+ return {
143
+ success: false,
144
+ failure_class: 'llm',
145
+ evidence: evidencePaths,
146
+ output: finalOutput || `Task exhausted ${maxTurns} turns without calling finish_task`,
147
+ completed_by: completedBy,
148
+ };
108
149
  }
109
150
 
110
151
  return {
111
152
  success: true,
112
153
  failure_class: null,
113
154
  evidence: evidencePaths,
114
- output: finalOutput,
155
+ output: completedByFinishTask ? (finishTaskSummary || finalOutput) : finalOutput,
156
+ completed_by: completedBy,
115
157
  };
116
158
  }
117
159
 
@@ -1,11 +1,16 @@
1
1
  import type { GraphNode } from '../compiler/graph-compiler';
2
2
  import type { WorkspaceLease } from '../models/workspace';
3
3
 
4
+ export interface NodePromptOptions {
5
+ previousError?: string | null;
6
+ }
7
+
4
8
  export function buildNodePrompt(
5
9
  node: GraphNode,
6
10
  lease: WorkspaceLease,
7
11
  runId: string,
8
12
  attempt: number,
13
+ options: NodePromptOptions = {},
9
14
  ): string {
10
15
  const lines: string[] = [
11
16
  `# Tarefa: ${node.title}`,
@@ -18,6 +23,15 @@ export function buildNodePrompt(
18
23
  lines.push(`**Escopo de mutação:** ${node.mutation_scope.join(', ')}`);
19
24
  }
20
25
 
26
+ if (attempt > 1 && options.previousError) {
27
+ lines.push('', '## Contexto da tentativa anterior');
28
+ lines.push(`Esta é a tentativa **${attempt}**. A tentativa anterior falhou:`);
29
+ lines.push('', '```');
30
+ lines.push(String(options.previousError).slice(0, 2000));
31
+ lines.push('```', '');
32
+ lines.push('Analise o erro e tente uma abordagem diferente.');
33
+ }
34
+
21
35
  if (node.actions.length > 0) {
22
36
  lines.push('', '## Ações requeridas');
23
37
  for (const action of node.actions) {
@@ -39,7 +53,10 @@ export function buildNodePrompt(
39
53
  lines.push('', `**Verificação:** \`${node.verify.command}\``);
40
54
  }
41
55
 
42
- lines.push('', 'Execute as ações acima usando as ferramentas disponíveis e confirme o resultado.');
56
+ lines.push('', '## Conclusão da tarefa');
57
+ lines.push('Quando **todas** as ações estiverem concluídas, chame `finish_task` com um resumo do que foi realizado.');
58
+ lines.push('NÃO chame `finish_task` antes de completar todas as ações requeridas.');
59
+ lines.push('', 'Execute as ações acima usando as ferramentas disponíveis.');
43
60
 
44
61
  return lines.join('\n');
45
62
  }