@jaimevalasek/aioson 1.3.0

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 (288) hide show
  1. package/CHANGELOG.md +456 -0
  2. package/CODE_OF_CONDUCT.md +12 -0
  3. package/CONTRIBUTING.md +13 -0
  4. package/LICENSE +21 -0
  5. package/README.md +254 -0
  6. package/bin/aioson.js +4 -0
  7. package/docs/en/cli-reference.md +398 -0
  8. package/docs/en/i18n.md +52 -0
  9. package/docs/en/json-schemas.md +41 -0
  10. package/docs/en/mcp.md +56 -0
  11. package/docs/en/parallel.md +82 -0
  12. package/docs/en/qa-browser.md +339 -0
  13. package/docs/en/release-flow.md +22 -0
  14. package/docs/en/release-notes-template.md +41 -0
  15. package/docs/en/release.md +28 -0
  16. package/docs/en/schemas/agent-prompt.schema.json +17 -0
  17. package/docs/en/schemas/agents.schema.json +32 -0
  18. package/docs/en/schemas/context-validate.schema.json +36 -0
  19. package/docs/en/schemas/doctor.schema.json +89 -0
  20. package/docs/en/schemas/error.schema.json +24 -0
  21. package/docs/en/schemas/i18n-add.schema.json +15 -0
  22. package/docs/en/schemas/index.json +116 -0
  23. package/docs/en/schemas/info.schema.json +39 -0
  24. package/docs/en/schemas/init.schema.json +48 -0
  25. package/docs/en/schemas/install.schema.json +60 -0
  26. package/docs/en/schemas/locale-apply.schema.json +30 -0
  27. package/docs/en/schemas/mcp-doctor.schema.json +95 -0
  28. package/docs/en/schemas/mcp-init.schema.json +122 -0
  29. package/docs/en/schemas/package-test.schema.json +24 -0
  30. package/docs/en/schemas/parallel-assign.schema.json +57 -0
  31. package/docs/en/schemas/parallel-doctor.schema.json +86 -0
  32. package/docs/en/schemas/parallel-init.schema.json +53 -0
  33. package/docs/en/schemas/parallel-status.schema.json +94 -0
  34. package/docs/en/schemas/setup-context.schema.json +39 -0
  35. package/docs/en/schemas/smoke.schema.json +23 -0
  36. package/docs/en/schemas/update.schema.json +48 -0
  37. package/docs/en/schemas/workflow-plan.schema.json +30 -0
  38. package/docs/en/web3.md +54 -0
  39. package/docs/pt/README.md +46 -0
  40. package/docs/pt/advisor-spec.md +335 -0
  41. package/docs/pt/agentes.md +453 -0
  42. package/docs/pt/cenarios.md +1230 -0
  43. package/docs/pt/clientes-ai.md +224 -0
  44. package/docs/pt/comandos-cli.md +511 -0
  45. package/docs/pt/genome-3.0-spec.md +296 -0
  46. package/docs/pt/guia-engineer.md +226 -0
  47. package/docs/pt/inicio-rapido.md +138 -0
  48. package/docs/pt/profiler-system.md +214 -0
  49. package/docs/pt/runtime-observability.md +72 -0
  50. package/docs/pt/squad-genoma.md +777 -0
  51. package/docs/pt/web3.md +797 -0
  52. package/docs/testing/genome-2.0-manual-regression.md +23 -0
  53. package/docs/testing/genome-2.0-matrix.md +36 -0
  54. package/docs/testing/genome-2.0-rollout.md +184 -0
  55. package/package.json +50 -0
  56. package/src/agents.js +56 -0
  57. package/src/cli.js +497 -0
  58. package/src/commands/agents.js +142 -0
  59. package/src/commands/cloud.js +1767 -0
  60. package/src/commands/config.js +90 -0
  61. package/src/commands/context-validate.js +91 -0
  62. package/src/commands/doctor.js +123 -0
  63. package/src/commands/genome-doctor.js +41 -0
  64. package/src/commands/genome-migrate.js +49 -0
  65. package/src/commands/i18n-add.js +56 -0
  66. package/src/commands/info.js +41 -0
  67. package/src/commands/init.js +75 -0
  68. package/src/commands/install.js +68 -0
  69. package/src/commands/locale-apply.js +51 -0
  70. package/src/commands/locale-diff.js +126 -0
  71. package/src/commands/mcp-doctor.js +406 -0
  72. package/src/commands/mcp-init.js +379 -0
  73. package/src/commands/package-e2e.js +273 -0
  74. package/src/commands/parallel-assign.js +403 -0
  75. package/src/commands/parallel-doctor.js +437 -0
  76. package/src/commands/parallel-init.js +249 -0
  77. package/src/commands/parallel-status.js +290 -0
  78. package/src/commands/qa-doctor.js +185 -0
  79. package/src/commands/qa-init.js +161 -0
  80. package/src/commands/qa-report.js +58 -0
  81. package/src/commands/qa-run.js +873 -0
  82. package/src/commands/qa-scan.js +337 -0
  83. package/src/commands/runtime.js +948 -0
  84. package/src/commands/scan-project.js +1107 -0
  85. package/src/commands/setup-context.js +650 -0
  86. package/src/commands/smoke.js +426 -0
  87. package/src/commands/squad-doctor.js +358 -0
  88. package/src/commands/squad-export.js +46 -0
  89. package/src/commands/squad-pipeline.js +97 -0
  90. package/src/commands/squad-repair-genomes.js +39 -0
  91. package/src/commands/squad-status.js +424 -0
  92. package/src/commands/squad-validate.js +230 -0
  93. package/src/commands/test-agents.js +194 -0
  94. package/src/commands/update.js +55 -0
  95. package/src/commands/workflow-next.js +594 -0
  96. package/src/commands/workflow-plan.js +108 -0
  97. package/src/constants.js +314 -0
  98. package/src/context-parse-reason.js +22 -0
  99. package/src/context-writer.js +150 -0
  100. package/src/context.js +217 -0
  101. package/src/detector.js +261 -0
  102. package/src/doctor.js +289 -0
  103. package/src/execution-gateway.js +461 -0
  104. package/src/genome-files.js +198 -0
  105. package/src/genome-format.js +442 -0
  106. package/src/genome-schema.js +215 -0
  107. package/src/genomes/bindings.js +281 -0
  108. package/src/genomes.js +467 -0
  109. package/src/i18n/index.js +103 -0
  110. package/src/i18n/messages/en.js +784 -0
  111. package/src/i18n/messages/es.js +718 -0
  112. package/src/i18n/messages/fr.js +725 -0
  113. package/src/i18n/messages/pt-BR.js +818 -0
  114. package/src/i18n/scaffold.js +64 -0
  115. package/src/installer.js +232 -0
  116. package/src/lib/genomes/compat.js +206 -0
  117. package/src/lib/genomes/migrate.js +90 -0
  118. package/src/lib/squads/genome-repair.js +49 -0
  119. package/src/locales.js +84 -0
  120. package/src/onboarding.js +305 -0
  121. package/src/parser.js +53 -0
  122. package/src/prompt-tool.js +20 -0
  123. package/src/qa-html-report.js +472 -0
  124. package/src/runtime-store.js +1527 -0
  125. package/src/squads/apply-genome.js +21 -0
  126. package/src/squads/genome-binding-service.js +154 -0
  127. package/src/updater.js +32 -0
  128. package/src/utils.js +46 -0
  129. package/src/version.js +50 -0
  130. package/template/.aioson/advisors/.gitkeep +1 -0
  131. package/template/.aioson/agents/analyst.md +225 -0
  132. package/template/.aioson/agents/architect.md +221 -0
  133. package/template/.aioson/agents/dev.md +201 -0
  134. package/template/.aioson/agents/discovery-design-doc.md +196 -0
  135. package/template/.aioson/agents/genoma.md +300 -0
  136. package/template/.aioson/agents/orchestrator.md +107 -0
  137. package/template/.aioson/agents/pm.md +89 -0
  138. package/template/.aioson/agents/product.md +361 -0
  139. package/template/.aioson/agents/profiler-enricher.md +266 -0
  140. package/template/.aioson/agents/profiler-forge.md +188 -0
  141. package/template/.aioson/agents/profiler-researcher.md +245 -0
  142. package/template/.aioson/agents/qa.md +344 -0
  143. package/template/.aioson/agents/setup.md +381 -0
  144. package/template/.aioson/agents/squad.md +837 -0
  145. package/template/.aioson/agents/ux-ui.md +416 -0
  146. package/template/.aioson/config.md +56 -0
  147. package/template/.aioson/context/.gitkeep +0 -0
  148. package/template/.aioson/context/parallel/.gitkeep +0 -0
  149. package/template/.aioson/context/spec.md.template +37 -0
  150. package/template/.aioson/genomas/.gitkeep +0 -0
  151. package/template/.aioson/locales/en/agents/analyst.md +214 -0
  152. package/template/.aioson/locales/en/agents/architect.md +210 -0
  153. package/template/.aioson/locales/en/agents/dev.md +187 -0
  154. package/template/.aioson/locales/en/agents/discovery-design-doc.md +27 -0
  155. package/template/.aioson/locales/en/agents/genoma.md +212 -0
  156. package/template/.aioson/locales/en/agents/orchestrator.md +105 -0
  157. package/template/.aioson/locales/en/agents/pm.md +77 -0
  158. package/template/.aioson/locales/en/agents/product.md +310 -0
  159. package/template/.aioson/locales/en/agents/profiler-enricher.md +5 -0
  160. package/template/.aioson/locales/en/agents/profiler-forge.md +5 -0
  161. package/template/.aioson/locales/en/agents/profiler-researcher.md +5 -0
  162. package/template/.aioson/locales/en/agents/qa.md +214 -0
  163. package/template/.aioson/locales/en/agents/setup.md +342 -0
  164. package/template/.aioson/locales/en/agents/squad.md +247 -0
  165. package/template/.aioson/locales/en/agents/ux-ui.md +320 -0
  166. package/template/.aioson/locales/es/agents/analyst.md +203 -0
  167. package/template/.aioson/locales/es/agents/architect.md +208 -0
  168. package/template/.aioson/locales/es/agents/dev.md +183 -0
  169. package/template/.aioson/locales/es/agents/discovery-design-doc.md +19 -0
  170. package/template/.aioson/locales/es/agents/genoma.md +102 -0
  171. package/template/.aioson/locales/es/agents/orchestrator.md +108 -0
  172. package/template/.aioson/locales/es/agents/pm.md +81 -0
  173. package/template/.aioson/locales/es/agents/product.md +310 -0
  174. package/template/.aioson/locales/es/agents/profiler-enricher.md +5 -0
  175. package/template/.aioson/locales/es/agents/profiler-forge.md +5 -0
  176. package/template/.aioson/locales/es/agents/profiler-researcher.md +5 -0
  177. package/template/.aioson/locales/es/agents/qa.md +163 -0
  178. package/template/.aioson/locales/es/agents/setup.md +347 -0
  179. package/template/.aioson/locales/es/agents/squad.md +247 -0
  180. package/template/.aioson/locales/es/agents/ux-ui.md +201 -0
  181. package/template/.aioson/locales/fr/agents/analyst.md +203 -0
  182. package/template/.aioson/locales/fr/agents/architect.md +208 -0
  183. package/template/.aioson/locales/fr/agents/dev.md +183 -0
  184. package/template/.aioson/locales/fr/agents/discovery-design-doc.md +19 -0
  185. package/template/.aioson/locales/fr/agents/genoma.md +102 -0
  186. package/template/.aioson/locales/fr/agents/orchestrator.md +108 -0
  187. package/template/.aioson/locales/fr/agents/pm.md +81 -0
  188. package/template/.aioson/locales/fr/agents/product.md +310 -0
  189. package/template/.aioson/locales/fr/agents/profiler-enricher.md +5 -0
  190. package/template/.aioson/locales/fr/agents/profiler-forge.md +5 -0
  191. package/template/.aioson/locales/fr/agents/profiler-researcher.md +5 -0
  192. package/template/.aioson/locales/fr/agents/qa.md +163 -0
  193. package/template/.aioson/locales/fr/agents/setup.md +347 -0
  194. package/template/.aioson/locales/fr/agents/squad.md +247 -0
  195. package/template/.aioson/locales/fr/agents/ux-ui.md +201 -0
  196. package/template/.aioson/locales/pt-BR/agents/analyst.md +217 -0
  197. package/template/.aioson/locales/pt-BR/agents/architect.md +213 -0
  198. package/template/.aioson/locales/pt-BR/agents/dev.md +198 -0
  199. package/template/.aioson/locales/pt-BR/agents/discovery-design-doc.md +198 -0
  200. package/template/.aioson/locales/pt-BR/agents/genoma.md +297 -0
  201. package/template/.aioson/locales/pt-BR/agents/orchestrator.md +108 -0
  202. package/template/.aioson/locales/pt-BR/agents/pm.md +81 -0
  203. package/template/.aioson/locales/pt-BR/agents/product.md +316 -0
  204. package/template/.aioson/locales/pt-BR/agents/profiler-enricher.md +5 -0
  205. package/template/.aioson/locales/pt-BR/agents/profiler-forge.md +5 -0
  206. package/template/.aioson/locales/pt-BR/agents/profiler-researcher.md +5 -0
  207. package/template/.aioson/locales/pt-BR/agents/qa.md +217 -0
  208. package/template/.aioson/locales/pt-BR/agents/setup.md +371 -0
  209. package/template/.aioson/locales/pt-BR/agents/squad.md +772 -0
  210. package/template/.aioson/locales/pt-BR/agents/ux-ui.md +322 -0
  211. package/template/.aioson/mcp/servers.md +24 -0
  212. package/template/.aioson/profiler-reports/.gitkeep +1 -0
  213. package/template/.aioson/schemas/content-blueprint.schema.json +30 -0
  214. package/template/.aioson/schemas/genome-meta.schema.json +150 -0
  215. package/template/.aioson/schemas/genome.schema.json +115 -0
  216. package/template/.aioson/schemas/readiness.schema.json +27 -0
  217. package/template/.aioson/schemas/squad-blueprint.schema.json +172 -0
  218. package/template/.aioson/schemas/squad-manifest.schema.json +276 -0
  219. package/template/.aioson/skills/dynamic/README.md +30 -0
  220. package/template/.aioson/skills/dynamic/cardano-docs.md +16 -0
  221. package/template/.aioson/skills/dynamic/ethereum-docs.md +17 -0
  222. package/template/.aioson/skills/dynamic/flux-ui-docs.md +13 -0
  223. package/template/.aioson/skills/dynamic/laravel-docs.md +41 -0
  224. package/template/.aioson/skills/dynamic/npm-packages.md +16 -0
  225. package/template/.aioson/skills/dynamic/solana-docs.md +16 -0
  226. package/template/.aioson/skills/references/premium-command-center-ui/master-application-prompt.md +79 -0
  227. package/template/.aioson/skills/references/premium-command-center-ui/operational-ux-playbook.md +253 -0
  228. package/template/.aioson/skills/references/premium-command-center-ui/quality-validation-checklist.md +82 -0
  229. package/template/.aioson/skills/references/premium-command-center-ui/visual-system-and-component-patterns.md +270 -0
  230. package/template/.aioson/skills/static/django-patterns.md +342 -0
  231. package/template/.aioson/skills/static/fastapi-patterns.md +344 -0
  232. package/template/.aioson/skills/static/filament-patterns.md +267 -0
  233. package/template/.aioson/skills/static/flux-ui-components.md +262 -0
  234. package/template/.aioson/skills/static/git-conventions.md +227 -0
  235. package/template/.aioson/skills/static/interface-design.md +372 -0
  236. package/template/.aioson/skills/static/jetstream-setup.md +200 -0
  237. package/template/.aioson/skills/static/laravel-conventions.md +491 -0
  238. package/template/.aioson/skills/static/nextjs-patterns.md +321 -0
  239. package/template/.aioson/skills/static/node-express-patterns.md +317 -0
  240. package/template/.aioson/skills/static/node-typescript-patterns.md +282 -0
  241. package/template/.aioson/skills/static/premium-command-center-ui.md +190 -0
  242. package/template/.aioson/skills/static/rails-conventions.md +307 -0
  243. package/template/.aioson/skills/static/react-motion-patterns.md +577 -0
  244. package/template/.aioson/skills/static/static-html-patterns.md +1935 -0
  245. package/template/.aioson/skills/static/tall-stack-patterns.md +286 -0
  246. package/template/.aioson/skills/static/ui-ux-modern.md +75 -0
  247. package/template/.aioson/skills/static/web3-cardano-patterns.md +337 -0
  248. package/template/.aioson/skills/static/web3-ethereum-patterns.md +310 -0
  249. package/template/.aioson/skills/static/web3-security-checklist.md +284 -0
  250. package/template/.aioson/skills/static/web3-solana-patterns.md +324 -0
  251. package/template/.aioson/squads/.artisan/.gitkeep +0 -0
  252. package/template/.aioson/squads/.gitkeep +0 -0
  253. package/template/.aioson/squads/memory.md +5 -0
  254. package/template/.aioson/tasks/squad-analyze.md +83 -0
  255. package/template/.aioson/tasks/squad-create.md +99 -0
  256. package/template/.aioson/tasks/squad-design.md +100 -0
  257. package/template/.aioson/tasks/squad-export.md +20 -0
  258. package/template/.aioson/tasks/squad-extend.md +68 -0
  259. package/template/.aioson/tasks/squad-pipeline.md +122 -0
  260. package/template/.aioson/tasks/squad-repair.md +85 -0
  261. package/template/.aioson/tasks/squad-validate.md +58 -0
  262. package/template/.aioson/templates/squads/content-basic/template.json +21 -0
  263. package/template/.aioson/templates/squads/media-channel/template.json +24 -0
  264. package/template/.aioson/templates/squads/research-analysis/template.json +22 -0
  265. package/template/.aioson/templates/squads/software-delivery/template.json +21 -0
  266. package/template/.claude/commands/aioson/analyst.md +5 -0
  267. package/template/.claude/commands/aioson/architect.md +5 -0
  268. package/template/.claude/commands/aioson/dev.md +5 -0
  269. package/template/.claude/commands/aioson/orchestrator.md +5 -0
  270. package/template/.claude/commands/aioson/pm.md +5 -0
  271. package/template/.claude/commands/aioson/qa.md +5 -0
  272. package/template/.claude/commands/aioson/setup.md +5 -0
  273. package/template/.claude/commands/aioson/ux-ui.md +5 -0
  274. package/template/.gemini/GEMINI.md +10 -0
  275. package/template/.gemini/commands/aios-analyst.toml +4 -0
  276. package/template/.gemini/commands/aios-architect.toml +7 -0
  277. package/template/.gemini/commands/aios-dev.toml +8 -0
  278. package/template/.gemini/commands/aios-discovery-design-doc.toml +4 -0
  279. package/template/.gemini/commands/aios-orchestrator.toml +8 -0
  280. package/template/.gemini/commands/aios-pm.toml +8 -0
  281. package/template/.gemini/commands/aios-product.toml +4 -0
  282. package/template/.gemini/commands/aios-qa.toml +6 -0
  283. package/template/.gemini/commands/aios-setup.toml +3 -0
  284. package/template/.gemini/commands/aios-ux-ui.toml +8 -0
  285. package/template/AGENTS.md +67 -0
  286. package/template/CLAUDE.md +31 -0
  287. package/template/OPENCODE.md +24 -0
  288. package/template/aioson-models.json +40 -0
@@ -0,0 +1,1230 @@
1
+ # Cenários de Uso
2
+
3
+ > Exemplos completos e práticos de como usar o AIOSON em projetos reais.
4
+
5
+ ---
6
+
7
+ ## Cenário 1 — Landing page com formulário (MICRO)
8
+
9
+ **Projeto:** Landing page de captura de leads com formulário de e-mail.
10
+ **Stack:** HTML + Alpine.js + Tailwind + PHP simples para envio de e-mail.
11
+ **Classificação:** MICRO (1 tipo de usuário, 1 integração, sem regras complexas → 1 ponto)
12
+
13
+ ### Passo 1: Instalar e configurar
14
+
15
+ ```bash
16
+ mkdir landing-captura && cd landing-captura
17
+ npx @jaimevalasek/aioson install
18
+ npx @jaimevalasek/aioson setup:context . --defaults \
19
+ --project-name="Landing Captura" \
20
+ --project-type=site \
21
+ --framework="None" \
22
+ --framework-installed=false \
23
+ --classification=MICRO \
24
+ --lang=pt-BR
25
+ ```
26
+
27
+ ### Passo 2: Abrir Claude e ativar @setup
28
+
29
+ No arquivo CLAUDE.md, o contexto já foi lido. Digite:
30
+
31
+ ```
32
+ /setup
33
+ ```
34
+
35
+ **O agente confirma o contexto pré-configurado:**
36
+ ```
37
+ Contexto carregado:
38
+ - Projeto: Landing Captura
39
+ - Tipo: site (MICRO)
40
+ - Framework: Nenhum detectado
41
+ - Idioma: pt-BR
42
+
43
+ Classificação MICRO confirmada (0 pts): 1 tipo de usuário, sem integrações, sem regras complexas.
44
+
45
+ Plano: @setup → @dev
46
+ Próximo passo: ative /dev e descreva o que o projeto precisa ter.
47
+ ```
48
+
49
+ > **Nota:** As flags `--defaults` acima pré-preenchem o contexto sem perguntas interativas.
50
+ > Se preferir o fluxo guiado, basta rodar `npx @jaimevalasek/aioson setup:context` sem flags — o agente
51
+ > vai fazer as perguntas e identificar o projeto a partir da sua descrição.
52
+
53
+ ### Passo 3: Ativar @dev diretamente
54
+
55
+ ```
56
+ /dev
57
+
58
+ Preciso de uma landing page com:
59
+ - Hero section com headline e CTA
60
+ - Formulário de captura de e-mail (nome + e-mail)
61
+ - Envio por PHP para um arquivo de log (sem banco)
62
+ - Design limpo com Tailwind
63
+ ```
64
+
65
+ **O @dev entrega:**
66
+ - `index.html` com estrutura completa
67
+ - `style.css` ou classes Tailwind inline
68
+ - `submit.php` para processar o formulário
69
+ - Validação básica no frontend e backend
70
+
71
+ ### Por que MICRO?
72
+
73
+ Não precisa de @analyst (domínio simples), não precisa de @architect (estrutura trivial), não precisa de @qa (sem lógica crítica a testar). O @dev tem contexto suficiente para entregar direto.
74
+
75
+ > Se até num projeto MICRO o pedido vier muito vago, você ainda pode encaixar `@discovery-design-doc` antes do `@dev`. Isso é exceção útil, não fluxo padrão.
76
+
77
+ ---
78
+
79
+ ## Cenário 2 — API REST com autenticação (SMALL)
80
+
81
+ **Projeto:** API para gerenciar agendamentos de uma clínica médica.
82
+ **Stack:** Laravel 11 + PostgreSQL + Sanctum.
83
+ **Classificação:** SMALL (3 tipos de usuário=2pt, 2 integrações=1pt → 3 pontos)
84
+
85
+ ### Passo 1: Instalar
86
+
87
+ ```bash
88
+ # Laravel já está instalado e configurado
89
+ cd minha-clinica-api
90
+ npx @jaimevalasek/aioson install
91
+ npx @jaimevalasek/aioson setup:context . --defaults \
92
+ --project-name="Clinica API" \
93
+ --project-type=api \
94
+ --framework=Laravel \
95
+ --framework-installed=true \
96
+ --classification=SMALL \
97
+ --lang=pt-BR
98
+ ```
99
+
100
+ ### Passo 2: Verificar saúde
101
+
102
+ ```bash
103
+ npx @jaimevalasek/aioson doctor
104
+ ```
105
+
106
+ ### Passo 3: @setup
107
+
108
+ ```
109
+ /setup
110
+ ```
111
+
112
+ **O agente confirma:**
113
+ ```
114
+ Contexto carregado:
115
+ - Projeto: Clinica API (SMALL)
116
+ - Framework: Laravel 11 (instalado ✓)
117
+ - Classificação: SMALL
118
+
119
+ Plano: @setup → @product → @analyst → @architect → @dev → @qa
120
+
121
+ Próximo passo: /product
122
+ Objetivo: gerar o PRD base antes de mapear pacientes, médicos, agendamentos e regras de negócio.
123
+ ```
124
+
125
+ ### Passo 4: @product — PRD base
126
+
127
+ ```
128
+ /product
129
+ ```
130
+
131
+ **O @product registra no `prd.md`:**
132
+ - visão do produto
133
+ - usuários principais
134
+ - escopo inicial do MVP
135
+ - perguntas em aberto
136
+
137
+ ### Passo 5: @analyst — Descoberta do domínio
138
+
139
+ ```
140
+ /analyst
141
+ ```
142
+
143
+ **O agente faz suas 6 perguntas:**
144
+
145
+ ```
146
+ 1. Quem são os tipos de usuário?
147
+ ```
148
+ *Você responde:* Paciente, Médico, Recepcionista
149
+
150
+ ```
151
+ 2. Qual o fluxo principal que gera valor?
152
+ ```
153
+ *Você responde:* Paciente agenda consulta → médico confirma → recepcionista valida presença
154
+
155
+ ```
156
+ 3. Existe processo manual hoje?
157
+ ```
158
+ *Você responde:* Sim, tudo é feito por telefone e planilha Excel
159
+
160
+ ```
161
+ 4. Quais são as regras de negócio críticas?
162
+ ```
163
+ *Você responde:*
164
+ - Médico só pode ter 1 consulta por horário
165
+ - Cancelamento até 24h antes sem penalidade
166
+ - Paciente não pode ter 2 consultas no mesmo dia com o mesmo médico
167
+
168
+ ```
169
+ 5. Integrações externas?
170
+ ```
171
+ *Você responde:* Envio de e-mail de confirmação (SMTP) e SMS via Twilio
172
+
173
+ ```
174
+ 6. Dados sensíveis?
175
+ ```
176
+ *Você responde:* Dados de saúde dos pacientes (LGPD)
177
+
178
+ **O @analyst entrega** `.aioson/context/discovery.md`:
179
+ ```markdown
180
+ ## Entidades principais
181
+
182
+ | Entidade | Atributos principais | Restrições |
183
+ |--------------|-----------------------------------------------|------------------------------|
184
+ | User | id, name, email, role, password | role: patient/doctor/staff |
185
+ | Doctor | id, user_id, crm, specialty, schedule_config | CRM único |
186
+ | Patient | id, user_id, cpf, birth_date, health_notes | CPF único, dados LGPD |
187
+ | Appointment | id, doctor_id, patient_id, date, status | 1 por médico/horário |
188
+ | TimeSlot | id, doctor_id, starts_at, ends_at, available | — |
189
+
190
+ ## Regras de negócio
191
+ - RN01: 1 consulta por médico por horário (check no create)
192
+ - RN02: Cancelamento livre até 24h antes
193
+ - RN03: 1 consulta por paciente/médico por dia
194
+
195
+ ## Integrações
196
+ - SMTP (Laravel Mail) — confirmação de agendamento
197
+ - Twilio SMS — lembrete 1h antes
198
+
199
+ ## Riscos
200
+ - LGPD: health_notes precisa de criptografia ou controle de acesso
201
+ - Conflito de horários: critical path, requer lock otimista
202
+ ```
203
+
204
+ ### Onde `@discovery-design-doc` entraria neste cenário
205
+
206
+ Se antes do `@analyst` você ainda não souber bem:
207
+ - o recorte do MVP
208
+ - o que fica fora de escopo
209
+ - quais módulos atuais serão afetados
210
+ - ou se a API já está pronta para implementação
211
+
212
+ vale inserir:
213
+
214
+ ```text
215
+ @setup -> @discovery-design-doc -> @analyst -> @architect -> @dev
216
+ ```
217
+
218
+ Isso ajuda especialmente quando o projeto já existe e a clínica quer adicionar uma feature grande sem sair codando cedo demais.
219
+
220
+ ### Passo 5: @architect — Estrutura do projeto
221
+
222
+ ```
223
+ /architect
224
+ ```
225
+
226
+ **O @architect lê o discovery e entrega** `.aioson/context/architecture.md`:
227
+
228
+ ```
229
+ Classificação: SMALL → estrutura Laravel padrão, sem sub-pastas excessivas
230
+
231
+ app/
232
+ Actions/
233
+ CreateAppointmentAction.php
234
+ CancelAppointmentAction.php
235
+ Http/
236
+ Controllers/
237
+ AppointmentController.php
238
+ DoctorController.php
239
+ Requests/
240
+ CreateAppointmentRequest.php
241
+ Models/
242
+ User.php, Doctor.php, Patient.php, Appointment.php
243
+ Policies/
244
+ AppointmentPolicy.php
245
+ Events/
246
+ AppointmentCreated.php
247
+ AppointmentCancelled.php
248
+ Listeners/
249
+ SendConfirmationEmail.php
250
+ SendSmsReminder.php
251
+
252
+ database/migrations/
253
+ resources/ (apenas para erros API)
254
+ routes/api.php
255
+ tests/Feature/AppointmentTest.php
256
+ ```
257
+
258
+ **Decisões técnicas:**
259
+ - Auth: Sanctum (tokens de API)
260
+ - N+1: Eager loading em todos os índices (with('doctor.user', 'patient.user'))
261
+ - Timezone: UTC no banco, conversão na camada de apresentação
262
+
263
+ ### Passo 6: @dev — Implementação
264
+
265
+ ```
266
+ /dev
267
+
268
+ Implemente a feature de agendamentos primeiro.
269
+ Comece pela migration, model, action e controller.
270
+ ```
271
+
272
+ **O @dev implementa seguindo as convenções:**
273
+
274
+ ```php
275
+ // app/Actions/CreateAppointmentAction.php
276
+ class CreateAppointmentAction
277
+ {
278
+ public function execute(array $data): Appointment
279
+ {
280
+ // RN01: verificar conflito de horário
281
+ $conflict = Appointment::where('doctor_id', $data['doctor_id'])
282
+ ->where('date', $data['date'])
283
+ ->where('status', '!=', 'cancelled')
284
+ ->exists();
285
+
286
+ if ($conflict) {
287
+ throw new AppointmentConflictException();
288
+ }
289
+
290
+ // RN03: verificar duplicata paciente/médico/dia
291
+ $duplicate = Appointment::where([
292
+ 'patient_id' => $data['patient_id'],
293
+ 'doctor_id' => $data['doctor_id'],
294
+ ])->whereDate('date', $data['date'])->exists();
295
+
296
+ if ($duplicate) {
297
+ throw new DuplicateAppointmentException();
298
+ }
299
+
300
+ $appointment = Appointment::create($data);
301
+ AppointmentCreated::dispatch($appointment);
302
+ return $appointment;
303
+ }
304
+ }
305
+ ```
306
+
307
+ ### Passo 7: @qa — Testes
308
+
309
+ ```
310
+ /qa
311
+
312
+ Revise a CreateAppointmentAction e escreva os testes para:
313
+ - criação com sucesso
314
+ - conflito de horário (RN01)
315
+ - duplicata paciente (RN03)
316
+ - cancelamento fora do prazo (RN02)
317
+ ```
318
+
319
+ **O @qa entrega** `tests/Feature/AppointmentTest.php` com todos os casos.
320
+
321
+ ---
322
+
323
+ ## Cenário 3 — SaaS multi-tenant (MEDIUM)
324
+
325
+ **Projeto:** Plataforma SaaS de gestão de projetos para agências digitais.
326
+ **Stack:** Next.js 14 (App Router) + Prisma + PostgreSQL + Stripe.
327
+ **Usuários:** Admin da agência, Gerente de projeto, Cliente (visualização).
328
+ **Classificação:** MEDIUM (3 usuários=2pt, 3+ integrações=2pt, regras complexas=2pt → 6 pontos)
329
+
330
+ ### Passo 1: Instalar
331
+
332
+ ```bash
333
+ npx create-next-app@latest saas-agencia --typescript
334
+ cd saas-agencia
335
+ npx @jaimevalasek/aioson install
336
+ npx @jaimevalasek/aioson setup:context . --defaults \
337
+ --project-name="Agency SaaS" \
338
+ --project-type=web_app \
339
+ --framework="Next.js" \
340
+ --framework-installed=true \
341
+ --classification=MEDIUM \
342
+ --lang=pt-BR
343
+ ```
344
+
345
+ ### Passo 2: @setup
346
+
347
+ ```
348
+ /setup
349
+ ```
350
+
351
+ **O agente confirma o plano MEDIUM completo:**
352
+ ```
353
+ Plano de execução:
354
+ 1. /product → PRD base vivo
355
+ 2. /analyst → discovery e modelagem de domínio
356
+ 3. /architect → estrutura de pastas Next.js MEDIUM + decisões técnicas
357
+ 4. /ux-ui → sistema de design e componentes
358
+ 5. /pm → priorização e critérios de aceite no PRD vivo
359
+ 6. /orchestrator → lanes de desenvolvimento paralelo
360
+ 7. /dev → implementação por lane
361
+ 8. /qa → revisão e testes
362
+
363
+ Próximo: /product
364
+ ```
365
+
366
+ ### Passo 3: @product
367
+
368
+ ```
369
+ /product
370
+ ```
371
+
372
+ **O @product gera o PRD base** com visão, problema, usuários, MVP inicial e direção visual.
373
+
374
+ ### Passo 4: @analyst
375
+
376
+ O analista descobre:
377
+ - **Entidades:** Organization, Project, Task, User, Invoice, Subscription
378
+ - **Multi-tenancy:** Cada organização é isolada (Row-Level Security)
379
+ - **Integrações:** Stripe (billing), GitHub (integração de commits), Slack (notificações), S3 (uploads)
380
+ - **Regras:** Plano free = máx 3 projetos, Plano pro = ilimitado; cobrança proporcional por membro
381
+
382
+ ### Passo 5: @architect
383
+
384
+ Para MEDIUM com Next.js App Router:
385
+
386
+ ```
387
+ src/
388
+ app/
389
+ (auth)/login/page.tsx
390
+ (dashboard)/
391
+ layout.tsx ← verifica tenant
392
+ projects/page.tsx
393
+ projects/[id]/page.tsx
394
+ api/
395
+ webhooks/stripe/route.ts
396
+ components/
397
+ ui/ ← Button, Input, Modal (design system)
398
+ features/
399
+ projects/ProjectCard.tsx
400
+ tasks/TaskBoard.tsx
401
+ lib/
402
+ db/prisma.ts
403
+ auth/session.ts
404
+ billing/stripe.ts
405
+ actions/ ← Server Actions
406
+ project.actions.ts
407
+ task.actions.ts
408
+ types/
409
+ ```
410
+
411
+ ### Passo 6: @ux-ui
412
+
413
+ ```
414
+ /ux-ui
415
+
416
+ Precisamos de:
417
+ - Dashboard principal com lista de projetos
418
+ - Board Kanban para tarefas
419
+ - Sidebar com navegação entre projetos
420
+ - Página de configurações de billing
421
+ ```
422
+
423
+ **O @ux-ui entrega** `.aioson/context/ui-spec.md`:
424
+ - Tokens: primary=#6366F1, gray scale, radius-md=8px
425
+ - Componentes: ProjectCard, TaskCard, KanbanBoard, Sidebar, BillingModal
426
+ - Estados: loading skeleton, empty state, error state para cada componente
427
+ - Acessibilidade: foco visível, ARIA labels em boards interativos
428
+
429
+ ### Passo 7: @pm
430
+
431
+ ```
432
+ /pm
433
+ ```
434
+
435
+ **O @pm enriquece** `.aioson/context/prd.md` preservando visão, usuários e identidade visual. O foco passa a ser priorização, fases e critérios de aceite compactos:
436
+
437
+ ```markdown
438
+ ## Escopo do MVP
439
+ ### Must-have 🔴
440
+ - Criar e gerenciar projetos
441
+ - Operar board Kanban com atribuição
442
+ - Convidar membros por e-mail
443
+
444
+ ## Plano de entrega
445
+ ### Fase 1 — Núcleo
446
+ 1. Projetos e permissões
447
+ 2. Board Kanban
448
+ 3. Convites e limites do plano
449
+
450
+ ### Fase 2 — Monetização
451
+ 1. Billing e Stripe
452
+ 2. Regras de bloqueio por plano
453
+
454
+ ## Criterios de aceite
455
+ | AC | Descricao |
456
+ |---|---|
457
+ | AC-01 | Admin cria projeto com nome, descricao e deadline |
458
+ | AC-02 | Board possui colunas To Do / In Progress / Done |
459
+ | AC-03 | Convite por e-mail expira em 48h |
460
+ | AC-04 | Conta free respeita limite de projetos |
461
+ ```
462
+
463
+ ### Passo 8: @orchestrator
464
+
465
+ ```
466
+ /orchestrator
467
+ ```
468
+
469
+ Ou via CLI:
470
+ ```bash
471
+ npx @jaimevalasek/aioson parallel:init --workers=3
472
+ npx @jaimevalasek/aioson parallel:assign --source=prd --workers=3
473
+ ```
474
+
475
+ **O orquestrador cria 3 lanes:**
476
+
477
+ ```
478
+ Lane 1 (@dev instância A):
479
+ - Auth + Multi-tenancy (Organization, User, middleware)
480
+ - US-03: Sistema de convites
481
+
482
+ Lane 2 (@dev instância B):
483
+ - US-01: CRUD de projetos
484
+ - US-02: Board Kanban + drag-and-drop
485
+
486
+ Lane 3 (@dev instância C):
487
+ - US-04: Integração Stripe
488
+ - Webhook handler
489
+ - Página de billing
490
+ ```
491
+
492
+ **Cada @dev instance** lê seu lane file:
493
+ ```
494
+ Lane 1: /dev Implemente o escopo do agent-1.status.md
495
+ Lane 2: /dev Implemente o escopo do agent-2.status.md
496
+ Lane 3: /dev Implemente o escopo do agent-3.status.md
497
+ ```
498
+
499
+ **Monitorar progresso:**
500
+ ```bash
501
+ npx @jaimevalasek/aioson parallel:status
502
+ ```
503
+
504
+ ### Passo 8: @qa
505
+
506
+ ```
507
+ /qa
508
+
509
+ Revise as implementações das 3 lanes e escreva testes para:
510
+ - Isolamento de tenant (crítico)
511
+ - Fluxo de billing e webhook Stripe
512
+ - Permissões por role (admin vs gerente vs cliente)
513
+ ```
514
+
515
+ ---
516
+
517
+ ## Cenário 4 — dApp Ethereum (MEDIUM)
518
+
519
+ **Projeto:** Marketplace de NFTs com contrato de royalties.
520
+ **Stack:** Hardhat + Solidity + Next.js + wagmi + RainbowKit.
521
+ **Classificação:** MEDIUM (múltiplos usuários, Web3 + frontend, regras de contrato complexas)
522
+
523
+ ### Passo 1: Instalar
524
+
525
+ ```bash
526
+ mkdir nft-marketplace && cd nft-marketplace
527
+ npx create-next-app@latest frontend --typescript
528
+ npx hardhat init # no mesmo diretório raiz
529
+ npx @jaimevalasek/aioson install
530
+ npx @jaimevalasek/aioson setup:context . --defaults \
531
+ --project-name="NFT Marketplace" \
532
+ --project-type=dapp \
533
+ --framework=Hardhat \
534
+ --framework-installed=true \
535
+ --classification=MEDIUM \
536
+ --web3-enabled=true \
537
+ --web3-networks=ethereum \
538
+ --contract-framework=Hardhat \
539
+ --wallet-provider=wagmi \
540
+ --lang=pt-BR
541
+ ```
542
+
543
+ > **Nota:** Se Hardhat e Next.js coexistem no mesmo diretório, o AIOSON detecta automaticamente como **monorepo** e exibe um aviso de configuração.
544
+
545
+ ### Passo 2: @analyst
546
+
547
+ O analista identifica:
548
+ - **Buyer:** compra NFTs via marketplace
549
+ - **Creator:** lista NFTs com royalty configurado
550
+ - **Marketplace:** cobra fee sobre cada venda
551
+
552
+ **Entidades on-chain:**
553
+ | Entidade | Tipo | Notas |
554
+ |---|---|---|
555
+ | NFT | ERC-721 | tokenURI no IPFS |
556
+ | Listing | struct | price, seller, royaltyBps |
557
+ | Sale | event | buyer, seller, price, royalty |
558
+
559
+ **Regras críticas:**
560
+ - RN01: Royalty máximo de 10% (1000 bps)
561
+ - RN02: Reentrancy guard em todas as funções de pagamento
562
+ - RN03: Withdraw pattern para pagamentos (nunca push)
563
+
564
+ ### Passo 3: @architect
565
+
566
+ **Estrutura monorepo:**
567
+ ```
568
+ contracts/
569
+ Marketplace.sol
570
+ NFT.sol
571
+ interfaces/IMarketplace.sol
572
+ scripts/
573
+ deploy.js
574
+ test/
575
+ Marketplace.test.js
576
+ frontend/
577
+ src/
578
+ app/
579
+ marketplace/page.tsx
580
+ create/page.tsx
581
+ components/
582
+ NFTCard.tsx
583
+ ListingModal.tsx
584
+ hooks/
585
+ useMarketplace.ts ← wagmi hooks
586
+ lib/
587
+ contracts.ts ← ABIs e endereços
588
+ ```
589
+
590
+ ### Passo 4: @dev (contratos)
591
+
592
+ ```
593
+ /dev
594
+
595
+ Implemente o contrato Marketplace.sol com:
596
+ - ERC-721 listing
597
+ - Royalties on-chain
598
+ - Reentrancy guard (OpenZeppelin)
599
+ - Withdraw pattern para pagamentos
600
+ ```
601
+
602
+ **O @dev escreve:**
603
+ ```solidity
604
+ // SPDX-License-Identifier: MIT
605
+ pragma solidity ^0.8.20;
606
+
607
+ import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
608
+ import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
609
+
610
+ contract Marketplace is ReentrancyGuard {
611
+ struct Listing {
612
+ address seller;
613
+ uint256 price;
614
+ uint256 royaltyBps; // base points: 1000 = 10%
615
+ address royaltyRecipient;
616
+ }
617
+
618
+ mapping(address => mapping(uint256 => Listing)) public listings;
619
+ mapping(address => uint256) public pendingWithdrawals; // pull pattern
620
+
621
+ uint256 public constant MAX_ROYALTY_BPS = 1000;
622
+
623
+ function buyNFT(address nftContract, uint256 tokenId)
624
+ external payable nonReentrant
625
+ {
626
+ Listing memory listing = listings[nftContract][tokenId];
627
+ require(msg.value >= listing.price, "Insufficient payment");
628
+
629
+ uint256 royalty = (listing.price * listing.royaltyBps) / 10000;
630
+ uint256 sellerAmount = listing.price - royalty;
631
+
632
+ // Acumular (não enviar direto — evita reentrancy)
633
+ pendingWithdrawals[listing.royaltyRecipient] += royalty;
634
+ pendingWithdrawals[listing.seller] += sellerAmount;
635
+
636
+ delete listings[nftContract][tokenId];
637
+ IERC721(nftContract).safeTransferFrom(listing.seller, msg.sender, tokenId);
638
+ }
639
+
640
+ function withdraw() external nonReentrant {
641
+ uint256 amount = pendingWithdrawals[msg.sender];
642
+ require(amount > 0, "Nothing to withdraw");
643
+ pendingWithdrawals[msg.sender] = 0;
644
+ payable(msg.sender).transfer(amount);
645
+ }
646
+ }
647
+ ```
648
+
649
+ ### Passo 5: @qa (auditoria de contrato)
650
+
651
+ ```
652
+ /qa
653
+
654
+ Audite o Marketplace.sol para:
655
+ - Vulnerabilidades de reentrancy
656
+ - Integer overflow/underflow
657
+ - Access control
658
+ - Edge cases no withdraw pattern
659
+ Escreva testes Hardhat cobrindo todos os cenários críticos.
660
+ ```
661
+
662
+ ---
663
+
664
+ ## Cenário 5 — API Node.js com Fastify (SMALL)
665
+
666
+ **Projeto:** API de gerenciamento de pedidos para restaurante.
667
+ **Stack:** Node.js + Fastify + PostgreSQL + Prisma + JWT.
668
+ **Classificação:** SMALL (2 tipos de usuário=1pt, 2 integrações=1pt, algumas regras=1pt → 3 pontos)
669
+
670
+ ### Passo 1: Instalar
671
+
672
+ ```bash
673
+ mkdir restaurante-api && cd restaurante-api
674
+ npm init -y
675
+ npm install fastify @prisma/client
676
+ npm install -D prisma
677
+ npx @jaimevalasek/aioson install
678
+ npx @jaimevalasek/aioson setup:context . --defaults \
679
+ --project-name="Restaurante API" \
680
+ --project-type=api \
681
+ --framework="Node" \
682
+ --framework-installed=true \
683
+ --classification=SMALL \
684
+ --lang=pt-BR
685
+ ```
686
+
687
+ ### Passo 2: @setup
688
+
689
+ ```
690
+ /setup
691
+ ```
692
+
693
+ **O agente confirma:**
694
+ ```
695
+ Framework detectado: Node.js (package.json ✓)
696
+ Projeto: Restaurante API (SMALL)
697
+
698
+ Plano: @setup → @product → @analyst → @architect → @dev → @qa
699
+ Próximo: /product
700
+ ```
701
+
702
+ ### Passo 3: @product
703
+
704
+ ```
705
+ /product
706
+ ```
707
+
708
+ **O @product gera o PRD base** com visão, usuários, escopo do MVP e fora do escopo.
709
+
710
+ ### Passo 4: @analyst
711
+
712
+ ```
713
+ /analyst
714
+ ```
715
+
716
+ *Você responde às perguntas:*
717
+
718
+ - **Usuários:** Garçom (cria pedidos), Cozinha (atualiza status)
719
+ - **Fluxo principal:** Garçom abre mesa → adiciona itens → cozinha vê e prepara → garçom fecha conta
720
+ - **Regras críticas:**
721
+ - Pedido não pode ser fechado com itens pendentes
722
+ - Item cancelado não volta ao estoque (soft delete no pedido)
723
+ - Mesa só pode ter 1 pedido aberto por vez
724
+ - **Integrações:** WhatsApp (aviso ao garçom quando prato fica pronto), impressora fiscal
725
+
726
+ **O @analyst entrega** `.aioson/context/discovery.md`:
727
+
728
+ ```markdown
729
+ ## Entidades principais
730
+
731
+ | Entidade | Atributos | Restrições |
732
+ |-------------|------------------------------------------|----------------------------------|
733
+ | Table | id, number, status (free/occupied) | 1 pedido aberto por vez |
734
+ | Order | id, table_id, status, opened_at | closed só se itens = ready |
735
+ | OrderItem | id, order_id, menu_item_id, qty, status | status: pending/ready/cancelled |
736
+ | MenuItem | id, name, price, category, available | — |
737
+ | User | id, name, role (waiter/kitchen) | JWT auth por role |
738
+
739
+ ## Regras de negócio
740
+ - RN01: Mesa não pode ter 2 pedidos abertos simultaneamente
741
+ - RN02: Pedido só fecha se todos os itens estiverem ready ou cancelled
742
+ - RN03: Garçom só vê suas próprias mesas; cozinha vê tudo
743
+
744
+ ## Integrações
745
+ - WhatsApp API (Evolution API) — notificação quando item fica pronto
746
+ - Impressora fiscal — payload no fechamento do pedido
747
+ ```
748
+
749
+ ### Passo 4: @architect
750
+
751
+ ```
752
+ /architect
753
+ ```
754
+
755
+ **O @architect entrega** `.aioson/context/architecture.md`:
756
+
757
+ ```
758
+ Classificação: SMALL → estrutura Fastify por domínio
759
+
760
+ src/
761
+ plugins/
762
+ prisma.js ← decorador global do cliente Prisma
763
+ auth.js ← fastify-jwt plugin
764
+ routes/
765
+ orders/
766
+ index.js ← GET /orders, POST /orders
767
+ [id].js ← GET, PATCH, DELETE /orders/:id
768
+ items/
769
+ index.js
770
+ tables/
771
+ index.js
772
+ services/
773
+ order.service.js ← regras de negócio (RN01, RN02)
774
+ notification.service.js ← WhatsApp integration
775
+ schemas/
776
+ order.schema.js ← Fastify JSON Schema para validação
777
+ app.js
778
+
779
+ prisma/
780
+ schema.prisma
781
+ migrations/
782
+
783
+ test/
784
+ orders.test.js
785
+ ```
786
+
787
+ **Decisões técnicas:**
788
+ - Auth: `fastify-jwt` com roles no payload (`{ id, role }`)
789
+ - Validação: Fastify JSON Schema (não Zod — evitar overhead)
790
+ - ORM: Prisma (type-safe, migrations automáticas)
791
+
792
+ ### Passo 5: @dev
793
+
794
+ ```
795
+ /dev
796
+
797
+ Implemente a rota POST /orders e o OrderService.
798
+ Inclua a validação RN01 (mesa com pedido aberto).
799
+ ```
800
+
801
+ **O @dev implementa:**
802
+
803
+ ```javascript
804
+ // src/services/order.service.js
805
+ class OrderService {
806
+ constructor(prisma) {
807
+ this.prisma = prisma;
808
+ }
809
+
810
+ async create({ tableId, waiterId }) {
811
+ // RN01: verificar mesa livre
812
+ const open = await this.prisma.order.findFirst({
813
+ where: { tableId, status: { in: ['open', 'in_progress'] } },
814
+ });
815
+ if (open) {
816
+ throw new Error('Table already has an open order');
817
+ }
818
+
819
+ return this.prisma.order.create({
820
+ data: { tableId, waiterId, status: 'open' },
821
+ });
822
+ }
823
+
824
+ async close(orderId) {
825
+ // RN02: verificar itens pendentes
826
+ const pending = await this.prisma.orderItem.count({
827
+ where: { orderId, status: 'pending' },
828
+ });
829
+ if (pending > 0) {
830
+ throw new Error('Cannot close order with pending items');
831
+ }
832
+
833
+ return this.prisma.order.update({
834
+ where: { id: orderId },
835
+ data: { status: 'closed', closedAt: new Date() },
836
+ });
837
+ }
838
+ }
839
+
840
+ module.exports = { OrderService };
841
+ ```
842
+
843
+ ```javascript
844
+ // src/routes/orders/index.js
845
+ module.exports = async function orderRoutes(fastify) {
846
+ const service = new OrderService(fastify.prisma);
847
+
848
+ fastify.post('/', {
849
+ preHandler: [fastify.authenticate, fastify.requireRole('waiter')],
850
+ schema: {
851
+ body: { type: 'object', required: ['tableId'], properties: {
852
+ tableId: { type: 'integer' }
853
+ }},
854
+ },
855
+ }, async (request, reply) => {
856
+ const order = await service.create({
857
+ tableId: request.body.tableId,
858
+ waiterId: request.user.id,
859
+ });
860
+ return reply.code(201).send(order);
861
+ });
862
+ };
863
+ ```
864
+
865
+ ### Passo 6: @qa
866
+
867
+ ```
868
+ /qa
869
+
870
+ Escreva testes para o OrderService:
871
+ - criação com sucesso
872
+ - RN01: mesa com pedido aberto (deve lançar erro)
873
+ - RN02: fechamento com itens pendentes (deve lançar erro)
874
+ - fechamento com sucesso
875
+ ```
876
+
877
+ ---
878
+
879
+ ## Cenário 6 — Aplicação Rails + Hotwire (SMALL)
880
+
881
+ **Projeto:** Plataforma colaborativa de gerenciamento de tarefas.
882
+ **Stack:** Rails 7 + PostgreSQL + Hotwire (Turbo + Stimulus) + Tailwind CSS.
883
+ **Classificação:** SMALL (2 tipos de usuário=1pt, 1 integração=1pt, algumas regras=1pt → 3 pontos)
884
+
885
+ ### Passo 1: Instalar
886
+
887
+ ```bash
888
+ rails new task-app --database=postgresql --css=tailwind
889
+ cd task-app
890
+ npx @jaimevalasek/aioson install
891
+ npx @jaimevalasek/aioson setup:context . --defaults \
892
+ --project-name="Task App" \
893
+ --project-type=web_app \
894
+ --framework="Rails" \
895
+ --framework-installed=true \
896
+ --classification=SMALL \
897
+ --lang=pt-BR
898
+ ```
899
+
900
+ ### Passo 2: @setup
901
+
902
+ ```
903
+ /setup
904
+ ```
905
+
906
+ **O agente confirma:**
907
+ ```
908
+ Framework detectado: Rails (config/application.rb ✓)
909
+ Versão: Rails 7.x
910
+
911
+ Plano: @setup → @product → @analyst → @architect → @dev → @qa
912
+ Próximo: /product
913
+ ```
914
+
915
+ ### Passo 3: @product
916
+
917
+ ```
918
+ /product
919
+ ```
920
+
921
+ **O @product gera o PRD base** com visão, usuários, escopo do MVP e fora do escopo.
922
+
923
+ ### Passo 4: @analyst
924
+
925
+ *Você responde às perguntas:*
926
+
927
+ - **Usuários:** Admin (cria projetos e convida membros), Membro (cria e move tarefas)
928
+ - **Fluxo:** Admin cria projeto → convida membros → membros criam e movem tarefas entre colunas (To Do / In Progress / Done)
929
+ - **Regras:**
930
+ - Tarefa só pode ser atribuída a membros do mesmo projeto
931
+ - Admin pode arquivar projeto (tarefas ficam read-only)
932
+ - Membros recebem e-mail ao serem atribuídos a uma tarefa
933
+ - **Integrações:** ActionMailer (e-mails de notificação)
934
+
935
+ **O @analyst entrega** `.aioson/context/discovery.md`:
936
+
937
+ ```markdown
938
+ ## Entidades
939
+ | Entidade | Atributos | Restrições |
940
+ |-------------|----------------------------------------------|-------------------------------------|
941
+ | User | id, name, email, password_digest | Devise ou has_secure_password |
942
+ | Project | id, name, archived, owner_id | owner deve ser admin |
943
+ | Membership | id, project_id, user_id, role | role: admin/member |
944
+ | Task | id, project_id, assignee_id, title, status | assignee deve ser membro do projeto |
945
+ | Column | status enum: todo/in_progress/done | — |
946
+
947
+ ## Regras
948
+ - RN01: Atribuição restrita a membros do projeto (validação no model)
949
+ - RN02: Projeto arquivado → tarefas readonly
950
+ - RN03: E-mail via ActionMailer ao atribuir tarefa
951
+ ```
952
+
953
+ ### Passo 4: @architect
954
+
955
+ **O @architect entrega:**
956
+
957
+ ```
958
+ Classificação: SMALL → estrutura Rails padrão com concerns
959
+
960
+ app/
961
+ models/
962
+ user.rb, project.rb, membership.rb, task.rb
963
+ concerns/
964
+ archivable.rb ← módulo para lógica de arquivamento
965
+ controllers/
966
+ projects_controller.rb
967
+ tasks_controller.rb
968
+ memberships_controller.rb
969
+ views/
970
+ projects/
971
+ index.html.erb
972
+ show.html.erb ← board Kanban
973
+ tasks/
974
+ _task.html.erb ← Turbo Frame por tarefa
975
+ _form.html.erb
976
+ layouts/
977
+ application.html.erb
978
+ mailers/
979
+ task_mailer.rb
980
+ javascript/
981
+ controllers/
982
+ kanban_controller.js ← Stimulus: drag-and-drop colunas
983
+
984
+ config/routes.rb
985
+ db/schema.rb
986
+ test/models/, test/controllers/
987
+ ```
988
+
989
+ **Decisões técnicas:**
990
+ - Realtime: Turbo Streams via ActionCable (move de tarefa sem refresh)
991
+ - Auth: `has_secure_password` + `before_action :require_login`
992
+ - Drag-and-drop: Stimulus + Sortable.js (sem React)
993
+
994
+ ### Passo 5: @dev
995
+
996
+ ```
997
+ /dev
998
+
999
+ Implemente a move de tarefa via Turbo Stream.
1000
+ Quando o usuário arrasta uma tarefa para outra coluna,
1001
+ o status deve ser atualizado sem reload de página.
1002
+ ```
1003
+
1004
+ **O @dev implementa:**
1005
+
1006
+ ```ruby
1007
+ # app/controllers/tasks_controller.rb
1008
+ def update
1009
+ @task = current_user.accessible_tasks.find(params[:id])
1010
+
1011
+ if @task.update(task_params)
1012
+ respond_to do |format|
1013
+ format.turbo_stream do
1014
+ render turbo_stream: [
1015
+ turbo_stream.remove("task_#{@task.id}"),
1016
+ turbo_stream.append("column_#{@task.status}", partial: "tasks/task", locals: { task: @task })
1017
+ ]
1018
+ end
1019
+ format.html { redirect_to project_path(@task.project) }
1020
+ end
1021
+ end
1022
+ end
1023
+ ```
1024
+
1025
+ ```javascript
1026
+ // app/javascript/controllers/kanban_controller.js
1027
+ import { Controller } from "@hotwired/stimulus"
1028
+ import Sortable from "sortablejs"
1029
+
1030
+ export default class extends Controller {
1031
+ static targets = ["column"]
1032
+
1033
+ connect() {
1034
+ this.columnTargets.forEach(column => {
1035
+ new Sortable(column, {
1036
+ group: "tasks",
1037
+ animation: 150,
1038
+ onEnd: (event) => this.#moved(event),
1039
+ })
1040
+ })
1041
+ }
1042
+
1043
+ #moved(event) {
1044
+ const taskId = event.item.dataset.taskId
1045
+ const newStatus = event.to.dataset.status
1046
+ fetch(`/tasks/${taskId}`, {
1047
+ method: "PATCH",
1048
+ headers: { "Content-Type": "application/json", "X-CSRF-Token": this.#csrfToken() },
1049
+ body: JSON.stringify({ task: { status: newStatus } }),
1050
+ })
1051
+ }
1052
+
1053
+ #csrfToken() {
1054
+ return document.querySelector('meta[name="csrf-token"]').content
1055
+ }
1056
+ }
1057
+ ```
1058
+
1059
+ ### Passo 6: @qa
1060
+
1061
+ ```
1062
+ /qa
1063
+
1064
+ Escreva testes para:
1065
+ - RN01: atribuição de tarefa a não-membro (deve falhar)
1066
+ - RN02: projeto arquivado — atualização de tarefa deve ser bloqueada
1067
+ - Turbo Stream: resposta correta ao mover tarefa
1068
+ ```
1069
+
1070
+ ---
1071
+
1072
+ ## Cenário 7 — API Python com FastAPI (MICRO)
1073
+
1074
+ **Projeto:** API de controle de estoque pessoal.
1075
+ **Stack:** Python + FastAPI + SQLite + SQLAlchemy + Pydantic.
1076
+ **Classificação:** MICRO (1 tipo de usuário=0pt, 0 integrações=0pt, sem regras complexas=0pt → 0 pontos)
1077
+
1078
+ > **Django:** Para projetos Python SMALL ou MEDIUM (múltiplos usuários, banco relacional maior, admin panel), prefira Django + DRF. O FastAPI brilha em APIs simples, serviços assíncronos e microsserviços.
1079
+
1080
+ ### Passo 1: Instalar
1081
+
1082
+ ```bash
1083
+ mkdir estoque-api && cd estoque-api
1084
+ pip install fastapi uvicorn sqlalchemy pydantic
1085
+ npx @jaimevalasek/aioson install
1086
+ npx @jaimevalasek/aioson setup:context . --defaults \
1087
+ --project-name="Estoque API" \
1088
+ --project-type=api \
1089
+ --framework="FastAPI" \
1090
+ --framework-installed=true \
1091
+ --classification=MICRO \
1092
+ --lang=pt-BR
1093
+ ```
1094
+
1095
+ ### Passo 2: @setup (detectando FastAPI)
1096
+
1097
+ ```
1098
+ /setup
1099
+ ```
1100
+
1101
+ **O agente confirma:**
1102
+ ```
1103
+ Framework detectado: FastAPI (dependência em requirements.txt ✓)
1104
+ Classificação: MICRO
1105
+
1106
+ Nota: FastAPI não está na lista padrão de detecção automática.
1107
+ O framework foi registrado a partir da sua descrição.
1108
+
1109
+ Plano simplificado (MICRO): @setup → @dev
1110
+ Próximo passo: ative /dev e descreva o que precisa.
1111
+ ```
1112
+
1113
+ > O @setup registra `framework: "FastAPI"` no context.md e segue normalmente.
1114
+ > Não existe stack "errada" — qualquer framework que você descrever é aceito.
1115
+
1116
+ ### Passo 3: @dev direto
1117
+
1118
+ ```
1119
+ /dev
1120
+
1121
+ Crie uma API FastAPI para controle de estoque com:
1122
+ - CRUD de produtos (nome, quantidade, preço, categoria)
1123
+ - Endpoint de busca por categoria
1124
+ - SQLAlchemy com SQLite
1125
+ - Validação via Pydantic
1126
+ ```
1127
+
1128
+ **O @dev implementa:**
1129
+
1130
+ ```python
1131
+ # main.py
1132
+ from fastapi import FastAPI, Depends, HTTPException
1133
+ from sqlalchemy.orm import Session
1134
+ from . import models, schemas, crud
1135
+ from .database import SessionLocal, engine
1136
+
1137
+ models.Base.metadata.create_all(bind=engine)
1138
+ app = FastAPI(title="Estoque API")
1139
+
1140
+ def get_db():
1141
+ db = SessionLocal()
1142
+ try:
1143
+ yield db
1144
+ finally:
1145
+ db.close()
1146
+
1147
+ @app.post("/products/", response_model=schemas.Product, status_code=201)
1148
+ def create_product(product: schemas.ProductCreate, db: Session = Depends(get_db)):
1149
+ return crud.create_product(db, product)
1150
+
1151
+ @app.get("/products/", response_model=list[schemas.Product])
1152
+ def list_products(category: str | None = None, db: Session = Depends(get_db)):
1153
+ return crud.get_products(db, category=category)
1154
+
1155
+ @app.put("/products/{product_id}", response_model=schemas.Product)
1156
+ def update_product(product_id: int, product: schemas.ProductCreate, db: Session = Depends(get_db)):
1157
+ db_product = crud.update_product(db, product_id, product)
1158
+ if not db_product:
1159
+ raise HTTPException(status_code=404, detail="Product not found")
1160
+ return db_product
1161
+ ```
1162
+
1163
+ ```python
1164
+ # schemas.py
1165
+ from pydantic import BaseModel, Field
1166
+
1167
+ class ProductBase(BaseModel):
1168
+ name: str
1169
+ quantity: int = Field(ge=0)
1170
+ price: float = Field(ge=0)
1171
+ category: str
1172
+
1173
+ class ProductCreate(ProductBase):
1174
+ pass
1175
+
1176
+ class Product(ProductBase):
1177
+ id: int
1178
+ class Config:
1179
+ from_attributes = True
1180
+ ```
1181
+
1182
+ **Por que MICRO?**
1183
+ Domínio único (Produto), sem autenticação, sem integrações externas. O @dev tem contexto suficiente para implementar sem @analyst ou @architect.
1184
+
1185
+ ---
1186
+
1187
+ ## Dicas gerais
1188
+
1189
+ ### Quando recomeçar um agente
1190
+
1191
+ Se você forneceu informações incompletas, pode simplesmente reativar:
1192
+ ```
1193
+ /analyst
1194
+
1195
+ Preciso adicionar uma informação: o sistema também vai ter integração com Mercado Pago
1196
+ ```
1197
+
1198
+ O agente vai incorporar a nova informação antes de gerar a entrega final.
1199
+
1200
+ ### Quando pular um agente
1201
+
1202
+ - Em projetos **MICRO**, pule @analyst, @architect e @qa — vá direto ao @dev.
1203
+ - Se o projeto não tem interface visual, pode pular @ux-ui mesmo em projetos SMALL.
1204
+ - Se o projeto MEDIUM tem módulos pouco interdependentes, pode pular @orchestrator e usar @dev sequencialmente.
1205
+
1206
+ ### Mudança de contexto
1207
+
1208
+ Se durante o desenvolvimento o projeto crescer e mudar de SMALL para MEDIUM:
1209
+ ```bash
1210
+ npx @jaimevalasek/aioson setup:context . --defaults --classification=MEDIUM
1211
+ ```
1212
+
1213
+ Então ative @pm e @orchestrator antes de continuar com @dev.
1214
+
1215
+ ### Verificar estado atual
1216
+
1217
+ ```bash
1218
+ npx @jaimevalasek/aioson doctor # valida saúde dos arquivos
1219
+ npx @jaimevalasek/aioson context:validate # valida o project.context.md
1220
+ npx @jaimevalasek/aioson parallel:status # progresso das lanes (MEDIUM)
1221
+ ```
1222
+
1223
+ ---
1224
+
1225
+ ## Veja também
1226
+
1227
+ - [Início rápido](./inicio-rapido.md)
1228
+ - [Guia de agentes](./agentes.md)
1229
+ - [Suporte Web3](./web3.md) — cenários completos Ethereum, Solana e Midnight Network
1230
+ - [Orquestração paralela](../en/parallel.md)