From 3f8201d532f975abb36debd928c33b5630a3503c Mon Sep 17 00:00:00 2001 From: clawbot Date: Sun, 30 Aug 2026 04:20:42 +0200 Subject: [PATCH] Require thin cmd/ entrypoints: all logic in internal/ or pkg/ (#54) Codifies your ruling (2026-08-30, filed as homoicon issue 555): no project logic outside `internal/` or `pkg/`; each `cmd//` is a single `main.go` whose body is one call into library code. - `CODE_STYLEGUIDE_GO.md`: strengthens the "keep `main` small" rule to the single-call form and adds the no-logic-outside-`internal/`-or-`pkg/` rule. - `REPO_POLICIES.md`: annotates `cmd/` in the canonical subdirectory list accordingly. (Root copy is a symlink; one edit covers both.) Co-authored-by: sneak Reviewed-on: https://git.eeqj.de/sneak/prompts/pulls/54 Co-authored-by: clawbot Co-committed-by: clawbot --- prompts/CODE_STYLEGUIDE_GO.md | 13 +++++++++---- prompts/REPO_POLICIES.md | 4 +++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/prompts/CODE_STYLEGUIDE_GO.md b/prompts/CODE_STYLEGUIDE_GO.md index 043e8f1..ce2b903 100644 --- a/prompts/CODE_STYLEGUIDE_GO.md +++ b/prompts/CODE_STYLEGUIDE_GO.md @@ -124,10 +124,15 @@ last_modified: 2026-03-18 1. Keep the `main()` function as small as possible. -1. Keep the `main` package as small as possible. Move as much code as is - feasible to a library package, even if it's an internal one. `main` is just - an entrypoint to your code, not a place for implementations. Exception: - single-file scripts. +1. Keep the `main` package as small as possible. Each `cmd//` directory + contains a single `main.go` whose body is one call into library code (for + example `os.Exit(cli.Main())` calling `internal/cli`). All CLI logic — flag + parsing, subcommand dispatch, argument handling, output formatting — lives + in `internal/` or `pkg/`, not in `cmd/`. `main` is just an entrypoint to + your code, not a place for implementations. Exception: single-file scripts. + +1. No project logic outside `internal/` or `pkg/`. Anything in `cmd/` is a thin + entrypoint only. 1. HTTP HandleFuncs should be returned from methods or functions that need to handle HTTP requests. Don't use methods or your top level functions as diff --git a/prompts/REPO_POLICIES.md b/prompts/REPO_POLICIES.md index 9aba6b0..32a0571 100644 --- a/prompts/REPO_POLICIES.md +++ b/prompts/REPO_POLICIES.md @@ -387,7 +387,9 @@ style conventions are in separate documents: language-specific config). Everything else goes in a subdirectory. Canonical subdirectory names: - `bin/` — executable scripts and tools - - `cmd/` — Go command entrypoints + - `cmd/` — Go command entrypoints; thin only: one `main.go` per binary whose + body is a single call into `internal/` or `pkg/`, no project logic in + `cmd/` - `configs/` — configuration templates and examples - `deploy/` — deployment manifests (k8s, compose, terraform) - `docs/` — documentation and markdown (README.md stays in root)