Fix documentation inconsistencies and bump document versions

This commit is contained in:
Jan Doubravský
2026-08-18 12:22:57 +02:00
parent 5c0f2f758f
commit b337da11a6
17 changed files with 170 additions and 27 deletions
+79
View File
@@ -0,0 +1,79 @@
# Changelog
All notable changes to this documentation repository, grouped by version and release date.
Document versions of the individual guideline files are tracked separately in their headers.
## 0.4.0 — 2026-08-18
### Added
- Skill versioning: every `SKILL.md` now carries `metadata.version``changelog` v2, `check` v1,
`commit` v2, `documentation` v1, `documentation_context` v2. The skill format has no top-level
`version` field; `metadata` is one of the six Agent Skills spec fields, so the frontmatter still
packages and uploads cleanly
- "Skills" section in `README.md` describing the versioning convention, the install location
(`~/.claude/skills/`) and the rule that the folder name — not `name:` — is the command
- The five skills listed individually in the `README.md` structure tree
- `AGENTS.md` v5 → v6: new "Commit messages" subsection under Git — commits and pull requests must
never carry AI authorship (`Co-Authored-By`, "Generated with …", tool signatures or emoji footers).
The subsection also states the single-line verbal English style, so assistants without the `commit`
skill get the same rules; the AI-authorship rule was added to the skill as well
- `CHANGELOG.md` for this repository, with history backfilled from the git log
- Explicit line length for Rust: 100 characters (rustfmt default `max_width`) in both Rust design documents
- `README.md`, `docs/`, `prebuild.py` and the PyInstaller `.spec` to the template structure in `Python/TEMPLATE.md`
- Note in `Python/TEMPLATE.md` that `AGENTS.md` and `DESIGN_DOCUMENT.md` are not part of the template
- `README.md` to the session read list in `Claude/CLAUDE.md`, plus a missing top-level heading
### Changed
- Document versions bumped for the structural changes released on 2026-08-18:
`DESIGN_DOCUMENT.md` v8 → v9, `DESIGN_DOCUMENT_MODULE.md` v1 → v2,
`Rust/DESIGN_DOCUMENT.md` v1 → v2, `Rust/DESIGN_DOCUMENT_LIB.md` v1 → v2,
`DESIGN_DOCUMENT_GODOT.md` v1 → v2
- `Project template/CHANGELOG.md` now names the project manifest generically
(`pyproject.toml`, `Cargo.toml`, `project.godot`) instead of `pyproject.toml` only
- Godot debug constant renamed `Constants.DEBUG``Constants.DEFAULT_DEBUG`, matching the Python reference module
- `README.md` step 1 of "Starting a new project" now also requires writing a `README.md`
- `Python/TEMPLATE.md` entry point is named by purpose or tool name instead of `main.py`
- `prebuild.py` loads `.env` before importing `src.constants` instead of relying on the import side effect
### Fixed
- Skill folder `Claude/skills/context/` renamed to `documentation_context/`, with the frontmatter
`name` matched to it. The folder name is what Claude Code turns into the command, so the old
mismatch meant installing from this repository would have changed `/documentation_context`
into `/context`
- Removed the misplaced lock-file rule from the Testing sections of `DESIGN_DOCUMENT_MODULE.md` (§9)
and `Rust/DESIGN_DOCUMENT_LIB.md` (§8) — it already belongs to the Poetry / Distribution sections
## 0.3.0 — 2026-08-18
### Added
- `Zscaler/ZSCALER_CERTIFICATE.md` — full certificate setup for Node, Python, git and cargo
- Language-specific `.gitignore` files for Python, Rust and Godot, plus a shared core in `Project template/`
- `poetry.lock` and `prebuild.py` sections in `Python/DESIGN_DOCUMENT.md`
### Changed
- Unified task notation across all languages on the Todo Tree tags `TODO`, `FIXME`, `BUG`, `HACK`, `NOTE`
- `AGENTS.md` v4 → v5: rewritten as strictly language-agnostic, naming no concrete tool
- Python line length 150 → 120 characters
- Rust edition 2021 → 2024 (requires Rust 1.85 or newer)
- Godot project version key corrected to `application/config/version`
- Every design document now lists `README.md` among the core root documents
### Removed
- `Zscaler/NODE_EXTRA_CA_CERTS.md`, superseded by `ZSCALER_CERTIFICATE.md`
## 0.2.0 — 2026-06-24
### Added
- `Godot/DESIGN_DOCUMENT_GODOT.md` — Godot development guidelines (v1)
## 0.1.0 — 2026-05-25
### Added
- `Rust/DESIGN_DOCUMENT.md` and `Rust/DESIGN_DOCUMENT_LIB.md` — Rust guidelines for applications and libraries (v1)
- `Claude/``CLAUDE.md`, `AGENTS.md` (v4) and the custom skills `changelog`, `check`, `commit`, `context`, `documentation`
- `Python/``DESIGN_DOCUMENT.md` (v8), `DESIGN_DOCUMENT_MODULE.md` (v1), `TEMPLATE.md`, and the reference `constants.py` module with tests
- `Project template/``PROJECT.md` and `CHANGELOG.md` templates
### Changed
- Documentation organised into topic folders: `Claude/`, `Python/`, `Zscaler/`, `Project template/`
- `README.md` rewritten to describe the repository itself instead of a single project
+8 -1
View File
@@ -1,6 +1,6 @@
# AI Agents - Project Rules # AI Agents - Project Rules
**Document Version:** v5 (independent, incremented on structural changes) **Document Version:** v6 (independent, incremented on structural changes)
Language-agnostic rules for AI assistants (Claude Code, Cursor, Copilot, etc.). Language-agnostic rules for AI assistants (Claude Code, Cursor, Copilot, etc.).
@@ -68,6 +68,13 @@ Where this file and a design document disagree, **the design document wins**.
- **Never commit shared documentation** (`AGENTS.md`, `DESIGN_DOCUMENT*.md`) — it comes from the documentation repository, not from the project - **Never commit shared documentation** (`AGENTS.md`, `DESIGN_DOCUMENT*.md`) — it comes from the documentation repository, not from the project
- `README.md`, `PROJECT.md` and `CHANGELOG.md` **are committed** — they are project-specific - `README.md`, `PROJECT.md` and `CHANGELOG.md` **are committed** — they are project-specific
### Commit messages
- **Never sign commits with AI authorship** — no `Co-Authored-By: Claude` (or any other assistant), no "Generated with …" line, no tool name or emoji footer. The same applies to pull request descriptions and issue comments.
- The commit author is the human running the tool; the message describes the change, nothing else
- Single-line verbal style — "Add X", "Fix Y", "Refactor Z" — never a filename-style message
- Written in English
## Versioning ## Versioning
- Follow semantic versioning (MAJOR.MINOR.PATCH) - Follow semantic versioning (MAJOR.MINOR.PATCH)
+2
View File
@@ -1,9 +1,11 @@
# CLAUDE.md
## First-time setup ## First-time setup
**At the start of every new session, read all of the following files before doing anything else:** **At the start of every new session, read all of the following files before doing anything else:**
- `CLAUDE.md` (this file) - `CLAUDE.md` (this file)
- `README.md`
- `AGENTS.md` - `AGENTS.md`
- `PROJECT.md` - `PROJECT.md`
- `CHANGELOG.md` - `CHANGELOG.md`
+2
View File
@@ -1,6 +1,8 @@
--- ---
name: changelog name: changelog
description: Updates changelog in project description: Updates changelog in project
metadata:
version: v2
--- ---
Take known info and make changes to CHANGELOG.md to make them up-to-date. Take known info and make changes to CHANGELOG.md to make them up-to-date.
+2
View File
@@ -1,5 +1,7 @@
--- ---
name: check name: check
description: Check for failed tests description: Check for failed tests
metadata:
version: v1
--- ---
Try running tests and investigate failed results Try running tests and investigate failed results
+3
View File
@@ -1,6 +1,8 @@
--- ---
name: commit name: commit
description: Updates changelog and proposes a concise verbal git commit message description: Updates changelog and proposes a concise verbal git commit message
metadata:
version: v2
--- ---
1. Run the changelog skill: read git log and staged changes, then update CHANGELOG.md accordingly (same as /changelog). 1. Run the changelog skill: read git log and staged changes, then update CHANGELOG.md accordingly (same as /changelog).
@@ -9,4 +11,5 @@ description: Updates changelog and proposes a concise verbal git commit message
- Concise, verbal style — e.g. "Add X", "Fix Y", "Refactor Z" - Concise, verbal style — e.g. "Add X", "Fix Y", "Refactor Z"
- NOT filename-style — never "update_something.py" or "changes to foo" - NOT filename-style — never "update_something.py" or "changes to foo"
- In English - In English
- **No AI authorship** — never append `Co-Authored-By: Claude`, a "Generated with …" line, or any tool signature or emoji footer. The same applies to pull request descriptions.
- Do NOT run git commit — only propose the message and wait for user confirmation. - Do NOT run git commit — only propose the message and wait for user confirmation.
+2
View File
@@ -1,5 +1,7 @@
--- ---
name: documentation name: documentation
description: Updates documentation in project description: Updates documentation in project
metadata:
version: v1
--- ---
Create or update documentation of project in docs/ folder. Documentation should contain description of each part of program and documentation of each function. Separate documents for each module. Write in markdown format. Create or update documentation of project in docs/ folder. Documentation should contain description of each part of program and documentation of each function. Separate documents for each module. Write in markdown format.
@@ -1,6 +1,8 @@
--- ---
name: context name: documentation_context
description: Compress docs/ into CONTEXT.md at project root — minimum tokens, lossless description: Compress docs/ into CONTEXT.md at project root — minimum tokens, lossless
metadata:
version: v2
--- ---
Read every `.md` file in `docs/`. Generate `CONTEXT.md` at the project root. Read every `.md` file in `docs/`. Generate `CONTEXT.md` at the project root.
+4 -4
View File
@@ -1,6 +1,6 @@
# Godot Development Guidelines # Godot Development Guidelines
**Document Version:** v1 **Document Version:** v2
> **Note on Versioning:** > **Note on Versioning:**
> - This document version is independent — reused across Godot projects > - This document version is independent — reused across Godot projects
@@ -90,7 +90,7 @@ Use a dedicated `Log` autoload that wraps `print`/`push_warning`/`push_error` wi
The file sink retains **max 10 log files**. Each run creates a new file via the timestamp in the filename. The file sink retains **max 10 log files**. Each run creates a new file via the timestamp in the filename.
The `DEBUG` sink is only active when `Constants.DEBUG` is `true` (controlled by an `ENV_DEBUG` value read at startup, e.g. from a `user://settings.cfg` or an export feature tag). The `DEBUG` sink is only active when `Constants.DEFAULT_DEBUG` is `true` (controlled by an `ENV_DEBUG` value read at startup, e.g. from a `user://settings.cfg` or an export feature tag).
Additional sinks (e.g. an in-game debug overlay / console panel) may be added per project. Additional sinks (e.g. an in-game debug overlay / console panel) may be added per project.
@@ -112,7 +112,7 @@ Additional sinks (e.g. an in-game debug overlay / console panel) may be added pe
## 7. Settings and Secrets ## 7. Settings and Secrets
- Store user/runtime config in `user://settings.cfg` via `ConfigFile` - Store user/runtime config in `user://settings.cfg` via `ConfigFile`
- Toggle debug behaviour with an `ENV_DEBUG`-style flag read at startup into `Constants.DEBUG` - Toggle debug behaviour with an `ENV_DEBUG`-style flag read at startup into `Constants.DEFAULT_DEBUG`
- Never commit any secrets; keep them out of `project.godot` and committed `.tres`/`.cfg` files - Never commit any secrets; keep them out of `project.godot` and committed `.tres`/`.cfg` files
--- ---
@@ -191,7 +191,7 @@ When the game is distributed as a standalone build:
godot --headless --export-release "Windows Desktop" build/Game.exe godot --headless --export-release "Windows Desktop" build/Game.exe
``` ```
- Compiled builds are stored in `build/` (or `dist/`). Decide per project whether builds are committed — for small internal distribution the repository may serve as the channel; otherwise keep `build/` in `.gitignore` - Compiled builds are stored in `build/` (or `dist/`). Decide per project whether builds are committed — for small internal distribution the repository may serve as the channel; otherwise keep `build/` in `.gitignore`
- Strip debug-only nodes and disable `Constants.DEBUG` in release presets - Strip debug-only nodes and disable `Constants.DEFAULT_DEBUG` in release presets
> This section applies only to projects that produce shippable builds. > This section applies only to projects that produce shippable builds.
+1 -1
View File
@@ -16,5 +16,5 @@ Each version entry uses these sections (include only those that apply):
- Follow semantic versioning: `MAJOR.MINOR.PATCH` - Follow semantic versioning: `MAJOR.MINOR.PATCH`
- Newest version goes at the top - Newest version goes at the top
- Always update this file before bumping the version in `pyproject.toml` - Always update this file before bumping the version in the project manifest (`pyproject.toml`, `Cargo.toml`, `project.godot`)
- Document changes as they are made, not all at once at release time - Document changes as they are made, not all at once at release time
+1 -1
View File
@@ -1,6 +1,6 @@
# Python Development Guidelines # Python Development Guidelines
**Document Version:** v8 **Document Version:** v9
> **Note on Versioning:** > **Note on Versioning:**
> - This document version is independent — reused across projects > - This document version is independent — reused across projects
+1 -2
View File
@@ -1,6 +1,6 @@
# Python Library Development Guidelines # Python Library Development Guidelines
**Document Version:** v1 **Document Version:** v2
> **Note on Versioning:** > **Note on Versioning:**
> - This document version is independent — reused across projects > - This document version is independent — reused across projects
@@ -127,7 +127,6 @@ Define specific exception types in `src/<package>/exceptions.py`. Use a fail-fas
- **pytest** only — no `unittest`, no `TestCase` classes, no `self.assert*` - **pytest** only — no `unittest`, no `TestCase` classes, no `self.assert*`
- Arrange-Act-Assert pattern - Arrange-Act-Assert pattern
- Test naming: `test_<action>_<context>` - Test naming: `test_<action>_<context>`
- Do not commit `poetry.lock` — this is a library; consumers pin their own dependencies
--- ---
+14 -5
View File
@@ -8,12 +8,15 @@ Create a `template/` folder in project root with reusable files for new Python p
template/ template/
├── .env # Environment variables (sample) ├── .env # Environment variables (sample)
├── .gitignore # Git ignore rules ├── .gitignore # Git ignore rules
├── AGENTS.md # AI assistant rules
├── CHANGELOG.md # Changelog template ├── CHANGELOG.md # Changelog template
├── DESIGN_DOCUMENT.md # Development guidelines
├── PROJECT.md # Project documentation template ├── PROJECT.md # Project documentation template
├── main.py # Entry point with loguru ├── README.md # Project overview, tool descriptions, build instructions
├── <tool_name>.py # Entry point — named by purpose or tool name
├── <tool_name>.spec # PyInstaller spec (only for projects shipping an .exe)
├── prebuild.py # Pre-build script: venv check, version print, console= rewrite
├── pyproject.toml # Poetry config (ruff, mypy, pytest) ├── pyproject.toml # Poetry config (ruff, mypy, pytest)
├── docs/
│ └── .gitkeep # Detailed documentation lives here, never in the root
├── src/ ├── src/
│ ├── __init__.py │ ├── __init__.py
│ ├── _version.py # Version fallback for PyInstaller │ ├── _version.py # Version fallback for PyInstaller
@@ -23,12 +26,16 @@ template/
└── test_constants.py # Basic test └── test_constants.py # Basic test
``` ```
`AGENTS.md` and `DESIGN_DOCUMENT.md` are **not** part of the template — they are copied
into the project root from the documentation repository and are never committed.
## Key Features ## Key Features
- **Version extraction** from `pyproject.toml` with `_version.py` fallback for PyInstaller builds - **Version extraction** from `pyproject.toml` with `_version.py` fallback for PyInstaller builds
- **DEBUG mode** via `ENV_DEBUG=true` in `.env` (adds "DEV" suffix to version: v1.2.3DEV) - **DEBUG mode** via `ENV_DEBUG=true` in `.env` (adds "DEV" suffix to version: v1.2.3DEV)
- **loguru** for logging (never print) - **Build configuration** via `ENV_BUILD_CONSOLE` and `ENV_BUILD_SPEC` in `.env`, applied by `prebuild.py`
- **Poetry** for dependency management - **loguru** for logging (never print for debugging)
- **Poetry** for dependency management, `poetry.lock` committed
- **pytest** for testing (no unittest) - **pytest** for testing (no unittest)
- **ruff + mypy** for linting and type checking (120-character lines) - **ruff + mypy** for linting and type checking (120-character lines)
@@ -38,3 +45,5 @@ template/
- Generic/reusable format - Generic/reusable format
- Keep files simple and minimal - Keep files simple and minimal
- `.gitignore` is the shared core from `Project template/.gitignore` with `Python/.gitignore` appended - `.gitignore` is the shared core from `Project template/.gitignore` with `Python/.gitignore` appended
- Entry point is named by purpose or tool name — a project may have several
- `prebuild.py` and the `.spec` file are only needed for projects distributed as a standalone `.exe`
+4 -2
View File
@@ -4,10 +4,12 @@ from pathlib import Path
from dotenv import load_dotenv from dotenv import load_dotenv
from src.constants import VERSION # .env must be loaded before src.constants is imported — constants.py reads ENV_DEBUG
# at import time to build VERSION.
load_dotenv() load_dotenv()
from src.constants import VERSION # noqa: E402
print("=" * 50) print("=" * 50)
print("PREBUILD CONFIGURATION") print("PREBUILD CONFIGURATION")
print("=" * 50) print("=" * 50)
+39 -5
View File
@@ -14,6 +14,11 @@ Dokumentace/
│ ├── CLAUDE.md # Claude Code session instructions │ ├── CLAUDE.md # Claude Code session instructions
│ ├── AGENTS.md # Language-agnostic rules for all AI assistants │ ├── AGENTS.md # Language-agnostic rules for all AI assistants
│ └── skills/ # Custom Claude Code skills │ └── skills/ # Custom Claude Code skills
│ ├── changelog/ # /changelog — update CHANGELOG.md
│ ├── check/ # /check — run tests, investigate failures
│ ├── commit/ # /commit — changelog + commit message proposal
│ ├── documentation/ # /documentation — write docs/
│ └── documentation_context/ # /documentation_context — compress docs/ into CONTEXT.md
├── Python/ # Python development guidelines ├── Python/ # Python development guidelines
│ ├── DESIGN_DOCUMENT.md # Guidelines for Python applications │ ├── DESIGN_DOCUMENT.md # Guidelines for Python applications
@@ -38,9 +43,11 @@ Dokumentace/
│ ├── PROJECT.md # Project documentation template │ ├── PROJECT.md # Project documentation template
│ └── .gitignore # Shared, language-agnostic ignore rules │ └── .gitignore # Shared, language-agnostic ignore rules
── Zscaler/ # Corporate network setup ── Zscaler/ # Corporate network setup
├── ZSCALER_CERTIFICATE.md # Cert setup for Node, Python, git, cargo ├── ZSCALER_CERTIFICATE.md # Cert setup for Node, Python, git, cargo
└── ZscalerRootCertificate-2048-SHA256.crt └── ZscalerRootCertificate-2048-SHA256.crt
└── CHANGELOG.md # History of this repository
``` ```
## AI Coding Workflow ## AI Coding Workflow
@@ -62,11 +69,38 @@ Where the two disagree, **the design document wins**.
### Starting a new project ### Starting a new project
1. Copy `Project template/PROJECT.md` and `Project template/CHANGELOG.md` into the project root — both are committed. 1. Copy `Project template/PROJECT.md` and `Project template/CHANGELOG.md` into the project root and write a `README.md` — all three are committed.
2. Build `.gitignore` from `Project template/.gitignore` plus the `.gitignore` of the matching language folder. 2. Build `.gitignore` from `Project template/.gitignore` plus the `.gitignore` of the matching language folder.
3. Copy `Claude/AGENTS.md` and the matching `DESIGN_DOCUMENT*.md` into the project root — these are **not** committed, they come from here. 3. Copy `Claude/AGENTS.md` and the matching `DESIGN_DOCUMENT*.md` into the project root — these are **not** committed, they come from here.
4. For Python, follow `Python/TEMPLATE.md` to generate the project skeleton. 4. For Python, follow `Python/TEMPLATE.md` to generate the project skeleton.
### Skills
The skills in `Claude/skills/` are the source of truth; the copies Claude Code actually runs live in
`~/.claude/skills/`. Install or refresh them by copying the whole folder across.
Two rules keep the two sides from drifting apart:
- **The folder name is the command.** For personal skills the frontmatter `name` is only a display
label — `/documentation_context` comes from the directory, not from `name:`. Keep the two identical
so renaming a folder can never silently change the command.
- **Every skill carries a version** in `metadata.version`, incremented on every content change, the
same way design documents carry `Document Version`:
```yaml
---
name: commit
description: Updates changelog and proposes a concise verbal git commit message
metadata:
version: v2
---
```
There is no top-level `version:` field in the skill format. `metadata` is a free-form map that
Claude Code ignores, and it is one of the six fields the [Agent Skills](https://agentskills.io)
spec allows — so it also survives an upload to claude.ai or the Skills API. Any other invented
key fails packaging with `Unexpected key(s) in SKILL.md frontmatter`.
## Key Conventions ## Key Conventions
- **Python tooling:** Poetry · Ruff · mypy · pytest · loguru - **Python tooling:** Poetry · Ruff · mypy · pytest · loguru
@@ -74,7 +108,7 @@ Where the two disagree, **the design document wins**.
- **Godot tooling:** gdformat · gdlint · GUT - **Godot tooling:** gdformat · gdlint · GUT
- **No `print()` for debugging** — the language's logging library, everywhere - **No `print()` for debugging** — the language's logging library, everywhere
- **Static typing required** on every parameter and return value - **Static typing required** on every parameter and return value
- **Line length:** 120 characters (Python), 100 soft limit (GDScript) - **Line length:** 120 characters (Python), 100 characters (Rust, rustfmt default), 100 soft limit (GDScript)
- **Tests:** the framework named in the design document — pytest (Python, never `unittest`), built-in `#[test]` (Rust), GUT (Godot) - **Tests:** the framework named in the design document — pytest (Python, never `unittest`), built-in `#[test]` (Rust), GUT (Godot)
- **Tasks:** single-line `TODO` / `FIXME` / `BUG` / `HACK` / `NOTE` comments in code — no checkboxes in documentation - **Tasks:** single-line `TODO` / `FIXME` / `BUG` / `HACK` / `NOTE` comments in code — no checkboxes in documentation
- **Versioning:** semantic, always ask before bumping, `CHANGELOG.md` updated first - **Versioning:** semantic, always ask before bumping, `CHANGELOG.md` updated first
+2 -1
View File
@@ -1,6 +1,6 @@
# Rust Application Development Guidelines # Rust Application Development Guidelines
**Document Version:** v1 **Document Version:** v2
> **Note on Versioning:** > **Note on Versioning:**
> - This document version is independent — reused across projects > - This document version is independent — reused across projects
@@ -25,6 +25,7 @@ The root directory contains only the core documents: `README.md`, `AGENTS.md`, `
## 1. Code Style ## 1. Code Style
- **Rust edition:** 2024 (requires Rust 1.85 or newer) - **Rust edition:** 2024 (requires Rust 1.85 or newer)
- **100-character lines** (rustfmt default `max_width`)
- Format with **rustfmt** — run `cargo fmt` before every commit - Format with **rustfmt** — run `cargo fmt` before every commit
- Lint with **clippy** — run `cargo clippy -- -D warnings` before every commit - Lint with **clippy** — run `cargo clippy -- -D warnings` before every commit
- **snake_case** functions/variables/modules, **PascalCase** types/traits, **SCREAMING_SNAKE_CASE** constants - **snake_case** functions/variables/modules, **PascalCase** types/traits, **SCREAMING_SNAKE_CASE** constants
+2 -3
View File
@@ -1,6 +1,6 @@
# Rust Library Development Guidelines # Rust Library Development Guidelines
**Document Version:** v1 **Document Version:** v2
> **Note on Versioning:** > **Note on Versioning:**
> - This document version is independent — reused across projects > - This document version is independent — reused across projects
@@ -28,6 +28,7 @@ The root directory contains only the core documents: `README.md`, `AGENTS.md`, `
- **Rust edition:** 2024 (requires Rust 1.85 or newer) - **Rust edition:** 2024 (requires Rust 1.85 or newer)
- Declare the minimum toolchain in `Cargo.toml` (`rust-version = "1.85"`) so consumers get a clear error instead of a compile failure - Declare the minimum toolchain in `Cargo.toml` (`rust-version = "1.85"`) so consumers get a clear error instead of a compile failure
- **100-character lines** (rustfmt default `max_width`)
- Format with **rustfmt** — run `cargo fmt` before every commit - Format with **rustfmt** — run `cargo fmt` before every commit
- Lint with **clippy** — run `cargo clippy -- -D warnings` before every commit - Lint with **clippy** — run `cargo clippy -- -D warnings` before every commit
- **snake_case** functions/variables/modules, **PascalCase** types/traits, **SCREAMING_SNAKE_CASE** constants - **snake_case** functions/variables/modules, **PascalCase** types/traits, **SCREAMING_SNAKE_CASE** constants
@@ -169,8 +170,6 @@ mod tests {
} }
``` ```
`Cargo.lock` is **not committed** for libraries — add it to `.gitignore`. Consumers pin their own dependency graph.
--- ---
## 9. Documentation ## 9. Documentation