Indentation
code specs/code/indentation.kmd
Indentação canônica da Koder Stack: **2 espaços** em todas as linguagens (exceto Makefiles onde a sintaxe exige tab). Tabs proibidos; trailing whitespace proibido; final newline obrigatório. Line length 100 cols soft / 120 hard. EditorConfig template canônico versionado. CI gate via `editorconfig-checker`.
Quando esta spec se aplica
Triggers primários
- Criar/editar código fonte na Koder Stack
Todos os triggers
- Criar novo arquivo de código fonte em qualquer linguagem
- Configurar editor/IDE pra projeto Koder
- Resolver dispute sobre tab vs espaço
- Refatorar arquivo legacy com indentação inconsistente
Corpo da especificação
Spec — Indentation
Facet Code do Koder Design (
rfcs/design-RFC-001§ Facets). Aplica a toda linguagem usada na Stack.
Regras
R1. Largura da indentação
2 espaços em toda linguagem. Sem exceções por linguagem (diferente de PEP-8 / gofmt etc. que sugerem 4 ou tab — a Koder unifica em 2 pra simplificar context-switching entre Koda, Go, Dart, Rust, Python, shell).
Exceção única: Makefiles — a sintaxe Make exige tab no início de recipe lines. Tab apenas onde a sintaxe obriga.
R2. Tabs proibidos
Nenhum tab em arquivo de código fonte. EditorConfig + linter falha
se encontrar \t.
Exceção: arquivos onde a sintaxe exige tab (Makefiles, Go gerado por
go fmt *na Koder Stack é re-formatado pra 2 espaços via gofmt -s
- pós-processo* — ver R7).
R3. Trailing whitespace proibido
Espaços no final de linha são erro de lint hard.
R4. Final newline obrigatório
Todo arquivo termina em \n. Sem CRLF (LF only).
R5. Line length
- Soft limit: 100 colunas (warning)
- Hard limit: 120 colunas (error)
Aplica a código. Não aplica a:
- URLs em comentários/docs
- Strings literais que representam dados externos
- Tabelas em
.kmd/.md(markdown)
R6. Encoding
UTF-8 sem BOM.
R7. Linguagens com formatter próprio
Quando a linguagem tem formatter oficial (gofmt, dart format,
rustfmt, black, prettier):
| Linguagem | Formatter | Configuração |
|---|---|---|
| Go | gofmt produces tabs por default. Pós-processo Koder: `gofmt |
sed 's/\t/ /g'ou usargoimports -tabwidth=2` (futuro: ferramenta Koder) |
| Dart | dart format --line-length=100 |
Default já é 2 espaços |
| Rust | rustfmt com tab_spaces = 2 em rustfmt.toml |
|
| Python | black --line-length=100 (black usa 4 por default — Koda overrides via --config) |
|
| JS/TS | prettier --tab-width 2 --print-width 100 |
|
| Shell | shfmt -i 2 -ci |
Princípio: o formatter oficial roda com configuração Koder custom pra produzir 2 espaços. O EditorConfig template canônico declara isso.
R8. Continuação de linha
Quando linha excede 100 cols, quebrar:
- Antes de operador binário (alinha leitura)
- Após vírgula em listas longas (mais comum)
- Indentar continuação com 2 espaços extra (não alinhamento
com
(, que vira frágil sob refactor)
# bom
result = compute_something_long(
argument_one,
argument_two,
argument_three,
)
# ruim — alinhamento frágil
result = compute_something_long(argument_one,
argument_two,
argument_three)
EditorConfig template canônico
Localização: meta/docs/stack/specs/code/editorconfig.template.
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120
[Makefile]
indent_style = tab
[*.md]
trim_trailing_whitespace = false # markdown linebreak via 2 trailing spaces
[*.kmd]
trim_trailing_whitespace = false # mesmo motivo do .md
Todo módulo da Koder Stack deve ter .editorconfig na raiz
copiado deste template. /k-housekeep audita.
Audit deterministico
CI roda editorconfig-checker em todo arquivo trackable do git.
Falha em qualquer violação:
- Indent inconsistente
- Tab onde proibido
- Trailing whitespace
- Missing final newline
- Linha > 120 cols (hard)
Migração de código legacy
Quando refatorar arquivo legacy com indentação errada:
- Pull request separado só pra reformat (não misturar com feature changes — git blame fica ilegível)
- Commit message:
style: reformat <file> per code/indentation - Aplicar formatter da linguagem com configuração Koder
Cross-link
code/naming.kmd— naming convention (próximo nível de consistência)code/languages/koda-style.kmd— style específico de Kodapolicies/design-governance.kmd— governance do facet Code
Referências
rfcs/design-RFC-001-koder-design-system.kmdspecs/code/naming.kmdpolicies/design-governance.kmd