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

Todos os triggers

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
  • code/naming.kmd — naming convention (próximo nível de consistência)
  • code/languages/koda-style.kmd — style específico de Koda
  • policies/design-governance.kmd — governance do facet Code

Referências