aboutsummaryrefslogtreecommitdiffstats
path: root/modules/home/claude.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/home/claude.nix')
-rw-r--r--modules/home/claude.nix87
1 files changed, 87 insertions, 0 deletions
diff --git a/modules/home/claude.nix b/modules/home/claude.nix
new file mode 100644
index 0000000..5895f03
--- /dev/null
+++ b/modules/home/claude.nix
@@ -0,0 +1,87 @@
+{ ... }:
+
+{
+ home.file.".claude/CLAUDE.md".text = ''
+ # Code Style
+
+ - ONLY use comments to explain weird code or non-obvious behaviour, never to explain simple code.
+
+ # Git & PRs
+
+ - ALWAYS write short and concise git commit messages and pull request messages.
+ - NEVER include a Co-Authored-By: line in commits.
+ - NEVER include "Generated with [Claude Code]" in PRs.
+
+ # Docker & Runtimes
+
+ - ALWAYS use the latest LTS version for base Docker images, Node.js engine requirements and similar.
+ - ALWAYS strive to use base Docker images with common ancestors in multi-stage builds: a stage based on `debian:trixie-slim` strongly suggests using `node:24-trixie-slim`.
+
+ # Nix
+
+ - If a command is not available and there is a `flake.nix` in the project, use `nix develop` or `nix run` to run commands from the flake's dev shell instead of installing tools manually.
+ '';
+
+ home.file.".claude/skills/push/SKILL.md".text = ''
+ ---
+ name: push
+ description: Create a commit and push changes. Optionally creates a branch and opens a PR with an intelligently chosen reviewer.
+ disable-model-invocation: true
+ ---
+
+ # /push — Commit & Push Workflow
+
+ You are executing the /push skill. Follow these steps precisely.
+
+ ## Step 1: Analyze Changes
+
+ Run `git status` and `git diff` (staged + unstaged) to understand all current changes.
+ If there are no changes to commit, inform the user and stop.
+
+ ## Step 2: Stage Files
+
+ Stage the relevant files. Prefer `git add <specific files>` over `git add -A`.
+ Never stage files that look like secrets (.env, credentials, tokens).
+
+ ## Step 3: Ask — Branch or Main?
+
+ Use the **AskUserQuestion** tool to ask the user how to push. Example:
+
+ - question: "How should this be pushed?"
+ - header: "Push target"
+ - options:
+ - label: "Current branch", description: "Push directly to the current branch"
+ - label: "New branch + PR", description: "Create a new branch and open a pull request"
+
+ ### If "Current branch":
+
+ - Run `git push` (with `-u` if needed).
+ - Done.
+
+ ### If "New branch + PR":
+
+ 1. Create a descriptive branch name based on the changes (e.g., `feat/add-logging`, `fix/null-check-user`).
+ 2. Check out the new branch and push with `-u`.
+ 3. **Choose a reviewer:**
+ - Run `git log --format='%an' -50 | sort | uniq -c | sort -rn | head -10` to find active contributors.
+ - Cross-reference with files changed: run `git log --format='%an' -- <changed-files> | sort | uniq -c | sort -rn | head -5` to find who has context on the modified code.
+ - Pick the most relevant reviewer (not the current user — check with `git config user.name`).
+ - Build a list of up to 4 candidate reviewers and use **AskUserQuestion** to let the user pick. Example:
+ - question: "Who should review this PR?"
+ - header: "Reviewer"
+ - options: one per candidate, with description showing their commit count / relevance to changed files.
+ 4. Create the PR using `gh pr create`:
+ - Short title (under 70 chars).
+ - Body with a `## Summary` section (2-3 bullet points) and a `## Test plan` section.
+ - Add the confirmed reviewer with `--reviewer`.
+ 5. Return the PR URL to the user.
+
+ ## Step 4: Create Commit
+
+ - Analyze the staged diff.
+ - Write a concise commit message using **conventional commit format** (e.g., `feat:`, `fix:`, `refactor:`, `chore:`, `docs:`, `test:`, `ci:`). Include a scope when it adds clarity (e.g., `feat(auth):`, `fix(api):`).
+ - Output ONLY the raw commit message — no markdown, no code blocks, no backticks, no explanations.
+ - **Do NOT add a Co-Authored-By line. Never include any co-author trailer.**
+ - Create the commit using a HEREDOC for the message.
+ '';
+}