@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.
Files changed (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +460 -0
  3. package/assets/specs-usage-statusline.sh +77 -0
  4. package/assets/template/.agents/README.md +123 -0
  5. package/assets/template/.agents/RUNTIME.md +64 -0
  6. package/assets/template/.agents/agents/discovery-agent.md +15 -0
  7. package/assets/template/.agents/agents/drawing-agent.md +15 -0
  8. package/assets/template/.agents/agents/feature-runner.md +15 -0
  9. package/assets/template/.agents/agents/refinement-runner.md +15 -0
  10. package/assets/template/.agents/agents/refinement.md +15 -0
  11. package/assets/template/.agents/project.md +158 -0
  12. package/assets/template/.agents/scripts/check-commit.mjs +70 -0
  13. package/assets/template/.agents/scripts/validate-spec.mjs +345 -0
  14. package/assets/template/.agents/skills/discovery-agent/SKILL.md +80 -0
  15. package/assets/template/.agents/skills/discovery-writing/SKILL.md +76 -0
  16. package/assets/template/.agents/skills/drawing-agent/SKILL.md +85 -0
  17. package/assets/template/.agents/skills/drawing-writing/SKILL.md +100 -0
  18. package/assets/template/.agents/skills/execution-protocol/SKILL.md +110 -0
  19. package/assets/template/.agents/skills/execution-protocol/references/git.md +104 -0
  20. package/assets/template/.agents/skills/execution-protocol/references/relatorio-halt.md +103 -0
  21. package/assets/template/.agents/skills/feature-runner/SKILL.md +81 -0
  22. package/assets/template/.agents/skills/feature-runner/references/divergencias.md +38 -0
  23. package/assets/template/.agents/skills/feature-runner/references/implementar.md +80 -0
  24. package/assets/template/.agents/skills/feature-runner/references/localizar.md +46 -0
  25. package/assets/template/.agents/skills/mermaid-diagramming/SKILL.md +198 -0
  26. package/assets/template/.agents/skills/prototype-check/SKILL.md +90 -0
  27. package/assets/template/.agents/skills/refinement/SKILL.md +136 -0
  28. package/assets/template/.agents/skills/refinement/references/estrutura.md +27 -0
  29. package/assets/template/.agents/skills/refinement/references/mapear-terreno.md +46 -0
  30. package/assets/template/.agents/skills/refinement/references/validar-renderizacao.md +29 -0
  31. package/assets/template/.agents/skills/refinement-runner/SKILL.md +145 -0
  32. package/assets/template/.agents/skills/requirements-closure/SKILL.md +236 -0
  33. package/assets/template/.agents/skills/spec-writing/SKILL.md +258 -0
  34. package/assets/template/.agents/skills/test-strategy/SKILL.md +176 -0
  35. package/assets/template/.agents/skills/verification/SKILL.md +143 -0
  36. package/assets/template/.specs/config.json +39 -0
  37. package/assets/template/.specs/discoveries/meta.json +4 -0
  38. package/assets/template/.specs/drawings/meta.json +4 -0
  39. package/assets/template/.specs/specs/_templates/task-backend.md +75 -0
  40. package/assets/template/.specs/specs/_templates/task-frontend.md +89 -0
  41. package/assets/template/.specs/specs/_templates/task-integracao.md +72 -0
  42. package/assets/template/.specs/specs/exemplo/feat-exemplo-primeira-task.md +82 -0
  43. package/assets/template/.specs/specs/exemplo/meta.json +8 -0
  44. package/assets/template/.specs/specs/exemplo/overview.md +45 -0
  45. package/assets/template/.specs/specs/meta.json +4 -0
  46. package/assets/template/SPECS.md +213 -0
  47. package/dist/chunk-SOOETS3N.js +3490 -0
  48. package/dist/chunk-SOOETS3N.js.map +1 -0
  49. package/dist/cli.js +15 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/index.d.ts +69 -0
  52. package/dist/index.js +16 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/ui/assets/abnfDiagram-VCTEODGH-DYXtkHNq.js +2 -0
  55. package/dist/ui/assets/abnfDiagram-VCTEODGH-DYXtkHNq.js.map +1 -0
  56. package/dist/ui/assets/arc-CJs0gz4E.js +2 -0
  57. package/dist/ui/assets/arc-CJs0gz4E.js.map +1 -0
  58. package/dist/ui/assets/architectureDiagram-5GKGNRK7-Br7ZNRfe.js +37 -0
  59. package/dist/ui/assets/architectureDiagram-5GKGNRK7-Br7ZNRfe.js.map +1 -0
  60. package/dist/ui/assets/blockDiagram-I7D4REHJ-172V7R5o.js +130 -0
  61. package/dist/ui/assets/blockDiagram-I7D4REHJ-172V7R5o.js.map +1 -0
  62. package/dist/ui/assets/c4Diagram-7LVT6UL2-B4AYFhRs.js +39 -0
  63. package/dist/ui/assets/c4Diagram-7LVT6UL2-B4AYFhRs.js.map +1 -0
  64. package/dist/ui/assets/channel-BfWO3B41.js +2 -0
  65. package/dist/ui/assets/channel-BfWO3B41.js.map +1 -0
  66. package/dist/ui/assets/chunk-2Q5K7J3B-B-u7gtZN.js +2 -0
  67. package/dist/ui/assets/chunk-2Q5K7J3B-B-u7gtZN.js.map +1 -0
  68. package/dist/ui/assets/chunk-5VM5RSS4-CjFDq_cq.js +16 -0
  69. package/dist/ui/assets/chunk-5VM5RSS4-CjFDq_cq.js.map +1 -0
  70. package/dist/ui/assets/chunk-F27PBJKO-BDYeB7B8.js +2 -0
  71. package/dist/ui/assets/chunk-F27PBJKO-BDYeB7B8.js.map +1 -0
  72. package/dist/ui/assets/chunk-IMKFNOWR-y2kXPnac.js +232 -0
  73. package/dist/ui/assets/chunk-IMKFNOWR-y2kXPnac.js.map +1 -0
  74. package/dist/ui/assets/chunk-JWPE2WC7-DyCryvDN.js +2 -0
  75. package/dist/ui/assets/chunk-JWPE2WC7-DyCryvDN.js.map +1 -0
  76. package/dist/ui/assets/chunk-POPQ4Y6H-DeaxKHvR.js +2 -0
  77. package/dist/ui/assets/chunk-POPQ4Y6H-DeaxKHvR.js.map +1 -0
  78. package/dist/ui/assets/chunk-SVP7TREG-CmcZEncL.js +89 -0
  79. package/dist/ui/assets/chunk-SVP7TREG-CmcZEncL.js.map +1 -0
  80. package/dist/ui/assets/chunk-TICWLB2K-Df1RRXWR.js +207 -0
  81. package/dist/ui/assets/chunk-TICWLB2K-Df1RRXWR.js.map +1 -0
  82. package/dist/ui/assets/chunk-XXDRQBXY-ClTat8Q0.js +2 -0
  83. package/dist/ui/assets/chunk-XXDRQBXY-ClTat8Q0.js.map +1 -0
  84. package/dist/ui/assets/classDiagram-ZZMXUADV-YTUiu8rF.js +2 -0
  85. package/dist/ui/assets/classDiagram-ZZMXUADV-YTUiu8rF.js.map +1 -0
  86. package/dist/ui/assets/classDiagram-v2-VYDZK3BY-YTUiu8rF.js +2 -0
  87. package/dist/ui/assets/classDiagram-v2-VYDZK3BY-YTUiu8rF.js.map +1 -0
  88. package/dist/ui/assets/cose-bilkent-JH36ORCC-QvqQLoy5.js +2 -0
  89. package/dist/ui/assets/cose-bilkent-JH36ORCC-QvqQLoy5.js.map +1 -0
  90. package/dist/ui/assets/cynefin-OW5HDTMX-BY6w3pAQ.js +179 -0
  91. package/dist/ui/assets/cynefin-OW5HDTMX-BY6w3pAQ.js.map +1 -0
  92. package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-luPP4ha1.js +63 -0
  93. package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-luPP4ha1.js.map +1 -0
  94. package/dist/ui/assets/cytoscape.esm-Ix0LnXOy.js +332 -0
  95. package/dist/ui/assets/cytoscape.esm-Ix0LnXOy.js.map +1 -0
  96. package/dist/ui/assets/dagre-GXQ25YYZ-DhpPwKqq.js +5 -0
  97. package/dist/ui/assets/dagre-GXQ25YYZ-DhpPwKqq.js.map +1 -0
  98. package/dist/ui/assets/defaultLocale-DX6XiGOO.js +2 -0
  99. package/dist/ui/assets/defaultLocale-DX6XiGOO.js.map +1 -0
  100. package/dist/ui/assets/diagram-S7CK7UJ4-B9wvQM0w.js +31 -0
  101. package/dist/ui/assets/diagram-S7CK7UJ4-B9wvQM0w.js.map +1 -0
  102. package/dist/ui/assets/diagram-UQ7AKVKN-gm1M_iZS.js +42 -0
  103. package/dist/ui/assets/diagram-UQ7AKVKN-gm1M_iZS.js.map +1 -0
  104. package/dist/ui/assets/diagram-VSXAHHWV-DkEB6nEx.js +4 -0
  105. package/dist/ui/assets/diagram-VSXAHHWV-DkEB6nEx.js.map +1 -0
  106. package/dist/ui/assets/diagram-VX7I27RA-Ce2F1bHi.js +25 -0
  107. package/dist/ui/assets/diagram-VX7I27RA-Ce2F1bHi.js.map +1 -0
  108. package/dist/ui/assets/diagram-Z3DM3KII-B5ArCh-E.js +25 -0
  109. package/dist/ui/assets/diagram-Z3DM3KII-B5ArCh-E.js.map +1 -0
  110. package/dist/ui/assets/ebnfDiagram-PWID7BFC-DgBM80MD.js +2 -0
  111. package/dist/ui/assets/ebnfDiagram-PWID7BFC-DgBM80MD.js.map +1 -0
  112. package/dist/ui/assets/erDiagram-RLTQ6QDP-C161af8G.js +100 -0
  113. package/dist/ui/assets/erDiagram-RLTQ6QDP-C161af8G.js.map +1 -0
  114. package/dist/ui/assets/flowDiagram-HODETNUW-B8N_WyW5.js +169 -0
  115. package/dist/ui/assets/flowDiagram-HODETNUW-B8N_WyW5.js.map +1 -0
  116. package/dist/ui/assets/ganttDiagram-EL5Y4UJY-CD2RJpTb.js +293 -0
  117. package/dist/ui/assets/ganttDiagram-EL5Y4UJY-CD2RJpTb.js.map +1 -0
  118. package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-BrDAzeFT.js +107 -0
  119. package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-BrDAzeFT.js.map +1 -0
  120. package/dist/ui/assets/index-CVWRdirI.css +32 -0
  121. package/dist/ui/assets/index-DoR97Zqf.js +408 -0
  122. package/dist/ui/assets/index-DoR97Zqf.js.map +1 -0
  123. package/dist/ui/assets/infoDiagram-27XIBGKW-HYGaMzrA.js +3 -0
  124. package/dist/ui/assets/infoDiagram-27XIBGKW-HYGaMzrA.js.map +1 -0
  125. package/dist/ui/assets/init-Gi6I4Gst.js +2 -0
  126. package/dist/ui/assets/init-Gi6I4Gst.js.map +1 -0
  127. package/dist/ui/assets/ishikawaDiagram-5VMMS53U-DXTLlBiw.js +71 -0
  128. package/dist/ui/assets/ishikawaDiagram-5VMMS53U-DXTLlBiw.js.map +1 -0
  129. package/dist/ui/assets/journeyDiagram-3NMN7TZE-DSJ8QN1S.js +140 -0
  130. package/dist/ui/assets/journeyDiagram-3NMN7TZE-DSJ8QN1S.js.map +1 -0
  131. package/dist/ui/assets/kanban-definition-UXKFOSKX-Bm5iz0k3.js +90 -0
  132. package/dist/ui/assets/kanban-definition-UXKFOSKX-Bm5iz0k3.js.map +1 -0
  133. package/dist/ui/assets/katex-C5jXJg4s.js +258 -0
  134. package/dist/ui/assets/katex-C5jXJg4s.js.map +1 -0
  135. package/dist/ui/assets/layout-DfJgW6eG.js +2 -0
  136. package/dist/ui/assets/layout-DfJgW6eG.js.map +1 -0
  137. package/dist/ui/assets/linear-B_kyVotV.js +2 -0
  138. package/dist/ui/assets/linear-B_kyVotV.js.map +1 -0
  139. package/dist/ui/assets/mermaid-block-CUJSBQFx.js +2 -0
  140. package/dist/ui/assets/mermaid-block-CUJSBQFx.js.map +1 -0
  141. package/dist/ui/assets/mermaid.core-ExHG1WnM.js +313 -0
  142. package/dist/ui/assets/mermaid.core-ExHG1WnM.js.map +1 -0
  143. package/dist/ui/assets/mindmap-definition-YA3MSWOX-B1Hh9dQz.js +97 -0
  144. package/dist/ui/assets/mindmap-definition-YA3MSWOX-B1Hh9dQz.js.map +1 -0
  145. package/dist/ui/assets/ordinal-Cboi1Yqb.js +2 -0
  146. package/dist/ui/assets/ordinal-Cboi1Yqb.js.map +1 -0
  147. package/dist/ui/assets/pegDiagram-XKGWAZYB-x242yOd7.js +2 -0
  148. package/dist/ui/assets/pegDiagram-XKGWAZYB-x242yOd7.js.map +1 -0
  149. package/dist/ui/assets/pieDiagram-E7YTZNPT-Dl-YP7Xs.js +40 -0
  150. package/dist/ui/assets/pieDiagram-E7YTZNPT-Dl-YP7Xs.js.map +1 -0
  151. package/dist/ui/assets/quadrantDiagram-AXDQQJYC-CMJ920V9.js +8 -0
  152. package/dist/ui/assets/quadrantDiagram-AXDQQJYC-CMJ920V9.js.map +1 -0
  153. package/dist/ui/assets/railroadDiagram-O6MQD6OU-1kV83y5t.js +2 -0
  154. package/dist/ui/assets/railroadDiagram-O6MQD6OU-1kV83y5t.js.map +1 -0
  155. package/dist/ui/assets/requirementDiagram-BXWQKSXE-BFd8ZZD3.js +85 -0
  156. package/dist/ui/assets/requirementDiagram-BXWQKSXE-BFd8ZZD3.js.map +1 -0
  157. package/dist/ui/assets/sankeyDiagram-P5KCCOFB-C0LZevnf.js +41 -0
  158. package/dist/ui/assets/sankeyDiagram-P5KCCOFB-C0LZevnf.js.map +1 -0
  159. package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-BasIXLJ0.js +163 -0
  160. package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-BasIXLJ0.js.map +1 -0
  161. package/dist/ui/assets/sizeCapture-INFHLROL-qAtnqB7N.js +2 -0
  162. package/dist/ui/assets/sizeCapture-INFHLROL-qAtnqB7N.js.map +1 -0
  163. package/dist/ui/assets/stateDiagram-D77RDMKH-CllWDWZP.js +2 -0
  164. package/dist/ui/assets/stateDiagram-D77RDMKH-CllWDWZP.js.map +1 -0
  165. package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-Dwntf8Tk.js +2 -0
  166. package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-Dwntf8Tk.js.map +1 -0
  167. package/dist/ui/assets/swimlanes-42K2YHIH-Bgt0KslH.js +2 -0
  168. package/dist/ui/assets/swimlanes-42K2YHIH-Bgt0KslH.js.map +1 -0
  169. package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-C9abicdw.js +9 -0
  170. package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-C9abicdw.js.map +1 -0
  171. package/dist/ui/assets/timeline-definition-24CTP7MA-BYO2h9Qr.js +121 -0
  172. package/dist/ui/assets/timeline-definition-24CTP7MA-BYO2h9Qr.js.map +1 -0
  173. package/dist/ui/assets/vennDiagram-4TSXK5OY-ZzyiwIUi.js +35 -0
  174. package/dist/ui/assets/vennDiagram-4TSXK5OY-ZzyiwIUi.js.map +1 -0
  175. package/dist/ui/assets/wardleyDiagram-VM6X3IG4-DfjKCK0N.js +79 -0
  176. package/dist/ui/assets/wardleyDiagram-VM6X3IG4-DfjKCK0N.js.map +1 -0
  177. package/dist/ui/assets/xychartDiagram-S5SC5T6Z-Z7daOfmM.js +8 -0
  178. package/dist/ui/assets/xychartDiagram-S5SC5T6Z-Z7daOfmM.js.map +1 -0
  179. package/dist/ui/favicon.svg +6 -0
  180. package/dist/ui/index.html +21 -0
  181. package/package.json +70 -0
  182. package/scripts/copy-ui.mjs +21 -0
  183. 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,8 @@
1
+ {
2
+ "title": "Exemplo",
3
+ "description": "Feature de demonstração — ilustra o formato de specs renderizadas pela Specs Platform.",
4
+ "icon": "sparkles",
5
+ "pages": [
6
+ "feat-exemplo-primeira-task"
7
+ ]
8
+ }
@@ -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,4 @@
1
+ {
2
+ "title": "Specs",
3
+ "pages": ["exemplo"]
4
+ }
@@ -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
+ ```