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.
- package/.github/copilot-instructions.md +18 -12
- package/AGENTS.md +2 -1
- package/README.md +60 -38
- package/assets/readme-banner.svg +10 -9
- package/bin/banner.txt +1 -1
- package/bin/lib/oxe-manifest.cjs +117 -0
- package/bin/lib/oxe-project-health.cjs +412 -0
- package/bin/oxe-cc.js +1324 -93
- package/oxe/templates/CONFIG.md +10 -5
- package/oxe/templates/PLAN.template.md +1 -1
- package/oxe/templates/SPEC.template.md +9 -5
- package/oxe/templates/STATE.md +9 -1
- package/oxe/templates/config.template.json +6 -1
- package/oxe/workflows/discuss.md +4 -4
- package/oxe/workflows/execute.md +14 -6
- package/oxe/workflows/help.md +23 -20
- package/oxe/workflows/next.md +20 -13
- package/oxe/workflows/plan.md +14 -13
- package/oxe/workflows/quick.md +23 -10
- package/oxe/workflows/review-pr.md +11 -11
- package/oxe/workflows/scan.md +13 -11
- package/oxe/workflows/spec.md +15 -14
- package/oxe/workflows/verify.md +19 -16
- package/package.json +2 -2
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
# OXE — fluxo spec-driven (Cursor + Copilot)
|
|
2
2
|
|
|
3
|
-
Este repositório define o **OXE**: artefatos em
|
|
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
|
|
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 |
|
|
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
|
|
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:**
|
|
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
|
-
##
|
|
37
|
+
## CLI útil
|
|
32
38
|
|
|
33
|
-
-
|
|
34
|
-
-
|
|
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
|
|
42
|
+
## Manutenção do pacote oxe-build
|
|
37
43
|
|
|
38
|
-
Ao alterar comportamento OXE,
|
|
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
|
|
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
|
|
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
|
[](https://www.npmjs.com/package/oxe-cc)
|
|
10
10
|
[](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
|
|
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
|
|
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
|
-
|
|
42
|
+
Em **terminal interativo**, o instalador pergunta em dois passos (como no **GSD**): (1) **onde integrar** o OXE (Cursor, Copilot, só 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
|
|
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:**
|
|
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
|
|
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
|
|
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ó
|
|
64
|
-
| `--no-init-oxe` | Não
|
|
65
|
-
| `--
|
|
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
|
|
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
|
|
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á
|
|
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`**.
|
|
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.
|
|
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
|
|
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 **
|
|
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
|
|
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
|
-
|
|
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,
|
|
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 **
|
|
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
|
|
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, **
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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 |
|
|
201
|
-
| Prompts `/oxe-*` não aparecem no Copilot |
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
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`
|
|
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
|
-
|
|
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
|
|
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 |
|
package/assets/readme-banner.svg
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
|
|
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%"
|
|
5
|
-
<stop offset="50%"
|
|
6
|
-
<stop offset="100%"
|
|
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%"
|
|
10
|
-
<stop offset="100%"
|
|
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,
|
|
16
|
-
<text x="460" y="138" text-anchor="middle" font-family="ui-sans-serif,
|
|
17
|
-
<text x="460" y="168" text-anchor="middle" font-family="ui-monospace,
|
|
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 · Cursor & GitHub Copilot · 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
|
@@ -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
|
+
};
|