Install mise:
curl https://mise.run | shThen install tools and verify:
mise install
mise run build
mise run test
mise run lintInstall git hooks:
lefthook install- Always work on a feature branch — never commit directly to
main. - Write tests before implementation (TDD).
- Run
go mod tidyafter adding/removing dependencies. - Use
errors.Is/errors.Asfor error checks — never string-match errors. - All logic lives in
internal/;cmd/iris/main.goonly wires cobra commands.
Every provider must have two fixture files in internal/providers/testdata/:
<provider>_input.{json,toml}— realistic on-disk config as a user would have it (source of truth forParsetests).<provider>_expected.{json,toml}— exact output iris produces when it round-trips that input throughParsethenGenerate(source of truth forGeneratetests).
The canonical test pattern:
func TestXxxProvider_Parse_ExtractsServersFromFixture(t *testing.T) {
content, _ := os.ReadFile("testdata/xxx_input.json")
parsed, err := p.Parse(string(content))
// assert specific fields on parsed servers
}
func TestXxxProvider_Generate_FixtureMatch(t *testing.T) {
content, _ := os.ReadFile("testdata/xxx_input.json")
servers, _ := p.Parse(string(content))
got, _ := p.Generate(servers, string(content))
expected, _ := os.ReadFile("testdata/xxx_expected.json")
assert got == string(expected)
}To regenerate expected files after a deliberate format change, run:
go test -tags gen_expected ./internal/providers/... -run TestGenExpected -v(The generator lives in internal/providers/gen_expected_test.go — create it locally, do not commit it.)
Follow Conventional Commits:
feat:new featurefix:bug fixchore:tooling / dependencies / CIdocs:documentation onlytest:tests onlyrefactor:no behaviour change
Fill in the PR template. CI must be green before merge. Squash-merge is enforced; branches are deleted after merge.