oxe-cc 0.3.1 → 0.3.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.
@@ -18,6 +18,7 @@ Se o utilizador mencionar **OXE**, **oxe**, **/oxe-**, ou pedidos como “mapear
18
18
  | Execute | `oxe/workflows/execute.md` | “oxe execute”, “executar onda”, “onda 2 OXE” |
19
19
  | Verify | `oxe/workflows/verify.md` | “oxe verify”, “validar plano OXE”, “VERIFY.md” |
20
20
  | Next | `oxe/workflows/next.md` | “oxe next”, “próximo passo OXE” |
21
+ | Review PR | `oxe/workflows/review-pr.md` | “revisar PR”, link `…/pull/10`, “diff entre branches”, “code review OXE” *(prompt: `/oxe-review-pr`)* |
21
22
  | Help | `oxe/workflows/help.md` | “oxe help”, “como usar OXE” |
22
23
 
23
24
  **Regra:** lê o Markdown indicado e executa **todos** os passos e critérios de sucesso descritos nesse ficheiro. Não atalhes: cria ou atualiza os ficheiros em `.oxe/` conforme o workflow.
@@ -30,7 +31,8 @@ Se o utilizador mencionar **OXE**, **oxe**, **/oxe-**, ou pedidos como “mapear
30
31
  ## Cursor vs Copilot
31
32
 
32
33
  - **Cursor:** slash commands em `.cursor/commands/oxe-*.md` apontam para os mesmos workflows.
33
- - **Copilot:** prompt files em `.github/prompts/oxe-*.prompt.md`; cada um indica o workflow em `oxe/workflows/<passo>.md` na raiz do repo.
34
+ - **Copilot (VS Code Chat):** prompt files em `.github/prompts/oxe-*.prompt.md`; cada um indica o workflow em `oxe/workflows/<passo>.md` na raiz do repo. **`oxe-review-pr`** existe só como prompt Copilot (não há slash command Cursor correspondente).
35
+ - **Copilot CLI (terminal, experimental):** com `oxe-cc --copilot-cli`, os mesmos textos são copiados para **`.claude/commands/oxe-*.md`** — versões recentes do CLI podem expor **`/oxe-scan`**, etc. Isto depende da versão do `copilot`; não faz parte do contrato estável do OXE.
34
36
 
35
37
  ## Manutenção deste pacote (oxe-build)
36
38
 
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: oxe-review-pr
3
+ agent: agent
4
+ description: OXE — Revisão de PR (link GitHub, branches ou SHAs)
5
+ argument-hint: "URL ou refs: https://github.com/org/repo/pull/10 | main feature/foo"
6
+ ---
7
+
8
+ Executa o workflow **OXE review-pr**. Lê e aplica **integralmente**:
9
+
10
+ `oxe/workflows/review-pr.md` (na raiz do repositório em contexto)
11
+
12
+ **Exemplos de entrada:** cola o URL da PR (`https://github.com/org/repo/pull/10`, com ou sem `/files`); ou `org/repo#10`; ou **base** e **head** (branches/tags/SHAs). Sem refs, o agente infere (ex.: `main` vs branch atual).
package/AGENTS.md CHANGED
@@ -6,6 +6,7 @@ Este repositório empacota o fluxo **OXE** (spec-driven, artefatos em `.oxe/`).
6
6
  - **Instruções do repositório:** [.github/copilot-instructions.md](.github/copilot-instructions.md) — aplicadas automaticamente no Copilot Chat quando o repo está em contexto.
7
7
  - **Workflows canónicos:** [oxe/workflows/](oxe/workflows/) — editar aqui primeiro; Cursor e Copilot apontam para estes ficheiros (inclui `quick.md`, `execute.md`).
8
8
  - **CLI:** `oxe-cc` instala assets e bootstrap (`.oxe/STATE.md`, `config.json`, `codebase/`); `oxe-cc doctor` valida workflows, JSON de config e mapa scan; `oxe-cc init-oxe` só inicializa `.oxe/`.
9
- - **Prompt files (Copilot / VS Code):** [.github/prompts/*.prompt.md](.github/prompts/) — invocar com `/` no chat (ex. `/oxe-scan`) após `chat.promptFiles` estar ativo.
9
+ - **Prompt files (Copilot / VS Code):** [.github/prompts/*.prompt.md](.github/prompts/) — invocar com `/` no chat (ex. `/oxe-scan`, `/oxe-review-pr` para diff tipo PR) após `chat.promptFiles` estar ativo.
10
+ - **Copilot CLI (experimental):** `oxe-cc --copilot-cli` → `.claude/commands/oxe-*.md` para testar `/oxe-scan` no terminal.
10
11
 
11
12
  Quando o utilizador pedir uma etapa OXE por linguagem natural, segue o ficheiro `oxe/workflows/<passo>.md` correspondente sem atalhar passos.
package/README.md CHANGED
@@ -1,226 +1,244 @@
1
- # oxe-build
1
+ <div align="center">
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/oxe-cc.svg)](https://www.npmjs.com/package/oxe-cc)
4
- [![license](https://img.shields.io/npm/l/oxe-cc.svg)](https://www.npmjs.com/package/oxe-cc)
3
+ <p align="center">
4
+ <img src="assets/readme-banner.svg" alt="OXE" width="920" />
5
+ </p>
5
6
 
6
- *(O badge de versão reflete uma release real depois de `npm publish` concluído com sucesso.)*
7
+ **Fluxo spec-driven e context engineering para [Cursor](https://cursor.com) e [GitHub Copilot](https://github.com/features/copilot) inspirado na ideia do [GSD](https://github.com/gsd-build/get-shit-done), com **menos comandos** e foco em **`.oxe/`** + **`oxe/workflows/`**.**
7
8
 
8
- Fluxo **spec-driven** enxuto (inspirado em context engineering / GSD), com prefixo **OXE** e artefatos em **`.oxe/`**.
9
+ [![npm](https://img.shields.io/npm/v/oxe-cc.svg?style=flat-square)](https://www.npmjs.com/package/oxe-cc)
10
+ [![license](https://img.shields.io/npm/l/oxe-cc.svg?style=flat-square)](LICENSE)
9
11
 
10
- Os alvos **iniciais** são **Cursor** e **GitHub Copilot** (VS Code e IDEs compatíveis). Outros clientes podem usar os mesmos workflows em Markdown.
12
+ ```bash
13
+ npx oxe-cc@latest
14
+ ```
11
15
 
12
- O nome previsto no npm é **`oxe-cc`**. Confirma se já está publicado: `npm view oxe-cc version`. Se responder **404**, o pacote **ainda não existe** no registry — usa uma das opções abaixo até publicares com sucesso.
16
+ **Manter atualizado:** `npx oxe-cc@latest --force` (na raiz do projeto).
13
17
 
14
- ## Instalação (escolhe uma)
18
+ [Para quem é](#para-quem-é) · [Começar](#começar) · [Como funciona](#como-funciona) · [Modo rápido](#modo-rápido) · [Porque funciona](#porque-funciona) · [Comandos](#comandos) · [Configuração](#configuração) · [Problemas](#resolução-de-problemas)
15
19
 
16
- Precisas de **Node.js 18+**. O executável chama-se **`oxe-cc`**.
20
+ </div>
17
21
 
18
- ### A) Repositório local (sem npm registry)
22
+ ---
19
23
 
20
- ```bash
21
- cd C:\caminho\para\oxe-build
22
- npm link
23
- cd C:\caminho\para\teu-projeto
24
- npm link oxe-cc
25
- oxe-cc
26
- ```
24
+ ## Para quem é
25
+
26
+ Para quem quer **descrever o que quer e ver isso construído de forma consistente** — **sem** simular uma organização enorme de processos em cima do repositório.
27
+
28
+ OXE é **enxuto**: não há dezenas de slash commands nem instalador multi-runtime. Há **um CLI** que copia ficheiros para o projeto, **workflows em Markdown** que o agente segue, e **estado em disco** para a sessão principal não “inchada” com tudo o que já foi decidido.
29
+
30
+ ---
27
31
 
28
- Ou, sem `link`, apontando ao script:
32
+ ## Começar
33
+
34
+ **Requisito:** [Node.js 18+](https://nodejs.org/).
35
+
36
+ Na **raiz do repositório** do teu projeto:
29
37
 
30
38
  ```bash
31
- node C:\caminho\para\oxe-build\bin\oxe-cc.js
39
+ npx oxe-cc@latest
32
40
  ```
33
41
 
34
- ### B) Depois de publicado no npm
42
+ Isto copia, entre outros: **`oxe/`** (workflows + templates), **`.cursor/`** (slash commands), **`.github/`** (instruções Copilot + prompt files), **`commands/oxe/`** (atalhos estilo `oxe:*` para outros clientes), **`AGENTS.md`**, e cria um **`.oxe/`** mínimo (`STATE.md`, `config.json` a partir de template, pasta `codebase/`) — salvo flags como `--no-init-oxe`.
43
+
44
+ Em **terminal interativo**, no fim pergunta se queres instalar o **`oxe-cc` globalmente** (`npm install -g`) ou continuar só com **`npx`**. Em CI ou scripts usa **`--no-global-cli`** / **`-l`**, ou define **`OXE_NO_PROMPT=1`**. Para instalar o CLI sem pergunta: **`--global-cli`** / **`-g`**.
45
+
46
+ **GitHub Copilot CLI (experimental):** para testar slash commands no terminal, instala com **`--copilot-cli`** — copia **`.cursor/commands/*.md`** para **`.claude/commands/`** (ficheiros `oxe-scan.md`, etc., sem `prompt` no nome). Usa na raiz do repo: `npx oxe-cc@latest --force --copilot --copilot-cli`. Depois, na sessão do Copilot CLI, experimenta **`/oxe-scan`**. O suporte depende da versão do CLI; vê [discussão no copilot-cli](https://github.com/github/copilot-cli/issues/1113).
47
+
48
+ **Confirmar instalação no agente**
49
+
50
+ | Onde | O que correr |
51
+ |------|----------------|
52
+ | **Cursor** | `/oxe-help` |
53
+ | **Copilot** (VS Code) | `/oxe-help` no chat, se [prompt files](https://code.visualstudio.com/docs/copilot/customization/prompt-files) estiverem ativos (`"chat.promptFiles": true` — exemplo em [`.vscode/settings.json`](.vscode/settings.json)) |
54
+
55
+ > **Nota:** O Copilot usa **instruções do repositório** (`.github/copilot-instructions.md`) **e** os ficheiros em `.github/prompts/*.prompt.md`. Sem prompt files, ainda podes pedir em linguagem natural (“executa o workflow OXE scan”) com o repo em contexto.
56
+
57
+ **Sem pacote no npm** (`npm view oxe-cc version` → 404): clone este repo, `npm link` na pasta **oxe-build**, `npm link oxe-cc` no teu projeto, e corre `oxe-cc`. Alternativa: `node /caminho/oxe-build/bin/oxe-cc.js`.
58
+
59
+ <details>
60
+ <summary><strong>Instalação: flags úteis (CI, ou só parte do pacote)</strong></summary>
61
+
62
+ | Flag | Efeito |
63
+ |------|--------|
64
+ | `--force` / `-f` | Sobrescreve ficheiros já existentes (**obrigatório** para atualizar cópias antigas) |
65
+ | `--dry-run` | Lista ações sem escrever |
66
+ | `--cursor` / `--copilot` | Instala só uma das stacks |
67
+ | `--oxe-only` | Só a pasta `oxe/` (workflows) |
68
+ | `--no-init-oxe` | Não cria `.oxe/` no fim |
69
+ | `--global-cli` / `-g` | Após copiar: `npm install -g oxe-cc@versão` (sem pergunta) |
70
+ | `--no-global-cli` / `-l` | Não pergunta nem instala o CLI global (útil em CI) |
71
+ | `--copilot-cli` | Copia comandos OXE para `.claude/commands/` (teste com GitHub Copilot CLI) |
72
+ | `--vscode` | Copia `.vscode/settings.json` de exemplo |
73
+ | `--no-commands` | Omite `commands/oxe/` |
74
+ | `--no-agents` | Omite `AGENTS.md` |
75
+ | `--dir <pasta>` ou argumento posicional | Destino em vez do diretório atual |
76
+
77
+ **Global:** `npm install -g oxe-cc`.
78
+
79
+ **Subcomandos:** `oxe-cc doctor` (valida Node, workflows, `.oxe/`), `oxe-cc init-oxe` (só bootstrap `.oxe/`).
80
+
81
+ </details>
82
+
83
+ <details>
84
+ <summary><strong>Desenvolvimento (clonar o oxe-build)</strong></summary>
35
85
 
36
86
  ```bash
37
- cd /caminho/do/teu-projeto
38
- npx oxe-cc@latest
87
+ git clone https://github.com/propagno/oxe-build.git
88
+ cd oxe-build
89
+ npm test
90
+ node bin/oxe-cc.js --help
39
91
  ```
40
92
 
41
- tens OXE nesse repo e saiu release nova? a secção **Atualizar para a versão mais recente** mais abaixo (resumo: `npx oxe-cc@latest --force` na raiz do projeto).
93
+ Para testar no teu app: `npm link` aqui, depois `npm link oxe-cc` no projeto alvo.
42
94
 
43
- Página do pacote (quando existir): [npmjs.com/package/oxe-cc](https://www.npmjs.com/package/oxe-cc). Versões: [aba Versions](https://www.npmjs.com/package/oxe-cc?activeTab=versions).
95
+ </details>
44
96
 
45
- ### C) Erro `npm error 404` / `'oxe-cc@latest' is not in this registry`
97
+ ---
46
98
 
47
- Significa que **nenhuma versão** de `oxe-cc` foi aceite no `registry.npmjs.org`. Causas frequentes:
99
+ ## Como funciona
48
100
 
49
- 1. **`npm publish` falhou** (ex. **403** conta com **2FA obrigatória** para publicar). Ativa 2FA em [npm Security](https://www.npmjs.com/settings/~/security) e volta a correr `npm publish --access public` dentro da pasta do repo, autenticado (`npm login`).
50
- 2. **Nome diferente** — publicaste com **scope** (ex. `@propagno/oxe-cc`). Nesse caso usa `npx @propagno/oxe-cc@latest` (ajusta ao `name` real do `package.json`).
51
- 3. **Outro registry** — confirma: `npm config get registry` → deve ser `https://registry.npmjs.org/` para o público.
101
+ **Já tens código?** Começa por **`/oxe-scan`**. Gera mapas em **`.oxe/codebase/`** (stack, estrutura, testes, convenções, etc.). Assim o **spec** e o **plan** alinham com o repo real à semelhança de correres *map-codebase* antes do roadmap no GSD.
52
102
 
53
- Até o 404 desaparecer, usa a opção **A** (`npm link` ou `node …/bin/oxe-cc.js`).
103
+ ### 1. Mapear `/oxe-scan`
54
104
 
55
- Opções úteis:
105
+ Inventaria o projeto e preenche **`.oxe/codebase/*.md`**, atualiza **`.oxe/STATE.md`**. Podes indicar foco opcional (ex. “só API”).
56
106
 
57
- | Opção | Efeito |
58
- |--------|--------|
59
- | *(omissão)* | **Cursor + Copilot** + `oxe/` + `commands/oxe` + `AGENTS.md` |
60
- | `--all`, `-a` | Garante Cursor e Copilot (mesmo efeito que omitir `--cursor` e `--copilot`) |
61
- | `--dir <pasta>` | Instala noutro diretório em vez do cwd |
62
- | `--cursor` | Só `.cursor/commands` e `.cursor/rules` |
63
- | `--copilot` | Só `.github/copilot-instructions.md` e `.github/prompts` |
64
- | `--vscode` | Copia também `.vscode/settings.json` (`chat.promptFiles`) |
65
- | `--no-commands` | Não copia `commands/oxe/` |
66
- | `--no-agents` | Não copia `AGENTS.md` |
67
- | `--force` / `-f` | Sobrescreve ficheiros já existentes |
68
- | `--dry-run` | Mostra o que faria sem escrever |
69
- | `--no-init-oxe` | Não cria `.oxe/` (STATE, config, codebase) após instalar |
70
- | `--oxe-only` | Copia só a pasta `oxe/` (sem Cursor, Copilot, `commands/oxe`, `AGENTS.md`) |
71
- | `-h` / `--help`, `-v` / `--version` | Ajuda e versão |
107
+ ### 2. Especificar `/oxe-spec`
72
108
 
73
- **Subcomandos:**
109
+ Produz ou atualiza **`.oxe/SPEC.md`**: objetivo, escopo, critérios de aceite, riscos. Isto é o contrato antes do plano.
74
110
 
75
- | Comando | Efeito |
76
- |---------|--------|
77
- | `oxe-cc doctor [dir]` | Node, workflows vs pacote, JSON válido em `.oxe/config.json`, mapa scan (7 ficheiros em `codebase/`) |
78
- | `oxe-cc init-oxe [dir]` | Só `.oxe/`: STATE, `config.json` (template), pasta `codebase/` |
111
+ ### 3. Discutir *(opcional)* — `/oxe-discuss`
79
112
 
80
- A pasta **`oxe/`** (workflows + templates) é **sempre** copiada na instalação normal. `--cursor` / `--copilot` apenas controlam se entram ficheiros em `.cursor/` e `.github/`.
113
+ Captura decisões de implementação (UI, API, tom, edge cases) em **`.oxe/DISCUSS.md`**, para o plano não “adivinhar” o que preferes. Útil quando `discuss_before_plan` está ativo em `.oxe/config.json`. Saltar = defaults razoáveis; usar = mais próximo da tua visão.
81
114
 
82
- Instalação global (só depois do pacote existir no npm): `npm install -g oxe-cc`.
115
+ ### 4. Planear `/oxe-plan`
83
116
 
84
- ### Atualizar para a versão mais recente (depois de um novo `npm publish`)
117
+ Gera **`.oxe/PLAN.md`**: tarefas **atómicas**, **ondas** (paralelo vs sequencial), e bloco **Verificar** (comando de teste ou checklist) **por tarefa**. Ideia: cada tarefa cabe num contexto de agente focado, com verificação explícita — mesmo espírito dos planos XML pequenos do GSD, em Markdown.
85
118
 
86
- O **`oxe-cc` não se auto-atualiza** nos teus projetos: copia ficheiros (`oxe/`, `.cursor/`, …) na altura em que corres o comando. Quando uma release nova no npm:
119
+ Ondas em resumo: tarefas **independentes** na mesma onda podem correr em paralelo; **dependentes** vão para ondas posteriores (como no diagrama de *waves* do GSD, que com menos cerimónia).
87
120
 
88
- | Como usas o CLI | O que fazer |
89
- |-----------------|-------------|
90
- | **`npx oxe-cc@latest`** no projeto | Volta a correr na **raiz do repo alvo**: `npx oxe-cc@latest` (ou `npx oxe-cc@latest --force` para sobrescrever ficheiros já existentes). O `npx` resolve `@latest` no registry; se parecer “preso” a uma versão antiga, limpa a cache: `npx clear-npx-cache` (npm 7+) e tenta de novo. |
91
- | **`npm install -g oxe-cc`** | Atualiza o global: `npm install -g oxe-cc@latest` (ou `npm update -g oxe-cc`). Confirma com `oxe-cc --version`. |
92
- | **`npm link`** ao clone local | Faz `git pull` (ou equivalente) na pasta **`oxe-build`** e volta a correr `oxe-cc` — o link aponta para essa pasta, logo usas o código atual **sem** novo publish. Para alinhar com o que está no npm, publica e usa `npx`/`npm i -g` como acima. |
121
+ ### 5. Executar implementação + `/oxe-execute` *(opcional)*
93
122
 
94
- Ver qual é a última versão publicada:
123
+ Implementas no editor ou deixas o agente seguir **`/oxe-execute`** sobre o plano (ou QUICK). O OXE não impõe subagentes nem commits atómicos por tarefa como o GSD; isso fica ao teu fluxo Git.
95
124
 
96
- ```bash
97
- npm view oxe-cc version
98
- ```
125
+ ### 6. Verificar — `/oxe-verify`
99
126
 
100
- Comparar com a tua cópia (ficheiro `oxe/workflows/scan.md` etc.): se faltam workflows novos, corre outra vez o instalador com **`--force`** onde fizer sentido.
127
+ Cruza **SPEC** + **PLAN** com o código; escreve **`.oxe/VERIFY.md`**. Se algo falhar, corrigis ou replanejas (`/oxe-plan` com lógica de replanejamento descrita no workflow).
101
128
 
102
- ### Nova versão no npm (mantenedores)
129
+ ### 7. Seguir em frente — `/oxe-next` e ciclo
103
130
 
104
- 1. Atualiza **`version`** em `package.json` (semver).
105
- 2. Garante **`repository`**, **`homepage`** e **`bugs`** corretos para o teu GitHub.
106
- 3. Conta npm com **2FA** ativa: `npm login`, depois **`npm publish --access public`**.
107
- 4. O script **`prepublishOnly`** corre testes + `scan:assets` + `--version` antes do upload.
131
+ Para a **próxima** feature ou fase: de novo **spec → plan → …** ou **`/oxe-next`** para sugerir o passo lógico a partir de **STATE.md**.
108
132
 
109
- ### Fork com outro nome no npm
133
+ ---
110
134
 
111
- 1. Edita `package.json`: **`name`** (ex. `@tua-org/oxe-cc`) e **`repository.url`**.
112
- 2. `npm publish --access public` (scopes `@org/...` precisam de `--access public` na primeira publicação).
135
+ ## Modo rápido
113
136
 
114
- ### CLI com nome personalizado
137
+ Para trabalho **adhoc** sem roadmap completo — equivalente conceptual ao **`/gsd:quick`**:
115
138
 
116
- No `package.json`, o binário é o mapa **`bin`**: a chave é o comando no terminal, o valor é o script.
139
+ **`/oxe-quick`** gera **`.oxe/QUICK.md`** com passos curtos e verificação. Depois podes usar **`/oxe-execute`** em cima disso ou implementar direto e fechar com **`/oxe-verify`**.
117
140
 
118
- ```json
119
- "bin": {
120
- "oxe-cc": "bin/oxe-cc.js",
121
- "meu-oxe": "bin/oxe-cc.js"
122
- }
123
- ```
141
+ Se o trabalho crescer, **promove** para spec + plan completos.
124
142
 
125
- Depois de publicar, o comando extra fica disponível **globalmente** com `npm i -g nome-do-pacote` como `meu-oxe`. Com **npx**, o pacote continua a identificar-se pelo **`name`** em `package.json`; para correr um binário que não é o nome do pacote, usa por exemplo `npx -p oxe-cc meu-oxe` (ajusta `oxe-cc` / `meu-oxe` aos teus nomes).
143
+ ---
126
144
 
127
- O ficheiro do script (`bin/oxe-cc.js`) pode ser renomeado desde que atualizes o caminho no mapa `bin`.
145
+ ## Porque funciona
128
146
 
129
- **Desenvolvimento local sem publicar:** na pasta `oxe-build`, `npm link` e no projeto alvo `npm link oxe-cc`, depois `oxe-cc`; ou `node /caminho/para/oxe-build/bin/oxe-cc.js`. **Testes:** `npm test`. **Scan de assets (padrões tipo segredo em markdown):** `npm run scan:assets`.
147
+ **Context engineering:** o agente não precisa de “lembrar” tudo na janela principal o que importa está em ficheiros **pequenos e por etapa**.
130
148
 
131
- ### Imagem / banner no início do CLI
149
+ | Artefato | Função |
150
+ |----------|--------|
151
+ | `.oxe/STATE.md` | Fase, decisões, próximo passo — memória entre sessões |
152
+ | `.oxe/codebase/*.md` | Mapa do repo após scan |
153
+ | `.oxe/SPEC.md` | O que entregar e como saber que está certo |
154
+ | `.oxe/DISCUSS.md` | Preferências antes do plano *(opcional)* |
155
+ | `.oxe/PLAN.md` | Tarefas atómicas + **Verificar** por item |
156
+ | `.oxe/QUICK.md` | Modo rápido |
157
+ | `.oxe/VERIFY.md` | Resultado das verificações |
158
+ | `oxe/workflows/*.md` | **Fonte única** dos passos (Cursor e Copilot só delegam aqui) |
132
159
 
133
- Ao correr `oxe-cc` (instalar, `doctor`, `init-oxe`, `--help`), aparece um **cabeçalho ASCII** vindo de [`bin/banner.txt`](bin/banner.txt). Podes **personalizar** editando esse ficheiro no teu fork antes de publicar no npm.
160
+ **Formato:** planos em Markdown com secções fixas (incl. verificação), legíveis por humanos e por modelos sem XML obrigatório, mas com a mesma ideia de *precise instructions + verify*.
134
161
 
135
- - Placeholder **`{version}`** — substituído pela versão do `package.json` (ex. `v0.3.0`).
136
- - **Cores:** em terminal TTY, o corpo usa ciano + negrito; a linha com a versão fica mais discreta. Define **`NO_COLOR`** (ou `FORCE_COLOR=0`) para saída só texto.
137
- - **Desligar o banner:** variável de ambiente **`OXE_NO_BANNER=1`** (útil em CI ou testes).
138
- - **`--version`** não mostra banner — só uma linha `oxe-cc v…` para scripts.
162
+ ---
139
163
 
140
- Para um “logo” mais elaborado, substitui o conteúdo de `banner.txt` pelo teu ASCII art (várias linhas, largura ~60 colunas costuma caber bem). Não é suportada imagem bitmap no terminal; para isso seria preciso outra ferramenta (ex. `terminal-image`) e dependências extra.
164
+ ## Comandos
141
165
 
142
- ## Fonte única
166
+ ### Fluxo principal
143
167
 
144
- Os passos detalhados vivem em **`oxe/workflows/`** (`scan.md`, `spec.md`, `discuss.md`, `plan.md`, `quick.md`, `execute.md`, `verify.md`, `next.md`, `help.md`). Comandos Cursor, prompts Copilot e `commands/oxe/*` **delegam** para esses ficheiros.
168
+ | Comando | O que faz |
169
+ |---------|-----------|
170
+ | `/oxe-scan` | Mapeia o codebase → `.oxe/codebase/` |
171
+ | `/oxe-spec` | Escreve/atualiza `.oxe/SPEC.md` |
172
+ | `/oxe-discuss` | Decisões antes do plano → `.oxe/DISCUSS.md` |
173
+ | `/oxe-plan` | Pesquisa no repo + plano com ondas e Verificar |
174
+ | `/oxe-execute` | Execução guiada do plano (ou QUICK) |
175
+ | `/oxe-verify` | Validação; `.oxe/VERIFY.md` |
176
+ | `/oxe-next` | Sugere o próximo passo |
177
+ | `/oxe-help` | Ajuda e visão geral |
145
178
 
146
- Por omissão, após instalar, o CLI cria **`.oxe/`** mínimo: `STATE.md`, **`config.json`** (a partir de `oxe/templates/config.template.json`) e pasta **`codebase/`** — exceto com `--no-init-oxe`. Documentação das chaves: **`oxe/templates/CONFIG.md`**.
179
+ ### Modo rápido
147
180
 
148
- ## Cursor
181
+ | Comando | O que faz |
182
+ |---------|-----------|
183
+ | `/oxe-quick` | `.oxe/QUICK.md` — tarefa pontual |
149
184
 
150
- | Slash | Workflow |
151
- |-------|----------|
152
- | `/oxe-scan` | `oxe/workflows/scan.md` |
153
- | `/oxe-spec` | `oxe/workflows/spec.md` |
154
- | `/oxe-discuss` | `oxe/workflows/discuss.md` |
155
- | `/oxe-plan` | `oxe/workflows/plan.md` |
156
- | `/oxe-quick` | `oxe/workflows/quick.md` |
157
- | `/oxe-execute` | `oxe/workflows/execute.md` |
158
- | `/oxe-verify` | `oxe/workflows/verify.md` |
159
- | `/oxe-next` | `oxe/workflows/next.md` |
160
- | `/oxe-help` | `oxe/workflows/help.md` |
185
+ ### Revisão de PR / diff entre branches *(só Copilot)*
161
186
 
162
- Ficheiros: `.cursor/commands/oxe-*.md` e regra `.cursor/rules/oxe-workflow.mdc`.
187
+ | Prompt | O que faz |
188
+ |--------|-----------|
189
+ | `/oxe-review-pr` | Segue `oxe/workflows/review-pr.md`: diff estilo PR (`git diff base...head`, `gh pr diff <n>`, ou fetch `pull/<n>/head`), riscos, testes e checklist. Podes colar o **link da PR** (ex. `https://github.com/org/repo/pull/10`) ou indicar `main` e `feature/x`. **Não** há slash command em `.cursor/commands/`; no Cursor podes pedir o mesmo em linguagem natural com o workflow em contexto. |
163
190
 
164
- ## GitHub Copilot
191
+ ### Outros clientes
165
192
 
166
- 1. **Instruções do repositório** [`.github/copilot-instructions.md`](.github/copilot-instructions.md): ativadas automaticamente no chat quando o repositório está em contexto (ver [documentação](https://docs.github.com/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot)).
167
- 2. **Prompt files** — [`.github/prompts/*.prompt.md`](.github/prompts/): no chat, escreve `/` e escolhe por exemplo **`oxe-scan`**, **`oxe-quick`**, **`oxe-execute`**, etc. (o `name` no frontmatter define o comando). Cada prompt referencia `oxe/workflows/<passo>.md` na **raiz do repo em contexto**.
193
+ Em **Claude Code** (ou ferramentas que leem `commands/oxe/`), os mesmos passos expõem nomes **`oxe:scan`**, **`oxe:plan`**, etc. (frontmatter `name:`).
168
194
 
169
- Este repo inclui [`.vscode/settings.json`](.vscode/settings.json) com `"chat.promptFiles": true` para expor a pasta `.github/prompts`. Podes copiar essa definição para o teu `settings.json` global se preferires.
195
+ ---
170
196
 
171
- 3. **Agentes** — [`AGENTS.md`](AGENTS.md) resume o pacote para modos que leem instruções de agente no repo.
197
+ ## Configuração
172
198
 
173
- ## Fluxo recomendado
199
+ Preferências do projeto em **`.oxe/config.json`** (criado no bootstrap a partir de `oxe/templates/config.template.json`). Chaves e comportamento: [`oxe/templates/CONFIG.md`](oxe/templates/CONFIG.md) (ex.: `discuss_before_plan`, texto pós-verify, comando de teste por defeito).
174
200
 
175
- **Completo:** 1. **scan** (7 ficheiros em `codebase/`, incl. CONVENTIONS + CONCERNS) → 2. **spec** → 3. **discuss** (opcional; recomendado se `discuss_before_plan` em `.oxe/config.json`) → 4. **plan** (secção **Replanejamento** em `--replan`) → 5. **execute** (opcional) → 6. implementar → 7. **verify** (rascunho de commit + checklist PR se ativo em config) → 8. **next**.
201
+ ---
176
202
 
177
- **Rápido (tarefas pequenas):** **quick** gera `.oxe/QUICK.md` com passos curtos + verificação; depois **execute** (sobre o QUICK) ou implementação direta e **verify**. Promover a spec/plan se o trabalho crescer (muitos ficheiros, API pública, segurança).
203
+ ## Resolução de problemas
178
204
 
179
- ## Artefatos (`.oxe/` no projeto alvo)
205
+ | Situação | O que tentar |
206
+ |----------|----------------|
207
+ | Comandos não aparecem no Cursor | Confirma que `.cursor/commands/` existe; reinicia o Cursor |
208
+ | Prompts `/oxe-*` não aparecem no Copilot | Ativa `"chat.promptFiles": true`; confirma `.github/prompts/*.prompt.md` |
209
+ | Slash `/oxe-*` no **Copilot CLI** | Instala com **`--copilot-cli`** (pasta `.claude/commands/`); atualiza o CLI; comportamento ainda experimental |
210
+ | **`ETARGET`** / versão não encontrada no `npx` | `npm cache clean --force`, `npx clear-npx-cache`, ou fixa versão: `npx oxe-cc@0.3.0`. Verifica `npm config get registry` |
211
+ | **404** no `npm view oxe-cc` | Pacote com outro nome (scope) ou ainda não publicado — usa `npm link` ou `node …/bin/oxe-cc.js` |
212
+ | Ficheiros não atualizam | Reinstala com **`--force`** |
180
213
 
181
- | Caminho | Conteúdo |
182
- |---------|----------|
183
- | `.oxe/STATE.md` | Fase, último scan, próximo passo |
184
- | `.oxe/config.json` | Opcional (criado no bootstrap): `discuss_before_plan`, texto de verify pós-sucesso, comando de teste por defeito — ver `oxe/templates/CONFIG.md` |
185
- | `.oxe/codebase/*.md` | Mapa: OVERVIEW, STACK, STRUCTURE, TESTING, INTEGRATIONS, **CONVENTIONS**, **CONCERNS** |
186
- | `.oxe/SPEC.md` | Especificação |
187
- | `.oxe/DISCUSS.md` | Perguntas e decisões antes do plano (opcional) |
188
- | `.oxe/PLAN.md` | Plano com **Verificar** por tarefa + secção **Replanejamento** |
189
- | `.oxe/QUICK.md` | Modo rápido: passos curtos + verificar |
190
- | `.oxe/VERIFY.md` | Resultado das verificações |
191
- | `.oxe/SUMMARY.md` | Resumo de sessão / contexto para replan (opcional) |
214
+ **Ajuda no terminal:** `oxe-cc --help`. **Diagnóstico:** `oxe-cc doctor`.
192
215
 
193
- Templates: **`oxe/templates/`** (`STATE.md`, `config.template.json`, `CONFIG.md`, `SPEC.template.md`, `PLAN.template.md`, `SUMMARY.template.md`).
216
+ **Banner no CLI:** [`bin/banner.txt`](bin/banner.txt) (`{version}`). `OXE_NO_BANNER=1` desliga; `NO_COLOR` remove cores.
194
217
 
195
- Neste repositório, **`.oxe/` está no `.gitignore`** para não versionar scans locais do *oxe-build*. No teu produto, remove ou ajusta essa regra se quiseres commitar `.oxe/` com a equipa.
218
+ <details>
219
+ <summary><strong>Publicar no npm (mantenedores)</strong></summary>
196
220
 
197
- ## Usar noutro projeto
221
+ Sobe `version` em `package.json`, `npm login` (2FA se exigido), `npm publish --access public`. O `prepublishOnly` corre testes e `scan:assets`.
198
222
 
199
- - Com pacote no npm: **`npx oxe-cc@latest`** na raiz do repo alvo, ou **`npx oxe-cc@<versão>`** (versões na [página do pacote](https://www.npmjs.com/package/oxe-cc?activeTab=versions) quando existir).
200
- - Sem pacote no npm: **`npm link oxe-cc`** (após `npm link` no clone do `oxe-build`) ou **`node …/oxe-build/bin/oxe-cc.js`**.
223
+ </details>
201
224
 
202
- Alternativa manual: copia os mesmos caminhos que o instalador usa (`oxe/`, `.cursor/`, `.github/`, `commands/oxe`, `AGENTS.md`, opcionalmente `.vscode/settings.json` ou só `"chat.promptFiles": true` nas definições).
225
+ <details>
226
+ <summary><strong>Estrutura do repositório</strong></summary>
203
227
 
204
- `commands/oxe/*.md` mantém frontmatter estilo GSD (`name: oxe:scan`, …) para ferramentas que importam comandos nesse formato.
228
+ | Caminho | Função |
229
+ |---------|--------|
230
+ | `assets/readme-banner.svg` | Banner deste README |
231
+ | `bin/oxe-cc.js`, `bin/banner.txt` | CLI |
232
+ | `oxe/workflows/` | Workflows canónicos |
233
+ | `oxe/templates/` | Modelos e CONFIG |
234
+ | `.cursor/`, `.github/` | Cursor e Copilot |
235
+ | `commands/oxe/` | `oxe:*` para outros runtimes |
236
+ | `tests/`, `scripts/`, `.github/workflows/` | CI e qualidade |
205
237
 
206
- ## Estrutura deste repositório
238
+ </details>
207
239
 
208
- | Pasta / ficheiro | Função |
209
- |------------------|--------|
210
- | `bin/oxe-cc.js` | CLI: instalar, `doctor`, `init-oxe` |
211
- | `bin/banner.txt` | Cabeçalho ASCII ao arrancar o CLI (`{version}`) |
212
- | `package.json` | Metadados npm (`oxe-cc`, `files`, `bin`) |
213
- | `oxe/workflows/` | Workflows canónicos (fonte única) |
214
- | `oxe/templates/` | Modelos (STATE, config, SPEC, PLAN, SUMMARY, CONFIG.md) |
215
- | `scripts/oxe-assets-scan.cjs` | Verificação leve de padrões sensíveis em markdown (CI / `npm run scan:assets`) |
216
- | `.github/workflows/ci.yml` | `npm test` + `scan:assets` |
217
- | `.cursor/commands/` | Slash commands Cursor |
218
- | `.cursor/rules/` | Regras do projeto Cursor |
219
- | `.github/copilot-instructions.md` | Instruções Copilot no repo |
220
- | `.github/prompts/` | Ficheiros `*.prompt.md` (`/oxe-scan`, …) |
221
- | `commands/oxe/` | Comandos com frontmatter estilo GSD |
222
- | `AGENTS.md` | Resumo para agentes (ex. Copilot) |
240
+ ---
223
241
 
224
242
  ## Licença
225
243
 
226
- [GPL-3.0](LICENSE) — ver [LICENSE](LICENSE).
244
+ [GPL-3.0](LICENSE).
@@ -0,0 +1,18 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="920" height="200" viewBox="0 0 920 200" role="img" aria-label="OXE  spec-driven workflows">
2
+ <defs>
3
+ <linearGradient id="oxe-bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#0d1117"/>
5
+ <stop offset="50%" style="stop-color:#161b22"/>
6
+ <stop offset="100%" style="stop-color:#21262d"/>
7
+ </linearGradient>
8
+ <linearGradient id="oxe-accent" x1="0%" y1="0%" x2="100%" y2="0%">
9
+ <stop offset="0%" style="stop-color:#58a6ff"/>
10
+ <stop offset="100%" style="stop-color:#79c0ff"/>
11
+ </linearGradient>
12
+ </defs>
13
+ <rect width="920" height="200" rx="16" fill="url(#oxe-bg)"/>
14
+ <rect x="2" y="2" width="916" height="196" rx="14" fill="none" stroke="url(#oxe-accent)" stroke-width="2" opacity="0.45"/>
15
+ <text x="460" y="100" text-anchor="middle" font-family="ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif" font-size="72" font-weight="800" fill="url(#oxe-accent)" letter-spacing="0.12em">OXE</text>
16
+ <text x="460" y="138" text-anchor="middle" font-family="ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif" font-size="17" fill="#8b949e">Fluxo spec-driven � Cursor &amp; GitHub Copilot � CLI npm</text>
17
+ <text x="460" y="168" text-anchor="middle" font-family="ui-monospace, SFMono-Regular, Consolas, monospace" font-size="13" fill="#6e7681">npx oxe-cc@latest</text>
18
+ </svg>
package/bin/banner.txt CHANGED
@@ -15,4 +15,4 @@
15
15
 
16
16
  ══════════════════════════════════════════════════════
17
17
 
18
- v0.3.1
18
+ v0.3.3
package/bin/oxe-cc.js CHANGED
@@ -9,6 +9,8 @@
9
9
 
10
10
  const fs = require('fs');
11
11
  const path = require('path');
12
+ const readline = require('readline');
13
+ const { spawnSync } = require('child_process');
12
14
 
13
15
  const PKG_ROOT = path.join(__dirname, '..');
14
16
 
@@ -20,6 +22,9 @@ const red = '\x1b[31m';
20
22
  const bold = '\x1b[1m';
21
23
  const reset = '\x1b[0m';
22
24
 
25
+ /** @type {string} */
26
+ const RULE = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━';
27
+
23
28
  /** Plain banner if banner.txt is missing (keep in sync with bin/banner.txt style). */
24
29
  const DEFAULT_BANNER = ` .============================================.
25
30
  | OXE · spec-driven workflow CLI |
@@ -34,6 +39,18 @@ function useAnsiColors() {
34
39
  return process.stdout.isTTY === true;
35
40
  }
36
41
 
42
+ /** Section header (GSD-inspired). */
43
+ function printSection(title) {
44
+ const c = useAnsiColors();
45
+ if (!c) {
46
+ console.log(`\n${title}\n${'─'.repeat(50)}\n`);
47
+ return;
48
+ }
49
+ console.log(`\n${dim}${RULE}${reset}`);
50
+ console.log(` ${cyan}${bold}${title}${reset}`);
51
+ console.log(`${dim}${RULE}${reset}\n`);
52
+ }
53
+
37
54
  /** Print branded header; skip with OXE_NO_BANNER=1. Not used for --version (scripts). */
38
55
  function printBanner() {
39
56
  if (process.env.OXE_NO_BANNER === '1' || process.env.OXE_NO_BANNER === 'true') return;
@@ -49,6 +66,7 @@ function printBanner() {
49
66
  }
50
67
  }
51
68
  const text = raw.replace(/\{version\}/g, ver).replace(/\r\n/g, '\n').trimEnd();
69
+ if (color) console.log(`${dim}${RULE}${reset}\n`);
52
70
  if (!color) {
53
71
  console.log(text + '\n');
54
72
  return;
@@ -58,10 +76,11 @@ function printBanner() {
58
76
  if (line.includes(`v${ver}`)) console.log(`${dim}${line}${reset}`);
59
77
  else console.log(`${cyan}${bold}${line}${reset}`);
60
78
  }
61
- console.log('');
79
+ if (color) console.log(`\n${dim}${RULE}${reset}\n`);
80
+ else console.log('');
62
81
  }
63
82
 
64
- /** @typedef {{ help: boolean, version: boolean, cursor: boolean, copilot: boolean, vscode: boolean, commands: boolean, agents: boolean, force: boolean, dryRun: boolean, dir: string, all: boolean, noInitOxe: boolean, oxeOnly: boolean, parseError: boolean, unknownFlag: string }} InstallOpts */
83
+ /** @typedef {{ help: boolean, version: boolean, cursor: boolean, copilot: boolean, copilotCli: boolean, vscode: boolean, commands: boolean, agents: boolean, force: boolean, dryRun: boolean, dir: string, all: boolean, noInitOxe: boolean, oxeOnly: boolean, globalCli: boolean, noGlobalCli: boolean, parseError: boolean, unknownFlag: string, conflictFlags: string }} InstallOpts */
65
84
 
66
85
  /**
67
86
  * @param {string[]} argv
@@ -74,6 +93,7 @@ function parseInstallArgs(argv) {
74
93
  version: false,
75
94
  cursor: false,
76
95
  copilot: false,
96
+ copilotCli: false,
77
97
  vscode: false,
78
98
  commands: true,
79
99
  agents: true,
@@ -83,8 +103,11 @@ function parseInstallArgs(argv) {
83
103
  all: false,
84
104
  noInitOxe: false,
85
105
  oxeOnly: false,
106
+ globalCli: false,
107
+ noGlobalCli: false,
86
108
  parseError: false,
87
109
  unknownFlag: '',
110
+ conflictFlags: '',
88
111
  restPositional: [],
89
112
  };
90
113
  for (let i = 0; i < argv.length; i++) {
@@ -93,6 +116,7 @@ function parseInstallArgs(argv) {
93
116
  else if (a === '-v' || a === '--version') out.version = true;
94
117
  else if (a === '--cursor') out.cursor = true;
95
118
  else if (a === '--copilot') out.copilot = true;
119
+ else if (a === '--copilot-cli') out.copilotCli = true;
96
120
  else if (a === '--vscode') out.vscode = true;
97
121
  else if (a === '--no-commands') out.commands = false;
98
122
  else if (a === '--no-agents') out.agents = false;
@@ -101,22 +125,28 @@ function parseInstallArgs(argv) {
101
125
  else if (a === '--all' || a === '-a') out.all = true;
102
126
  else if (a === '--no-init-oxe') out.noInitOxe = true;
103
127
  else if (a === '--oxe-only') out.oxeOnly = true;
128
+ else if (a === '--global-cli' || a === '-g') out.globalCli = true;
129
+ else if (a === '--no-global-cli' || a === '-l') out.noGlobalCli = true;
104
130
  else if (a === '--dir' && argv[i + 1]) {
105
131
  out.dir = path.resolve(argv[++i]);
106
- } else if (!a.startsWith('-')) out.restPositional.push(a);
132
+ } else if (!a.startsWith('-')) out.restPositional.push(a);
107
133
  else {
108
134
  out.parseError = true;
109
135
  out.unknownFlag = a;
110
136
  break;
111
137
  }
112
138
  }
139
+ if (out.globalCli && out.noGlobalCli) {
140
+ out.conflictFlags = 'Cannot use both --global-cli (-g) and --no-global-cli (-l)';
141
+ }
113
142
  if (out.oxeOnly) {
114
143
  out.cursor = false;
115
144
  out.copilot = false;
145
+ out.copilotCli = false;
116
146
  out.vscode = false;
117
147
  out.commands = false;
118
148
  out.agents = false;
119
- } else if (out.all || (!out.cursor && !out.copilot)) {
149
+ } else if (out.all || (!out.cursor && !out.copilot && !out.copilotCli)) {
120
150
  out.cursor = true;
121
151
  out.copilot = true;
122
152
  }
@@ -134,6 +164,16 @@ function readPkgVersion() {
134
164
  }
135
165
  }
136
166
 
167
+ function readPkgName() {
168
+ try {
169
+ const p = path.join(PKG_ROOT, 'package.json');
170
+ const j = JSON.parse(fs.readFileSync(p, 'utf8'));
171
+ return typeof j.name === 'string' ? j.name : 'oxe-cc';
172
+ } catch {
173
+ return 'oxe-cc';
174
+ }
175
+ }
176
+
137
177
  function readMinNode() {
138
178
  try {
139
179
  const p = path.join(PKG_ROOT, 'package.json');
@@ -228,10 +268,12 @@ function bootstrapOxe(target, opts) {
228
268
 
229
269
  /** @param {string} target */
230
270
  function runDoctor(target) {
271
+ printSection('OXE ▸ doctor');
231
272
  const v = process.versions.node;
232
273
  const major = parseInt(v.split('.')[0], 10);
233
274
  const minNode = readMinNode();
234
- console.log(`${cyan}oxe-cc doctor${reset} ${target}`);
275
+ const c = useAnsiColors();
276
+ console.log(` ${c ? green : ''}Projeto:${c ? reset : ''} ${c ? cyan : ''}${target}${c ? reset : ''}`);
235
277
  console.log(`Node.js ${v} (require >= ${minNode})`);
236
278
  if (major < minNode) {
237
279
  console.log(`${red}FAIL${reset} Node.js version below package engines`);
@@ -310,6 +352,87 @@ function runDoctor(target) {
310
352
  console.log(`\n${green}Doctor finished.${reset}`);
311
353
  }
312
354
 
355
+ /**
356
+ * npm install -g oxe-cc@version (same version as this running CLI).
357
+ * @returns {boolean}
358
+ */
359
+ function installGlobalCliPackage() {
360
+ const name = readPkgName();
361
+ const ver = readPkgVersion();
362
+ const spec = `${name}@${ver}`;
363
+ const c = useAnsiColors();
364
+ const dimOrEmpty = c ? dim : '';
365
+ const resetOrEmpty = c ? reset : '';
366
+ console.log(`\n ${dimOrEmpty}npm install -g ${spec}${resetOrEmpty}\n`);
367
+ const r = spawnSync('npm', ['install', '-g', spec], {
368
+ stdio: 'inherit',
369
+ shell: true,
370
+ env: process.env,
371
+ });
372
+ if (r.status === 0) {
373
+ console.log(
374
+ `\n ${c ? green : ''}✓${c ? reset : ''} ${c ? cyan : ''}oxe-cc${c ? reset : ''} disponível globalmente (corre ${c ? cyan : ''}oxe-cc --help${c ? reset : ''} em qualquer pasta).\n`
375
+ );
376
+ return true;
377
+ }
378
+ console.log(
379
+ `\n ${c ? yellow : ''}⚠${c ? reset : ''} npm install -g falhou. Tenta manualmente: ${c ? cyan : ''}npm install -g ${spec}${c ? reset : ''}\n`
380
+ );
381
+ return false;
382
+ }
383
+
384
+ /**
385
+ * After copying OXE into the project: optionally install the CLI globally (like GSD’s “where to install” choice).
386
+ * @param {InstallOpts} opts
387
+ */
388
+ function maybePromptGlobalCli(opts) {
389
+ if (opts.oxeOnly) return;
390
+ if (opts.dryRun) {
391
+ if (useAnsiColors()) console.log(`${dim} (dry-run — pergunta do CLI global ignorada)${reset}`);
392
+ return;
393
+ }
394
+ if (opts.globalCli) {
395
+ installGlobalCliPackage();
396
+ return;
397
+ }
398
+ if (opts.noGlobalCli) return;
399
+ if (process.env.OXE_NO_PROMPT === '1' || process.env.OXE_NO_PROMPT === 'true') return;
400
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
401
+ const c = useAnsiColors();
402
+ if (c) {
403
+ console.log(
404
+ `\n ${yellow}Terminal não interativo${reset} — sem pergunta de CLI global. Usa ${cyan}npx oxe-cc@latest${reset} ou ${cyan}--global-cli${reset}.\n`
405
+ );
406
+ } else {
407
+ console.log('\nNon-interactive terminal — skipping global CLI prompt. Use npx oxe-cc@latest or --global-cli.\n');
408
+ }
409
+ return;
410
+ }
411
+
412
+ const c = useAnsiColors();
413
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
414
+
415
+ console.log(
416
+ ` ${c ? yellow : ''}Instalar o comando oxe-cc globalmente?${c ? reset : ''}
417
+ (Os ficheiros OXE já foram copiados para o projeto.)
418
+
419
+ ${c ? cyan : ''}1${c ? reset : ''}) ${c ? dim : ''}Não — uso ${c ? reset : ''}${c ? cyan : ''}npx oxe-cc@latest${c ? reset : ''}${c ? dim : ''} para atualizar (recomendado em CI)${c ? reset : ''}
420
+ ${c ? cyan : ''}2${c ? reset : ''}) ${c ? dim : ''}Sim — ${c ? reset : ''}${c ? cyan : ''}npm install -g ${readPkgName()}@${readPkgVersion()}${c ? reset : ''}${c ? dim : ''} (${c ? reset : ''}${c ? cyan : ''}oxe-cc${c ? reset : ''}${c ? dim : ''} no PATH)${c ? reset : ''}
421
+ `
422
+ );
423
+
424
+ rl.question(` ${c ? cyan : ''}Escolha${c ? reset : ''} ${c ? dim : ''}[1]${c ? reset : ''}: `, (answer) => {
425
+ rl.close();
426
+ const choice = (answer || '1').trim();
427
+ if (choice === '2') installGlobalCliPackage();
428
+ else {
429
+ console.log(
430
+ `\n ${c ? green : ''}✓${c ? reset : ''} Para atualizar workflows: ${c ? cyan : ''}npx oxe-cc@latest --force${c ? reset : ''} na raiz do projeto.\n`
431
+ );
432
+ }
433
+ });
434
+ }
435
+
313
436
  function usage() {
314
437
  console.log(`
315
438
  ${cyan}oxe-cc${reset} — install OXE workflows (Cursor + GitHub Copilot) into a project
@@ -323,12 +446,15 @@ ${green}Usage:${reset}
323
446
  ${green}Install options:${reset}
324
447
  --cursor Install .cursor/commands and .cursor/rules (default with --all)
325
448
  --copilot Install .github/copilot-instructions.md and .github/prompts
449
+ --copilot-cli Copy .cursor/commands → .claude/commands (Copilot CLI slash /oxe-* — experimental)
326
450
  --vscode Also copy .vscode/settings.json (chat.promptFiles)
327
451
  --all, -a Cursor + Copilot (default when neither --cursor nor --copilot)
328
452
  --no-commands Skip commands/oxe (Claude-style frontmatter)
329
453
  --no-agents Skip AGENTS.md
330
454
  --no-init-oxe Do not create .oxe/STATE.md + .oxe/codebase/ after install
331
455
  --oxe-only Only copy oxe/ (skip Cursor, Copilot, commands, AGENTS.md)
456
+ --global-cli, -g After install: npm install -g oxe-cc@<version> (no prompt)
457
+ --no-global-cli, -l Skip the interactive “CLI global?” step (default in CI)
332
458
  --force, -f Overwrite existing files
333
459
  --dry-run Print actions without writing
334
460
  --dir <path> Target directory (default: cwd)
@@ -344,6 +470,7 @@ ${green}Examples:${reset}
344
470
  npx oxe-cc@latest
345
471
  npx oxe-cc@latest ./my-app
346
472
  npx oxe-cc@latest --cursor --dry-run
473
+ npx oxe-cc@latest --copilot --copilot-cli
347
474
  npx oxe-cc doctor
348
475
  npx oxe-cc init-oxe --dir ./my-app
349
476
  `);
@@ -356,8 +483,10 @@ function runInstall(opts) {
356
483
  process.exit(1);
357
484
  }
358
485
 
359
- console.log(`${cyan}OXE${reset} install ${green}${target}${reset}`);
360
- if (opts.dryRun) console.log(`${yellow}(dry-run)${reset}`);
486
+ printSection('OXE Copiar workflows para o projeto');
487
+ const c = useAnsiColors();
488
+ console.log(` ${c ? green : ''}Destino:${c ? reset : ''} ${c ? cyan : ''}${target}${c ? reset : ''}`);
489
+ if (opts.dryRun) console.log(` ${c ? yellow : ''}(dry-run)${c ? reset : ''}`);
361
490
 
362
491
  const copyOpts = { dryRun: opts.dryRun, force: opts.force };
363
492
 
@@ -370,6 +499,20 @@ function runInstall(opts) {
370
499
  if (fs.existsSync(cRules)) copyDir(cRules, path.join(target, '.cursor', 'rules'), copyOpts);
371
500
  }
372
501
 
502
+ if (opts.copilotCli) {
503
+ const cCmd = path.join(PKG_ROOT, '.cursor', 'commands');
504
+ const dest = path.join(target, '.claude', 'commands');
505
+ const c = useAnsiColors();
506
+ if (fs.existsSync(cCmd)) {
507
+ console.log(
508
+ ` ${c ? green : ''}cli${c ? reset : ''} ${c ? dim : ''}Copilot CLI:${c ? reset : ''} ${c ? cyan : ''}.claude/commands/${c ? reset : ''}${c ? dim : ''} (experimental — teste /oxe-scan na sessão)${c ? reset : ''}`
509
+ );
510
+ copyDir(cCmd, dest, copyOpts);
511
+ } else {
512
+ console.warn(`${yellow}warn:${reset} missing ${cCmd} — skip --copilot-cli`);
513
+ }
514
+ }
515
+
373
516
  if (opts.copilot) {
374
517
  const gh = path.join(PKG_ROOT, '.github');
375
518
  const inst = path.join(gh, 'copilot-instructions.md');
@@ -416,7 +559,7 @@ function runInstall(opts) {
416
559
  if (!opts.noInitOxe) bootstrapOxe(target, { dryRun: opts.dryRun, force: opts.force });
417
560
 
418
561
  console.log(
419
- `\n${green}Done.${reset} Open the project in Cursor (${cyan}/oxe-scan${reset}) or VS Code + Copilot (prompt ${cyan}/oxe-scan${reset}).`
562
+ `\n ${c ? green : ''}✓${c ? reset : ''} Ficheiros OXE instalados. Abre no Cursor (${c ? cyan : ''}/oxe-scan${c ? reset : ''}) ou VS Code + Copilot (prompt ${c ? cyan : ''}/oxe-scan${c ? reset : ''}).`
420
563
  );
421
564
  }
422
565
 
@@ -435,6 +578,13 @@ function main() {
435
578
  process.exit(0);
436
579
  }
437
580
 
581
+ if (opts.conflictFlags) {
582
+ printBanner();
583
+ console.error(`${red}${opts.conflictFlags}${reset}`);
584
+ usage();
585
+ process.exit(1);
586
+ }
587
+
438
588
  if (opts.parseError) {
439
589
  printBanner();
440
590
  console.error(`${red}Unknown option:${reset} ${opts.unknownFlag}`);
@@ -465,14 +615,17 @@ function main() {
465
615
  console.error(`${yellow}Target directory does not exist: ${target}${reset}`);
466
616
  process.exit(1);
467
617
  }
468
- console.log(`${cyan}OXE${reset} init-oxe → ${green}${target}${reset}`);
469
- if (opts.dryRun) console.log(`${yellow}(dry-run)${reset}`);
618
+ printSection('OXE init-oxe');
619
+ const c0 = useAnsiColors();
620
+ console.log(` ${c0 ? green : ''}Destino:${c0 ? reset : ''} ${c0 ? cyan : ''}${target}${c0 ? reset : ''}`);
621
+ if (opts.dryRun) console.log(` ${c0 ? yellow : ''}(dry-run)${c0 ? reset : ''}`);
470
622
  bootstrapOxe(target, { dryRun: opts.dryRun, force: opts.force });
471
- console.log(`\n${green}Done.${reset}`);
623
+ console.log(`\n ${c0 ? green : ''}✓${c0 ? reset : ''} Concluído.\n`);
472
624
  return;
473
625
  }
474
626
 
475
627
  runInstall(opts);
628
+ maybePromptGlobalCli(opts);
476
629
  }
477
630
 
478
631
  main();
@@ -16,7 +16,7 @@ Slash commands: `/oxe-scan`, `/oxe-spec`, `/oxe-discuss`, `/oxe-plan`, `/oxe-ver
16
16
  ## GitHub Copilot (VS Code / IDE)
17
17
 
18
18
  1. **Instruções do repositório:** `.github/copilot-instructions.md` (ativas no chat quando o repositório está em contexto).
19
- 2. **Prompt files:** no chat, escrever `/` e escolher **`oxe-scan`**, **`oxe-spec`**, **`oxe-discuss`**, **`oxe-plan`**, **`oxe-verify`**, **`oxe-next`**, **`oxe-quick`**, **`oxe-execute`**, **`oxe-help`**. Requer `chat.promptFiles`: true.
19
+ 2. **Prompt files:** no chat, escrever `/` e escolher **`oxe-scan`**, **`oxe-spec`**, **`oxe-discuss`**, **`oxe-plan`**, **`oxe-verify`**, **`oxe-next`**, **`oxe-quick`**, **`oxe-execute`**, **`oxe-help`**, **`oxe-review-pr`** (revisão: URL `github.com/.../pull/N`, branches ou SHAs). Requer `chat.promptFiles`: true.
20
20
 
21
21
  ## Fluxo completo
22
22
 
@@ -46,5 +46,9 @@ Slash commands: `/oxe-scan`, `/oxe-spec`, `/oxe-discuss`, `/oxe-plan`, `/oxe-ver
46
46
 
47
47
  ## Gatilhos naturais (Copilot / chat)
48
48
 
49
- Quando o utilizador disser “oxe scan”, “oxe quick”, “executar onda OXE”, etc., seguir o workflow correspondente em `oxe/workflows/*.md`.
49
+ Quando o utilizador disser “oxe scan”, “oxe quick”, “executar onda OXE”, “revisar PR”, “diff entre branches”, etc., seguir o workflow correspondente em `oxe/workflows/*.md`.
50
+
51
+ **Nota:** **`oxe-review-pr`** não tem homólogo em `.cursor/commands/`; no Cursor podes pedir em linguagem natural seguindo `oxe/workflows/review-pr.md` ou abrir o mesmo ficheiro como contexto.
52
+
53
+ **Copilot CLI (experimental):** `oxe-cc --copilot-cli` copia os mesmos Markdown de `.cursor/commands/` para **`.claude/commands/`** — para testar **`/oxe-scan`**, etc., conforme a versão do GitHub Copilot CLI.
50
54
  </output>
@@ -0,0 +1,45 @@
1
+ # OXE — Workflow: review-pr (revisão de diff / PR)
2
+
3
+ <objective>
4
+ Rever alterações como num pull request: **URL do GitHub** (`…/pull/<n>`), **branches** ou **SHAs**. Cobre diff, risco, convenções do projeto e sugestões acionáveis. **Não** substitui CI nem testes manuais; complementa-os.
5
+ </objective>
6
+
7
+ <context>
8
+ - **Base** e **head** são nomes de branch, tags ou SHAs (ex.: `main` e `feature/foo`).
9
+ - **URL de PR no GitHub** — O utilizador pode colar o link da PR (ex.: `https://github.com/org/repo/pull/10` ou atalho `org/repo#10`). O número da PR é o segmento depois de `/pull/`.
10
+ - Em Git, o diff “estilo PR” (só o que a branch introduz) usa o **merge base**: `git diff base...head` (três pontos).
11
+ - Diff literal entre pontas: `git diff base..head` (dois pontos) — útil quando o utilizador pede explicitamente.
12
+ - Este passo é **opcional** no fluxo OXE; não atualiza `STATE.md` com fases canónicas, salvo o utilizador pedir registo do resultado em disco.
13
+ </context>
14
+
15
+ <process>
16
+ 1. **Resolver entrada**
17
+ - **URL ou `#` de PR** — Se a mensagem contiver um URL `github.com/.../pull/<n>` (com ou sem `https://`, com sufixo `/files` ou `/commits`) ou texto `owner/repo#n`, extrair `<n>` (e opcionalmente `owner/repo` para confirmar que o clone local é o mesmo repositório).
18
+ - **Refs explícitas** — Caso contrário, tratar como base/head: se faltar um dos dois, inferir base = `main` ou `master` (o que existir) e head = branch atual (`git rev-parse --abbrev-ref HEAD`), ou pedir clarificação.
19
+ 2. **Obter diff (com URL / número de PR)** — Ordem de preferência quando o cwd é o repositório certo:
20
+ - **GitHub CLI:** `gh pr diff <n>` (ou `gh pr diff <n> --patch`). Se `gh` não estiver disponível ou falhar auth, tentar Git puro.
21
+ - **Git fetch ref da PR:** `git fetch origin pull/<n>/head:oxe-pr-<n>` (ajustar `origin` se o remoto tiver outro nome). Descobrir branch base com `gh pr view <n> --json baseRefName -q .baseRefName` ou assumir `main`/`master`; depois `git diff origin/<base>...oxe-pr-<n>` ou `git diff <base>...oxe-pr-<n>` após `fetch` da base.
22
+ - **Sem terminal / outro repo:** Pedir ao utilizador que cole o diff da aba “Files changed” no GitHub ou o output de `gh pr diff <n>` corrido localmente no repo certo.
23
+ 3. **Obter diff (só branches / SHAs)** — Preferir terminal quando disponível:
24
+ - `git fetch` (se fizer sentido e o ambiente permitir rede).
25
+ - `git merge-base base head` (opcional, para confirmar ancestral comum).
26
+ - `git diff base...head` (revisão tipo PR).
27
+ - `git log base..head --oneline -n 30` (contexto de commits).
28
+ Se o sandbox bloquear Git, pedir ao utilizador que cole o output de `git diff base...head` ou use o diff da UI do GitHub/GitLab.
29
+ Se o diff já foi obtido no passo 2 (URL da PR), **não** repetir este passo.
30
+ 4. **Ler contexto do projeto** — Se existirem, usar trechos relevantes de `.oxe/codebase/CONVENTIONS.md`, `STACK.md`, `OVERVIEW.md` e, se aplicável, `.oxe/SPEC.md` / `.oxe/PLAN.md` para alinhar expectativas (sem assumir que o PR cobre só OXE).
31
+ 5. **Analisar** — Estruturar a resposta com:
32
+ - **Resumo** — O que muda em 3–6 frases.
33
+ - **Ficheiros / áreas** — Agrupar por domínio (API, UI, config, etc.).
34
+ - **Riscos** — Regressões, breaking changes, segurança (inputs, segredos, auth), performance óbvia, migrações.
35
+ - **Testes** — O que deveria ser coberto ou correr localmente (comandos sugeridos se conhecidos do repo).
36
+ - **Checklist PR** — Título sugerido, descrição curta, breaking changes, rollback.
37
+ 6. **Opcional em disco** — Se o utilizador pedir registo: criar ou atualizar **`.oxe/PR-REVIEW.md`** com data, URL ou refs (base/head), resumo, achados e próximos passos (formato Markdown legível).
38
+ </process>
39
+
40
+ <success>
41
+ - [ ] URL da PR ou par base/head está explícito na resposta (ou foi pedida clarificação).
42
+ - [ ] A análise baseia-se no diff (terminal ou colado), não só em suposições.
43
+ - [ ] Há secção de riscos e de testes/verificação sugerida.
44
+ - [ ] Nenhum segredo ou credencial é repetido na análise; redigir se aparecerem no diff.
45
+ </success>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oxe-cc",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "OXE — spec-driven workflows for Cursor and GitHub Copilot (install via npx)",
5
5
  "license": "GPL-3.0",
6
6
  "author": "",
@@ -29,6 +29,7 @@
29
29
  "files": [
30
30
  "bin",
31
31
  "oxe",
32
+ "assets",
32
33
  ".cursor",
33
34
  ".github",
34
35
  "commands",