oxe-cc 0.3.3 → 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 -13
- package/AGENTS.md +1 -1
- package/README.md +56 -42
- package/assets/readme-banner.svg +10 -9
- package/bin/lib/oxe-manifest.cjs +117 -0
- package/bin/lib/oxe-project-health.cjs +412 -0
- package/bin/oxe-cc.js +1198 -120
- 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 -22
- 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,22 +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
|
-
-
|
|
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.
|
|
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/`.
|
|
36
41
|
|
|
37
|
-
## Manutenção
|
|
42
|
+
## Manutenção do pacote oxe-build
|
|
38
43
|
|
|
39
|
-
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,7 @@ 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
10
|
- **Copilot CLI (experimental):** `oxe-cc --copilot-cli` → `.claude/commands/oxe-*.md` para testar `/oxe-scan` no terminal.
|
|
11
11
|
|
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,50 +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
43
|
|
|
44
|
-
|
|
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
45
|
|
|
46
|
-
|
|
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).
|
|
47
51
|
|
|
48
52
|
**Confirmar instalação no agente**
|
|
49
53
|
|
|
50
|
-
| Onde | O que
|
|
54
|
+
| Onde | O que executar |
|
|
51
55
|
|------|----------------|
|
|
52
56
|
| **Cursor** | `/oxe-help` |
|
|
53
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)) |
|
|
54
58
|
|
|
55
|
-
> **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.
|
|
56
60
|
|
|
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
|
|
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`.
|
|
58
62
|
|
|
59
63
|
<details>
|
|
60
64
|
<summary><strong>Instalação: flags úteis (CI, ou só parte do pacote)</strong></summary>
|
|
61
65
|
|
|
62
66
|
| Flag | Efeito |
|
|
63
67
|
|------|--------|
|
|
64
|
-
| `--force` / `-f` | Sobrescreve
|
|
68
|
+
| `--force` / `-f` | Sobrescreve arquivos já existentes (**obrigatório** para atualizar cópias antigas) |
|
|
65
69
|
| `--dry-run` | Lista ações sem escrever |
|
|
66
70
|
| `--cursor` / `--copilot` | Instala só uma das stacks |
|
|
67
|
-
| `--oxe-only` | Só
|
|
68
|
-
| `--no-init-oxe` | Não
|
|
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 |
|
|
69
75
|
| `--global-cli` / `-g` | Após copiar: `npm install -g oxe-cc@versão` (sem pergunta) |
|
|
70
76
|
| `--no-global-cli` / `-l` | Não pergunta nem instala o CLI global (útil em CI) |
|
|
71
|
-
| `--copilot-cli` | Copia comandos OXE para
|
|
72
|
-
| `--vscode` | Copia `.vscode/settings.json`
|
|
77
|
+
| `--copilot-cli` | Copia comandos OXE para **`~/.claude/commands/`** e **`~/.copilot/commands/`** |
|
|
78
|
+
| `--vscode` | Copia `.vscode/settings.json` (só com layout **`--global`**) |
|
|
73
79
|
| `--no-commands` | Omite `commands/oxe/` |
|
|
74
80
|
| `--no-agents` | Omite `AGENTS.md` |
|
|
75
81
|
| `--dir <pasta>` ou argumento posicional | Destino em vez do diretório atual |
|
|
76
82
|
|
|
77
83
|
**Global:** `npm install -g oxe-cc`.
|
|
78
84
|
|
|
79
|
-
**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) |
|
|
80
94
|
|
|
81
95
|
</details>
|
|
82
96
|
|
|
@@ -90,7 +104,7 @@ npm test
|
|
|
90
104
|
node bin/oxe-cc.js --help
|
|
91
105
|
```
|
|
92
106
|
|
|
93
|
-
Para testar no
|
|
107
|
+
Para testar no seu app: `npm link` aqui, depois `npm link oxe-cc` no projeto alvo.
|
|
94
108
|
|
|
95
109
|
</details>
|
|
96
110
|
|
|
@@ -98,33 +112,33 @@ Para testar no teu app: `npm link` aqui, depois `npm link oxe-cc` no projeto alv
|
|
|
98
112
|
|
|
99
113
|
## Como funciona
|
|
100
114
|
|
|
101
|
-
**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.
|
|
102
116
|
|
|
103
117
|
### 1. Mapear — `/oxe-scan`
|
|
104
118
|
|
|
105
|
-
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”).
|
|
106
120
|
|
|
107
121
|
### 2. Especificar — `/oxe-spec`
|
|
108
122
|
|
|
109
|
-
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.
|
|
110
124
|
|
|
111
125
|
### 3. Discutir *(opcional)* — `/oxe-discuss`
|
|
112
126
|
|
|
113
|
-
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.
|
|
114
128
|
|
|
115
129
|
### 4. Planear — `/oxe-plan`
|
|
116
130
|
|
|
117
|
-
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.
|
|
118
132
|
|
|
119
|
-
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).
|
|
120
134
|
|
|
121
135
|
### 5. Executar — implementação + `/oxe-execute` *(opcional)*
|
|
122
136
|
|
|
123
|
-
|
|
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.
|
|
124
138
|
|
|
125
139
|
### 6. Verificar — `/oxe-verify`
|
|
126
140
|
|
|
127
|
-
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).
|
|
128
142
|
|
|
129
143
|
### 7. Seguir em frente — `/oxe-next` e ciclo
|
|
130
144
|
|
|
@@ -134,17 +148,17 @@ Para a **próxima** feature ou fase: de novo **spec → plan → …** ou **`/ox
|
|
|
134
148
|
|
|
135
149
|
## Modo rápido
|
|
136
150
|
|
|
137
|
-
Para trabalho **
|
|
151
|
+
Para trabalho **ad hoc** sem roadmap completo — equivalente **conceitual** ao **`/gsd:quick`**:
|
|
138
152
|
|
|
139
|
-
**`/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`**.
|
|
140
154
|
|
|
141
|
-
Se o trabalho crescer, **
|
|
155
|
+
Se o trabalho crescer, **promova** para spec + plan completos.
|
|
142
156
|
|
|
143
157
|
---
|
|
144
158
|
|
|
145
159
|
## Porque funciona
|
|
146
160
|
|
|
147
|
-
**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**.
|
|
148
162
|
|
|
149
163
|
| Artefato | Função |
|
|
150
164
|
|----------|--------|
|
|
@@ -152,12 +166,12 @@ Se o trabalho crescer, **promove** para spec + plan completos.
|
|
|
152
166
|
| `.oxe/codebase/*.md` | Mapa do repo após scan |
|
|
153
167
|
| `.oxe/SPEC.md` | O que entregar e como saber que está certo |
|
|
154
168
|
| `.oxe/DISCUSS.md` | Preferências antes do plano *(opcional)* |
|
|
155
|
-
| `.oxe/PLAN.md` | Tarefas
|
|
169
|
+
| `.oxe/PLAN.md` | Tarefas atômicas + **Verificar** por item |
|
|
156
170
|
| `.oxe/QUICK.md` | Modo rápido |
|
|
157
171
|
| `.oxe/VERIFY.md` | Resultado das verificações |
|
|
158
172
|
| `oxe/workflows/*.md` | **Fonte única** dos passos (Cursor e Copilot só delegam aqui) |
|
|
159
173
|
|
|
160
|
-
**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*.
|
|
161
175
|
|
|
162
176
|
---
|
|
163
177
|
|
|
@@ -186,7 +200,7 @@ Se o trabalho crescer, **promove** para spec + plan completos.
|
|
|
186
200
|
|
|
187
201
|
| Prompt | O que faz |
|
|
188
202
|
|--------|-----------|
|
|
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.
|
|
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. |
|
|
190
204
|
|
|
191
205
|
### Outros clientes
|
|
192
206
|
|
|
@@ -196,7 +210,7 @@ Em **Claude Code** (ou ferramentas que leem `commands/oxe/`), os mesmos passos e
|
|
|
196
210
|
|
|
197
211
|
## Configuração
|
|
198
212
|
|
|
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
|
|
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).
|
|
200
214
|
|
|
201
215
|
---
|
|
202
216
|
|
|
@@ -204,21 +218,21 @@ Preferências do projeto em **`.oxe/config.json`** (criado no bootstrap a partir
|
|
|
204
218
|
|
|
205
219
|
| Situação | O que tentar |
|
|
206
220
|
|----------|----------------|
|
|
207
|
-
| Comandos não aparecem no Cursor |
|
|
208
|
-
| Prompts `/oxe-*` não aparecem no Copilot |
|
|
209
|
-
| Slash `/oxe-*` no **Copilot CLI** |
|
|
210
|
-
| **`ETARGET`** / versão não encontrada no `npx` | `npm cache clean --force`, `npx clear-npx-cache`, ou
|
|
211
|
-
| **404** no `npm view oxe-cc` | Pacote com outro nome (scope) ou ainda não publicado —
|
|
212
|
-
|
|
|
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) |
|
|
213
227
|
|
|
214
228
|
**Ajuda no terminal:** `oxe-cc --help`. **Diagnóstico:** `oxe-cc doctor`.
|
|
215
229
|
|
|
216
|
-
**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.
|
|
217
231
|
|
|
218
232
|
<details>
|
|
219
233
|
<summary><strong>Publicar no npm (mantenedores)</strong></summary>
|
|
220
234
|
|
|
221
|
-
|
|
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`.
|
|
222
236
|
|
|
223
237
|
</details>
|
|
224
238
|
|
|
@@ -229,7 +243,7 @@ Sobe `version` em `package.json`, `npm login` (2FA se exigido), `npm publish --a
|
|
|
229
243
|
|---------|--------|
|
|
230
244
|
| `assets/readme-banner.svg` | Banner deste README |
|
|
231
245
|
| `bin/oxe-cc.js`, `bin/banner.txt` | CLI |
|
|
232
|
-
| `oxe/workflows/` | Workflows
|
|
246
|
+
| `oxe/workflows/` | Workflows canônicos |
|
|
233
247
|
| `oxe/templates/` | Modelos e CONFIG |
|
|
234
248
|
| `.cursor/`, `.github/` | Cursor e Copilot |
|
|
235
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>
|
|
@@ -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
|
+
};
|