spec-first-claude 0.3.0 → 0.5.0-beta.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 (43) hide show
  1. package/README.md +39 -34
  2. package/lib/init.js +1 -1
  3. package/package.json +31 -23
  4. package/templates/.ai/memory/napkin.md +1 -1
  5. package/templates/.claude/agents/db-coder.md +1 -1
  6. package/templates/.claude/agents/doc-writer.md +12 -15
  7. package/templates/.claude/agents/security-reviewer.md +1 -1
  8. package/templates/.claude/commands/design.md +18 -19
  9. package/templates/.claude/commands/dev.md +24 -2
  10. package/templates/.claude/commands/discovery.md +405 -405
  11. package/templates/.claude/commands/extract.md +3 -3
  12. package/templates/.claude/commands/feature.md +8 -8
  13. package/templates/.claude/commands/merge-delta.md +10 -9
  14. package/templates/.claude/commands/plan.md +2 -2
  15. package/templates/.claude/commands/{pausar.md → session-finish.md} +6 -6
  16. package/templates/.claude/commands/setup-projeto.md +11 -11
  17. package/templates/{docs/Desenvolvimento → .claude}/rules.md +2 -2
  18. package/templates/.claude/settings.local.json +6 -6
  19. package/templates/{docs/_templates/estrutura/API.template.md → .claude/templates/estrutura/apiContracts.template.md} +24 -17
  20. package/templates/.claude/templates/estrutura/architecture.template.md +158 -0
  21. package/templates/{docs/_templates/estrutura/Seguranca.template.md → .claude/templates/estrutura/conventions.template.md} +74 -10
  22. package/templates/{docs/_templates/estrutura/ADRs.template.md → .claude/templates/estrutura/decisions.template.md} +21 -13
  23. package/templates/.claude/templates/estrutura/domain.template.md +148 -0
  24. package/templates/{docs/_templates → .claude/templates}/feature/PRD.template.md +256 -256
  25. package/templates/{docs/_templates → .claude/templates}/feature/Progresso.template.md +2 -2
  26. package/templates/{docs/_templates → .claude/templates}/feature/TRD.template.md +204 -200
  27. package/templates/{docs/_templates → .claude/templates}/feature/context.template.md +1 -1
  28. package/templates/{docs/_templates → .claude/templates}/feature/projetos.template.yaml +1 -1
  29. package/templates/{docs/_templates → .claude/templates}/feature/sdd.template.md +372 -372
  30. package/templates/{docs/_templates → .claude/templates}/feature/tasks.template.md +115 -115
  31. package/templates/CLAUDE.md +67 -51
  32. package/templates/docs/_templates/estrutura/Arquitetura.template.md +0 -82
  33. package/templates/docs/_templates/estrutura/Infraestrutura.template.md +0 -104
  34. package/templates/docs/_templates/estrutura/Modelo_Dados.template.md +0 -99
  35. package/templates/docs/_templates/estrutura/Stack.template.md +0 -78
  36. package/templates/docs/_templates/estrutura/Visao.template.md +0 -82
  37. /package/templates/{docs/_templates → .claude/templates}/feature/backlog-extraido.template.md +0 -0
  38. /package/templates/{docs/_templates → .claude/templates}/feature/extract-log.template.md +0 -0
  39. /package/templates/{docs/_templates → .claude/templates}/global/progresso_global.template.md +0 -0
  40. /package/templates/docs/{Desenvolvimento/.gitkeep → .gitkeep} +0 -0
  41. /package/templates/{docs/Estrutura → workspace/Input}/.gitkeep +0 -0
  42. /package/templates/{docs/PM → workspace/Input/setup_projeto}/.gitkeep +0 -0
  43. /package/templates/{docs/PM/setup_projeto → workspace/Output}/.gitkeep +0 -0
package/README.md CHANGED
@@ -46,33 +46,41 @@ Isso cria a pasta `MeuProjeto/` com toda a estrutura pronta:
46
46
  ```
47
47
  MeuProjeto/
48
48
  ├── .ai/memory/napkin.md <- Memoria persistente do projeto
49
- ├── .claude/
49
+ ├── .claude/ <- AI OPERATIONAL CONFIG
50
+ │ ├── rules.md <- Regras de desenvolvimento
51
+ │ ├── templates/ <- 15 templates do workflow
52
+ │ │ ├── feature/ <- PRD, TRD, SDD, tasks, etc.
53
+ │ │ ├── estrutura/ <- 5 templates de estado do sistema
54
+ │ │ └── global/ <- Progresso global
50
55
  │ ├── commands/ <- 9 commands do workflow
51
- │ │ ├── setup-projeto.md <- Bootstrap do projeto
52
- │ │ ├── feature.md <- Pipeline de feature
53
- │ │ ├── discovery.md <- Analise profunda de insumos
54
- │ │ ├── extract.md <- PM -> PRD/TRD
55
- │ │ ├── design.md <- PRD/TRD -> SDD
56
- │ │ ├── plan.md <- SDD -> tasks
57
- │ │ ├── dev.md <- Executa tasks
58
- │ │ ├── merge-delta.md <- Atualiza docs globais
59
- │ │ └── pausar.md <- Encerra sessao
60
- │ └── agents/ <- 7 agentes especializados
61
- │ ├── backend-coder.md <- .NET 8 / C#
62
- │ ├── frontend-coder.md <- React
63
- │ ├── db-coder.md <- PostgreSQL
64
- │ ├── infra-coder.md <- Docker
65
- │ ├── doc-writer.md <- Documentacao
66
- │ ├── reviewer.md <- Code review
67
- │ └── security-reviewer.md <- Auditoria de seguranca
68
- ├── docs/
69
- │ ├── PM/ <- Jogue seus insumos aqui
70
- │ └── setup_projeto/ <- Insumos do bootstrap
71
- │ ├── _templates/ <- 18 templates do workflow
72
- │ ├── Estrutura/ <- Docs globais (gerados)
73
- │ └── Desenvolvimento/ <- Docs por feature (gerados)
74
- │ └── rules.md <- Regras de desenvolvimento
75
- ├── CLAUDE.md <- Regras globais pro agente
56
+ │ │ ├── setup-projeto.md
57
+ │ │ ├── feature.md
58
+ │ │ ├── discovery.md
59
+ │ │ ├── extract.md
60
+ │ │ ├── design.md
61
+ │ │ ├── plan.md
62
+ │ │ ├── dev.md
63
+ │ │ ├── merge-delta.md
64
+ │ │ └── session-finish.md
65
+ │ └── agents/ <- 7 agentes especializados
66
+ │ ├── backend-coder.md <- .NET 8 / C#
67
+ │ ├── frontend-coder.md <- React
68
+ │ ├── db-coder.md <- PostgreSQL
69
+ │ ├── infra-coder.md <- Docker
70
+ │ ├── doc-writer.md <- Documentacao
71
+ │ ├── reviewer.md <- Code review
72
+ │ └── security-reviewer.md <- Auditoria de seguranca
73
+ ├── docs/ <- SYSTEM KNOWLEDGE (gerado pelo /design)
74
+ │ ├── architecture.md <- Containers, stack, ambientes, deploy
75
+ ├── domain.md <- Visao de negocio + modelo de dados
76
+ │ ├── conventions.md <- Auth, authz, LGPD, env vars, monitoramento
77
+ │ ├── apiContracts.md <- Rotas, paginacao, erros, catalogo de endpoints
78
+ │ └── decisions.md <- ADRs
79
+ ├── workspace/ <- TEAM CONTENT (futuro wiki)
80
+ ├── Input/ <- Jogue seus insumos aqui
81
+ │ │ └── setup_projeto/ <- Insumos do bootstrap
82
+ │ └── Output/ <- Docs por feature (gerados)
83
+ ├── CLAUDE.md <- Regras globais pro agente
76
84
  └── .gitignore
77
85
  ```
78
86
 
@@ -84,7 +92,7 @@ MeuProjeto/
84
92
  cd MeuProjeto
85
93
  ```
86
94
 
87
- 2. Jogue seus insumos em `docs/PM/setup_projeto/` — qualquer formato:
95
+ 2. Jogue seus insumos em `workspace/Input/setup_projeto/` — qualquer formato:
88
96
  - `.md`, `.txt` (descricoes, requisitos, decisoes)
89
97
  - `.sql` (modelagem de banco)
90
98
  - `.csv`, `.xml`, `.html` (dados, configs)
@@ -103,28 +111,25 @@ MeuProjeto/
103
111
  ## Pipeline completo
104
112
 
105
113
  ```
106
- docs/PM/ (seus arquivos)
114
+ workspace/Input/ (seus arquivos)
107
115
  |
108
116
  v
109
117
  /setup-projeto --> /extract --> TRD (voce revisa e aprova)
110
118
  |
111
119
  v
112
- /design --> SDD + docs/Estrutura/
120
+ /design --> SDD + docs/ (5 arquivos)
113
121
  |
114
122
  v
115
123
  /plan --> tasks + Progresso.md
116
124
  |
117
125
  v
118
- /dev --> codigo nos repos
119
- |
120
- v
121
- /merge-delta --> docs atualizados
126
+ /dev --> codigo nos repos + merge-delta automatico
122
127
  ```
123
128
 
124
129
  Para features (apos o setup):
125
130
 
126
131
  ```
127
- /feature nome_da_feature --> /extract --> PRD --> /design --> /plan --> /dev --> /merge-delta
132
+ /feature nome_da_feature --> /extract --> PRD --> /design --> /plan --> /dev (inclui merge-delta)
128
133
  ```
129
134
 
130
135
  ## Opcoes do CLI
package/lib/init.js CHANGED
@@ -62,7 +62,7 @@ function init({ name, templatesDir, targetDir }) {
62
62
  console.log(`\nDone! Project "${name}" is ready.`);
63
63
  console.log('\nNext steps:');
64
64
  console.log(` 1. cd ${name}`);
65
- console.log(' 2. Add your input files to docs/PM/setup_projeto/');
65
+ console.log(' 2. Add your input files to workspace/Input/setup_projeto/');
66
66
  console.log(' 3. Run /setup-projeto to start the pipeline');
67
67
  console.log('');
68
68
  }
package/package.json CHANGED
@@ -1,23 +1,31 @@
1
- {
2
- "name": "spec-first-claude",
3
- "version": "0.3.0",
4
- "description": "Spec-first workflow kit for Claude Code — AI-driven development with specs, not guesswork",
5
- "bin": {
6
- "spec-first-claude": "./bin/cli.js"
7
- },
8
- "files": [
9
- "bin/",
10
- "lib/",
11
- "templates/"
12
- ],
13
- "author": "gustavomaritan",
14
- "keywords": ["spec-first", "workflow", "ai", "claude", "anthropic", "scaffolding"],
15
- "repository": {
16
- "type": "git",
17
- "url": "https://github.com/gustavomaritan-labs/spec-first-workflow"
18
- },
19
- "scripts": {
20
- "test": "echo \"No tests yet\""
21
- },
22
- "license": "MIT"
23
- }
1
+ {
2
+ "name": "spec-first-claude",
3
+ "version": "0.5.0-beta.0",
4
+ "description": "Spec-first workflow kit for Claude Code — AI-driven development with specs, not guesswork",
5
+ "bin": {
6
+ "spec-first-claude": "bin/cli.js"
7
+ },
8
+ "files": [
9
+ "bin/",
10
+ "lib/",
11
+ "templates/"
12
+ ],
13
+ "author": "gustavomaritan",
14
+ "keywords": [
15
+ "spec-first",
16
+ "workflow",
17
+ "ai",
18
+ "claude",
19
+ "anthropic",
20
+ "scaffolding"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/gustavomaritan-labs/spec-first-workflow.git",
25
+ "directory": "packages/spec-first-claude"
26
+ },
27
+ "scripts": {
28
+ "test": "echo \"No tests yet\""
29
+ },
30
+ "license": "MIT"
31
+ }
@@ -65,4 +65,4 @@
65
65
 
66
66
  ## Sessão Atual
67
67
 
68
- <!-- Atualizado pelo /pausar ao encerrar cada sessão -->
68
+ <!-- Atualizado pelo /session-finish ao encerrar cada sessão -->
@@ -39,7 +39,7 @@ src/Infrastructure/Data/
39
39
  └── DevSeedData.cs ← Seed para desenvolvimento
40
40
  ```
41
41
 
42
- ### Convenções SQL (alinhado com Modelo_Dados.md)
42
+ ### Convenções SQL (alinhado com domain.md)
43
43
 
44
44
  | Elemento | Convenção | Exemplo |
45
45
  |----------|-----------|---------|
@@ -1,7 +1,7 @@
1
1
  # Agent: Doc Writer
2
2
 
3
3
  > Especialista em geração de documentação técnica.
4
- > Usado pelo /design (setup) para gerar docs/Estrutura/ e pelo /merge-delta para atualizá-los.
4
+ > Usado pelo /design (setup) para gerar docs/ e pelo /merge-delta para atualizá-los.
5
5
 
6
6
  ---
7
7
 
@@ -16,21 +16,18 @@
16
16
 
17
17
  ## Responsabilidades
18
18
 
19
- 1. **No setup (via /design passo 3)**: gerar os 8 docs de `docs/Estrutura/` a partir do TRD aprovado
20
- 2. **Em features (via /merge-delta)**: atualizar docs de Estrutura com Delta Specs do SDD §11
19
+ 1. **No setup (via /design passo 3)**: gerar os 5 docs de `docs/` a partir do TRD aprovado (architecture, domain, conventions, apiContracts, decisions)
20
+ 2. **Em features (via /merge-delta)**: atualizar os docs de `docs/` com Delta Specs do SDD §11
21
21
 
22
- ## Mapeamento TRD → docs/Estrutura/
22
+ ## Mapeamento TRD/SDD → docs/
23
23
 
24
- | TRD Seção | Doc gerado | Template |
25
- |-----------|-----------|---------|
26
- | §1 Visão + §8 Módulos | Visao.md | `_templates/estrutura/Visao.template.md` |
27
- | §2 Stack | Stack.md | `_templates/estrutura/Stack.template.md` |
28
- | §3 Arquitetura | Arquitetura.md | `_templates/estrutura/Arquitetura.template.md` |
29
- | §4 Modelo + SDD §3 | Modelo_Dados.md | `_templates/estrutura/Modelo_Dados.template.md` |
30
- | §5 API | API.md | `_templates/estrutura/API.template.md` |
31
- | §6 Infra | Infraestrutura.md | `_templates/estrutura/Infraestrutura.template.md` |
32
- | §7 Segurança | Seguranca.md | `_templates/estrutura/Seguranca.template.md` |
33
- | SDD §2 Decisões | ADRs.md | `_templates/estrutura/ADRs.template.md` |
24
+ | Doc gerado | Fontes | Template |
25
+ |-----------|--------|---------|
26
+ | architecture.md | TRD §2 Stack + §3 Arquitetura + §6 Infra (ambientes/deploy/CI/rollback) | `.claude/templates/estrutura/architecture.template.md` |
27
+ | domain.md | TRD §1 Visão + §4 Modelo de Dados (+ SDD §3 em features) | `.claude/templates/estrutura/domain.template.md` |
28
+ | conventions.md | TRD §7 Segurança + §6 Infra (env vars/monitoramento) + §5 API (códigos de erro) + §2 Stack (alternativas/versionamento) | `.claude/templates/estrutura/conventions.template.md` |
29
+ | apiContracts.md | TRD §5 API (padrão geral, rotas, paginação, filtros, erros, catálogo) | `.claude/templates/estrutura/apiContracts.template.md` |
30
+ | decisions.md | SDD §2 Decisões + decisões iniciais de stack/arquitetura | `.claude/templates/estrutura/decisions.template.md` |
34
31
 
35
32
  ## Regras
36
33
 
@@ -48,4 +45,4 @@
48
45
  2. **Ler TRD/SDD** → extrair dados para cada seção
49
46
  3. **Preencher** → seguindo formato do template exatamente
50
47
  4. **Remover instruções** → bloco `<!-- INSTRUÇÕES -->` não vai pro doc final
51
- 5. **Commitar** → `docs(DOC-001): gerar Visao.md a partir do TRD`
48
+ 5. **Commitar** → `docs(DOC-001): gerar architecture.md a partir do TRD`
@@ -11,7 +11,7 @@
11
11
  |-------|-------|
12
12
  | Área | Todas (cross-area) |
13
13
  | Modelo padrão | Opus |
14
- | Lê | Código produzido + SDD §5 (endpoints/auth) + SDD §9 (testes) + docs/Estrutura/Seguranca.md |
14
+ | Lê | Código produzido + SDD §5 (endpoints/auth) + SDD §9 (testes) + docs/conventions.md (auth, authz, LGPD, auditoria) |
15
15
  | Nunca lê | PRD, PM |
16
16
 
17
17
  ## Quando é acionado
@@ -13,7 +13,7 @@ Técnico e preciso. Gera contratos completos. Toda decisão tem justificativa.
13
13
  | 1 | $ARGUMENTS informado | Parar |
14
14
  | 2 | `.context.md` existe com status `extract_done` ou `approved` | Se anterior → "/extract primeiro". Se posterior → "SDD já gerado" |
15
15
  | 3 | PRD.md ou TRD.md existe | Parar → "/extract primeiro" |
16
- | 4 | `docs/Estrutura/` populado (para features) | Parar → "/setup-projeto primeiro" (não aplica para tipo=setup) |
16
+ | 4 | `docs/` populado (para features) | Parar → "/setup-projeto primeiro" (não aplica para tipo=setup) |
17
17
 
18
18
  ## Passos
19
19
 
@@ -27,29 +27,27 @@ Se status é `extract_done`:
27
27
  - Ler seção de ambiguidades (§13 PRD / §9 TRD)
28
28
  - Se há perguntas sem resposta → PARAR, listar pendentes
29
29
 
30
- ### 3. Gerar docs/Estrutura/ (APENAS para setup)
30
+ ### 3. Gerar docs/ (APENAS para setup)
31
31
 
32
- > Este passo só executa quando tipo=setup. Para features, docs/Estrutura/ já existe.
32
+ > Este passo só executa quando tipo=setup. Para features, docs/ já existe.
33
33
 
34
- Ler TRD e gerar os 8 docs de `docs/Estrutura/` usando os templates correspondentes:
34
+ Ler TRD e gerar os 5 docs de `docs/` usando os templates correspondentes:
35
35
 
36
- | TRD Seção | Doc gerado | Template |
37
- |-----------|-----------|---------|
38
- | §1 Visão + §8 Módulos | Visao.md | `_templates/estrutura/Visao.template.md` |
39
- | §2 Stack | Stack.md | `_templates/estrutura/Stack.template.md` |
40
- | §3 Arquitetura | Arquitetura.md | `_templates/estrutura/Arquitetura.template.md` |
41
- | §4 Modelo de Dados | Modelo_Dados.md | `_templates/estrutura/Modelo_Dados.template.md` |
42
- | §5 API | API.md | `_templates/estrutura/API.template.md` |
43
- | §6 Infra | Infraestrutura.md | `_templates/estrutura/Infraestrutura.template.md` |
44
- | §7 Segurança | Seguranca.md | `_templates/estrutura/Seguranca.template.md` |
45
- | SDD §2 (após gerar) | ADRs.md | `_templates/estrutura/ADRs.template.md` |
36
+ | Doc gerado | Fontes (TRD) | Template |
37
+ |-----------|--------------|---------|
38
+ | architecture.md | §3 Arquitetura + §2 Stack + §6 Infra (ambientes, deploy, CI/CD, rollback) | `.claude/templates/estrutura/architecture.template.md` |
39
+ | domain.md | §1 Visão + §4 Modelo de Dados | `.claude/templates/estrutura/domain.template.md` |
40
+ | conventions.md | §7 Segurança + §6 Infra (env vars, domínios, monitoramento) + §5 API (códigos de erro de domínio) + §2 Stack (alternativas, versionamento) | `.claude/templates/estrutura/conventions.template.md` |
41
+ | apiContracts.md | §5 API (padrão geral, rotas, paginação, filtros, erros, catálogo) | `.claude/templates/estrutura/apiContracts.template.md` |
42
+ | decisions.md | SDD §2 Decisões (após gerar) + decisões iniciais de stack/arquitetura | `.claude/templates/estrutura/decisions.template.md` |
46
43
 
47
44
  Regras:
48
45
  - Ler template → preencher TODAS seções com dados do TRD
49
46
  - Remover bloco `<!-- INSTRUÇÕES -->` do doc gerado
50
47
  - Changelog inicia vazio (primeira geração)
51
48
  - Se TRD não tem dados pra uma seção → marcar "A definir"
52
- - ADRs.md é gerado APÓS o SDD (usa §2 Decisões de Design)
49
+ - decisions.md é gerado APÓS o SDD (usa §2 Decisões de Design como ponto de partida)
50
+ - TRD §8 Módulos NÃO vira doc de Estrutura — vai para backlog faseado
53
51
 
54
52
  ### 3b. Gerar `projetos.yaml` (APENAS para setup)
55
53
 
@@ -75,8 +73,8 @@ Nunca juntar serviços que o TRD definiu como distintos.
75
73
 
76
74
  ### 4. Carregar contexto
77
75
  - PRD.md ou TRD.md completo
78
- - `docs/Estrutura/` (agora já populado, mesmo no setup)
79
- - `docs/Desenvolvimento/rules.md`
76
+ - `docs/` (agora já populado, mesmo no setup)
77
+ - `.claude/rules.md`
80
78
  - Template `sdd.template.md`
81
79
 
82
80
  ### 5. Gerar SDD
@@ -96,8 +94,9 @@ Nunca juntar serviços que o TRD definiu como distintos.
96
94
  **Setup**: §4-§8 podem ser N/A (normal).
97
95
  **Feature**: todas seções aplicáveis preenchidas.
98
96
 
99
- ### 6. Gerar ADRs.md (setup — complemento do passo 3)
100
- Após gerar SDD §2, criar ADRs.md com as decisões iniciais de arquitetura.
97
+ ### 6. Complementar decisions.md (setup — complemento do passo 3)
98
+ Após gerar SDD §2, popular `decisions.md` com as decisões iniciais de arquitetura
99
+ (stack principal, padrões de design, trade-offs significativos).
101
100
 
102
101
  ### 7. Atualizar `.context.md`
103
102
  ```yaml
@@ -70,7 +70,16 @@ Ler o perfil do agente em `.claude/agents/` antes de implementar.
70
70
  ║ VALIDAÇÃO POR FEATURE ║
71
71
  ║ 1. Rodar E2E (SDD §9.3 CAs) ║
72
72
  ║ → Falhou? Identificar → fix → loop (max 3)║
73
- ║ 2. Tudo passou? → dev_done ✅
73
+ ║ 2. Tudo passou? → prosseguir
74
+ ╚═══════════════════════════════════════════════╝
75
+ ↓ (E2E aprovado, só features)
76
+ ╔═══════════════════════════════════════════════╗
77
+ ║ MERGE-DELTA (automático, só features) ║
78
+ ║ 1. Ler SDD §11 (Delta Specs) ║
79
+ ║ 2. Aplicar ADDED/MODIFIED/REMOVED em ║
80
+ ║ docs/ ║
81
+ ║ 3. Registrar changelog em cada doc alterado ║
82
+ ║ 4. dev_done ✅ ║
74
83
  ╚═══════════════════════════════════════════════╝
75
84
  ```
76
85
 
@@ -160,8 +169,21 @@ git branch -d feature/{nome}_fase{N}
160
169
  git remote prune origin
161
170
  ```
162
171
 
172
+ ## Merge-Delta automático (só features)
173
+
174
+ Após E2E aprovado, SE `.context.md` tipo = `feature`:
175
+ 1. Ler SDD §11 (seção Delta Specs: ADDED/MODIFIED/REMOVED)
176
+ 2. Para cada delta, mapear para o doc de `docs/` correspondente
177
+ 3. Aplicar as mudanças (adicionar, modificar ou remover seções)
178
+ 4. Registrar changelog em cada doc alterado: `| {{DATA}} | {{NOME}} | {{TIPO}} | {{DESCRIÇÃO}} |`
179
+ 5. Validar consistência cross-doc (ex: endpoint no apiContracts.md referencia tabela no domain.md)
180
+
181
+ Se tipo = `setup` → pular (docs/ já foi criado pelo /design).
182
+
183
+ > O `/merge-delta` continua existindo como command atômico para re-execução manual se necessário.
184
+
163
185
  ## Atualizar `.context.md`
164
186
  ```yaml
165
187
  status: "dev_in_progress" # durante
166
- status: "dev_done" # ao final (todas fases mergeadas)
188
+ status: "dev_done" # ao final (todas fases mergeadas + merge-delta aplicado)
167
189
  ```