oxe-cc 0.3.2 → 0.3.4

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.
@@ -1,15 +1,15 @@
1
1
  # OXE — fluxo spec-driven (Cursor + Copilot)
2
2
 
3
- Este repositório define o **OXE**: artefatos em `.oxe/` na raiz do projeto alvo e workflows em `oxe/workflows/*.md`.
3
+ Este repositório (ou o pacote **oxe-cc** instalado) define o **OXE**: artefatos em **`.oxe/`** na raiz do projeto alvo e workflows em **`oxe/workflows/*.md`** ou **`.oxe/workflows/*.md`**, conforme a instalação.
4
4
 
5
5
  ## Quando aplicar
6
6
 
7
- Se o utilizador mencionar **OXE**, **oxe**, **/oxe-**, ou pedidos como “mapear o projeto”, “criar spec OXE”, “plano OXE com testes”, “verificar OXE”, trata como fluxo OXE e segue o ficheiro de workflow correspondente abaixo.
7
+ Se o usuário mencionar **OXE**, **oxe**, **/oxe-**, ou pedidos como “mapear o projeto”, “criar spec OXE”, “plano OXE com testes”, “verificar OXE”, trate como fluxo OXE e siga o arquivo de workflow correspondente abaixo.
8
8
 
9
9
  ## Workflows (fonte única)
10
10
 
11
- | Passo | Ficheiro | Gatilhos naturais (exemplos) |
12
- |-------|----------|----------------------------|
11
+ | Passo | Arquivo | Gatilhos naturais (exemplos) |
12
+ |-------|---------|-------------------------------|
13
13
  | Scan | `oxe/workflows/scan.md` | “oxe scan”, “mapear o repo”, “atualizar codebase OXE” |
14
14
  | Spec | `oxe/workflows/spec.md` | “oxe spec”, “escrever SPEC.md”, “requisitos OXE” |
15
15
  | Discuss | `oxe/workflows/discuss.md` | “oxe discuss”, “perguntas antes do plano”, “DISCUSS.md” |
@@ -18,21 +18,27 @@ 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
+ | Review PR | `oxe/workflows/review-pr.md` | “revisar PR”, link `…/pull/10`, “diff entre branches” *(prompt: `/oxe-review-pr` no Copilot)* |
22
22
  | Help | `oxe/workflows/help.md` | “oxe help”, “como usar OXE” |
23
23
 
24
- **Regra:** 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.
24
+ **Regra:** leia o Markdown indicado e execute **todos** os passos e critérios de sucesso descritos nesse arquivo. Não atalhe: crie ou atualize os arquivos em `.oxe/` conforme o workflow.
25
+
26
+ ## Onde ficam as integrações (após `npx oxe-cc`)
27
+
28
+ - **Cursor:** comandos em **`~/.cursor/commands/`** (slash `/oxe-*`).
29
+ - **GitHub Copilot (VS Code):** instruções mescladas em **`~/.copilot/copilot-instructions.md`** (bloco OXE) e **prompt files** em **`~/.copilot/prompts/`** (`oxe-*.prompt.md`). **Não** espere `.github/prompts/` no repositório do projeto para o Copilot — o instalador usa a pasta do **usuário**, alinhado ao GSD.
30
+ - **Copilot CLI (experimental):** com `oxe-cc --copilot-cli`, textos também em **`~/.claude/commands/`** e **`~/.copilot/commands/`** — depende da versão do CLI.
25
31
 
26
32
  ## Artefatos
27
33
 
28
34
  - `.oxe/STATE.md`, `.oxe/config.json` (opcional), `.oxe/codebase/*.md`, `.oxe/SPEC.md`, `.oxe/DISCUSS.md` (opcional), `.oxe/PLAN.md`, `.oxe/VERIFY.md`, `.oxe/QUICK.md`, `.oxe/SUMMARY.md`
29
- - Templates: `oxe/templates/`
35
+ - Templates: `oxe/templates/` (ou `.oxe/templates/` em layout aninhado)
30
36
 
31
- ## Cursor vs Copilot
37
+ ## CLI útil
32
38
 
33
- - **Cursor:** slash commands em `.cursor/commands/oxe-*.md` apontam para os mesmos workflows.
34
- - **Copilot:** 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).
39
+ - **`npx oxe-cc doctor`** validação completa (workflows do pacote, `config.json`, mapas, coerência STATE).
40
+ - **`npx oxe-cc status`** um único próximo passo sugerido + coerência `.oxe/`.
35
41
 
36
- ## Manutenção deste pacote (oxe-build)
42
+ ## Manutenção do pacote oxe-build
37
43
 
38
- Ao alterar comportamento OXE, edita primeiro `oxe/workflows/*.md`; mantém comandos Cursor e prompts Copilot alinhados com essa pasta.
44
+ Ao alterar comportamento OXE, edite primeiro **`oxe/workflows/*.md`**; mantenha comandos Cursor e prompts Copilot alinhados a essa pasta.
package/AGENTS.md CHANGED
@@ -5,7 +5,8 @@ Este repositório empacota o fluxo **OXE** (spec-driven, artefatos em `.oxe/`).
5
5
  - **npm:** o nome do pacote é **`oxe-cc`** (`npx oxe-cc@latest` quando estiver publicado; se `npm view oxe-cc` der 404, usar `npm link` a partir deste repo ou `node bin/oxe-cc.js`).
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
- - **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/`.
8
+ - **CLI:** `oxe-cc` instala assets e bootstrap (`.oxe/STATE.md`, `config.json`, `codebase/`); `oxe-cc doctor` valida workflows, JSON de config, coerência STATE vs artefatos e regras opcionais de SPEC/PLAN; `oxe-cc status` mostra coerência `.oxe/` e **um** próximo passo; `oxe-cc init-oxe` só inicializa `.oxe/`.
9
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
@@ -4,7 +4,7 @@
4
4
  <img src="assets/readme-banner.svg" alt="OXE" width="920" />
5
5
  </p>
6
6
 
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
+ **Fluxo spec-driven e context engineering para [Cursor](https://cursor.com) e [GitHub Copilot](https://github.com/features/copilot) — inspirado no [GSD](https://github.com/gsd-build/get-shit-done), com **menos comandos** e foco em **`.oxe/`** (workflows em **`.oxe/workflows/`** por padrão, ou **`oxe/workflows/`** com `--global`). Textos do CLI e resumos pós-comando estão em **português (Brasil)**.**
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/oxe-cc.svg?style=flat-square)](https://www.npmjs.com/package/oxe-cc)
10
10
  [![license](https://img.shields.io/npm/l/oxe-cc.svg?style=flat-square)](LICENSE)
@@ -13,7 +13,7 @@
13
13
  npx oxe-cc@latest
14
14
  ```
15
15
 
16
- **Manter atualizado:** `npx oxe-cc@latest --force` (na raiz do projeto).
16
+ **Manter atualizado:** `npx oxe-cc@latest --force` ou `npx oxe-cc update` (na raiz do projeto). Com **`--force`**, alterações locais em arquivos rastreados geram backup em **`~/.oxe-cc/oxe-local-patches/`** (estilo GSD).
17
17
 
18
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)
19
19
 
@@ -25,7 +25,7 @@ npx oxe-cc@latest
25
25
 
26
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
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.
28
+ OXE é **enxuto**: não há dezenas de slash commands. Há **um CLI** que deixa o repositório **só com `.oxe/`** (layout **padrão**) ou **`oxe/` + `.oxe/`** com **`--global`**, e instala integrações em **`~/.cursor`**, **`~/.copilot`** e **`~/.claude`** **workflows em Markdown** e **estado em disco** para a sessão não ficar **sobrecarregada** com tudo o que já foi decidido.
29
29
 
30
30
  ---
31
31
 
@@ -33,43 +33,64 @@ OXE é **enxuto**: não há dezenas de slash commands nem instalador multi-runti
33
33
 
34
34
  **Requisito:** [Node.js 18+](https://nodejs.org/).
35
35
 
36
- Na **raiz do repositório** do teu projeto:
36
+ Na **raiz do repositório** do seu projeto:
37
37
 
38
38
  ```bash
39
39
  npx oxe-cc@latest
40
40
  ```
41
41
 
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`.
42
+ Em **terminal interativo**, o instalador pergunta em dois passos (como no **GSD**): (1) **onde integrar** o OXE (Cursor, Copilot, núcleo com `.oxe/`, etc.); (2) **layout no repositório** — **clássico** (`oxe/` na raiz + `.oxe/`, com opcional `commands/oxe/`, `AGENTS.md`) ou **mínimo** (**só `.oxe/`**, com **`.oxe/workflows/`** e templates). **Cursor, Copilot e CLI** usam **sempre** as pastas do **usuário** (`~/.cursor`, `~/.copilot`, `~/.claude`); **não** são criados `.cursor` / `.github` / `.claude` dentro do repo. Com layout clássico e **`--vscode`**, **`.vscode/`** fica no projeto.
43
+
44
+ Ao terminar, o CLI mostra um **resumo do que foi criado ou atualizado** e **próximos passos sugeridos** (por exemplo `npx oxe-cc doctor`, `/oxe-scan`), no mesmo espírito do GSD.
45
+
46
+ Sem TTY (CI), o **layout mínimo** (só `.oxe/`) e integrações no **HOME** são o padrão. Use **`--global`** para também ter **`oxe/`** na raiz. Flags: **`--cursor`**, **`--copilot`**, **`--oxe-only`**, **`OXE_NO_PROMPT=1`**, etc.
47
+
48
+ No fim, em modo interativo, pergunta se você quer instalar o **`oxe-cc` globalmente** (`npm install -g`) ou continuar só com **`npx`**. Em CI ou scripts use **`--no-global-cli`** / **`-l`**, ou defina **`OXE_NO_PROMPT=1`**. Para instalar o CLI sem pergunta: **`--global-cli`** / **`-g`**.
49
+
50
+ **GitHub Copilot CLI (experimental):** **`--copilot-cli`** copia os mesmos comandos para **`~/.claude/commands/`** e **`~/.copilot/commands/`** (não para o repositório). Na raiz do repo: `npx oxe-cc@latest --force --copilot --copilot-cli`. Depois teste **`/oxe-scan`** na sessão do CLI. O suporte depende da versão; veja [discussão no copilot-cli](https://github.com/github/copilot-cli/issues/1113).
43
51
 
44
52
  **Confirmar instalação no agente**
45
53
 
46
- | Onde | O que correr |
54
+ | Onde | O que executar |
47
55
  |------|----------------|
48
56
  | **Cursor** | `/oxe-help` |
49
57
  | **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)) |
50
58
 
51
- > **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.
59
+ > **Nota:** Instruções e prompt files do Copilot ficam em **`~/.copilot/`** (alinhado ao GSD), não em `.github/` no repo. **`oxe-cc doctor`** aceita workflows em **`.oxe/workflows/`** ou **`oxe/workflows/`**. Sem prompt files, você ainda pode pedir em linguagem natural com o repositório em contexto.
52
60
 
53
- **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`.
61
+ **Sem pacote no npm** (`npm view oxe-cc version` → 404): clone este repo, `npm link` na pasta **oxe-build**, `npm link oxe-cc` no seu projeto e execute `oxe-cc`. Alternativa: `node /caminho/oxe-build/bin/oxe-cc.js`.
54
62
 
55
63
  <details>
56
64
  <summary><strong>Instalação: flags úteis (CI, ou só parte do pacote)</strong></summary>
57
65
 
58
66
  | Flag | Efeito |
59
67
  |------|--------|
60
- | `--force` / `-f` | Sobrescreve ficheiros já existentes (**obrigatório** para atualizar cópias antigas) |
68
+ | `--force` / `-f` | Sobrescreve arquivos já existentes (**obrigatório** para atualizar cópias antigas) |
61
69
  | `--dry-run` | Lista ações sem escrever |
62
70
  | `--cursor` / `--copilot` | Instala só uma das stacks |
63
- | `--oxe-only` | Só a pasta `oxe/` (workflows) |
64
- | `--no-init-oxe` | Não cria `.oxe/` no fim |
65
- | `--vscode` | Copia `.vscode/settings.json` de exemplo |
71
+ | `--oxe-only` | Só workflows + templates dentro de **`.oxe/`** (sem integrações IDE) |
72
+ | `--no-init-oxe` | Não executa o bootstrap de `STATE.md` / `config.json` / `codebase/` (mantém `.oxe/workflows` se copiados) |
73
+ | `--global` | Layout **clássico**: **`oxe/`** na raiz do repo + **`.oxe/`**; IDE em `~/.cursor`, `~/.copilot`, `~/.claude` |
74
+ | `--local` | Layout **mínimo** (padrão): **só `.oxe/`** com **`.oxe/workflows/`**; IDE nas mesmas pastas do usuário |
75
+ | `--global-cli` / `-g` | Após copiar: `npm install -g oxe-cc@versão` (sem pergunta) |
76
+ | `--no-global-cli` / `-l` | Não pergunta nem instala o CLI global (útil em CI) |
77
+ | `--copilot-cli` | Copia comandos OXE para **`~/.claude/commands/`** e **`~/.copilot/commands/`** |
78
+ | `--vscode` | Copia `.vscode/settings.json` (só com layout **`--global`**) |
66
79
  | `--no-commands` | Omite `commands/oxe/` |
67
80
  | `--no-agents` | Omite `AGENTS.md` |
68
81
  | `--dir <pasta>` ou argumento posicional | Destino em vez do diretório atual |
69
82
 
70
83
  **Global:** `npm install -g oxe-cc`.
71
84
 
72
- **Subcomandos:** `oxe-cc doctor` (valida Node, workflows, `.oxe/`), `oxe-cc init-oxe` (só bootstrap `.oxe/`).
85
+ **Subcomandos**
86
+
87
+ | Comando | Função |
88
+ |---------|--------|
89
+ | `oxe-cc doctor` | Valida Node, workflows do pacote, `.oxe/`, coerência STATE vs arquivos, scan antigo (`scan_max_age_days`), seções da SPEC, ondas do PLAN |
90
+ | `oxe-cc status` | Leve: coerência `.oxe/` + **um** próximo passo sugerido (espelha o workflow `next`) |
91
+ | `oxe-cc init-oxe` | Só o bootstrap `.oxe/` (STATE, config, codebase) |
92
+ | `oxe-cc uninstall` | Remove integrações OXE em `~/.cursor`, `~/.copilot`, `~/.claude` e pastas de workflows no repo (`--ide-only` só no HOME) |
93
+ | `oxe-cc update` | Executa `npx oxe-cc@latest --force` na pasta do projeto (útil para atualizar tudo de uma vez) |
73
94
 
74
95
  </details>
75
96
 
@@ -83,7 +104,7 @@ npm test
83
104
  node bin/oxe-cc.js --help
84
105
  ```
85
106
 
86
- Para testar no teu app: `npm link` aqui, depois `npm link oxe-cc` no projeto alvo.
107
+ Para testar no seu app: `npm link` aqui, depois `npm link oxe-cc` no projeto alvo.
87
108
 
88
109
  </details>
89
110
 
@@ -91,33 +112,33 @@ Para testar no teu app: `npm link` aqui, depois `npm link oxe-cc` no projeto alv
91
112
 
92
113
  ## Como funciona
93
114
 
94
- **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.
115
+ **Já tem código no repositório?** Comece por **`/oxe-scan`**. Isso gera mapas em **`.oxe/codebase/`** (stack, estrutura, testes, convenções, etc.). Assim o **spec** e o **plan** alinham com o repo real — no mesmo espírito de rodar *map-codebase* antes do roadmap no GSD.
95
116
 
96
117
  ### 1. Mapear — `/oxe-scan`
97
118
 
98
- Inventaria o projeto e preenche **`.oxe/codebase/*.md`**, atualiza **`.oxe/STATE.md`**. Podes indicar foco opcional (ex. “só API”).
119
+ Inventaria o projeto e preenche **`.oxe/codebase/*.md`**, atualiza **`.oxe/STATE.md`**. Você pode indicar foco opcional (ex.: “só API”).
99
120
 
100
121
  ### 2. Especificar — `/oxe-spec`
101
122
 
102
- Produz ou atualiza **`.oxe/SPEC.md`**: objetivo, escopo, critérios de aceite, riscos. Isto é o contrato antes do plano.
123
+ Produz ou atualiza **`.oxe/SPEC.md`**: objetivo, escopo, critérios de aceite, riscos. Isso é o contrato antes do plano.
103
124
 
104
125
  ### 3. Discutir *(opcional)* — `/oxe-discuss`
105
126
 
106
- 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.
127
+ Captura decisões de implementação (UI, API, tom, edge cases) em **`.oxe/DISCUSS.md`**, para o plano não “adivinhar” o que você prefere. Útil quando `discuss_before_plan` está ativo em `.oxe/config.json`. **Pular** este passo = defaults razoáveis; **usar** = mais próximo da sua visão.
107
128
 
108
129
  ### 4. Planear — `/oxe-plan`
109
130
 
110
- 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.
131
+ 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.
111
132
 
112
- 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, só que com menos cerimónia).
133
+ Ondas em resumo: tarefas **independentes** na mesma onda podem **rodar** em paralelo; **dependentes** vão para ondas posteriores (como no diagrama de *waves* do GSD, só que com menos cerimônia).
113
134
 
114
135
  ### 5. Executar — implementação + `/oxe-execute` *(opcional)*
115
136
 
116
- 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.
137
+ Implemente no editor ou deixe 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 a cargo do **seu** fluxo com Git.
117
138
 
118
139
  ### 6. Verificar — `/oxe-verify`
119
140
 
120
- 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).
141
+ Cruza **SPEC** + **PLAN** com o código; escreve **`.oxe/VERIFY.md`**. Se algo falhar, corrija ou replaneje (`/oxe-plan` com lógica de replanejamento descrita no workflow).
121
142
 
122
143
  ### 7. Seguir em frente — `/oxe-next` e ciclo
123
144
 
@@ -127,17 +148,17 @@ Para a **próxima** feature ou fase: de novo **spec → plan → …** ou **`/ox
127
148
 
128
149
  ## Modo rápido
129
150
 
130
- Para trabalho **adhoc** sem roadmap completo — equivalente conceptual ao **`/gsd:quick`**:
151
+ Para trabalho **ad hoc** sem roadmap completo — equivalente **conceitual** ao **`/gsd:quick`**:
131
152
 
132
- **`/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`**.
153
+ **`/oxe-quick`** gera **`.oxe/QUICK.md`** com passos curtos e verificação. Depois você pode usar **`/oxe-execute`** em cima disso ou implementar direto e fechar com **`/oxe-verify`**.
133
154
 
134
- Se o trabalho crescer, **promove** para spec + plan completos.
155
+ Se o trabalho crescer, **promova** para spec + plan completos.
135
156
 
136
157
  ---
137
158
 
138
159
  ## Porque funciona
139
160
 
140
- **Context engineering:** o agente não precisa de “lembrar” tudo na janela principal — o que importa está em ficheiros **pequenos e por etapa**.
161
+ **Context engineering:** o agente não precisa de “lembrar” tudo na janela principal — o que importa está em arquivos **pequenos e por etapa**.
141
162
 
142
163
  | Artefato | Função |
143
164
  |----------|--------|
@@ -145,12 +166,12 @@ Se o trabalho crescer, **promove** para spec + plan completos.
145
166
  | `.oxe/codebase/*.md` | Mapa do repo após scan |
146
167
  | `.oxe/SPEC.md` | O que entregar e como saber que está certo |
147
168
  | `.oxe/DISCUSS.md` | Preferências antes do plano *(opcional)* |
148
- | `.oxe/PLAN.md` | Tarefas atómicas + **Verificar** por item |
169
+ | `.oxe/PLAN.md` | Tarefas atômicas + **Verificar** por item |
149
170
  | `.oxe/QUICK.md` | Modo rápido |
150
171
  | `.oxe/VERIFY.md` | Resultado das verificações |
151
172
  | `oxe/workflows/*.md` | **Fonte única** dos passos (Cursor e Copilot só delegam aqui) |
152
173
 
153
- **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*.
174
+ **Formato:** planos em Markdown com seçõ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*.
154
175
 
155
176
  ---
156
177
 
@@ -179,7 +200,7 @@ Se o trabalho crescer, **promove** para spec + plan completos.
179
200
 
180
201
  | Prompt | O que faz |
181
202
  |--------|-----------|
182
- | `/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. |
203
+ | `/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. Você pode 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 você pode pedir o mesmo em linguagem natural com o workflow em contexto. |
183
204
 
184
205
  ### Outros clientes
185
206
 
@@ -189,7 +210,7 @@ Em **Claude Code** (ou ferramentas que leem `commands/oxe/`), os mesmos passos e
189
210
 
190
211
  ## Configuração
191
212
 
192
- 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).
213
+ 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 padrão).
193
214
 
194
215
  ---
195
216
 
@@ -197,20 +218,21 @@ Preferências do projeto em **`.oxe/config.json`** (criado no bootstrap a partir
197
218
 
198
219
  | Situação | O que tentar |
199
220
  |----------|----------------|
200
- | Comandos não aparecem no Cursor | Confirma que `.cursor/commands/` existe; reinicia o Cursor |
201
- | Prompts `/oxe-*` não aparecem no Copilot | Ativa `"chat.promptFiles": true`; confirma `.github/prompts/*.prompt.md` |
202
- | **`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` |
203
- | **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` |
204
- | Ficheiros não atualizam | Reinstala com **`--force`** |
221
+ | Comandos não aparecem no Cursor | Confirme que `~/.cursor/commands/` (ou a pasta configurada) existe; reinicie o Cursor |
222
+ | Prompts `/oxe-*` não aparecem no Copilot | Ative `"chat.promptFiles": true`; confirme prompts em **`~/.copilot/prompts/`** (o OXE não coloca `.github/` no repo para o Copilot) |
223
+ | Slash `/oxe-*` no **Copilot CLI** | Instale com **`--copilot-cli`** (`~/.claude/commands` e `~/.copilot/commands`); comportamento ainda experimental |
224
+ | **`ETARGET`** / versão não encontrada no `npx` | `npm cache clean --force`, `npx clear-npx-cache`, ou fixe a versão: `npx oxe-cc@0.3.0`. Verifique `npm config get registry` |
225
+ | **404** no `npm view oxe-cc` | Pacote com outro nome (scope) ou ainda não publicado — use `npm link` ou `node …/bin/oxe-cc.js` |
226
+ | Arquivos não atualizam | Reinstale com **`--force`** (com backup local se você tiver editado arquivos rastreados) |
205
227
 
206
228
  **Ajuda no terminal:** `oxe-cc --help`. **Diagnóstico:** `oxe-cc doctor`.
207
229
 
208
- **Banner no CLI:** [`bin/banner.txt`](bin/banner.txt) (`{version}`). `OXE_NO_BANNER=1` desliga; `NO_COLOR` remove cores.
230
+ **Banner no CLI:** [`bin/banner.txt`](bin/banner.txt) (`{version}`). `OXE_NO_BANNER=1` desativa o banner; `NO_COLOR` remove cores.
209
231
 
210
232
  <details>
211
233
  <summary><strong>Publicar no npm (mantenedores)</strong></summary>
212
234
 
213
- Sobe `version` em `package.json`, `npm login` (2FA se exigido), `npm publish --access public`. O `prepublishOnly` corre testes e `scan:assets`.
235
+ Incremente `version` em `package.json`, rode `npm login` (2FA se exigido) e `npm publish --access public`. O script `prepublishOnly` **executa** os testes e o `scan:assets`.
214
236
 
215
237
  </details>
216
238
 
@@ -221,7 +243,7 @@ Sobe `version` em `package.json`, `npm login` (2FA se exigido), `npm publish --a
221
243
  |---------|--------|
222
244
  | `assets/readme-banner.svg` | Banner deste README |
223
245
  | `bin/oxe-cc.js`, `bin/banner.txt` | CLI |
224
- | `oxe/workflows/` | Workflows canónicos |
246
+ | `oxe/workflows/` | Workflows canônicos |
225
247
  | `oxe/templates/` | Modelos e CONFIG |
226
248
  | `.cursor/`, `.github/` | Cursor e Copilot |
227
249
  | `commands/oxe/` | `oxe:*` para outros runtimes |
@@ -1,18 +1,19 @@
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">
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <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
3
  <defs>
3
4
  <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"/>
5
+ <stop offset="0%" stop-color="#0d1117"/>
6
+ <stop offset="50%" stop-color="#161b22"/>
7
+ <stop offset="100%" stop-color="#21262d"/>
7
8
  </linearGradient>
8
9
  <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"/>
10
+ <stop offset="0%" stop-color="#58a6ff"/>
11
+ <stop offset="100%" stop-color="#79c0ff"/>
11
12
  </linearGradient>
12
13
  </defs>
13
14
  <rect width="920" height="200" rx="16" fill="url(#oxe-bg)"/>
14
15
  <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>
16
+ <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>
17
+ <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 &#xb7; Cursor &amp; GitHub Copilot &#xb7; CLI npm</text>
18
+ <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
19
  </svg>
package/bin/banner.txt CHANGED
@@ -15,4 +15,4 @@
15
15
 
16
16
  ══════════════════════════════════════════════════════
17
17
 
18
- v0.3.1
18
+ v0.3.3
@@ -0,0 +1,117 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const crypto = require('crypto');
6
+
7
+ const MANIFEST_DIR = '.oxe-cc';
8
+ const MANIFEST_FILE = 'manifest.json';
9
+ const PATCHES_DIR = 'oxe-local-patches';
10
+
11
+ function manifestPath(home) {
12
+ return path.join(home, MANIFEST_DIR, MANIFEST_FILE);
13
+ }
14
+
15
+ function sha256File(filePath) {
16
+ return crypto.createHash('sha256').update(fs.readFileSync(filePath)).digest('hex');
17
+ }
18
+
19
+ /**
20
+ * @param {string} home
21
+ * @returns {Record<string, string>}
22
+ */
23
+ function loadFileManifest(home) {
24
+ const p = manifestPath(home);
25
+ if (!fs.existsSync(p)) return {};
26
+ try {
27
+ const j = JSON.parse(fs.readFileSync(p, 'utf8'));
28
+ return j && typeof j.files === 'object' ? j.files : {};
29
+ } catch {
30
+ return {};
31
+ }
32
+ }
33
+
34
+ /**
35
+ * @param {string} home
36
+ * @param {Record<string, string>} files absPath -> sha256
37
+ * @param {string} version
38
+ */
39
+ function writeFileManifest(home, files, version) {
40
+ const dir = path.join(home, MANIFEST_DIR);
41
+ fs.mkdirSync(dir, { recursive: true });
42
+ const payload = {
43
+ version,
44
+ updated_at: new Date().toISOString(),
45
+ files,
46
+ };
47
+ fs.writeFileSync(manifestPath(home), JSON.stringify(payload, null, 2) + '\n', 'utf8');
48
+ }
49
+
50
+ /**
51
+ * GSD-style: before overwriting with --force, backup files that diverged from last manifest.
52
+ * @param {string} home
53
+ * @param {Record<string, string>} prevManifest
54
+ * @param {{ dryRun: boolean, force: boolean }} opts
55
+ * @param {{ yellow: string, cyan: string, dim: string, reset: string }} colors
56
+ * @returns {string[]} modified paths
57
+ */
58
+ function backupModifiedFromManifest(home, prevManifest, opts, colors) {
59
+ const { yellow, cyan, dim, reset } = colors;
60
+ if (!opts.force || opts.dryRun) return [];
61
+ const modified = [];
62
+ for (const [absPath, oldHash] of Object.entries(prevManifest)) {
63
+ if (!fs.existsSync(absPath)) continue;
64
+ let now;
65
+ try {
66
+ now = sha256File(absPath);
67
+ } catch {
68
+ continue;
69
+ }
70
+ if (now !== oldHash) modified.push(absPath);
71
+ }
72
+ if (modified.length === 0) return [];
73
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-');
74
+ const patchesRoot = path.join(home, MANIFEST_DIR, PATCHES_DIR, stamp);
75
+ for (const absPath of modified) {
76
+ const rel = path.basename(absPath);
77
+ const dest = path.join(patchesRoot, rel.replace(/[^a-zA-Z0-9._-]+/g, '_'));
78
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
79
+ fs.copyFileSync(absPath, dest);
80
+ }
81
+ const meta = { backed_up_at: new Date().toISOString(), files: modified };
82
+ fs.writeFileSync(path.join(patchesRoot, 'backup-meta.json'), JSON.stringify(meta, null, 2) + '\n', 'utf8');
83
+ console.log(
84
+ ` ${yellow}i${reset} ${modified.length} arquivo(s) OXE alterado(s) localmente — backup em ${cyan}${path.relative(home, patchesRoot)}${reset}`
85
+ );
86
+ for (const f of modified) console.log(` ${dim}${f}${reset}`);
87
+ return modified;
88
+ }
89
+
90
+ /**
91
+ * @param {string} dir
92
+ * @param {(f: string) => boolean} filter
93
+ */
94
+ function collectFilesRecursive(dir, filter) {
95
+ /** @type {string[]} */
96
+ const out = [];
97
+ if (!fs.existsSync(dir)) return out;
98
+ const walk = (d) => {
99
+ for (const e of fs.readdirSync(d, { withFileTypes: true })) {
100
+ const p = path.join(d, e.name);
101
+ if (e.isDirectory()) walk(p);
102
+ else if (filter(e.name)) out.push(p);
103
+ }
104
+ };
105
+ walk(dir);
106
+ return out;
107
+ }
108
+
109
+ module.exports = {
110
+ loadFileManifest,
111
+ writeFileManifest,
112
+ backupModifiedFromManifest,
113
+ collectFilesRecursive,
114
+ sha256File,
115
+ MANIFEST_DIR,
116
+ PATCHES_DIR,
117
+ };