spec-first-copilot 0.7.0-beta.1 → 0.7.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.
- package/README.md +252 -167
- package/bin/cli.js +70 -70
- package/lib/init.js +92 -92
- package/lib/update.js +132 -132
- package/package.json +1 -1
- package/templates/.ai/memory/napkin.md +68 -68
- package/templates/.github/CHANGELOG.md +560 -533
- package/templates/.github/adapters/SETUP.md +314 -314
- package/templates/.github/adapters/confluence.md +295 -295
- package/templates/.github/adapters/errors.md +234 -234
- package/templates/.github/adapters/filesystem.md +353 -353
- package/templates/.github/adapters/interface.md +301 -301
- package/templates/.github/adapters/naming.md +241 -241
- package/templates/.github/adapters/registry.md +244 -244
- package/templates/.github/agents/backend-coder.md +215 -215
- package/templates/.github/agents/db-coder.md +165 -165
- package/templates/.github/agents/doc-writer.md +66 -66
- package/templates/.github/agents/frontend-coder.md +222 -222
- package/templates/.github/agents/infra-coder.md +341 -341
- package/templates/.github/agents/reviewer.md +99 -99
- package/templates/.github/agents/security-reviewer.md +153 -153
- package/templates/.github/copilot-instructions.md +272 -272
- package/templates/.github/instructions/docs.instructions.md +147 -145
- package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
- package/templates/.github/rules.md +229 -229
- package/templates/.github/scripts/bootstrap-confluence.js +289 -289
- package/templates/.github/skills/sf-design/SKILL.md +161 -161
- package/templates/.github/skills/sf-dev/SKILL.md +204 -204
- package/templates/.github/skills/sf-discovery/SKILL.md +415 -415
- package/templates/.github/skills/sf-extract/SKILL.md +225 -225
- package/templates/.github/skills/sf-load/SKILL.md +296 -296
- package/templates/.github/skills/sf-mcp/SKILL.md +386 -386
- package/templates/.github/skills/sf-merge-docs/SKILL.md +152 -152
- package/templates/.github/skills/sf-plan/SKILL.md +152 -152
- package/templates/.github/skills/sf-publish/SKILL.md +144 -144
- package/templates/.github/skills/sf-session-finish/SKILL.md +93 -93
- package/templates/.github/skills/sf-start/SKILL.md +192 -192
- package/templates/.github/templates/estrutura/apiContracts.template.md +160 -159
- package/templates/.github/templates/estrutura/architecture.template.md +169 -168
- package/templates/.github/templates/estrutura/conventions.template.md +214 -212
- package/templates/.github/templates/estrutura/decisions.template.md +107 -107
- package/templates/.github/templates/estrutura/domain.template.md +161 -160
- package/templates/.github/templates/feature/PRD.template.md +279 -279
- package/templates/.github/templates/feature/Progresso.template.md +141 -141
- package/templates/.github/templates/feature/TRD.template.md +358 -358
- package/templates/.github/templates/feature/context.template.md +89 -89
- package/templates/.github/templates/feature/extract-log.template.md +49 -49
- package/templates/.github/templates/feature/projetos.template.yaml +79 -79
- package/templates/.github/templates/global/progresso_global.template.md +59 -57
- package/templates/.github/templates/specs/brief.template.md +66 -66
- package/templates/.github/templates/specs/contracts.template.md +147 -147
- package/templates/.github/templates/specs/scenarios.template.md +125 -125
- package/templates/.github/templates/specs/tasks.template.md +65 -65
- package/templates/_gitignore +35 -35
- package/templates/sfw.config.yml.example +147 -147
|
@@ -1,145 +1,147 @@
|
|
|
1
|
-
# Instruções — Documentação e Specs
|
|
2
|
-
|
|
3
|
-
> Regras para o agente ao trabalhar com a camada de documentação.
|
|
4
|
-
> Complementa `copilot-instructions.md` com detalhes operacionais.
|
|
5
|
-
|
|
6
|
-
## Skills e fluxo
|
|
7
|
-
|
|
8
|
-
O pipeline é executado por skills atômicas, cada uma com seu arquivo em `.github/skills/`:
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
/sf-start → /sf-extract → /sf-design → /sf-plan → /sf-dev → /sf-merge-docs
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
Cada skill tem pré-condições, passos e saídas documentados. **Sempre ler a skill antes de executar.**
|
|
15
|
-
|
|
16
|
-
## Estado da pipeline (`.context.md`)
|
|
17
|
-
|
|
18
|
-
Cada scope tem um `.context.md` (YAML frontmatter) que controla o fluxo:
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
not_started → extract_done →
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
- **Apenas skills atualizam** `.context.md` — o usuário nunca edita manualmente
|
|
25
|
-
- **first_run é imutável** após criação (derivado da ausência de `docs/` no momento do `/sf-start`)
|
|
26
|
-
- **Aprovação
|
|
27
|
-
- Antes de executar qualquer skill, verificar status no `.context.md`
|
|
28
|
-
|
|
29
|
-
## Extração (/sf-extract)
|
|
30
|
-
|
|
31
|
-
Gera PRD
|
|
32
|
-
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
|
|
|
36
|
-
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
| Todas | Reviewer | — |
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
Por
|
|
118
|
-
Por
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
|
137
|
-
|
|
|
138
|
-
| Extração | `PRD.md`
|
|
139
|
-
|
|
|
140
|
-
| Gera `
|
|
141
|
-
|
|
|
142
|
-
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
> No v3
|
|
1
|
+
# Instruções — Documentação e Specs
|
|
2
|
+
|
|
3
|
+
> Regras para o agente ao trabalhar com a camada de documentação.
|
|
4
|
+
> Complementa `copilot-instructions.md` com detalhes operacionais.
|
|
5
|
+
|
|
6
|
+
## Skills e fluxo
|
|
7
|
+
|
|
8
|
+
O pipeline é executado por skills atômicas, cada uma com seu arquivo em `.github/skills/`:
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
/sf-start → /sf-load → /sf-discovery → /sf-extract → /sf-design → /sf-plan → /sf-dev → /sf-merge-docs
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Cada skill tem pré-condições, passos e saídas documentados. **Sempre ler a skill antes de executar.**
|
|
15
|
+
|
|
16
|
+
## Estado da pipeline (`.context.md`)
|
|
17
|
+
|
|
18
|
+
Cada scope tem um `.context.md` (YAML frontmatter) que controla o fluxo:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
not_started → discovery_done → extract_done → prd_approved → trd_approved → design_done → plan_done → dev_in_progress → dev_done → done
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- **Apenas skills atualizam** `.context.md` — o usuário nunca edita manualmente
|
|
25
|
+
- **first_run é imutável** após criação (derivado da ausência de `docs/` no momento do `/sf-start`)
|
|
26
|
+
- **Aprovação DUPLA**: PM marca `prd_aprovado=true`, dev marca `trd_aprovado=true` (ambas = pode chamar `/sf-design`)
|
|
27
|
+
- Antes de executar qualquer skill, verificar status no `.context.md`
|
|
28
|
+
|
|
29
|
+
## Extração (/sf-extract)
|
|
30
|
+
|
|
31
|
+
Gera **PRD e/ou TRD** conforme o conteúdo dos insumos:
|
|
32
|
+
|
|
33
|
+
| Cenário | PRD | TRD |
|
|
34
|
+
|---------|-----|-----|
|
|
35
|
+
| first-run de projeto novo (produto + tech) | gerado | gerado |
|
|
36
|
+
| bootstrap de infra (só técnico) | não gerado (`prd_existe=false`) | gerado |
|
|
37
|
+
| feature de UX pura (só produto) | gerado | não gerado (`trd_existe=false`) |
|
|
38
|
+
|
|
39
|
+
Templates: `.github/templates/feature/PRD.template.md` e `.github/templates/feature/TRD.template.md`.
|
|
40
|
+
|
|
41
|
+
### Multi-agent no /sf-extract
|
|
42
|
+
|
|
43
|
+
| Agente | Modelo | Papel |
|
|
44
|
+
|--------|--------|-------|
|
|
45
|
+
| Reader (1 por arquivo) | Sonnet | Lê e cataloga 1 arquivo por vez, em paralelo |
|
|
46
|
+
| Produto-Analyzer | Opus | Consolida conteúdo de produto → gera PRD |
|
|
47
|
+
| Tech-Analyzer | Opus | Consolida conteúdo técnico → gera TRD |
|
|
48
|
+
|
|
49
|
+
### Regras da extração
|
|
50
|
+
|
|
51
|
+
- Ler TODOS os arquivos em `workspace/Input/{nome}/` (qualquer formato)
|
|
52
|
+
- Cada Analyzer decide se há conteúdo suficiente pra gerar seu doc
|
|
53
|
+
- Categorias FIXAS dos templates — não inventar seções novas
|
|
54
|
+
- IDs estáveis: RN-NNN (PRD), ADR-NNN (TRD). Nunca renumerar.
|
|
55
|
+
- **Analyzer consulta `docs/` ANTES de marcar ambiguidade** — se resposta já existe em `docs/conventions.md` etc, marca "resolvido em docs/X §Y" e não pergunta
|
|
56
|
+
- Ambiguidades REAIS (não cobertas por docs/) = BLOQUEANTES (§12 no PRD, §10 no TRD)
|
|
57
|
+
- Nunca INFERIR regra de negócio ou decisão técnica — se não está explícito, é ambiguidade
|
|
58
|
+
- Contradições entre arquivos → ambiguidade citando ambos
|
|
59
|
+
- Rastreabilidade obrigatória: cada informação aponta pro arquivo fonte
|
|
60
|
+
- Arquivo não identificável → registrar como NÃO IDENTIFICADO no extract-log, gerar ambiguidade
|
|
61
|
+
- Gerar `.extract-log.md` com hash SHA-256 (8 chars) + destino (qual doc/seção recebeu)
|
|
62
|
+
|
|
63
|
+
### Checklist de temas críticos FIXO
|
|
64
|
+
|
|
65
|
+
9 temas verificados sempre (após consulta a docs/): Autenticação, Autorização/Roles,
|
|
66
|
+
Separação de serviços, Ambientes & deploy, Dados sensíveis/LGPD, Validações de entrada,
|
|
67
|
+
Cenários de erro de produto, Impacto em dados existentes, Métricas de sucesso. Temas
|
|
68
|
+
não cobertos por insumos nem docs/ viram ambiguidades bloqueantes — em PRD se é de
|
|
69
|
+
produto, em TRD se é técnico.
|
|
70
|
+
|
|
71
|
+
### Re-extração
|
|
72
|
+
|
|
73
|
+
- Compara hashes com `.extract-log.md` existente → NOVO / MODIFICADO / INALTERADO
|
|
74
|
+
- Merge ADITIVO (nunca remove info de arquivos inalterados)
|
|
75
|
+
- Novas regras continuam sequência de IDs (se último era RN-005, próximo é RN-006)
|
|
76
|
+
- Se PRD era inexistente e re-extração encontra produto → cria PRD agora (`prd_existe=true`, `prd_aprovado=false`)
|
|
77
|
+
- Idem para TRD
|
|
78
|
+
|
|
79
|
+
## Design (/sf-design)
|
|
80
|
+
|
|
81
|
+
1. Verificar aprovações duplas: `prd_aprovado` (se `prd_existe`) E `trd_aprovado` (se `trd_existe`)
|
|
82
|
+
2. Verificar ambiguidades — todas com resposta OU marcadas "resolvido em docs/..."
|
|
83
|
+
3. Ler PRD + TRD aprovados + `docs/` (se existir) + `.github/rules.md`
|
|
84
|
+
4. Detectar `first_run` do `.context.md`
|
|
85
|
+
5. **first_run=true**: gerar `docs/` (5 arquivos) + `projetos.yaml` a partir do TRD §Sistema
|
|
86
|
+
6. **Sempre**: gerar projeções em `specs/{nome}/` (brief/contracts/scenarios) lendo PRD+TRD
|
|
87
|
+
7. Coder lê APENAS `specs/{nome}/` + task — nunca PRD/TRD direto
|
|
88
|
+
8. `areas_tocadas` preenchido no `.context.md` (dos GATEs do TRD §Área-X)
|
|
89
|
+
|
|
90
|
+
## Planejamento (/sf-plan)
|
|
91
|
+
|
|
92
|
+
1. Ler PRD + TRD + `specs/{nome}/` + `docs/` + `.github/rules.md`
|
|
93
|
+
2. Áreas são DINÂMICAS — derivadas dos GATEs do TRD (`areas_tocadas` no `.context.md`)
|
|
94
|
+
3. Gerar `specs/{nome}/tasks.md` usando template de tasks
|
|
95
|
+
4. Tasks em fases sequenciais com prioridade P1/P2/P3 (do PRD §11 Fases de Entrega)
|
|
96
|
+
5. Cada task: ID (AREA-NNN), título, tamanho (S/M/L), arquivos, ref TRD §N, depende, testes
|
|
97
|
+
6. Gerar `Progresso.md` com ordem de execução e paralelismos
|
|
98
|
+
|
|
99
|
+
## Desenvolvimento (/sf-dev)
|
|
100
|
+
|
|
101
|
+
### Agents por área (perfis em `.github/agents/`)
|
|
102
|
+
|
|
103
|
+
| Área | Agente | Stack padrão |
|
|
104
|
+
|------|--------|-------------|
|
|
105
|
+
| DB | DB Coder | PostgreSQL 16 |
|
|
106
|
+
| BACK | Backend Coder | .NET 8 / C# |
|
|
107
|
+
| FRONT | Frontend Coder | React + Fusion |
|
|
108
|
+
| INFRA | Infra Coder | Docker |
|
|
109
|
+
| DOC | Doc Writer | — |
|
|
110
|
+
| Todas | Reviewer | — |
|
|
111
|
+
| Todas | Security Reviewer | — (gate pós-dev) |
|
|
112
|
+
|
|
113
|
+
### Loop de desenvolvimento
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
Por task: implement → test unit → fix → lint → commit → review → fix → review (max 3)
|
|
117
|
+
Por fase: integration tests → fix
|
|
118
|
+
Por scope: E2E tests (CAs) → fix → Security Review → /sf-merge-docs automático → dev_done
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Regras
|
|
122
|
+
|
|
123
|
+
- Implement + testes na mesma task (não separar)
|
|
124
|
+
- Agente selecionado pelo prefixo: BACK-* → Backend Coder
|
|
125
|
+
- Modelo por tamanho: S/M → Sonnet, L → Opus
|
|
126
|
+
- 1 commit por task: `tipo(TASK-ID): descrição`
|
|
127
|
+
- Quality gate validado pelo Reviewer após cada task
|
|
128
|
+
- Limite de retry: 3 reprovações → escalar pro usuário
|
|
129
|
+
- `/sf-merge-docs` automático no final (diff semântico PRD+TRD ↔ docs/)
|
|
130
|
+
|
|
131
|
+
## /sf-start é único
|
|
132
|
+
|
|
133
|
+
| Aspecto | v4 (atual) |
|
|
134
|
+
|---------|-----------|
|
|
135
|
+
| Comando de entrada | `/sf-start <nome>` (único pra bootstrap E features) |
|
|
136
|
+
| Input | `workspace/Input/<nome>/` (nome livre) |
|
|
137
|
+
| Discovery | OBRIGATÓRIO — passo do `/sf-start` antes do `/sf-extract` |
|
|
138
|
+
| Extração | `PRD.md` e/ou `TRD.md` (condicional ao conteúdo) |
|
|
139
|
+
| Aprovações | DUPLAS: PM aprova PRD, dev aprova TRD |
|
|
140
|
+
| Design | Gera `specs/{nome}/` sempre; `docs/` + `projetos.yaml` só em first-run |
|
|
141
|
+
| Gera `docs/` | Só em first_run (detectado via ausência de docs/) |
|
|
142
|
+
| `/sf-merge-docs` | Obrigatório após `/sf-dev` (chamado automaticamente) |
|
|
143
|
+
| Pré-requisito | Insumos em `workspace/Input/<nome>/` |
|
|
144
|
+
|
|
145
|
+
> No v3 existia SDD como doc intermediário entre PRD e specs/. No v4, SDD foi
|
|
146
|
+
> eliminado — `specs/` deriva direto de PRD+TRD aprovados. TRD foi ressuscitado
|
|
147
|
+
> como peer do PRD, aprovado pelo dev.
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
# Instruções para Arquivos Sensíveis
|
|
2
|
-
|
|
3
|
-
> Regras especiais para arquivos que requerem cuidado extra.
|
|
4
|
-
|
|
5
|
-
## Arquivos que NUNCA devem ser modificados pelo agente
|
|
6
|
-
|
|
7
|
-
- `workspace/Input/**/*` — Insumos brutos do usuário. Somente leitura.
|
|
8
|
-
- `.env`, `.env.*` — Variáveis de ambiente com secrets.
|
|
9
|
-
- `docs/decisions.md` — decisões aceitas são imutáveis (apenas adicionar novas, com status "substituída por ADR-XXX" na original).
|
|
10
|
-
|
|
11
|
-
## Arquivos que requerem aprovação antes de modificar
|
|
12
|
-
|
|
13
|
-
- `docs/*` — Documentação global. Só alterar via /merge-docs após /dev.
|
|
14
|
-
- `.github/rules.md` — Regras de desenvolvimento. Alteração deve ser explícita.
|
|
15
|
-
- `.github/copilot-instructions.md` — Meta-regras. Alteração requer aprovação.
|
|
16
|
-
- `.github/skills/*` — Skills do workflow. Alteração requer aprovação.
|
|
17
|
-
- `.github/agents/*` — Perfis de agentes. Alteração requer aprovação.
|
|
18
|
-
|
|
19
|
-
## Arquivos com formato rígido (gerados por skills)
|
|
20
|
-
|
|
21
|
-
- `workspace/Output/*/.context.md` — YAML frontmatter, apenas skills atualizam.
|
|
22
|
-
- `workspace/Output/*/.extract-log.md` — Append-only, hashes obrigatórios.
|
|
23
|
-
- `workspace/Output/*/PRD.md` — Seguir template exato (
|
|
24
|
-
- `workspace/Output/*/
|
|
25
|
-
- `specs/{nome}/tasks.md` — IDs sequenciais, campos obrigatórios (gerado pelo /sf-plan).
|
|
26
|
-
- `workspace/Output/*/Progresso.md` — Tabelas com formato fixo.
|
|
27
|
-
|
|
28
|
-
## Arquivos que nunca devem conter secrets
|
|
29
|
-
|
|
30
|
-
- Qualquer arquivo `.md` em docs/
|
|
31
|
-
- `docker-compose.yml` — usar variáveis de ambiente, não valores diretos
|
|
32
|
-
- Código fonte — usar `appsettings.json` + environment variables, não hardcoded
|
|
1
|
+
# Instruções para Arquivos Sensíveis
|
|
2
|
+
|
|
3
|
+
> Regras especiais para arquivos que requerem cuidado extra.
|
|
4
|
+
|
|
5
|
+
## Arquivos que NUNCA devem ser modificados pelo agente
|
|
6
|
+
|
|
7
|
+
- `workspace/Input/**/*` — Insumos brutos do usuário. Somente leitura.
|
|
8
|
+
- `.env`, `.env.*` — Variáveis de ambiente com secrets.
|
|
9
|
+
- `docs/decisions.md` — decisões aceitas são imutáveis (apenas adicionar novas, com status "substituída por ADR-XXX" na original).
|
|
10
|
+
|
|
11
|
+
## Arquivos que requerem aprovação antes de modificar
|
|
12
|
+
|
|
13
|
+
- `docs/*` — Documentação global. Só alterar via /merge-docs após /dev.
|
|
14
|
+
- `.github/rules.md` — Regras de desenvolvimento. Alteração deve ser explícita.
|
|
15
|
+
- `.github/copilot-instructions.md` — Meta-regras. Alteração requer aprovação.
|
|
16
|
+
- `.github/skills/*` — Skills do workflow. Alteração requer aprovação.
|
|
17
|
+
- `.github/agents/*` — Perfis de agentes. Alteração requer aprovação.
|
|
18
|
+
|
|
19
|
+
## Arquivos com formato rígido (gerados por skills)
|
|
20
|
+
|
|
21
|
+
- `workspace/Output/*/.context.md` — YAML frontmatter, apenas skills atualizam.
|
|
22
|
+
- `workspace/Output/*/.extract-log.md` — Append-only, hashes obrigatórios.
|
|
23
|
+
- `workspace/Output/*/PRD.md` — Seguir template exato (condicional — só se insumos têm produto).
|
|
24
|
+
- `workspace/Output/*/TRD.md` — Seguir template exato, §Sistema + §Área-X gateáveis por área.
|
|
25
|
+
- `specs/{nome}/tasks.md` — IDs sequenciais, campos obrigatórios (gerado pelo /sf-plan).
|
|
26
|
+
- `workspace/Output/*/Progresso.md` — Tabelas com formato fixo.
|
|
27
|
+
|
|
28
|
+
## Arquivos que nunca devem conter secrets
|
|
29
|
+
|
|
30
|
+
- Qualquer arquivo `.md` em docs/
|
|
31
|
+
- `docker-compose.yml` — usar variáveis de ambiente, não valores diretos
|
|
32
|
+
- Código fonte — usar `appsettings.json` + environment variables, não hardcoded
|