Ports the patterns that crystallized during the short-lived claudian plugin project (discarded in favour of this Flutter rebuild): - ADRs 0001-0004 capture decisions that survive the host change — CLI-first over MCP, Go for the sidecar, pql as a supporter tool that becomes a clide-managed subsystem when present, and the ignore-file strategy that wires all file-enumerating surfaces through one knob in .pql/config.yaml. - .claude/settings.json and the git-commit and skill-create skills come over with naming updated for clide. The git-commit skill's "no Conventional Commits" convention supersedes the Python-era clide style under legacy/; the Keep-a-Changelog discipline and the project.yaml-version-and-changelog-bumped-together rule apply going forward. - CHANGELOG.md starts fresh at the repo root to track the Flutter rebuild. The Python changelog is preserved under legacy/. .gitignore narrows from `.claude/` to just `.claude/settings.local.json` so project-level config and skills travel with the repo. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7.1 KiB
name, description
| name | description |
|---|---|
| git-commit | Git commit conventions for this repo — message style, changelog and version-bump rules, attribution trailer, and the safety rules that always apply. Use whenever the user says "commit", "commit this", "create a commit", "make a commit", "amend", or asks Claude to check work into git in any form. |
Git commit rule — this repo
Follow these conventions whenever you create a commit in this repository. These are in addition to the standard Claude Code git-safety protocol (no --no-verify, no force-push to main, prefer new commits over --amend, etc.).
Message style
- First line: imperative mood, ≤ 70 characters. Examples:
add sidecar PTY scaffold,fix IPC reconnect after app reload,update CLI exit-code contract. - Body (optional): wrap at ~72 chars. Explain the why — the reason this change exists. The diff already shows the what; don't restate it in prose.
- No emojis. Anywhere.
- Don't prefix with types like
feat:orfix:— this repo isn't Conventional Commits. (The Python-era clide underlegacy/used Conventional Commits; the Flutter rebuild at the repo root does not.) - Don't reference the current task or flow (
for the v2.0 milestone,used by the canvas panel) — that context belongs in the PR description and rots as the repo evolves. - Naming: the project is
clide. The Flutter desktop app lives at the repo root; the Go sidecar/CLI binary isclide. The supporter project ispql(referenced, not part of this repo). The archived Python implementation lives underlegacy/.
Logically-separated commits
Default to one logical change per commit, even when a lot of work lands in the tree at once. When there's a pile of uncommitted or untracked files:
- Read
git status+git difffirst — never stage the whole tree blind. - Group by concern, not by file location. Typical concerns to separate:
- Bookkeeping —
.gitignore, editor/IDE config, lockfiles,go.sum/pubspec.lockupdates. - Documentation —
README.md,CLAUDE.md, ADRs underdocs/ADRs/, design notes underdocs/. - General-purpose tooling / skills — things that aren't project-specific (reusable skills, shared scripts).
- Project-specific conventions — this repo's own rules.
- Feature or subsystem — one cohesive change per commit; a sidecar change and an app change for the same feature can land together, but two unrelated features should split.
- Layer changes — Flutter app, sidecar CLI, sidecar daemon, IPC server, pql wrapper, canvas driver, git panel — separate concerns; prefer separate commits when the changes are independent.
- Bookkeeping —
- Sequence the commits so each one is cleanly scoped, but don't obsess about whether each intermediate commit "works" — for scaffolding PRs it's fine if the full picture only snaps together at the end.
- Prefer many small focused commits over one large mixed one — a reviewer can read, revert, or cherry-pick a focused commit; they can't do any of those to a blob.
- Use
git add <specific paths>— nevergit add -Aorgit add .when splitting, or you'll sweep in the next commit's work by accident. - Verify between commits with
git statusandgit log -1to confirm the split landed as intended.
Corollary: if a commit's subject line needs the word "and" to be accurate, it probably should have been two commits.
Changelog discipline
This repo follows Keep a Changelog 1.1.0. Every user-visible commit must touch CHANGELOG.md under the ## [Unreleased] section, in the appropriate subsection:
- Added — new features or capabilities.
- Changed — changes to existing functionality.
- Deprecated — soon-to-be-removed features.
- Removed — now-removed features.
- Fixed — bug fixes.
- Security — vulnerability fixes.
Entries should be short imperative phrases that describe user-facing impact — not implementation detail. "Added sidecar PTY support for terminal pane" beats "Added internal/pty/session.go."
What skips the changelog: pure bookkeeping commits that have no user-visible effect (typo fix in internal comment, .gitignore tweak, lint config change, reformatting). When in doubt, add an entry — the harm of an extra line is zero.
When a commit spans multiple entries (e.g. a feature that adds one thing and fixes another), add a line under each applicable subsection rather than cramming both into one.
Cutting a release
Cutting a release is its own commit. In a single commit:
- Move all entries from
## [Unreleased]under a new heading## [X.Y.Z] — YYYY-MM-DD. - Leave an empty
## [Unreleased]section at the top with its subsection skeleton ready. - Bump
project.yamlversion:toX.Y.Z(drop the-devsuffix for the tag; re-add it on the next development commit if desired). - Commit subject:
release vX.Y.Z.
project.yaml is the single source of truth for the version — the Makefile reads it for ldflag stamping of the sidecar binary, and the Flutter app reads it for build info. Bumping project.yaml and the changelog out of sync is the mistake this rule prevents.
Attribution trailer
Every commit ends with the Claude co-author line:
Co-Authored-By: Claude <noreply@anthropic.com>
The model-identifier variant produced by the Claude Code harness (e.g. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>) is also accepted — don't rewrite it if the harness emits that form.
HEREDOC discipline
Pass commit messages via HEREDOC so multi-line formatting survives:
git commit -m "$(cat <<'EOF'
short imperative summary
Optional longer body explaining why this change was needed,
wrapped at about 72 characters.
Co-Authored-By: Claude <noreply@anthropic.com>
EOF
)"
Never pass multi-line messages via -m "line1\nline2" or multiple -m flags — Git's behavior differs between shells and quoting regimes and the trailer can end up in the wrong place.
What not to commit
.envand any*.env.local— see.gitignore..claude/settings.local.json— user-specific Claude Code settings, ignored.- Build artefacts:
sidecar/bin/,sidecar/dist/,build/(Flutter output),app/.dart_tool/— gitignored. - SQLite index files (
*.sqlite,*.sqlite-wal,*.sqlite-shm,*.db) — caches generated against local repos; must never land here. Gitignored defensively. - Coverage / test output (
*.out,coverage.*,*.test) — gitignored.
Safety reminders (reinforced from the global Claude Code protocol)
- Never
--no-verify. If a pre-commit hook fails, fix the underlying issue and create a new commit. - Never
--amenda commit unless the user explicitly asks. A failed-hook commit didn't land, so amending would overwrite the previous commit and lose work. - Never force-push to
mainormaster. Warn the user if they ask. - When staging, prefer naming specific files over
git add -A/git add .— those can sweep in secrets or unintended files. git statusbefore staging,git diff --stagedbefore committing,git log -1after committing to confirm.