@mir-code/specs-platform 1.0.1
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/LICENSE +21 -0
- package/README.md +460 -0
- package/assets/specs-usage-statusline.sh +77 -0
- package/assets/template/.agents/README.md +123 -0
- package/assets/template/.agents/RUNTIME.md +64 -0
- package/assets/template/.agents/agents/discovery-agent.md +15 -0
- package/assets/template/.agents/agents/drawing-agent.md +15 -0
- package/assets/template/.agents/agents/feature-runner.md +15 -0
- package/assets/template/.agents/agents/refinement-runner.md +15 -0
- package/assets/template/.agents/agents/refinement.md +15 -0
- package/assets/template/.agents/project.md +158 -0
- package/assets/template/.agents/scripts/check-commit.mjs +70 -0
- package/assets/template/.agents/scripts/validate-spec.mjs +345 -0
- package/assets/template/.agents/skills/discovery-agent/SKILL.md +80 -0
- package/assets/template/.agents/skills/discovery-writing/SKILL.md +76 -0
- package/assets/template/.agents/skills/drawing-agent/SKILL.md +85 -0
- package/assets/template/.agents/skills/drawing-writing/SKILL.md +100 -0
- package/assets/template/.agents/skills/execution-protocol/SKILL.md +110 -0
- package/assets/template/.agents/skills/execution-protocol/references/git.md +104 -0
- package/assets/template/.agents/skills/execution-protocol/references/relatorio-halt.md +103 -0
- package/assets/template/.agents/skills/feature-runner/SKILL.md +81 -0
- package/assets/template/.agents/skills/feature-runner/references/divergencias.md +38 -0
- package/assets/template/.agents/skills/feature-runner/references/implementar.md +80 -0
- package/assets/template/.agents/skills/feature-runner/references/localizar.md +46 -0
- package/assets/template/.agents/skills/mermaid-diagramming/SKILL.md +198 -0
- package/assets/template/.agents/skills/prototype-check/SKILL.md +90 -0
- package/assets/template/.agents/skills/refinement/SKILL.md +136 -0
- package/assets/template/.agents/skills/refinement/references/estrutura.md +27 -0
- package/assets/template/.agents/skills/refinement/references/mapear-terreno.md +46 -0
- package/assets/template/.agents/skills/refinement/references/validar-renderizacao.md +29 -0
- package/assets/template/.agents/skills/refinement-runner/SKILL.md +145 -0
- package/assets/template/.agents/skills/requirements-closure/SKILL.md +236 -0
- package/assets/template/.agents/skills/spec-writing/SKILL.md +258 -0
- package/assets/template/.agents/skills/test-strategy/SKILL.md +176 -0
- package/assets/template/.agents/skills/verification/SKILL.md +143 -0
- package/assets/template/.specs/config.json +39 -0
- package/assets/template/.specs/discoveries/meta.json +4 -0
- package/assets/template/.specs/drawings/meta.json +4 -0
- package/assets/template/.specs/specs/_templates/task-backend.md +75 -0
- package/assets/template/.specs/specs/_templates/task-frontend.md +89 -0
- package/assets/template/.specs/specs/_templates/task-integracao.md +72 -0
- package/assets/template/.specs/specs/exemplo/feat-exemplo-primeira-task.md +82 -0
- package/assets/template/.specs/specs/exemplo/meta.json +8 -0
- package/assets/template/.specs/specs/exemplo/overview.md +45 -0
- package/assets/template/.specs/specs/meta.json +4 -0
- package/assets/template/SPECS.md +213 -0
- package/dist/chunk-SOOETS3N.js +3490 -0
- package/dist/chunk-SOOETS3N.js.map +1 -0
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/assets/abnfDiagram-VCTEODGH-DYXtkHNq.js +2 -0
- package/dist/ui/assets/abnfDiagram-VCTEODGH-DYXtkHNq.js.map +1 -0
- package/dist/ui/assets/arc-CJs0gz4E.js +2 -0
- package/dist/ui/assets/arc-CJs0gz4E.js.map +1 -0
- package/dist/ui/assets/architectureDiagram-5GKGNRK7-Br7ZNRfe.js +37 -0
- package/dist/ui/assets/architectureDiagram-5GKGNRK7-Br7ZNRfe.js.map +1 -0
- package/dist/ui/assets/blockDiagram-I7D4REHJ-172V7R5o.js +130 -0
- package/dist/ui/assets/blockDiagram-I7D4REHJ-172V7R5o.js.map +1 -0
- package/dist/ui/assets/c4Diagram-7LVT6UL2-B4AYFhRs.js +39 -0
- package/dist/ui/assets/c4Diagram-7LVT6UL2-B4AYFhRs.js.map +1 -0
- package/dist/ui/assets/channel-BfWO3B41.js +2 -0
- package/dist/ui/assets/channel-BfWO3B41.js.map +1 -0
- package/dist/ui/assets/chunk-2Q5K7J3B-B-u7gtZN.js +2 -0
- package/dist/ui/assets/chunk-2Q5K7J3B-B-u7gtZN.js.map +1 -0
- package/dist/ui/assets/chunk-5VM5RSS4-CjFDq_cq.js +16 -0
- package/dist/ui/assets/chunk-5VM5RSS4-CjFDq_cq.js.map +1 -0
- package/dist/ui/assets/chunk-F27PBJKO-BDYeB7B8.js +2 -0
- package/dist/ui/assets/chunk-F27PBJKO-BDYeB7B8.js.map +1 -0
- package/dist/ui/assets/chunk-IMKFNOWR-y2kXPnac.js +232 -0
- package/dist/ui/assets/chunk-IMKFNOWR-y2kXPnac.js.map +1 -0
- package/dist/ui/assets/chunk-JWPE2WC7-DyCryvDN.js +2 -0
- package/dist/ui/assets/chunk-JWPE2WC7-DyCryvDN.js.map +1 -0
- package/dist/ui/assets/chunk-POPQ4Y6H-DeaxKHvR.js +2 -0
- package/dist/ui/assets/chunk-POPQ4Y6H-DeaxKHvR.js.map +1 -0
- package/dist/ui/assets/chunk-SVP7TREG-CmcZEncL.js +89 -0
- package/dist/ui/assets/chunk-SVP7TREG-CmcZEncL.js.map +1 -0
- package/dist/ui/assets/chunk-TICWLB2K-Df1RRXWR.js +207 -0
- package/dist/ui/assets/chunk-TICWLB2K-Df1RRXWR.js.map +1 -0
- package/dist/ui/assets/chunk-XXDRQBXY-ClTat8Q0.js +2 -0
- package/dist/ui/assets/chunk-XXDRQBXY-ClTat8Q0.js.map +1 -0
- package/dist/ui/assets/classDiagram-ZZMXUADV-YTUiu8rF.js +2 -0
- package/dist/ui/assets/classDiagram-ZZMXUADV-YTUiu8rF.js.map +1 -0
- package/dist/ui/assets/classDiagram-v2-VYDZK3BY-YTUiu8rF.js +2 -0
- package/dist/ui/assets/classDiagram-v2-VYDZK3BY-YTUiu8rF.js.map +1 -0
- package/dist/ui/assets/cose-bilkent-JH36ORCC-QvqQLoy5.js +2 -0
- package/dist/ui/assets/cose-bilkent-JH36ORCC-QvqQLoy5.js.map +1 -0
- package/dist/ui/assets/cynefin-OW5HDTMX-BY6w3pAQ.js +179 -0
- package/dist/ui/assets/cynefin-OW5HDTMX-BY6w3pAQ.js.map +1 -0
- package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-luPP4ha1.js +63 -0
- package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-luPP4ha1.js.map +1 -0
- package/dist/ui/assets/cytoscape.esm-Ix0LnXOy.js +332 -0
- package/dist/ui/assets/cytoscape.esm-Ix0LnXOy.js.map +1 -0
- package/dist/ui/assets/dagre-GXQ25YYZ-DhpPwKqq.js +5 -0
- package/dist/ui/assets/dagre-GXQ25YYZ-DhpPwKqq.js.map +1 -0
- package/dist/ui/assets/defaultLocale-DX6XiGOO.js +2 -0
- package/dist/ui/assets/defaultLocale-DX6XiGOO.js.map +1 -0
- package/dist/ui/assets/diagram-S7CK7UJ4-B9wvQM0w.js +31 -0
- package/dist/ui/assets/diagram-S7CK7UJ4-B9wvQM0w.js.map +1 -0
- package/dist/ui/assets/diagram-UQ7AKVKN-gm1M_iZS.js +42 -0
- package/dist/ui/assets/diagram-UQ7AKVKN-gm1M_iZS.js.map +1 -0
- package/dist/ui/assets/diagram-VSXAHHWV-DkEB6nEx.js +4 -0
- package/dist/ui/assets/diagram-VSXAHHWV-DkEB6nEx.js.map +1 -0
- package/dist/ui/assets/diagram-VX7I27RA-Ce2F1bHi.js +25 -0
- package/dist/ui/assets/diagram-VX7I27RA-Ce2F1bHi.js.map +1 -0
- package/dist/ui/assets/diagram-Z3DM3KII-B5ArCh-E.js +25 -0
- package/dist/ui/assets/diagram-Z3DM3KII-B5ArCh-E.js.map +1 -0
- package/dist/ui/assets/ebnfDiagram-PWID7BFC-DgBM80MD.js +2 -0
- package/dist/ui/assets/ebnfDiagram-PWID7BFC-DgBM80MD.js.map +1 -0
- package/dist/ui/assets/erDiagram-RLTQ6QDP-C161af8G.js +100 -0
- package/dist/ui/assets/erDiagram-RLTQ6QDP-C161af8G.js.map +1 -0
- package/dist/ui/assets/flowDiagram-HODETNUW-B8N_WyW5.js +169 -0
- package/dist/ui/assets/flowDiagram-HODETNUW-B8N_WyW5.js.map +1 -0
- package/dist/ui/assets/ganttDiagram-EL5Y4UJY-CD2RJpTb.js +293 -0
- package/dist/ui/assets/ganttDiagram-EL5Y4UJY-CD2RJpTb.js.map +1 -0
- package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-BrDAzeFT.js +107 -0
- package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-BrDAzeFT.js.map +1 -0
- package/dist/ui/assets/index-CVWRdirI.css +32 -0
- package/dist/ui/assets/index-DoR97Zqf.js +408 -0
- package/dist/ui/assets/index-DoR97Zqf.js.map +1 -0
- package/dist/ui/assets/infoDiagram-27XIBGKW-HYGaMzrA.js +3 -0
- package/dist/ui/assets/infoDiagram-27XIBGKW-HYGaMzrA.js.map +1 -0
- package/dist/ui/assets/init-Gi6I4Gst.js +2 -0
- package/dist/ui/assets/init-Gi6I4Gst.js.map +1 -0
- package/dist/ui/assets/ishikawaDiagram-5VMMS53U-DXTLlBiw.js +71 -0
- package/dist/ui/assets/ishikawaDiagram-5VMMS53U-DXTLlBiw.js.map +1 -0
- package/dist/ui/assets/journeyDiagram-3NMN7TZE-DSJ8QN1S.js +140 -0
- package/dist/ui/assets/journeyDiagram-3NMN7TZE-DSJ8QN1S.js.map +1 -0
- package/dist/ui/assets/kanban-definition-UXKFOSKX-Bm5iz0k3.js +90 -0
- package/dist/ui/assets/kanban-definition-UXKFOSKX-Bm5iz0k3.js.map +1 -0
- package/dist/ui/assets/katex-C5jXJg4s.js +258 -0
- package/dist/ui/assets/katex-C5jXJg4s.js.map +1 -0
- package/dist/ui/assets/layout-DfJgW6eG.js +2 -0
- package/dist/ui/assets/layout-DfJgW6eG.js.map +1 -0
- package/dist/ui/assets/linear-B_kyVotV.js +2 -0
- package/dist/ui/assets/linear-B_kyVotV.js.map +1 -0
- package/dist/ui/assets/mermaid-block-CUJSBQFx.js +2 -0
- package/dist/ui/assets/mermaid-block-CUJSBQFx.js.map +1 -0
- package/dist/ui/assets/mermaid.core-ExHG1WnM.js +313 -0
- package/dist/ui/assets/mermaid.core-ExHG1WnM.js.map +1 -0
- package/dist/ui/assets/mindmap-definition-YA3MSWOX-B1Hh9dQz.js +97 -0
- package/dist/ui/assets/mindmap-definition-YA3MSWOX-B1Hh9dQz.js.map +1 -0
- package/dist/ui/assets/ordinal-Cboi1Yqb.js +2 -0
- package/dist/ui/assets/ordinal-Cboi1Yqb.js.map +1 -0
- package/dist/ui/assets/pegDiagram-XKGWAZYB-x242yOd7.js +2 -0
- package/dist/ui/assets/pegDiagram-XKGWAZYB-x242yOd7.js.map +1 -0
- package/dist/ui/assets/pieDiagram-E7YTZNPT-Dl-YP7Xs.js +40 -0
- package/dist/ui/assets/pieDiagram-E7YTZNPT-Dl-YP7Xs.js.map +1 -0
- package/dist/ui/assets/quadrantDiagram-AXDQQJYC-CMJ920V9.js +8 -0
- package/dist/ui/assets/quadrantDiagram-AXDQQJYC-CMJ920V9.js.map +1 -0
- package/dist/ui/assets/railroadDiagram-O6MQD6OU-1kV83y5t.js +2 -0
- package/dist/ui/assets/railroadDiagram-O6MQD6OU-1kV83y5t.js.map +1 -0
- package/dist/ui/assets/requirementDiagram-BXWQKSXE-BFd8ZZD3.js +85 -0
- package/dist/ui/assets/requirementDiagram-BXWQKSXE-BFd8ZZD3.js.map +1 -0
- package/dist/ui/assets/sankeyDiagram-P5KCCOFB-C0LZevnf.js +41 -0
- package/dist/ui/assets/sankeyDiagram-P5KCCOFB-C0LZevnf.js.map +1 -0
- package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-BasIXLJ0.js +163 -0
- package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-BasIXLJ0.js.map +1 -0
- package/dist/ui/assets/sizeCapture-INFHLROL-qAtnqB7N.js +2 -0
- package/dist/ui/assets/sizeCapture-INFHLROL-qAtnqB7N.js.map +1 -0
- package/dist/ui/assets/stateDiagram-D77RDMKH-CllWDWZP.js +2 -0
- package/dist/ui/assets/stateDiagram-D77RDMKH-CllWDWZP.js.map +1 -0
- package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-Dwntf8Tk.js +2 -0
- package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-Dwntf8Tk.js.map +1 -0
- package/dist/ui/assets/swimlanes-42K2YHIH-Bgt0KslH.js +2 -0
- package/dist/ui/assets/swimlanes-42K2YHIH-Bgt0KslH.js.map +1 -0
- package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-C9abicdw.js +9 -0
- package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-C9abicdw.js.map +1 -0
- package/dist/ui/assets/timeline-definition-24CTP7MA-BYO2h9Qr.js +121 -0
- package/dist/ui/assets/timeline-definition-24CTP7MA-BYO2h9Qr.js.map +1 -0
- package/dist/ui/assets/vennDiagram-4TSXK5OY-ZzyiwIUi.js +35 -0
- package/dist/ui/assets/vennDiagram-4TSXK5OY-ZzyiwIUi.js.map +1 -0
- package/dist/ui/assets/wardleyDiagram-VM6X3IG4-DfjKCK0N.js +79 -0
- package/dist/ui/assets/wardleyDiagram-VM6X3IG4-DfjKCK0N.js.map +1 -0
- package/dist/ui/assets/xychartDiagram-S5SC5T6Z-Z7daOfmM.js +8 -0
- package/dist/ui/assets/xychartDiagram-S5SC5T6Z-Z7daOfmM.js.map +1 -0
- package/dist/ui/favicon.svg +6 -0
- package/dist/ui/index.html +21 -0
- package/package.json +70 -0
- package/scripts/copy-ui.mjs +21 -0
- package/scripts/fix-node-pty-perms.cjs +73 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: drawing-writing
|
|
3
|
+
description: Como escrever e manter os desenhos de `.specs/drawings/` — os cinco tipos (architecture, flow, sequence, data, state), o frontmatter, a regra de "só o diagrama, sem prosa", e a atualização do `meta.json`. Carregue ao criar ou alterar qualquer arquivo em `.specs/drawings/`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Escrita de desenhos
|
|
7
|
+
|
|
8
|
+
Desenhos são a memória visual do projeto: arquitetura, fluxos, sequências, modelo de dados,
|
|
9
|
+
máquinas de estado. Moram em `.specs/drawings/<slug>.md`, **sem subpastas**.
|
|
10
|
+
|
|
11
|
+
A página de um desenho na Specs Platform **é o diagrama**: o canvas ocupa a tela inteira, com
|
|
12
|
+
arrasto e zoom, sem índice e sem corpo de markdown. Nada que você escrever fora do bloco
|
|
13
|
+
```mermaid aparece para o leitor — só no editor.
|
|
14
|
+
|
|
15
|
+
A sintaxe Mermaid — escolha do tipo de diagrama, layout, paleta, `classDef`, armadilhas de render
|
|
16
|
+
— está na skill `mermaid-diagramming`. Carregue as duas.
|
|
17
|
+
|
|
18
|
+
Um desenho **não altera código de produção**. O output é um `.md` + a entrada no `meta.json`.
|
|
19
|
+
|
|
20
|
+
## A regra que manda em tudo: só o diagrama
|
|
21
|
+
|
|
22
|
+
O arquivo é **frontmatter + um bloco ```mermaid**. Mais nada.
|
|
23
|
+
|
|
24
|
+
- **Sem `## Visão geral`, sem `## Notas`, sem `## Fontes`, sem parágrafo de introdução.** A página
|
|
25
|
+
não renderiza nada disso.
|
|
26
|
+
- **Sem `# Título`** — o título vem do frontmatter e aparece na topbar.
|
|
27
|
+
- **A legenda vai dentro do diagrama**, como um nó (veja `mermaid-diagramming`). Uma linha de
|
|
28
|
+
citação abaixo do bloco não seria exibida.
|
|
29
|
+
- **Tudo que você precisaria explicar em prosa vira rótulo.** Se o desenho só faz sentido com um
|
|
30
|
+
parágrafo ao lado, o problema é o desenho: nomeie melhor os nós, rotule as arestas, corte o que
|
|
31
|
+
não pertence ao recorte.
|
|
32
|
+
- Contexto, trade-offs e "por quês" que não cabem num rótulo **não pertencem a um desenho** —
|
|
33
|
+
pertencem a uma discovery (`.specs/discoveries/`) ou à spec da task. Linke o desenho de lá.
|
|
34
|
+
|
|
35
|
+
Mais de um bloco ```mermaid no mesmo arquivo é permitido, e a página mostra uma faixa de abas —
|
|
36
|
+
use só quando forem **zooms diferentes da mesma pergunta** (panorama + detalhe). Perguntas
|
|
37
|
+
diferentes viram desenhos diferentes.
|
|
38
|
+
|
|
39
|
+
## Os cinco tipos
|
|
40
|
+
|
|
41
|
+
O `type` do frontmatter é a **pergunta que o desenho responde**, não o tipo de diagrama Mermaid
|
|
42
|
+
(um `architecture` costuma ser um `flowchart`).
|
|
43
|
+
|
|
44
|
+
| Tipo | Responde | Diagrama típico |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `architecture` | Que peças existem e como se conectam? | `flowchart` com subgraphs |
|
|
47
|
+
| `flow` | Que caminho um pedido/dado percorre, com que desvios? | `flowchart` com decisões |
|
|
48
|
+
| `sequence` | Em que ordem, e quem espera por quem? | `sequenceDiagram` |
|
|
49
|
+
| `data` | Como os dados se relacionam? | `erDiagram` / `classDiagram` |
|
|
50
|
+
| `state` | Em que estados uma entidade vive e o que a move? | `stateDiagram-v2` |
|
|
51
|
+
|
|
52
|
+
Se o usuário não indicar o tipo, infira do pedido. Só pergunte quando genuinamente ambíguo.
|
|
53
|
+
**Não invente tipos novos** — a UI só conhece esses cinco e cai em `architecture` no resto.
|
|
54
|
+
|
|
55
|
+
## Nome do arquivo
|
|
56
|
+
|
|
57
|
+
`kebab-case`, começando com letra minúscula, descrevendo o **assunto**, não o formato:
|
|
58
|
+
`fan-out-sns-sqs`, `ciclo-vida-notificacao`, `retry-e-dlq`, `modelo-notifications`.
|
|
59
|
+
|
|
60
|
+
Não prefixe com o tipo (`arch-`, `seq-`): o badge da sidebar já mostra isso.
|
|
61
|
+
|
|
62
|
+
Se o slug já existir, **pergunte** se é para sobrescrever ou criar com sufixo.
|
|
63
|
+
|
|
64
|
+
## O arquivo, inteiro
|
|
65
|
+
|
|
66
|
+
````markdown
|
|
67
|
+
---
|
|
68
|
+
title: "Fan-out do SNS domain-events"
|
|
69
|
+
type: architecture
|
|
70
|
+
date: 2026-09-01
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
```mermaid
|
|
74
|
+
flowchart TB
|
|
75
|
+
...
|
|
76
|
+
```
|
|
77
|
+
````
|
|
78
|
+
|
|
79
|
+
`date` é a data de criação, ISO, sem hora. Não a atualize a cada edição — ela diz quando o desenho
|
|
80
|
+
nasceu, e a sidebar a usa como referência de idade.
|
|
81
|
+
|
|
82
|
+
## `meta.json`
|
|
83
|
+
|
|
84
|
+
Depois de gravar o arquivo:
|
|
85
|
+
|
|
86
|
+
1. Leia `.specs/drawings/meta.json`; se não existir, crie com
|
|
87
|
+
`{ "title": "Desenhos", "pages": [] }`.
|
|
88
|
+
2. Acrescente o slug (sem `.md`) ao fim de `pages` — **sem duplicar** se já estiver lá.
|
|
89
|
+
|
|
90
|
+
A ordem de `pages` é a ordem da sidebar, e o usuário pode reordenar arrastando. Ao acrescentar um
|
|
91
|
+
desenho novo, sempre no fim: reordenar é decisão dele.
|
|
92
|
+
|
|
93
|
+
## Alterando um desenho existente
|
|
94
|
+
|
|
95
|
+
1. Leia o arquivo inteiro antes de mexer.
|
|
96
|
+
2. Preserve o que não foi pedido — título, tipo, `date`, os `classDef`, os outros diagramas.
|
|
97
|
+
3. Se a mudança acrescenta uma cor ou um tipo de seta, **atualize o nó de legenda** junto.
|
|
98
|
+
4. Se a mudança troca o `type`, o slug provavelmente também deveria mudar — pergunte.
|
|
99
|
+
5. Se o pedido é "explica isso aqui", não acrescente prosa ao arquivo: melhore os rótulos, ou
|
|
100
|
+
proponha uma discovery.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: execution-protocol
|
|
3
|
+
description: Protocolo de execução comum aos agentes que escrevem código — princípios invioláveis (nada de commit sem aprovação, nada de ação destrutiva, escopo fechado), blast radius, verificação do repositório antes de começar, o ciclo halt → ajustar → complete e o formato do relatório de code review. Carregue no início de qualquer execução que produza código.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Protocolo de execução
|
|
7
|
+
|
|
8
|
+
Vale para `feature-runner` e `refinement-runner`. Eles diferem no que leem antes de implementar;
|
|
9
|
+
daqui para frente, o comportamento é o mesmo.
|
|
10
|
+
|
|
11
|
+
## Princípios invioláveis
|
|
12
|
+
|
|
13
|
+
1. **Nunca commite, dê push ou merge sem aprovação explícita no chat.** A execução padrão termina
|
|
14
|
+
**antes** do commit, com o relatório de halt.
|
|
15
|
+
2. **Nunca use ação destrutiva como atalho.** Proibidos: `git reset --hard`, `push --force`,
|
|
16
|
+
`--no-verify`, `--amend`, `git add -A`, `git add .`, `git clean -f`, `git checkout .`,
|
|
17
|
+
`git stash` como forma de "guardar" trabalho. Deu errado? investigue a causa e reporte.
|
|
18
|
+
3. **Blast radius.** Aprovação de spec ou de escopo autoriza **implementação local** e nada mais.
|
|
19
|
+
O commit e o push só acontecem após um **"Complete"** explícito, e ele é pedido uma vez só, no
|
|
20
|
+
fim de tudo — "Prosseguir" entre tasks **não** autoriza git. Não autoriza force-push, deploy, migration
|
|
21
|
+
em produção, alteração de infra externa nem nada visível fora do repositório — cada uma dessas
|
|
22
|
+
exige go-ahead explícito **para aquela ação**, mesmo com a execução já aprovada.
|
|
23
|
+
4. **Não expanda escopo.** Apareceu algo fora do que foi fechado? vira **ponto de atenção** no
|
|
24
|
+
relatório, não código. A heurística: *"isso está na definição da minha task?"* Se não, não toque.
|
|
25
|
+
5. **Nunca invente convenção, ferramenta ou biblioteca nova** sem aprovação. Use o que o monorepo
|
|
26
|
+
já tem.
|
|
27
|
+
6. **Respeite as restrições de leitura** dos arquivos de design: o `project.md` indica quais são
|
|
28
|
+
encriptados e só podem ser lidos pela tool do MCP, nunca por `Read`/`Grep`.
|
|
29
|
+
7. **Nunca crie arquivo `.md` novo** a menos que a atividade peça documentação.
|
|
30
|
+
8. **Pergunte diante de ambiguidade real** de escopo, design, contrato de API ou biblioteca —
|
|
31
|
+
pergunta estruturada (`AskUserQuestion` / `AskQuestion`) com 2–4 opções concretas. Nunca
|
|
32
|
+
pergunte "posso prosseguir?"; prossiga quando o caminho estiver claro.
|
|
33
|
+
9. **Opere com paths absolutos** e **responda em português brasileiro**.
|
|
34
|
+
|
|
35
|
+
## Verificar o repositório (antes de tocar em código)
|
|
36
|
+
|
|
37
|
+
1. `git status --porcelain` — working tree sujo ⇒ **pare e pergunte** (pode ser trabalho do usuário).
|
|
38
|
+
2. `git rev-parse --abbrev-ref HEAD` — deve ser `master`; se não for, `git checkout master`.
|
|
39
|
+
3. `git pull --ff-only origin master`.
|
|
40
|
+
4. Falhou (não fast-forward, conflito, sem rede) ⇒ **pare e reporte**. Nunca recupere com ação
|
|
41
|
+
destrutiva.
|
|
42
|
+
|
|
43
|
+
Todo o trabalho é feito direto na `master`. Não crie branches.
|
|
44
|
+
|
|
45
|
+
**Deduza o tipo do commit já aqui:** `feat` (mais comum), `fix`, `refactor`, `chore`, `docs`,
|
|
46
|
+
`test`, `infra`. Ambíguo ⇒ pergunte agora, não no fim.
|
|
47
|
+
|
|
48
|
+
## Convenções de código
|
|
49
|
+
|
|
50
|
+
- **Formatação e tipagem** conforme a seção *Convenções de código* de
|
|
51
|
+
[`.agents/project.md`](../../project.md).
|
|
52
|
+
- **Reusar antes de criar:** utilitários, tipos, componentes, hooks. Procure com `Grep`/`Glob` nos
|
|
53
|
+
diretórios de reuso que o `project.md` lista, antes de escrever qualquer coisa nova.
|
|
54
|
+
- **Idioma do código e do conteúdo** conforme a seção *Identidade* do `project.md` (arquivo, classe,
|
|
55
|
+
função, variável, comentário, rota, coluna seguem o idioma do código; texto de usuário final e
|
|
56
|
+
documentação seguem o idioma do conteúdo).
|
|
57
|
+
- **Comentário só como JSDoc curto** acima de classe/função/interface/tipo exportado. Nada de
|
|
58
|
+
comentário inline narrando passo a passo, banner de seção, JSDoc em constante ou nota de decisão
|
|
59
|
+
(isso vive na spec). Ao editar, remova esse tipo de comentário na região tocada. Exceções:
|
|
60
|
+
`TODO:`/`FIXME:` com contexto real e supressões justificadas.
|
|
61
|
+
- Use as tools dedicadas de leitura/edição (`Read`, `Edit`/`StrReplace`, `Write`, `Glob`, `Grep`).
|
|
62
|
+
Terminal (`Bash`/`Shell`) só para git, gerenciador de pacotes e checagens — nunca `cat`/`grep`/`sed`.
|
|
63
|
+
|
|
64
|
+
## Gate por task
|
|
65
|
+
|
|
66
|
+
Toda task que produz código testável roda o gate do pacote tocado **antes** de ser dada como
|
|
67
|
+
pronta. Os níveis, os comandos reais e a matriz de cobertura estão na skill **`test-strategy`** —
|
|
68
|
+
carregue-a. Em resumo: rode o gate do pacote tocado (comando no `project.md`), saída ≠ 0 é bloqueio, e a contagem
|
|
69
|
+
de testes não pode cair sem justificativa.
|
|
70
|
+
|
|
71
|
+
## Verificação antes do halt
|
|
72
|
+
|
|
73
|
+
Entrega com código testável passa pela skill **`verification`** antes do relatório: um sub-agente
|
|
74
|
+
novo re-deriva a cobertura com evidence-or-zero e roda o sensor de discriminação. O bloco que ele
|
|
75
|
+
devolve entra no relatório como seção própria — é o que o code review humano lê no lugar de prosa.
|
|
76
|
+
|
|
77
|
+
## O ciclo halt → ajustar → complete
|
|
78
|
+
|
|
79
|
+
**O git roda uma vez só, no Complete final.** Não existe commit automático nem commit
|
|
80
|
+
intermediário — em nenhum modo. Entre tasks de uma feature o usuário diz "Prosseguir", e isso não
|
|
81
|
+
toca no git: a task fecha com `status: completed` e o código no working tree.
|
|
82
|
+
|
|
83
|
+
As três entradas possíveis:
|
|
84
|
+
|
|
85
|
+
| Entrada | O que faz |
|
|
86
|
+
|---|---|
|
|
87
|
+
| **"Prosseguir"** | aprova a task atual e avança para a próxima. **Nenhum git.** Só aparece quando ainda há task pendente |
|
|
88
|
+
| **"Ajustar: ..."** | itera na entrega atual e repete o halt, sem commitar |
|
|
89
|
+
| **"Complete"** | **único** ponto em que o git roda: stage, commit e push. Só é oferecido no halt final |
|
|
90
|
+
|
|
91
|
+
Detalhes nas referências:
|
|
92
|
+
|
|
93
|
+
- [Relatório de halt](references/relatorio-halt.md) — o formato, os dois tipos de halt
|
|
94
|
+
(intermediário e final) e o que acrescentar quando a task é visual ou não tem input externo.
|
|
95
|
+
- [Git: stage, commit e push](references/git.md) — o procedimento do Complete e quando ele roda em
|
|
96
|
+
cada modo.
|
|
97
|
+
|
|
98
|
+
**Entrada "Ajustar: ..."** ⇒ confirme a branch, aplique **apenas** o solicitado (não expanda
|
|
99
|
+
escopo), e volte ao halt com o relatório atualizado. Se o ajuste trouxer ambiguidade nova,
|
|
100
|
+
**pergunte antes de implementar**.
|
|
101
|
+
|
|
102
|
+
**"Esquece" / "abortar" / "cancela"** ⇒ pare imediatamente e pergunte se deve reverter o working
|
|
103
|
+
tree. **Não reverta por conta própria.**
|
|
104
|
+
|
|
105
|
+
## Pausa de sessão
|
|
106
|
+
|
|
107
|
+
Trabalho interrompido no meio (o usuário encerra, o contexto acaba, aparece bloqueio externo):
|
|
108
|
+
antes de sair, substitua **apenas** a seção `## Handoff` de `.specs/STATE.md` pelo snapshot atual.
|
|
109
|
+
O formato e a regra de escrita section-scoped estão no próprio arquivo. **Não toque na seção
|
|
110
|
+
`## Decisions`** — sobrescrever o arquivo inteiro apaga o log de decisões em silêncio.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Git: stage, commit e push
|
|
2
|
+
|
|
3
|
+
Entrada: o usuário respondeu **"Complete"**. Só com aprovação explícita. **Nunca antecipe.**
|
|
4
|
+
|
|
5
|
+
> **O git roda uma vez só, no Complete final.** Não existe commit automático, não existe commit
|
|
6
|
+
> intermediário, não existe commit local "de checkpoint". Em qualquer modo — task avulsa, feature
|
|
7
|
+
> com pausa ou feature sem pausa — nada é commitado enquanto o usuário não disser "Complete" no fim
|
|
8
|
+
> de tudo. Entre tasks o usuário diz **"Prosseguir"**, e isso **não toca no git**.
|
|
9
|
+
|
|
10
|
+
## Procedimento
|
|
11
|
+
|
|
12
|
+
1. `git rev-parse --abbrev-ref HEAD` (deve ser `master`) e `git pull --ff-only origin master`.
|
|
13
|
+
Falhou ⇒ pare e reporte.
|
|
14
|
+
|
|
15
|
+
2. **Atualize o status da task** no frontmatter: `in-progress` → `completed`.
|
|
16
|
+
(O `refinement-runner` não tem arquivo de task — pule este passo e o seguinte.)
|
|
17
|
+
|
|
18
|
+
3. **Registre a execução** no fim do arquivo da task, no formato da skill `spec-writing` (seção
|
|
19
|
+
`## Execuções`, entrada nova no topo, dentro de um `<details>`). Data via
|
|
20
|
+
`date '+%d/%m/%Y %H:%M'`; tipo = o `<type>` do commit em maiúsculo. Máximo 8 bullets,
|
|
21
|
+
específicos ("Criado `.../health-routes.ts` com rota `GET /health`", não "adicionada rota").
|
|
22
|
+
|
|
23
|
+
4. **Recalcule o status agregado da feature** lendo o frontmatter de todas as tasks de
|
|
24
|
+
`meta.json.pages`: `completed` se todas; `in-progress` se houver mistura ou alguma em
|
|
25
|
+
andamento; `pending` se todas pendentes. **Não invente** campo `status` no `meta.json` — o
|
|
26
|
+
agregado só aparece na mensagem de commit.
|
|
27
|
+
|
|
28
|
+
5. **Stage por nome explícito** — nunca `git add -A` nem `git add .`:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
git add -- <arquivo1> <arquivo2> <task.md>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Confira com `git status` que **só** o esperado está staged.
|
|
35
|
+
|
|
36
|
+
6. **Valide a mensagem antes de commitar:**
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
node .agents/scripts/check-commit.mjs --message "<type>(<feature-slug>): <título da task>"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Saída ≠ 0 ⇒ corrija o formato antes de seguir.
|
|
43
|
+
|
|
44
|
+
7. **Commit com HEREDOC:**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
git commit -m "$(cat <<'EOF'
|
|
48
|
+
<type>(<feature-slug>): <título da task>
|
|
49
|
+
|
|
50
|
+
Refs: .specs/specs/<slug>/feat-<slug>-<task>.md
|
|
51
|
+
Task status: in-progress -> completed
|
|
52
|
+
Feature status: <pending|in-progress|completed>
|
|
53
|
+
|
|
54
|
+
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
|
55
|
+
EOF
|
|
56
|
+
)"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Hook de pre-commit falhou ⇒ **corrija e faça um commit novo**. Nunca `--amend` nem
|
|
60
|
+
`--no-verify`. Unidades lógicas claramente separáveis podem virar commits separados
|
|
61
|
+
referenciando a mesma task.
|
|
62
|
+
|
|
63
|
+
8. **Push — condicional ao modo** (ver abaixo). Falhou ⇒ pare e reporte. Nunca `--force`.
|
|
64
|
+
|
|
65
|
+
9. **Reporte:**
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
## Complete
|
|
69
|
+
|
|
70
|
+
**Branch:** `master` (commit direto)
|
|
71
|
+
**Commit(s):** <hash curto> — <título da task>
|
|
72
|
+
**Push:** origin/master @ <hash curto>
|
|
73
|
+
**Status final da task:** completed
|
|
74
|
+
**Status agregado da feature:** <pending|in-progress|completed>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Quando este procedimento roda
|
|
78
|
+
|
|
79
|
+
| Modo | Entre tasks | Git |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| **Task avulsa** | — | no Complete, ao fim da task |
|
|
82
|
+
| **Feature com pausa** (padrão) | halt de review a cada task; usuário diz **"Prosseguir"** | **uma vez só**, no Complete depois da última task |
|
|
83
|
+
| **Feature sem pausa** | nenhum halt; avança sozinho | **uma vez só**, no Complete depois da última task |
|
|
84
|
+
|
|
85
|
+
Nos dois modos de feature, cada task intermediária termina com `status: completed` no frontmatter,
|
|
86
|
+
o registro em Execuções e o código no **working tree** — e nada mais. O commit cobre a feature
|
|
87
|
+
inteira.
|
|
88
|
+
|
|
89
|
+
> **Por que um commit só.** O revisor avalia a feature de uma vez. Commit intermediário congela
|
|
90
|
+
> decisão que ainda pode mudar no review e obriga commit de correção em cima. E um working tree
|
|
91
|
+
> limpo de commits parciais é trivial de descartar se a feature inteira for rejeitada.
|
|
92
|
+
|
|
93
|
+
Unidades lógicas claramente separáveis podem virar **commits separados no mesmo Complete** — isso é
|
|
94
|
+
organização do diff final, não checkpoint intermediário.
|
|
95
|
+
|
|
96
|
+
Vale sempre: **nenhum commit e nenhum push sem "Complete" explícito no chat.**
|
|
97
|
+
|
|
98
|
+
## Depois do Complete
|
|
99
|
+
|
|
100
|
+
Reporte e encerre. Não há próxima task a executar: o Complete só acontece quando todas já estão
|
|
101
|
+
`completed` no working tree.
|
|
102
|
+
|
|
103
|
+
Se por algum motivo restar task `pending` em `pages` (o usuário pediu Complete antes do fim),
|
|
104
|
+
**avise explicitamente** quais ficaram de fora e confirme que é intencional antes de commitar.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Relatório de halt
|
|
2
|
+
|
|
3
|
+
Você **termina seu turno** aqui. Nada de `git commit`, `push`, `merge` ou `stash`.
|
|
4
|
+
|
|
5
|
+
O relatório é a pauta do code review — mantenha-o enxuto e específico. Lidere com o que importa,
|
|
6
|
+
sem parágrafo de aquecimento.
|
|
7
|
+
|
|
8
|
+
## Formato
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
## Tarefa pronta para code review
|
|
12
|
+
|
|
13
|
+
**Feature:** <título> (`.specs/specs/<slug>/`)
|
|
14
|
+
**Task:** <título> (`.specs/specs/<slug>/feat-<slug>-<task>.md`)
|
|
15
|
+
**Branch:** `master`
|
|
16
|
+
**Status atualizado:** pending → in-progress (working tree, sem commit)
|
|
17
|
+
|
|
18
|
+
### Resumo do que foi feito
|
|
19
|
+
- <bullet>
|
|
20
|
+
|
|
21
|
+
### Arquivos modificados
|
|
22
|
+
- `caminho/arquivo.ts`
|
|
23
|
+
- `.specs/specs/<slug>/feat-<slug>-<task>.md` (status)
|
|
24
|
+
|
|
25
|
+
### Gate
|
|
26
|
+
- **Comando:** o gate do pacote tocado (ver `project.md`)
|
|
27
|
+
- **Resultado:** <X passou, 0 falhou> · contagem antes <A> → depois <B>
|
|
28
|
+
|
|
29
|
+
### Verificação independente
|
|
30
|
+
<bloco devolvido pelo Verifier — ver skill `verification`. Sem código testável na entrega,
|
|
31
|
+
escreva: "N/A — a entrega não produz código com teste automatizado.">
|
|
32
|
+
|
|
33
|
+
### Decisões tomadas durante a execução
|
|
34
|
+
- <decisão e motivo, ou "nenhuma decisão não trivial">
|
|
35
|
+
|
|
36
|
+
### Pontos para você revisar com atenção
|
|
37
|
+
- <ponto>
|
|
38
|
+
|
|
39
|
+
### Como revisar
|
|
40
|
+
Abra a task na Specs Platform e clique em **Revisar** (ou vá direto em
|
|
41
|
+
`http://localhost:4321/features/<slug>/<task>/review`): a tela lista os arquivos alterados
|
|
42
|
+
agrupados por natureza, com o diff de cada um e um botão para abrir o arquivo no editor.
|
|
43
|
+
|
|
44
|
+
### Próximos passos
|
|
45
|
+
<ver "Os dois tipos de halt" abaixo — o bloco muda conforme restem ou não tasks pendentes>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Os dois tipos de halt
|
|
49
|
+
|
|
50
|
+
O relatório é o mesmo; o que muda é o bloco final, porque **só o halt final autoriza git**.
|
|
51
|
+
|
|
52
|
+
**Halt intermediário** — feature com pausa, ainda há task pendente em `pages`:
|
|
53
|
+
|
|
54
|
+
```markdown
|
|
55
|
+
### Próximos passos
|
|
56
|
+
- **"Prosseguir"** — sigo para a próxima task (`<título da próxima>`). **Nada é commitado**: o
|
|
57
|
+
código fica no working tree e o git só roda no Complete final.
|
|
58
|
+
- **"Ajustar: <descrição>"** — itero nesta task e repito o halt.
|
|
59
|
+
|
|
60
|
+
**Progresso da feature:** <N> de <T> tasks concluídas (working tree, sem commit).
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Halt final** — task avulsa, ou última task da feature:
|
|
64
|
+
|
|
65
|
+
```markdown
|
|
66
|
+
### Próximos passos
|
|
67
|
+
- **"Complete"** — commito na `master`, faço push e encerro. Este é o único ponto em que o git
|
|
68
|
+
roda.
|
|
69
|
+
- **"Ajustar: <descrição>"** — itero e repito o halt sem commitar.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Nunca ofereça "Complete" num halt intermediário. Oferecer commit no meio da feature convida
|
|
73
|
+
exatamente o commit parcial que o fluxo existe para evitar.
|
|
74
|
+
|
|
75
|
+
## Seções condicionais
|
|
76
|
+
|
|
77
|
+
**Task visual** — acrescente: validação contra
|
|
78
|
+
protótipo, testes E2E, matriz de estados cobertos, animações, acessibilidade e divergências do
|
|
79
|
+
refinamento.
|
|
80
|
+
|
|
81
|
+
**Task sem input externo** — inclua a linha: *"Segurança de inputs: N/A — a task não processa
|
|
82
|
+
inputs externos."* A declaração é explícita; omitir a seção em
|
|
83
|
+
silêncio não vale.
|
|
84
|
+
|
|
85
|
+
**Premissas assumidas** — se você fechou alguma ambiguidade por conta própria (ver
|
|
86
|
+
`requirements-closure`), liste-as com o default escolhido e o racional. O revisor precisa poder
|
|
87
|
+
discordar de uma premissa antes que ela vire código consolidado.
|
|
88
|
+
|
|
89
|
+
**Refinement-runner** — deixe explícito que **nenhum arquivo em `.specs/specs/` foi criado ou
|
|
90
|
+
alterado**, e inclua o escopo consolidado (o que entra, o que não entra, critérios de aceite) que
|
|
91
|
+
substitui o documento de spec.
|
|
92
|
+
|
|
93
|
+
## O diff a revisar
|
|
94
|
+
|
|
95
|
+
Em qualquer modo de feature, o diff é **todo o working tree** — não há commit parcial para separar
|
|
96
|
+
as tasks.
|
|
97
|
+
|
|
98
|
+
**Feature sem pausa:** o halt acontece uma vez só, ao fim da última task, e o relatório traz uma
|
|
99
|
+
seção por task executada.
|
|
100
|
+
|
|
101
|
+
**Feature com pausa:** cada halt intermediário cobre **só a task recém-concluída** (é isso que
|
|
102
|
+
torna a revisão gerenciável), e o halt final resume as tasks anteriores em uma linha cada, detalha
|
|
103
|
+
a última e aponta o diff acumulado para a revisão de conjunto.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feature-runner
|
|
3
|
+
description: Executa tarefas documentadas em `.specs/specs/` — localiza a task, carrega contexto, confronta a spec com o código atual, implementa, roda o gate, dispara a verificação independente e PARA antes de commitar para code review humano. Entre tasks reentra em "Prosseguir"; commita e faz push apenas no "Complete" final; "Ajustar: ..." itera sem commitar. Carregue ao executar, implementar, rodar ou tocar uma feature ou task do projeto.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# feature-runner
|
|
7
|
+
|
|
8
|
+
Executa tarefas documentadas em `.specs/specs/`. A stack, os comandos e as convenções do projeto
|
|
9
|
+
estão em [`.agents/project.md`](../../project.md) — leia-o junto com a `execution-protocol`.
|
|
10
|
+
|
|
11
|
+
O ciclo: **localizar → contextualizar → confrontar → implementar → verificar → halt para code
|
|
12
|
+
review → complete**.
|
|
13
|
+
|
|
14
|
+
Equivalências de tools Claude Code ↔ Cursor: `.agents/RUNTIME.md`.
|
|
15
|
+
|
|
16
|
+
## Ponto de partida obrigatório
|
|
17
|
+
|
|
18
|
+
**Carregue a skill `execution-protocol` antes de qualquer coisa.** Ela detém os princípios
|
|
19
|
+
invioláveis (nada de commit sem aprovação, nada de ação destrutiva, escopo fechado, blast radius),
|
|
20
|
+
a verificação do repositório, as convenções de código e todo o ciclo halt → ajustar → complete.
|
|
21
|
+
Esta skill aqui só cobre o que é específico de executar uma spec.
|
|
22
|
+
|
|
23
|
+
## Skills por camada
|
|
24
|
+
|
|
25
|
+
| Carregue | Quando |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `execution-protocol` | **sempre**, antes de tudo |
|
|
28
|
+
| `spec-writing` | **sempre** — você lê a task, atualiza `status` e escreve o registro de Execuções no formato dela |
|
|
29
|
+
| `test-strategy` | a entrega produz código testável — define o gate que fecha cada task |
|
|
30
|
+
| `verification` | a entrega produz código com teste automatizado — o Verifier roda antes do halt |
|
|
31
|
+
| `input-security` | o código toca input do usuário (formulário, body, query/path param, cookie, header, upload, webhook) (opcional — só se o projeto adotar essa skill) |
|
|
32
|
+
| `ui-standards` | a task cria ou altera tela/componente (opcional — só se o projeto adotar essa skill) |
|
|
33
|
+
| `prototype-check` | a task tem entregável visual — consulta obrigatória ao protótipo antes de implementar |
|
|
34
|
+
|
|
35
|
+
Task de backend puro: `execution-protocol` + `spec-writing` + `test-strategy` + `verification` +
|
|
36
|
+
`input-security`. As convenções de arquitetura de cada app estão nos respectivos `CLAUDE.md`.
|
|
37
|
+
|
|
38
|
+
## Fluxo
|
|
39
|
+
|
|
40
|
+
Ponto de entrada pelo contexto: pedido de execução ⇒ **1**; **"Prosseguir"** ⇒ volta ao **3** com a
|
|
41
|
+
próxima task; **"Ajustar: ..."** ⇒ ciclo de ajuste do `execution-protocol`; **"Complete"** ⇒ **7**.
|
|
42
|
+
|
|
43
|
+
1. **Localizar a task e carregar contexto** → [localizar.md](references/localizar.md)
|
|
44
|
+
2. **Verificar o repositório** → `execution-protocol`
|
|
45
|
+
3. **Confrontar a spec com o código atual** → [divergencias.md](references/divergencias.md)
|
|
46
|
+
4. **Marcar `in-progress` e implementar** → [implementar.md](references/implementar.md)
|
|
47
|
+
5. **Gate + verificação independente** → skills `test-strategy` e `verification`
|
|
48
|
+
6. **Halt** → [relatorio-halt.md](../execution-protocol/references/relatorio-halt.md)
|
|
49
|
+
— intermediário (resta task pendente) oferece "Prosseguir"; final oferece "Complete"
|
|
50
|
+
7. **Complete, só no fim de tudo** → [git.md](../execution-protocol/references/git.md)
|
|
51
|
+
|
|
52
|
+
Leia cada referência **por completo** no momento em que a fase começa — não antecipe todas.
|
|
53
|
+
|
|
54
|
+
## Modo feature
|
|
55
|
+
|
|
56
|
+
Quando o pedido é a feature inteira, execute as tasks na ordem de `meta.json.pages`, pulando as
|
|
57
|
+
`completed`. Só pare quando todas estiverem `completed` ou o usuário abortar.
|
|
58
|
+
|
|
59
|
+
**Por padrão há pausa de review a cada task:** você entrega o relatório de halt daquela task e
|
|
60
|
+
aguarda **"Prosseguir"** (avança para a próxima) ou **"Ajustar: ..."** (itera nesta). O usuário
|
|
61
|
+
pode dispensar a pausa, e aí você encadeia as tasks sozinho até a última.
|
|
62
|
+
|
|
63
|
+
**Em nenhum dos dois o git roda no meio.** Cada task intermediária fecha com `status: completed` no
|
|
64
|
+
frontmatter, o registro em Execuções e o código no **working tree**. O commit e o push acontecem
|
|
65
|
+
**uma vez só**, no "Complete" depois da última task. A pausa muda quanto você revisa pelo caminho,
|
|
66
|
+
nunca quanto é commitado.
|
|
67
|
+
|
|
68
|
+
Não ofereça "Complete" enquanto restar task pendente — ver
|
|
69
|
+
[relatorio-halt.md](../execution-protocol/references/relatorio-halt.md).
|
|
70
|
+
|
|
71
|
+
## Specs Platform
|
|
72
|
+
|
|
73
|
+
As docs são renderizadas pela Specs Platform (`@mir-code/specs-platform`) — `specs start` na raiz
|
|
74
|
+
sobe a plataforma localmente. O botão "Rodar Tarefa" da UI dispara esta skill em um terminal novo, conforme
|
|
75
|
+
`.specs/config.json`. Problema operacional da plataforma (não sobe, porta ocupada, botão não
|
|
76
|
+
dispara): consulte o **Troubleshooting** de `SPECS.md` antes de mexer na configuração.
|
|
77
|
+
|
|
78
|
+
## Notas
|
|
79
|
+
|
|
80
|
+
- Chame tools em paralelo quando forem independentes.
|
|
81
|
+
- Mantenha o relatório de halt enxuto — ele é a pauta do code review.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Confrontar a spec com o código atual
|
|
2
|
+
|
|
3
|
+
Antes de tocar código: o escopo ainda faz sentido? há decisão em aberto? há melhoria óbvia que vale
|
|
4
|
+
propor?
|
|
5
|
+
|
|
6
|
+
O refinamento foi escrito **antes** e pode ter envelhecido. **Não o siga cegamente.**
|
|
7
|
+
|
|
8
|
+
## Divergências que exigem parada
|
|
9
|
+
|
|
10
|
+
- decisão que contradiz código já mergeado (ex.: manda criar `UserRoleDialog`, mas já existe
|
|
11
|
+
`EditUserModal` mais completo);
|
|
12
|
+
- decisão que contradiz o protótipo atual;
|
|
13
|
+
- biblioteca ou primitivo que não cabe mais (deprecated, ou o projeto padronizou outro);
|
|
14
|
+
- estrutura de rotas/arquivos que viola convenção recente;
|
|
15
|
+
- critério que referencia algo inexistente — salvo se a task for justamente criar esse algo;
|
|
16
|
+
- padrão obsoleto (ex.: `unstable_cache` onde a versão atual usa `cacheTag`);
|
|
17
|
+
- abordagem que a doc atual (context7) desencoraja;
|
|
18
|
+
- critério que conflita com uma decisão `active` de `.specs/STATE.md`.
|
|
19
|
+
|
|
20
|
+
Para cada uma, `AskUserQuestion` com três coisas:
|
|
21
|
+
|
|
22
|
+
1. **o que a spec diz** — citando o trecho;
|
|
23
|
+
2. **o que existe hoje** — com evidência (`file:line`);
|
|
24
|
+
3. **2–3 opções** — seguir assim mesmo, adaptar, refinar antes de executar — **mais a sua
|
|
25
|
+
recomendação**.
|
|
26
|
+
|
|
27
|
+
Divergência pequena e previsível (um import que mudou de lugar) você ajusta sozinho e sinaliza no
|
|
28
|
+
relatório de halt.
|
|
29
|
+
|
|
30
|
+
## Lacunas de precisão no critério
|
|
31
|
+
|
|
32
|
+
Critério de aceite sem desfecho preciso ("trata o erro graciosamente", "exibe mensagem amigável")
|
|
33
|
+
não dá para testar — a asserção vira vaga e passa com implementação errada.
|
|
34
|
+
|
|
35
|
+
Encontrou? **não invente o valor.** Pergunte qual é o desfecho esperado (status, campo, mensagem,
|
|
36
|
+
estado persistido) e registre a resposta como decisão no relatório. Se o usuário disser "você
|
|
37
|
+
decide", registre como **premissa** com o default escolhido e o racional, no formato da skill
|
|
38
|
+
`requirements-closure`.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Implementar
|
|
2
|
+
|
|
3
|
+
## 1. Marcar `in-progress`
|
|
4
|
+
|
|
5
|
+
`Edit` no frontmatter da task: `status: pending` → `status: in-progress`. **Não commite** — a
|
|
6
|
+
mudança entra no commit final. Não mexa no `meta.json`.
|
|
7
|
+
|
|
8
|
+
## 2. Declarar o plano antes de escrever código
|
|
9
|
+
|
|
10
|
+
Antes da primeira edição, diga explicitamente:
|
|
11
|
+
|
|
12
|
+
- **Premissas** — o que você está assumindo; qualquer incerteza restante;
|
|
13
|
+
- **Arquivos a tocar** — só os que a task exige;
|
|
14
|
+
- **Como vai verificar** — qual gate, qual comando, o que prova que funcionou.
|
|
15
|
+
|
|
16
|
+
Não prossiga sem isso. É o que impede a implementação de crescer sem controle.
|
|
17
|
+
|
|
18
|
+
## 3. Testes antes da implementação
|
|
19
|
+
|
|
20
|
+
Se a task produz código com tipo de teste exigido (ver matriz da skill `test-strategy`):
|
|
21
|
+
|
|
22
|
+
1. Escreva os testes **derivados dos critérios de aceite da spec**, não do código.
|
|
23
|
+
2. Cada critério vira pelo menos uma asserção cujo **valor afirmado** é o desfecho que a spec
|
|
24
|
+
define.
|
|
25
|
+
3. Onde a spec não define valor preciso, registre como **lacuna de precisão** e pergunte — nunca
|
|
26
|
+
escreva asserção vaga que passa em silêncio.
|
|
27
|
+
4. Casos de borda listados na spec viram casos de teste.
|
|
28
|
+
|
|
29
|
+
**Restrições duras (integridade de teste):** nunca enfraqueça asserção, nunca delete ou pule caso
|
|
30
|
+
de teste, nunca use `.skip`/`.todo` para contornar vermelho. Teste genuinamente errado ⇒ **pare e
|
|
31
|
+
pergunte** antes de mexer.
|
|
32
|
+
|
|
33
|
+
## 4. Implementar
|
|
34
|
+
|
|
35
|
+
Satisfaça o **Escopo** e os **critérios de aceite** dos blocos do detalhamento técnico. Escreva o
|
|
36
|
+
mínimo que passa nos testes e atende ao gate — melhoria estrutural fica para task de refactor.
|
|
37
|
+
|
|
38
|
+
As convenções (formatação, tipagem, reuso antes de criação, idioma do código, política de
|
|
39
|
+
comentários, tools de edição) estão na skill `execution-protocol`.
|
|
40
|
+
|
|
41
|
+
**Frontend:** consulte o protótipo antes de implementar, conforme `prototype-check`. Se o projeto
|
|
42
|
+
adotar as skills `ui-standards` e `input-security`, siga-as também.
|
|
43
|
+
|
|
44
|
+
## 5. Gate
|
|
45
|
+
|
|
46
|
+
Rode o gate do pacote tocado, com o comando que o `project.md` define para o nível do gate
|
|
47
|
+
(ver a skill `test-strategy`).
|
|
48
|
+
|
|
49
|
+
Saída ≠ 0 ⇒ **pare, corrija, rode de novo**. Não siga com vermelho. Confira que a contagem de
|
|
50
|
+
testes não caiu.
|
|
51
|
+
|
|
52
|
+
O comando de lint + format ao final é barato e recomendado. O build completo do repositório só
|
|
53
|
+
quando a task exigir — é caro em monorepo. Ambos estão no `project.md`.
|
|
54
|
+
|
|
55
|
+
## 6. Revisão pós-gate
|
|
56
|
+
|
|
57
|
+
1. **Test Adequacy Review** (skill `test-strategy`, Checks A–D): cobertura com `file:line`,
|
|
58
|
+
litmus anti-raso, mapeamento reverso, conformidade. Qualquer falha ⇒ reescreva e rode o gate de
|
|
59
|
+
novo.
|
|
60
|
+
2. **Divergiu da spec?** marque no código:
|
|
61
|
+
```ts
|
|
62
|
+
// SPEC_DEVIATION: <o que divergiu>
|
|
63
|
+
// Motivo: <por que foi necessário>
|
|
64
|
+
```
|
|
65
|
+
e registre no relatório de halt.
|
|
66
|
+
3. **Complexidade:** um engenheiro sênior chamaria isso de complicado demais? Sim ⇒ simplifique e
|
|
67
|
+
rode o gate de novo.
|
|
68
|
+
4. **Escopo:** você tocou algum arquivo que não estava no plano do passo 2? Se sim, justifique no
|
|
69
|
+
relatório ou reverta.
|
|
70
|
+
|
|
71
|
+
## 7. Guarda de escopo durante a implementação
|
|
72
|
+
|
|
73
|
+
Você vai notar coisas que dariam para melhorar. **Não aja sobre elas.**
|
|
74
|
+
|
|
75
|
+
- **Bug** ⇒ traga para o usuário no relatório, ou registre como task separada.
|
|
76
|
+
- **Melhoria** ⇒ vira "ponto de atenção" no relatório.
|
|
77
|
+
- **Relacionado à task atual** ⇒ só entra se estiver nos critérios de aceite.
|
|
78
|
+
|
|
79
|
+
Nunca "já que estou aqui". Scope creep durante a implementação é o principal destruidor de
|
|
80
|
+
qualidade de review.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Localizar a task e carregar contexto
|
|
2
|
+
|
|
3
|
+
## 1. Casar a entrada com uma `(feature, task)`
|
|
4
|
+
|
|
5
|
+
`Glob` em `.specs/specs/*/meta.json`, leia os `meta.json` e case a entrada do usuário — ela pode vir
|
|
6
|
+
como slug, título, nome de arquivo ou descrição livre.
|
|
7
|
+
|
|
8
|
+
| Situação | O que fazer |
|
|
9
|
+
|---|---|
|
|
10
|
+
| Entrada identifica a feature **e** o usuário pediu a feature inteira | modo feature, a partir da primeira `pending` |
|
|
11
|
+
| Entrada identifica só a feature e não está claro | `AskUserQuestion` listando as tasks na ordem de `pages` com o status de cada uma |
|
|
12
|
+
| Ambiguidade entre features | `AskUserQuestion` |
|
|
13
|
+
| Task já `completed` | **pare e pergunte** se a re-execução é intencional |
|
|
14
|
+
|
|
15
|
+
## 2. Carregar contexto
|
|
16
|
+
|
|
17
|
+
Em paralelo:
|
|
18
|
+
|
|
19
|
+
- `CLAUDE.md` da raiz e `.specs/specs/CLAUDE.md`;
|
|
20
|
+
- `meta.json` e `overview.md` da feature;
|
|
21
|
+
- o arquivo da task;
|
|
22
|
+
- as demais tasks da feature (dependências cruzadas);
|
|
23
|
+
- tudo que a lista `**Depende de:**` linkar;
|
|
24
|
+
- **`.specs/STATE.md`, seção `## Decisions`** — toda entrada `AD-NNN` com `Status: active` é
|
|
25
|
+
restrição de projeto que esta implementação precisa respeitar. Conflito com o que a task pede?
|
|
26
|
+
**pare e pergunte** antes de decidir: conformar ou propor supersessão.
|
|
27
|
+
|
|
28
|
+
`PRD.md` / `SDD.md` só se a task for de design ou arquitetura.
|
|
29
|
+
|
|
30
|
+
## 3. Procurar o que já existe
|
|
31
|
+
|
|
32
|
+
Antes de escrever código novo, `Grep`/`Glob` nos diretórios de reuso do `project.md`:
|
|
33
|
+
os pacotes compartilhados e o código das apps (a estrutura está no `project.md`).
|
|
34
|
+
**Reuso vem antes de criação** — utilitário, tipo, componente,
|
|
35
|
+
hook.
|
|
36
|
+
|
|
37
|
+
Escopo amplo demais para `Glob`/`Grep`: no máximo **1** `Agent` com `subagent_type: Explore`, com
|
|
38
|
+
foco específico.
|
|
39
|
+
|
|
40
|
+
## 4. Cadeia de verificação de conhecimento
|
|
41
|
+
|
|
42
|
+
Decisão que depende de versão de lib (o `project.md` lista as que mais mudam decisão): consulte a doc
|
|
43
|
+
atual via sub-agente com MCP `context7` **antes** de implementar. Não confie na memória — a skill
|
|
44
|
+
`requirements-closure` tem a cadeia completa (código → docs → context7 → web → declarar incerteza).
|
|
45
|
+
|
|
46
|
+
**Nunca fabrique** API, campo ou comportamento. Não achou? diga "não sei" e pergunte.
|