@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,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Primeira task de exemplo"
|
|
3
|
+
description: "Sua primeira spec renderizada pela Specs Platform. Edite este arquivo ou remova ao criar seu conteúdo real."
|
|
4
|
+
status: pending
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Bem-vindo à **Specs Platform**! Este arquivo demonstra como suas specs são renderizadas na UI local.
|
|
8
|
+
|
|
9
|
+
## Onde editar
|
|
10
|
+
|
|
11
|
+
Todo o conteúdo de specs vive em `.specs/specs/`. A estrutura é:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
.specs/
|
|
15
|
+
├── config.json # configuração da plataforma
|
|
16
|
+
└── specs/
|
|
17
|
+
├── meta.json # lista das features (slugs na ordem desejada)
|
|
18
|
+
├── _templates/ # templates de tasks (backend, frontend, integração)
|
|
19
|
+
└── <slug-da-feature>/
|
|
20
|
+
├── meta.json # título, descrição, ícone, tasks
|
|
21
|
+
└── feat-<slug>-<task>.md
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Como adicionar sua primeira feature
|
|
25
|
+
|
|
26
|
+
1. Crie uma pasta em `.specs/specs/<slug-da-feature>/`.
|
|
27
|
+
2. Adicione um `meta.json`:
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"title": "Minha feature",
|
|
31
|
+
"description": "Uma linha descrevendo o escopo.",
|
|
32
|
+
"icon": "rocket",
|
|
33
|
+
"pages": ["feat-minha-feature-backend"]
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
3. Crie os arquivos de task seguindo o padrão `feat-<slug>-<nome>.md`. Use os templates em `_templates/` como ponto de partida.
|
|
37
|
+
4. Adicione o slug da pasta em `.specs/specs/meta.json` para que a feature apareça na sidebar.
|
|
38
|
+
|
|
39
|
+
## Checklist de boas-vindas
|
|
40
|
+
|
|
41
|
+
- [x] Specs Platform instalada (`specs install`)
|
|
42
|
+
- [x] Configuração inicial em `.specs/config.json`
|
|
43
|
+
- [x] Esta feature de exemplo renderizando
|
|
44
|
+
- [ ] Você cria sua primeira feature real
|
|
45
|
+
- [ ] Você remove esta feature exemplo
|
|
46
|
+
|
|
47
|
+
## Recursos da UI
|
|
48
|
+
|
|
49
|
+
- **Drag-and-drop na sidebar** — reordena features e tasks (persiste nos `meta.json`).
|
|
50
|
+
- **Modal "Alterar Status"** — muda `status: pending|in-progress|completed` no frontmatter sem sair da UI.
|
|
51
|
+
- **Botão "Rodar Tarefa"** — dispara o agent `feature-runner` em um novo terminal, com prompt pronto.
|
|
52
|
+
- **Título sem duplicação** — o `title` do frontmatter já vira o `<h1>` da página; não repita um
|
|
53
|
+
`# Título` no corpo do markdown (se repetir, a UI remove o duplicado).
|
|
54
|
+
- **Blocos expansíveis** — use `<details>` + `<summary>` para esconder detalhamento técnico longo:
|
|
55
|
+
|
|
56
|
+
<details>
|
|
57
|
+
<summary>Exemplo de bloco expansível</summary>
|
|
58
|
+
|
|
59
|
+
O conteúdo aqui dentro é markdown normal — listas, tabelas, código e checkboxes funcionam.
|
|
60
|
+
|
|
61
|
+
- [ ] deixe uma linha em branco depois do `</summary>` e antes do `</details>`
|
|
62
|
+
|
|
63
|
+
</details>
|
|
64
|
+
|
|
65
|
+
- **Renderizador Markdown** — suporta GFM, tabelas, code highlight e Mermaid (clique no diagrama
|
|
66
|
+
ou no ícone de expandir para abrir em tela cheia com zoom e pan):
|
|
67
|
+
|
|
68
|
+
```mermaid
|
|
69
|
+
graph LR
|
|
70
|
+
A[Descrição vaga] --> B[refinement agent]
|
|
71
|
+
B --> C[Spec documentada]
|
|
72
|
+
C --> D[feature-runner agent]
|
|
73
|
+
D --> E[Implementação + code review]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Próximos passos
|
|
77
|
+
|
|
78
|
+
Quando terminar de explorar:
|
|
79
|
+
|
|
80
|
+
- Remova esta feature: `rm -rf .specs/specs/exemplo` e remova o slug `"exemplo"` de `.specs/specs/meta.json`.
|
|
81
|
+
- Peça ao Claude: **"refine a feature <X>"** para iniciar seu primeiro refinamento com o agent `refinement`.
|
|
82
|
+
- Depois: **"executa a feature <X>"** e o agent `feature-runner` cuida da implementação.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Feature de exemplo"
|
|
3
|
+
description: "Página de overview da feature — é isto que aparece ao clicar na feature na sidebar, antes de entrar em qualquer task."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## O que será feito
|
|
7
|
+
|
|
8
|
+
Este arquivo é o **overview da feature**: mora em `.specs/specs/<slug>/overview.md` e é renderizado
|
|
9
|
+
na rota `/features/<slug>`. Se ele não existir, a plataforma continua redirecionando para a
|
|
10
|
+
primeira task — nada quebra.
|
|
11
|
+
|
|
12
|
+
Use este espaço para a **visão macro**: o problema, a decisão tomada e o desenho geral da solução.
|
|
13
|
+
O detalhe de cada recorte vive nas tasks.
|
|
14
|
+
|
|
15
|
+
## Visão Técnica
|
|
16
|
+
|
|
17
|
+
O diagrama do overview mostra a arquitetura macro da feature inteira; o diagrama de cada task
|
|
18
|
+
mostra o recorte micro daquela task. Ambos usam as mesmas cores.
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
flowchart TB
|
|
22
|
+
subgraph camada["Camada de exemplo"]
|
|
23
|
+
direction LR
|
|
24
|
+
A["<Componente alterado>"]:::changed
|
|
25
|
+
B["<Componente novo>"]:::added
|
|
26
|
+
D["<Componente inalterado>"]:::untouched
|
|
27
|
+
D --> A --> B
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
subgraph morto["Aposentado nesta feature"]
|
|
31
|
+
C["<Componente removido>"]:::removed
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
classDef changed fill:#3b2f00,stroke:#eab308,color:#fde68a
|
|
35
|
+
classDef added fill:#052e1a,stroke:#22c55e,color:#bbf7d0
|
|
36
|
+
classDef removed fill:#3b0d0d,stroke:#ef4444,color:#fecaca
|
|
37
|
+
classDef untouched fill:#151515,stroke:#2a2a2a,color:#9ca3af
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
> 🟡 alterado · 🟢 adicionado · 🔴 removido · ⚪ inalterado (contexto)
|
|
41
|
+
|
|
42
|
+
### Ordem de execução
|
|
43
|
+
|
|
44
|
+
Descreva a cadeia crítica entre as tasks — o que bloqueia o quê e o que pode andar em paralelo.
|
|
45
|
+
A lista de tasks com status aparece automaticamente abaixo desta página.
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Specs Platform — instalada neste projeto
|
|
2
|
+
|
|
3
|
+
Este projeto usa a **Specs Platform** (`@mir-code/specs-platform`). Ela renderiza os diretórios `.specs/specs/`, `.specs/discoveries/` e `.specs/drawings/` com UI navegável, drag-and-drop, mudança de status e disparo de agents pelo browser.
|
|
4
|
+
|
|
5
|
+
A plataforma é **agnóstica a stack**: funciona em qualquer projeto (Node, Java, Python, Go, Rust, etc.). Ela roda a partir do pacote npm instalado na sua máquina — nada é copiado para dentro do projeto além do conteúdo e da configuração, e o `package.json` do projeto (se houver) não é tocado.
|
|
6
|
+
|
|
7
|
+
> **O que versionar:** `.specs/specs/`, `.specs/discoveries/`, `.specs/drawings/`, `.specs/config.json`, `.agents/` e `SPECS.md`. O estado local da máquina (`.specs/.jobs.json`, `.specs/.run/`) já é adicionado ao `.gitignore` pelo `specs install`.
|
|
8
|
+
|
|
9
|
+
## Instalar o CLI (uma vez por máquina)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm i -g @mir-code/specs-platform # só a Specs Platform — comando `specs`
|
|
13
|
+
# ou
|
|
14
|
+
npm i -g @mir-code/ai-tools # todas as ferramentas — comando `mircode-ai` (menu interativo)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Sem instalar nada: `npx @mir-code/specs-platform <comando>`.
|
|
18
|
+
|
|
19
|
+
## Como rodar
|
|
20
|
+
|
|
21
|
+
Na raiz do seu projeto:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
specs start
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Sobe a **UI + API numa porta só** (`port` do `.specs/config.json`, default `:4321`) em background e abre o browser. Pid e log ficam em `.specs/.run/`.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
specs status # está rodando? em qual URL?
|
|
31
|
+
specs stop # para a instância deste projeto
|
|
32
|
+
specs start -f # foreground (Ctrl+C para parar)
|
|
33
|
+
specs start --no-open # não abre o browser
|
|
34
|
+
specs start -p 5000 # outra porta (sobrescreve o config)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Com o `@mir-code/ai-tools`, os mesmos comandos ficam em `mircode-ai specs-platform <comando>`, ou no menu interativo de `mircode-ai`.
|
|
38
|
+
|
|
39
|
+
## Estrutura esperada no projeto
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
<project>/
|
|
43
|
+
├── .agents/ # fonte única de agentes e skills
|
|
44
|
+
│ ├── project.md # ← PREENCHA: a configuração deste projeto
|
|
45
|
+
│ ├── agents/ # 5 launchers (feature-runner, refinement, refinement-runner,
|
|
46
|
+
│ │ # discovery-agent, drawing-agent)
|
|
47
|
+
│ ├── skills/ # 14 skills (processo + conhecimento)
|
|
48
|
+
│ └── scripts/ # validate-spec.mjs, check-commit.mjs
|
|
49
|
+
├── .claude/{agents,skills} # symlinks → .agents/
|
|
50
|
+
├── .cursor/{agents,skills} # symlinks → .agents/
|
|
51
|
+
├── .specs/
|
|
52
|
+
│ ├── config.json # config da plataforma
|
|
53
|
+
│ ├── discoveries/ # ← SUAS discoveries (RFC, spike, ADR, note)
|
|
54
|
+
│ │ ├── meta.json # ordem na sidebar
|
|
55
|
+
│ │ └── <slug>.md
|
|
56
|
+
│ ├── drawings/ # ← SEUS desenhos (só o diagrama Mermaid)
|
|
57
|
+
│ │ ├── meta.json # ordem na sidebar
|
|
58
|
+
│ │ └── <slug>.md
|
|
59
|
+
│ └── specs/ # ← SUAS specs (features + tasks)
|
|
60
|
+
│ ├── meta.json # ordem das features
|
|
61
|
+
│ ├── _templates/ # scaffolds de task (backend, frontend, integração)
|
|
62
|
+
│ └── <slug-da-feature>/
|
|
63
|
+
│ ├── meta.json
|
|
64
|
+
│ └── feat-<slug>-<task>.md
|
|
65
|
+
├── SPECS.md
|
|
66
|
+
└── ...
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Configuração
|
|
70
|
+
|
|
71
|
+
`.specs/config.json` controla:
|
|
72
|
+
|
|
73
|
+
| Chave | Default | Descrição |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| `port` | `4321` | Porta do servidor Fastify. |
|
|
76
|
+
| `warnBelowWidth` | `1024` | Largura mínima para a UI sugerir desktop-only. |
|
|
77
|
+
| `featuresDir` | `.specs/specs` | Diretório lido pelo servidor (relativo à raiz do projeto). |
|
|
78
|
+
| `agent.openTerminal` | `osascript` (macOS) | Terminal que abre o agent. Opções: `gnome-terminal`, `kitty`, `wezterm`, `none`. |
|
|
79
|
+
| `agent.cli` | `claude` | CLI padrão ao abrir os modais de execução (chave de `agent.commands`). A última escolha é lembrada por sessão (`localStorage`). |
|
|
80
|
+
| `agent.commands` | `{ claude, cursor }` | Comando **por CLI**. Chave = id da CLI (`claude`, `cursor`, ...); valor = comando disparado, com `{prompt}`, o placeholder opcional `{model}` (`--model <id>` ou vazio) e o token `feature-runner` (trocado pelo agent). O Cursor lê `.claude/agents/`, então os mesmos agents valem nas duas CLIs. |
|
|
81
|
+
| `agent.modelsCommand` | `{ cursor: "cursor-agent --list-models" }` | Comando que lista modelos **dinamicamente** por CLI (saída parseada no formato `id - Nome`). |
|
|
82
|
+
| `agent.models` | `{ claude: [opus, sonnet, haiku, fable] }` | Lista **estática** de modelos por CLI — fallback ou única fonte (Claude Code não expõe listagem; usa aliases `--model`). |
|
|
83
|
+
| `agent.command` | (derivado) | Legado/fallback (= `commands[cli]`). Configs antigas que só tinham `command` continuam funcionando. |
|
|
84
|
+
| `agent.scopes` | 3 templates | Prompts para `feature`, `featureNoPause`, `task`. |
|
|
85
|
+
| `prototype` | `null` | Protótipo do projeto. `tool`: `claude-design` (canvas por `url`) ou `pencil` (arquivo `.pen` por `file`). Opcionais: `title`, `designDir`, `artboards`, `nodeIds`, `openCommand`, `snapshot`. O `meta.json` de uma feature pode declarar o seu e substituir este. |
|
|
86
|
+
|
|
87
|
+
### Protótipo
|
|
88
|
+
|
|
89
|
+
Com `prototype` declarado, a navegação lateral ganha a seção **Protótipo**, que abre `/prototype`:
|
|
90
|
+
o protótipo renderizado dentro do app, em iframe, sem trocar de aba.
|
|
91
|
+
|
|
92
|
+
O canvas publicado recusa embed cross-origin (`frame-ancestors 'self'`), então o iframe carrega o
|
|
93
|
+
**snapshot local** — o HTML do canvas salvo em `snapshot` (default `<designDir>/canvas.html`) e
|
|
94
|
+
servido pelo Fastify. O botão **Sincronizar** dispara um job que relê o canvas e regrava esse
|
|
95
|
+
arquivo; sem snapshot, a página explica como gerar o primeiro.
|
|
96
|
+
|
|
97
|
+
As páginas de feature e de task ganham o painel **Protótipo**:
|
|
98
|
+
|
|
99
|
+
- **Ver aqui** — abre a página com o iframe. **Editar no canvas** abre o canvas real em outra aba;
|
|
100
|
+
no Pencil, **Abrir no Pencil** abre o `.pen` no app local pelo `openCommand` (default
|
|
101
|
+
`open -a Pencil {file}`).
|
|
102
|
+
- **Pedir alteração** — texto livre que vira um job como qualquer execução de agent, com terminal ao
|
|
103
|
+
vivo. O prompt sai conforme a ferramenta: `/design ...` no Claude Design; instrução de editar pelo
|
|
104
|
+
**Pencil MCP**, devolvendo os node IDs afetados, no Pencil.
|
|
105
|
+
|
|
106
|
+
Os agents fazem o mesmo caminho pela skill `prototype-check`: identificam a ferramenta antes e só
|
|
107
|
+
então aplicam as verificações dela. Sem `prototype`, o painel some e os agents pulam a fase visual.
|
|
108
|
+
|
|
109
|
+
## Agents configurados
|
|
110
|
+
|
|
111
|
+
| Agent | O que faz |
|
|
112
|
+
|---|---|
|
|
113
|
+
| **`refinement`** | Transforma descrição vaga em task/feature documentada em `.specs/specs/`. |
|
|
114
|
+
| **`refinement-runner`** | Refina em memória, esgota as dúvidas, implementa e para antes do commit — **sem** criar documento em `.specs/specs/`. |
|
|
115
|
+
| **`feature-runner`** | Executa uma task/feature, para antes do commit para code review. |
|
|
116
|
+
|
|
117
|
+
A operação da plataforma (subir, parar, atualizar) não depende de agents — use o CLI `specs` diretamente. Veja a seção [Troubleshooting](#troubleshooting) abaixo.
|
|
118
|
+
|
|
119
|
+
### Escolha da CLI (Claude Code / Cursor)
|
|
120
|
+
|
|
121
|
+
O medidor **Uso do plano** no rodapé das Execuções lê a fonte local mais recente. Para ele funcionar sem depender do app desktop do Claude, plugue o coletor no seu `statusLine` (`~/.claude/settings.json`). O comando abaixo imprime o trecho pronto, com o caminho do script dentro do pacote instalado:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
specs statusline
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Ele grava `rate_limits` em `~/.claude/specs-usage.json` a cada turno do Claude Code e repassa o JSON ao seu statusLine original. Requer `jq`.
|
|
128
|
+
|
|
129
|
+
As execuções aparecem na sidebar da direita, etiquetadas pela origem (`Spec`, `Refino`, `Discovery`, `Desenho`, `Protótipo`) e sobrevivem a um restart da plataforma — o histórico fica em `.specs/.jobs.json` (local, não versionado). Um job que estava vivo quando a plataforma caiu reaparece como `Cancelado · sessão anterior`: dá para reler o terminal, não para responder nele.
|
|
130
|
+
|
|
131
|
+
Cada disparo de agent (Rodar Tarefa, Refinamento, Discovery, Desenho, Editar via IA) tem um seletor **Ferramenta** para escolher entre **Claude Code** (`claude --agent ...`) e **Cursor** (`cursor-agent ...`). As opções vêm das chaves de `agent.commands`. Para Cursor, instale e autentique o `cursor-agent` (`curl https://cursor.com/install -fsS | bash`).
|
|
132
|
+
|
|
133
|
+
Abaixo há um seletor **Modelo** populado automaticamente (lembrado por sessão, por CLI): o Cursor lista dinamicamente via `cursor-agent --list-models`; o Claude Code usa os aliases de `agent.models.claude` (`opus`/`sonnet`/`haiku`/`fable`), pois o CLI não tem comando de listagem. A opção "Padrão da CLI" não passa `--model`. O modelo é injetado no `{model}` do comando.
|
|
134
|
+
|
|
135
|
+
## Atualizar
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npm i -g @mir-code/specs-platform@latest # atualiza o CLI (UI + server)
|
|
139
|
+
specs install # atualiza agents/skills do projeto
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
O `specs install` é idempotente: regrava `.agents/agents/`, `.agents/skills/` e `.agents/scripts/` (skills que você adicionou por conta própria sobrevivem) e **preserva** `.agents/project.md`, `.specs/config.json`, seus `meta.json`, `_templates/` e este `SPECS.md`. `specs install --force` sobrescreve também esses arquivos.
|
|
143
|
+
|
|
144
|
+
## Troubleshooting
|
|
145
|
+
|
|
146
|
+
### A UI não carrega / ficou em skeleton
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
specs status # a instância está viva?
|
|
150
|
+
curl -sf http://localhost:4321/health # esperado: {"ok":true}
|
|
151
|
+
tail -50 .specs/.run/specs.log # erro na subida?
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Se não está rodando, `specs start`. Para ver o erro direto no terminal: `specs start -f`.
|
|
155
|
+
|
|
156
|
+
### "Port already in use"
|
|
157
|
+
|
|
158
|
+
Outra instância (deste ou de outro projeto) está na mesma porta. Pare-a com `specs stop` no projeto dela, ou suba esta em outra porta: `specs start -p 4322` (ou mude `port` no `.specs/config.json`). Para achar o processo: `lsof -i :4321`.
|
|
159
|
+
|
|
160
|
+
### Veio de uma instalação antiga (`.specs/app/`, `specs:run`, `specs:apply`)
|
|
161
|
+
|
|
162
|
+
O runtime copiado para `.specs/app/` e os scripts/abbrs fish foram substituídos pelo CLI `specs`. Rode `specs install --clean-legacy` para remover o `.specs/app/` e remova as abbrs `specs:*` do seu `config.fish`. Se o seu `SPECS.md` ainda fala de `.specs/app/`, apague-o e rode `specs install` para regenerar.
|
|
163
|
+
|
|
164
|
+
### Botão "Rodar Tarefa" não dispara o agent
|
|
165
|
+
|
|
166
|
+
Conferir `agent.openTerminal` em `.specs/config.json`:
|
|
167
|
+
|
|
168
|
+
- **macOS default:** `"osascript"`. Teste manual:
|
|
169
|
+
```bash
|
|
170
|
+
osascript -e 'tell application "Terminal" to do script "echo ok"'
|
|
171
|
+
```
|
|
172
|
+
Se der erro de permissão: `System Settings → Privacy & Security → Automation` e autorize Terminal/Claude para Terminal.app.
|
|
173
|
+
|
|
174
|
+
- **Linux:** `"gnome-terminal"` / `"kitty"` / `"wezterm"` (conforme sua DE).
|
|
175
|
+
|
|
176
|
+
- **`"none"`:** botão desabilitado; a UI mostra toast explicativo.
|
|
177
|
+
|
|
178
|
+
O prompt enviado ao agent vem de `agent.scopes.<scope>` com placeholders `{feature}`, `{task}`, `{featureTitle}`, `{featurePath}` substituídos. Se o agent `feature-runner` não existir em `.claude/agents/`, a chamada falha silenciosamente.
|
|
179
|
+
|
|
180
|
+
### Mudar a porta do Fastify
|
|
181
|
+
|
|
182
|
+
Edite `.specs/config.json`:
|
|
183
|
+
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"port": 5000,
|
|
187
|
+
...
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Reinicie com `specs stop && specs start`.
|
|
192
|
+
|
|
193
|
+
### "Specs Platform completamente quebrada — nada funciona"
|
|
194
|
+
|
|
195
|
+
Sequência de diagnóstico:
|
|
196
|
+
|
|
197
|
+
1. CLI OK? `specs --version` (reinstale com `npm i -g @mir-code/specs-platform@latest`)
|
|
198
|
+
2. Config OK? `cat .specs/config.json | python3 -m json.tool`
|
|
199
|
+
3. Specs dir OK? `ls .specs/specs/meta.json`
|
|
200
|
+
4. Porta livre? `lsof -i :4321`
|
|
201
|
+
5. Erro na subida? `specs start -f`
|
|
202
|
+
|
|
203
|
+
Se tudo acima está ok e ainda não sobe: `specs install --force` reinstala do zero (atenção: sobrescreve `.specs/config.json` e `.agents/project.md`).
|
|
204
|
+
|
|
205
|
+
## Desinstalar
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
specs stop
|
|
209
|
+
rm -rf .specs/.run .specs/.jobs.json .specs/config.json
|
|
210
|
+
npm rm -g @mir-code/specs-platform
|
|
211
|
+
# .agents/ e os symlinks .claude//.cursor/ podem ficar — os agents funcionam sem a UI.
|
|
212
|
+
# .specs/specs/ também permanece — é seu conteúdo.
|
|
213
|
+
```
|