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
@@ -8,4 +8,6 @@ export type FailureClass =
8
8
  | 'test' // verification / acceptance test failed
9
9
  | 'timeout' // task or run exceeded time budget
10
10
  | 'evidence_missing' // required evidence was not collected
11
+ | 'verify' // inline verification command failed after execution
12
+ | 'llm' // LLM exhausted turn budget without calling finish_task
11
13
  | null; // success — no failure
@@ -24,12 +24,15 @@ import type { FailureClass } from '../models/failure';
24
24
  import { listMemos } from '../decision/decision-memo';
25
25
  import type { RollbackPlan } from '../decision/decision-memo';
26
26
  import { runCapabilityAsync } from '../plugins/capability-adapter';
27
+ import { verifyRun } from '../verification/verification-compiler';
28
+ import type { AcceptanceCheckSuite } from '../verification/verification-compiler';
27
29
 
28
30
  export interface TaskResult {
29
31
  success: boolean;
30
32
  failure_class: FailureClass;
31
33
  evidence: string[];
32
34
  output: string;
35
+ completed_by?: string;
33
36
  }
34
37
 
35
38
  export interface TaskExecutor {
@@ -37,7 +40,8 @@ export interface TaskExecutor {
37
40
  node: GraphNode,
38
41
  lease: WorkspaceLease,
39
42
  runId: string,
40
- attemptNumber: number
43
+ attemptNumber: number,
44
+ options?: { previousError?: string | null }
41
45
  ): Promise<TaskResult>;
42
46
  }
43
47
 
@@ -477,6 +481,7 @@ export class Scheduler {
477
481
 
478
482
  let lease: WorkspaceLease | null = null;
479
483
  let lastResult: TaskResult | null = null;
484
+ let lastError: string | null = null;
480
485
  const maxAttempts = node.policy.max_retries + 1;
481
486
  const quotaBlocked = this.consumeQuotaForNode(ctx, node);
482
487
  if (quotaBlocked) {
@@ -542,21 +547,33 @@ export class Scheduler {
542
547
  payload: { workspace_id: lease.workspace_id, strategy: lease.strategy },
543
548
  });
544
549
 
545
- lastResult = await this.executeNode(node, lease, ctx, attempt, attemptId);
550
+ lastResult = await this.executeNode(node, lease, ctx, attempt, attemptId, { previousError: lastError });
546
551
 
547
552
  if (lastResult.success) {
548
- this.emit(ctx, {
549
- type: 'WorkItemCompleted',
550
- work_item_id: nodeId,
551
- attempt_id: attemptId,
552
- payload: { attempt_number: attempt, evidence: lastResult.evidence },
553
- });
554
- status.set(nodeId, 'completed');
555
- completed.push(nodeId);
556
- this.recordProgress();
557
- return;
553
+ const verifyResult = await this.verifyNode(node, lease, ctx, attemptId, attempt);
554
+ if (verifyResult && verifyResult.status === 'failed') {
555
+ lastResult = {
556
+ success: false,
557
+ failure_class: 'verify',
558
+ evidence: lastResult.evidence,
559
+ output: `Verification failed: ${(verifyResult.gaps || []).join('; ') || 'checks did not pass'}`,
560
+ };
561
+ } else {
562
+ this.emit(ctx, {
563
+ type: 'WorkItemCompleted',
564
+ work_item_id: nodeId,
565
+ attempt_id: attemptId,
566
+ payload: { attempt_number: attempt, evidence: lastResult.evidence },
567
+ });
568
+ status.set(nodeId, 'completed');
569
+ completed.push(nodeId);
570
+ this.recordProgress();
571
+ return;
572
+ }
558
573
  }
559
574
 
575
+ lastError = lastResult.output || (lastResult.failure_class ?? 'unknown error');
576
+
560
577
  if (lastResult.failure_class === 'policy') break;
561
578
 
562
579
  if (attempt < maxAttempts) {
@@ -592,6 +609,7 @@ export class Scheduler {
592
609
  evidence: [],
593
610
  output: `[error_boundary] ${message}`,
594
611
  };
612
+ lastError = lastResult.output;
595
613
  if (attempt < maxAttempts) {
596
614
  const backoffMs = Math.min(1_000 * Math.pow(2, attempt - 1) + Math.random() * 500, 30_000);
597
615
  await new Promise<void>(resolve => setTimeout(resolve, backoffMs));
@@ -660,12 +678,13 @@ export class Scheduler {
660
678
  lease: WorkspaceLease,
661
679
  ctx: SchedulerContext,
662
680
  attempt: number,
663
- attemptId: string
681
+ attemptId: string,
682
+ options: { previousError?: string | null } = {},
664
683
  ): Promise<TaskResult> {
665
684
  const primaryAction = pickPrimaryAction(node, ctx.pluginRegistry);
666
685
  const provider = primaryAction ? ctx.pluginRegistry?.toolProviderFor(primaryAction.type) : null;
667
686
  if (!provider || !primaryAction) {
668
- return ctx.executor.execute(node, lease, ctx.runId, attempt);
687
+ return ctx.executor.execute(node, lease, ctx.runId, attempt, options);
669
688
  }
670
689
 
671
690
  ctx.auditTrail?.record('plugin_invoked', ctx.policyActor ?? 'runtime', {
@@ -733,6 +752,62 @@ export class Scheduler {
733
752
  };
734
753
  }
735
754
 
755
+ private async verifyNode(
756
+ node: GraphNode,
757
+ lease: WorkspaceLease,
758
+ ctx: SchedulerContext,
759
+ attemptId: string,
760
+ attempt: number,
761
+ ): Promise<{ status: string; gaps?: string[] } | null> {
762
+ if (!node.verify?.command) return null;
763
+ this.emit(ctx, {
764
+ type: 'VerificationStarted',
765
+ work_item_id: node.id,
766
+ payload: { command: node.verify.command, attempt_number: attempt },
767
+ });
768
+ const suite: AcceptanceCheckSuite = {
769
+ checks: [{
770
+ id: `inline-${node.id}`,
771
+ type: 'custom',
772
+ command: node.verify.command,
773
+ evidence_type_expected: 'stdout',
774
+ acceptance_ref: null,
775
+ description: `Verify ${node.id}`,
776
+ }],
777
+ compiled_at: new Date().toISOString(),
778
+ spec_hash: '',
779
+ plan_hash: '',
780
+ };
781
+ let result: { status: string; gaps?: string[] };
782
+ try {
783
+ result = await verifyRun({
784
+ suite,
785
+ cwd: lease.root_path,
786
+ timeoutMs: (ctx.options as Record<string, unknown>)?.verifyTimeoutMs as number ?? 60_000,
787
+ runId: ctx.runId,
788
+ workItemId: node.id,
789
+ attemptNumber: attempt,
790
+ projectRoot: ctx.projectRoot,
791
+ pluginRegistry: ctx.pluginRegistry,
792
+ });
793
+ } catch (err) {
794
+ this.emit(ctx, {
795
+ type: 'VerificationCompleted',
796
+ work_item_id: node.id,
797
+ attempt_id: attemptId,
798
+ payload: { status: 'error', error: String(err) },
799
+ });
800
+ return null;
801
+ }
802
+ this.emit(ctx, {
803
+ type: 'VerificationCompleted',
804
+ work_item_id: node.id,
805
+ attempt_id: attemptId,
806
+ payload: { status: result.status },
807
+ });
808
+ return result;
809
+ }
810
+
736
811
  private evaluatePolicyForNode(node: GraphNode, ctx: SchedulerContext): PersistedPolicyDecision | null {
737
812
  if (!ctx.policyEngine) return null;
738
813
  const primaryAction = pickPrimaryAction(node, ctx.pluginRegistry);
@@ -767,7 +842,10 @@ export class Scheduler {
767
842
  ctx: SchedulerContext,
768
843
  decision: PersistedPolicyDecision | null
769
844
  ): Promise<string> {
770
- if (!ctx.gateManager) return 'gate-missing-manager';
845
+ if (!ctx.gateManager) {
846
+ console.warn('[scheduler] ctx.gateManager not configured — gates will not be persisted');
847
+ return 'gate-missing-manager';
848
+ }
771
849
  const scope = inferGateScope(node);
772
850
  const primaryAction = pickPrimaryAction(node, ctx.pluginRegistry);
773
851
  const gate = await ctx.gateManager.request(scope, {
@@ -188,16 +188,18 @@ export async function runCheck(
188
188
 
189
189
  const start = Date.now();
190
190
  try {
191
- // Split command into program + args (simple split; no shell expansion)
192
- const parts = check.command.split(/\s+/);
193
- const prog = parts[0];
194
- const args = parts.slice(1);
191
+ // Use shell so the full command string is interpreted (handles quotes, &&, node -e "...")
192
+ const isWin = process.platform === 'win32';
193
+ const shell = isWin ? 'cmd' : 'sh';
194
+ const shellArgs = isWin ? ['/c', check.command] : ['-c', check.command];
195
195
 
196
- const result = spawnSync(prog, args, {
196
+ const result = spawnSync(shell, shellArgs, {
197
197
  cwd,
198
198
  encoding: 'utf8',
199
199
  timeout: timeoutMs,
200
200
  maxBuffer: 2 * 1024 * 1024,
201
+ // On Windows, prevent Node from re-quoting the args (preserves double-quotes inside node -e "...")
202
+ windowsVerbatimArguments: isWin,
201
203
  });
202
204
 
203
205
  const duration_ms = Date.now() - start;
@@ -1,185 +1,185 @@
1
- {
2
- "name": "oxe-agents",
3
- "displayName": "OXE Agents",
4
- "description": "Agentes OXE para GitHub Copilot Chat — cada fase do ciclo como um @agente no VS Code",
5
- "version": "1.7.0",
6
- "publisher": "oxe-cc",
1
+ {
2
+ "name": "oxe-agents",
3
+ "displayName": "OXE Agents",
4
+ "description": "Agentes OXE para GitHub Copilot Chat — cada fase do ciclo como um @agente no VS Code",
5
+ "version": "1.8.3",
6
+ "publisher": "oxe-cc",
7
7
  "license": "MIT",
8
- "engines": {
9
- "vscode": "^1.95.0"
10
- },
11
- "categories": [
12
- "AI",
13
- "Programming Languages",
14
- "Other"
15
- ],
16
- "keywords": [
17
- "oxe",
18
- "copilot",
19
- "chat",
20
- "agent",
21
- "workflow",
22
- "spec-driven"
23
- ],
24
- "extensionDependencies": [
25
- "GitHub.copilot-chat"
26
- ],
27
- "activationEvents": [
28
- "onStartupFinished"
29
- ],
30
- "main": "./src/extension.js",
31
- "contributes": {
32
- "chatParticipants": [
33
- {
34
- "id": "oxe.router",
35
- "name": "oxe",
36
- "fullName": "OXE",
37
- "description": "Router universal — lê STATE.md e sugere o próximo passo do ciclo OXE",
38
- "isSticky": false,
39
- "sampleRequest": "Qual é a situação atual do projeto e o próximo passo recomendado?"
40
- },
41
- {
42
- "id": "oxe.ask",
43
- "name": "oxe-ask",
44
- "fullName": "OXE Ask",
45
- "description": "Situational awareness — responde perguntas sobre o estado atual do projeto com evidência explícita",
46
- "isSticky": false,
47
- "sampleRequest": "Qual é a fase atual e o que foi implementado até agora?"
48
- },
49
- {
50
- "id": "oxe.scan",
51
- "name": "oxe-scan",
52
- "fullName": "OXE Scan",
53
- "description": "Mapeamento do codebase — reconstrói .oxe/codebase/ e contextualiza o projeto para um novo ciclo",
54
- "isSticky": false,
55
- "sampleRequest": "Mapeie o codebase e atualize o contexto do projeto."
56
- },
57
- {
58
- "id": "oxe.spec",
59
- "name": "oxe-spec",
60
- "fullName": "OXE Spec",
61
- "description": "Especificação — gera SPEC.md com critérios de aceite verificáveis a partir de requisitos",
62
- "isSticky": true,
63
- "sampleRequest": "Preciso adicionar autenticação JWT ao sistema. Gere a especificação.",
64
- "commands": [
65
- {
66
- "name": "discuss",
67
- "description": "Abrir discussão estruturada antes de gerar a spec"
68
- }
69
- ]
70
- },
71
- {
72
- "id": "oxe.plan",
73
- "name": "oxe-plan",
74
- "fullName": "OXE Plan",
75
- "description": "Planejamento — gera PLAN.md com ondas, tarefas, hipóteses críticas e confidence vector",
76
- "isSticky": true,
77
- "sampleRequest": "Gere o plano de implementação para o SPEC atual.",
78
- "commands": [
79
- {
80
- "name": "replan",
81
- "description": "Replanejar ciclo atual com motivo e lições aplicadas"
82
- },
83
- {
84
- "name": "agents",
85
- "description": "Gerar blueprint multi-agente para planos com múltiplos domínios"
86
- }
87
- ]
88
- },
89
- {
90
- "id": "oxe.quick",
91
- "name": "oxe-quick",
92
- "fullName": "OXE Quick",
93
- "description": "Plano rápido — para tarefas S/M sem SPEC formal; objetivo → passos → verify",
94
- "isSticky": true,
95
- "sampleRequest": "Preciso renomear a função processPayment para handlePayment em todos os arquivos."
96
- },
97
- {
98
- "id": "oxe.execute",
99
- "name": "oxe-execute",
100
- "fullName": "OXE Execute",
101
- "description": "Execução — implementa a onda atual do PLAN validando hipóteses antes de mutar",
102
- "isSticky": true,
103
- "sampleRequest": "Execute a onda atual do plano.",
104
- "commands": [
105
- {
106
- "name": "wave",
107
- "description": "Executar uma onda específica (ex: /wave 2)"
108
- },
109
- {
110
- "name": "task",
111
- "description": "Executar uma tarefa específica (ex: /task T3)"
112
- }
113
- ]
114
- },
115
- {
116
- "id": "oxe.debug",
117
- "name": "oxe-debug",
118
- "fullName": "OXE Debug",
119
- "description": "Debug — diagnóstico orientado a hipóteses durante execução travada ou falha inline",
120
- "isSticky": false,
121
- "sampleRequest": "A tarefa T3 está falhando com erro de timeout. Ajude a diagnosticar."
122
- },
123
- {
124
- "id": "oxe.verify",
125
- "name": "oxe-verify",
126
- "fullName": "OXE Verify",
127
- "description": "Verificação — valida critérios A* do SPEC contra evidências reais produzidas pelo executor",
128
- "isSticky": true,
129
- "sampleRequest": "Verifique se a implementação atende todos os critérios do SPEC.",
130
- "commands": [
131
- {
132
- "name": "audit",
133
- "description": "Auditoria adversarial: sem acesso ao PLAN, apenas SPEC + evidências"
134
- }
135
- ]
136
- },
137
- {
138
- "id": "oxe.review",
139
- "name": "oxe-review",
140
- "fullName": "OXE Review",
141
- "description": "Revisão de código — auditor adversarial de PR e mudanças, findings por severidade",
142
- "isSticky": false,
143
- "sampleRequest": "Revise as mudanças desta branch e liste os findings por severidade."
144
- },
145
- {
146
- "id": "oxe.capabilities",
147
- "name": "oxe-capabilities",
148
- "fullName": "OXE Capabilities",
149
- "description": "Capabilities — lista, instala, remove e atualiza capabilities nativas do projeto em .oxe/",
150
- "isSticky": false,
151
- "sampleRequest": "Liste as capabilities disponíveis neste projeto.",
152
- "commands": [
153
- {
154
- "name": "list",
155
- "description": "Listar capabilities instaladas"
156
- },
157
- {
158
- "name": "install",
159
- "description": "Instalar uma capability"
160
- }
161
- ]
162
- },
163
- {
164
- "id": "oxe.skill",
165
- "name": "oxe-skill",
166
- "fullName": "OXE Skill",
167
- "description": "Skills — gerencia skills e habilidades registradas no framework OXE do projeto",
168
- "isSticky": false,
169
- "sampleRequest": "Quais skills estão disponíveis neste projeto OXE?"
170
- },
171
- {
172
- "id": "oxe.dashboard",
173
- "name": "oxe-dashboard",
174
- "fullName": "OXE Dashboard",
175
- "description": "Dashboard — exibe status operacional: runtime, ondas, checkpoints e saúde do ciclo",
176
- "isSticky": false,
177
- "sampleRequest": "Mostre o status do dashboard: fase, active run e próximo passo."
178
- }
179
- ]
180
- },
181
- "repository": {
182
- "type": "git",
183
- "url": "https://github.com/oxe-cc/oxe-cc"
184
- }
185
- }
8
+ "engines": {
9
+ "vscode": "^1.95.0"
10
+ },
11
+ "categories": [
12
+ "AI",
13
+ "Programming Languages",
14
+ "Other"
15
+ ],
16
+ "keywords": [
17
+ "oxe",
18
+ "copilot",
19
+ "chat",
20
+ "agent",
21
+ "workflow",
22
+ "spec-driven"
23
+ ],
24
+ "extensionDependencies": [
25
+ "GitHub.copilot-chat"
26
+ ],
27
+ "activationEvents": [
28
+ "onStartupFinished"
29
+ ],
30
+ "main": "./src/extension.js",
31
+ "contributes": {
32
+ "chatParticipants": [
33
+ {
34
+ "id": "oxe.router",
35
+ "name": "oxe",
36
+ "fullName": "OXE",
37
+ "description": "Router universal — lê STATE.md e sugere o próximo passo do ciclo OXE",
38
+ "isSticky": false,
39
+ "sampleRequest": "Qual é a situação atual do projeto e o próximo passo recomendado?"
40
+ },
41
+ {
42
+ "id": "oxe.ask",
43
+ "name": "oxe-ask",
44
+ "fullName": "OXE Ask",
45
+ "description": "Situational awareness — responde perguntas sobre o estado atual do projeto com evidência explícita",
46
+ "isSticky": false,
47
+ "sampleRequest": "Qual é a fase atual e o que foi implementado até agora?"
48
+ },
49
+ {
50
+ "id": "oxe.scan",
51
+ "name": "oxe-scan",
52
+ "fullName": "OXE Scan",
53
+ "description": "Mapeamento do codebase — reconstrói .oxe/codebase/ e contextualiza o projeto para um novo ciclo",
54
+ "isSticky": false,
55
+ "sampleRequest": "Mapeie o codebase e atualize o contexto do projeto."
56
+ },
57
+ {
58
+ "id": "oxe.spec",
59
+ "name": "oxe-spec",
60
+ "fullName": "OXE Spec",
61
+ "description": "Especificação — gera SPEC.md com critérios de aceite verificáveis a partir de requisitos",
62
+ "isSticky": true,
63
+ "sampleRequest": "Preciso adicionar autenticação JWT ao sistema. Gere a especificação.",
64
+ "commands": [
65
+ {
66
+ "name": "discuss",
67
+ "description": "Abrir discussão estruturada antes de gerar a spec"
68
+ }
69
+ ]
70
+ },
71
+ {
72
+ "id": "oxe.plan",
73
+ "name": "oxe-plan",
74
+ "fullName": "OXE Plan",
75
+ "description": "Planejamento — gera PLAN.md com ondas, tarefas, hipóteses críticas e confidence vector",
76
+ "isSticky": true,
77
+ "sampleRequest": "Gere o plano de implementação para o SPEC atual.",
78
+ "commands": [
79
+ {
80
+ "name": "replan",
81
+ "description": "Replanejar ciclo atual com motivo e lições aplicadas"
82
+ },
83
+ {
84
+ "name": "agents",
85
+ "description": "Gerar blueprint multi-agente para planos com múltiplos domínios"
86
+ }
87
+ ]
88
+ },
89
+ {
90
+ "id": "oxe.quick",
91
+ "name": "oxe-quick",
92
+ "fullName": "OXE Quick",
93
+ "description": "Plano rápido — para tarefas S/M sem SPEC formal; objetivo → passos → verify",
94
+ "isSticky": true,
95
+ "sampleRequest": "Preciso renomear a função processPayment para handlePayment em todos os arquivos."
96
+ },
97
+ {
98
+ "id": "oxe.execute",
99
+ "name": "oxe-execute",
100
+ "fullName": "OXE Execute",
101
+ "description": "Execução — implementa a onda atual do PLAN validando hipóteses antes de mutar",
102
+ "isSticky": true,
103
+ "sampleRequest": "Execute a onda atual do plano.",
104
+ "commands": [
105
+ {
106
+ "name": "wave",
107
+ "description": "Executar uma onda específica (ex: /wave 2)"
108
+ },
109
+ {
110
+ "name": "task",
111
+ "description": "Executar uma tarefa específica (ex: /task T3)"
112
+ }
113
+ ]
114
+ },
115
+ {
116
+ "id": "oxe.debug",
117
+ "name": "oxe-debug",
118
+ "fullName": "OXE Debug",
119
+ "description": "Debug — diagnóstico orientado a hipóteses durante execução travada ou falha inline",
120
+ "isSticky": false,
121
+ "sampleRequest": "A tarefa T3 está falhando com erro de timeout. Ajude a diagnosticar."
122
+ },
123
+ {
124
+ "id": "oxe.verify",
125
+ "name": "oxe-verify",
126
+ "fullName": "OXE Verify",
127
+ "description": "Verificação — valida critérios A* do SPEC contra evidências reais produzidas pelo executor",
128
+ "isSticky": true,
129
+ "sampleRequest": "Verifique se a implementação atende todos os critérios do SPEC.",
130
+ "commands": [
131
+ {
132
+ "name": "audit",
133
+ "description": "Auditoria adversarial: sem acesso ao PLAN, apenas SPEC + evidências"
134
+ }
135
+ ]
136
+ },
137
+ {
138
+ "id": "oxe.review",
139
+ "name": "oxe-review",
140
+ "fullName": "OXE Review",
141
+ "description": "Revisão de código — auditor adversarial de PR e mudanças, findings por severidade",
142
+ "isSticky": false,
143
+ "sampleRequest": "Revise as mudanças desta branch e liste os findings por severidade."
144
+ },
145
+ {
146
+ "id": "oxe.capabilities",
147
+ "name": "oxe-capabilities",
148
+ "fullName": "OXE Capabilities",
149
+ "description": "Capabilities — lista, instala, remove e atualiza capabilities nativas do projeto em .oxe/",
150
+ "isSticky": false,
151
+ "sampleRequest": "Liste as capabilities disponíveis neste projeto.",
152
+ "commands": [
153
+ {
154
+ "name": "list",
155
+ "description": "Listar capabilities instaladas"
156
+ },
157
+ {
158
+ "name": "install",
159
+ "description": "Instalar uma capability"
160
+ }
161
+ ]
162
+ },
163
+ {
164
+ "id": "oxe.skill",
165
+ "name": "oxe-skill",
166
+ "fullName": "OXE Skill",
167
+ "description": "Skills — gerencia skills e habilidades registradas no framework OXE do projeto",
168
+ "isSticky": false,
169
+ "sampleRequest": "Quais skills estão disponíveis neste projeto OXE?"
170
+ },
171
+ {
172
+ "id": "oxe.dashboard",
173
+ "name": "oxe-dashboard",
174
+ "fullName": "OXE Dashboard",
175
+ "description": "Dashboard — exibe status operacional: runtime, ondas, checkpoints e saúde do ciclo",
176
+ "isSticky": false,
177
+ "sampleRequest": "Mostre o status do dashboard: fase, active run e próximo passo."
178
+ }
179
+ ]
180
+ },
181
+ "repository": {
182
+ "type": "git",
183
+ "url": "https://github.com/oxe-cc/oxe-cc"
184
+ }
185
+ }