@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,198 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mermaid-diagramming
|
|
3
|
+
description: Como escrever diagramas Mermaid elegantes, legíveis e que renderizam de primeira na Specs Platform — escolha do tipo de diagrama, layout, paleta e classDef do tema escuro, limites de tamanho, e a lista de armadilhas de sintaxe que quebram o render. Carregue antes de escrever ou alterar qualquer bloco ```mermaid, em desenhos, specs ou discoveries.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Diagramas Mermaid
|
|
7
|
+
|
|
8
|
+
Esta skill é sobre **o desenho**, não sobre o arquivo que o contém. O formato do arquivo de um
|
|
9
|
+
desenho (frontmatter, tipos, `meta.json`) está em `drawing-writing`.
|
|
10
|
+
|
|
11
|
+
## O renderer que vai desenhar isto
|
|
12
|
+
|
|
13
|
+
A Specs Platform renderiza com **Mermaid 11.17**, `theme: 'dark'`, layout **dagre** (o padrão),
|
|
14
|
+
fonte Inter, e estas `themeVariables`:
|
|
15
|
+
|
|
16
|
+
| variável | valor |
|
|
17
|
+
|---|---|
|
|
18
|
+
| `background` | `#1f1f1f` |
|
|
19
|
+
| `primaryColor` | `#986dff` (roxo do accent) |
|
|
20
|
+
| `primaryTextColor` | `#f9fafb` |
|
|
21
|
+
| `primaryBorderColor` | `#2a2a2a` |
|
|
22
|
+
| `lineColor` | `#6b7280` |
|
|
23
|
+
| `secondaryColor` | `#151515` |
|
|
24
|
+
| `tertiaryColor` | `#111111` |
|
|
25
|
+
|
|
26
|
+
Consequências práticas, todas verificadas neste repositório:
|
|
27
|
+
|
|
28
|
+
- **Fundo é escuro.** Toda cor que você escolher precisa contrastar com `#1f1f1f`. Preencher com
|
|
29
|
+
`#fff` ou usar texto `#000` sem `fill` explícito produz um bloco ilegível.
|
|
30
|
+
- **`layout: elk` NÃO está disponível.** O pacote `@mermaid-js/layout-elk` não está instalado; um
|
|
31
|
+
bloco que pede elk falha no render e a página mostra "Erro no diagrama Mermaid". Use dagre —
|
|
32
|
+
ou seja, não declare `layout` nenhum.
|
|
33
|
+
- **`securityLevel` é o padrão (`strict`).** `<br/>` funciona em rótulos; HTML arbitrário, não.
|
|
34
|
+
Não conte com `click`/callbacks.
|
|
35
|
+
- Todo bloco ```mermaid vira um card com **zoom e pan em tela cheia**. Um diagrama que não cabe na
|
|
36
|
+
largura da página não é um problema fatal — mas ainda é um diagrama ruim se só se lê no zoom.
|
|
37
|
+
|
|
38
|
+
## Escolha do tipo de diagrama
|
|
39
|
+
|
|
40
|
+
Escolha pelo **tipo de pergunta**, não pelo que é mais bonito:
|
|
41
|
+
|
|
42
|
+
| A pergunta é... | Use |
|
|
43
|
+
|---|---|
|
|
44
|
+
| Que peças existem e quem fala com quem? | `flowchart` com `subgraph` por camada |
|
|
45
|
+
| Em que ordem as coisas acontecem, e quem espera por quem? | `sequenceDiagram` |
|
|
46
|
+
| Em que estados uma entidade pode estar e o que a move? | `stateDiagram-v2` |
|
|
47
|
+
| Como os dados se relacionam? | `erDiagram` (tabelas) ou `classDiagram` (objetos) |
|
|
48
|
+
| Onde estão as fronteiras de sistema/infra? | `flowchart` com subgraphs nomeados pela fronteira |
|
|
49
|
+
|
|
50
|
+
`flowchart` resolve a grande maioria. Prefira-o a `architecture-beta`, `C4Context`, `journey`,
|
|
51
|
+
`mindmap` e afins: são mais frágeis, menos familiares e rendem pior no tema escuro. Só use um
|
|
52
|
+
deles quando o `flowchart` genuinamente não expressa a ideia — e diga na legenda por quê.
|
|
53
|
+
|
|
54
|
+
## Layout: como não produzir um diagrama largo demais
|
|
55
|
+
|
|
56
|
+
- **`flowchart TB` no topo, `direction LR` dentro de cada `subgraph`.** Faixas horizontais
|
|
57
|
+
empilhadas rendem um diagrama equilibrado; `LR` puro no topo produz diagramas larguíssimos que
|
|
58
|
+
só se leem com scroll horizontal.
|
|
59
|
+
- **Nunca ligue uma aresta a um `subgraph` inteiro.** Ligue sempre a um nó específico: uma aresta
|
|
60
|
+
apontando para o subgraph faz o Mermaid **ignorar o `direction` interno dele** — é a causa nº 1
|
|
61
|
+
de "por que meu diagrama ficou torto".
|
|
62
|
+
- **Máximo ~15 nós por diagrama.** Passou disso, o problema não é o diagrama: é o recorte. Quebre
|
|
63
|
+
em dois blocos ```mermaid — um panorâmico e um de detalhe — em vez de espremer tudo.
|
|
64
|
+
- Agrupe por **camada, fronteira ou etapa** — o que fizer o leitor achar a peça que procura.
|
|
65
|
+
- Prefira poucos tipos de seta. `-->` para o caminho normal, `-.->` para o assíncrono/eventual,
|
|
66
|
+
`==>` para o caminho crítico. Três significados já é bastante; documente-os na legenda.
|
|
67
|
+
|
|
68
|
+
## Cor: a paleta do tema escuro
|
|
69
|
+
|
|
70
|
+
Use `classDef` — nunca `style` inline nó a nó, que é impossível de manter. Duas paletas,
|
|
71
|
+
dependendo do que o desenho está dizendo.
|
|
72
|
+
|
|
73
|
+
**Desenho de mudança** (o que esta task/feature vai mexer) — mesma paleta das specs:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
classDef changed fill:#3b2f00,stroke:#eab308,color:#fde68a
|
|
77
|
+
classDef added fill:#052e1a,stroke:#22c55e,color:#bbf7d0
|
|
78
|
+
classDef removed fill:#3b0d0d,stroke:#ef4444,color:#fecaca
|
|
79
|
+
classDef untouched fill:#151515,stroke:#2a2a2a,color:#9ca3af
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Legenda: `> 🟡 alterado · 🟢 adicionado · 🔴 removido · ⚪ inalterado (contexto)`
|
|
83
|
+
|
|
84
|
+
**Desenho de arquitetura** (como o sistema é, sem noção de mudança):
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
classDef service fill:#241a3d,stroke:#986dff,color:#e9d5ff
|
|
88
|
+
classDef store fill:#0b2a3d,stroke:#38bdf8,color:#bae6fd
|
|
89
|
+
classDef queue fill:#3b2f00,stroke:#eab308,color:#fde68a
|
|
90
|
+
classDef external fill:#151515,stroke:#4b5563,color:#9ca3af
|
|
91
|
+
classDef actor fill:#052e1a,stroke:#22c55e,color:#bbf7d0
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Legenda: `> 🟣 serviço · 🔵 armazenamento · 🟡 fila/tópico · 🟢 ator · ⚪ externo`
|
|
95
|
+
|
|
96
|
+
Regras que valem para as duas:
|
|
97
|
+
|
|
98
|
+
- **A cor precisa significar uma coisa só** — natureza da mudança **ou** natureza do componente,
|
|
99
|
+
nunca as duas no mesmo desenho.
|
|
100
|
+
- **Toda paleta usada vira legenda.** Diagrama colorido sem legenda é decoração.
|
|
101
|
+
- Aplique com `:::classe` no nó (`SQS[notification-q]:::queue`) ou com `class A,B,C queue` no fim.
|
|
102
|
+
Escolha um dos dois estilos e mantenha no arquivo inteiro.
|
|
103
|
+
|
|
104
|
+
### Onde a legenda mora
|
|
105
|
+
|
|
106
|
+
Depende de onde o diagrama está:
|
|
107
|
+
|
|
108
|
+
- **Em `.specs/drawings/`** — a página renderiza **só o diagrama**, então a legenda tem de estar
|
|
109
|
+
**dentro dele**, como um nó solto sem arestas:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
leg[[legenda: roxo servico · amarelo fila/topico · verde ator · cinza externo<br/>pontilhado = redrive automatico, nao uma chamada]]:::legend
|
|
113
|
+
classDef legend fill:#111111,stroke:#2a2a2a,color:#9ca3af
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Sem aresta ligando o nó de legenda a nada — o dagre o encosta num canto livre, que é onde ele
|
|
117
|
+
deve ficar. Evite acentos e `·` colados em pontuação problemática dentro do rótulo.
|
|
118
|
+
|
|
119
|
+
- **Em specs e discoveries** — o markdown em volta é renderizado, então a legenda é uma linha de
|
|
120
|
+
citação logo abaixo do bloco:
|
|
121
|
+
`> 🟡 alterado · 🟢 adicionado · 🔴 removido · ⚪ inalterado (contexto)`
|
|
122
|
+
|
|
123
|
+
## Rótulos
|
|
124
|
+
|
|
125
|
+
- **Um nó por recurso real** — fila, tabela, use case, endpoint, serviço, job. Nada de "o backend"
|
|
126
|
+
ou "a camada de dados": se não dá para apontar no repositório, o nó não ajuda ninguém.
|
|
127
|
+
- Nomeie pelo **nome real do recurso** (`notification-q`, `ProcessEventService`,
|
|
128
|
+
`dev.samir.notification.adapter.out.dynamodb`), não por uma paráfrase.
|
|
129
|
+
- **Sem aspas duplas dentro do rótulo.** Quando precisar de caractere problemático (`(`, `)`, `:`,
|
|
130
|
+
`,`, `#`), envolva o rótulo inteiro em aspas duplas: `A["POST /v1/notifications (async)"]`.
|
|
131
|
+
Para uma aspa literal, use a entidade `#quot;`.
|
|
132
|
+
- **`<br/>` para quebrar linha**, nunca `\n`.
|
|
133
|
+
- Duas linhas por rótulo é o teto. A terceira linha vira texto abaixo do diagrama.
|
|
134
|
+
- IDs de nó em `camelCase` ou `kebab-case` curtos e estáveis (`snsTopic`, `notif-q`). Evite `end`
|
|
135
|
+
como id — é palavra reservada e quebra o parser.
|
|
136
|
+
|
|
137
|
+
## Antes de gravar: a checklist que evita o card vermelho
|
|
138
|
+
|
|
139
|
+
1. Todo `subgraph` tem `end`.
|
|
140
|
+
2. Nenhuma aresta aponta para um `subgraph` (só para nós).
|
|
141
|
+
3. Todo `classDef` declarado é usado, e todo `:::classe` referencia um `classDef` existente.
|
|
142
|
+
4. Nenhum rótulo tem aspas duplas soltas nem `\n`.
|
|
143
|
+
5. Não há `layout:` no frontmatter do diagrama.
|
|
144
|
+
6. Contagem de nós ≤ 15.
|
|
145
|
+
7. A legenda existe — nó `:::legend` dentro do diagrama num desenho, linha de citação abaixo do
|
|
146
|
+
bloco numa spec ou discovery.
|
|
147
|
+
|
|
148
|
+
Se puder, valide de fato antes de entregar:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
npx -y @mermaid-js/mermaid-cli -i <arquivo>.md -o /tmp/check.svg
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Se o mmdc não estiver disponível, diga que a validação foi só a checklist — não afirme que
|
|
155
|
+
renderizou.
|
|
156
|
+
|
|
157
|
+
## Exemplo completo (arquivo de `.specs/drawings/`)
|
|
158
|
+
|
|
159
|
+
````markdown
|
|
160
|
+
---
|
|
161
|
+
title: "Fan-out do SNS domain-events"
|
|
162
|
+
type: architecture
|
|
163
|
+
date: 2026-09-01
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
```mermaid
|
|
167
|
+
flowchart TB
|
|
168
|
+
subgraph pub[Publicacao]
|
|
169
|
+
direction LR
|
|
170
|
+
prod[Publisher do evento]:::actor --> topic[SNS domain-events]:::queue
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
subgraph fanout[Fan-out]
|
|
174
|
+
direction LR
|
|
175
|
+
topic -->|filter policy<br/>PAYMENT_APPROVED, ORDER_CREATED| nq[SQS notification-q]:::queue
|
|
176
|
+
topic -->|sem filtro<br/>recebe tudo| aq[SQS audit-q]:::queue
|
|
177
|
+
nq -.->|maxReceiveCount estourado| dlq[SQS notification-dlq]:::queue
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
subgraph cons[Consumo]
|
|
181
|
+
direction LR
|
|
182
|
+
nq --> svc[notification-service]:::service
|
|
183
|
+
aq --> aud[consumidor de auditoria<br/>ainda nao implementado]:::external
|
|
184
|
+
dlq --> ops[inspecao manual<br/>via awslocal]:::external
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
leg[[legenda: roxo servico · amarelo fila/topico · verde ator · cinza externo<br/>pontilhado = redrive automatico do SQS, nao uma chamada do servico]]:::legend
|
|
188
|
+
|
|
189
|
+
classDef service fill:#241a3d,stroke:#986dff,color:#e9d5ff
|
|
190
|
+
classDef queue fill:#3b2f00,stroke:#eab308,color:#fde68a
|
|
191
|
+
classDef external fill:#151515,stroke:#4b5563,color:#9ca3af
|
|
192
|
+
classDef actor fill:#052e1a,stroke:#22c55e,color:#bbf7d0
|
|
193
|
+
classDef legend fill:#111111,stroke:#2a2a2a,color:#9ca3af
|
|
194
|
+
```
|
|
195
|
+
````
|
|
196
|
+
|
|
197
|
+
Repare no que **não** está no arquivo: nenhum parágrafo, nenhuma seção, nenhum título no corpo.
|
|
198
|
+
Todo o significado está nos rótulos dos nós e das arestas.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prototype-check
|
|
3
|
+
description: Como consultar o protótipo do projeto antes de escrever ou implementar qualquer entregável visual — primeiro identificando a ferramenta (Claude Design ou Pencil) pelo bloco `prototype` do `.specs/config.json`, e só então aplicando o fluxo daquela ferramenta (abrir o canvas e ler as notas no Claude Design; Pencil MCP, node IDs e breakpoints no Pencil). Carregue em qualquer task que crie ou altere tela, componente visual ou fluxo de UI.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Consulta ao protótipo
|
|
7
|
+
|
|
8
|
+
A consulta é **bloqueante**: sem protótipo conferido, não se escreve critério de aceite visual nem
|
|
9
|
+
se implementa tela. Mas o *como* muda conforme a ferramenta — então a primeira coisa a fazer nunca
|
|
10
|
+
é abrir o protótipo, e sim **descobrir qual ferramenta o projeto usa**.
|
|
11
|
+
|
|
12
|
+
## Passo 1 — Identificar a ferramenta (sempre primeiro)
|
|
13
|
+
|
|
14
|
+
Leia o bloco `prototype` do `.specs/config.json`:
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"prototype": {
|
|
19
|
+
"tool": "claude-design",
|
|
20
|
+
"title": "Finance — redesign",
|
|
21
|
+
"url": "https://claude.ai/code/artifact/<id>",
|
|
22
|
+
"designDir": "design/finance-redesign",
|
|
23
|
+
"artboards": ["Desktop", "Mobile", "Loading"]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- `tool: "claude-design"` → canvas do Claude Design, endereçado por `url`.
|
|
29
|
+
- `tool: "pencil"` → arquivo `.pen` local, endereçado por `file` (e opcionalmente `nodeIds`).
|
|
30
|
+
- Bloco ausente ou `null` → **o projeto não tem protótipo**: siga sem fase visual e diga isso no
|
|
31
|
+
relatório. Não invente um.
|
|
32
|
+
|
|
33
|
+
O `meta.json` da feature pode declarar o seu próprio bloco `prototype`, e ele **substitui** o do
|
|
34
|
+
projeto por completo — uma feature pode estar em outra ferramenta que o resto do repositório.
|
|
35
|
+
Cheque o `meta.json` da feature antes de assumir o default.
|
|
36
|
+
|
|
37
|
+
Sem bloco algum e com suspeita de que existe protótipo, confirme por heurística **e depois peça ao
|
|
38
|
+
usuário para declarar**: `.pen` versionado ⇒ Pencil; `design/**/README.md` com link
|
|
39
|
+
`claude.ai/code/artifact` ⇒ Claude Design.
|
|
40
|
+
|
|
41
|
+
## Passo 2A — Claude Design
|
|
42
|
+
|
|
43
|
+
O canvas é a fonte da verdade; ele **não vive no repositório** e não há MCP para lê-lo.
|
|
44
|
+
|
|
45
|
+
1. Abra a `url` (ou peça ao usuário que abra e descreva/exporte o artboard em questão). Na Specs
|
|
46
|
+
Platform, o painel **Protótipo** da task já traz o botão que abre o canvas.
|
|
47
|
+
2. Leia `<designDir>/README.md` — é onde ficam registradas as decisões de design, os artboards, os
|
|
48
|
+
estados de erro/vazio e o mapa de componentes. É a parte versionada do protótipo, e a única
|
|
49
|
+
consultável offline.
|
|
50
|
+
3. Confira, para a tela da task: estrutura e hierarquia; estados (loading, erro, vazio); os
|
|
51
|
+
breakpoints que o protótipo cobre; e quais componentes do design system entram.
|
|
52
|
+
4. **Não há node ID no Claude Design.** Referencie os artboards pelo nome ("Finance · Mobile"),
|
|
53
|
+
nunca por id inventado.
|
|
54
|
+
5. Alterações no protótipo se pedem pelo slash command `/design` do Claude Code — é o mesmo caminho
|
|
55
|
+
do botão "Pedir alteração" da Specs Platform. Nunca edite o canvas por outro meio.
|
|
56
|
+
6. A Specs Platform embute o protótipo a partir de um **snapshot local** (`prototype.snapshot`,
|
|
57
|
+
default `<designDir>/canvas.html`) — o canvas publicado recusa iframe cross-origin. Depois de
|
|
58
|
+
alterar o design, regrave esse arquivo: leia o canvas com a tool `Artifact` (`action: "read"`) e
|
|
59
|
+
grave o HTML devolvido no caminho do snapshot. É o que o botão **Sincronizar** faz.
|
|
60
|
+
|
|
61
|
+
Divergência entre o README e o canvas: o **canvas ganha**, e o README deve ser atualizado na mesma
|
|
62
|
+
task.
|
|
63
|
+
|
|
64
|
+
## Passo 2B — Pencil
|
|
65
|
+
|
|
66
|
+
O `.pen` é **encriptado**: nunca use `Read`/`Grep` nele. Só as tools do Pencil MCP.
|
|
67
|
+
|
|
68
|
+
As tools `pencil` normalmente **não estão disponíveis dentro de subagentes de execução** — delegue
|
|
69
|
+
a consulta a um sub-agente que as tenha, ou faça-a na sessão principal antes de delegar.
|
|
70
|
+
|
|
71
|
+
1. Confirme a conexão e o arquivo aberto (estado do editor).
|
|
72
|
+
2. **Obtenha os node IDs** dos nós relevantes: se o `meta.json`/`config.json` declarar `nodeIds`,
|
|
73
|
+
parta deles; senão, localize os nós por busca semântica pelo nome da tela/componente e confirme
|
|
74
|
+
com o usuário quais são os alvos antes de seguir.
|
|
75
|
+
3. Para cada nó alvo, extraia: estrutura e hierarquia, tokens (cores, espaçamentos, tipografia),
|
|
76
|
+
estados e os **3 breakpoints** (desktop, tablet, mobile).
|
|
77
|
+
4. Registre os node IDs consultados no relatório — é o que torna a consulta auditável.
|
|
78
|
+
5. Alterações se pedem pelo mesmo MCP, devolvendo o antes/depois de cada nó afetado.
|
|
79
|
+
|
|
80
|
+
## Regras comuns
|
|
81
|
+
|
|
82
|
+
- **Nada de tokens fixos na spec** (hex, px, pesos): eles mudam no protótipo e a doc passa a
|
|
83
|
+
mentir. Descreva estrutura e intenção; quem implementa extrai os valores no momento da
|
|
84
|
+
implementação.
|
|
85
|
+
- Tela que deveria existir e não está no protótipo: **pare e informe o usuário**. Não desenhe por
|
|
86
|
+
conta própria.
|
|
87
|
+
- No relatório da task, inclua uma seção **Validação contra o protótipo** com a ferramenta usada, o
|
|
88
|
+
que foi conferido (✅/❌) e — no Pencil — os node IDs.
|
|
89
|
+
- Ferramenta indisponível, sem resposta ou falhando após 2–3 tentativas: **pare e informe**, não
|
|
90
|
+
siga por aproximação.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refinement
|
|
3
|
+
description: Transforma uma descrição livre em task ou feature documentada em `.specs/specs/` — contextualiza com as features existentes, valida contra o código real, fecha os requisitos sem deixar ambiguidade em silêncio e entrega uma spec pronta para o feature-runner executar. Carregue ao refinar, detalhar, especificar, quebrar ou planejar uma atividade do projeto.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# refinement
|
|
7
|
+
|
|
8
|
+
Transforma uma descrição vaga em documentação **acionável, detalhada e alinhada com o estado real
|
|
9
|
+
do projeto** — pronta para o `feature-runner` executar.
|
|
10
|
+
|
|
11
|
+
Equivalências de tools Claude Code ↔ Cursor: `.agents/RUNTIME.md`.
|
|
12
|
+
|
|
13
|
+
## Princípios invioláveis
|
|
14
|
+
|
|
15
|
+
1. **Nunca altere código de produção.** Seu output é documentação em `.specs/specs/`. Leia o código
|
|
16
|
+
à vontade; não o modifique.
|
|
17
|
+
2. **Sempre valide contra o estado real.** `Glob`, `Grep` e `Read` antes de referenciar qualquer
|
|
18
|
+
rota, componente, tipo ou tabela em critério de aceite. Siga a cadeia de verificação de
|
|
19
|
+
conhecimento da skill `requirements-closure` (código → docs → context7 → web → declarar
|
|
20
|
+
incerteza). **Nunca fabrique** API, campo ou comportamento — requisito inventado vira teste que
|
|
21
|
+
passa provando a coisa errada.
|
|
22
|
+
3. **Sempre pergunte** diante de ambiguidade real de escopo, prioridade ou encaixe:
|
|
23
|
+
`AskUserQuestion` / `AskQuestion` com 2–4 opções concretas, recomendando uma quando tiver
|
|
24
|
+
opinião informada ("(Recomendado)").
|
|
25
|
+
4. **Respeite as convenções** de `CLAUDE.md` (raiz), `.specs/specs/CLAUDE.md` e dos `CLAUDE.md` das
|
|
26
|
+
apps. Nunca invente formato novo.
|
|
27
|
+
5. **Opere com paths absolutos** e **responda em português brasileiro**.
|
|
28
|
+
6. **Não commite nem crie branches.**
|
|
29
|
+
7. **Não altere o `status` de uma task** — isso é do `feature-runner`.
|
|
30
|
+
|
|
31
|
+
## Skills por camada
|
|
32
|
+
|
|
33
|
+
`spec-writing` (contrato do arquivo) e `requirements-closure` (como o critério é escrito e quando
|
|
34
|
+
está fechado) são **obrigatórias** — carregue as duas antes de redigir qualquer critério. As demais,
|
|
35
|
+
conforme o que a task toca:
|
|
36
|
+
|
|
37
|
+
| Carregue | Quando |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `test-strategy` | a task produz código testável — define `**Tipo:**` e `**Gate:**` do bloco de Testes. Quase sempre |
|
|
40
|
+
| `input-security` | a task recebe input do usuário (formulário, body, query/path param, cookie, header, upload, webhook) (opcional — só se o projeto adotar essa skill) |
|
|
41
|
+
| `ui-standards` | a task cria ou altera tela/componente (opcional — só se o projeto adotar essa skill) |
|
|
42
|
+
| `prototype-check` | a task tem entregável visual — define como identificar a ferramenta e consultar o protótipo |
|
|
43
|
+
|
|
44
|
+
Não carregue o que não vai usar.
|
|
45
|
+
|
|
46
|
+
## Fluxo
|
|
47
|
+
|
|
48
|
+
**0. Protótipo (quando o usuário fornecer node IDs).** Consulta ao protótipo é **bloqueante**, antes
|
|
49
|
+
de ler código. Carregue `prototype-check` e siga o fluxo de delegação de lá. Conexão falhou ou os
|
|
50
|
+
nós não retornaram ⇒ **PARE e informe o usuário**.
|
|
51
|
+
|
|
52
|
+
**1. Entender a atividade.** Fixe **o quê** (funcionalidade, melhoria, correção), **por quê**
|
|
53
|
+
(problema que resolve) e **onde** (frontend, backend, ambos, infra, docs). Descrição vaga do tipo
|
|
54
|
+
"melhorar a performance" ⇒ `AskUserQuestion` para delimitar parte do sistema, comportamento atual
|
|
55
|
+
vs. esperado e restrições.
|
|
56
|
+
|
|
57
|
+
**2. Mapear o terreno.** → [mapear-terreno.md](references/mapear-terreno.md)
|
|
58
|
+
|
|
59
|
+
**3. Decidir a estrutura.** → [estrutura.md](references/estrutura.md)
|
|
60
|
+
|
|
61
|
+
**4. Fechar os requisitos.** → skill `requirements-closure`: o sweep das 9 dimensões implícitas
|
|
62
|
+
(cada uma vira requisito **ou** `N/A porque <motivo>` — nunca em branco), a redação em EARS, os IDs
|
|
63
|
+
de requisito e o portão de fechamento. **Esta fase não é opcional em task média ou grande.** O que
|
|
64
|
+
não foi resolvido com o usuário vira linha na tabela de premissas, nunca sumiço silencioso.
|
|
65
|
+
|
|
66
|
+
**5. Redigir.** Use `.specs/specs/_templates/` como ponto de partida, adaptando ao escopo real (não
|
|
67
|
+
copie seção que não se aplica). Siga `spec-writing` para estrutura, diagrama, blocos `<details>` e
|
|
68
|
+
frontmatter. Depois de escrever, atualize o `meta.json` correspondente — e o `overview.md` da
|
|
69
|
+
feature quando a task nova mudar o desenho macro.
|
|
70
|
+
|
|
71
|
+
**6. Validar.** → [validar-renderizacao.md](references/validar-renderizacao.md)
|
|
72
|
+
|
|
73
|
+
**7. Reportar.** → formato abaixo.
|
|
74
|
+
|
|
75
|
+
Leia cada referência **por completo** no momento em que a fase começa.
|
|
76
|
+
|
|
77
|
+
## Regras que valem sempre ao redigir
|
|
78
|
+
|
|
79
|
+
- Task com input do usuário **tem** bloco de segurança. Sem input, o relatório declara
|
|
80
|
+
"Segurança de inputs: N/A — a task não processa inputs externos".
|
|
81
|
+
- Task de frontend **tem** blocos de responsividade, estados de UI e acessibilidade/animações.
|
|
82
|
+
- Decisão que depende de versão de lib (ver a stack no `project.md`): consulte a doc atual via
|
|
83
|
+
sub-agente com MCP `context7` antes de fixar o critério, e registre a referência no relatório.
|
|
84
|
+
- **Nada de token visual fixo** (hex, px, pesos) — eles vivem no protótipo, não na spec.
|
|
85
|
+
- Decisão que vira restrição de projeto (outra feature precisaria saber dela) ⇒ proponha ao usuário
|
|
86
|
+
uma entrada `AD-NNN` em `.specs/STATE.md`. Decisão feature-local fica no arquivo da task.
|
|
87
|
+
|
|
88
|
+
## Relatório
|
|
89
|
+
|
|
90
|
+
```markdown
|
|
91
|
+
## Refinamento concluído
|
|
92
|
+
|
|
93
|
+
**Tipo:** <Nova task em feature existente | Nova feature | Refinamento de task existente>
|
|
94
|
+
**Feature:** <título> (`.specs/specs/<slug>/`)
|
|
95
|
+
**Task(s) criada(s)/refinada(s):**
|
|
96
|
+
- `feat-<slug>-<task>.md` — <descrição curta>
|
|
97
|
+
|
|
98
|
+
### Resumo do escopo
|
|
99
|
+
- <bullet>
|
|
100
|
+
|
|
101
|
+
### Sweep das dimensões implícitas
|
|
102
|
+
- <dimensão> → <requisito criado | N/A porque ...>
|
|
103
|
+
|
|
104
|
+
### Premissas registradas
|
|
105
|
+
- <premissa> — default: <o que vamos fazer> — <racional>
|
|
106
|
+
|
|
107
|
+
### Arquivos criados/modificados
|
|
108
|
+
- <path> (criado/editado)
|
|
109
|
+
|
|
110
|
+
### Dependências identificadas
|
|
111
|
+
- <task X> (status) — <relação>
|
|
112
|
+
|
|
113
|
+
### Decisões tomadas
|
|
114
|
+
- <decisão e motivo, ou "nenhuma — tudo estava claro">
|
|
115
|
+
|
|
116
|
+
### Validação
|
|
117
|
+
- `node .agents/scripts/validate-spec.mjs <path>` — <0 erros / o que foi corrigido>
|
|
118
|
+
- Renderização conferida em `/features/<slug>/<task>` — <ok / o que falhou>
|
|
119
|
+
|
|
120
|
+
### Pontos que merecem atenção
|
|
121
|
+
- <risco, ambiguidade remanescente ou sugestão de split>
|
|
122
|
+
|
|
123
|
+
### Próximos passos
|
|
124
|
+
- Para **executar**: `executar feat-<slug>-<task>`
|
|
125
|
+
- Para **ajustar**: "Ajustar: <o que mudar>"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Entrada "Ajustar: ..."** ⇒ releia o arquivo com `Read` antes de editar, aplique **apenas** o
|
|
129
|
+
solicitado (não expanda escopo) e volte ao relatório atualizado.
|
|
130
|
+
|
|
131
|
+
## Notas
|
|
132
|
+
|
|
133
|
+
- Chame tools em paralelo quando forem independentes (leituras, greps).
|
|
134
|
+
- Seja específico: o `feature-runner` usa seus critérios como spec de implementação.
|
|
135
|
+
- Gap descoberto no projeto (tipo compartilhado que falta, endpoint que deveria existir) vira
|
|
136
|
+
**ponto de atenção** no relatório — não expanda o escopo por conta própria.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Decidir a estrutura
|
|
2
|
+
|
|
3
|
+
| Caso | Quando | O que produzir |
|
|
4
|
+
|---|---|---|
|
|
5
|
+
| **A** — nova task em feature existente | a atividade cabe numa feature já documentada | novo `feat-<slug>-<nome>.md` + entrada em `pages` do `meta.json` da feature |
|
|
6
|
+
| **B** — feature nova | a atividade não pertence a nenhuma feature existente | pasta + `meta.json` + `overview.md` + tasks + slug no `.specs/specs/meta.json` raiz |
|
|
7
|
+
| **C** — refinar task existente | já existe task cobrindo isso, mas rasa ou desatualizada | enriquecer o arquivo atual |
|
|
8
|
+
|
|
9
|
+
Dúvida entre A e B ⇒ `AskUserQuestion` com prós e contras.
|
|
10
|
+
|
|
11
|
+
## Heurísticas de quebra em tasks
|
|
12
|
+
|
|
13
|
+
A fonte de verdade é a skill **`spec-writing`**, seção "Heurísticas de quebra em tasks" — quando
|
|
14
|
+
quebrar, quando não quebrar e como ordenar o array `pages`. Carregue-a antes de decidir o recorte;
|
|
15
|
+
não duplique a regra aqui.
|
|
16
|
+
|
|
17
|
+
O usuário prefere **tasks quebradas por seção**, para ter controle sobre cada entrega. Na dúvida
|
|
18
|
+
entre uma task grande e duas menores coesas, proponha as duas e deixe a escolha com ele.
|
|
19
|
+
|
|
20
|
+
## Antes de escrever: a atividade merece spec?
|
|
21
|
+
|
|
22
|
+
Se a atividade é pequena e coesa (≤3 arquivos, uma camada, nenhum contrato novo), documentar custa
|
|
23
|
+
mais do que fazer. Diga isso ao usuário e ofereça o caminho do `refinement-runner` — refinar e
|
|
24
|
+
executar direto, sem produzir documento. A decisão é dele.
|
|
25
|
+
|
|
26
|
+
O inverso também vale: atividade que se quebraria em três ou mais tasks independentes **precisa** de
|
|
27
|
+
spec, mesmo que tenha chegado como "faz rapidinho".
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Mapear o terreno
|
|
2
|
+
|
|
3
|
+
Em paralelo, antes de decidir qualquer coisa:
|
|
4
|
+
|
|
5
|
+
- **`Glob` em `.specs/specs/*/meta.json`**, lidos todos — mapa completo de features e tasks. Para
|
|
6
|
+
as features relevantes, leia o `overview.md` e o frontmatter de cada task (inclusive `status`).
|
|
7
|
+
- **`CLAUDE.md`** da raiz, `.specs/specs/CLAUDE.md` e o `CLAUDE.md` da app afetada.
|
|
8
|
+
- **`.specs/STATE.md`, seção `## Decisions`** — leitura **obrigatória** antes de qualquer decisão
|
|
9
|
+
arquitetural. Detalhes abaixo.
|
|
10
|
+
- **Código relacionado** via `Grep`/`Glob`: endpoints existentes, componentes, schema do banco,
|
|
11
|
+
tipos e utilitários compartilhados (ver a estrutura de pacotes no `project.md`).
|
|
12
|
+
- **Dependências cruzadas:** o que é pré-requisito desta atividade e o que dependerá dela.
|
|
13
|
+
- **Discoveries** em `.specs/discoveries/` que toquem o assunto — referencie em vez de duplicar.
|
|
14
|
+
|
|
15
|
+
Escopo amplo demais para `Glob`/`Grep`: no máximo **1** chamada `Agent` com
|
|
16
|
+
`subagent_type: Explore`, com foco específico.
|
|
17
|
+
|
|
18
|
+
## Decisões ativas de projeto
|
|
19
|
+
|
|
20
|
+
Toda entrada `AD-NNN` de `.specs/STATE.md` com `Status: active` é uma **restrição** que esta task
|
|
21
|
+
precisa respeitar. Se uma decisão de feature anterior conflita com o que é melhor aqui, você tem
|
|
22
|
+
duas saídas — ambas exigem escolha explícita:
|
|
23
|
+
|
|
24
|
+
1. **Conformar** — desenhe dentro da restrição ativa.
|
|
25
|
+
2. **Superar** — pergunte ao usuário e, aprovado, acrescente um `AD-NNN` novo em `.specs/STATE.md`
|
|
26
|
+
que substitui o antigo (marcando o antigo como `superseded by AD-NNN`) e documente o motivo. A
|
|
27
|
+
decisão nova passa a ser o padrão do projeto.
|
|
28
|
+
|
|
29
|
+
**Ignorar uma decisão ativa em silêncio não é opção** — cria inconsistência invisível entre
|
|
30
|
+
features, que só aparece meses depois.
|
|
31
|
+
|
|
32
|
+
Quando a decisão merecer documento longo (comparação de alternativas, benchmark, plano de adoção),
|
|
33
|
+
a discovery tipo `adr`/`rfc` é o documento e a entrada `AD-NNN` é o índice que aponta para ela.
|
|
34
|
+
|
|
35
|
+
## Sinalizar riscos encontrados no caminho
|
|
36
|
+
|
|
37
|
+
Enquanto lê o código, anote o que encontrar de problemático **nas áreas que esta task toca**:
|
|
38
|
+
|
|
39
|
+
- código frágil — acoplamento forte, função gigante, estado implícito;
|
|
40
|
+
- dívida técnica — gambiarra, workaround, API deprecada;
|
|
41
|
+
- risco de segurança — input não validado, brecha de auth, segredo exposto;
|
|
42
|
+
- gargalo — N+1, loop sem limite, índice faltando;
|
|
43
|
+
- lacuna de teste — caminho não testado do qual esta task depende.
|
|
44
|
+
|
|
45
|
+
Cada achado vai para **Pontos que merecem atenção** no relatório, com `file:line` e o que você
|
|
46
|
+
sugere fazer. Não conserte nada: você não altera código de produção.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Validar
|
|
2
|
+
|
|
3
|
+
Duas checagens. Nenhuma é opcional — erro de frontmatter, slug inconsistente ou typo no `meta.json`
|
|
4
|
+
quebra a página na Specs Platform.
|
|
5
|
+
|
|
6
|
+
## 1. Validação determinística
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
node .agents/scripts/validate-spec.mjs .specs/specs/<slug>/feat-<slug>-<task>.md
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Checa por código o que a skill `spec-writing` exige de memória: frontmatter e `status` válido,
|
|
13
|
+
ordem das seções, ausência de H1 no corpo, `**Depende de:**`, `### Fora de escopo`, os quatro
|
|
14
|
+
`classDef` do Mermaid, linha em branco nos `<details>`, heading proibido dentro de `<details>`,
|
|
15
|
+
critério fora de EARS, ID de requisito malformado, premissa com célula vazia, e presença do arquivo
|
|
16
|
+
em `pages` do `meta.json`.
|
|
17
|
+
|
|
18
|
+
**Saída ≠ 0 ⇒ corrija antes de apresentar.** Rode no arquivo que você tocou; `--all` existe para
|
|
19
|
+
inventário e hoje acusa as specs no formato antigo, que não são escopo do seu refinamento.
|
|
20
|
+
|
|
21
|
+
## 2. Renderização
|
|
22
|
+
|
|
23
|
+
1. `curl -sf http://localhost:4321/health` (UI e API na mesma porta). Não respondeu? rode
|
|
24
|
+
`specs status`; se não estiver no ar, peça ao usuário para rodar `specs start` na raiz.
|
|
25
|
+
2. Abra as páginas criadas/editadas (`/features/<slug>` e `/features/<slug>/feat-<slug>-<task>`) —
|
|
26
|
+
via sub-agente com a ferramenta de E2E, ou pelos endpoints `/api/tree` e `/api/content`.
|
|
27
|
+
3. Confirme: sem erro de console, título e seções renderizando, diagrama Mermaid sem erro, blocos
|
|
28
|
+
expansíveis abrindo, sidebar na ordem certa.
|
|
29
|
+
4. Falhou algo? consulte a seção **Troubleshooting** de `SPECS.md` antes de mexer na configuração.
|