From cc440118c87605583f9a5ac621fe7f5ab74342e2 Mon Sep 17 00:00:00 2001 From: clawbot <35+clawbot@noreply.example.org> Date: Tue, 6 Oct 2026 04:15:16 +0200 Subject: [PATCH] Say where a repository's own .gitignore and .editorconfig entries go (closes #103) The canonical `.gitignore` had no place for a repository's own build outputs, and nothing said a repository's own `.editorconfig` sections survive a re-vendor, so re-vendoring dropped them: a Go repository lost `/bin/`, `*.test` and `*.out`, and its tabs for Go files. `.gitignore` now ends with a section, like `.dockerignore`'s header, where a repository adds its own build outputs (a root binary written `/myapp`) and its own environment-template negations, which a re-vendor keeps. `.editorconfig` gains `[*.go]` with tabs and the same kind of closing note. `prompts/REPO_POLICIES.md`, both checklists and the Go styleguide say these two files are the canonical content followed by the repository's own entries. Closes https://git.eeqj.de/sneak/prompts/issues/104 too. Model: opus-5-5 --- .editorconfig | 6 ++++++ .gitignore | 6 +++++- TODO.md | 9 +++++++++ prompts/CODE_STYLEGUIDE_GO.md | 7 ++++--- prompts/EXISTING_REPO_CHECKLIST.md | 15 ++++++++++----- prompts/NEW_REPO_CHECKLIST.md | 19 +++++++++++-------- prompts/REPO_POLICIES.md | 17 ++++++++++++----- 7 files changed, 57 insertions(+), 22 deletions(-) diff --git a/.editorconfig b/.editorconfig index 2fe0ce0..de84fae 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,3 +10,9 @@ insert_final_newline = true [Makefile] indent_style = tab + +[*.go] +indent_style = tab + +# This repository's own sections, such as one for another language it +# uses, go below this comment, and a re-vendor keeps them. diff --git a/.gitignore b/.gitignore index 534d4e2..e4aa242 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ node_modules/ # Environment files. `*.env` covers bare `.env` and the `prod.env` # convention. Only the templates `example.env` and `sample.env` are # re-included below. A repository that commits any other template adds -# its own negation after these lines, for example `!.env.example`. +# its own negation at the end of this file, for example `!.env.example`. *.[eE][nN][vV] .[eE][nN][vV].* .[eE][nN][vV][rR][cC] @@ -45,3 +45,7 @@ node_modules/ [iI][dD]_[eE][cC][dD][sS][aA]_[sS][kK] [iI][dD]_[eE][dD]25519 [iI][dD]_[eE][dD]25519_[sS][kK] + +# This repository's own entries, such as its build outputs, go below +# this comment, and a re-vendor keeps them. Anchor a binary built at the +# root: `/myapp`, never `myapp`, which also ignores `cmd/myapp/`. diff --git a/TODO.md b/TODO.md index 20c8a60..3194bce 100644 --- a/TODO.md +++ b/TODO.md @@ -21,6 +21,15 @@ fmt-check, and commit. # Completed Steps +- 2026-10-06: The canonical `.gitignore` and `.editorconfig` now each end with a + comment saying the repository's own entries go below it and a re-vendor keeps + them (issue 103, which took in issue 104), as `.dockerignore`'s header already + does. `.editorconfig` gains a `[*.go]` section with tabs, since `gofmt` + decides Go indentation everywhere. `REPO_POLICIES.md` and both checklists say + that each of these two files is the canonical content followed by the + repository's own entries, which a re-vendor keeps, and the Go styleguide puts + `*.log`, `*.out`, `*.test` and binaries among those entries. Common outputs + stay out of the canonical `.gitignore`; each repository lists its own. - 2026-10-05: `script/cibuild`, `script/docker`, `script/lint` and `script/test` now assign the image tag from `script/projectname` on its own line before the `docker build` (issue 101), so `set -e` stops the script where diff --git a/prompts/CODE_STYLEGUIDE_GO.md b/prompts/CODE_STYLEGUIDE_GO.md index 1e6fd99..fd95f55 100644 --- a/prompts/CODE_STYLEGUIDE_GO.md +++ b/prompts/CODE_STYLEGUIDE_GO.md @@ -1,6 +1,6 @@ --- title: Code Styleguide — Go -last_modified: 2026-10-04 +last_modified: 2026-10-06 --- 1. Try to hard wrap long lines at 77 characters or less. @@ -148,8 +148,9 @@ last_modified: 2026-10-04 handle HTTP requests. Don't use methods or your top level functions as handlers. -1. Provide a .gitignore file that ignores at least `*.log`, `*.out`, and - `*.test` files, as well as any binaries. +1. The repository's own entries at the end of `.gitignore`, which a re-vendor + keeps, ignore at least `*.log`, `*.out`, and `*.test` files, as well as any + binaries. 1. Constructors **must** be called `New()`. `modulename.New()` works great if you name the packages properly. If the constructor creates an instance from diff --git a/prompts/EXISTING_REPO_CHECKLIST.md b/prompts/EXISTING_REPO_CHECKLIST.md index 0540bb5..28bb055 100644 --- a/prompts/EXISTING_REPO_CHECKLIST.md +++ b/prompts/EXISTING_REPO_CHECKLIST.md @@ -1,6 +1,6 @@ --- title: Existing Repo Checklist -last_modified: 2026-10-04 +last_modified: 2026-10-06 --- Use this checklist when beginning work in a repo that may not yet conform to our @@ -28,13 +28,18 @@ with your task. root — never a file or directory named after one agent tool, such as `CLAUDE.md` or `.claude/`, and never separate memory files. Move what any such committed file says into `AGENTS.md` and delete it. -- [ ] `.gitignore` is comprehensive (OS, editor, agent scratch, language - artifacts, secrets) — fetch from +- [ ] `.gitignore` is comprehensive (OS, editor, agent scratch, secrets, the + repo's own build outputs) — fetch from `https://git.eeqj.de/sneak/prompts/raw/branch/main/.gitignore` if missing. An existing repo usually has a hand-written one that is never re-fetched, - so check the entries rather than the file's presence. + so check the entries rather than the file's presence. The file is the + canonical content followed by the repo's own entries, such as its + binaries; a re-vendor replaces the canonical part and keeps those entries. - [ ] `.editorconfig` exists — fetch from - `https://git.eeqj.de/sneak/prompts/raw/branch/main/.editorconfig` + `https://git.eeqj.de/sneak/prompts/raw/branch/main/.editorconfig`. The + file is the canonical content followed by the repo's own sections, such as + one for another language it uses; a re-vendor replaces the canonical part + and keeps those sections. - [ ] `Dockerfile` and `.dockerignore` exist; the Dockerfile carries a `lint` phase and a `test` phase, and the final stage carries a `COPY --from=` of a harmless file from each — fetch `.dockerignore` from diff --git a/prompts/NEW_REPO_CHECKLIST.md b/prompts/NEW_REPO_CHECKLIST.md index b425e37..56619a3 100644 --- a/prompts/NEW_REPO_CHECKLIST.md +++ b/prompts/NEW_REPO_CHECKLIST.md @@ -1,6 +1,6 @@ --- title: New Repo Checklist -last_modified: 2026-10-04 +last_modified: 2026-10-06 --- Use this checklist when creating a new repository from scratch. Follow the steps @@ -34,14 +34,17 @@ Template files can be fetched from: ## Fetch Template Files - [ ] `.gitignore` — fetch from - `https://git.eeqj.de/sneak/prompts/raw/branch/main/.gitignore`, extend for - language-specific artifacts. Extensions are written to `.gitignore`'s own - semantics, where an unanchored pattern already matches at every depth: - never add a `**/` prefix here, which is a `.dockerignore` form. The - canonical file already carries `.claude/` so agent worktrees cannot be - committed by accident. + `https://git.eeqj.de/sneak/prompts/raw/branch/main/.gitignore`, then add + the repo's own build outputs, such as its binaries, at the end of the + file, where a re-vendor keeps them. Extensions are written to + `.gitignore`'s own semantics, where an unanchored pattern already matches + at every depth: never add a `**/` prefix here, which is a `.dockerignore` + form. The canonical file already carries `.claude/` so agent worktrees + cannot be committed by accident. - [ ] `.editorconfig` — fetch from - `https://git.eeqj.de/sneak/prompts/raw/branch/main/.editorconfig` + `https://git.eeqj.de/sneak/prompts/raw/branch/main/.editorconfig`, then + add the repo's own sections, such as one for another language it uses, at + the end of the file, where a re-vendor keeps them. - [ ] `Makefile` — fetch from `https://git.eeqj.de/sneak/prompts/raw/branch/main/Makefile`, adapt targets for the project's language and tools diff --git a/prompts/REPO_POLICIES.md b/prompts/REPO_POLICIES.md index 7fa4bf4..c72195c 100644 --- a/prompts/REPO_POLICIES.md +++ b/prompts/REPO_POLICIES.md @@ -1,6 +1,6 @@ --- title: Repository Policies -last_modified: 2026-10-04 +last_modified: 2026-10-06 --- This document covers repository structure, tooling, and workflow standards. Code @@ -387,9 +387,12 @@ style conventions are in separate documents: - `.gitignore` should be comprehensive from the start: OS files (`.DS_Store`), editor files (`.swp`, `*~`), in-repo agent scratch directories (`.claude/`), - language build artifacts, and `node_modules/`. Fetch the standard `.gitignore` - from `https://git.eeqj.de/sneak/prompts/raw/branch/main/.gitignore` when - setting up a new repo. These patterns are written to `.gitignore`'s own + `node_modules/`, and the repo's own build outputs. Fetch the standard + `.gitignore` from + `https://git.eeqj.de/sneak/prompts/raw/branch/main/.gitignore` when setting up + a new repo. A repo's `.gitignore` is the standard file followed by the repo's + own entries, such as its binaries; a re-vendor replaces the standard part and + keeps those entries. These patterns are written to `.gitignore`'s own semantics, in which an unanchored pattern already matches at every depth; they are not a `.dockerignore` and must not be transplanted into one unmodified. @@ -641,7 +644,11 @@ style conventions are in separate documents: Never edit existing migrations after release. - All repos should have an `.editorconfig` enforcing the project's indentation - settings. + settings: the standard file from + `https://git.eeqj.de/sneak/prompts/raw/branch/main/.editorconfig`, which sets + tabs for `Makefile` and Go files, followed by the repo's own sections, such as + one for another language it uses. A re-vendor replaces the standard part and + keeps those sections. - Avoid putting files in the repo root unless necessary. Root should contain only project-level config files (`README.md`, `AGENTS.md`, `Makefile`,