mirror of
https://github.com/dnlbauer/dotfiles.git
synced 2026-09-10 21:45:30 +00:00
Compare commits
6 Commits
ea90b2f497
...
c197a6b4d3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c197a6b4d3 | ||
|
|
8edc53ff03 | ||
|
|
1ee089b51e | ||
|
|
2ab082cca5 | ||
|
|
146a8478c6 | ||
|
|
6bcf9d10de |
43
AGENTS.md
Normal file
43
AGENTS.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## What this repo is
|
||||
|
||||
Personal dotfiles managed with [chezmoi](https://chezmoi.io). This directory (`~/.local/share/chezmoi`) is chezmoi's *source* directory — files here use chezmoi's naming conventions and are rendered/installed into `$HOME` on the target machine, they are not consumed directly from this path.
|
||||
|
||||
**Use the `chezmoi` skill (`.claude/skills/chezmoi-skill/SKILL.md`) for any work in this repo.** It covers chezmoi's source-file naming conventions (`dot_`, `private_`, `executable_`, `.tmpl`), machine-specific templating patterns, the required `chezmoi apply --refresh-externals --force` flags, `.chezmoiremove`/`.chezmoiexternal.toml`, and troubleshooting — invoke it rather than re-deriving this from scratch.
|
||||
|
||||
## Commands
|
||||
|
||||
Preview and apply changes (run from anywhere; chezmoi finds the source dir automatically):
|
||||
|
||||
```bash
|
||||
chezmoi diff # preview pending changes before applying
|
||||
chezmoi apply --refresh-externals --force # apply — always use both flags (force avoids interactive prompts Claude can't answer)
|
||||
chezmoi cat <file> # preview a rendered template's output
|
||||
chezmoi execute-template '{{ .chezmoi.os }}' # test a template snippet in isolation
|
||||
chezmoi re-add <file> # pull an edited target file back into the source dir
|
||||
chezmoi status # what's pending
|
||||
```
|
||||
|
||||
Syncing to git (per README.md):
|
||||
|
||||
```bash
|
||||
chezmoi cd # cd into the source dir (this repo)
|
||||
git add --all && git commit && git push
|
||||
chezmoi update # pull + apply on another machine
|
||||
```
|
||||
|
||||
There is no build, lint, or test suite — this is a config repo. "Testing" a change means `chezmoi diff`/`chezmoi cat` to check rendering, then `chezmoi apply --refresh-externals --force` and exercising the shell/tool it affects.
|
||||
|
||||
## Architecture
|
||||
|
||||
- **`run_onchange_before_NN_*.sh`** — idempotent setup scripts chezmoi re-runs whenever their content hash changes, in numeric order (`0` installs apt packages, `1` sets zsh as default shell and installs antidote, `20`+ install individual tools: fzf, diff-so-fancy, vim-plug, tmux plugin manager, lazygit, fonts, nbdime). New machine-setup steps should follow this pattern: a numbered `run_onchange_before_*.sh` with `set -euo pipefail` and an existence check so re-runs are no-ops.
|
||||
- **`.chezmoi.toml.tmpl`** — chezmoi's own config template. Interactively prompts once for `github_email`/`machineClass` on a real terminal; when non-interactive (`stdinIsATTY` false), `CODESPACES` is set, or `.chezmoi.username` is `vscode` — auto-detected as `ephemeral`, overridable via `CHEZMOI_EPHEMERAL` — it skips prompting and instead reads `CHEZMOI_GITHUB_EMAIL` (may be left empty) and `CHEZMOI_MACHINE_CLASS` (defaults to `public`). `ephemeral` is written to `[data]` alongside `machineClass`/`github_email` and gates lifecycle-only setup (fonts — see `run_onchange_before_25_fonts.sh.tmpl`). `chezmoi apply` never auto-commits/pushes to this repo on any machine; sync manually per the Commands section below.
|
||||
- **Shell startup chain**: `dot_zshrc` sources `bin/term-background` (must run before the p10k instant-prompt block, since it reads the tty for OSC 11 background detection) → p10k instant prompt → `~/.environment`(`dot_environment`) + optional `~/.environment.local` → `~/.aliases` (`dot_aliases`) + optional `~/.aliases.local` → antidote plugin load (plugin list in `dot_zsh_plugins.txt`) → `~/.p10k.zsh`. The `.local` files are gitignored, host-specific overrides — never add machine-specific values directly to the tracked files.
|
||||
- **`dot_gitconfig.tmpl`** — templated on `.github_email`, whose `[user] email` line is omitted entirely when `.github_email` is empty (e.g. an ephemeral machine with no `CHEZMOI_GITHUB_EMAIL` set); wires up diff-so-fancy as the pager and nbdime for Jupyter notebook diffing. `~/.gitconfig.local` (untracked) is included for machine-specific overrides.
|
||||
- **`private_dot_config/`** → installs to `~/.config/` with restrictive permissions (nvim, matplotlib styles, fontconfig).
|
||||
- **`bin/`** → installs to `~/bin/`; `executable_term-background` detects terminal light/dark background via OSC 11 for theme-matching in nvim etc.
|
||||
- **`.chezmoiignore`** lists source-repo-only paths (`README.md`, `.codex`, `.agents`, `CLAUDE.md`, `CLAUDE.local.md`, `key.txt.age`) that chezmoi should never install to `$HOME`, plus a `machineClass`-gated conditional excluding `.ssh/config.d/home`, `.ssh/config.d/web`, and `.claude/settings.json` on any machine that isn't `machineClass = "private"` — `~/.claude/settings.json` has no user-level `.local.json` merge mechanism, so machines with differing Claude Code config (e.g. `enabledPlugins`) manage that file by hand instead of via chezmoi.
|
||||
- **Age encryption**: `key.txt.age` (repo root) is an age private key encrypted with a passphrase.`run_onchange_before_02_decrypt-age-key.sh.tmpl` decrypts it into `~/.config/chezmoi/key.txt`.
|
||||
43
CLAUDE.md
43
CLAUDE.md
@@ -1,43 +0,0 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## What this repo is
|
||||
|
||||
Personal dotfiles managed with [chezmoi](https://chezmoi.io). This directory (`~/.local/share/chezmoi`) is chezmoi's *source* directory — files here use chezmoi's naming conventions and are rendered/installed into `$HOME` on the target machine, they are not consumed directly from this path.
|
||||
|
||||
**Use the `chezmoi` skill (`.claude/skills/chezmoi-skill/SKILL.md`) for any work in this repo.** It covers chezmoi's source-file naming conventions (`dot_`, `private_`, `executable_`, `.tmpl`), machine-specific templating patterns, the required `chezmoi apply --refresh-externals --force` flags, `.chezmoiremove`/`.chezmoiexternal.toml`, and troubleshooting — invoke it rather than re-deriving this from scratch.
|
||||
|
||||
## Commands
|
||||
|
||||
Preview and apply changes (run from anywhere; chezmoi finds the source dir automatically):
|
||||
|
||||
```bash
|
||||
chezmoi diff # preview pending changes before applying
|
||||
chezmoi apply --refresh-externals --force # apply — always use both flags (force avoids interactive prompts Claude can't answer)
|
||||
chezmoi cat <file> # preview a rendered template's output
|
||||
chezmoi execute-template '{{ .chezmoi.os }}' # test a template snippet in isolation
|
||||
chezmoi re-add <file> # pull an edited target file back into the source dir
|
||||
chezmoi status # what's pending
|
||||
```
|
||||
|
||||
Syncing to git (per README.md):
|
||||
|
||||
```bash
|
||||
chezmoi cd # cd into the source dir (this repo)
|
||||
git add --all && git commit && git push
|
||||
chezmoi update # pull + apply on another machine
|
||||
```
|
||||
|
||||
There is no build, lint, or test suite — this is a config repo. "Testing" a change means `chezmoi diff`/`chezmoi cat` to check rendering, then `chezmoi apply --refresh-externals --force` and exercising the shell/tool it affects.
|
||||
|
||||
## Architecture
|
||||
|
||||
- **`run_onchange_before_NN_*.sh`** — idempotent setup scripts chezmoi re-runs whenever their content hash changes, in numeric order (`0` installs apt packages, `1` sets zsh as default shell and installs antidote, `20`+ install individual tools: fzf, diff-so-fancy, vim-plug, tmux plugin manager, lazygit, fonts, nbdime). New machine-setup steps should follow this pattern: a numbered `run_onchange_before_*.sh` with `set -euo pipefail` and an existence check so re-runs are no-ops.
|
||||
- **`.chezmoi.toml.tmpl`** — chezmoi's own config template. Interactively prompts once for `github_email`/`machineClass` on a real terminal; when non-interactive (`stdinIsATTY` false), `CODESPACES` is set, or `.chezmoi.username` is `vscode` — auto-detected as `ephemeral`, overridable via `CHEZMOI_EPHEMERAL` — it skips prompting and instead reads `CHEZMOI_GITHUB_EMAIL` (may be left empty) and `CHEZMOI_MACHINE_CLASS` (defaults to `public`). `ephemeral` is written to `[data]` alongside `machineClass`/`github_email` and gates lifecycle-only setup (fonts — see `run_onchange_before_25_fonts.sh.tmpl`). `chezmoi apply` never auto-commits/pushes to this repo on any machine; sync manually per the Commands section below.
|
||||
- **Shell startup chain**: `dot_zshrc` sources `bin/term-background` (must run before the p10k instant-prompt block, since it reads the tty for OSC 11 background detection) → p10k instant prompt → `~/.environment`(`dot_environment`) + optional `~/.environment.local` → `~/.aliases` (`dot_aliases`) + optional `~/.aliases.local` → antidote plugin load (plugin list in `dot_zsh_plugins.txt`) → `~/.p10k.zsh`. The `.local` files are gitignored, host-specific overrides — never add machine-specific values directly to the tracked files.
|
||||
- **`dot_gitconfig.tmpl`** — templated on `.github_email`, whose `[user] email` line is omitted entirely when `.github_email` is empty (e.g. an ephemeral machine with no `CHEZMOI_GITHUB_EMAIL` set); wires up diff-so-fancy as the pager and nbdime for Jupyter notebook diffing. `~/.gitconfig.local` (untracked) is included for machine-specific overrides.
|
||||
- **`private_dot_config/`** → installs to `~/.config/` with restrictive permissions (nvim, matplotlib styles, fontconfig).
|
||||
- **`bin/`** → installs to `~/bin/`; `executable_term-background` detects terminal light/dark background via OSC 11 for theme-matching in nvim etc.
|
||||
- **`.chezmoiignore`** lists source-repo-only paths (`README.md`, `.codex`, `.agents`, `CLAUDE.md`, `CLAUDE.local.md`, `key.txt.age`) that chezmoi should never install to `$HOME`, plus a `machineClass`-gated conditional excluding `.ssh/config.d/home`, `.ssh/config.d/web`, and `.claude/settings.json` on any machine that isn't `machineClass = "private"` — `~/.claude/settings.json` has no user-level `.local.json` merge mechanism, so machines with differing Claude Code config (e.g. `enabledPlugins`) manage that file by hand instead of via chezmoi.
|
||||
- **Age encryption**: `key.txt.age` (repo root) is an age private key encrypted with a passphrase.`run_onchange_before_02_decrypt-age-key.sh.tmpl` decrypts it into `~/.config/chezmoi/key.txt`.
|
||||
@@ -6,7 +6,7 @@ description: >-
|
||||
"did the implementation match the spec", or "review the changes".
|
||||
Also invoked internally by sdd-implement at run completion.
|
||||
context: fork
|
||||
model: opus
|
||||
model: sonnet
|
||||
effort: high
|
||||
allowed-tools:
|
||||
- Agent
|
||||
@@ -56,13 +56,13 @@ Assemble for each reviewer:
|
||||
|
||||
## Step 2: Fan out reviewer subagents in parallel
|
||||
|
||||
Dispatch all applicable reviewers **at once**. Do not wait for one before dispatching
|
||||
the next. Wait for all to complete before aggregating.
|
||||
Dispatch all applicable reviewers **at once**, via the Agent tool with `model: sonnet`.
|
||||
Do no wait for one before dispatching the next. Wait for all to complete before aggregating.
|
||||
|
||||
### Agent 1 — Developer Review
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
Task (general-purpose, model: sonnet):
|
||||
You are a senior software engineer reviewing code for quality, correctness, and spec compliance.
|
||||
Do NOT modify any code. Do NOT invoke subagents.
|
||||
|
||||
@@ -109,7 +109,7 @@ Task (general-purpose):
|
||||
### Agent 2 — Quality Engineer Review
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
Task (general-purpose, model: sonnet):
|
||||
You are a QA engineer reviewing code for test coverage and correctness.
|
||||
Do NOT modify any code. Do NOT invoke subagents.
|
||||
|
||||
@@ -150,7 +150,7 @@ Task (general-purpose):
|
||||
### Agent 3 — Security Engineer Review
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
Task (general-purpose, model: sonnet):
|
||||
You are a security engineer reviewing code for vulnerabilities and data safety.
|
||||
Do NOT modify any code. Do NOT invoke subagents.
|
||||
|
||||
@@ -190,7 +190,7 @@ Task (general-purpose):
|
||||
### Agent 4 — DevOps Review
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
Task (general-purpose, model: sonnet):
|
||||
You are a DevOps/platform engineer reviewing code for operational readiness.
|
||||
Do NOT modify any code. Do NOT invoke subagents.
|
||||
|
||||
@@ -231,7 +231,7 @@ assets, accessibility attributes). Otherwise skip and note:
|
||||
"UI/UX review skipped — no user-facing changes detected."
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
Task (general-purpose, model: sonnet):
|
||||
You are a UI/UX designer reviewing code for user experience quality.
|
||||
Do NOT modify any code. Do NOT invoke subagents.
|
||||
|
||||
@@ -271,7 +271,7 @@ through the normal aggregation. Always dispatch it (every spec has a Documentati
|
||||
Scope of Change to check against).
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
Task (general-purpose, model: sonnet):
|
||||
You are a documentation reviewer checking that the architecture and user docs were updated
|
||||
to match the implemented change. Do NOT modify any code or docs. Do NOT invoke subagents.
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ description: >-
|
||||
updating architecture and user docs as part of the work.
|
||||
Use when asked to "implement the spec", "start implementing <feature>", "implement spec-<slug>.md",
|
||||
or when the user points to a spec file to implement. Accepts a --worktree flag.
|
||||
model: opus
|
||||
model: Sonnet
|
||||
effort: high
|
||||
allowed-tools:
|
||||
- Agent
|
||||
|
||||
@@ -218,39 +218,25 @@ The **Documentation** subsection under Scope of Change is mandatory and non-empt
|
||||
state why explicitly there. Every Functional Requirement must carry a concrete **Verify**
|
||||
block; an FR you cannot describe how to verify is not yet specified well enough.
|
||||
|
||||
## Step 5: Agentic review loop (owned here)
|
||||
## Step 5: Agentic review (single automatic pass)
|
||||
|
||||
Do NOT self-review. You own this loop; `sdd-spec-review` is a pure critic that only returns
|
||||
findings.
|
||||
Do NOT self-review. `sdd-spec-review` is a pure critic that only returns findings. This step
|
||||
runs **once, automatically** — do NOT auto-apply fixes and do NOT auto-loop. Step 6 hands
|
||||
control to the user for everything after this pass.
|
||||
|
||||
1. Invoke the **Skill tool** with `skill: "sdd-spec-review"`, passing the spec path:
|
||||
```
|
||||
Spec file: <path to spec-<slug>.md>
|
||||
```
|
||||
2. Collect the returned findings (grouped Critical / Important / Minor) and verdict.
|
||||
3. **Surface the findings before you act — never fix silently.** Report to the user, for this
|
||||
pass:
|
||||
- the pass number and the overall verdict;
|
||||
- each Critical and Important finding, one line each;
|
||||
- for each, the change you will make to the spec to address it.
|
||||
3. For every Critical and Important finding, draft a **proposed fix** — the concrete change you
|
||||
would make to the spec to resolve it — but do NOT apply anything yet.
|
||||
|
||||
Format it as a short list, e.g.:
|
||||
```
|
||||
Review pass 1 — NEEDS_REVISION (2 Critical, 1 Important)
|
||||
- [Critical] <finding> → will <fix>
|
||||
- [Critical] <finding> → will <fix>
|
||||
- [Important] <finding> → will <fix>
|
||||
```
|
||||
4. If the verdict is `NEEDS_REVISION` (any Critical or Important findings): apply the fixes you
|
||||
just described to the spec for **every** Critical and Important finding, then go back to
|
||||
step 1 with a **fresh** `sdd-spec-review` invocation.
|
||||
5. Repeat until the reviewer returns `APPROVED` (no Critical/Important findings), capped at
|
||||
**3 passes**. If issues remain after the cap, stop looping and carry them into Step 6.
|
||||
**Retain each unresolved finding's full text — title, description, Impact, and Suggested
|
||||
fix — verbatim from the reviewer.** You will present these richly in Step 6, so do not
|
||||
reduce them to one-liners here.
|
||||
## Step 6: Human-in-the-loop review & approval
|
||||
|
||||
## Step 6: Human approval gate (owned here)
|
||||
This is a collaborative loop the user drives, not a gate you run alone. The user is expected to
|
||||
read the spec and the critique themselves; your job is to present findings with proposed
|
||||
solutions, then discuss, revise, and let the user decide when to re-review or approve.
|
||||
|
||||
### 6a. Present to user
|
||||
|
||||
@@ -258,42 +244,47 @@ Present in this order:
|
||||
|
||||
1. **Spec summary** — 3–5 sentences: what is being built, why, the chosen approach, and the
|
||||
most important constraints/decisions.
|
||||
2. **Spec path** — the file location.
|
||||
3. **Resolved review findings** — a compact table of the Critical/Important findings the loop
|
||||
already fixed. Keep this terse; these are done and need nothing from the user. Omit Minor
|
||||
nits entirely.
|
||||
2. **Key design decisions** — the most consequential choices made so far, giving the user the
|
||||
context they need before evaluating the findings below.
|
||||
3. **Spec path** — the file location, so the user can read it directly.
|
||||
4. **Review findings with proposed solutions** — every Critical and Important finding from
|
||||
Step 5, each with your proposed fix, so the user can accept, push back on, or ignore each
|
||||
independently. Write each in clear, plain language the user can act on without re-reading the
|
||||
spec or the raw reviewer output — not a terse restatement of the reviewer's finding:
|
||||
|
||||
| Issue | How addressed |
|
||||
|-------|---------------|
|
||||
| <one line> | <one line — what changed in the spec> |
|
||||
|
||||
4. **Open findings needing your input** — include this section **only if** findings remain
|
||||
after the 3-pass cap. Do NOT put open findings in the table above, and never write
|
||||
"cap reached" as their explanation — that tells the user nothing. Present each one with
|
||||
enough substance to act on without re-reading the spec:
|
||||
|
||||
> **<finding title>**
|
||||
> **<finding title>** [Critical|Important]
|
||||
> - What it is: <1–3 sentences describing the problem, with enough context to locate it in the spec>
|
||||
> - Why it matters: <the impact — what breaks or stays ambiguous for implementation>
|
||||
> - Suggested fix: <the concrete change you recommend>
|
||||
> - Proposed fix: <the concrete change you'd make>
|
||||
|
||||
(Repeat per open finding, drawn from the full finding text you retained in Step 5.) After
|
||||
the list, state plainly that these are what the agentic review would still refine and that
|
||||
the spec is otherwise sound — a spec need not be perfect to be implementable.
|
||||
List Minor findings compactly, one line each (or omit if none are worth the user's time) —
|
||||
they don't need the same treatment.
|
||||
5. **Overall verdict** from this review pass — APPROVED or NEEDS_REVISION.
|
||||
|
||||
5. **Overall verdict** — APPROVED, or NEEDS_REVISION with the count of open findings.
|
||||
6. **Key design decisions** — the most consequential choices made.
|
||||
Then stop and hand control to the user — tell them you're ready to discuss, revise, or move to
|
||||
implementation whenever they are. Do not apply any fix yet.
|
||||
|
||||
### 6b. Wait for response
|
||||
### 6b. Discuss and revise
|
||||
|
||||
- **User approves** → the spec is final. Stop here. Do not derive tasks. Do not implement.
|
||||
Suggest the user invoke `sdd-implement` (optionally `--worktree`) to proceed.
|
||||
- **User gives feedback** → you are the sole mutator of the spec: apply their changes to the
|
||||
spec file, then return to **Step 6a** immediately.
|
||||
- **When open findings are present**, make the choices explicit and let the user pick: (a) tell
|
||||
you which open findings to address — you apply the suggested fixes (or their variant) and
|
||||
re-present; (b) run another agentic review round (return to Step 5); or (c) approve as-is,
|
||||
accepting the open findings. Do not re-run the agentic review automatically unless asked.
|
||||
The user drives this part. Expect any mix of:
|
||||
- Accepting a proposed fix as-is.
|
||||
- Pushing back on a proposed fix or the finding itself — discuss it, and if they're right, drop
|
||||
or change the fix rather than applying it reflexively.
|
||||
- Adding their own review comments beyond what the agentic reviewer found.
|
||||
- Asking you to apply some proposed fixes and leave others open.
|
||||
|
||||
You are the sole mutator of the spec: apply whatever is agreed upon via Edit, and confirm what
|
||||
changed. Keep iterating on this discussion for as long as the user wants — there is no fixed
|
||||
number of rounds and no cap.
|
||||
|
||||
### 6c. Next round or approval — the user's call
|
||||
|
||||
Once the user is satisfied with the current round of changes, ask explicitly what they want to
|
||||
do next (don't assume):
|
||||
- **Run another `sdd-spec-review` pass** — a fresh invocation, back to Step 5. Only do this when
|
||||
the user asks for it; never re-run the agentic review automatically.
|
||||
- **Approve as final** — stop here. Do not derive tasks. Do not implement. Suggest the user
|
||||
invoke `sdd-implement` (optionally `--worktree`) to proceed.
|
||||
|
||||
## Principles
|
||||
|
||||
@@ -305,11 +296,11 @@ Present in this order:
|
||||
- Functional and non-functional requirements both belong in the spec.
|
||||
- The spec is ephemeral and lives in the repo root as `spec-<slug>.md`; never delete it.
|
||||
- You own the review loop and the human gate, and you are the only skill that edits the spec.
|
||||
- Always run the agentic review loop (Step 5) before the human gate — never self-review.
|
||||
- On each review pass, surface the Critical/Important findings and the fix you will make for
|
||||
each before applying them — the loop is visible, never silent.
|
||||
- Present unresolved findings (cap reached) actionably: description, why it matters, and a
|
||||
concrete suggested fix — never as a bare line whose only explanation is "cap reached".
|
||||
- After human feedback, apply changes and re-present immediately (Step 6a).
|
||||
- Run exactly one automatic agentic review pass (Step 5) before handing control to the user —
|
||||
never self-review, never auto-apply fixes, never auto-loop past that first pass.
|
||||
- Present every Critical/Important finding with a proposed fix, but leave the decision to apply
|
||||
it to the user — never fix silently.
|
||||
- The user controls the pace: what to accept, push back on, or add themselves, and whether
|
||||
another review round runs or the spec is approved as-is. Only re-review when asked.
|
||||
- Do not implement anything, even if it seems obvious. Human approval is the gate before
|
||||
implementation.
|
||||
|
||||
@@ -8,7 +8,6 @@ context: fork
|
||||
model: opus
|
||||
effort: high
|
||||
allowed-tools:
|
||||
- Agent
|
||||
- AskUserQuestion
|
||||
- Glob
|
||||
- Grep
|
||||
@@ -18,30 +17,24 @@ allowed-tools:
|
||||
|
||||
# Spec Review
|
||||
|
||||
You are a spec-review orchestrator and a **pure critic**. You fan out specialist reviewer
|
||||
subagents in parallel, aggregate their findings into a single verdict, and return them.
|
||||
You are a **pure critic**. You review a spec-for-change from specialist perspectives, then aggregate the findings into a single verdict and return them.
|
||||
|
||||
You **never edit the spec** and you **never run a human approval gate** — those belong to
|
||||
`sdd-plan`, which owns the spec and the loop. Your only output is findings + a verdict.
|
||||
|
||||
**Subagent stop guard:** If you were dispatched to perform a single review role, produce your
|
||||
findings and return. Do NOT invoke further subagents. Do NOT edit the spec.
|
||||
|
||||
## Step 1: Read the spec
|
||||
|
||||
1. Locate the spec file. If a path was passed in, use it. If invoked standalone with no path,
|
||||
look for `spec-*.md` in the repo root; if there are several, ask the user which one.
|
||||
2. Read the spec completely (no limit/offset).
|
||||
|
||||
## Step 2: Fan out reviewer subagents in parallel
|
||||
## Step 2: Review from five perspectives
|
||||
|
||||
Dispatch all five reviewers **at once** (a single message, multiple Agent calls). Do not wait
|
||||
for one before dispatching the next. Wait for all to return before aggregating. Pass the full
|
||||
spec content to each.
|
||||
Work through the spec and review it from the five perspectives below. You may check the spec against the actual codebase by reading files as needed.
|
||||
|
||||
Each reviewer uses the output contract below. **Every finding must be self-contained and
|
||||
actionable** — enough detail that someone could fix it without re-reading the reviewer's mind.
|
||||
Use this exact per-finding structure:
|
||||
Each perspective produces findings using the output contract below. **Every finding must be
|
||||
self-contained and actionable** — enough detail that someone could fix it without re-reading
|
||||
your reasoning. Use this exact per-finding structure:
|
||||
|
||||
```
|
||||
- **<short title>** — <what is wrong, missing, or ambiguous, with enough context to locate it
|
||||
@@ -69,21 +62,12 @@ examples, or details the implementer can reasonably decide within the guardrails
|
||||
Critical/Important; put them in Minor or omit them. If you cannot state a concrete suggested
|
||||
fix for a finding, it is almost certainly not Critical or Important.
|
||||
|
||||
**When you dispatch each reviewer, append this entire contract verbatim to its prompt** — a
|
||||
subagent only sees what you send it, so the per-finding structure and severity calibration must
|
||||
be included in every reviewer prompt.
|
||||
Apply the severity calibration below to every perspective — it governs what counts as
|
||||
Critical/Important/Minor across all five passes, not just one.
|
||||
|
||||
### Reviewer 1 — Completeness & Clarity
|
||||
### Perspective 1 — Completeness & Clarity
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
You are reviewing a spec-for-change for completeness and clarity. Do NOT edit it. Do NOT
|
||||
invoke subagents. Do not praise it — find problems.
|
||||
|
||||
Spec content:
|
||||
<full spec>
|
||||
|
||||
Evaluate:
|
||||
Do not praise the spec — find problems. Evaluate:
|
||||
- Are all sections present and non-empty (Summary, Problem Statement, Current State, Goals,
|
||||
Non-Goals, Functional Requirements, Non-Functional Requirements, Design & Architectural
|
||||
Decisions, Scope of Change, Edge Cases, Risks & Constraints)?
|
||||
@@ -92,17 +76,7 @@ Task (general-purpose):
|
||||
- Is anything important missing or left implicit?
|
||||
- Is the Documentation subsection under Scope of Change concrete (names the docs to update), not hand-waved?
|
||||
|
||||
Output the Critical / Important / Minor / Verdict contract.
|
||||
```
|
||||
|
||||
### Reviewer 2 — Internal Consistency
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
You are reviewing a spec-for-change for internal consistency. Do NOT edit it. Do NOT invoke subagents.
|
||||
|
||||
Spec content:
|
||||
<full spec>
|
||||
### Perspective 2 — Internal Consistency
|
||||
|
||||
Evaluate:
|
||||
- Do Goals, Requirements (FR/NFR), and Design & Architectural Decisions agree with each other?
|
||||
@@ -110,36 +84,15 @@ Task (general-purpose):
|
||||
- Do the Edge Cases and Risks & Constraints align with the Design & Architectural Decisions?
|
||||
- Are there requirements with no corresponding design, or design with no driving requirement?
|
||||
|
||||
Output the Critical / Important / Minor / Verdict contract.
|
||||
```
|
||||
### Perspective 3 — Architectural Soundness
|
||||
|
||||
### Reviewer 3 — Architectural Soundness
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
You are a software architect reviewing a spec-for-change. Do NOT edit it. Do NOT invoke subagents.
|
||||
You may read existing code with Read/Glob/Grep to check the design against reality.
|
||||
|
||||
Spec content:
|
||||
<full spec>
|
||||
|
||||
Evaluate:
|
||||
Read existing code with Read/Glob/Grep as needed to check the design against reality. Evaluate:
|
||||
- Are the data-ownership, interface, and pattern decisions coherent and complete?
|
||||
- Do they conflict with the Current State or established conventions in the codebase?
|
||||
- Are the chosen interfaces/contracts at the right boundary? Any leaky or missing abstractions?
|
||||
- Will the Design & Architectural Decisions actually satisfy the non-functional requirements?
|
||||
|
||||
Output the Critical / Important / Minor / Verdict contract.
|
||||
```
|
||||
|
||||
### Reviewer 4 — Irreversibility & Risk
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
You are reviewing a spec-for-change for risk and irreversibility. Do NOT edit it. Do NOT invoke subagents.
|
||||
|
||||
Spec content:
|
||||
<full spec>
|
||||
### Perspective 4 — Irreversibility & Risk
|
||||
|
||||
Evaluate:
|
||||
- Are hard-to-reverse decisions (schema changes, persisted data formats, public API/contract
|
||||
@@ -148,19 +101,9 @@ Task (general-purpose):
|
||||
- Are there security, data-loss, or compatibility risks the spec fails to address?
|
||||
- Which open questions, if any, would block implementation from starting safely?
|
||||
|
||||
Output the Critical / Important / Minor / Verdict contract.
|
||||
```
|
||||
### Perspective 5 — Testability
|
||||
|
||||
### Reviewer 5 — Testability
|
||||
|
||||
```
|
||||
Task (general-purpose):
|
||||
You are a QA engineer reviewing a spec-for-change for testability. Do NOT edit it. Do NOT invoke subagents.
|
||||
|
||||
Spec content:
|
||||
<full spec>
|
||||
|
||||
Evaluate:
|
||||
Evaluate as a QA engineer would:
|
||||
- Does every Functional Requirement have a **Verify** block, and is that block concrete and
|
||||
actionable (a real test, command + expected output, or observable behaviour) rather than vague?
|
||||
- Are the Goals measurable?
|
||||
@@ -168,16 +111,13 @@ Task (general-purpose):
|
||||
- Are the Edge Cases concrete enough to write tests from?
|
||||
- Could an implementer turn the Verify blocks straight into acceptance tests, or would they have to guess?
|
||||
|
||||
Output the Critical / Important / Minor / Verdict contract.
|
||||
```
|
||||
|
||||
## Step 3: Aggregate
|
||||
|
||||
Once all reviewers return:
|
||||
Once all five passes are done:
|
||||
|
||||
1. **Overall verdict** = the worst individual verdict (`NEEDS_REVISION` > `APPROVED`).
|
||||
2. **Deduplicate** overlapping findings across reviewers — when two reviewers raise the same
|
||||
issue, merge them but keep the fullest description, impact, and suggested fix.
|
||||
1. **Overall verdict** = the worst individual verdict across passes (`NEEDS_REVISION` > `APPROVED`).
|
||||
2. **Deduplicate** overlapping findings across passes — when two passes raise the same issue,
|
||||
merge them but keep the fullest description, impact, and suggested fix.
|
||||
3. **Group by severity**: Critical → Important → Minor.
|
||||
4. **Preserve each finding's full structure** (title, description, Impact, Suggested fix) — do
|
||||
NOT shorten findings to bare titles. The caller needs the detail to act on or present them.
|
||||
@@ -199,7 +139,6 @@ finding forces `NEEDS_REVISION`.
|
||||
## Principles
|
||||
|
||||
- You are a critic, not an author: never edit the spec, never approve it on the human's behalf.
|
||||
- All reviewer subagents run in parallel — never sequentially.
|
||||
- Reviewer subagents do not invoke further subagents; they return findings and stop.
|
||||
- Aggregate the worst verdict — never average or soften across reviewers.
|
||||
- Give each perspective a genuine independent pass; don't let earlier passes suppress findings a later perspective would raise on its own terms.
|
||||
- Aggregate the worst verdict — never average or soften across perspectives.
|
||||
- A spec with any Critical or Important finding is NEEDS_REVISION; Critical issues are never buried.
|
||||
|
||||
164
dot_claude/skills/vibe/SKILL.md
Normal file
164
dot_claude/skills/vibe/SKILL.md
Normal file
@@ -0,0 +1,164 @@
|
||||
---
|
||||
name: vibe
|
||||
description: >
|
||||
Delegate coding tasks to Mistral Vibe CLI for cost-efficient execution.
|
||||
Use this skill whenever a task is straightforward, well-defined, and does not
|
||||
require Claude's full reasoning capabilities — simple refactors, boilerplate generation,
|
||||
test scaffolding, documentation updates, file renaming, linting fixes, dependency bumps,
|
||||
small bug fixes, formatting, or mechanical code changes. Also use when the user explicitly
|
||||
asks to use Vibe, Devstral, or Mistral for a task. Do NOT use for complex architectural
|
||||
decisions, multi-step debugging requiring deep reasoning, or security-sensitive code review.
|
||||
---
|
||||
|
||||
# Mistral Vibe CLI Delegation Skill
|
||||
|
||||
Delegate simple, well-defined coding tasks to Mistral's Vibe CLI agent
|
||||
to save Claude tokens for harder problems. Vibe runs non-interactively via `--prompt` and returns
|
||||
results that Claude summarizes for the user.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Do not use this skill if you are mistral vibe.
|
||||
- `vibe` CLI installed and on `PATH`
|
||||
- Confirm installation: `vibe --version`; resolve any errors before using this skill
|
||||
|
||||
If `vibe` is not installed or not configured, inform the user and provide the installation
|
||||
instructions above. Do NOT attempt to run vibe commands if the prerequisites are not met.
|
||||
|
||||
## How It Works
|
||||
|
||||
1. Claude evaluates the user's request
|
||||
2. If the task is simple/mechanical, Claude delegates to Vibe via a shell command
|
||||
3. Vibe runs non-interactively with `--prompt`, auto-approving tool executions
|
||||
4. Vibe needs a trusted folder to run. Always add the `--trust` flag to prompts
|
||||
4. Claude reads the output and summarizes results back to the user
|
||||
5. If Vibe's output is insufficient or incorrect, Claude can either retry with a refined
|
||||
prompt or fall back to handling the task itself
|
||||
|
||||
## Task Routing Guidelines
|
||||
|
||||
### Delegate to Vibe (cheap, fast)
|
||||
- Boilerplate generation (new files, structs, interfaces, CRUD endpoints)
|
||||
- Simple refactors (rename, extract function, move code between files)
|
||||
- Test scaffolding and simple test writing
|
||||
- Documentation and comment generation
|
||||
- Formatting, linting fixes, import sorting
|
||||
- Dependency version bumps
|
||||
- Mechanical find-and-replace across files
|
||||
- Adding error handling to straightforward functions
|
||||
- Generating type definitions or interfaces from existing code
|
||||
- Simple bug fixes where the issue is clearly identified
|
||||
|
||||
### Keep in Claude (complex, nuanced)
|
||||
- Architectural decisions or design pattern selection
|
||||
- Security-sensitive code review or vulnerability analysis
|
||||
- Complex multi-step debugging requiring deep reasoning
|
||||
- Performance optimization requiring profiling analysis
|
||||
- Tasks requiring understanding of the full project context across many files
|
||||
- Anything the user explicitly wants Claude to handle
|
||||
|
||||
### When in doubt
|
||||
Ask the user: "This looks like it could be delegated to Vibe to save tokens.
|
||||
Want me to handle it myself or delegate?"
|
||||
|
||||
## CLI Usage
|
||||
|
||||
### Basic non-interactive execution
|
||||
|
||||
```bash
|
||||
vibe --prompt "<task description>" --max-turns <N> --trust 2>/dev/null
|
||||
```
|
||||
|
||||
### Flags reference
|
||||
|
||||
| Flag | Description | Default in --prompt mode |
|
||||
|------|-------------|--------------------------|
|
||||
| `--prompt "<task>"` | Run non-interactively with this prompt | Required |
|
||||
| `--max-turns N` | Limit assistant turns | No limit |
|
||||
| `--enabled-tools TOOL` | Restrict to specific tools (can repeat) | All tools enabled |
|
||||
|
||||
### Important notes
|
||||
|
||||
- `--prompt` mode automatically enables auto-approve (no user confirmation needed)
|
||||
- `--trust` trusts the current working directory and is always required.
|
||||
- Stderr contains thinking tokens / debug output — suppress with `2>/dev/null` to avoid
|
||||
bloating Claude Code's context window
|
||||
- If the user explicitly asks to see Vibe's thinking/reasoning, omit the `2>/dev/null`
|
||||
- Vibe requires a trusted folder — always append --trust
|
||||
|
||||
## Execution Patterns
|
||||
|
||||
### Pattern 1: Simple task delegation (most common)
|
||||
|
||||
For a contained, single-purpose task:
|
||||
|
||||
```bash
|
||||
cd /path/to/project && vibe --prompt "Add JSDoc comments to all exported functions in src/utils.ts" --max-turns 10 2>/dev/null
|
||||
```
|
||||
|
||||
### Pattern 2: Read-only analysis
|
||||
|
||||
For tasks that only need to read code (no writes):
|
||||
|
||||
```bash
|
||||
cd /path/to/project && vibe --prompt "List all API endpoints in this project with their HTTP methods and paths" --enabled-tools read_file --enabled-tools grep --max-turns 8 2>/dev/null
|
||||
```
|
||||
|
||||
### Pattern 3: Scoped file edits
|
||||
|
||||
For edits limited to specific files:
|
||||
|
||||
```bash
|
||||
cd /path/to/project && vibe --prompt "Refactor the error handling in src/api/client.rs to use thiserror instead of manual impl. Only modify files in src/api/." --max-turns 15 2>/dev/null
|
||||
```
|
||||
|
||||
### Pattern 4: Test generation
|
||||
|
||||
```bash
|
||||
cd /path/to/project && vibe --prompt "Generate unit tests for the functions in src/auth/token.go. Use the standard testing package. Place tests in src/auth/token_test.go" --max-turns 12 2>/dev/null
|
||||
```
|
||||
|
||||
## Prompt Engineering for Vibe
|
||||
|
||||
When constructing the `--prompt` string for Vibe, follow these guidelines:
|
||||
|
||||
1. **Be specific and self-contained** — Vibe does not have the conversation context that Claude has.
|
||||
Include all relevant details: file paths, function names, expected behavior, constraints.
|
||||
|
||||
2. **Specify scope explicitly** — Tell Vibe which files/directories to work in and which to avoid.
|
||||
|
||||
3. **State the expected output** — "Create a new file at X", "Modify function Y in file Z",
|
||||
"Print a summary to stdout".
|
||||
|
||||
4. **Include language/framework context** — "This is a Rust project using Actix-web",
|
||||
"This is a SvelteKit app with TypeScript".
|
||||
|
||||
5. **Set boundaries** — "Do not modify any files outside src/api/",
|
||||
"Do not add new dependencies".
|
||||
|
||||
## Handling Vibe Output
|
||||
|
||||
After Vibe completes:
|
||||
|
||||
1. **Read the stdout output** — This contains Vibe's actions and results
|
||||
2. **Verify the changes** — Check modified files if needed (use `git diff` or read the files)
|
||||
3. **Summarize for the user** — Tell them what Vibe did, what files changed, and whether
|
||||
the task completed successfully
|
||||
4. **Handle failures gracefully** — If Vibe failed or produced incorrect results:
|
||||
- For minor issues: retry with a more specific prompt
|
||||
- For fundamental failures: fall back to handling the task directly with Claude
|
||||
- Always inform the user what happened
|
||||
|
||||
## Example Workflow
|
||||
|
||||
**User says:** "Add error handling to the API calls in src/services/"
|
||||
|
||||
**Claude's process:**
|
||||
1. Recognizes this as a mechanical task suitable for Vibe
|
||||
2. Constructs a specific prompt with project context
|
||||
3. Runs:
|
||||
```bash
|
||||
cd /path/to/project && vibe --prompt "Add proper error handling (try/catch or Result types as appropriate) to all API call functions in the src/services/ directory. Preserve existing function signatures. Use the project's existing error handling patterns." --max-turns 15 --max-price 0.50 2>/dev/null
|
||||
```
|
||||
4. Reads output, verifies changes with `git diff --stat`
|
||||
5. Reports to user: "Vibe updated 4 files in src/services/ — added error handling to 12 API calls. Here's a summary of changes: ..."
|
||||
@@ -6,7 +6,7 @@
|
||||
email = {{ .github_email | quote }}
|
||||
{{- end }}
|
||||
[core]
|
||||
pager = sh -c 'command -v diff-so-fancy >/dev/null && exec diff-so-fancy || less --tabs=4 -RX'
|
||||
pager = sh -c 'command -v diff-so-fancy >/dev/null && diff-so-fancy | less --tabs=4 -RX || less --tabs=4 -RX'
|
||||
autocrlf = input
|
||||
attributesFile = {{ .chezmoi.homeDir }}/.gitattributes
|
||||
[alias]
|
||||
@@ -15,7 +15,7 @@
|
||||
br = branch
|
||||
worktree-ai = "!~/bin/git-worktree-ai"
|
||||
[interactive]
|
||||
diffFilter = sh -c 'command -v diff-so-fancy >/dev/null && exec diff-so-fancy --patch || exec cat'
|
||||
diffFilter = sh -c 'command -v diff-so-fancy >/dev/null && diff-so-fancy --patch || cat'
|
||||
[color]
|
||||
ui = true
|
||||
[color "diff-highlight"]
|
||||
|
||||
1
dot_vibe/symlink_skills
Normal file
1
dot_vibe/symlink_skills
Normal file
@@ -0,0 +1 @@
|
||||
../.claude/skills
|
||||
Reference in New Issue
Block a user