aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* feat(mcp): add user-scope MCP install pipelineCraig Jennings2026-05-065-1/+230
| | | | | | | | | | I needed a single source of truth for MCP server registration so a fresh machine boots with the full set instead of being rebuilt by hand. install.py decrypts mcp/secrets.env.gpg, expands ${VAR} placeholders in mcp/servers.json, and runs claude mcp add --scope user for anything not already registered. Idempotent. The encrypted bundle carries six values: the Google client id and secret, the Figma API key, the GCP OAuth keys JSON (base64), and the two @a-bonus/google-docs-mcp token caches (personal and work, base64). install.py writes the keys file and the two token files to the paths each package reads at startup, all mode 600. Bundling the Google Docs tokens lets a new machine connect google-docs-personal and google-docs-work without the interactive OAuth flow. Without the cached token, the package falls back to a browser-redirect flow that Claude Code's stdio MCP loader can't drive, so it shows "Failed to connect" until the user runs the npx command manually. Make target: install-mcp. Plaintext secrets and the decrypted keys file are gitignored.
* chore(ai): initialize project notes and Claude tooling surfacesCraig Jennings2026-05-0670-0/+11660
| | | | Replace the seed notes.org with project-specific context (layout, install modes, task tracker location, recent inflection point). Bring in the synced template surfaces (protocols, workflows, scripts, references, retrospectives, someday-maybe) as tracked content for this content/documentation project.
* chore(claude): bump skillListingBudgetFraction to 5%Craig Jennings2026-05-061-2/+3
| | | | Default 1% of context maps to ~8K chars (the floor). The current skill listing totals ~10K chars and overflows on small-context models, triggering the truncation warning. Bumping to 5% leaves headroom even with the model-invocable skills' full descriptions present, and the file-based skill descriptions are now <=1000 chars each.
* chore(commands): mark user-invoked commands disable-model-invocationCraig Jennings2026-05-0617-1/+30
| | | | Add disable-model-invocation: true to the user-triggered slash commands so the harness drops their descriptions from the model's preloaded skill listing while keeping /<name> routing intact. Skills meant for model recommendation (add-tests, debug, five-whys, frontend-design, humanizer, pairwise-tests, playwright-js, playwright-py, root-cause-trace) are unchanged.
* docs(skills): tighten descriptions under 1000 charsCraig Jennings2026-05-064-3/+8
| | | | Trim each long description to <=1000 chars while preserving content (phases, when-to-use, when-not-to, companion references). Frees enough per-session skill-listing budget to quiet the truncation warning on small-context models.
* feat(languages): add typescript bundle (Vitest-canonical)Craig Jennings2026-05-061-0/+214
| | | | Mirrors the python bundle's minimal shape: one language-specific file under claude/rules/. Vitest is canonical, with brief notes for Mocha+Chai and Angular Karma legacy idioms. Covers RTL query priorities, MSW for network mocking, it.each for parametrize, async patterns, and TS-specific discipline (no any in tests, prefer satisfies, etc.).
* feat(make): fzf-pick LANG when not set, mirror project pickerCraig Jennings2026-05-061-8/+29
| | | | Add a pick_lang_shell macro that fzf-picks from $(LANGUAGES) when LANG isn't set, mirroring pick_project_shell. Wire it into install-lang and diff so both vars are now optional. Blank $(LANG) when its origin is environment, since LANG is the standard POSIX locale env var and Make would otherwise inherit "en_US.UTF-8" and bypass the picker.
* feat(hooks): make destructive-bash-confirm opt-inCraig Jennings2026-05-061-3/+16
| | | | | | | | | | I added an OPTIN_HOOKS list in the Makefile and excluded those entries from the default install-hooks recipe. destructive-bash-confirm.py is the first opt-in. The recipe now prints the exact ln -s command for each opt-in so users can wire individual ones without consulting docs. uninstall-hooks and list still iterate the full HOOKS list so they keep handling opt-ins that someone has manually linked.
* chore(claude): unwire destructive-bash-confirm hookCraig Jennings2026-05-061-11/+0
| | | | | | | Removed the PreToolUse → Bash hook entry from settings.json. The hook script stays in hooks/ for other machines that may want it. The local ~/.claude/hooks/destructive-bash-confirm.py symlink was also removed on this machine.
* docs(todo): add make-remove fzf-picker taskCraig Jennings2026-05-061-0/+1130
| | | | | | Captures the design discussion for an interactive Makefile target that lists installed rulesets and removes selected entries via fzf. Granular alternative to the bulk make uninstall.
* fix(commands): drop leftover name: frontmatter from converted commandsCraig Jennings2026-05-0613-13/+0
| | | | | | | | The conversion commit ran sed -i to strip the name: line, but the staged version from git mv was captured before the sed ran. Result: the commit shipped the original frontmatter, and the sed cleanup was sitting in the working tree. This commit lands the cleanup that should have been in aa69245.
* refactor(skills): convert 16 user-invoked skills to commandsCraig Jennings2026-05-0617-0/+0
| | | | | | | | I converted 16 user-invoked skills to commands. Skills cost ~150-300 tokens each per session for descriptions the model uses to auto-route. Commands cost nothing until you type the slash. These 16 are workflows I always trigger deliberately. The auto-routing wasn't earning its keep. This reclaims ~4-5k tokens per session. Nine skills stayed where auto-routing genuinely helps: debug, root-cause-trace, five-whys, add-tests, frontend-design, humanizer, playwright-js, playwright-py, and pairwise-tests. Pairwise-tests stays a skill because its helper files don't fit a single-file command shape. For arch-decide, I preserved the upstream MIT LICENSE alongside the command at .claude/commands/arch-decide.LICENSE so attribution stays intact.
* feat(claude): add claude config and wire it into make installCraig Jennings2026-05-065-7/+376
| | | | | | | | I moved Claude Code's user-level config into this repo so it travels with rulesets across machines instead of being machine-specific. The three pieces are settings.json, .mcp.json, and commands/refactor.md. I extended make install, uninstall, and list to handle the new .claude/ directory. The wildcard for CLAUDE_CONFIG matches both `*.json` and `.*.json` because make's glob skips dotfiles by default. Without the dot variant, .mcp.json wouldn't get picked up. I also added settings.local.json to .gitignore. That file is per-machine by convention and shouldn't ever land in the shared repo.
* feat: add humanizer skillCraig Jennings2026-05-061-0/+474
| | | | I moved this in from another repo so it sits alongside the rest of the skills here. The file content is unchanged.
* refactor(debug): make debug a triage router, align specialist cross-refsCraig Jennings2026-05-063-30/+36
| | | | I sharpened the debug skill so it stops duplicating root-cause-trace and five-whys. Phase 1 captures evidence and stops there. Phase 2 routes to the right specialist instead of asking why three times inline. Phases 3 and 4 keep the verify-and-fix discipline. I also updated the companion lines in root-cause-trace and five-whys so all three descriptions stay in sync.
* docs(commits): require @-mention of PR author in Slack notifyCraig Jennings2026-05-021-3/+3
|
* docs(commits): keep follow-up approvals terseCraig Jennings2026-05-021-0/+2
|
* docs(commits): drop "on" from Slack notify templatesCraig Jennings2026-05-021-2/+2
|
* docs(commits): add first-person voice as a personal-style passCraig Jennings2026-05-011-5/+5
| | | | | | I told Claude that the commit-message draft should sound personal, like it's coming from me. That move wasn't in the documented passes, so the drafts kept landing on impersonal third-person ("Add a test for X", "The change introduces Y"). I had to ask for the rewrite each time. First person is now the new pass (a) in all three subflows: commit messages, PR descriptions, PR review comments. The subject line and PR title stay imperative per Conventional Commits, and I left an exception for purely mechanical bodies where the subject already carries the message. I bumped the Multi-pass gate counts and the example announcement string to match.
* docs(commits): add post-review Slack notify + approve-vs-merge noteCraig Jennings2026-05-011-0/+7
| | | | | | | | Step 8 of the PR review/publish flow now sends a one-line message to channel C0AM2MWHCJU after every approve or changes-requested verdict. The new step skips humanizer and personal-style passes since the message is short and templated. The approve case sends "Approved on PR #N." with the PR URL on the next line. The changes-requested case sends "Changes Requested on PR #N" with the PR URL on the next line. I also added an explicit line saying approve doesn't authorize a merge. That keeps the merge decision with the PR author. The team's practice is approve-then-author-merges, not approve-and-merge.
* chore(build): wildcard SKILLS, claude-rules bridge symlink, link lintCraig Jennings2026-04-262-5/+54
| | | | | | | | | | The refactor scan flagged three install/lint problems. I fixed all three. - The Makefile SKILLS list was hand-maintained and had drifted: `respond-to-cj-comments` exists on disk but wasn't installed by `make install`. I replaced the list with `$(patsubst %/SKILL.md,%,$(wildcard */SKILL.md))` so every directory containing a SKILL.md is picked up automatically. - Cross-references in installed skills point at `../claude-rules/foo.md`. The install layout puts rules at `~/.claude/rules/`, not `~/.claude/skills/claude-rules/`, so those links resolved in the source repo and silently broke at install. I added a bridge symlink to the install target. `~/.claude/skills/claude-rules` now points at the source `claude-rules/` directory, so the same relative path works in both layouts. - I extended `scripts/lint.sh` with a `check_md_links` function that validates `claude-rules/` cross-references in `claude-rules/*.md` and `*/SKILL.md`. Scoped narrowly on purpose: skill bodies cite illustrative file names (ADR templates, arc42 sections) that aren't real source files and would generate noise. Verified locally: `make install` is idempotent, the bridge resolves the previously-broken link, and `bash scripts/lint.sh` is clean.
* docs(commits): Conventional Commits spec + terminal-first reviewCraig Jennings2026-04-261-64/+135
| | | | | | | | | | | | | | | | | I reworked commits.md with two structural shifts and five smaller rule changes. Structural: - Drafts print inline in the terminal. `emacsclient` only opens when asked. Was: editor by default, humanize after. - Adopted the full Conventional Commits spec. New sections: Structure, Types, Scope, Breaking changes (`!` and `BREAKING CHANGE:` footer), Subject line, Body, Footers, How to write, Examples. Smaller: - Personal-tooling files (`claude-rules/*.md`, any `CLAUDE.md`, `.claude/`, `.ai/`, `SKILL.md`) aren't cited as authority in shared messages. State the reason, not the rule. Carve-out for when one of these files IS the change. - Voice and Focus opens with a colleague-tone framing. Four anti-patterns called out below it: no felt-experience narration, no verb-as-noun ("the ask", "a learn"), no sentence fragments in prose, and no first-person "I" for software behavior — all caught real drafting tics today. "Brief. Terse is fine." also tightened to "Brief. Terse is preferred." - Future-debugger framing added to message-writing guidance. Imperative summaries beat diary notes, and the body becomes a lightweight decision log of the constraint or tradeoff. - PR titles end with the ticket ID in parens, e.g. `refactor: drop dead check (SE-289)`. - Multi-pass gate tightened to match the new mandatory ordering.
* docs(testing): rewrite time-mocking helper rule to be language-agnosticCraig Jennings2026-04-251-7/+15
| | | | | | | | The original phrasing leaned on Lisp terms (let-bind, defvar) that don't translate to most other languages. Generalize to two named failure modes (infinite recursion against the mocked primitive, scope-shadowing that production callers can't see) with examples across Python, Lisp, Go, and JavaScript so the rule applies regardless of stack.
* docs(commits,testing): add merge strategy + multi-pass gate + time-mocking ↵Craig Jennings2026-04-252-0/+31
| | | | | | | | | | | | | | | | | safety commits.md gets two additions. A new "## Merge Strategy" section makes squash-merge the default for feature branches and requires explicit confirmation of the merge approach before pushing or merging. A new "Multi-pass gate" paragraph in Review and Publish requires every humanizer-flow pass to run and be named when declaring done, so silent skips become defects. testing.md gets a new bullet under "### Determinism": time/clock-mocking helpers must not recurse against the primitive they're mocking, and must not let-bind over a defvar — the binding shadows only inside the test scope, so production code reading the symbol still gets the original value (silent test miss).
* docs: split Linear vs PR structure; propagate content-scope rule to Tier 1 ↵Craig Jennings2026-04-249-5/+52
| | | | | | | | | | | | | | | skills Linear ticket bodies are now Problem + Fix only. PR descriptions keep the four-section format (Problem, Fix, Why this fixes it, How it was tested). Linear's GitHub integration handles the cross-link via the PR body's Linear: line. Cross-ref to the content-scope rule appended at the end of each Tier 1 skill that produces public artifacts: testing.md, arch-document, arch-decide, arch-design, review-code, respond-to-review, brainstorm, codify. Single-source the rule in commits.md, point at it from each output-producing skill.
* docs(commits): add content scope rule for public artifactsCraig Jennings2026-04-241-0/+27
| | | | | | | | PR descriptions, Linear ticket bodies, and PR review comments are visible to the team. New section codifies what not to mention (local paths, private repos, personal tooling) and a concise four-section structure for shipped-fix descriptions: Problem, Fix, Why this fixes it, How it was tested.
* docs(commits): require explicit reviewer requests on PR creationCraig Jennings2026-04-241-3/+12
| | | | | | | | | Adds step 7 to the Review-and-Publish PR-description flow: pass --reviewer at create time or use gh pr edit --add-reviewer right after. Notes that CODEOWNERS auto-suggestions aren't requests, that picking reviewers should follow the team's per-repo convention, and that follow-up PRs benefit from tagging the parent PR's author. Renumbers the Linear-comment and Dev-Review status steps accordingly.
* feat: add respond-to-cj-comments skillCraig Jennings2026-04-231-0/+232
| | | | Scans a file for cj: annotations (Craig's in-line instructions and questions) and handles each one with subagent-delegated accuracy. Classifies each comment as instruction or question, spawns subagents per item, applies changes from the main thread, and produces a structured summary. Covers the voice and attribution discipline for any public-facing writing the skill produces, a long-summary-to-file pattern that writes to /tmp/ and opens in emacsclient when the output runs long, and a requirement that every file path in the summary is a clickable org-mode link.
* refactor: scope start-work refactor audit to every touched fileCraig Jennings2026-04-231-13/+17
| | | | The old "refactor pass" framed the step as a polish over new code. Expanded to "refactor audit" — walks each touched file against the checklist, top to bottom, and every finding lands somewhere: fixed on this branch or filed as a ticket. Drops "skip" as a first-class disposition. Tightens Phase 6 gate 3 to require filed ticket IDs, not just surfaced intent.
* docs(commits): codify voice rules + PR-comment publish flowCraig Jennings2026-04-231-10/+22
| | | | | | | | Three new paragraphs under "Voice and Focus": first person where it fits, brief/terse, kind. The section now applies to PR comments (review replies, follow-up notes, thread responses) as well as commit bodies and PR descriptions. New "For PR review comments and replies" subsection under Step 2 mirrors the commit-message and PR-description flows: draft to /tmp/pr-<N>-comment.md, humanizer skill, plain-English pass, user approval, then post with the right gh command for the comment type. The trivial-one-liner exception at the bottom of Step 2 now covers acknowledgment-style replies ("thanks for the review") alongside trivial commits.
* docs(commits): add Voice and Focus, expand humanizer checklistCraig Jennings2026-04-221-2/+29
| | | | | | Added a new Voice and Focus section between Commit Message Format and Review and Publish. It covers three rules that kept coming up in practice. Write in the user's voice — first person fits, and "This PR introduces X" reads as press-release self-narration. Focus on what was wrong and what was corrected, not the mechanics. Don't stack three or more type signatures or API names in a single sentence. Also extended the post-humanizer checklist in both the commit-message and PR-description flows. Items (c) "prefer contractions" and (d) "break up long sentences" now sit alongside the existing (a) "rewrite dev-jargon" and (b) "replace semicolons". Uncontracted English reads stiff in short prose, and stacked-clause sentences read easier split on a conjunction.
* chore: remove fix-issue skill, superseded by start-workCraig Jennings2026-04-225-63/+4
| | | | | | | | | | | | The fix-issue skill has been replaced by start-work, which covers the same ground (picking up a ticket with a known fix and carrying it through to handoff) with a seven-phase structure and three user-approval gates. Deleted fix-issue/SKILL.md and swept the references. Updated: - Makefile SKILLS list: remove fix-issue, add start-work so make install creates the right symlink. - brainstorm/SKILL.md: implementation-path list points at start-work. - debug/SKILL.md description: both "do NOT use for ticket-driven work" and "Companion to" references updated. - review-code/SKILL.md description: "drafting implementation" redirect updated. No change in meaning. Every old fix-issue context now names start-work.
* docs(commits): add review-and-publish flow, tighten message conventionsCraig Jennings2026-04-221-0/+87
| | | | | | | | | | Three additions to claude-rules/commits.md. A new conventions section adds two rules. First, do not hard-wrap commit body lines. Let the renderer soft-wrap instead. Hard wraps shrink the visible width in web UIs and cause awkward mid-sentence breaks. Second, do not reference how the change was produced (code review, linting, test runs) in the message. The body is for the what and the why. The how belongs in the PR discussion. A new Review and Publish section defines a two-step gate for every commit and PR. Step 1 runs /review-code against the change and blocks on Critical or Important findings unless the user overrides. Step 2 drafts the message to /tmp, opens it in the user's editor, runs the humanizer skill, and waits for explicit approval before committing or pushing. PRs also require a Linear cross-link line, a Linear comment with the PR URL after creation, and a status transition to Dev Review. A short hook-level authorization note clarifies that the review-plus-approval flow is the authorization gate. Tools like git-commit-confirm should not add a second independent prompt once Step 2 has been approved.
* feat(skills): add start-workCraig Jennings2026-04-221-0/+265
| | | | | | | | | | | | | | | A workflow for picking up a specific task (Linear ticket, GitHub issue, todo.org heading, or a described scope) and carrying it through to handoff. Seven phases, three user-approval gates. The phases in order: - Claim: mark in-progress, assign, label, verify project. - Justify (gate 1): benefits, costs, impact, urgency, effort, alternatives, ticket quality. - Approach (gate 2): root cause, risk, test strategy, migration, flag, commit decomposition, branch name. - Implement (TDD): red, green, edge cases, and a refactor pass with a nine-point language-agnostic checklist. - Verify: end-to-end or scripted manual test in the local environment. Playwright for web projects, step-by-step walkthrough for everything else. Never production. - Ready to commit (gate 3): report, deviations from the approach, any follow-ups spotted. - Hand off to the Review-and-Publish flow in commits.md. Cross-referenced from testing.md, commits.md, subagents.md, review-code, brainstorm, arch-design, arch-decide, debug, pairwise-tests, playwright-js, and playwright-py.
* hooks: git-commit-confirm becomes silent-unless-suspiciousCraig Jennings2026-04-212-16/+67
| | | | | | | | | | | | | | | | | | | The hook used to emit a confirmation modal on every git commit. That produced too many benign interruptions — the modal fired even on clean, well-formed, attribution-free commits. Now it only emits a modal when one of these safety checks fires: - AI-attribution patterns in the commit message (Co-Authored-By: Claude, robot emoji, Generated-with-AI footers, etc.) — the primary leak - Message not parseable from command line (editor would open, which silently blocks Claude) - No files staged (the commit would fail anyway) - Git author unusable (user.name / user.email not configured) Clean commits pass through silent. The AI-attribution scan is unchanged; the always-on review is gone. README updated to describe the new behavior.
* skills: add create-v2mom; extend add-tests with refactor-for-testabilityCraig Jennings2026-04-193-5/+447
| | | | | | | | | | | | | | | | New standalone create-v2mom skill (converted from the homelab workflow template, markdown + YAML frontmatter, context-hygiene references removed in favor of the global session-context protocol). add-tests/SKILL.md gains a 'Core Principle — Refactor for Testability First' section and three inserts into the phase instructions: - Phase 1 flags testability-blocked functions during inventory - Phase 2 surfaces refactor-first candidates per function - Phase 3 adds a test-failure-vs-production-bug triage step Sourced from the retired refactor.org homelab workflow (which was a TDD-for-testability guide, not a general refactoring guide — general refactoring is already covered by the /refactor slash command).
* docs(todo): add OV-1 skill build plan triggered by SOFWeek (May 2026)Craig Jennings2026-04-191-0/+74
|
* docs(todo): expand c4-* rename entry with DoD notation landscape (SysML / ↵Craig Jennings2026-04-191-0/+101
| | | | DoDAF / UAF / IDEF1X)
* docs(todo): note c4-* rename trigger and future notation skills (UML, ERD, ↵Craig Jennings2026-04-191-0/+42
| | | | arc42)
* feat(hooks+skills): destructive-bash confirm + architecture suite + ↵Craig Jennings2026-04-1911-7/+193
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | problem-solving routing Three improvements bundled together: 1. New hook — `destructive-bash-confirm.py` (PreToolUse/Bash): Gates `git push --force`, `git reset --hard`, `git clean -f`, `git branch -D`, and `rm -rf` behind a confirmation modal with the command, local context (branch, uncommitted counts, targeted paths), and a severity banner. Elevates severity when force-pushing protected branches (main/master/develop/release/prod) or when rm -rf targets root, home, or wildcard paths. Reuses _common.py. 2. Architecture suite rename — the "Part of the arch-* suite" footer in arch-design, arch-decide, arch-document, arch-evaluate descriptions now reads "Part of the architecture suite (arch-design / arch-decide / arch-document / arch-evaluate + c4-analyze / c4-diagram for notation-specific diagramming)." Matching footers added to c4-analyze and c4-diagram. c4-* keep their framework-specific prefix (C4 is a notation, arch-* is framework-agnostic workflow) but are now discoverable as suite members. 3. Problem-solving cluster routing — added YAML frontmatter with descriptions (including "Do NOT use for X (use Y)" clauses) to debug/SKILL.md and fix-issue/SKILL.md. Previously both had no frontmatter at all, which broke skill-router discovery. The four cluster members (debug, fix-issue, root-cause-trace, five-whys) now route unambiguously by description alone.
* feat(rules): add subagents.md — when, how, and when not to delegateCraig Jennings2026-04-194-0/+132
| | | | | | | | | | | | | | | | | | | | | | | | | | Cross-cutting rule covering subagent hygiene: - Decision table: parallel-safe (read-only investigation, independent test failures, multi-domain research) vs sequential-with-review (plan execution, coupled edits) vs never-parallel (concurrent writes) vs don't-subagent-at-all (target known, work fits in ~10 tool calls). - Prompt contract: scope / pasted context / explicit 'do NOT' list / required output format. Missing any field yields shallow work. - Context-pollution rule: subagents absorb noise the main thread shouldn't carry. When one fails, dispatch a fix-agent with the failure report — do not retry in the orchestrator. - Review-gate cadence: after each sequential task, or every ~3 in parallel batches. - Anti-patterns including parallel implementation on overlapping files, broad 'fix all the tests' prompts, timeout-tuning to mask flakes, and letting the agent decide scope. Added one-line cross-references to subagents.md from debug/, review-code/, and finish-branch/ SKILL.md — the skills that most rely on delegation. Clean-room synthesis from NeoLabHQ/context-engineering-kit's subagent-driven-development pattern (MIT).
* feat(hooks): shared _common.py helpers + systemMessage AI-attribution warningCraig Jennings2026-04-194-28/+103
| | | | | | | | | | | | | | | | | | | | | Consolidates stdin-parse and response-emit across the two confirm hooks into `hooks/_common.py` (stdlib-only, sibling symlinked alongside the hooks it serves). Net ~28 lines less duplication. Adds a `systemMessage` banner alongside the confirmation modal when the commit message or PR title/body contains AI-attribution patterns: - Co-Authored-By: Claude|Anthropic|GPT|AI trailers - 🤖 robot emoji - "Generated with Claude Code" / similar footers - "Created with …" / "Assisted by …" variants Scanning targets structural leak patterns only — bare mentions of "Claude" or "Anthropic" in diff context don't fire, so discussing the tools themselves in a commit message doesn't false-positive. Clean-room synthesis from GowayLee/cchooks (MIT) — specifically, the systemMessage-alongside-reason pattern and event-aware stdin helpers.
* feat(hooks): add global hooks — PreCompact priorities + git/gh confirm modalsCraig Jennings2026-04-197-10/+682
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Three new machine-wide hooks installed via `make install-hooks`: - `precompact-priorities.sh` (PreCompact) — injects a priority block into the compaction prompt so the generated summary retains information most expensive to reconstruct: unanswered questions, root causes with file:line, subagent findings as primary evidence, exact numbers/IDs, A-vs-B decisions, open TODOs, classified-data handling. - `git-commit-confirm.py` (PreToolUse/Bash) — gates `git commit` behind a confirmation modal showing parsed message, staged files, diff stats, author. Parses both HEREDOC and `-m`/`--message` forms. - `gh-pr-create-confirm.py` (PreToolUse/Bash) — gates `gh pr create` behind a modal showing title, base ← head, reviewers, labels, assignees, milestone, draft flag, body (HEREDOC or quoted). Makefile: adds `install-hooks` / `uninstall-hooks` targets and extends `list` with a Hooks section. Install prints the settings.json snippet (in `hooks/settings-snippet.json`) to merge into `~/.claude/settings.json`. Also: `languages/elisp/claude/hooks/validate-el.sh` now emits JSON with `hookSpecificOutput.additionalContext` on failure (via new `fail_json()` helper) so Claude sees a structured error in context, in addition to the existing stderr output and exit 2. Patterns synthesized clean-room from fcakyon/claude-codex-settings (Apache-2.0). Each hook is original content.
* docs(todo): shelve /research-writer design pending a real writing task as ↵Craig Jennings2026-04-191-0/+55
| | | | trigger
* feat: add finish-branch skill (clean-room synthesis from obra/superpowers ↵Craig Jennings2026-04-192-1/+251
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | pattern) Clean-room synthesis of the 'finishing a development branch' pattern from obra/superpowers (MIT) — adopted as the forced-choice workflow scaffold, not the substantive rules. Substantive rules defer to existing ones: - Verification → verification.md - Commit conventions + no AI attribution → commits.md - Review discipline → review-code Core patterns implemented: - Phase 1 verify-before-options (hard-stop on failing tests) - Phase 2 base branch + commit range + worktree detection - Phase 3 forced-choice menu (exactly 4 options, no editorializing, stop+wait) - Phase 4 execution per-option with: - Option 1 (merge locally): re-verify after merge, delete branch, prompt about remote-branch cleanup separately - Option 2 (push + PR): gh pr create with inline template (no AI attribution in the body); do NOT remove worktree - Option 3 (keep): no git state changes; preserve worktree - Option 4 (discard): typed-word "discard" confirmation gate required; lists what will be permanently lost; force-delete + remote cleanup - Phase 5 worktree cleanup matrix (cleanup for 1 and 4; preserve for 2 and 3) Notable over the upstream superpowers skill: - Explicit delegation to verification.md / commits.md / review-code rather than re-teaching those standards inline - Cross-references to /review-code (pre) and /arch-evaluate (if architectural) - Handles remote-branch cleanup question separately from local branch (upstream conflates them) - "Common Mistakes" section names the specific failure modes this skill prevents (open-ended "what now", accidental deletes, merge-then-oops, worktree amnesia, trailing AI attribution in PRs) Rubric coverage vs upstream: M (verify → options → execute → cleanup); M (forced-choice menu pattern); M (typed-discard confirmation gate); M (worktree cleanup matrix); M (hard-stop on failing tests); + (explicit deferral to existing rules vs upstream's inline rules); + (remote-branch cleanup as separate prompt); + (skill integration notes for /review-code and /arch-evaluate); no dropped capabilities. Makefile SKILLS extended; make install symlinks globally at ~/.claude/skills/finish-branch.
* docs(todo): bookmark Skill Seekers for a future docs-briefing experimentCraig Jennings2026-04-191-0/+45
|
* refactor: review-pr → review-code with superpowers + plugin-lifted ↵Craig Jennings2026-04-193-58/+348
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | improvements Renamed review-pr → review-code (the skill accepts PR, SHA range, current branch, staged changes — "pr" was understating scope). Rewrote SKILL.md with YAML frontmatter (previously header-style) and merged useful patterns from two sources: From obra/superpowers skills/requesting-code-review: - Intent-vs-delivery grading (given plan/ADR/ticket) - Mandatory Strengths section (three minimum) - Per-issue Critical/Important/Minor severity (per-criterion PASS/WARN/FAIL retained; complementary axes) - Required verdict + 1-2 sentence reasoning - Multi-input support (PR / SHA range / current branch / --staged) - Sub-agent dispatch recommendation for heavy reviews - Concrete filled-in example output From the claude-plugins-official code-review plugin: - Phase 0 eligibility gate (skip closed/draft/auto/trivial/already-reviewed) - CLAUDE.md traversal + adherence criterion (reads root + per-directory CLAUDE.md files; audits the diff against stated rules) - Multi-perspective Phase 2: five passes (CLAUDE.md adherence, shallow bug scan, git history context, prior PR comments, in-scope code comments). For large reviews, dispatch as parallel sub-agents. - Confidence filter (High/Medium/Low; drop Low before reporting) - False-positive categories explicitly enumerated (pre-existing issues on unmodified lines, lint/typecheck issues CI handles, senior-wouldn't-call-out nitpicks, silenced issues with valid reason, intentional scope changes, unmodified-line issues, framework-behavior tests) - Trust-CI discipline (don't run builds yourself) Substance from the original review-pr kept verbatim: - DeepSat-specific criteria (security, TDD evidence, conventions, no-AI-attribution, API contracts, architecture layering, root-cause discipline) Size: 60 lines → 347 lines. Growth is structural (added phases, added example, added perspectives, added filters) not verbose — each section earns its lines. NOT adopted from the plugin: - GitHub comment output format (plugin posts PR comments; review-code outputs a markdown report the user can paste if they want) - "Generated with Claude Code" footer (violates no-AI-attribution rule) - Specific 0/25/50/75/100 confidence scale (Critical/Important/Minor covers the same signal with less ceremony) Makefile SKILLS updated: review-pr → review-code. Old ~/.claude/skills/review-pr symlink removed; make install creates the new one at ~/.claude/skills/review-code.
* chore(add-tests): sharpen the pairwise-vs-exhaustive promptCraig Jennings2026-04-191-1/+7
| | | | | | | | | | | | | | | | | | | Previous wording — 'pairwise or continue with normal category coverage' — muddled the choice. Category coverage (Normal/Boundary/Error) tests each parameter individually and doesn't meaningfully address combinatorial interaction questions. Sharper framing: when a function has parameters that combine, the real question is pairwise vs exhaustive (the M^N full factorial). Category coverage is a separate axis — it handles the error-case and boundary-case testing that parameter-value combinations don't. New prompt cites specific counts: 'Function X has N parameters (M^N = Y exhaustive combinations). Pairwise or exhaustive?' Pairwise stays the pragmatic default; exhaustive only when the user names a regulatory / safety-critical reason.
* feat: adopt pairwise-tests (PICT combinatorial) + cross-reference from ↵Craig Jennings2026-04-1910-3/+913
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | existing testing skills Forked verbatim from omkamal/pypict-claude-skill (MIT). LICENSE preserved. Renamed from `pict-test-designer` to `pairwise-tests` — technique-first naming so users invoking "pairwise" or "combinatorial" find it; PICT remains the tool under the hood. Bundle (skill-runtime only): pairwise-tests/SKILL.md (renamed, description rewritten) pairwise-tests/LICENSE (MIT, preserved) pairwise-tests/references/pict_syntax.md pairwise-tests/references/examples.md pairwise-tests/scripts/pict_helper.py (Python CLI for model gen / output fmt) pairwise-tests/scripts/README.md Upstream's repo-level docs (README, QUICKSTART, CONTRIBUTING, etc.) and `examples/` dir (ATM + gearbox walkthroughs — useful as reading, not as skill-runtime) omitted from the fork. Attribution footer added. Cross-references so /add-tests naturally routes to /pairwise-tests when warranted: - add-tests/SKILL.md Phase 2 step 8: if a function in scope has 3+ parameters each taking multiple values, surface `/pairwise-tests` to the user before proposing normal category coverage. Default continues with /add-tests; user picks pairwise explicitly. - claude-rules/testing.md: new "Combinatorial Coverage" section after the Normal/Boundary/Error categories. Explains when pairwise wins, when to skip (regulated / provably exhaustive contexts, ≤2 parameters, non- parametric testing), and points at /pairwise-tests. - languages/python/claude/rules/python-testing.md: new "Pairwise / Combinatorial for Parameter-Heavy Functions" subsection under the parametrize guidance. Explains the pytest workflow: /pairwise-tests generates the matrix, paste into pytest parametrize block, or use pypict helper directly. Mechanism note: cross-references are judgment-based — Claude reads the nudges in add-tests/testing/python-testing and acts on them when appropriate, not automatic dispatch. Craig can still invoke /pairwise-tests directly when he already knows he wants combinatorial coverage. Makefile SKILLS extended; make install symlinks /pairwise-tests globally.
* feat: adopt frontend-design (Apache 2.0 fork) + progressive-disclosure ↵Craig Jennings2026-04-198-1/+767
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | extensions Forked verbatim from anthropics/skills/skills/frontend-design (Apache 2.0). LICENSE.txt preserved. Upstream SKILL.md prose (aesthetic guidance, archetype list, anti-pattern callouts) kept intact. Extensions added (clearly marked, load progressively — base SKILL.md stays lean for simple cases): SKILL.md: - Description extended with explicit negative triggers: narrow maintenance (single CSS bug, dependency upgrade, a11y-only retrofit), operational contexts where stakeholder has specified "minimal, functional, no creative direction," backend / API work, non-web UIs (mobile native, desktop, terminal), and refactoring without visible design component. - New "Workflow" section at the end of SKILL.md: four phases (intake, commitment, build, review) with pointers to reference files. Simple component tweaks skip the workflow; non-trivial redesigns walk it. - New "References" section: table mapping file → load-when condition. - Attribution footer marking upstream source + what's locally added. references/workflow.md (~150 lines) Intake questions (purpose, audience, operational context, functional priority, technical constraints, brand references, success criteria). Commitment step (archetype pick, trade-offs, font pairing, palette, motion, layout as one-line decisions). Build reminders. Review pointer. Guidance on when to skip phases. references/accessibility.md (~200 lines) WCAG AA contrast thresholds + practical check guidance. Keyboard navigation + focus management. Semantic HTML + ARIA rules. Reduced- motion CSS snippet. Smoke checklist. Operational-context note for defense / ISR work. references/responsive.md (~160 lines) Mobile-first vs desktop-first decision. Named breakpoints (Tailwind- style) vs magic pixels. Container queries. Aesthetic translation table — how each archetype handles small-screen scaling. Responsive typography with clamp(). Operational-dashboard note: desktop-primary is a legitimate product decision. references/design-review.md (~170 lines) Archetype check (does the build read as what was committed to?). Anti-pattern grep for fonts, palette, layout, motion, backgrounds, components. Code-quality-match check (ornate design + lazy code = failure). Performance sanity. Convergence check (if last 3 builds all used the same archetype, break the pattern). The one-sentence test for memorability. references/rationale-template.md (~160 lines) Template for design-rationale.md alongside the build. Nine sections (purpose, archetype, locked decisions, deliberately absent, accessibility, responsive, implementation, open questions, references). Filled example using a DeepSat SOCOM demo landing page to show density and specificity. Structure matches Anthropic's own pdf / docx / webapp-testing pattern (SKILL.md entry + references/ for progressive disclosure). Makefile SKILLS extended; make install symlinks globally. Adoption caveat resolved: name kept as `frontend-design` (not renamed to ui-design) — "frontend" signals scope (web code, not mobile / desktop / terminal UIs), upstream parity preserved for attribution.