mirror of
https://github.com/anthropics/claude-code.git
synced 2026-08-13 02:12:26 -06:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 885ff0ab71 | |||
| 641f7272db | |||
| 42bca11ef0 | |||
| a3da4902a1 | |||
| 72f16273f9 | |||
| f0f77d9f9d | |||
| bcbf1fe358 | |||
| 91c8d1c7dd | |||
| ba8820fde8 | |||
| 7254f5b735 | |||
| 19571f7a59 | |||
| 8828265deb | |||
| 0cc28dba44 | |||
| 1fc1f3559d | |||
| ebc4a113bc | |||
| c19ab34af3 |
@@ -1,150 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/claude-code-marketplace.json",
|
||||
"name": "claude-code-plugins",
|
||||
"version": "1.0.0",
|
||||
"description": "Bundled plugins for Claude Code including Agent SDK development tools, PR review toolkit, and commit workflows",
|
||||
"owner": {
|
||||
"name": "Anthropic",
|
||||
"email": "support@anthropic.com"
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
"name": "agent-sdk-dev",
|
||||
"description": "Development kit for working with the Claude Agent SDK",
|
||||
"source": "./plugins/agent-sdk-dev",
|
||||
"category": "development"
|
||||
},
|
||||
{
|
||||
"name": "claude-opus-4-5-migration",
|
||||
"description": "Migrate your code and prompts from Sonnet 4.x and Opus 4.1 to Opus 4.5.",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "William Hu",
|
||||
"email": "whu@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/claude-opus-4-5-migration",
|
||||
"category": "development"
|
||||
},
|
||||
{
|
||||
"name": "code-review",
|
||||
"description": "Automated code review for pull requests using multiple specialized agents with confidence-based scoring to filter false positives",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Boris Cherny",
|
||||
"email": "boris@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/code-review",
|
||||
"category": "productivity"
|
||||
},
|
||||
{
|
||||
"name": "commit-commands",
|
||||
"description": "Commands for git commit workflows including commit, push, and PR creation",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Anthropic",
|
||||
"email": "support@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/commit-commands",
|
||||
"category": "productivity"
|
||||
},
|
||||
{
|
||||
"name": "explanatory-output-style",
|
||||
"description": "Adds educational insights about implementation choices and codebase patterns (mimics the deprecated Explanatory output style)",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Dickson Tsai",
|
||||
"email": "dickson@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/explanatory-output-style",
|
||||
"category": "learning"
|
||||
},
|
||||
{
|
||||
"name": "feature-dev",
|
||||
"description": "Comprehensive feature development workflow with specialized agents for codebase exploration, architecture design, and quality review",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Siddharth Bidasaria",
|
||||
"email": "sbidasaria@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/feature-dev",
|
||||
"category": "development"
|
||||
},
|
||||
{
|
||||
"name": "frontend-design",
|
||||
"description": "Create distinctive, production-grade frontend interfaces with high design quality. Generates creative, polished code that avoids generic AI aesthetics.",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Prithvi Rajasekaran & Alexander Bricken",
|
||||
"email": "prithvi@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/frontend-design",
|
||||
"category": "development"
|
||||
},
|
||||
{
|
||||
"name": "hookify",
|
||||
"description": "Easily create custom hooks to prevent unwanted behaviors by analyzing conversation patterns or from explicit instructions. Define rules via simple markdown files.",
|
||||
"version": "0.1.0",
|
||||
"author": {
|
||||
"name": "Daisy Hollman",
|
||||
"email": "daisy@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/hookify",
|
||||
"category": "productivity"
|
||||
},
|
||||
{
|
||||
"name": "learning-output-style",
|
||||
"description": "Interactive learning mode that requests meaningful code contributions at decision points (mimics the unshipped Learning output style)",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Boris Cherny",
|
||||
"email": "boris@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/learning-output-style",
|
||||
"category": "learning"
|
||||
},
|
||||
{
|
||||
"name": "plugin-dev",
|
||||
"description": "Comprehensive toolkit for developing Claude Code plugins. Includes 7 expert skills covering hooks, MCP integration, commands, agents, and best practices. AI-assisted plugin creation and validation.",
|
||||
"version": "0.1.0",
|
||||
"author": {
|
||||
"name": "Daisy Hollman",
|
||||
"email": "daisy@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/plugin-dev",
|
||||
"category": "development"
|
||||
},
|
||||
{
|
||||
"name": "pr-review-toolkit",
|
||||
"description": "Comprehensive PR review agents specializing in comments, tests, error handling, type design, code quality, and code simplification",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Anthropic",
|
||||
"email": "support@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/pr-review-toolkit",
|
||||
"category": "productivity"
|
||||
},
|
||||
{
|
||||
"name": "ralph-wiggum",
|
||||
"description": "Interactive self-referential AI loops for iterative development. Claude works on the same task repeatedly, seeing its previous work, until completion.",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Daisy Hollman",
|
||||
"email": "daisy@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/ralph-wiggum",
|
||||
"category": "development"
|
||||
},
|
||||
{
|
||||
"name": "security-guidance",
|
||||
"description": "Security reminder hook that warns about potential security issues when editing files, including command injection, XSS, and unsafe code patterns",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "David Dworken",
|
||||
"email": "dworken@anthropic.com"
|
||||
},
|
||||
"source": "./plugins/security-guidance",
|
||||
"category": "security"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
---
|
||||
allowed-tools: Bash(git checkout --branch:*), Bash(git add:*), Bash(git status:*), Bash(git push:*), Bash(git commit:*), Bash(gh pr create:*)
|
||||
description: Commit, push, and open a PR
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Current git status: !`git status`
|
||||
- Current git diff (staged and unstaged changes): !`git diff HEAD`
|
||||
- Current branch: !`git branch --show-current`
|
||||
|
||||
## Your task
|
||||
|
||||
Based on the above changes:
|
||||
1. Create a new branch if on main
|
||||
2. Create a single commit with an appropriate message
|
||||
3. Push the branch to origin
|
||||
4. Create a pull request using `gh pr create`
|
||||
5. You have the capability to call multiple tools in a single response. You MUST do all of the above in a single message. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.
|
||||
@@ -1,27 +0,0 @@
|
||||
---
|
||||
allowed-tools: Bash(./scripts/gh.sh:*), Bash(./scripts/comment-on-duplicates.sh:*)
|
||||
description: Find duplicate GitHub issues
|
||||
---
|
||||
|
||||
Find up to 3 likely duplicate issues for a given GitHub issue.
|
||||
|
||||
To do this, follow these steps precisely:
|
||||
|
||||
1. Use an agent to check if the Github issue (a) is closed, (b) does not need to be deduped (eg. because it is broad product feedback without a specific solution, or positive feedback), or (c) already has a duplicates comment that you made earlier. If so, do not proceed.
|
||||
2. Use an agent to view a Github issue, and ask the agent to return a summary of the issue
|
||||
3. Then, launch 5 parallel agents to search Github for duplicates of this issue, using diverse keywords and search approaches, using the summary from #1
|
||||
4. Next, feed the results from #1 and #2 into another agent, so that it can filter out false positives, that are likely not actually duplicates of the original issue. If there are no duplicates remaining, do not proceed.
|
||||
5. Finally, use the comment script to post duplicates:
|
||||
```
|
||||
./scripts/comment-on-duplicates.sh --potential-duplicates <dup1> <dup2> <dup3>
|
||||
```
|
||||
|
||||
Notes (be sure to tell this to your agents, too):
|
||||
|
||||
- Use `./scripts/gh.sh` to interact with Github, rather than web fetch or raw `gh`. Examples:
|
||||
- `./scripts/gh.sh issue view 123` — view an issue
|
||||
- `./scripts/gh.sh issue view 123 --comments` — view with comments
|
||||
- `./scripts/gh.sh issue list --state open --limit 20` — list issues
|
||||
- `./scripts/gh.sh search issues "query" --limit 10` — search for issues
|
||||
- Do not use other tools, beyond `./scripts/gh.sh` and the comment script (eg. don't use other MCP servers, file edit, etc.)
|
||||
- Make a todo list first
|
||||
@@ -1,74 +0,0 @@
|
||||
---
|
||||
allowed-tools: Bash(./scripts/gh.sh:*),Bash(./scripts/edit-issue-labels.sh:*)
|
||||
description: Triage GitHub issues by analyzing and applying labels
|
||||
---
|
||||
|
||||
You're an issue triage assistant. Analyze the issue and manage labels.
|
||||
|
||||
IMPORTANT: Don't post any comments or messages to the issue. Your only actions are adding or removing labels.
|
||||
|
||||
Context:
|
||||
|
||||
$ARGUMENTS
|
||||
|
||||
TOOLS:
|
||||
- `./scripts/gh.sh` — wrapper for `gh` CLI. Only supports these subcommands and flags:
|
||||
- `./scripts/gh.sh label list` — fetch all available labels
|
||||
- `./scripts/gh.sh label list --limit 100` — fetch with limit
|
||||
- `./scripts/gh.sh issue view 123` — read issue title, body, and labels
|
||||
- `./scripts/gh.sh issue view 123 --comments` — read the conversation
|
||||
- `./scripts/gh.sh issue list --state open --limit 20` — list issues
|
||||
- `./scripts/gh.sh search issues "query"` — find similar or duplicate issues
|
||||
- `./scripts/gh.sh search issues "query" --limit 10` — search with limit
|
||||
- `./scripts/edit-issue-labels.sh --add-label LABEL --remove-label LABEL` — add or remove labels (issue number is read from the workflow event)
|
||||
|
||||
TASK:
|
||||
|
||||
1. Run `./scripts/gh.sh label list` to fetch the available labels. You may ONLY use labels from this list. Never invent new labels.
|
||||
2. Run `./scripts/gh.sh issue view ISSUE_NUMBER` to read the issue details.
|
||||
3. Run `./scripts/gh.sh issue view ISSUE_NUMBER --comments` to read the conversation.
|
||||
|
||||
**If EVENT is "issues" (new issue):**
|
||||
|
||||
4. First, check if this issue is actually about Claude Code.
|
||||
- Look for Claude Code signals in the issue BODY: a `Claude Code Version` field or `claude --version` output, references to the `claude` CLI command, terminal sessions, the VS Code/JetBrains extensions, `CLAUDE.md` files, `.claude/` directories, MCP servers, Cowork, Remote Control, or the web UI at claude.ai/code. If ANY such signal is present, this IS a Claude Code issue — proceed to step 5.
|
||||
- Only if NO Claude Code signals are present: check whether a different Anthropic product (claude.ai chat, Claude Desktop/Mobile apps, the raw Anthropic API/SDK, or account billing with no CLI involvement) is the *subject* of the complaint, not merely mentioned for context. If so, apply `invalid` and stop. If ambiguous, proceed to step 5 WITHOUT applying `invalid`.
|
||||
- The body text is authoritative. If a form dropdown (e.g. Platform) contradicts evidence in the body, trust the body — dropdowns are often mis-selected.
|
||||
|
||||
5. Analyze and apply category labels:
|
||||
- Type (bug, enhancement, question, etc.)
|
||||
- Technical areas and platform
|
||||
- Check for duplicates with `./scripts/gh.sh search issues`. Only mark as duplicate of OPEN issues.
|
||||
|
||||
6. Evaluate lifecycle labels:
|
||||
- `needs-repro` (bugs only, 7 days): Bug reports without clear steps to reproduce. A good repro has specific, followable steps that someone else could use to see the same issue.
|
||||
Do NOT apply if the user already provided error messages, logs, file paths, or a description of what they did. Don't require a specific format — narrative descriptions count.
|
||||
For model behavior issues (e.g. "Claude does X when it should do Y"), don't require traditional repro steps — examples and patterns are sufficient.
|
||||
- `needs-info` (bugs only, 7 days): The issue needs something from the community before it can progress — e.g. error messages, versions, environment details, or answers to follow-up questions. Don't apply to questions or enhancements.
|
||||
Do NOT apply if the user already provided version, environment, and error details. If the issue just needs engineering investigation, that's not `needs-info`.
|
||||
|
||||
Issues with these labels are automatically closed after the timeout if there's no response.
|
||||
The goal is to avoid issues lingering without a clear next step.
|
||||
|
||||
7. Apply all selected labels:
|
||||
`./scripts/edit-issue-labels.sh --add-label "label1" --add-label "label2"`
|
||||
|
||||
**If EVENT is "issue_comment" (comment on existing issue):**
|
||||
|
||||
4. Evaluate lifecycle labels based on the full conversation:
|
||||
- If the issue has `stale` or `autoclose`, remove the label — a new human comment means the issue is still active:
|
||||
`./scripts/edit-issue-labels.sh --remove-label "stale" --remove-label "autoclose"`
|
||||
- If the issue has `needs-repro` or `needs-info` and the missing information has now been provided, remove the label:
|
||||
`./scripts/edit-issue-labels.sh --remove-label "needs-repro"`
|
||||
- If the issue doesn't have lifecycle labels but clearly needs them (e.g., a maintainer asked for repro steps or more details), add the appropriate label.
|
||||
- Comments like "+1", "me too", "same here", or emoji reactions are NOT the missing information. Only remove `needs-repro` or `needs-info` when substantive details are actually provided.
|
||||
- Do NOT add or remove category labels (bug, enhancement, etc.) on comment events.
|
||||
|
||||
GUIDELINES:
|
||||
- ONLY use labels from `./scripts/gh.sh label list` — never create or guess label names
|
||||
- DO NOT post any comments to the issue
|
||||
- Be conservative with lifecycle labels — only apply when clearly warranted
|
||||
- Only apply lifecycle labels (`needs-repro`, `needs-info`) to bugs — never to questions or enhancements
|
||||
- When in doubt, don't apply a lifecycle label — false positives are worse than missing labels
|
||||
- On new issues (EVENT "issues"), always apply exactly one of `bug`, `enhancement`, `question`, `invalid`, or `duplicate`. If unsure, pick the closest fit — an imperfect category label is better than none.
|
||||
- On comment events, it's okay to make no changes if nothing applies.
|
||||
@@ -3,11 +3,8 @@ FROM node:20
|
||||
ARG TZ
|
||||
ENV TZ="$TZ"
|
||||
|
||||
ARG CLAUDE_CODE_VERSION=latest
|
||||
|
||||
# Install basic development tools and iptables/ipset
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
less \
|
||||
RUN apt update && apt install -y less \
|
||||
git \
|
||||
procps \
|
||||
sudo \
|
||||
@@ -22,10 +19,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
iproute2 \
|
||||
dnsutils \
|
||||
aggregate \
|
||||
jq \
|
||||
nano \
|
||||
vim \
|
||||
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||
jq
|
||||
|
||||
# Ensure default node user has access to /usr/local/share
|
||||
RUN mkdir -p /usr/local/share/npm-global && \
|
||||
@@ -48,11 +42,10 @@ RUN mkdir -p /workspace /home/node/.claude && \
|
||||
|
||||
WORKDIR /workspace
|
||||
|
||||
ARG GIT_DELTA_VERSION=0.18.2
|
||||
RUN ARCH=$(dpkg --print-architecture) && \
|
||||
wget "https://github.com/dandavison/delta/releases/download/${GIT_DELTA_VERSION}/git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb" && \
|
||||
sudo dpkg -i "git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb" && \
|
||||
rm "git-delta_${GIT_DELTA_VERSION}_${ARCH}.deb"
|
||||
wget "https://github.com/dandavison/delta/releases/download/0.18.2/git-delta_0.18.2_${ARCH}.deb" && \
|
||||
sudo dpkg -i "git-delta_0.18.2_${ARCH}.deb" && \
|
||||
rm "git-delta_0.18.2_${ARCH}.deb"
|
||||
|
||||
# Set up non-root user
|
||||
USER node
|
||||
@@ -61,16 +54,11 @@ USER node
|
||||
ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
|
||||
ENV PATH=$PATH:/usr/local/share/npm-global/bin
|
||||
|
||||
# Set the default shell to zsh rather than sh
|
||||
ENV SHELL=/bin/zsh
|
||||
|
||||
# Set the default editor and visual
|
||||
ENV EDITOR=nano
|
||||
ENV VISUAL=nano
|
||||
# Set the default shell to bash rather than sh
|
||||
ENV SHELL /bin/zsh
|
||||
|
||||
# Default powerline10k theme
|
||||
ARG ZSH_IN_DOCKER_VERSION=1.2.0
|
||||
RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v${ZSH_IN_DOCKER_VERSION}/zsh-in-docker.sh)" -- \
|
||||
RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v1.2.0/zsh-in-docker.sh)" -- \
|
||||
-p git \
|
||||
-p fzf \
|
||||
-a "source /usr/share/doc/fzf/examples/key-bindings.zsh" \
|
||||
@@ -79,8 +67,7 @@ RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/
|
||||
-x
|
||||
|
||||
# Install Claude
|
||||
RUN npm install -g @anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}
|
||||
|
||||
RUN npm install -g @anthropic-ai/claude-code
|
||||
|
||||
# Copy and set up firewall script
|
||||
COPY init-firewall.sh /usr/local/bin/
|
||||
|
||||
@@ -3,10 +3,7 @@
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile",
|
||||
"args": {
|
||||
"TZ": "${localEnv:TZ:America/Los_Angeles}",
|
||||
"CLAUDE_CODE_VERSION": "latest",
|
||||
"GIT_DELTA_VERSION": "0.18.2",
|
||||
"ZSH_IN_DOCKER_VERSION": "1.2.0"
|
||||
"TZ": "${localEnv:TZ:America/Los_Angeles}"
|
||||
}
|
||||
},
|
||||
"runArgs": [
|
||||
@@ -16,7 +13,6 @@
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
"anthropic.claude-code",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"esbenp.prettier-vscode",
|
||||
"eamodio.gitlens"
|
||||
@@ -42,16 +38,15 @@
|
||||
},
|
||||
"remoteUser": "node",
|
||||
"mounts": [
|
||||
"source=claude-code-bashhistory-${devcontainerId},target=/commandhistory,type=volume",
|
||||
"source=claude-code-config-${devcontainerId},target=/home/node/.claude,type=volume"
|
||||
"source=claude-code-bashhistory,target=/commandhistory,type=volume",
|
||||
"source=claude-code-config,target=/home/node/.claude,type=volume"
|
||||
],
|
||||
"containerEnv": {
|
||||
"remoteEnv": {
|
||||
"NODE_OPTIONS": "--max-old-space-size=4096",
|
||||
"CLAUDE_CONFIG_DIR": "/home/node/.claude",
|
||||
"POWERLEVEL9K_DISABLE_GITSTATUS": "true"
|
||||
},
|
||||
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=delegated",
|
||||
"workspaceFolder": "/workspace",
|
||||
"postStartCommand": "sudo /usr/local/bin/init-firewall.sh",
|
||||
"waitFor": "postStartCommand"
|
||||
"postCreateCommand": "sudo /usr/local/bin/init-firewall.sh"
|
||||
}
|
||||
|
||||
@@ -2,9 +2,6 @@
|
||||
set -euo pipefail # Exit on error, undefined vars, and pipeline failures
|
||||
IFS=$'\n\t' # Stricter word splitting
|
||||
|
||||
# 1. Extract Docker DNS info BEFORE any flushing
|
||||
DOCKER_DNS_RULES=$(iptables-save -t nat | grep "127\.0\.0\.11" || true)
|
||||
|
||||
# Flush existing rules and delete existing ipsets
|
||||
iptables -F
|
||||
iptables -X
|
||||
@@ -14,16 +11,6 @@ iptables -t mangle -F
|
||||
iptables -t mangle -X
|
||||
ipset destroy allowed-domains 2>/dev/null || true
|
||||
|
||||
# 2. Selectively restore ONLY internal Docker DNS resolution
|
||||
if [ -n "$DOCKER_DNS_RULES" ]; then
|
||||
echo "Restoring Docker DNS rules..."
|
||||
iptables -t nat -N DOCKER_OUTPUT 2>/dev/null || true
|
||||
iptables -t nat -N DOCKER_POSTROUTING 2>/dev/null || true
|
||||
echo "$DOCKER_DNS_RULES" | xargs -L 1 iptables -t nat
|
||||
else
|
||||
echo "No Docker DNS rules to restore"
|
||||
fi
|
||||
|
||||
# First allow DNS and localhost before any restrictions
|
||||
# Allow outbound DNS
|
||||
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
|
||||
@@ -69,12 +56,9 @@ for domain in \
|
||||
"api.anthropic.com" \
|
||||
"sentry.io" \
|
||||
"statsig.anthropic.com" \
|
||||
"statsig.com" \
|
||||
"marketplace.visualstudio.com" \
|
||||
"vscode.blob.core.windows.net" \
|
||||
"update.code.visualstudio.com"; do
|
||||
"statsig.com"; do
|
||||
echo "Resolving $domain..."
|
||||
ips=$(dig +noall +answer A "$domain" | awk '$4 == "A" {print $5}')
|
||||
ips=$(dig +short A "$domain")
|
||||
if [ -z "$ips" ]; then
|
||||
echo "ERROR: Failed to resolve $domain"
|
||||
exit 1
|
||||
@@ -104,6 +88,7 @@ echo "Host network detected as: $HOST_NETWORK"
|
||||
iptables -A INPUT -s "$HOST_NETWORK" -j ACCEPT
|
||||
iptables -A OUTPUT -d "$HOST_NETWORK" -j ACCEPT
|
||||
|
||||
# Set default policies to DROP first
|
||||
# Set default policies to DROP first
|
||||
iptables -P INPUT DROP
|
||||
iptables -P FORWARD DROP
|
||||
@@ -116,9 +101,6 @@ iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
||||
# Then allow only specific outbound traffic to allowed domains
|
||||
iptables -A OUTPUT -m set --match-set allowed-domains dst -j ACCEPT
|
||||
|
||||
# Explicitly REJECT all other outbound traffic for immediate feedback
|
||||
iptables -A OUTPUT -j REJECT --reject-with icmp-admin-prohibited
|
||||
|
||||
echo "Firewall configuration complete"
|
||||
echo "Verifying firewall rules..."
|
||||
if curl --connect-timeout 5 https://example.com >/dev/null 2>&1; then
|
||||
|
||||
@@ -1,188 +0,0 @@
|
||||
name: 🐛 Bug Report
|
||||
description: Report a bug or unexpected behavior in Claude Code
|
||||
title: "[BUG] "
|
||||
labels:
|
||||
- bug
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to report this bug! Please fill out the sections below to help us understand and fix the issue.
|
||||
|
||||
Before submitting, please check:
|
||||
- You're using the [latest version](https://www.npmjs.com/package/@anthropic-ai/claude-code?activeTab=versions) of Claude Code (`claude --version`)
|
||||
- This issue hasn't already been reported by searching [existing issues](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug).
|
||||
- This is a bug, not a feature request or support question
|
||||
|
||||
- type: checkboxes
|
||||
id: preflight
|
||||
attributes:
|
||||
label: Preflight Checklist
|
||||
description: Please confirm before submitting
|
||||
options:
|
||||
- label: I have searched [existing issues](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug) and this hasn't been reported yet
|
||||
required: true
|
||||
- label: This is a single bug report (please file separate reports for different bugs)
|
||||
required: true
|
||||
- label: I am using the latest version of Claude Code
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: actual
|
||||
attributes:
|
||||
label: What's Wrong?
|
||||
description: Describe what's happening that shouldn't be
|
||||
placeholder: |
|
||||
When I try to create a Python file, Claude shows an error "EACCES: permission denied" and the file isn't created.
|
||||
|
||||
The command fails immediately after accepting the file write permission...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: What Should Happen?
|
||||
description: Describe the expected behavior
|
||||
placeholder: Claude should create a Python script file successfully without errors
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: error_output
|
||||
attributes:
|
||||
label: Error Messages/Logs
|
||||
description: If you see any error messages, paste them here
|
||||
placeholder: |
|
||||
Paste any error output, stack traces, or relevant logs here.
|
||||
This will be automatically formatted as code.
|
||||
render: shell
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: |
|
||||
Please provide clear, numbered steps that anyone can follow to reproduce the issue.
|
||||
**Important**: Include any necessary code, file contents, or context needed to reproduce the bug.
|
||||
If the issue involves specific files or code, please create a minimal example.
|
||||
placeholder: |
|
||||
1. Create a file `test.py` with this content:
|
||||
```python
|
||||
def hello():
|
||||
print("test")
|
||||
```
|
||||
2. Run `claude "add type hints to test.py"`
|
||||
3. When prompted for file access, accept
|
||||
4. Error appears: "Unable to parse..."
|
||||
|
||||
Note: The bug only happens with Python files containing...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: model
|
||||
attributes:
|
||||
label: Claude Model
|
||||
description: Which model were you using? (Run `/model` to check)
|
||||
options:
|
||||
- Sonnet (default)
|
||||
- Opus
|
||||
- Not sure / Multiple models
|
||||
- Other
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: dropdown
|
||||
id: regression
|
||||
attributes:
|
||||
label: Is this a regression?
|
||||
description: Did this work in a previous version?
|
||||
options:
|
||||
- "Yes, this worked in a previous version"
|
||||
- "No, this never worked"
|
||||
- "I don't know"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: working_version
|
||||
attributes:
|
||||
label: Last Working Version
|
||||
description: If this is a regression, which version last worked? This helps expedite a fix.
|
||||
placeholder: "e.g., 1.0.100"
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: Claude Code Version
|
||||
description: Run `claude --version` and paste the output
|
||||
placeholder: "e.g., 1.0.123 (Claude Code)"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: platform
|
||||
attributes:
|
||||
label: Platform
|
||||
description: Which API platform are you using?
|
||||
options:
|
||||
- Anthropic API
|
||||
- AWS Bedrock
|
||||
- Google Vertex AI
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: os
|
||||
attributes:
|
||||
label: Operating System
|
||||
options:
|
||||
- macOS
|
||||
- Windows
|
||||
- Ubuntu/Debian Linux
|
||||
- Other Linux
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: terminal
|
||||
attributes:
|
||||
label: Terminal/Shell
|
||||
description: Which terminal are you using?
|
||||
options:
|
||||
- Terminal.app (macOS)
|
||||
- Warp
|
||||
- Cursor
|
||||
- iTerm2
|
||||
- IntelliJ IDEA terminal
|
||||
- VS Code integrated terminal
|
||||
- PyCharm terminal
|
||||
- Windows Terminal
|
||||
- PowerShell
|
||||
- WSL (Windows Subsystem for Linux)
|
||||
- Xterm
|
||||
- Non-interactive/CI environment
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Additional Information
|
||||
description: |
|
||||
Anything else that might help us understand the issue?
|
||||
- Screenshots (drag and drop images here)
|
||||
- Configuration files
|
||||
- Related files or code
|
||||
- Links to repositories demonstrating the issue
|
||||
placeholder: Any additional context, screenshots, or information...
|
||||
validations:
|
||||
required: false
|
||||
@@ -1,14 +0,0 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: 💬 Discord Community
|
||||
url: https://anthropic.com/discord
|
||||
about: Get help, ask questions, and chat with other Claude Code users
|
||||
- name: 📖 Documentation
|
||||
url: https://docs.claude.com/en/docs/claude-code
|
||||
about: Read the official documentation and guides
|
||||
- name: 🎓 Getting Started Guide
|
||||
url: https://docs.claude.com/en/docs/claude-code/quickstart
|
||||
about: New to Claude Code? Start here
|
||||
- name: 🔧 Troubleshooting Guide
|
||||
url: https://docs.claude.com/en/docs/claude-code/troubleshooting
|
||||
about: Common issues and how to fix them
|
||||
@@ -1,117 +0,0 @@
|
||||
name: 📚 Documentation Issue
|
||||
description: Report missing, unclear, or incorrect documentation
|
||||
title: "[DOCS] "
|
||||
labels:
|
||||
- documentation
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## Help us improve our documentation!
|
||||
|
||||
Good documentation is crucial for a great developer experience. Please let us know what's missing or confusing.
|
||||
|
||||
- type: dropdown
|
||||
id: doc_type
|
||||
attributes:
|
||||
label: Documentation Type
|
||||
description: What kind of documentation issue is this?
|
||||
options:
|
||||
- Missing documentation (feature not documented)
|
||||
- Unclear/confusing documentation
|
||||
- Incorrect/outdated documentation
|
||||
- Typo or formatting issue
|
||||
- Missing code examples
|
||||
- Broken links
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: location
|
||||
attributes:
|
||||
label: Documentation Location
|
||||
description: Where did you encounter this issue? Provide a URL if possible
|
||||
placeholder: "e.g., https://docs.anthropic.com/en/docs/claude-code/getting-started"
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: input
|
||||
id: section
|
||||
attributes:
|
||||
label: Section/Topic
|
||||
description: Which specific section or topic needs improvement?
|
||||
placeholder: "e.g., MCP Server Configuration section"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: current
|
||||
attributes:
|
||||
label: Current Documentation
|
||||
description: |
|
||||
What does the documentation currently say?
|
||||
Quote the specific text if applicable.
|
||||
placeholder: |
|
||||
The docs currently say:
|
||||
"To configure MCP servers, add them to your configuration..."
|
||||
|
||||
But it doesn't explain...
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: issue
|
||||
attributes:
|
||||
label: What's Wrong or Missing?
|
||||
description: Explain what's incorrect, unclear, or missing
|
||||
placeholder: |
|
||||
The documentation doesn't explain how to:
|
||||
- Configure multiple MCP servers
|
||||
- Handle authentication
|
||||
- Debug connection issues
|
||||
|
||||
The example code doesn't work because...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: suggested
|
||||
attributes:
|
||||
label: Suggested Improvement
|
||||
description: How should the documentation be improved? Provide suggested text if possible
|
||||
placeholder: |
|
||||
The documentation should include:
|
||||
|
||||
1. A complete example showing...
|
||||
2. Explanation of common errors like...
|
||||
3. Step-by-step guide for...
|
||||
|
||||
Suggested text:
|
||||
"To configure multiple MCP servers, create an array in your settings..."
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: impact
|
||||
attributes:
|
||||
label: Impact
|
||||
description: How much does this documentation issue affect users?
|
||||
options:
|
||||
- High - Prevents users from using a feature
|
||||
- Medium - Makes feature difficult to understand
|
||||
- Low - Minor confusion or inconvenience
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: |
|
||||
- Screenshots showing the issue
|
||||
- Links to related documentation
|
||||
- Examples from other projects that do this well
|
||||
placeholder: Any additional information that would help...
|
||||
validations:
|
||||
required: false
|
||||
@@ -1,132 +0,0 @@
|
||||
name: ✨ Feature Request
|
||||
description: Suggest a new feature or enhancement for Claude Code
|
||||
title: "[FEATURE] "
|
||||
labels:
|
||||
- enhancement
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## Thanks for suggesting a feature!
|
||||
|
||||
We love hearing ideas from our community. Please help us understand your use case by filling out the sections below.
|
||||
Before submitting, please check if this feature has already been requested.
|
||||
|
||||
- type: checkboxes
|
||||
id: preflight
|
||||
attributes:
|
||||
label: Preflight Checklist
|
||||
options:
|
||||
- label: I have searched [existing requests](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20label%3Aenhancement) and this feature hasn't been requested yet
|
||||
required: true
|
||||
- label: This is a single feature request (not multiple features)
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: Problem Statement
|
||||
description: |
|
||||
What problem are you trying to solve? Why do you need this feature?
|
||||
Focus on the problem, not the solution. Help us understand your workflow.
|
||||
placeholder: |
|
||||
I often need to work with multiple projects simultaneously, but Claude Code doesn't support...
|
||||
|
||||
When I'm debugging code, I find it difficult to...
|
||||
|
||||
The current workflow requires me to manually...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: Proposed Solution
|
||||
description: |
|
||||
How would you like this to work? Describe the ideal user experience.
|
||||
Be specific about how you'd interact with this feature.
|
||||
placeholder: |
|
||||
I'd like to be able to run `claude --workspace project1,project2` to...
|
||||
|
||||
There should be a command or setting that allows...
|
||||
|
||||
The interface should show...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: Alternative Solutions
|
||||
description: |
|
||||
What alternatives have you considered or tried?
|
||||
Are there workarounds you're currently using?
|
||||
placeholder: |
|
||||
I've tried using multiple terminal windows but...
|
||||
|
||||
Currently I work around this by...
|
||||
|
||||
Other tools solve this by...
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: dropdown
|
||||
id: priority
|
||||
attributes:
|
||||
label: Priority
|
||||
description: How important is this feature to your workflow?
|
||||
options:
|
||||
- Critical - Blocking my work
|
||||
- High - Significant impact on productivity
|
||||
- Medium - Would be very helpful
|
||||
- Low - Nice to have
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: category
|
||||
attributes:
|
||||
label: Feature Category
|
||||
description: What area does this feature relate to?
|
||||
options:
|
||||
- CLI commands and flags
|
||||
- Interactive mode (TUI)
|
||||
- File operations
|
||||
- API and model interactions
|
||||
- MCP server integration
|
||||
- Performance and speed
|
||||
- Configuration and settings
|
||||
- Developer tools/SDK
|
||||
- Documentation
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: use_case
|
||||
attributes:
|
||||
label: Use Case Example
|
||||
description: |
|
||||
Provide a concrete, real-world example of when you'd use this feature.
|
||||
Walk us through a scenario step-by-step.
|
||||
placeholder: |
|
||||
Example scenario:
|
||||
1. I'm working on a React app with a Node.js backend
|
||||
2. I need to make changes to both frontend and backend
|
||||
3. With this feature, I could...
|
||||
4. This would save me time because...
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: |
|
||||
- Screenshots or mockups of the proposed feature
|
||||
- Links to similar features in other tools
|
||||
- Technical considerations or constraints
|
||||
- Any other relevant information
|
||||
placeholder: Add any other context, mockups, or examples here...
|
||||
validations:
|
||||
required: false
|
||||
@@ -1,220 +0,0 @@
|
||||
name: 🤖 Model Behavior Issue
|
||||
description: Report unexpected Claude model behavior, incorrect actions, or permission violations
|
||||
title: "[MODEL] "
|
||||
labels:
|
||||
- model
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## Report Unexpected Model Behavior
|
||||
|
||||
Use this template when Claude does something unexpected, makes unwanted changes, or behaves inconsistently with your instructions.
|
||||
|
||||
**This is for:** Unexpected actions, file modifications outside scope, ignoring instructions, making assumptions
|
||||
**NOT for:** Crashes, API errors, or installation issues (use Bug Report instead)
|
||||
|
||||
- type: checkboxes
|
||||
id: preflight
|
||||
attributes:
|
||||
label: Preflight Checklist
|
||||
description: Please confirm before submitting
|
||||
options:
|
||||
- label: I have searched [existing issues](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20state%3Aopen%20label%3Amodel) for similar behavior reports
|
||||
required: true
|
||||
- label: This report does NOT contain sensitive information (API keys, passwords, etc.)
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: behavior_type
|
||||
attributes:
|
||||
label: Type of Behavior Issue
|
||||
description: What category best describes the unexpected behavior?
|
||||
options:
|
||||
- Claude modified files I didn't ask it to modify
|
||||
- Claude accessed files outside the working directory
|
||||
- Claude ignored my instructions or configuration
|
||||
- Claude reverted/undid previous changes without asking
|
||||
- Claude made incorrect assumptions about my project
|
||||
- Claude refused a reasonable request
|
||||
- Claude's behavior changed between sessions
|
||||
- Subagent behaved unexpectedly
|
||||
- Other unexpected behavior
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: what_you_asked
|
||||
attributes:
|
||||
label: What You Asked Claude to Do
|
||||
description: Provide the exact prompt or command you gave
|
||||
placeholder: |
|
||||
I asked: "Update the README.md file to add installation instructions"
|
||||
|
||||
Or I ran: `claude "fix the bug in auth.js"`
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: what_claude_did
|
||||
attributes:
|
||||
label: What Claude Actually Did
|
||||
description: Describe step-by-step what Claude did instead
|
||||
placeholder: |
|
||||
1. Claude read README.md
|
||||
2. Instead of updating it, Claude deleted the entire file
|
||||
3. Created a new README from scratch with different content
|
||||
4. Also modified package.json without being asked
|
||||
5. Changed .gitignore file
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected_behavior
|
||||
attributes:
|
||||
label: Expected Behavior
|
||||
description: What should Claude have done?
|
||||
placeholder: |
|
||||
Claude should have:
|
||||
1. Read the existing README.md
|
||||
2. Added an "Installation" section
|
||||
3. Only modified that single file
|
||||
4. Not touched any other files
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: files_affected
|
||||
attributes:
|
||||
label: Files Affected
|
||||
description: |
|
||||
List all files that were accessed or modified (even if you didn't expect them to be)
|
||||
placeholder: |
|
||||
Modified:
|
||||
- README.md (deleted and recreated)
|
||||
- package.json (version bumped - not requested)
|
||||
- .gitignore (added entries - not requested)
|
||||
|
||||
Read (unexpectedly):
|
||||
- /Users/me/.ssh/config
|
||||
- ../../../parent-directory/secrets.env
|
||||
render: shell
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: dropdown
|
||||
id: permission_mode
|
||||
attributes:
|
||||
label: Permission Mode
|
||||
description: What permission settings were active?
|
||||
options:
|
||||
- Accept Edits was ON (auto-accepting changes)
|
||||
- Accept Edits was OFF (manual approval required)
|
||||
- I don't know / Not sure
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: reproducible
|
||||
attributes:
|
||||
label: Can You Reproduce This?
|
||||
description: Does this happen consistently?
|
||||
options:
|
||||
- Yes, every time with the same prompt
|
||||
- Sometimes (intermittent)
|
||||
- No, only happened once
|
||||
- Haven't tried to reproduce
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: reproduction_steps
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: If reproducible, provide minimal steps
|
||||
placeholder: |
|
||||
1. Create a new directory with a simple README.md
|
||||
2. Ask Claude Code to "improve the README"
|
||||
3. Claude will delete and recreate the file instead of editing
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: dropdown
|
||||
id: model
|
||||
attributes:
|
||||
label: Claude Model
|
||||
description: Which model were you using? (Run `/model` to check)
|
||||
options:
|
||||
- Sonnet
|
||||
- Opus
|
||||
- Haiku
|
||||
- Not sure
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: conversation_log
|
||||
attributes:
|
||||
label: Relevant Conversation
|
||||
description: |
|
||||
Include relevant parts of Claude's responses, especially where it explains what it's doing
|
||||
placeholder: |
|
||||
Claude said: "I'll help you update the README. Let me first delete the old one and create a fresh version..."
|
||||
|
||||
[Then proceeded to delete without asking for confirmation]
|
||||
render: markdown
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: dropdown
|
||||
id: impact
|
||||
attributes:
|
||||
label: Impact
|
||||
description: How severe was the impact of this behavior?
|
||||
options:
|
||||
- Critical - Data loss or corrupted project
|
||||
- High - Significant unwanted changes
|
||||
- Medium - Extra work to undo changes
|
||||
- Low - Minor inconvenience
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: Claude Code Version
|
||||
description: Run `claude --version` and paste the output
|
||||
placeholder: "e.g., 1.0.123 (Claude Code)"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: platform
|
||||
attributes:
|
||||
label: Platform
|
||||
description: Which API platform are you using?
|
||||
options:
|
||||
- Anthropic API
|
||||
- AWS Bedrock
|
||||
- Google Vertex AI
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: |
|
||||
- Any patterns you've noticed
|
||||
- Similar behavior in other sessions
|
||||
- Specific file types or project structures that trigger this
|
||||
- Screenshots if relevant
|
||||
placeholder: |
|
||||
This seems to happen more often with:
|
||||
- Python projects
|
||||
- When there are multiple similar files
|
||||
- After long conversations
|
||||
validations:
|
||||
required: false
|
||||
@@ -1,31 +0,0 @@
|
||||
name: Auto-close duplicate issues
|
||||
description: Auto-closes issues that are duplicates of existing issues
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 9 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
auto-close-duplicates:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 (sha-pinned)
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Auto-close duplicate issues
|
||||
run: bun run scripts/auto-close-duplicates.ts
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
|
||||
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
|
||||
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
||||
@@ -1,44 +0,0 @@
|
||||
name: Backfill Duplicate Comments
|
||||
description: Triggers duplicate detection for old issues that don't have duplicate comments
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
days_back:
|
||||
description: 'How many days back to look for old issues'
|
||||
required: false
|
||||
default: '90'
|
||||
type: string
|
||||
dry_run:
|
||||
description: 'Dry run mode (true to only log what would be done)'
|
||||
required: false
|
||||
default: 'true'
|
||||
type: choice
|
||||
options:
|
||||
- 'true'
|
||||
- 'false'
|
||||
|
||||
jobs:
|
||||
backfill-duplicate-comments:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
actions: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 (sha-pinned)
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Backfill duplicate comments
|
||||
run: bun run scripts/backfill-duplicate-comments.ts
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
DAYS_BACK: ${{ inputs.days_back }}
|
||||
DRY_RUN: ${{ inputs.dry_run }}
|
||||
@@ -1,94 +0,0 @@
|
||||
name: Claude Issue Dedupe
|
||||
description: Automatically dedupe GitHub issues using Claude Code
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
issue_number:
|
||||
description: 'Issue number to process for duplicate detection'
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
claude-dedupe-issues:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
# Required to mint the OIDC token exchanged for a Claude API access token (Workload Identity Federation)
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Run Claude Code slash command
|
||||
uses: anthropics/claude-code-action@v1
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
CLAUDE_CODE_SCRIPT_CAPS: '{"comment-on-duplicates.sh":1}'
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
allowed_non_write_users: "*"
|
||||
prompt: "/dedupe ${{ github.repository }}/issues/${{ github.event.issue.number || inputs.issue_number }}"
|
||||
# Authenticate to the Claude API via Workload Identity Federation
|
||||
# (the workflow's OIDC token is exchanged for a short-lived access
|
||||
# token) instead of a static API key.
|
||||
anthropic_federation_rule_id: ${{ vars.ANTHROPIC_FEDERATION_RULE_ID }}
|
||||
anthropic_organization_id: ${{ vars.ANTHROPIC_ORGANIZATION_ID }}
|
||||
anthropic_service_account_id: ${{ vars.ANTHROPIC_SERVICE_ACCOUNT_ID }}
|
||||
anthropic_workspace_id: ${{ vars.ANTHROPIC_WORKSPACE_ID }}
|
||||
claude_args: "--model claude-sonnet-4-5-20250929"
|
||||
|
||||
- name: Log duplicate comment event to Statsig
|
||||
if: always()
|
||||
env:
|
||||
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
||||
ISSUE_NUMBER: ${{ github.event.issue.number || inputs.issue_number }}
|
||||
REPO: ${{ github.repository }}
|
||||
TRIGGERED_BY: ${{ github.event_name }}
|
||||
WORKFLOW_RUN_ID: ${{ github.run_id }}
|
||||
run: |
|
||||
if [ -z "$STATSIG_API_KEY" ]; then
|
||||
echo "STATSIG_API_KEY not found, skipping Statsig logging"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Prepare the event payload
|
||||
EVENT_PAYLOAD=$(jq -n \
|
||||
--arg issue_number "$ISSUE_NUMBER" \
|
||||
--arg repo "$REPO" \
|
||||
--arg triggered_by "$TRIGGERED_BY" \
|
||||
--arg workflow_run_id "$WORKFLOW_RUN_ID" \
|
||||
'{
|
||||
events: [{
|
||||
eventName: "github_duplicate_comment_added",
|
||||
value: 1,
|
||||
metadata: {
|
||||
repository: $repo,
|
||||
issue_number: ($issue_number | tonumber),
|
||||
triggered_by: $triggered_by,
|
||||
workflow_run_id: $workflow_run_id
|
||||
},
|
||||
time: (now | floor | tostring)
|
||||
}]
|
||||
}')
|
||||
|
||||
# Send to Statsig API
|
||||
echo "Logging duplicate comment event to Statsig for issue #${ISSUE_NUMBER}"
|
||||
|
||||
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST https://events.statsigapi.net/v1/log_event \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "STATSIG-API-KEY: ${STATSIG_API_KEY}" \
|
||||
-d "$EVENT_PAYLOAD")
|
||||
|
||||
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
|
||||
BODY=$(echo "$RESPONSE" | head -n-1)
|
||||
|
||||
if [ "$HTTP_CODE" -eq 200 ] || [ "$HTTP_CODE" -eq 202 ]; then
|
||||
echo "Successfully logged duplicate comment event for issue #${ISSUE_NUMBER}"
|
||||
else
|
||||
echo "Failed to log duplicate comment event for issue #${ISSUE_NUMBER}. HTTP ${HTTP_CODE}: ${BODY}"
|
||||
fi
|
||||
@@ -1,47 +0,0 @@
|
||||
name: Claude Issue Triage
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
triage-issue:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
if: >-
|
||||
github.event_name == 'issues' ||
|
||||
(github.event_name == 'issue_comment' && !github.event.issue.pull_request && github.event.comment.user.type != 'Bot')
|
||||
concurrency:
|
||||
group: issue-triage-${{ github.event.issue.number }}
|
||||
cancel-in-progress: true
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
# Required to mint the OIDC token exchanged for a Claude API access token (Workload Identity Federation)
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Run Claude Code for Issue Triage
|
||||
timeout-minutes: 5
|
||||
uses: anthropics/claude-code-action@v1
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_REPO: ${{ github.repository }}
|
||||
CLAUDE_CODE_SCRIPT_CAPS: '{"edit-issue-labels.sh":2}'
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
allowed_non_write_users: "*"
|
||||
prompt: "/triage-issue REPO: ${{ github.repository }} ISSUE_NUMBER: ${{ github.event.issue.number }} EVENT: ${{ github.event_name }}"
|
||||
# Authenticate to the Claude API via Workload Identity Federation
|
||||
# (the workflow's OIDC token is exchanged for a short-lived access
|
||||
# token) instead of a static API key.
|
||||
anthropic_federation_rule_id: ${{ vars.ANTHROPIC_FEDERATION_RULE_ID }}
|
||||
anthropic_organization_id: ${{ vars.ANTHROPIC_ORGANIZATION_ID }}
|
||||
anthropic_service_account_id: ${{ vars.ANTHROPIC_SERVICE_ACCOUNT_ID }}
|
||||
anthropic_workspace_id: ${{ vars.ANTHROPIC_WORKSPACE_ID }}
|
||||
claude_args: |
|
||||
--model claude-opus-4-6
|
||||
@@ -1,44 +0,0 @@
|
||||
name: Claude Code
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
pull_request_review_comment:
|
||||
types: [created]
|
||||
issues:
|
||||
types: [opened, assigned]
|
||||
pull_request_review:
|
||||
types: [submitted]
|
||||
|
||||
jobs:
|
||||
claude:
|
||||
if: |
|
||||
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
||||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
||||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
||||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
issues: read
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Run Claude Code
|
||||
id: claude
|
||||
uses: anthropics/claude-code-action@v1
|
||||
with:
|
||||
# Authenticate to the Claude API via Workload Identity Federation
|
||||
# (the workflow's OIDC token is exchanged for a short-lived access
|
||||
# token) instead of a static API key.
|
||||
anthropic_federation_rule_id: ${{ vars.ANTHROPIC_FEDERATION_RULE_ID }}
|
||||
anthropic_organization_id: ${{ vars.ANTHROPIC_ORGANIZATION_ID }}
|
||||
anthropic_service_account_id: ${{ vars.ANTHROPIC_SERVICE_ACCOUNT_ID }}
|
||||
anthropic_workspace_id: ${{ vars.ANTHROPIC_WORKSPACE_ID }}
|
||||
claude_args: "--model claude-sonnet-4-5-20250929"
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
name: "Issue Lifecycle Comment"
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [labeled]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 (sha-pinned)
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Post lifecycle comment
|
||||
run: bun run scripts/lifecycle-comment.ts
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
LABEL: ${{ github.event.label.name }}
|
||||
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||
@@ -1,28 +0,0 @@
|
||||
name: Issue Opened Dispatch
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
permissions:
|
||||
issues: read
|
||||
actions: write
|
||||
|
||||
jobs:
|
||||
notify:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 1
|
||||
steps:
|
||||
- name: Process new issue
|
||||
env:
|
||||
ISSUE_URL: ${{ github.event.issue.html_url }}
|
||||
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||
ISSUE_TITLE: ${{ github.event.issue.title }}
|
||||
TARGET_REPO: ${{ secrets.ISSUE_OPENED_DISPATCH_TARGET_REPO }}
|
||||
GH_TOKEN: ${{ secrets.ISSUE_OPENED_DISPATCH_TOKEN }}
|
||||
run: |
|
||||
gh api repos/${TARGET_REPO}/dispatches \
|
||||
-f event_type=issue_opened \
|
||||
-f client_payload[issue_url]="${ISSUE_URL}" || {
|
||||
exit 0
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
name: "Lock Stale Issues"
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# 8am Pacific = 1pm UTC (2pm UTC during DST)
|
||||
- cron: "0 14 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
concurrency:
|
||||
group: lock-threads
|
||||
|
||||
jobs:
|
||||
lock-closed-issues:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Lock closed issues after 7 days of inactivity
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const sevenDaysAgo = new Date();
|
||||
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
|
||||
|
||||
const lockComment = `This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.`;
|
||||
|
||||
let page = 1;
|
||||
let hasMore = true;
|
||||
let totalLocked = 0;
|
||||
|
||||
while (hasMore) {
|
||||
// Get closed issues (pagination)
|
||||
const { data: issues } = await github.rest.issues.listForRepo({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
state: 'closed',
|
||||
sort: 'updated',
|
||||
direction: 'asc',
|
||||
per_page: 100,
|
||||
page: page
|
||||
});
|
||||
|
||||
if (issues.length === 0) {
|
||||
hasMore = false;
|
||||
break;
|
||||
}
|
||||
|
||||
for (const issue of issues) {
|
||||
// Skip if already locked
|
||||
if (issue.locked) continue;
|
||||
|
||||
// Skip pull requests
|
||||
if (issue.pull_request) continue;
|
||||
|
||||
// Check if updated more than 7 days ago
|
||||
const updatedAt = new Date(issue.updated_at);
|
||||
if (updatedAt > sevenDaysAgo) {
|
||||
// Since issues are sorted by updated_at ascending,
|
||||
// once we hit a recent issue, all remaining will be recent too
|
||||
hasMore = false;
|
||||
break;
|
||||
}
|
||||
|
||||
try {
|
||||
// Add comment before locking
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
body: lockComment
|
||||
});
|
||||
|
||||
// Lock the issue
|
||||
await github.rest.issues.lock({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
lock_reason: 'resolved'
|
||||
});
|
||||
|
||||
totalLocked++;
|
||||
console.log(`Locked issue #${issue.number}: ${issue.title}`);
|
||||
} catch (error) {
|
||||
console.error(`Failed to lock issue #${issue.number}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
page++;
|
||||
}
|
||||
|
||||
console.log(`Total issues locked: ${totalLocked}`);
|
||||
@@ -1,40 +0,0 @@
|
||||
name: Log Issue Events to Statsig
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened, closed]
|
||||
|
||||
jobs:
|
||||
log-to-statsig:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: read
|
||||
steps:
|
||||
- name: Log issue creation to Statsig
|
||||
env:
|
||||
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
||||
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||
REPO: ${{ github.repository }}
|
||||
ISSUE_TITLE: ${{ github.event.issue.title }}
|
||||
AUTHOR: ${{ github.event.issue.user.login }}
|
||||
CREATED_AT: ${{ github.event.issue.created_at }}
|
||||
run: |
|
||||
# All values are now safely passed via environment variables
|
||||
# No direct templating in the shell script to prevent injection attacks
|
||||
|
||||
curl -X POST "https://events.statsigapi.net/v1/log_event" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "statsig-api-key: $STATSIG_API_KEY" \
|
||||
-d '{
|
||||
"events": [{
|
||||
"eventName": "github_issue_created",
|
||||
"metadata": {
|
||||
"issue_number": "'"$ISSUE_NUMBER"'",
|
||||
"repository": "'"$REPO"'",
|
||||
"title": "'"$(echo "$ISSUE_TITLE" | sed "s/\"/\\\\\"/g")"'",
|
||||
"author": "'"$AUTHOR"'",
|
||||
"created_at": "'"$CREATED_AT"'"
|
||||
},
|
||||
"time": '"$(date +%s)000"'
|
||||
}]
|
||||
}'
|
||||
@@ -1,47 +0,0 @@
|
||||
name: Non-write Users Check
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- ".github/**"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
allowed-non-write-check:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
steps:
|
||||
- run: |
|
||||
DIFF=$(gh pr diff "$PR_NUMBER" -R "$REPO" || true)
|
||||
|
||||
if ! echo "$DIFF" | grep -qE '^diff --git a/\.github/.*\.ya?ml'; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
MATCHES=$(echo "$DIFF" | grep "^+.*allowed_non_write_users" || true)
|
||||
|
||||
if [ -z "$MATCHES" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
EXISTING=$(gh pr view "$PR_NUMBER" -R "$REPO" --json comments --jq '.comments[].body' \
|
||||
| grep -c "<!-- non-write-users-check -->" || true)
|
||||
|
||||
if [ "$EXISTING" -gt 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
gh pr comment "$PR_NUMBER" -R "$REPO" --body '<!-- non-write-users-check -->
|
||||
**`allowed_non_write_users` detected**
|
||||
|
||||
This PR adds or modifies `allowed_non_write_users`, which allows users without write access to trigger Claude Code Action workflows. This can introduce security risks.
|
||||
|
||||
If this is a new flow, please make sure you actually need `allowed_non_write_users`. If you are editing an existing workflow, double check that you are not adding new Claude permissions which might lead to a vulnerability.
|
||||
|
||||
See existing workflows in this repo for safe usage examples, or contact the AppSec team.'
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
REPO: ${{ github.repository }}
|
||||
@@ -1,42 +0,0 @@
|
||||
name: "Remove Autoclose Label on Activity"
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
remove-autoclose:
|
||||
# Only run if the issue has the autoclose label
|
||||
if: |
|
||||
github.event.issue.state == 'open' &&
|
||||
contains(github.event.issue.labels.*.name, 'autoclose') &&
|
||||
github.event.comment.user.login != 'github-actions[bot]'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Remove autoclose label
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
console.log(`Removing autoclose label from issue #${context.issue.number} due to new comment from ${context.payload.comment.user.login}`);
|
||||
|
||||
try {
|
||||
// Remove the autoclose label
|
||||
await github.rest.issues.removeLabel({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
name: 'autoclose'
|
||||
});
|
||||
|
||||
console.log(`Successfully removed autoclose label from issue #${context.issue.number}`);
|
||||
} catch (error) {
|
||||
// If the label was already removed or doesn't exist, that's fine
|
||||
if (error.status === 404) {
|
||||
console.log(`Autoclose label was already removed from issue #${context.issue.number}`);
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
name: "Issue Sweep"
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 10,22 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
concurrency:
|
||||
group: daily-issue-sweep
|
||||
|
||||
jobs:
|
||||
sweep:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 (sha-pinned)
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Enforce lifecycle timeouts
|
||||
run: bun run scripts/sweep.ts
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
|
||||
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
|
||||
@@ -1,2 +0,0 @@
|
||||
.DS_Store
|
||||
|
||||
-3946
File diff suppressed because it is too large
Load Diff
@@ -1 +1,3 @@
|
||||
Claude Code is a Beta research preview per our [Commercial Terms of Service](https://www.anthropic.com/legal/commercial-terms). When you use Claude Code, we collect Feedback, which includes usage data such as code acceptance or rejections, as well as associated conversation data. We may use this Feedback to improve our products, although we will not train models using your Feedback from Claude Code.
|
||||
|
||||
© Anthropic PBC. All rights reserved. Use is subject to Anthropic's [Commercial Terms of Service](https://www.anthropic.com/legal/commercial-terms).
|
||||
|
||||
@@ -1,69 +1,57 @@
|
||||
# Claude Code
|
||||
# Claude Code (Research Preview)
|
||||
|
||||
 [![npm]](https://www.npmjs.com/package/@anthropic-ai/claude-code)
|
||||
|
||||
[npm]: https://img.shields.io/npm/v/@anthropic-ai/claude-code.svg?style=flat-square
|
||||
|
||||
Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows -- all through natural language commands. Use it in your terminal, IDE, or tag @claude on Github.
|
||||
Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows - all through natural language commands.
|
||||
|
||||
**Learn more in the [official documentation](https://code.claude.com/docs/en/overview)**.
|
||||
Some of its key capabilities include:
|
||||
|
||||
<img src="./demo.gif" />
|
||||
- Edit files and fix bugs across your codebase
|
||||
- Answer questions about your code's architecture and logic
|
||||
- Execute and fix tests, lint, and other commands
|
||||
- Search through git history, resolve merge conflicts, and create commits and PRs
|
||||
|
||||
**Learn more in the [official documentation](https://docs.anthropic.com/en/docs/agents/claude-code/introduction)**.
|
||||
|
||||
## Get started
|
||||
> [!NOTE]
|
||||
> Installation via npm is deprecated. Use one of the recommended methods below.
|
||||
|
||||
For more installation options, uninstall steps, and troubleshooting, see the [setup documentation](https://code.claude.com/docs/en/setup).
|
||||
1. If you are new to Node.js and Node Package Manager (`npm`), then it is recommended that you configure an NPM prefix for your user.
|
||||
Instructions on how to do this can be found [here](https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview#recommended-create-a-new-user-writable-npm-prefix).
|
||||
|
||||
1. Install Claude Code:
|
||||
*Important* We recommend installing this package as a non-privileged user, not as an administrative user like `root`.
|
||||
Installing as a non-privileged user helps maintain your system's security and stability.
|
||||
|
||||
**MacOS/Linux (Recommended):**
|
||||
```bash
|
||||
curl -fsSL https://claude.ai/install.sh | bash
|
||||
```
|
||||
2. Install Claude Code:
|
||||
|
||||
```sh
|
||||
npm install -g @anthropic-ai/claude-code
|
||||
```
|
||||
|
||||
**Homebrew (MacOS/Linux):**
|
||||
```bash
|
||||
brew install --cask claude-code
|
||||
```
|
||||
3. Navigate to your project directory and run <code>claude</code>.
|
||||
|
||||
**Windows (Recommended):**
|
||||
```powershell
|
||||
irm https://claude.ai/install.ps1 | iex
|
||||
```
|
||||
4. Complete the one-time OAuth process with your Anthropic Console account.
|
||||
|
||||
**WinGet (Windows):**
|
||||
```powershell
|
||||
winget install Anthropic.ClaudeCode
|
||||
```
|
||||
### Research Preview
|
||||
|
||||
**NPM (Deprecated):**
|
||||
```bash
|
||||
npm install -g @anthropic-ai/claude-code
|
||||
```
|
||||
We're launching Claude Code as a beta product in research preview to learn directly from developers about their experiences collaborating with AI agents. Our aim is to learn more about how developers prefer to collaborate with AI tools, which development workflows benefit most from working with the agent, and how we can make the agent experience more intuitive.
|
||||
|
||||
2. Navigate to your project directory and run `claude`.
|
||||
This is an early version of the product experience, and it's likely to evolve as we learn more about developer preferences. Claude Code is an early look into what's possible with agentic coding, and we know there are areas to improve. We plan to enhance tool execution reliability, support for long-running commands, terminal rendering, and Claude's self-knowledge of its capabilities -- as well as many other product experiences -- over the coming weeks.
|
||||
|
||||
## Plugins
|
||||
### Reporting Bugs
|
||||
|
||||
This repository includes several Claude Code plugins that extend functionality with custom commands and agents. See the [plugins directory](./plugins/README.md) for detailed documentation on available plugins.
|
||||
We welcome feedback during this beta period. Use the `/bug` command to report issues directly within Claude Code, or file a [GitHub issue](https://github.com/anthropics/claude-code/issues).
|
||||
|
||||
## Reporting Bugs
|
||||
|
||||
We welcome your feedback. Use the `/bug` command to report issues directly within Claude Code, or file a [GitHub issue](https://github.com/anthropics/claude-code/issues).
|
||||
|
||||
## Connect on Discord
|
||||
|
||||
Join the [Claude Developers Discord](https://anthropic.com/discord) to connect with other developers using Claude Code. Get help, share feedback, and discuss your projects with the community.
|
||||
|
||||
## Data collection, usage, and retention
|
||||
### Data collection, usage, and retention
|
||||
|
||||
When you use Claude Code, we collect feedback, which includes usage data (such as code acceptance or rejections), associated conversation data, and user feedback submitted via the `/bug` command.
|
||||
|
||||
### How we use your data
|
||||
#### How we use your data
|
||||
|
||||
See our [data usage policies](https://code.claude.com/docs/en/data-usage).
|
||||
We may use feedback to improve our products and services, but we will not train generative models using your feedback from Claude Code. Given their potentially sensitive nature, we store user feedback transcripts for only 30 days.
|
||||
|
||||
If you choose to send us feedback about Claude Code, such as transcripts of your usage, Anthropic may use that feedback to debug related issues and improve Claude Code's functionality (e.g., to reduce the risk of similar bugs occurring in the future).
|
||||
|
||||
### Privacy safeguards
|
||||
|
||||
|
||||
+3
-3
@@ -5,8 +5,8 @@ Thank you for helping us keep Claude Code secure!
|
||||
|
||||
The security of our systems and user data is Anthropic's top priority. We appreciate the work of security researchers acting in good faith in identifying and reporting potential vulnerabilities.
|
||||
|
||||
Our security program is managed on HackerOne and we ask that any validated vulnerability in this functionality be reported through their [submission form](https://hackerone.com/4f1f16ba-10d3-4d09-9ecc-c721aad90f24/embedded_submissions/new).
|
||||
Our security program is managed on HackerOne and we ask that any validated vulnerability in this functionality be reported through their [submission form](https://hackerone.com/anthropic-vdp/reports/new?type=team&report_type=vulnerability).
|
||||
|
||||
## Anthropic Bug Bounty
|
||||
## Vulnerability Disclosure Program
|
||||
|
||||
Our Bug Bounty Program Guidelines are defined on our [HackerOne program page](https://hackerone.com/anthropic).
|
||||
Our Vulnerability Program Guidelines are defined on our [HackerOne program page](https://hackerone.com/anthropic-vdp).
|
||||
|
||||
@@ -1,152 +0,0 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Automates the setup and connection to a DevContainer environment using either Docker or Podman on Windows.
|
||||
|
||||
.DESCRIPTION
|
||||
This script automates the process of initializing, starting, and connecting to a DevContainer
|
||||
using either Docker or Podman as the container backend. It must be executed from the root
|
||||
directory of your project and assumes the script is located in a 'Script' subdirectory.
|
||||
|
||||
.PARAMETER Backend
|
||||
Specifies the container backend to use. Valid values are 'docker' or 'podman'.
|
||||
|
||||
.EXAMPLE
|
||||
.\Script\run_devcontainer_claude_code.ps1 -Backend docker
|
||||
Uses Docker as the container backend.
|
||||
|
||||
.EXAMPLE
|
||||
.\Script\run_devcontainer_claude_code.ps1 -Backend podman
|
||||
Uses Podman as the container backend.
|
||||
|
||||
.NOTES
|
||||
Project Structure:
|
||||
Project/
|
||||
├── .devcontainer/
|
||||
└── Script/
|
||||
└── run_devcontainer_claude_code.ps1
|
||||
#>
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
[ValidateSet('docker','podman')]
|
||||
[string]$Backend
|
||||
)
|
||||
|
||||
# Notify script start
|
||||
Write-Host "--- DevContainer Startup & Connection Script ---"
|
||||
Write-Host "Using backend: $($Backend)"
|
||||
|
||||
# --- Prerequisite Check ---
|
||||
Write-Host "Checking for required commands..."
|
||||
try {
|
||||
if (-not (Get-Command $Backend -ErrorAction SilentlyContinue)) {
|
||||
throw "Required command '$($Backend)' not found."
|
||||
}
|
||||
Write-Host "- $($Backend) command found."
|
||||
if (-not (Get-Command devcontainer -ErrorAction SilentlyContinue)) {
|
||||
throw "Required command 'devcontainer' not found."
|
||||
}
|
||||
Write-Host "- devcontainer command found."
|
||||
}
|
||||
catch {
|
||||
Write-Error "A required command is not installed or not in your PATH. $($_.Exception.Message)"
|
||||
Write-Error "Please ensure both '$Backend' and 'devcontainer' are installed and accessible in your system's PATH."
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
# --- Backend-Specific Initialization ---
|
||||
if ($Backend -eq 'podman') {
|
||||
Write-Host "--- Podman Backend Initialization ---"
|
||||
|
||||
# --- Step 1a: Initialize Podman machine ---
|
||||
Write-Host "Initializing Podman machine 'claudeVM'..."
|
||||
try {
|
||||
& podman machine init claudeVM
|
||||
Write-Host "Podman machine 'claudeVM' initialized or already exists."
|
||||
} catch {
|
||||
Write-Error "Failed to initialize Podman machine: $($_.Exception.Message)"
|
||||
exit 1 # Exit script on error
|
||||
}
|
||||
|
||||
# --- Step 1b: Start Podman machine ---
|
||||
Write-Host "Starting Podman machine 'claudeVM'..."
|
||||
try {
|
||||
& podman machine start claudeVM -q
|
||||
Write-Host "Podman machine started or already running."
|
||||
} catch {
|
||||
Write-Error "Failed to start Podman machine: $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# --- Step 2: Set default connection ---
|
||||
Write-Host "Setting default Podman connection to 'claudeVM'..."
|
||||
try {
|
||||
& podman system connection default claudeVM
|
||||
Write-Host "Default connection set."
|
||||
} catch {
|
||||
Write-Warning "Failed to set default Podman connection (may be already set or machine issue): $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
} elseif ($Backend -eq 'docker') {
|
||||
Write-Host "--- Docker Backend Initialization ---"
|
||||
|
||||
# --- Step 1 & 2: Check Docker Desktop ---
|
||||
Write-Host "Checking if Docker Desktop is running and docker command is available..."
|
||||
try {
|
||||
docker info | Out-Null
|
||||
Write-Host "Docker Desktop (daemon) is running."
|
||||
} catch {
|
||||
Write-Error "Docker Desktop is not running or docker command not found."
|
||||
Write-Error "Please ensure Docker Desktop is running."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
# --- Step 3: Bring up DevContainer ---
|
||||
Write-Host "Bringing up DevContainer in the current folder..."
|
||||
try {
|
||||
$arguments = @('up', '--workspace-folder', '.')
|
||||
if ($Backend -eq 'podman') {
|
||||
$arguments += '--docker-path', 'podman'
|
||||
}
|
||||
& devcontainer @arguments
|
||||
Write-Host "DevContainer startup process completed."
|
||||
} catch {
|
||||
Write-Error "Failed to bring up DevContainer: $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# --- Step 4: Get DevContainer ID ---
|
||||
Write-Host "Finding the DevContainer ID..."
|
||||
$currentFolder = (Get-Location).Path
|
||||
|
||||
try {
|
||||
$containerId = (& $Backend ps --filter "label=devcontainer.local_folder=$currentFolder" --format '{{.ID}}').Trim()
|
||||
} catch {
|
||||
$displayCommand = "$Backend ps --filter `"label=devcontainer.local_folder=$currentFolder`" --format '{{.ID}}'"
|
||||
Write-Error "Failed to get container ID (Command: $displayCommand): $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (-not $containerId) {
|
||||
Write-Error "Could not find DevContainer ID for the current folder ('$currentFolder')."
|
||||
Write-Error "Please check if 'devcontainer up' was successful and the container is running."
|
||||
exit 1
|
||||
}
|
||||
Write-Host "Found container ID: $containerId"
|
||||
|
||||
# --- Step 5 & 6: Execute command and enter interactive shell inside container ---
|
||||
Write-Host "Executing 'claude' command and then starting zsh session inside container $($containerId)..."
|
||||
try {
|
||||
& $Backend exec -it $containerId zsh -c 'claude; exec zsh'
|
||||
Write-Host "Interactive session ended."
|
||||
} catch {
|
||||
$displayCommand = "$Backend exec -it $containerId zsh -c 'claude; exec zsh'"
|
||||
Write-Error "Failed to execute command inside container (Command: $displayCommand): $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Notify script completion
|
||||
Write-Host "--- Script completed ---"
|
||||
@@ -1,83 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Claude Code Hook: Bash Command Validator
|
||||
=========================================
|
||||
This hook runs as a PreToolUse hook for the Bash tool.
|
||||
It validates bash commands against a set of rules before execution.
|
||||
In this case it changes grep calls to using rg.
|
||||
|
||||
Read more about hooks here: https://docs.anthropic.com/en/docs/claude-code/hooks
|
||||
|
||||
Make sure to change your path to your actual script.
|
||||
|
||||
{
|
||||
"hooks": {
|
||||
"PreToolUse": [
|
||||
{
|
||||
"matcher": "Bash",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "python3 /path/to/claude-code/examples/hooks/bash_command_validator_example.py"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
"""
|
||||
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
|
||||
# Define validation rules as a list of (regex pattern, message) tuples
|
||||
_VALIDATION_RULES = [
|
||||
(
|
||||
r"^grep\b(?!.*\|)",
|
||||
"Use 'rg' (ripgrep) instead of 'grep' for better performance and features",
|
||||
),
|
||||
(
|
||||
r"^find\s+\S+\s+-name\b",
|
||||
"Use 'rg --files | rg pattern' or 'rg --files -g pattern' instead of 'find -name' for better performance",
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def _validate_command(command: str) -> list[str]:
|
||||
issues = []
|
||||
for pattern, message in _VALIDATION_RULES:
|
||||
if re.search(pattern, command):
|
||||
issues.append(message)
|
||||
return issues
|
||||
|
||||
|
||||
def main():
|
||||
try:
|
||||
input_data = json.load(sys.stdin)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Error: Invalid JSON input: {e}", file=sys.stderr)
|
||||
# Exit code 1 shows stderr to the user but not to Claude
|
||||
sys.exit(1)
|
||||
|
||||
tool_name = input_data.get("tool_name", "")
|
||||
if tool_name != "Bash":
|
||||
sys.exit(0)
|
||||
|
||||
tool_input = input_data.get("tool_input", {})
|
||||
command = tool_input.get("command", "")
|
||||
|
||||
if not command:
|
||||
sys.exit(0)
|
||||
|
||||
issues = _validate_command(command)
|
||||
if issues:
|
||||
for message in issues:
|
||||
print(f"• {message}", file=sys.stderr)
|
||||
# Exit code 2 blocks tool call and shows stderr to Claude
|
||||
sys.exit(2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,28 +0,0 @@
|
||||
# MDM Deployment Examples
|
||||
|
||||
Example templates for deploying Claude Code [managed settings](https://code.claude.com/docs/en/settings#settings-files) through Jamf, Iru (Kandji), Intune, or Group Policy. Use these as starting points — adjust them to fit your needs.
|
||||
|
||||
All templates encode the same minimal example (`permissions.disableBypassPermissionsMode`). See the [settings reference](https://code.claude.com/docs/en/settings#available-settings) for the full list of keys, and [`../settings`](../settings) for more complete example configurations.
|
||||
|
||||
|
||||
## Templates
|
||||
|
||||
> [!WARNING]
|
||||
> These examples are community-maintained templates which may be unsupported or incorrect. You are responsible for the correctness of your own deployment configuration.
|
||||
|
||||
| File | Use with |
|
||||
| :--- | :--- |
|
||||
| [`managed-settings.json`](./managed-settings.json) | Any platform. Deploy to the [system config directory](https://code.claude.com/docs/en/settings#settings-files). |
|
||||
| [`macos/com.anthropic.claudecode.plist`](./macos/com.anthropic.claudecode.plist) | Jamf or Iru (Kandji) **Custom Settings** payload. Preference domain: `com.anthropic.claudecode`. |
|
||||
| [`macos/com.anthropic.claudecode.mobileconfig`](./macos/com.anthropic.claudecode.mobileconfig) | Full configuration profile for local testing or MDMs that take a complete profile. |
|
||||
| [`windows/Set-ClaudeCodePolicy.ps1`](./windows/Set-ClaudeCodePolicy.ps1) | Intune **Platform scripts**. Writes `managed-settings.json` to `C:\Program Files\ClaudeCode\`. |
|
||||
| [`windows/ClaudeCode.admx`](./windows/ClaudeCode.admx) + [`en-US/ClaudeCode.adml`](./windows/en-US/ClaudeCode.adml) | Group Policy or Intune **Import ADMX**. Writes `HKLM\SOFTWARE\Policies\ClaudeCode\Settings` (REG_SZ, single-line JSON). |
|
||||
|
||||
## Tips
|
||||
- Replace the placeholder `PayloadUUID` and `PayloadOrganization` values in the `.mobileconfig` with your own (`uuidgen`)
|
||||
- Before deploying to your fleet, test on a single machine and confirm `/status` lists the source under **Setting sources** — e.g. `Enterprise managed settings (plist)` on macOS or `Enterprise managed settings (HKLM)` on Windows
|
||||
- Settings deployed this way sit at the top of the precedence order and cannot be overridden by users
|
||||
|
||||
## Full Documentation
|
||||
|
||||
See https://code.claude.com/docs/en/settings#settings-files for complete documentation on managed settings and settings precedence.
|
||||
@@ -1,56 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PayloadDisplayName</key>
|
||||
<string>Claude Code Managed Settings</string>
|
||||
<key>PayloadDescription</key>
|
||||
<string>Configures managed settings for Claude Code.</string>
|
||||
<key>PayloadIdentifier</key>
|
||||
<string>com.anthropic.claudecode.profile</string>
|
||||
<key>PayloadOrganization</key>
|
||||
<string>Example Organization</string>
|
||||
<key>PayloadScope</key>
|
||||
<string>System</string>
|
||||
<key>PayloadType</key>
|
||||
<string>Configuration</string>
|
||||
<key>PayloadUUID</key>
|
||||
<string>DC3CBC17-3330-4CDE-94AC-D2342E9C88A3</string>
|
||||
<key>PayloadVersion</key>
|
||||
<integer>1</integer>
|
||||
<key>PayloadContent</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>PayloadDisplayName</key>
|
||||
<string>Claude Code</string>
|
||||
<key>PayloadIdentifier</key>
|
||||
<string>com.anthropic.claudecode.profile.BEFD5F54-71FC-4012-82B2-94399A1E220B</string>
|
||||
<key>PayloadType</key>
|
||||
<string>com.apple.ManagedClient.preferences</string>
|
||||
<key>PayloadUUID</key>
|
||||
<string>BEFD5F54-71FC-4012-82B2-94399A1E220B</string>
|
||||
<key>PayloadVersion</key>
|
||||
<integer>1</integer>
|
||||
<key>PayloadContent</key>
|
||||
<dict>
|
||||
<key>com.anthropic.claudecode</key>
|
||||
<dict>
|
||||
<key>Forced</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>mcx_preference_settings</key>
|
||||
<dict>
|
||||
<key>permissions</key>
|
||||
<dict>
|
||||
<key>disableBypassPermissionsMode</key>
|
||||
<string>disable</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>permissions</key>
|
||||
<dict>
|
||||
<key>disableBypassPermissionsMode</key>
|
||||
<string>disable</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"disableBypassPermissionsMode": "disable"
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<policyDefinitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions"
|
||||
revision="1.0" schemaVersion="1.0">
|
||||
<policyNamespaces>
|
||||
<target prefix="claudecode" namespace="Anthropic.Policies.ClaudeCode" />
|
||||
<using prefix="windows" namespace="Microsoft.Policies.Windows" />
|
||||
</policyNamespaces>
|
||||
<resources minRequiredRevision="1.0" />
|
||||
<categories>
|
||||
<category name="Cat_ClaudeCode" displayName="$(string.Cat_ClaudeCode)" />
|
||||
</categories>
|
||||
<policies>
|
||||
<policy name="ManagedSettings"
|
||||
class="Machine"
|
||||
displayName="$(string.ManagedSettings)"
|
||||
explainText="$(string.ManagedSettings_Explain)"
|
||||
presentation="$(presentation.ManagedSettings)"
|
||||
key="SOFTWARE\Policies\ClaudeCode">
|
||||
<parentCategory ref="Cat_ClaudeCode" />
|
||||
<supportedOn ref="windows:SUPPORTED_Windows_10_0" />
|
||||
<elements>
|
||||
<text id="SettingsJson" valueName="Settings" maxLength="1000000" required="true" />
|
||||
</elements>
|
||||
</policy>
|
||||
</policies>
|
||||
</policyDefinitions>
|
||||
@@ -1,28 +0,0 @@
|
||||
<#
|
||||
Deploys Claude Code managed settings as a JSON file.
|
||||
|
||||
Intune: Devices > Scripts and remediations > Platform scripts > Add (Windows 10 and later).
|
||||
Run this script using the logged on credentials: No
|
||||
Run script in 64 bit PowerShell Host: Yes
|
||||
|
||||
Claude Code reads C:\Program Files\ClaudeCode\managed-settings.json at startup
|
||||
and treats it as a managed policy source. Edit the JSON below to change the
|
||||
deployed settings; see https://code.claude.com/docs/en/settings for available keys.
|
||||
#>
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
$dir = Join-Path $env:ProgramFiles 'ClaudeCode'
|
||||
New-Item -ItemType Directory -Path $dir -Force | Out-Null
|
||||
|
||||
$json = @'
|
||||
{
|
||||
"permissions": {
|
||||
"disableBypassPermissionsMode": "disable"
|
||||
}
|
||||
}
|
||||
'@
|
||||
|
||||
$path = Join-Path $dir 'managed-settings.json'
|
||||
[System.IO.File]::WriteAllText($path, $json, (New-Object System.Text.UTF8Encoding($false)))
|
||||
Write-Output "Wrote $path"
|
||||
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<policyDefinitionResources xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions"
|
||||
revision="1.0" schemaVersion="1.0">
|
||||
<displayName>Claude Code</displayName>
|
||||
<description>Claude Code policy settings</description>
|
||||
<resources>
|
||||
<stringTable>
|
||||
<string id="Cat_ClaudeCode">Claude Code</string>
|
||||
<string id="ManagedSettings">Managed settings (JSON)</string>
|
||||
<string id="ManagedSettings_Explain">Configures managed settings for Claude Code.
|
||||
|
||||
Enter the full settings configuration as a single line of JSON. The value is stored as a REG_SZ string at HKLM\SOFTWARE\Policies\ClaudeCode\Settings and is applied at the highest precedence; users cannot override these settings.
|
||||
|
||||
Example:
|
||||
{"permissions":{"disableBypassPermissionsMode":"disable"}}
|
||||
|
||||
For the list of available settings keys, see https://code.claude.com/docs/en/settings.
|
||||
|
||||
If your configuration is large or you prefer to manage a JSON file directly, deploy C:\Program Files\ClaudeCode\managed-settings.json instead (see Set-ClaudeCodePolicy.ps1).</string>
|
||||
</stringTable>
|
||||
<presentationTable>
|
||||
<presentation id="ManagedSettings">
|
||||
<textBox refId="SettingsJson">
|
||||
<label>Settings JSON:</label>
|
||||
</textBox>
|
||||
</presentation>
|
||||
</presentationTable>
|
||||
</resources>
|
||||
</policyDefinitionResources>
|
||||
@@ -1,35 +0,0 @@
|
||||
# Settings Examples
|
||||
|
||||
Example Claude Code settings files, primarily intended for organization-wide deployments. Use these as starting points — adjust them to fit your needs.
|
||||
|
||||
These may be applied at any level of the [settings hierarchy](https://code.claude.com/docs/en/settings#settings-files), though certain properties only take effect if specified in enterprise settings (e.g. `strictKnownMarketplaces`, `allowManagedHooksOnly`, `allowManagedPermissionRulesOnly`).
|
||||
|
||||
|
||||
## Configuration Examples
|
||||
|
||||
> [!WARNING]
|
||||
> These examples are community-maintained snippets which may be unsupported or incorrect. You are responsible for the correctness of your own settings configuration.
|
||||
|
||||
| Setting | [`settings-lax.json`](./settings-lax.json) | [`settings-strict.json`](./settings-strict.json) | [`settings-bash-sandbox.json`](./settings-bash-sandbox.json) |
|
||||
|---------|:---:|:---:|:---:|
|
||||
| Disable `--dangerously-skip-permissions` | ✅ | ✅ | |
|
||||
| Block plugin marketplaces | ✅ | ✅ | |
|
||||
| Block user and project-defined permission `allow` / `ask` / `deny` | | ✅ | ✅ |
|
||||
| Block user and project-defined hooks | | ✅ | |
|
||||
| Deny web fetch and search tools | | ✅ | |
|
||||
| Bash tool requires approval | | ✅ | |
|
||||
| Bash tool must run inside of sandbox | | | ✅ |
|
||||
|
||||
## Tips
|
||||
- Consider merging snippets of the above examples to reach your desired configuration
|
||||
- Settings files must be valid JSON
|
||||
- Before deploying configuration files to your organization, test them locally by applying to `managed-settings.json`, `settings.json` or `settings.local.json`
|
||||
- The `sandbox` property only applies to the `Bash` tool; it does not apply to other tools (like Read, Write, WebSearch, WebFetch, MCPs), hooks, or internal commands
|
||||
|
||||
## Deploying via MDM
|
||||
|
||||
To distribute these settings as enterprise-managed policy through Jamf, Iru (Kandji), Intune, or Group Policy, see the deployment templates in [`../mdm`](../mdm).
|
||||
|
||||
## Full Documentation
|
||||
|
||||
See https://code.claude.com/docs/en/settings for complete documentation on all available managed settings.
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"allowManagedPermissionRulesOnly": true,
|
||||
"sandbox": {
|
||||
"enabled": true,
|
||||
"autoAllowBashIfSandboxed": false,
|
||||
"allowUnsandboxedCommands": false,
|
||||
"excludedCommands": [],
|
||||
"network": {
|
||||
"allowUnixSockets": [],
|
||||
"allowAllUnixSockets": false,
|
||||
"allowLocalBinding": false,
|
||||
"allowedDomains": [],
|
||||
"httpProxyPort": null,
|
||||
"socksProxyPort": null
|
||||
},
|
||||
"enableWeakerNestedSandbox": false
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"disableBypassPermissionsMode": "disable"
|
||||
},
|
||||
"strictKnownMarketplaces": []
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"disableBypassPermissionsMode": "disable",
|
||||
"ask": [
|
||||
"Bash"
|
||||
],
|
||||
"deny": [
|
||||
"WebSearch",
|
||||
"WebFetch"
|
||||
]
|
||||
},
|
||||
"allowManagedPermissionRulesOnly": true,
|
||||
"allowManagedHooksOnly": true,
|
||||
"strictKnownMarketplaces": [],
|
||||
"sandbox": {
|
||||
"autoAllowBashIfSandboxed": false,
|
||||
"excludedCommands": [],
|
||||
"network": {
|
||||
"allowUnixSockets": [],
|
||||
"allowAllUnixSockets": false,
|
||||
"allowLocalBinding": false,
|
||||
"allowedDomains": [],
|
||||
"httpProxyPort": null,
|
||||
"socksProxyPort": null
|
||||
},
|
||||
"enableWeakerNestedSandbox": false
|
||||
}
|
||||
}
|
||||
@@ -1,639 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<feed xmlns="http://www.w3.org/2005/Atom">
|
||||
<id>https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md</id>
|
||||
<title>Claude Code Changelog</title>
|
||||
<subtitle>Release notes for Claude Code</subtitle>
|
||||
<author><name>Anthropic</name></author>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md"/>
|
||||
<link rel="self" type="application/atom+xml" href="https://raw.githubusercontent.com/anthropics/claude-code/main/feed.xml"/>
|
||||
<updated>2026-05-23T04:03:45Z</updated>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.150</id>
|
||||
<title>Claude Code v2.1.150</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.150"/>
|
||||
<updated>2026-05-23T04:03:45Z</updated>
|
||||
<content type="html"><p>• Internal infrastructure improvements (no user-facing changes)</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.149</id>
|
||||
<title>Claude Code v2.1.149</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.149"/>
|
||||
<updated>2026-05-22T22:09:22Z</updated>
|
||||
<content type="html"><p>• /usage now shows a per-category breakdown of what's driving your limits usage — skills, subagents, plugins, and per-MCP-server cost</p>
|
||||
<p>• /diff detail view can now be scrolled with the keyboard (arrows, j/k, PgUp/PgDn, Space, Home/End)</p>
|
||||
<p>• Markdown output now renders GFM task list checkboxes (- [ ] todo / - [x] done) instead of plain bullets</p>
|
||||
<p>• Enterprise: added the allowAllClaudeAiMcps managed setting to load claude.ai cloud MCP connectors alongside managed-mcp.json</p>
|
||||
<p>• Fixed a PowerShell permission bypass: built-in cd functions (cd.., cd\, cd~, X:) changed the working directory undetected, letting a later command read outside the workspace</p>
|
||||
<p>• Fixed the sandbox write allowlist in git worktrees covering the entire main repository root instead of only the shared .git directory (with hooks/ and config denied)</p>
|
||||
<p>• Fixed PowerShell prefix/wildcard allow rules (e.g. PowerShell(dotnet.exe build *)) not pre-approving native executables and scripts</p>
|
||||
<p>• Fixed a permission-analysis gap where the parser trusted stale variable-tracking values for PWD/OLDPWD/DIRSTACK across cd/pushd/popd</p>
|
||||
<p>• Fixed find in the Bash tool exhausting the macOS system file/vnode table and crashing the host on large directory trees</p>
|
||||
<p>• Fixed the managed-settings approval dialog leaving the terminal frozen after accepting at startup</p>
|
||||
<p>• Fixed /ultraplan and remote session creation failing with "Could not capture uncommitted changes" when the working tree has no real changes</p>
|
||||
<p>• Fixed otelHeadersHelper failing silently when the script path contains spaces; helper failures are now reported in /doctor and the debug log</p>
|
||||
<p>• Fixed the thinking spinner staying amber across tool calls and onto fresh thinking bursts</p>
|
||||
<p>• Fixed collapsed Bash output reporting the wrong hidden-line count for outputs with many short lines</p>
|
||||
<p>• Fixed slash-command argument-hint clipping trailing typed characters when the hint overflows the input box</p>
|
||||
<p>• Fixed argument-hint and progressive arg suggestions not appearing after Tab-completing a skill whose frontmatter name: differs from its directory basename</p>
|
||||
<p>• Fixed the status bar showing the user's baseline /effort setting instead of the effort level applied by skill/agent effort: frontmatter</p>
|
||||
<p>• Fixed Ctrl+O transcript view freezing at the moment it was opened instead of tailing new messages</p>
|
||||
<p>• Fixed editing a recalled prompt-history entry losing the edit when navigating further up/down with arrow keys</p>
|
||||
<p>• Fixed /config exit summary reporting phantom changes to auto-compact and theme when toggling unrelated settings</p>
|
||||
<p>• Fixed /insights crashing when cached session-meta files are missing optional fields</p>
|
||||
<p>• Fixed malformed PowerShell and History tool calls with missing input being misclassified as reads in transcript collapsing</p>
|
||||
<p>• Fixed renaming a Remote Control session from claude.ai or the Claude mobile app not updating the local session name for claude --resume</p>
|
||||
<p>• Fixed a race where a just-submitted prompt could appear twice in the up-arrow history</p>
|
||||
<p>• Fixed tapping the "Jump to bottom" pill in fullscreen mode not dismissing it immediately</p>
|
||||
<p>• Improved /feedback reports to include the conversation that happened before context compaction, making issues from earlier in long sessions easier to triage</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.148</id>
|
||||
<title>Claude Code v2.1.148</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.148"/>
|
||||
<updated>2026-05-22T01:16:46Z</updated>
|
||||
<content type="html"><p>• Fixed the Bash tool returning exit code 127 on every command for some users (a regression introduced in 2.1.147)</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.147</id>
|
||||
<title>Claude Code v2.1.147</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.147"/>
|
||||
<updated>2026-05-21T20:39:15Z</updated>
|
||||
<content type="html"><p>• Pinned background sessions (Ctrl+T in claude agents) now stay alive when idle, are restarted in place to apply Claude Code updates, and are shed under memory pressure only after non-pinned sessions</p>
|
||||
<p>• Renamed /simplify to /code-review. It now reports correctness bugs at a chosen effort level (e.g., /code-review high); pass --comment to post findings as inline GitHub PR comments. The old cleanup-and-fix behavior has been removed</p>
|
||||
<p>• Improved auto-updater: retries transient network failures, reports specific error categories and OS error codes on failure, and shows the current version when an update fails</p>
|
||||
<p>• Improved diff rendering performance for large file edits</p>
|
||||
<p>• Prompt history no longer records consecutive duplicate entries — recalling a prompt with arrow-up and submitting it again won't add another copy</p>
|
||||
<p>• Fixed enterprise login restrictions (forceLoginOrgUUID and forceLoginMethod managed-settings) not being enforced against third-party-provider and API-key sessions</p>
|
||||
<p>• Fixed &amp; in ! command output displaying as &amp;amp;, which broke copy-pasting URLs from commands like gcloud auth login on headless machines</p>
|
||||
<p>• Fixed unknown slash commands silently doing nothing in headless/SDK mode — they now show an error message</p>
|
||||
<p>• Fixed /help rendering a broken tab header and showing only one command per page on small terminals when not in fullscreen mode</p>
|
||||
<p>• Fixed shell snapshot dropping user functions whose names start with a single underscore, which broke aliases referencing them</p>
|
||||
<p>• Fixed plugin agents that declare multiple Agent(...) types in tools: frontmatter dropping all but the last entry</p>
|
||||
<p>• Fixed hook if conditions like PowerShell(git push*) never matching — only PowerShell(*) worked</p>
|
||||
<p>• Fixed PowerShell tool dropping output for commands that rely on the default formatter</p>
|
||||
<p>• Fixed: on Windows, "Yes, and don't ask again" for a PowerShell script invocation now writes a rule that actually matches on subsequent runs</p>
|
||||
<p>• Fixed PowerShell tool failing on Windows with exit code 1 when pwsh is installed via winget or the Microsoft Store</p>
|
||||
<p>• Fixed /effort opening with the slider on the wrong level — it now starts at your current effort</p>
|
||||
<p>• Fixed paginating MCP servers dropping resources, templates, and prompts past page 1</p>
|
||||
<p>• Fixed full-screen strobing in attached background sessions on Windows Terminal while Claude is streaming</p>
|
||||
<p>• Fixed: on Windows, removing a background-job worktree no longer follows NTFS junctions into the main repo</p>
|
||||
<p>• Fixed /background refusing sessions whose only typed input was a skill or custom slash command</p>
|
||||
<p>• Fixed auto mode suppressing AskUserQuestion when the user or a skill explicitly relies on it; the auto-mode classifier now sees the user's answers as intent signal</p>
|
||||
<p>• Fixed /theme "New custom theme" and color editor dialogs not responding to Esc</p>
|
||||
<p>• Fixed an uncaught exception at the end of streaming sessions when running via the Agent SDK</p>
|
||||
<p>• Fixed a rare hang when waiting for scroll to settle on Windows</p>
|
||||
<p>• Fixed stale and doubled rows in the agent view list on Windows when background session results contain wide (CJK) characters</p>
|
||||
<p>• Fixed pasted text being delivered to agents as an unreadable [Pasted text #N] placeholder instead of the actual content</p>
|
||||
<p>• Fixed plugin component counts in claude plugin details and /plugin being doubled when a plugin's manifest listed paths overlapping its default directories</p>
|
||||
<p>• Fixed backgrounded sessions re-prompting for tool permissions you already granted with "don't ask again"</p>
|
||||
<p>• Fixed GNOME Terminal right-click and middle-click paste not inserting text</p>
|
||||
<p>• Fixed CLAUDE_CODE_SUBAGENT_MODEL not applying to teammate processes spawned by agent teams</p>
|
||||
<p>• Fixed slash commands followed by a tab or newline being treated as an unknown command</p>
|
||||
<p>• Fixed several spacing and layout glitches in the /plugin, /status, /mobile, /sandbox, and /permissions menus</p>
|
||||
<p>• Fixed stripped images prompting the model to repeatedly re-read media that was no longer present</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.145</id>
|
||||
<title>Claude Code v2.1.145</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.145"/>
|
||||
<updated>2026-05-19T21:31:01Z</updated>
|
||||
<content type="html"><p>• Added claude agents --json to list live Claude sessions as JSON for scripting (tmux-resurrect, status bars, session pickers)</p>
|
||||
<p>• Added agent_id and parent_agent_id attributes to claude_code.tool OTEL spans, and fixed trace parenting so background subagent spans nest under the dispatching Agent tool span</p>
|
||||
<p>• Status line JSON input now includes GitHub repo and PR information when detected</p>
|
||||
<p>• /plugin Discover and Browse screens now show a plugin's commands, agents, skills, hooks, and MCP/LSP servers before installation</p>
|
||||
<p>• claude agents terminal tab title now shows the awaiting-input count so an alt-tabbed window tells you when an agent needs attention</p>
|
||||
<p>• Slash command and @-mention suggestion list now supports mouse hover and click in fullscreen mode</p>
|
||||
<p>• Stop and SubagentStop hook input now includes background_tasks and session_crons fields</p>
|
||||
<p>• Fixed a permission-prompt bypass where bare variable assignments to non-allowlisted environment variables in Bash commands were auto-approved</p>
|
||||
<p>• Fixed MCP prompt slash commands showing raw server validation errors when a required argument is omitted — the error now names the missing argument and shows expected usage</p>
|
||||
<p>• Fixed the spinner and elapsed-time display freezing until a keypress after the terminal was resized or refocused</p>
|
||||
<p>• Fixed the cross-project resume hint failing in default Windows PowerShell 5.1 — Windows now uses ; as the command separator</p>
|
||||
<p>• Fixed voice push-to-talk not working in the agent view's reply pane</p>
|
||||
<p>• Fixed task lists rendering in random order when several tasks are created at once</p>
|
||||
<p>• Fixed stale "Failed to install Anthropic marketplace" banner showing when the marketplace is already installed</p>
|
||||
<p>• Fixed the PR badge in the footer not updating immediately after gh pr create and other PR-state-changing commands run in-session</p>
|
||||
<p>• Fixed Agent Teams teammates with non-ASCII names failing every API call due to invalid header encoding</p>
|
||||
<p>• Fixed /review using a deprecated projectCards GraphQL query that errored on repos with Classic Projects</p>
|
||||
<p>• Fixed claude plugin validate not flagging skills: entries that point at a file instead of a directory — the error now suggests the parent directory</p>
|
||||
<p>• Fixed an infinite loop where a skill using context: fork could repeatedly re-invoke itself instead of running</p>
|
||||
<p>• Improved the Read tool to return a truncated first page with a "PARTIAL view" notice instead of a hard error when a whole-file read exceeds the token limit</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.144</id>
|
||||
<title>Claude Code v2.1.144</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.144"/>
|
||||
<updated>2026-05-19T00:48:45Z</updated>
|
||||
<content type="html"><p>• Added /resume support for background sessions — sessions started via claude --bg or agent view now appear alongside interactive ones, marked with bg</p>
|
||||
<p>• Added elapsed duration to background subagent completion notifications (e.g. "Agent completed · 3h 2m 5s")</p>
|
||||
<p>• The /plugin browse and discover panes now show when a plugin was last updated</p>
|
||||
<p>• /model now changes the model for the current session only; press d in the model picker to set a default for new sessions</p>
|
||||
<p>• Renamed "extra usage" to "usage credits" across CLI copy; /extra-usage is now /usage-credits (old name still works)</p>
|
||||
<p>• Fixed startup hanging up to 75s when api.anthropic.com is unreachable (captive portal, firewall, VPN issues) — side-channel API calls now time out after 15s</p>
|
||||
<p>• Fixed garbled terminal output after a missed window-resize event (e.g. dragging a VS Code split-pane divider) — now self-heals on the next frame instead of requiring Ctrl+L</p>
|
||||
<p>• Fixed progressive terminal display corruption (stale/garbled glyphs) that could appear in very long sessions and only cleared on terminal resize or restart</p>
|
||||
<p>• Reduced terminal rendering glitches in VS Code by reducing spinner animation color count</p>
|
||||
<p>• Fixed macOS background sessions crashing with "exit 1 before init" when the project lives under a Full Disk Access-protected folder (regression in 2.1.143)</p>
|
||||
<p>• Fixed an unrecoverable conversation when reading a file whose image extension doesn't match its contents (e.g. HTML saved as .png) — now falls back to text</p>
|
||||
<p>• Fewer spurious tool errors during search: head/tail file views now satisfy the read-before-edit check, and a "no matches" result (exit code 1) from egrep, fgrep, git grep, or git diff is no longer reported as a command failure</p>
|
||||
<p>• Fixed /branch failing with "No conversation to branch" after entering a worktree or in some background sessions</p>
|
||||
<p>• Fixed pressing Escape in the AskUserQuestion notes field aborting the turn instead of returning to answer selection</p>
|
||||
<p>• Fixed model selection not applying when changed via the IDE model picker or applyFlagSettings after startup</p>
|
||||
<p>• Resumed sessions now keep the model they were using instead of picking up another session's /model choice</p>
|
||||
<p>• Fixed Bedrock and Vertex users unable to select "Opus (1M context)" from the /model picker (regression in v2.1.129)</p>
|
||||
<p>• Fixed remote-session login failing with "Can't access this organization" for users with forceLoginMethod and forceLoginOrgUUID set</p>
|
||||
<p>• Fixed MCP servers with paginated tools/list responses only returning the first page, silently dropping tools</p>
|
||||
<p>• Fixed MCP images with unsupported MIME types (e.g. SVG) breaking the conversation — now saved to disk and referenced in the tool result</p>
|
||||
<p>• Fixed file descriptor exhaustion when a build runs inside a skill directory — non-.md files no longer trigger skill reloads</p>
|
||||
<p>• Fixed session title being generated from plugin monitor output instead of the user's first prompt</p>
|
||||
<p>• Fixed Skill tool failing with permission error in headless mode (regression in v2.1.141)</p>
|
||||
<p>• Fixed plugins enabled in your own settings showing "not cached" errors after first load on a fresh machine; plugins enabled only by a project's .claude/settings.json now show an actionable claude plugin install hint</p>
|
||||
<p>• Fixed claude mcp list silently reporting no servers when .mcp.json can't be parsed (e.g. using VS Code's "servers" key instead of "mcpServers") — now shows configuration errors</p>
|
||||
<p>• Fixed background side-queries on custom ANTHROPIC_BASE_URL setups and Bedrock Mantle not using Haiku — now falls back correctly when a first-party API key is configured or no Haiku model is set</p>
|
||||
<p>• Fixed scrolling in attached background sessions on Windows — PgUp/PgDn, mouse wheel, and Ctrl+O transcript navigation now work</p>
|
||||
<p>• Fixed a crash when closing the terminal while attached to a background session</p>
|
||||
<p>• Fixed on Windows, pressing ← in claude agents leaving the list unresponsive to keyboard input</p>
|
||||
<p>• Fixed ghost characters at the left edge when switching panes in Agent View on Windows Terminal with CJK content</p>
|
||||
<p>• /bg and ←-detach now preserve directories added via /add-dir</p>
|
||||
<p>• Fixed Edit/Write refusing with "background session hasn't isolated its changes yet" right after detaching a session that was already editing in place</p>
|
||||
<p>• Fixed claude respawn &lt;id&gt; on a stopped background session showing "stopped" instead of running</p>
|
||||
<p>• Fixed /resume picker not showing sessions forked from a background session</p>
|
||||
<p>• Fixed opening a session from claude agents or running claude logs &lt;id&gt; hanging when the background service is unresponsive — now times out after 10s with a recovery hint</p>
|
||||
<p>• Fixed background Bash tasks spawned by subagents staying "Running" in SDK task panels after the process exits</p>
|
||||
<p>• Fixed completed or stopped background sessions briefly failing to wake being permanently marked as a startup crash</p>
|
||||
<p>• Fixed markdown links in claude agents attached sessions rendering as plain text instead of clickable hyperlinks</p>
|
||||
<p>• Fixed custom spinnerVerbs applying to the post-turn duration message — past-tense built-ins like "Worked for 5s" are restored there</p>
|
||||
<p>• claude agents / --bg rejection messages now name the specific gate (non-TTY, env var, or setting) instead of a generic message</p>
|
||||
<p>• claude --bg --name &lt;label&gt; now echoes the name in the post-spawn confirmation</p>
|
||||
<p>• claude agents: renaming a background session with Ctrl+R now updates the attached session's banner immediately</p>
|
||||
<p>• Background session worktree isolation guard now applies for non-git VCS users with WorktreeCreate hooks configured</p>
|
||||
<p>• Plugin marketplace add/update now respects CLAUDE_CODE_PLUGIN_PREFER_HTTPS</p>
|
||||
<p>• /plugin now returns to the Installed list after enabling, disabling, or uninstalling a plugin</p>
|
||||
<p>• /doctor now shows an exec-form example when a command hook is missing the command field</p>
|
||||
<p>• Skill-listing truncation is no longer shown as a startup notification — run /doctor for the full breakdown</p>
|
||||
<p>• Improved recovery from rare pre-response stream stalls — now retries streaming once instead of falling back to a slower non-streaming request</p>
|
||||
<p>• Improved SDK/headless MCP startup: pre-wait now overlaps startup instead of blocking before the first turn (up to 2s faster with slow MCP servers)</p>
|
||||
<p>• The post-survey follow-up hint now appears after every non-dismiss survey response with context-aware copy, making it easier to share more detail via /feedback.</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.143</id>
|
||||
<title>Claude Code v2.1.143</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.143"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added plugin dependency enforcement: claude plugin disable now refuses when another enabled plugin depends on the target (with a copy-pasteable disable-chain hint), and claude plugin enable force-enables transitive dependencies</p>
|
||||
<p>• Added projected context cost (per-turn and per-invocation token estimates) to the /plugin marketplace browse pane</p>
|
||||
<p>• Added worktree.bgIsolation: "none" setting to let background sessions edit the working copy directly without EnterWorktree, for repos where worktrees are impractical</p>
|
||||
<p>• PowerShell tool now passes -ExecutionPolicy Bypass. Opt out with CLAUDE_CODE_POWERSHELL_RESPECT_EXECUTION_POLICY=1</p>
|
||||
<p>• Background sessions now preserve the model and effort level you set after waking from idle</p>
|
||||
<p>• Shift+Tab in attached agent sessions now includes auto mode in the cycle</p>
|
||||
<p>• Fixed a corrupt .credentials.json with a non-array scopes value hanging the CLI on startup or silently aborting OAuth token refresh</p>
|
||||
<p>• Fixed right-click paste in claude agents on Windows Terminal and WSL</p>
|
||||
<p>• Fixed stop hooks that block repeatedly looping forever — the turn now ends with a warning after 8 consecutive blocks (override via CLAUDE_CODE_STOP_HOOK_BLOCK_CAP)</p>
|
||||
<p>• Fixed Esc/Ctrl+C not cancelling a pending /loop wakeup while Claude is idle between iterations</p>
|
||||
<p>• Fixed /goal evaluator firing while background shells or delegated subagents are still running</p>
|
||||
<p>• Fixed NO_COLOR/FORCE_COLOR in settings.json env stripping Claude Code's own UI colors — they now apply to subprocesses only</p>
|
||||
<p>• Fixed agent view spawning repeated PowerShell processes on Windows when listing sessions</p>
|
||||
<p>• Fixed /bg without a prompt sending "continue" to the forked session — the fork now waits for input</p>
|
||||
<p>• Fixed --agent &lt;name&gt; not finding plugin-contributed agents without the plugin: prefix</p>
|
||||
<p>• Fixed deleting a session from agent view not removing its transcript file</p>
|
||||
<p>• Fixed stale-fragment rendering when scrolling in attached background sessions on Windows Terminal</p>
|
||||
<p>• Fixed background agents false-positive worker-stall detection storm after host sleep or macOS App Nap</p>
|
||||
<p>• Fixed 5xx error messages pointing at status.claude.com instead of naming the configured gateway or cloud provider</p>
|
||||
<p>• The PowerShell tool is now enabled by default on Windows for Bedrock, Vertex, and Foundry users. Opt out with CLAUDE_CODE_USE_POWERSHELL_TOOL=0.</p>
|
||||
<p>• claude agents now accepts --add-dir, --settings, --mcp-config, and --plugin-dir and applies them to the dashboard and to background sessions dispatched from it</p>
|
||||
<p>• claude agents accepts --permission-mode, --model, --effort, and --dangerously-skip-permissions to set defaults for sessions dispatched from the view</p>
|
||||
<p>• claude --bg --dangerously-skip-permissions now persists across retire→wake</p>
|
||||
<p>• Fixed background sessions silently capturing IDE file references into the warm spare's input, which caused the reference to be prepended to the next prompt dispatched from claude agents</p>
|
||||
<p>• Worktree cleanup no longer falls back to rm -rf when git worktree remove fails, preventing loss of gitignored or in-progress files</p>
|
||||
<p>• Fixed background-job sessions on macOS getting "Operation not permitted" errors when reading files under ~/Documents, ~/Desktop, or ~/Downloads, even with Full Disk Access granted.</p>
|
||||
<p>• /bg now preserves --mcp-config, --settings, --add-dir, --plugin-dir, and --strict-mcp-config, so backgrounded sessions keep their MCP servers and settings across respawn.</p>
|
||||
<p>• Background sessions launched from claude agents now honor permissions.defaultMode from settings.json (was previously overridden to auto mode)</p>
|
||||
<p>• Fixed: on Windows, pressing ← in claude agents while a response was streaming could leave the agents list unresponsive to all input</p>
|
||||
<p>• /bg and ←-detach now preserve --fallback-model, so backgrounded workers degrade to the fallback model on overload instead of hard-failing.</p>
|
||||
<p>• /bg and ←-detach now preserve --allow-dangerously-skip-permissions, so the forked worker keeps bypass-permissions available in its Shift+Tab cycle.</p>
|
||||
<p>• Fixed: background daemon spawn now falls back to the running binary when the ~/.local/bin/claude launcher is missing or non-executable</p>
|
||||
<p>• Fixed claude agents --allow-dangerously-skip-permissions defaulting dispatched sessions to bypass mode instead of making it available in the permission cycle</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.142</id>
|
||||
<title>Claude Code v2.1.142</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.142"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added new claude agents flags: --add-dir, --settings, --mcp-config, --plugin-dir, --permission-mode, --model, --effort, and --dangerously-skip-permissions to configure dispatched background sessions</p>
|
||||
<p>• Fast mode now uses Opus 4.7 by default (previously Opus 4.6). Set CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE=1 to pin fast mode to Opus 4.6</p>
|
||||
<p>• Plugins with a root-level SKILL.md and no skills/ subdirectory are now surfaced as a skill</p>
|
||||
<p>• The /plugin details pane and claude plugin details now show LSP servers a plugin provides</p>
|
||||
<p>• /web-setup warns before replacing an existing GitHub App connection</p>
|
||||
<p>• Fixed MCP_TOOL_TIMEOUT not raising the per-request fetch timeout for remote HTTP and SSE MCP servers, which capped tool calls at 60 seconds regardless of the configured value</p>
|
||||
<p>• Fixed background sessions not recognizing pre-existing git worktrees, blocking Edit while EnterWorktree refused to create a duplicate</p>
|
||||
<p>• Fixed background sessions disappearing and daemon reconnect failing after macOS sleep/wake — the daemon now detects clock jumps instead of treating them as elapsed idle time</p>
|
||||
<p>• Fixed daemon not exiting cleanly after the binary is upgraded (e.g. brew upgrade), causing dispatched agents to crash-loop on the deleted path</p>
|
||||
<p>• Fixed background agents crash-looping when the Claude-in-Chrome extension is connected without a shared tab</p>
|
||||
<p>• Fixed clicking links in an attached claude agents session — the background worker's headless browser shim no longer applies while attached</p>
|
||||
<p>• Fixed claude agents "v to open in editor" using the daemon's default editor instead of your shell's $EDITOR/$VISUAL</p>
|
||||
<p>• Fixed claude agents deadlocking on Windows with network-drive working directories; Ctrl+C now works during startup</p>
|
||||
<p>• Fixed background-color bleed when attaching to a claude agents session from Apple Terminal or other 256-color-only terminals</p>
|
||||
<p>• Fixed claude --bg --dangerously-skip-permissions not persisting across retire/wake</p>
|
||||
<p>• Fixed session titles being derived from the URL when the first message is a link</p>
|
||||
<p>• Fixed redundant set_model requests from remote clients injecting duplicate /model breadcrumbs into the transcript</p>
|
||||
<p>• Fixed plugins using skills: ["./"] showing a false "path escapes plugin directory" error</p>
|
||||
<p>• Fixed plugin cache cleanup deleting the active plugin version directory when no installation metadata is present</p>
|
||||
<p>• Fixed /plugin browse pane showing "0 installs" for newly published plugins</p>
|
||||
<p>• Fixed plugin advisories not naming every plugin.json key that shadows a default folder</p>
|
||||
<p>• Improved reactive compaction: the first summarize attempt now seeds from the original request's overflow size, avoiding a wasted near-full-context retry</p>
|
||||
<p>• Improved hook configuration error: configuring a prompt- or agent-type hook for SessionStart/Setup/SubagentStart now shows a clear "use a command-type hook instead" error</p>
|
||||
<p>• Removed stale /model claude-sonnet-4-20250514 suggestion from Usage Policy refusal messages</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.141</id>
|
||||
<title>Claude Code v2.1.141</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.141"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added terminalSequence field to hook JSON output so hooks can emit desktop notifications, window titles, and bells without a controlling terminal</p>
|
||||
<p>• Added CLAUDE_CODE_PLUGIN_PREFER_HTTPS to clone GitHub plugin sources over HTTPS instead of SSH, for environments without a GitHub SSH key</p>
|
||||
<p>• Added ANTHROPIC_WORKSPACE_ID environment variable for workload identity federation — scopes the minted token to a specific workspace when the federation rule covers more than one</p>
|
||||
<p>• Added claude agents --cwd &lt;path&gt; to scope the session list to a directory</p>
|
||||
<p>• /feedback can now include recent sessions (last 24 hours or 7 days) for issues spanning more than the current session</p>
|
||||
<p>• Rewind menu: added "Summarize up to here" to compress earlier context while keeping recent turns intact</p>
|
||||
<p>• Auto mode permission dialog now explains when a permissions.ask rule caused the prompt</p>
|
||||
<p>• Restored the "view diff in your IDE" option on file-edit permission prompts when an IDE is connected</p>
|
||||
<p>• Background agents launched via /bg or ←← now preserve the current permission mode instead of reverting to default</p>
|
||||
<p>• claude agents: agents that finish work but leave a background shell running now move to Completed instead of staying under Working</p>
|
||||
<p>• Improved spinner feedback during long thinking periods — the spinner now warms to amber after 10 seconds to signal Claude is still working</p>
|
||||
<p>• Improved plugin menu navigation: →/Tab switch tabs, ↑ moves to the tab strip, and tab headers and search box are clickable in fullscreen mode</p>
|
||||
<p>• Fixed background side-queries sending an unavailable Haiku model ID on Bedrock/Vertex/Foundry/gateway when no ANTHROPIC_SMALL_FAST_MODEL override is set — now falls back to the main-loop model</p>
|
||||
<p>• Fixed claude daemon status and /doctor on Windows throwing when the daemon pipe key file is locked or unreadable — now shows the underlying error instead of an opaque failure</p>
|
||||
<p>• Fixed claude agents showing the agent-type list instead of the dashboard when launched through a wrapper that adds flags</p>
|
||||
<p>• Fixed claude agents opening a crashed session firing redundant dispatches when the working directory was deleted</p>
|
||||
<p>• Fixed background jobs on a custom ANTHROPIC_BASE_URL gateway not getting auto-named — the namer now uses the main model when no Haiku model is configured</p>
|
||||
<p>• Fixed /model in one session silently changing the autocompact threshold in other concurrent sessions</p>
|
||||
<p>• Fixed switching permission mode while a tool-permission prompt is open not auto-dismissing the prompt when the new setting permits the tool</p>
|
||||
<p>• Fixed pressing Enter while a permission/dialog prompt is open also submitting text in the input box</p>
|
||||
<p>• Fixed hooks receiving a non-existent transcript_path after EnterWorktree switches the working directory</p>
|
||||
<p>• Fixed markdown tables with cell wrapping falling back to the vertical key-value layout instead of rendering as a bordered grid (regression in 2.1.136)</p>
|
||||
<p>• Fixed cancelled prompts being removed from Up-arrow history when auto-restored into the input box, avoiding duplicate entries</p>
|
||||
<p>• Fixed prompts cancelled with Ctrl+C/Esc before any response being dropped from Up-arrow history</p>
|
||||
<p>• Fixed Ctrl+C not interrupting a running turn while in vim INSERT/VISUAL mode</p>
|
||||
<p>• Fixed alternative chat:submit keybindings (e.g. meta+enter, ctrl+enter) not working when enter is rebound to chat:newline</p>
|
||||
<p>• Fixed prompt suggestions being silently disabled when an output style was configured</p>
|
||||
<p>• Fixed spinnerVerbs setting not being honored in turn-completion messages</p>
|
||||
<p>• Fixed AskUserQuestion popup hiding the last line of preceding chat content</p>
|
||||
<p>• Fixed Web Search status showing "Did 0 searches" when searches returned errors</p>
|
||||
<p>• Fixed multi-line statusline output dropping or corrupting rows when any line exceeds terminal width</p>
|
||||
<p>• Fixed light-ansi theme using invisible white for diff context lines on light backgrounds — now uses black</p>
|
||||
<p>• Fixed error overlay dumping minified bundle source that hid the original error message</p>
|
||||
<p>• Fixed pressing Enter after typing a feedback survey rating digit submitting it as a chat message instead of the rating</p>
|
||||
<p>• Fixed pressing x on a selected subagent in the agent panel typing into the prompt instead of stopping the agent</p>
|
||||
<p>• Fixed session title being derived from plugin monitor notifications before the user's first prompt</p>
|
||||
<p>• Fixed "Allowed by PermissionRequest hook" repeating once per tool call under a collapsed read/search group</p>
|
||||
<p>• Fixed /tui silently dropping running background shells and subagents — now refuses and asks to wait for them to finish</p>
|
||||
<p>• Fixed welcome banner showing "API Usage Billing" on Bedrock, Vertex, Foundry, and other third-party providers — now shows the provider name</p>
|
||||
<p>• Fixed /mcp server list not keeping the focused server visible in short terminals in fullscreen mode</p>
|
||||
<p>• Fixed redaction in /feedback bundles producing invalid JSON for quoted values like session IDs</p>
|
||||
<p>• Fixed desktop and third-party provider sessions incorrectly inheriting apiKeyHelper/ANTHROPIC_AUTH_TOKEN from host managed-settings</p>
|
||||
<p>• Fixed early analytics events being silently dropped when fired before logger initialization</p>
|
||||
<p>• Fixed claude plugin install failing for plugins whose marketplace ref no longer exists upstream when a sha is also pinned</p>
|
||||
<p>• Fixed plugin details pane showing 0 MCP servers for plugins that declare them via .mcp.json</p>
|
||||
<p>• Fixed plugin MCP servers with unset config variables showing a generic connection failure instead of a "config issue" message with a fix-it hint; malformed .mcp.json entries no longer drop other MCP servers</p>
|
||||
<p>• Fixed MCP server configs using POSIX shell parameter expansions (e.g. ${var%pattern}) being incorrectly flagged as missing environment variables</p>
|
||||
<p>• Fixed MCP HTTP/SSE servers returning 403 on connect showing as "failed" instead of "needs auth"</p>
|
||||
<p>• Fixed remote MCP servers disconnecting unnecessarily when the optional server-events stream failed to reconnect — tool calls continue over POST</p>
|
||||
<p>• Fixed Remote Control MCP connectors all failing with 401 when the worker session token rotated mid-session</p>
|
||||
<p>• Fixed Remote Control automatically re-enrolling a trusted device when the server rejects a stale token, instead of looping through /login</p>
|
||||
<p>• Fixed a race where early OTel spans could be silently dropped in SDK/headless mode with beta tracing enabled</p>
|
||||
<p>• Fixed custom voice:pushToTalk keybindings and "space": null unbinds being silently ignored</p>
|
||||
<p>• Fixed Windows Alt+V image paste reporting "no image found" when the clipboard contains a screenshot</p>
|
||||
<p>• Fixed SDK "Claude Code native binary not found" on Linux when both glibc and musl platform packages are installed</p>
|
||||
<p>• Bedrock: awsCredentialExport now always runs when configured instead of being skipped when ambient AWS credentials resolve, fixing auth for cross-account access</p>
|
||||
<p>• [VSCode] Fixed in-chat mic showing no feedback when the microphone produced only silence — now shows "No audio detected"</p>
|
||||
<p>• [VSCode] Voice mode: the WSL error now suggests installing sox libsox-fmt-pulse for WSLg users</p>
|
||||
<p>• claude agents: launching a session no longer fails when the pre-warmed background worker is unhealthy — now falls back to a fresh launch</p>
|
||||
<p>• claude agents no longer shows empty placeholder sessions left over from backgrounding a fresh REPL, and shows onboarding text when entered via ← with no other agents</p>
|
||||
<p>• Empty idle background sessions left over from ← are now automatically retired by the daemon after 5 minutes</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.140</id>
|
||||
<title>Claude Code v2.1.140</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.140"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Improved Agent tool subagent_type matching to accept case- and separator-insensitive values (e.g. "Code Reviewer" resolves to code-reviewer)</p>
|
||||
<p>• Updated agent color palette</p>
|
||||
<p>• Fixed /goal silently hanging when disableAllHooks or allowManagedHooksOnly is set — now shows a clear message instead of an indicator that never resolves</p>
|
||||
<p>• Fixed a regression in settings hot-reload where symlinked settings files caused misattributed change events and spurious ConfigChange hooks</p>
|
||||
<p>• Fixed claude --bg failing with "connection dropped mid-request" when the background service was about to idle-exit</p>
|
||||
<p>• Fixed background service startup failing on machines with enterprise endpoint security by allowing more time</p>
|
||||
<p>• Fixed remote managed settings not retrying on 401 — now retries once with a force-refreshed token</p>
|
||||
<p>• Fixed managed extraKnownMarketplaces auto-update policy not being persisted to known_marketplaces.json</p>
|
||||
<p>• Fixed /loop scheduling redundant wakeups to poll for background tasks that already notify on completion</p>
|
||||
<p>• Fixed a recurring event-loop stall on Windows when a missing executable (e.g. gh) triggered synchronous where.exe re-spawns on every check</p>
|
||||
<p>• Fixed Read tool calls failing validation when offset is passed as a whitespace-padded or +-prefixed string</p>
|
||||
<p>• Fixed native terminal cursor not staying at the input caret when the terminal loses focus</p>
|
||||
<p>• Plugins now warn when a default component folder (e.g. commands/) is silently ignored because plugin.json sets the matching key. Shown in /doctor, claude plugin list, and /plugin.</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.139</id>
|
||||
<title>Claude Code v2.1.139</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.139"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added agent view (Research Preview): a single list of every Claude Code session — running, blocked on you, or done. Run claude agents to get started. See https://code.claude.com/docs/en/agent-view</p>
|
||||
<p>• Added /goal command: set a completion condition and Claude keeps working across turns until it's met. Works in interactive, -p, and Remote Control. Shows live elapsed/turns/tokens as an overlay panel</p>
|
||||
<p>• Added /scroll-speed command to tune mouse wheel scroll speed with a live preview</p>
|
||||
<p>• Added claude plugin details &lt;name&gt; to show a plugin's component inventory and projected per-session token cost</p>
|
||||
<p>• Added transcript view navigation: ? for keyboard shortcuts, {/} to jump between user prompts, v to toggle shortcut panel</p>
|
||||
<p>• Added hook args: string[] field (exec form) that spawns the command directly without a shell, so path placeholders never need quoting</p>
|
||||
<p>• Added hook continueOnBlock config option for PostToolUse — set to true to feed the hook's rejection reason back to Claude and continue the turn</p>
|
||||
<p>• MCP stdio servers now receive CLAUDE_PROJECT_DIR in their environment, matching hooks. Plugin configs can reference ${CLAUDE_PROJECT_DIR} in commands</p>
|
||||
<p>• Compaction prompt now asks the model to preserve sensitive user instructions</p>
|
||||
<p>• /mcp Reconnect now picks up .mcp.json edits without a restart, and shows the HTTP status and URL when reconnecting fails</p>
|
||||
<p>• /context all per-skill token estimates now account for the model's tokenizer and show rounded values</p>
|
||||
<p>• claude plugin install &lt;name&gt;@&lt;marketplace&gt; now auto-refreshes the marketplace and retries before reporting a plugin as not found</p>
|
||||
<p>• /plugin installed-plugin details now show hook event names and MCP server names cleanly</p>
|
||||
<p>• /context now shows the providing plugin's name for plugin-sourced skills</p>
|
||||
<p>• Remote MCP server reconnect retry on transient failures is now enabled for all users</p>
|
||||
<p>• API requests from subagents now carry x-claude-code-agent-id / x-claude-code-parent-agent-id headers, and claude_code.llm_request OTEL spans include agent_id / parent_agent_id attributes</p>
|
||||
<p>• Remote Control, /schedule, claude.ai MCP connectors, and notification preferences are now disabled when ANTHROPIC_API_KEY / apiKeyHelper / ANTHROPIC_AUTH_TOKEN is set, even if a Claude.ai login also exists. Unset the API key to use these features</p>
|
||||
<p>• Fixed a deadlock where expired credentials and the forceRemoteSettingsRefresh policy setting blocked claude auth login/logout/status with no way to recover</p>
|
||||
<p>• Fixed autoAllowBashIfSandboxed not auto-approving commands with shell expansions like $VAR and $(cmd)</p>
|
||||
<p>• Fixed a bug where a hook writing to the terminal could corrupt an on-screen interactive prompt; hooks now run without terminal access</p>
|
||||
<p>• Fixed unbounded memory growth when an HTTP/SSE MCP server streams non-protocol data — response bodies now capped at 16 MB per SSE frame</p>
|
||||
<p>• Fixed Skill(name *) permission rules — the wildcard form now works as a prefix match, matching Bash(ls *) behavior</p>
|
||||
<p>• Fixed settings hot-reload not detecting edits to symlinked ~/.claude/settings.json</p>
|
||||
<p>• Fixed plugin details failing to load when the marketplace key differs from the manifest name</p>
|
||||
<p>• Fixed /model picker "Default" row not reflecting ANTHROPIC_DEFAULT_OPUS_MODEL/ANTHROPIC_DEFAULT_SONNET_MODEL overrides</p>
|
||||
<p>• Fixed spurious "stream idle timeout" 5 minutes after a response completed, caused by the watchdog timer not being cleared on stream cancellation</p>
|
||||
<p>• Fixed silent exit 1 when 10+ MCP servers are configured and the cache directory is unwritable — the error message now includes the underlying cause</p>
|
||||
<p>• Fixed a typing cursor blinking on tab names, list pointers, and select rows in dialogs</p>
|
||||
<p>• Fixed transcript view letter shortcuts not working after mouse click</p>
|
||||
<p>• Fixed Bash-mode up-arrow history repeating the first entry and clobbering the in-progress draft</p>
|
||||
<p>• Fixed pasting or dropping multiple images only inserting the last one</p>
|
||||
<p>• Fixed hyperlinks using unreadable dark navy on dark themes — they now adapt to the active theme</p>
|
||||
<p>• Fixed model picker showing a redundant "Current model" row for third-party users whose model is set to the opus alias</p>
|
||||
<p>• Fixed legacy Opus picker entry on PAYG 3P providers resolving to the same model as the default entry</p>
|
||||
<p>• Fixed mouse wheel scrolling speed in Cursor and VS Code 1.92–1.104; the trackpad now scrolls at a steady rate and the mouse wheel keeps ~3 lines per notch</p>
|
||||
<p>• Fixed scroll behavior in Windows Terminal and VS Code when attached to background sessions</p>
|
||||
<p>• Fixed MCP resources from disconnected servers lingering in @server: autocomplete</p>
|
||||
<p>• Fixed two-file diff snippets over-reporting the number of truncated lines by one</p>
|
||||
<p>• Fixed Grep results not relativizing Windows drive-letter paths and count mode reporting wrong totals for single-file paths</p>
|
||||
<p>• Fixed border-embedded text overflowing on CJK/emoji due to visual cell width miscalculation</p>
|
||||
<p>• Fixed fuzzy-match highlighting splitting emoji and astral-plane characters mid-pair</p>
|
||||
<p>• Fixed skill argument names containing regex metacharacters breaking argument substitution</p>
|
||||
<p>• Fixed ProgressBar rendering a full block for an almost-full fractional cell</p>
|
||||
<p>• Fixed task polling and fs.watch being resurrected when the last subscriber leaves while a fetch is in flight</p>
|
||||
<p>• Fixed plugin dependency resolution leaving a stale count when the manifest name differs from the source identifier</p>
|
||||
<p>• Fixed Insights Time-of-Day chart skewing when a session has an unparseable timestamp</p>
|
||||
<p>• Fixed keybindings using only the cmd/super/win modifier being flagged as unparseable</p>
|
||||
<p>• Fixed claude_code.active_time.total OpenTelemetry metric not being emitted in --print mode</p>
|
||||
<p>• Fixed claude plugin update not preserving cross-plugin symlinks inside a marketplace</p>
|
||||
<p>• [VSCode] Press Cmd/Ctrl+Shift+T to reopen the most recently closed session tab, configurable via claudeCode.enableReopenClosedSessionShortcut</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.138</id>
|
||||
<title>Claude Code v2.1.138</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.138"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Internal fixes</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.137</id>
|
||||
<title>Claude Code v2.1.137</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.137"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• [VSCode] Fixed extension failing to activate on Windows</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.136</id>
|
||||
<title>Claude Code v2.1.136</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.136"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added CLAUDE_CODE_ENABLE_FEEDBACK_SURVEY_FOR_OTEL to re-enable the session quality survey for enterprises capturing responses through OpenTelemetry</p>
|
||||
<p>• Added settings.autoMode.hard_deny for auto mode classifier rules that block unconditionally regardless of user intent or allow exceptions</p>
|
||||
<p>• Fixed MCP servers configured in .mcp.json, plugins, and claude.ai connectors silently disappearing after /clear in the VS Code extension, JetBrains plugin, and Agent SDK</p>
|
||||
<p>• Fixed a rare login loop where a concurrent credential write could overwrite a freshly-rotated OAuth token and force re-login</p>
|
||||
<p>• Fixed MCP OAuth refresh tokens being lost when multiple servers refresh concurrently — users with several remote MCP servers should no longer need daily re-authentication</p>
|
||||
<p>• Fixed an API error (400) when extended thinking emitted a redacted thinking block after a tool call</p>
|
||||
<p>• Fixed --resume / --continue not finding sessions when the project path contains underscores</p>
|
||||
<p>• Fixed plan mode not blocking file writes when a matching Edit(...) allow rule exists</p>
|
||||
<p>• WSL2: image paste from Windows clipboard now works via a PowerShell fallback when xclip/wl-paste cannot read image data</p>
|
||||
<p>• Fixed plugin Stop/UserPromptSubmit hooks failing when cache cleanup deletes a version still in use by a running session</p>
|
||||
<p>• Improved visual consistency across slash command dialogs: standardized footer hints, dialog spacing, and arrow-key styling, and the dialog frame now appears immediately during loading instead of popping in after</p>
|
||||
<p>• Fixed colors appearing at wrong positions in bash command output and markdown code blocks</p>
|
||||
<p>• Fixed ReasonML diffs rendering corrupted "undefined" text artifacts at word-diff boundaries</p>
|
||||
<p>• Fixed worktree exit dialog warning about uncommitted files in the wrong directory after worktree removal</p>
|
||||
<p>• Fixed @ file picker not matching files created mid-session in small non-git directories</p>
|
||||
<p>• Fixed @-mention file picker not finding files in directories with more than 100 entries</p>
|
||||
<p>• Fixed failed tool calls not being click-to-expand in fullscreen mode when their output was truncated</p>
|
||||
<p>• Fixed Backspace and Ctrl+Backspace getting swapped after using Ctrl+G to open an external editor on terminals with persistent extended-key modes</p>
|
||||
<p>• Fixed /usage weekly reset showing time of day instead of the calendar date</p>
|
||||
<p>• Fixed welcome banner ellipsis causing column overflow on CJK terminals</p>
|
||||
<p>• Fixed /insights crash when session history contains tool calls with malformed input fields</p>
|
||||
<p>• Fixed a renderer crash when a tool's collapsibility classification changes mid-session</p>
|
||||
<p>• Fixed a skills entry in plugin.json hiding the plugin's default skills/ directory, and listing a file path now shows an error instead of failing silently</p>
|
||||
<p>• Fixed IDE shell-integration lock files not respecting CLAUDE_CONFIG_DIR</p>
|
||||
<p>• Fixed trailing whitespace in copied terminal output during streaming</p>
|
||||
<p>• Fixed plugin uninstall and enable/disable not matching slugs case-insensitively</p>
|
||||
<p>• Fixed tool error truncation marker showing a negative count for surrogate-pair strings</p>
|
||||
<p>• Fixed env vars from CLAUDE_ENV_FILE SessionStart hooks going stale after /resume or /clear</p>
|
||||
<p>• Fixed /branch saving a multi-line session title when given a pasted multi-line name</p>
|
||||
<p>• Fixed a stray leading space on the second line of wrapped text at the column boundary</p>
|
||||
<p>• Fixed Esc not dismissing dialogs in /install-github-app, /desktop, /resume, and /web-setup</p>
|
||||
<p>• Fixed /doctor MCP schema errors not naming the missing field or showing the source file path</p>
|
||||
<p>• Fixed Bash permission prompts showing an internal parser diagnostic instead of a user-readable explanation</p>
|
||||
<p>• Fixed plugin slash commands with spaces (e.g. /myplugin review) not resolving to their namespaced form</p>
|
||||
<p>• Fixed AskUserQuestion discarding multi-select answers when supplied as an array</p>
|
||||
<p>• Fixed /clear &lt;name&gt; not labeling the cleared session for /resume</p>
|
||||
<p>• Fixed CronList output missing qualifiers and the scheduled prompt</p>
|
||||
<p>• Fixed "Jump to bottom" overlay leaving color artifacts on CJK characters in fullscreen mode</p>
|
||||
<p>• Fixed wide markdown tables leaving a stale bordered render in terminal scrollback while streaming</p>
|
||||
<p>• Fixed pasted text being silently dropped when a long prompt with a pasted-text placeholder was auto-truncated</p>
|
||||
<p>• Fixed /release-notes getting stuck on an old version after a failed changelog refresh</p>
|
||||
<p>• Fixed /mcp server list not scrolling when there are more servers than fit in the terminal</p>
|
||||
<p>• Fixed mid-input slash command autocomplete not working after an initial slash command</p>
|
||||
<p>• Fixed scrolling to bottom re-engaging auto-follow with autoScrollEnabled: false</p>
|
||||
<p>• Fixed prompt suggestions being auto-submitted by Enter on an empty input instead of requiring Tab or arrow to accept</p>
|
||||
<p>• Fixed keyboard shortcut hints not reflecting rebound keys from keybindings.json</p>
|
||||
<p>• Fixed /settings language change being reverted on Escape after confirming</p>
|
||||
<p>• Fixed /terminal-setup only appearing in autocomplete on exact name match instead of partial prefixes</p>
|
||||
<p>• Fixed "Chat about this" on an AskUserQuestion dialog erasing the question text</p>
|
||||
<p>• Fixed MCP tool results being invisible when the server returns content blocks</p>
|
||||
<p>• Improved error message when --worktree collides with an existing or stale worktree</p>
|
||||
<p>• Changed plugin marketplace removal key to d (matching delete elsewhere) instead of r which collided with retry</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.133</id>
|
||||
<title>Claude Code v2.1.133</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.133"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added worktree.baseRef setting (fresh | head) to choose whether --worktree, EnterWorktree, and agent-isolation worktrees branch from origin/&lt;default&gt; or local HEAD. Note: the default fresh changes EnterWorktree's base back to origin/&lt;default&gt; (it has been local HEAD since 2.1.128) — set worktree.baseRef: "head" to keep unpushed commits in new worktrees</p>
|
||||
<p>• Added sandbox.bwrapPath and sandbox.socatPath managed settings (Linux/WSL) to specify custom bubblewrap and socat binary locations</p>
|
||||
<p>• Added parentSettingsBehavior admin-tier key ('first-wins' | 'merge') to let admins opt SDK managedSettings (parent tier) into the policy merge</p>
|
||||
<p>• Hooks now receive the active effort level via the effort.level JSON input field and the $CLAUDE_EFFORT environment variable, and Bash tool commands can read $CLAUDE_EFFORT</p>
|
||||
<p>• Improved focus mode behavior</p>
|
||||
<p>• Improved memory usage by releasing warm-spare background workers under memory pressure</p>
|
||||
<p>• Fixed parallel sessions all dead-ending at 401 after a refresh-token race wiped shared credentials</p>
|
||||
<p>• Fixed Edit/Write allow rules scoped to a drive root (C:\) or POSIX / matching incorrectly and always prompting</p>
|
||||
<p>• Fixed an unhandled rejection (ECOMPROMISED) when a history or session-log file lock is compromised by clock skew or slow disk</p>
|
||||
<p>• Fixed pressing Esc during conversation compaction showing a spurious "Error compacting conversation" notification</p>
|
||||
<p>• Fixed HTTP(S)_PROXY / NO_PROXY / mTLS not being respected for the full MCP OAuth flow including discovery, dynamic client registration, token exchange, and token refresh</p>
|
||||
<p>• Fixed Read/Write/Edit being denied on mapped network drives passed via --add-dir / SDK additionalDirectories</p>
|
||||
<p>• Fixed Remote Control stop/interrupt from claude.ai not fully canceling the CLI session the same way local Esc does, causing queued messages to never advance after interrupting a stuck tool or prompt</p>
|
||||
<p>• Fixed /effort in one session unexpectedly changing the effort level of other concurrent sessions, and a related issue where an IDE effort change could be silently dropped</p>
|
||||
<p>• Fixed subagents not discovering project, user, or plugin skills via the Skill tool</p>
|
||||
<p>• claude --help now lists --remote-control alongside --remote-control-session-name-prefix</p>
|
||||
<p>• [VSCode] Fixed claudeCode.claudeProcessWrapper failing with "Unsupported platform" when the extension build doesn't bundle a Claude binary</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.132</id>
|
||||
<title>Claude Code v2.1.132</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.132"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added CLAUDE_CODE_SESSION_ID environment variable to the Bash tool subprocess environment, matching the session_id passed to hooks</p>
|
||||
<p>• Added CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1 env var to opt out of the fullscreen alternate-screen renderer and keep the conversation in the terminal's native scrollback</p>
|
||||
<p>• Added a "Pasting…" footer hint while a Ctrl+V image paste is being read from the clipboard</p>
|
||||
<p>• Fixed external SIGINT (e.g. IDE stop button, kill -INT) not running graceful shutdown — terminal modes are now restored and the --resume hint is printed instead of an abrupt exit</p>
|
||||
<p>• Fixed an uncaught exception when the terminal is closed or SSH disconnects mid-session under the native build</p>
|
||||
<p>• Fixed --resume failing with no low surrogate in string when a tool error truncation split an emoji; pre-corrupted sessions are sanitized on load</p>
|
||||
<p>• Fixed --permission-mode flag being ignored when resuming a plan-mode session with -p --continue/--resume, and plan mode not being re-applied after ExitPlanMode within the same session</p>
|
||||
<p>• Fixed fullscreen mode showing a blank screen after laptop sleep/wake or Ctrl+Z/fg until the next keystroke or stream output</p>
|
||||
<p>• Fixed cursor landing mid-grapheme on Ctrl+E/A/K/U/arrow keys when an Indic conjunct or ZWJ emoji wraps across lines</p>
|
||||
<p>• Fixed vim operators corrupting text containing decomposed (NFD) accented characters</p>
|
||||
<p>• Fixed pasting text starting with / silently swallowing the input or triggering an unknown-command reply</p>
|
||||
<p>• Fixed pasting dumping stray escape sequences into the prompt when focus events or mouse-tracking reports interleave with the bracketed paste</p>
|
||||
<p>• Fixed mouse wheel scrolling being too fast in Cursor and VS Code 1.92–1.104 due to an upstream xterm.js bug</p>
|
||||
<p>• Fixed scroll-wheel handling in JetBrains IDE 2025.2 terminals (spurious arrow keys, wrong-direction events, runaway acceleration)</p>
|
||||
<p>• Fixed /usage Ctrl+S hanging when copying the stats screenshot to the clipboard on Linux/X11</p>
|
||||
<p>• Fixed /terminal-setup showing a contradictory error in Windows Terminal — Shift+Enter is natively supported there</p>
|
||||
<p>• Fixed /effort picker not reflecting the CLAUDE_CODE_EFFORT_LEVEL env var override</p>
|
||||
<p>• Fixed /status showing the wrong default model for some users</p>
|
||||
<p>• Fixed slash command autocomplete popup being capped at ~3–5 visible commands instead of scaling with terminal height</p>
|
||||
<p>• Fixed statusline context_window token counts reflecting cumulative session totals instead of current context usage</p>
|
||||
<p>• Fixed Alt+T (thinking toggle) not working on macOS terminals without "Option as Meta" enabled (iTerm2, Terminal.app defaults)</p>
|
||||
<p>• Fixed dead keyboard input on Windows after re-opening a background session from claude agents</p>
|
||||
<p>• Fixed unbounded memory growth (10GB+ RSS) when a stdio MCP server writes non-protocol data to stdout</p>
|
||||
<p>• Fixed MCP servers that connect but fail tools/list silently showing 0 tools — they now retry once and show "connected · tools fetch failed" in /mcp</p>
|
||||
<p>• Fixed unauthorized claude.ai MCP connectors showing as "failed" instead of "needs auth", and headless -p mode retrying non-transient 4xx connection failures</p>
|
||||
<p>• Improved visual consistency in slash command dialogs and /login, /upgrade, /extra-usage dialog spacing</p>
|
||||
<p>• Updated the /tui fullscreen startup banner to describe additional renderer benefits (lower memory usage, mouse support, auto-copy on select)</p>
|
||||
<p>• Fixed Bedrock and Vertex 400 errors when ENABLE_PROMPT_CACHING_1H is set</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.131</id>
|
||||
<title>Claude Code v2.1.131</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.131"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Fixed VS Code extension failing to activate on Windows due to a hardcoded build path in the bundled SDK (createRequire polyfill bug)</p>
|
||||
<p>• Fixed Mantle endpoint authentication failing with missing x-api-key header</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.129</id>
|
||||
<title>Claude Code v2.1.129</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.129"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added --plugin-url &lt;url&gt; flag to fetch a plugin .zip archive from a URL for the current session</p>
|
||||
<p>• Added CLAUDE_CODE_FORCE_SYNC_OUTPUT=1 env var to force-enable synchronized output on terminals that auto-detection misses (e.g. Emacs eat)</p>
|
||||
<p>• Added CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE: when set on Homebrew or WinGet installations, Claude Code runs the upgrade command in the background and prompts to restart</p>
|
||||
<p>• Plugin manifests: themes and monitors should now be declared under "experimental": { ... }. Top-level declarations still work but claude plugin validate will warn</p>
|
||||
<p>• Gateway /v1/models discovery for the /model picker is now opt-in via CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 (was automatic in 2.1.126–2.1.128)</p>
|
||||
<p>• Ctrl+R history picker now defaults to searching all prompts across all projects, matching pre-2.1.124 behavior. Press Ctrl+S to narrow to the current project or session</p>
|
||||
<p>• Third-party deployments (Bedrock, Vertex, Foundry, or ANTHROPIC_BASE_URL gateway) no longer see spinner tips pointing at first-party Anthropic surfaces</p>
|
||||
<p>• skillOverrides setting now works: off hides from model and /, user-invocable-only hides from model only, name-only collapses description</p>
|
||||
<p>• The claude_code.pull_request.count OTel metric now counts PRs/MRs created via MCP tools, not just shell commands</p>
|
||||
<p>• Policy refusal error messages now include the API Request ID for easier support debugging</p>
|
||||
<p>• Fixed API errors with unrecognized 400 status codes showing raw JSON instead of the underlying error message</p>
|
||||
<p>• Fixed /clear not resetting the terminal tab title after a conversation</p>
|
||||
<p>• Fixed session title chip from /rename disappearing while a permission or other dialog is active</p>
|
||||
<p>• Fixed agent panel below the prompt being hidden when subagents are running (regression in 2.1.122)</p>
|
||||
<p>• Fixed external-editor handoff (Ctrl+G) blanking the conversation history above the prompt</p>
|
||||
<p>• Fixed /context dumping its rendered ASCII visualization grid into the conversation, wasting ~1.6k tokens per call</p>
|
||||
<p>• Fixed /agents Library list arrow-key navigation: the highlighted agent now stays visible when the list exceeds the viewport</p>
|
||||
<p>• Fixed /branch success message not including the new branch's session id for /resume</p>
|
||||
<p>• Fixed bold headers with keycap/ZWJ/skin-tone emoji losing trailing characters in fullscreen mode</p>
|
||||
<p>• Fixed server-managed settings policy not applying for enterprise/team users whose stored OAuth credentials lacked the user:inference scope</p>
|
||||
<p>• Fixed OAuth refresh race after wake-from-sleep that could log out all running sessions</p>
|
||||
<p>• Fixed 1-hour prompt cache TTL being silently downgraded to 5 minutes</p>
|
||||
<p>• Fixed cache-miss warning appearing spuriously after /clear or compaction when changing /effort or /model</p>
|
||||
<p>• Fixed Bash(mkdir *), Bash(touch *) and similar allow rules not being honored for in-project paths</p>
|
||||
<p>• Fixed deniedMcpServers patterns with a *:// scheme wildcard not matching mixed-case hostnames</p>
|
||||
<p>• Fixed harmless WebSocket warning being logged as an error in --debug during voice mode</p>
|
||||
<p>• [VSCode] Fixed /clear not clearing the conversation context and displayed transcript</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.128</id>
|
||||
<title>Claude Code v2.1.128</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.128"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Bare /color (no args) now picks a random session color</p>
|
||||
<p>• /mcp now shows the tool count for connected servers and flags servers that connected with 0 tools</p>
|
||||
<p>• --plugin-dir now accepts .zip plugin archives in addition to directories</p>
|
||||
<p>• --channels now works with console (API key) authentication — console orgs with managed settings must set channelsEnabled: true to enable</p>
|
||||
<p>• Updated /model picker: collapsed duplicate Opus 4.7 entries, and current Opus now shows as "Opus" instead of "Opus 4.7"</p>
|
||||
<p>• Subprocesses (Bash, hooks, MCP, LSP) no longer inherit OTEL_* environment variables, so OTEL-instrumented apps run via the Bash tool no longer pick up the CLI's own OTLP endpoint</p>
|
||||
<p>• MCP: workspace is now a reserved server name — existing servers with that name will be skipped with a warning</p>
|
||||
<p>• Reconnecting MCP servers no longer flood the conversation with full tool-name lists on every reconnect — re-announced tools are summarized by server prefix</p>
|
||||
<p>• SDK hosts now receive a persistent localSettings suggestion for Bash permission prompts, so "Always allow" writes to .claude/settings.local.json</p>
|
||||
<p>• EnterWorktree now creates the new branch from local HEAD as documented, instead of origin/&lt;default-branch&gt; — unpushed commits are no longer dropped</p>
|
||||
<p>• Auto mode: when the classifier can't evaluate an action, the error now includes a hint (retry, /compact, or run with --debug)</p>
|
||||
<p>• Fixed focus mode briefly dimming the previous response when submitting a new prompt</p>
|
||||
<p>• Fixed stray "4;0;" desktop notification on every /exit in Kitty and other terminals that interpret OSC 9 as a notification</p>
|
||||
<p>• Fixed Remote Control showing an empty "Opening your options…" message on rate limit instead of actionable upsell options</p>
|
||||
<p>• Fixed drag-and-drop image upload hanging on "Pasting text…" when the image read fails</p>
|
||||
<p>• Fixed crash loop when piping very large input (&gt;10 MB) to claude -p via stdin</p>
|
||||
<p>• Fixed long URLs not being individually clickable on every wrapped row in fullscreen mode</p>
|
||||
<p>• Fixed /plugin Components panel showing "Marketplace 'inline' not found" for plugins loaded via --plugin-dir</p>
|
||||
<p>• Fixed MCP tool results dropping images when the server returns both structured content and content blocks</p>
|
||||
<p>• Fixed fenced code blocks inside list items carrying leading whitespace into the clipboard on copy-paste</p>
|
||||
<p>• Fixed tab navigation in /config stranding focus — the tab header now stays focused so arrows and Esc keep working</p>
|
||||
<p>• Fixed markdown link labels being lost on terminals without OSC 8 hyperlink support — links now render as label (url) instead of just the URL</p>
|
||||
<p>• Fixed sessions on 1M-context models with a smaller autocompact window being falsely blocked with "Prompt is too long" before reaching the actual API limit</p>
|
||||
<p>• Fixed parallel shell tool calls: a failing read-only command (grep, git diff, ls) no longer cancels sibling calls</p>
|
||||
<p>• Fixed banner showing "with X effort" on models that don't support effort</p>
|
||||
<p>• Fixed /fast on 3P providers fuzzy-matching to an unrelated skill instead of showing "not available"</p>
|
||||
<p>• Fixed Bedrock default model resolving to global.* instead of the region-appropriate prefix</p>
|
||||
<p>• Fixed vim mode: Space in NORMAL mode now moves the cursor right, matching standard vi/vim behavior</p>
|
||||
<p>• Fixed terminal progress indicator (OSC 9;4) flickering off between tool calls — stays visible across the full turn</p>
|
||||
<p>• Fixed /rename without args failing on resumed sessions whose last entry is a compact boundary</p>
|
||||
<p>• Fixed stale "remote-control is active" status lines from prior sessions appearing after --resume/--continue</p>
|
||||
<p>• Fixed stale installed_plugins.json entries pointing at deleted cache directories polluting PATH</p>
|
||||
<p>• Fixed MCP stdio servers receiving corrupted arguments when CLAUDE_CODE_SHELL_PREFIX is set and an argument contains spaces or shell metacharacters</p>
|
||||
<p>• Fixed sub-agent progress summaries missing the prompt cache (~3× cache_creation reduction)</p>
|
||||
<p>• Fixed /plugin update never detecting new versions of npm-sourced plugins</p>
|
||||
<p>• Fixed sub-agent summaries firing repeatedly while a sub-agent's transcript is static, capping worst-case token cost on idle sub-agents</p>
|
||||
<p>• Headless --output-format stream-json: init.plugin_errors now includes --plugin-dir load failures in addition to dependency demotions</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.126</id>
|
||||
<title>Claude Code v2.1.126</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.126"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• The /model picker now lists models from your gateway's /v1/models endpoint when ANTHROPIC_BASE_URL points at an Anthropic-compatible gateway</p>
|
||||
<p>• - Added claude project purge [path] to delete all Claude Code state for a project (transcripts, tasks, file history, config entry) — supports --dry-run, -y/--yes, -i/--interactive, and --all</p>
|
||||
<p>• --dangerously-skip-permissions now bypasses prompts for writes to .claude/, .git/, .vscode/, shell config files, and other previously-protected paths (catastrophic removal commands still prompt as a safety net)</p>
|
||||
<p>• claude auth login now accepts the OAuth code pasted into the terminal when the browser callback can't reach localhost (WSL2, SSH, containers)</p>
|
||||
<p>• claude_code.skill_activated OpenTelemetry event now fires for user-typed slash commands and carries a new invocation_trigger attribute ("user-slash", "claude-proactive", or "nested-skill")</p>
|
||||
<p>• Auto mode: the spinner now turns red when a permission check stalls, instead of looking like the tool is running</p>
|
||||
<p>• Host-managed deployments (CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST) no longer auto-disable analytics on Bedrock/Vertex/Foundry</p>
|
||||
<p>• Windows: PowerShell 7 installed via the Microsoft Store, MSI without PATH, or .NET global tool is now detected</p>
|
||||
<p>• Windows: when the PowerShell tool is enabled, Claude now treats PowerShell as the primary shell instead of defaulting to Bash</p>
|
||||
<p>• Read tool: removed the per-file malware-assessment reminder that could cause spurious refusals and "this is not malware" commentary on legacy models</p>
|
||||
<p>• Security: Fixed allowManagedDomainsOnly / allowManagedReadPathsOnly being ignored when a higher-priority managed-settings source lacked a sandbox block</p>
|
||||
<p>• Fixed pasting an image larger than 2000px breaking the session — images are now downscaled on paste, and oversized images in history are automatically removed and the request retried</p>
|
||||
<p>• Fixed showing the login screen for "OAuth not allowed for organization" errors — now shows guidance to contact your admin</p>
|
||||
<p>• Fixed OAuth login failing with timeout on slow or proxied connections, in IPv6-only devcontainers, and when the browser callback can't reach localhost</p>
|
||||
<p>• Fixed a rare race where a concurrent credential write could clear a valid OAuth refresh token</p>
|
||||
<p>• Fixed API retry countdown sticking at "0s" instead of counting down between attempts</p>
|
||||
<p>• Fixed "Stream idle timeout" error after waking Mac from sleep mid-request</p>
|
||||
<p>• Fixed background and remote sessions falsely aborting with "Stream idle timeout" during long model thinking pauses</p>
|
||||
<p>• Fixed a hang where the assistant could finish thinking but show no output after a run of empty turns</p>
|
||||
<p>• Fixed overly fast trackpad scrolling in Cursor and VS Code 1.92–1.104 integrated terminals</p>
|
||||
<p>• Fixed claude.ai MCP connectors being suppressed by manual servers stuck in needs-auth state</p>
|
||||
<p>• Fixed Japanese/Korean/Chinese text rendering as garbled characters on Windows in no-flicker mode</p>
|
||||
<p>• Fixed Ctrl+L clearing the prompt input — it now only forces a screen redraw, matching readline behavior</p>
|
||||
<p>• Fixed deferred tools (WebSearch, WebFetch, etc.) not being available to skills with context: fork and other subagents on their first turn</p>
|
||||
<p>• Fixed plan-mode tools being unavailable in interactive sessions launched with --channels</p>
|
||||
<p>• Fixed /plugin Uninstall reporting "Enabled" instead of "Uninstalled"</p>
|
||||
<p>• Bounded total size of file-modified reminders when a linter touches many files at once</p>
|
||||
<p>• Fixed /remote-control retries appearing stuck on "connecting…" — each retry now shows its result</p>
|
||||
<p>• Fixed Remote Control failure notification not showing the error reason for initial connection failures</p>
|
||||
<p>• Windows: clipboard writes no longer expose copied content in process command-line arguments visible to EDR/SIEM telemetry; also fixes &gt;22KB selections not reaching the clipboard</p>
|
||||
<p>• PowerShell tool: bare -- (e.g. git diff -- file) is no longer mis-flagged as the --% stop-parsing token</p>
|
||||
<p>• Fixed Agent SDK hang when the model emits a malformed tool name in a parallel tool call batch</p></content>
|
||||
</entry>
|
||||
</feed>
|
||||
@@ -1,77 +0,0 @@
|
||||
# Claude Code Plugins
|
||||
|
||||
This directory contains some official Claude Code plugins that extend functionality through custom commands, agents, and workflows. These are examples of what's possible with the Claude Code plugin system—many more plugins are available through community marketplaces.
|
||||
|
||||
## What are Claude Code Plugins?
|
||||
|
||||
Claude Code plugins are extensions that enhance Claude Code with custom slash commands, specialized agents, hooks, and MCP servers. Plugins can be shared across projects and teams, providing consistent tooling and workflows.
|
||||
|
||||
Learn more in the [official plugins documentation](https://docs.claude.com/en/docs/claude-code/plugins).
|
||||
|
||||
## Plugins in This Directory
|
||||
|
||||
| Name | Description | Contents |
|
||||
|------|-------------|----------|
|
||||
| [agent-sdk-dev](./agent-sdk-dev/) | Development kit for working with the Claude Agent SDK | **Command:** `/new-sdk-app` - Interactive setup for new Agent SDK projects<br>**Agents:** `agent-sdk-verifier-py`, `agent-sdk-verifier-ts` - Validate SDK applications against best practices |
|
||||
| [claude-opus-4-5-migration](./claude-opus-4-5-migration/) | Migrate code and prompts from Sonnet 4.x and Opus 4.1 to Opus 4.5 | **Skill:** `claude-opus-4-5-migration` - Automated migration of model strings, beta headers, and prompt adjustments |
|
||||
| [code-review](./code-review/) | Automated PR code review using multiple specialized agents with confidence-based scoring to filter false positives | **Command:** `/code-review` - Automated PR review workflow<br>**Agents:** 5 parallel Sonnet agents for CLAUDE.md compliance, bug detection, historical context, PR history, and code comments |
|
||||
| [commit-commands](./commit-commands/) | Git workflow automation for committing, pushing, and creating pull requests | **Commands:** `/commit`, `/commit-push-pr`, `/clean_gone` - Streamlined git operations |
|
||||
| [explanatory-output-style](./explanatory-output-style/) | Adds educational insights about implementation choices and codebase patterns (mimics the deprecated Explanatory output style) | **Hook:** SessionStart - Injects educational context at the start of each session |
|
||||
| [feature-dev](./feature-dev/) | Comprehensive feature development workflow with a structured 7-phase approach | **Command:** `/feature-dev` - Guided feature development workflow<br>**Agents:** `code-explorer`, `code-architect`, `code-reviewer` - For codebase analysis, architecture design, and quality review |
|
||||
| [frontend-design](./frontend-design/) | Create distinctive, production-grade frontend interfaces that avoid generic AI aesthetics | **Skill:** `frontend-design` - Auto-invoked for frontend work, providing guidance on bold design choices, typography, animations, and visual details |
|
||||
| [hookify](./hookify/) | Easily create custom hooks to prevent unwanted behaviors by analyzing conversation patterns or explicit instructions | **Commands:** `/hookify`, `/hookify:list`, `/hookify:configure`, `/hookify:help`<br>**Agent:** `conversation-analyzer` - Analyzes conversations for problematic behaviors<br>**Skill:** `writing-rules` - Guidance on hookify rule syntax |
|
||||
| [learning-output-style](./learning-output-style/) | Interactive learning mode that requests meaningful code contributions at decision points (mimics the unshipped Learning output style) | **Hook:** SessionStart - Encourages users to write meaningful code (5-10 lines) at decision points while receiving educational insights |
|
||||
| [plugin-dev](./plugin-dev/) | Comprehensive toolkit for developing Claude Code plugins with 7 expert skills and AI-assisted creation | **Command:** `/plugin-dev:create-plugin` - 8-phase guided workflow for building plugins<br>**Agents:** `agent-creator`, `plugin-validator`, `skill-reviewer`<br>**Skills:** Hook development, MCP integration, plugin structure, settings, commands, agents, and skill development |
|
||||
| [pr-review-toolkit](./pr-review-toolkit/) | Comprehensive PR review agents specializing in comments, tests, error handling, type design, code quality, and code simplification | **Command:** `/pr-review-toolkit:review-pr` - Run with optional review aspects (comments, tests, errors, types, code, simplify, all)<br>**Agents:** `comment-analyzer`, `pr-test-analyzer`, `silent-failure-hunter`, `type-design-analyzer`, `code-reviewer`, `code-simplifier` |
|
||||
| [ralph-wiggum](./ralph-wiggum/) | Interactive self-referential AI loops for iterative development. Claude works on the same task repeatedly until completion | **Commands:** `/ralph-loop`, `/cancel-ralph` - Start/stop autonomous iteration loops<br>**Hook:** Stop - Intercepts exit attempts to continue iteration |
|
||||
| [security-guidance](./security-guidance/) | Security reminder hook that warns about potential security issues when editing files | **Hook:** PreToolUse - Monitors 9 security patterns including command injection, XSS, eval usage, dangerous HTML, pickle deserialization, and os.system calls |
|
||||
|
||||
## Installation
|
||||
|
||||
These plugins are included in the Claude Code repository. To use them in your own projects:
|
||||
|
||||
1. Install Claude Code globally:
|
||||
```bash
|
||||
npm install -g @anthropic-ai/claude-code
|
||||
```
|
||||
|
||||
2. Navigate to your project and run Claude Code:
|
||||
```bash
|
||||
claude
|
||||
```
|
||||
|
||||
3. Use the `/plugin` command to install plugins from marketplaces, or configure them in your project's `.claude/settings.json`.
|
||||
|
||||
For detailed plugin installation and configuration, see the [official documentation](https://docs.claude.com/en/docs/claude-code/plugins).
|
||||
|
||||
## Plugin Structure
|
||||
|
||||
Each plugin follows the standard Claude Code plugin structure:
|
||||
|
||||
```
|
||||
plugin-name/
|
||||
├── .claude-plugin/
|
||||
│ └── plugin.json # Plugin metadata
|
||||
├── commands/ # Slash commands (optional)
|
||||
├── agents/ # Specialized agents (optional)
|
||||
├── skills/ # Agent Skills (optional)
|
||||
├── hooks/ # Event handlers (optional)
|
||||
├── .mcp.json # External tool configuration (optional)
|
||||
└── README.md # Plugin documentation
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
When adding new plugins to this directory:
|
||||
|
||||
1. Follow the standard plugin structure
|
||||
2. Include a comprehensive README.md
|
||||
3. Add plugin metadata in `.claude-plugin/plugin.json`
|
||||
4. Document all commands and agents
|
||||
5. Provide usage examples
|
||||
|
||||
## Learn More
|
||||
|
||||
- [Claude Code Documentation](https://docs.claude.com/en/docs/claude-code/overview)
|
||||
- [Plugin System Documentation](https://docs.claude.com/en/docs/claude-code/plugins)
|
||||
- [Agent SDK Documentation](https://docs.claude.com/en/api/agent-sdk/overview)
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "agent-sdk-dev",
|
||||
"description": "Claude Agent SDK Development Plugin",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Ashwin Bhat",
|
||||
"email": "ashwin@anthropic.com"
|
||||
}
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
# Agent SDK Development Plugin
|
||||
|
||||
A comprehensive plugin for creating and verifying Claude Agent SDK applications in Python and TypeScript.
|
||||
|
||||
## Overview
|
||||
|
||||
The Agent SDK Development Plugin streamlines the entire lifecycle of building Agent SDK applications, from initial scaffolding to verification against best practices. It helps you quickly start new projects with the latest SDK versions and ensures your applications follow official documentation patterns.
|
||||
|
||||
## Features
|
||||
|
||||
### Command: `/new-sdk-app`
|
||||
|
||||
Interactive command that guides you through creating a new Claude Agent SDK application.
|
||||
|
||||
**What it does:**
|
||||
- Asks clarifying questions about your project (language, name, agent type, starting point)
|
||||
- Checks for and installs the latest SDK version
|
||||
- Creates all necessary project files and configuration
|
||||
- Sets up proper environment files (.env.example, .gitignore)
|
||||
- Provides a working example tailored to your use case
|
||||
- Runs type checking (TypeScript) or syntax validation (Python)
|
||||
- Automatically verifies the setup using the appropriate verifier agent
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
/new-sdk-app my-project-name
|
||||
```
|
||||
|
||||
Or simply:
|
||||
```bash
|
||||
/new-sdk-app
|
||||
```
|
||||
|
||||
The command will interactively ask you:
|
||||
1. Language choice (TypeScript or Python)
|
||||
2. Project name (if not provided)
|
||||
3. Agent type (coding, business, custom)
|
||||
4. Starting point (minimal, basic, or specific example)
|
||||
5. Tooling preferences (npm/yarn/pnpm or pip/poetry)
|
||||
|
||||
**Example:**
|
||||
```bash
|
||||
/new-sdk-app customer-support-agent
|
||||
# → Creates a new Agent SDK project for a customer support agent
|
||||
# → Sets up TypeScript or Python environment
|
||||
# → Installs latest SDK version
|
||||
# → Verifies the setup automatically
|
||||
```
|
||||
|
||||
### Agent: `agent-sdk-verifier-py`
|
||||
|
||||
Thoroughly verifies Python Agent SDK applications for correct setup and best practices.
|
||||
|
||||
**Verification checks:**
|
||||
- SDK installation and version
|
||||
- Python environment setup (requirements.txt, pyproject.toml)
|
||||
- Correct SDK usage and patterns
|
||||
- Agent initialization and configuration
|
||||
- Environment and security (.env, API keys)
|
||||
- Error handling and functionality
|
||||
- Documentation completeness
|
||||
|
||||
**When to use:**
|
||||
- After creating a new Python SDK project
|
||||
- After modifying an existing Python SDK application
|
||||
- Before deploying a Python SDK application
|
||||
|
||||
**Usage:**
|
||||
The agent runs automatically after `/new-sdk-app` creates a Python project, or you can trigger it by asking:
|
||||
```
|
||||
"Verify my Python Agent SDK application"
|
||||
"Check if my SDK app follows best practices"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
Provides a comprehensive report with:
|
||||
- Overall status (PASS / PASS WITH WARNINGS / FAIL)
|
||||
- Critical issues that prevent functionality
|
||||
- Warnings about suboptimal patterns
|
||||
- List of passed checks
|
||||
- Specific recommendations with SDK documentation references
|
||||
|
||||
### Agent: `agent-sdk-verifier-ts`
|
||||
|
||||
Thoroughly verifies TypeScript Agent SDK applications for correct setup and best practices.
|
||||
|
||||
**Verification checks:**
|
||||
- SDK installation and version
|
||||
- TypeScript configuration (tsconfig.json)
|
||||
- Correct SDK usage and patterns
|
||||
- Type safety and imports
|
||||
- Agent initialization and configuration
|
||||
- Environment and security (.env, API keys)
|
||||
- Error handling and functionality
|
||||
- Documentation completeness
|
||||
|
||||
**When to use:**
|
||||
- After creating a new TypeScript SDK project
|
||||
- After modifying an existing TypeScript SDK application
|
||||
- Before deploying a TypeScript SDK application
|
||||
|
||||
**Usage:**
|
||||
The agent runs automatically after `/new-sdk-app` creates a TypeScript project, or you can trigger it by asking:
|
||||
```
|
||||
"Verify my TypeScript Agent SDK application"
|
||||
"Check if my SDK app follows best practices"
|
||||
```
|
||||
|
||||
**Output:**
|
||||
Provides a comprehensive report with:
|
||||
- Overall status (PASS / PASS WITH WARNINGS / FAIL)
|
||||
- Critical issues that prevent functionality
|
||||
- Warnings about suboptimal patterns
|
||||
- List of passed checks
|
||||
- Specific recommendations with SDK documentation references
|
||||
|
||||
## Workflow Example
|
||||
|
||||
Here's a typical workflow using this plugin:
|
||||
|
||||
1. **Create a new project:**
|
||||
```bash
|
||||
/new-sdk-app code-reviewer-agent
|
||||
```
|
||||
|
||||
2. **Answer the interactive questions:**
|
||||
```
|
||||
Language: TypeScript
|
||||
Agent type: Coding agent (code review)
|
||||
Starting point: Basic agent with common features
|
||||
```
|
||||
|
||||
3. **Automatic verification:**
|
||||
The command automatically runs `agent-sdk-verifier-ts` to ensure everything is correctly set up.
|
||||
|
||||
4. **Start developing:**
|
||||
```bash
|
||||
# Set your API key
|
||||
echo "ANTHROPIC_API_KEY=your_key_here" > .env
|
||||
|
||||
# Run your agent
|
||||
npm start
|
||||
```
|
||||
|
||||
5. **Verify after changes:**
|
||||
```
|
||||
"Verify my SDK application"
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
This plugin is included in the Claude Code repository. To use it:
|
||||
|
||||
1. Ensure Claude Code is installed
|
||||
2. The plugin commands and agents are automatically available
|
||||
|
||||
## Best Practices
|
||||
|
||||
- **Always use the latest SDK version**: `/new-sdk-app` checks for and installs the latest version
|
||||
- **Verify before deploying**: Run the verifier agent before deploying to production
|
||||
- **Keep API keys secure**: Never commit `.env` files or hardcode API keys
|
||||
- **Follow SDK documentation**: The verifier agents check against official patterns
|
||||
- **Type check TypeScript projects**: Run `npx tsc --noEmit` regularly
|
||||
- **Test your agents**: Create test cases for your agent's functionality
|
||||
|
||||
## Resources
|
||||
|
||||
- [Agent SDK Overview](https://docs.claude.com/en/api/agent-sdk/overview)
|
||||
- [TypeScript SDK Reference](https://docs.claude.com/en/api/agent-sdk/typescript)
|
||||
- [Python SDK Reference](https://docs.claude.com/en/api/agent-sdk/python)
|
||||
- [Agent SDK Examples](https://docs.claude.com/en/api/agent-sdk/examples)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Type errors in TypeScript project
|
||||
|
||||
**Issue**: TypeScript project has type errors after creation
|
||||
|
||||
**Solution**:
|
||||
- The `/new-sdk-app` command runs type checking automatically
|
||||
- If errors persist, check that you're using the latest SDK version
|
||||
- Verify your `tsconfig.json` matches SDK requirements
|
||||
|
||||
### Python import errors
|
||||
|
||||
**Issue**: Cannot import from `claude_agent_sdk`
|
||||
|
||||
**Solution**:
|
||||
- Ensure you've installed dependencies: `pip install -r requirements.txt`
|
||||
- Activate your virtual environment if using one
|
||||
- Check that the SDK is installed: `pip show claude-agent-sdk`
|
||||
|
||||
### Verification fails with warnings
|
||||
|
||||
**Issue**: Verifier agent reports warnings
|
||||
|
||||
**Solution**:
|
||||
- Review the specific warnings in the report
|
||||
- Check the SDK documentation references provided
|
||||
- Warnings don't prevent functionality but indicate areas for improvement
|
||||
|
||||
## Author
|
||||
|
||||
Ashwin Bhat (ashwin@anthropic.com)
|
||||
|
||||
## Version
|
||||
|
||||
1.0.0
|
||||
@@ -1,140 +0,0 @@
|
||||
---
|
||||
name: agent-sdk-verifier-py
|
||||
description: Use this agent to verify that a Python Agent SDK application is properly configured, follows SDK best practices and documentation recommendations, and is ready for deployment or testing. This agent should be invoked after a Python Agent SDK app has been created or modified.
|
||||
model: sonnet
|
||||
---
|
||||
|
||||
You are a Python Agent SDK application verifier. Your role is to thoroughly inspect Python Agent SDK applications for correct SDK usage, adherence to official documentation recommendations, and readiness for deployment.
|
||||
|
||||
## Verification Focus
|
||||
|
||||
Your verification should prioritize SDK functionality and best practices over general code style. Focus on:
|
||||
|
||||
1. **SDK Installation and Configuration**:
|
||||
|
||||
- Verify `claude-agent-sdk` is installed (check requirements.txt, pyproject.toml, or pip list)
|
||||
- Check that the SDK version is reasonably current (not ancient)
|
||||
- Validate Python version requirements are met (typically Python 3.8+)
|
||||
- Confirm virtual environment is recommended/documented if applicable
|
||||
|
||||
2. **Python Environment Setup**:
|
||||
|
||||
- Check for requirements.txt or pyproject.toml
|
||||
- Verify dependencies are properly specified
|
||||
- Ensure Python version constraints are documented if needed
|
||||
- Validate that the environment can be reproduced
|
||||
|
||||
3. **SDK Usage and Patterns**:
|
||||
|
||||
- Verify correct imports from `claude_agent_sdk` (or appropriate SDK module)
|
||||
- Check that agents are properly initialized according to SDK docs
|
||||
- Validate that agent configuration follows SDK patterns (system prompts, models, etc.)
|
||||
- Ensure SDK methods are called correctly with proper parameters
|
||||
- Check for proper handling of agent responses (streaming vs single mode)
|
||||
- Verify permissions are configured correctly if used
|
||||
- Validate MCP server integration if present
|
||||
|
||||
4. **Code Quality**:
|
||||
|
||||
- Check for basic syntax errors
|
||||
- Verify imports are correct and available
|
||||
- Ensure proper error handling
|
||||
- Validate that the code structure makes sense for the SDK
|
||||
|
||||
5. **Environment and Security**:
|
||||
|
||||
- Check that `.env.example` exists with `ANTHROPIC_API_KEY`
|
||||
- Verify `.env` is in `.gitignore`
|
||||
- Ensure API keys are not hardcoded in source files
|
||||
- Validate proper error handling around API calls
|
||||
|
||||
6. **SDK Best Practices** (based on official docs):
|
||||
|
||||
- System prompts are clear and well-structured
|
||||
- Appropriate model selection for the use case
|
||||
- Permissions are properly scoped if used
|
||||
- Custom tools (MCP) are correctly integrated if present
|
||||
- Subagents are properly configured if used
|
||||
- Session handling is correct if applicable
|
||||
|
||||
7. **Functionality Validation**:
|
||||
|
||||
- Verify the application structure makes sense for the SDK
|
||||
- Check that agent initialization and execution flow is correct
|
||||
- Ensure error handling covers SDK-specific errors
|
||||
- Validate that the app follows SDK documentation patterns
|
||||
|
||||
8. **Documentation**:
|
||||
- Check for README or basic documentation
|
||||
- Verify setup instructions are present (including virtual environment setup)
|
||||
- Ensure any custom configurations are documented
|
||||
- Confirm installation instructions are clear
|
||||
|
||||
## What NOT to Focus On
|
||||
|
||||
- General code style preferences (PEP 8 formatting, naming conventions, etc.)
|
||||
- Python-specific style choices (snake_case vs camelCase debates)
|
||||
- Import ordering preferences
|
||||
- General Python best practices unrelated to SDK usage
|
||||
|
||||
## Verification Process
|
||||
|
||||
1. **Read the relevant files**:
|
||||
|
||||
- requirements.txt or pyproject.toml
|
||||
- Main application files (main.py, app.py, src/\*, etc.)
|
||||
- .env.example and .gitignore
|
||||
- Any configuration files
|
||||
|
||||
2. **Check SDK Documentation Adherence**:
|
||||
|
||||
- Use WebFetch to reference the official Python SDK docs: https://docs.claude.com/en/api/agent-sdk/python
|
||||
- Compare the implementation against official patterns and recommendations
|
||||
- Note any deviations from documented best practices
|
||||
|
||||
3. **Validate Imports and Syntax**:
|
||||
|
||||
- Check that all imports are correct
|
||||
- Look for obvious syntax errors
|
||||
- Verify SDK is properly imported
|
||||
|
||||
4. **Analyze SDK Usage**:
|
||||
- Verify SDK methods are used correctly
|
||||
- Check that configuration options match SDK documentation
|
||||
- Validate that patterns follow official examples
|
||||
|
||||
## Verification Report Format
|
||||
|
||||
Provide a comprehensive report:
|
||||
|
||||
**Overall Status**: PASS | PASS WITH WARNINGS | FAIL
|
||||
|
||||
**Summary**: Brief overview of findings
|
||||
|
||||
**Critical Issues** (if any):
|
||||
|
||||
- Issues that prevent the app from functioning
|
||||
- Security problems
|
||||
- SDK usage errors that will cause runtime failures
|
||||
- Syntax errors or import problems
|
||||
|
||||
**Warnings** (if any):
|
||||
|
||||
- Suboptimal SDK usage patterns
|
||||
- Missing SDK features that would improve the app
|
||||
- Deviations from SDK documentation recommendations
|
||||
- Missing documentation or setup instructions
|
||||
|
||||
**Passed Checks**:
|
||||
|
||||
- What is correctly configured
|
||||
- SDK features properly implemented
|
||||
- Security measures in place
|
||||
|
||||
**Recommendations**:
|
||||
|
||||
- Specific suggestions for improvement
|
||||
- References to SDK documentation
|
||||
- Next steps for enhancement
|
||||
|
||||
Be thorough but constructive. Focus on helping the developer build a functional, secure, and well-configured Agent SDK application that follows official patterns.
|
||||
@@ -1,145 +0,0 @@
|
||||
---
|
||||
name: agent-sdk-verifier-ts
|
||||
description: Use this agent to verify that a TypeScript Agent SDK application is properly configured, follows SDK best practices and documentation recommendations, and is ready for deployment or testing. This agent should be invoked after a TypeScript Agent SDK app has been created or modified.
|
||||
model: sonnet
|
||||
---
|
||||
|
||||
You are a TypeScript Agent SDK application verifier. Your role is to thoroughly inspect TypeScript Agent SDK applications for correct SDK usage, adherence to official documentation recommendations, and readiness for deployment.
|
||||
|
||||
## Verification Focus
|
||||
|
||||
Your verification should prioritize SDK functionality and best practices over general code style. Focus on:
|
||||
|
||||
1. **SDK Installation and Configuration**:
|
||||
|
||||
- Verify `@anthropic-ai/claude-agent-sdk` is installed
|
||||
- Check that the SDK version is reasonably current (not ancient)
|
||||
- Confirm package.json has `"type": "module"` for ES modules support
|
||||
- Validate that Node.js version requirements are met (check package.json engines field if present)
|
||||
|
||||
2. **TypeScript Configuration**:
|
||||
|
||||
- Verify tsconfig.json exists and has appropriate settings for the SDK
|
||||
- Check module resolution settings (should support ES modules)
|
||||
- Ensure target is modern enough for the SDK
|
||||
- Validate that compilation settings won't break SDK imports
|
||||
|
||||
3. **SDK Usage and Patterns**:
|
||||
|
||||
- Verify correct imports from `@anthropic-ai/claude-agent-sdk`
|
||||
- Check that agents are properly initialized according to SDK docs
|
||||
- Validate that agent configuration follows SDK patterns (system prompts, models, etc.)
|
||||
- Ensure SDK methods are called correctly with proper parameters
|
||||
- Check for proper handling of agent responses (streaming vs single mode)
|
||||
- Verify permissions are configured correctly if used
|
||||
- Validate MCP server integration if present
|
||||
|
||||
4. **Type Safety and Compilation**:
|
||||
|
||||
- Run `npx tsc --noEmit` to check for type errors
|
||||
- Verify that all SDK imports have correct type definitions
|
||||
- Ensure the code compiles without errors
|
||||
- Check that types align with SDK documentation
|
||||
|
||||
5. **Scripts and Build Configuration**:
|
||||
|
||||
- Verify package.json has necessary scripts (build, start, typecheck)
|
||||
- Check that scripts are correctly configured for TypeScript/ES modules
|
||||
- Validate that the application can be built and run
|
||||
|
||||
6. **Environment and Security**:
|
||||
|
||||
- Check that `.env.example` exists with `ANTHROPIC_API_KEY`
|
||||
- Verify `.env` is in `.gitignore`
|
||||
- Ensure API keys are not hardcoded in source files
|
||||
- Validate proper error handling around API calls
|
||||
|
||||
7. **SDK Best Practices** (based on official docs):
|
||||
|
||||
- System prompts are clear and well-structured
|
||||
- Appropriate model selection for the use case
|
||||
- Permissions are properly scoped if used
|
||||
- Custom tools (MCP) are correctly integrated if present
|
||||
- Subagents are properly configured if used
|
||||
- Session handling is correct if applicable
|
||||
|
||||
8. **Functionality Validation**:
|
||||
|
||||
- Verify the application structure makes sense for the SDK
|
||||
- Check that agent initialization and execution flow is correct
|
||||
- Ensure error handling covers SDK-specific errors
|
||||
- Validate that the app follows SDK documentation patterns
|
||||
|
||||
9. **Documentation**:
|
||||
- Check for README or basic documentation
|
||||
- Verify setup instructions are present if needed
|
||||
- Ensure any custom configurations are documented
|
||||
|
||||
## What NOT to Focus On
|
||||
|
||||
- General code style preferences (formatting, naming conventions, etc.)
|
||||
- Whether developers use `type` vs `interface` or other TypeScript style choices
|
||||
- Unused variable naming conventions
|
||||
- General TypeScript best practices unrelated to SDK usage
|
||||
|
||||
## Verification Process
|
||||
|
||||
1. **Read the relevant files**:
|
||||
|
||||
- package.json
|
||||
- tsconfig.json
|
||||
- Main application files (index.ts, src/\*, etc.)
|
||||
- .env.example and .gitignore
|
||||
- Any configuration files
|
||||
|
||||
2. **Check SDK Documentation Adherence**:
|
||||
|
||||
- Use WebFetch to reference the official TypeScript SDK docs: https://docs.claude.com/en/api/agent-sdk/typescript
|
||||
- Compare the implementation against official patterns and recommendations
|
||||
- Note any deviations from documented best practices
|
||||
|
||||
3. **Run Type Checking**:
|
||||
|
||||
- Execute `npx tsc --noEmit` to verify no type errors
|
||||
- Report any compilation issues
|
||||
|
||||
4. **Analyze SDK Usage**:
|
||||
- Verify SDK methods are used correctly
|
||||
- Check that configuration options match SDK documentation
|
||||
- Validate that patterns follow official examples
|
||||
|
||||
## Verification Report Format
|
||||
|
||||
Provide a comprehensive report:
|
||||
|
||||
**Overall Status**: PASS | PASS WITH WARNINGS | FAIL
|
||||
|
||||
**Summary**: Brief overview of findings
|
||||
|
||||
**Critical Issues** (if any):
|
||||
|
||||
- Issues that prevent the app from functioning
|
||||
- Security problems
|
||||
- SDK usage errors that will cause runtime failures
|
||||
- Type errors or compilation failures
|
||||
|
||||
**Warnings** (if any):
|
||||
|
||||
- Suboptimal SDK usage patterns
|
||||
- Missing SDK features that would improve the app
|
||||
- Deviations from SDK documentation recommendations
|
||||
- Missing documentation
|
||||
|
||||
**Passed Checks**:
|
||||
|
||||
- What is correctly configured
|
||||
- SDK features properly implemented
|
||||
- Security measures in place
|
||||
|
||||
**Recommendations**:
|
||||
|
||||
- Specific suggestions for improvement
|
||||
- References to SDK documentation
|
||||
- Next steps for enhancement
|
||||
|
||||
Be thorough but constructive. Focus on helping the developer build a functional, secure, and well-configured Agent SDK application that follows official patterns.
|
||||
@@ -1,176 +0,0 @@
|
||||
---
|
||||
description: Create and setup a new Claude Agent SDK application
|
||||
argument-hint: [project-name]
|
||||
---
|
||||
|
||||
You are tasked with helping the user create a new Claude Agent SDK application. Follow these steps carefully:
|
||||
|
||||
## Reference Documentation
|
||||
|
||||
Before starting, review the official documentation to ensure you provide accurate and up-to-date guidance. Use WebFetch to read these pages:
|
||||
|
||||
1. **Start with the overview**: https://docs.claude.com/en/api/agent-sdk/overview
|
||||
2. **Based on the user's language choice, read the appropriate SDK reference**:
|
||||
- TypeScript: https://docs.claude.com/en/api/agent-sdk/typescript
|
||||
- Python: https://docs.claude.com/en/api/agent-sdk/python
|
||||
3. **Read relevant guides mentioned in the overview** such as:
|
||||
- Streaming vs Single Mode
|
||||
- Permissions
|
||||
- Custom Tools
|
||||
- MCP integration
|
||||
- Subagents
|
||||
- Sessions
|
||||
- Any other relevant guides based on the user's needs
|
||||
|
||||
**IMPORTANT**: Always check for and use the latest versions of packages. Use WebSearch or WebFetch to verify current versions before installation.
|
||||
|
||||
## Gather Requirements
|
||||
|
||||
IMPORTANT: Ask these questions one at a time. Wait for the user's response before asking the next question. This makes it easier for the user to respond.
|
||||
|
||||
Ask the questions in this order (skip any that the user has already provided via arguments):
|
||||
|
||||
1. **Language** (ask first): "Would you like to use TypeScript or Python?"
|
||||
|
||||
- Wait for response before continuing
|
||||
|
||||
2. **Project name** (ask second): "What would you like to name your project?"
|
||||
|
||||
- If $ARGUMENTS is provided, use that as the project name and skip this question
|
||||
- Wait for response before continuing
|
||||
|
||||
3. **Agent type** (ask third, but skip if #2 was sufficiently detailed): "What kind of agent are you building? Some examples:
|
||||
|
||||
- Coding agent (SRE, security review, code review)
|
||||
- Business agent (customer support, content creation)
|
||||
- Custom agent (describe your use case)"
|
||||
- Wait for response before continuing
|
||||
|
||||
4. **Starting point** (ask fourth): "Would you like:
|
||||
|
||||
- A minimal 'Hello World' example to start
|
||||
- A basic agent with common features
|
||||
- A specific example based on your use case"
|
||||
- Wait for response before continuing
|
||||
|
||||
5. **Tooling choice** (ask fifth): Let the user know what tools you'll use, and confirm with them that these are the tools they want to use (for example, they may prefer pnpm or bun over npm). Respect the user's preferences when executing on the requirements.
|
||||
|
||||
After all questions are answered, proceed to create the setup plan.
|
||||
|
||||
## Setup Plan
|
||||
|
||||
Based on the user's answers, create a plan that includes:
|
||||
|
||||
1. **Project initialization**:
|
||||
|
||||
- Create project directory (if it doesn't exist)
|
||||
- Initialize package manager:
|
||||
- TypeScript: `npm init -y` and setup `package.json` with type: "module" and scripts (include a "typecheck" script)
|
||||
- Python: Create `requirements.txt` or use `poetry init`
|
||||
- Add necessary configuration files:
|
||||
- TypeScript: Create `tsconfig.json` with proper settings for the SDK
|
||||
- Python: Optionally create config files if needed
|
||||
|
||||
2. **Check for Latest Versions**:
|
||||
|
||||
- BEFORE installing, use WebSearch or check npm/PyPI to find the latest version
|
||||
- For TypeScript: Check https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk
|
||||
- For Python: Check https://pypi.org/project/claude-agent-sdk/
|
||||
- Inform the user which version you're installing
|
||||
|
||||
3. **SDK Installation**:
|
||||
|
||||
- TypeScript: `npm install @anthropic-ai/claude-agent-sdk@latest` (or specify latest version)
|
||||
- Python: `pip install claude-agent-sdk` (pip installs latest by default)
|
||||
- After installation, verify the installed version:
|
||||
- TypeScript: Check package.json or run `npm list @anthropic-ai/claude-agent-sdk`
|
||||
- Python: Run `pip show claude-agent-sdk`
|
||||
|
||||
4. **Create starter files**:
|
||||
|
||||
- TypeScript: Create an `index.ts` or `src/index.ts` with a basic query example
|
||||
- Python: Create a `main.py` with a basic query example
|
||||
- Include proper imports and basic error handling
|
||||
- Use modern, up-to-date syntax and patterns from the latest SDK version
|
||||
|
||||
5. **Environment setup**:
|
||||
|
||||
- Create a `.env.example` file with `ANTHROPIC_API_KEY=your_api_key_here`
|
||||
- Add `.env` to `.gitignore`
|
||||
- Explain how to get an API key from https://console.anthropic.com/
|
||||
|
||||
6. **Optional: Create .claude directory structure**:
|
||||
- Offer to create `.claude/` directory for agents, commands, and settings
|
||||
- Ask if they want any example subagents or slash commands
|
||||
|
||||
## Implementation
|
||||
|
||||
After gathering requirements and getting user confirmation on the plan:
|
||||
|
||||
1. Check for latest package versions using WebSearch or WebFetch
|
||||
2. Execute the setup steps
|
||||
3. Create all necessary files
|
||||
4. Install dependencies (always use latest stable versions)
|
||||
5. Verify installed versions and inform the user
|
||||
6. Create a working example based on their agent type
|
||||
7. Add helpful comments in the code explaining what each part does
|
||||
8. **VERIFY THE CODE WORKS BEFORE FINISHING**:
|
||||
- For TypeScript:
|
||||
- Run `npx tsc --noEmit` to check for type errors
|
||||
- Fix ALL type errors until types pass completely
|
||||
- Ensure imports and types are correct
|
||||
- Only proceed when type checking passes with no errors
|
||||
- For Python:
|
||||
- Verify imports are correct
|
||||
- Check for basic syntax errors
|
||||
- **DO NOT consider the setup complete until the code verifies successfully**
|
||||
|
||||
## Verification
|
||||
|
||||
After all files are created and dependencies are installed, use the appropriate verifier agent to validate that the Agent SDK application is properly configured and ready for use:
|
||||
|
||||
1. **For TypeScript projects**: Launch the **agent-sdk-verifier-ts** agent to validate the setup
|
||||
2. **For Python projects**: Launch the **agent-sdk-verifier-py** agent to validate the setup
|
||||
3. The agent will check SDK usage, configuration, functionality, and adherence to official documentation
|
||||
4. Review the verification report and address any issues
|
||||
|
||||
## Getting Started Guide
|
||||
|
||||
Once setup is complete and verified, provide the user with:
|
||||
|
||||
1. **Next steps**:
|
||||
|
||||
- How to set their API key
|
||||
- How to run their agent:
|
||||
- TypeScript: `npm start` or `node --loader ts-node/esm index.ts`
|
||||
- Python: `python main.py`
|
||||
|
||||
2. **Useful resources**:
|
||||
|
||||
- Link to TypeScript SDK reference: https://docs.claude.com/en/api/agent-sdk/typescript
|
||||
- Link to Python SDK reference: https://docs.claude.com/en/api/agent-sdk/python
|
||||
- Explain key concepts: system prompts, permissions, tools, MCP servers
|
||||
|
||||
3. **Common next steps**:
|
||||
- How to customize the system prompt
|
||||
- How to add custom tools via MCP
|
||||
- How to configure permissions
|
||||
- How to create subagents
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **ALWAYS USE LATEST VERSIONS**: Before installing any packages, check for the latest versions using WebSearch or by checking npm/PyPI directly
|
||||
- **VERIFY CODE RUNS CORRECTLY**:
|
||||
- For TypeScript: Run `npx tsc --noEmit` and fix ALL type errors before finishing
|
||||
- For Python: Verify syntax and imports are correct
|
||||
- Do NOT consider the task complete until the code passes verification
|
||||
- Verify the installed version after installation and inform the user
|
||||
- Check the official documentation for any version-specific requirements (Node.js version, Python version, etc.)
|
||||
- Always check if directories/files already exist before creating them
|
||||
- Use the user's preferred package manager (npm, yarn, pnpm for TypeScript; pip, poetry for Python)
|
||||
- Ensure all code examples are functional and include proper error handling
|
||||
- Use modern syntax and patterns that are compatible with the latest SDK version
|
||||
- Make the experience interactive and educational
|
||||
- **ASK QUESTIONS ONE AT A TIME** - Do not ask multiple questions in a single response
|
||||
|
||||
Begin by asking the FIRST requirement question only. Wait for the user's answer before proceeding to the next question.
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "claude-opus-4-5-migration",
|
||||
"version": "1.0.0",
|
||||
"description": "Migrate your code and prompts from Sonnet 4.x and Opus 4.1 to Opus 4.5.",
|
||||
"author": {
|
||||
"name": "William Hu",
|
||||
"email": "whu@anthropic.com"
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
# Claude Opus 4.5 Migration Plugin
|
||||
|
||||
Migrate your code and prompts from Sonnet 4.x and Opus 4.1 to Opus 4.5.
|
||||
|
||||
## Overview
|
||||
|
||||
This skill updates your code and prompts to be compatible with Opus 4.5. It automates the migration process, handling model strings, beta headers, and other configuration details. If you run into any issues with Opus 4.5 after migration, you can continue using this skill to adjust your prompts.
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
"Migrate my codebase to Opus 4.5"
|
||||
```
|
||||
|
||||
## Learn More
|
||||
|
||||
Refer to our [prompting guide](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-4-best-practices) for best practices on prompting Claude models.
|
||||
|
||||
## Authors
|
||||
|
||||
William Hu (whu@anthropic.com)
|
||||
@@ -1,105 +0,0 @@
|
||||
---
|
||||
name: claude-opus-4-5-migration
|
||||
description: Migrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5. Use when the user wants to update their codebase, prompts, or API calls to use Opus 4.5. Handles model string updates and prompt adjustments for known Opus 4.5 behavioral differences. Does NOT migrate Haiku 4.5.
|
||||
---
|
||||
|
||||
# Opus 4.5 Migration Guide
|
||||
|
||||
One-shot migration from Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5.
|
||||
|
||||
## Migration Workflow
|
||||
|
||||
1. Search codebase for model strings and API calls
|
||||
2. Update model strings to Opus 4.5 (see platform-specific strings below)
|
||||
3. Remove unsupported beta headers
|
||||
4. Add effort parameter set to `"high"` (see `references/effort.md`)
|
||||
5. Summarize all changes made
|
||||
6. Tell the user: "If you encounter any issues with Opus 4.5, let me know and I can help adjust your prompts."
|
||||
|
||||
## Model String Updates
|
||||
|
||||
Identify which platform the codebase uses, then replace model strings accordingly.
|
||||
|
||||
### Unsupported Beta Headers
|
||||
|
||||
Remove the `context-1m-2025-08-07` beta header if present—it is not yet supported with Opus 4.5. Leave a comment noting this:
|
||||
|
||||
```python
|
||||
# Note: 1M context beta (context-1m-2025-08-07) not yet supported with Opus 4.5
|
||||
```
|
||||
|
||||
### Target Model Strings (Opus 4.5)
|
||||
|
||||
| Platform | Opus 4.5 Model String |
|
||||
|----------|----------------------|
|
||||
| Anthropic API (1P) | `claude-opus-4-5-20251101` |
|
||||
| AWS Bedrock | `anthropic.claude-opus-4-5-20251101-v1:0` |
|
||||
| Google Vertex AI | `claude-opus-4-5@20251101` |
|
||||
| Azure AI Foundry | `claude-opus-4-5-20251101` |
|
||||
|
||||
### Source Model Strings to Replace
|
||||
|
||||
| Source Model | Anthropic API (1P) | AWS Bedrock | Google Vertex AI |
|
||||
|--------------|-------------------|-------------|------------------|
|
||||
| Sonnet 4.0 | `claude-sonnet-4-20250514` | `anthropic.claude-sonnet-4-20250514-v1:0` | `claude-sonnet-4@20250514` |
|
||||
| Sonnet 4.5 | `claude-sonnet-4-5-20250929` | `anthropic.claude-sonnet-4-5-20250929-v1:0` | `claude-sonnet-4-5@20250929` |
|
||||
| Opus 4.1 | `claude-opus-4-1-20250422` | `anthropic.claude-opus-4-1-20250422-v1:0` | `claude-opus-4-1@20250422` |
|
||||
|
||||
**Do NOT migrate**: Any Haiku models (e.g., `claude-haiku-4-5-20251001`).
|
||||
|
||||
## Prompt Adjustments
|
||||
|
||||
Opus 4.5 has known behavioral differences from previous models. **Only apply these fixes if the user explicitly requests them or reports a specific issue.** By default, just update model strings.
|
||||
|
||||
**Integration guidelines**: When adding snippets, don't just append them to prompts. Integrate them thoughtfully:
|
||||
- Use XML tags (e.g., `<code_guidelines>`, `<tool_usage>`) to organize additions
|
||||
- Match the style and structure of the existing prompt
|
||||
- Place snippets in logical locations (e.g., coding guidelines near other coding instructions)
|
||||
- If the prompt already uses XML tags, add new content within appropriate existing tags or create consistent new ones
|
||||
|
||||
### 1. Tool Overtriggering
|
||||
|
||||
Opus 4.5 is more responsive to system prompts. Aggressive language that prevented undertriggering on previous models may now cause overtriggering.
|
||||
|
||||
**Apply if**: User reports tools being called too frequently or unnecessarily.
|
||||
|
||||
**Find and soften**:
|
||||
- `CRITICAL:` → remove or soften
|
||||
- `You MUST...` → `You should...`
|
||||
- `ALWAYS do X` → `Do X`
|
||||
- `NEVER skip...` → `Don't skip...`
|
||||
- `REQUIRED` → remove or soften
|
||||
|
||||
Only apply to tool-triggering instructions. Leave other uses of emphasis alone.
|
||||
|
||||
### 2. Over-Engineering Prevention
|
||||
|
||||
Opus 4.5 tends to create extra files, add unnecessary abstractions, or build unrequested flexibility.
|
||||
|
||||
**Apply if**: User reports unwanted files, excessive abstraction, or unrequested features. Add the snippet from `references/prompt-snippets.md`.
|
||||
|
||||
### 3. Code Exploration
|
||||
|
||||
Opus 4.5 can be overly conservative about exploring code, proposing solutions without reading files.
|
||||
|
||||
**Apply if**: User reports the model proposing fixes without inspecting relevant code. Add the snippet from `references/prompt-snippets.md`.
|
||||
|
||||
### 4. Frontend Design
|
||||
|
||||
**Apply if**: User requests improved frontend design quality or reports generic-looking outputs.
|
||||
|
||||
Add the frontend aesthetics snippet from `references/prompt-snippets.md`.
|
||||
|
||||
### 5. Thinking Sensitivity
|
||||
|
||||
When extended thinking is not enabled (the default), Opus 4.5 is particularly sensitive to the word "think" and its variants. Extended thinking is enabled only if the API request contains a `thinking` parameter.
|
||||
|
||||
**Apply if**: User reports issues related to "thinking" while extended thinking is not enabled (no `thinking` parameter in request).
|
||||
|
||||
Replace "think" with alternatives like "consider," "believe," or "evaluate."
|
||||
|
||||
## Reference
|
||||
|
||||
See `references/prompt-snippets.md` for the full text of each snippet to add.
|
||||
|
||||
See `references/effort.md` for configuring the effort parameter (only if user requests it).
|
||||
-70
@@ -1,70 +0,0 @@
|
||||
# Effort Parameter (Beta)
|
||||
|
||||
**Add effort set to `"high"` during migration.** This is the default configuration for best performance with Opus 4.5.
|
||||
|
||||
## Overview
|
||||
|
||||
Effort controls how eagerly Claude spends tokens. It affects all tokens: thinking, text responses, and function calls.
|
||||
|
||||
| Effort | Use Case |
|
||||
|--------|----------|
|
||||
| `high` | Best performance, deep reasoning (default) |
|
||||
| `medium` | Balance of cost/latency vs. performance |
|
||||
| `low` | Simple, high-volume queries; significant token savings |
|
||||
|
||||
## Implementation
|
||||
|
||||
Requires beta flag `effort-2025-11-24` in API calls.
|
||||
|
||||
**Python SDK:**
|
||||
```python
|
||||
response = client.messages.create(
|
||||
model="claude-opus-4-5-20251101",
|
||||
max_tokens=1024,
|
||||
betas=["effort-2025-11-24"],
|
||||
output_config={
|
||||
"effort": "high" # or "medium" or "low"
|
||||
},
|
||||
messages=[...]
|
||||
)
|
||||
```
|
||||
|
||||
**TypeScript SDK:**
|
||||
```typescript
|
||||
const response = await client.messages.create({
|
||||
model: "claude-opus-4-5-20251101",
|
||||
max_tokens: 1024,
|
||||
betas: ["effort-2025-11-24"],
|
||||
output_config: {
|
||||
effort: "high" // or "medium" or "low"
|
||||
},
|
||||
messages: [...]
|
||||
});
|
||||
```
|
||||
|
||||
**Raw API:**
|
||||
```json
|
||||
{
|
||||
"model": "claude-opus-4-5-20251101",
|
||||
"max_tokens": 1024,
|
||||
"anthropic-beta": "effort-2025-11-24",
|
||||
"output_config": {
|
||||
"effort": "high"
|
||||
},
|
||||
"messages": [...]
|
||||
}
|
||||
```
|
||||
|
||||
## Effort vs. Thinking Budget
|
||||
|
||||
Effort is independent of thinking budget:
|
||||
|
||||
- High effort + no thinking = more tokens, but no thinking tokens
|
||||
- High effort + 32k thinking = more tokens, but thinking capped at 32k
|
||||
|
||||
## Recommendations
|
||||
|
||||
1. First determine effort level, then set thinking budget
|
||||
2. Best performance: high effort + high thinking budget
|
||||
3. Cost/latency optimization: medium effort
|
||||
4. Simple high-volume queries: low effort
|
||||
-106
@@ -1,106 +0,0 @@
|
||||
# Prompt Snippets for Opus 4.5
|
||||
|
||||
Only apply these snippets if the user explicitly requests them or reports a specific issue. By default, the migration should only update model strings.
|
||||
|
||||
## 1. Tool Overtriggering
|
||||
|
||||
**Problem**: Prompts designed to reduce undertriggering on previous models may cause Opus 4.5 to overtrigger.
|
||||
|
||||
**When to add**: User reports tools being called too frequently or unnecessarily.
|
||||
|
||||
**Solution**: Replace aggressive language with normal phrasing.
|
||||
|
||||
| Before | After |
|
||||
|--------|-------|
|
||||
| `CRITICAL: You MUST use this tool when...` | `Use this tool when...` |
|
||||
| `ALWAYS call the search function before...` | `Call the search function before...` |
|
||||
| `You are REQUIRED to...` | `You should...` |
|
||||
| `NEVER skip this step` | `Don't skip this step` |
|
||||
|
||||
## 2. Over-Engineering Prevention
|
||||
|
||||
**Problem**: Opus 4.5 may create extra files, add unnecessary abstractions, or build unrequested flexibility.
|
||||
|
||||
**When to add**: User reports unwanted files, excessive abstraction, or unrequested features.
|
||||
|
||||
**Snippet to add to system prompt**:
|
||||
|
||||
```
|
||||
- Avoid over-engineering. Only make changes that are directly requested or clearly necessary. Keep solutions simple and focused.
|
||||
- Don't add features, refactor code, or make "improvements" beyond what was asked. A bug fix doesn't need surrounding code cleaned up. A simple feature doesn't need extra configurability.
|
||||
- Don't add error handling, fallbacks, or validation for scenarios that can't happen. Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs). Don't use backwards-compatibility shims when you can just change the code.
|
||||
- Don't create helpers, utilities, or abstractions for one-time operations. Don't design for hypothetical future requirements. The right amount of complexity is the minimum needed for the current task. Reuse existing abstractions where possible and follow the DRY principle.
|
||||
```
|
||||
|
||||
## 3. Code Exploration
|
||||
|
||||
**Problem**: Opus 4.5 may propose solutions without reading code or make assumptions about unread files.
|
||||
|
||||
**When to add**: User reports the model proposing fixes without inspecting relevant code.
|
||||
|
||||
**Snippet to add to system prompt**:
|
||||
|
||||
```
|
||||
ALWAYS read and understand relevant files before proposing code edits. Do not speculate about code you have not inspected. If the user references a specific file/path, you MUST open and inspect it before explaining or proposing fixes. Be rigorous and persistent in searching code for key facts. Thoroughly review the style, conventions, and abstractions of the codebase before implementing new features or abstractions.
|
||||
```
|
||||
|
||||
## 4. Frontend Design Quality
|
||||
|
||||
**Problem**: Default frontend outputs may look generic ("AI slop" aesthetic).
|
||||
|
||||
**When to add**: User requests improved frontend design quality or reports generic-looking outputs.
|
||||
|
||||
**Snippet to add to system prompt**:
|
||||
|
||||
```xml
|
||||
<frontend_aesthetics>
|
||||
You tend to converge toward generic, "on distribution" outputs. In frontend design, this creates what users call the "AI slop" aesthetic. Avoid this: make creative, distinctive frontends that surprise and delight.
|
||||
|
||||
Focus on:
|
||||
- Typography: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics.
|
||||
- Color & Theme: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. Draw from IDE themes and cultural aesthetics for inspiration.
|
||||
- Motion: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions.
|
||||
- Backgrounds: Create atmosphere and depth rather than defaulting to solid colors. Layer CSS gradients, use geometric patterns, or add contextual effects that match the overall aesthetic.
|
||||
|
||||
Avoid generic AI-generated aesthetics:
|
||||
- Overused font families (Inter, Roboto, Arial, system fonts)
|
||||
- Clichéd color schemes (particularly purple gradients on white backgrounds)
|
||||
- Predictable layouts and component patterns
|
||||
- Cookie-cutter design that lacks context-specific character
|
||||
|
||||
Interpret creatively and make unexpected choices that feel genuinely designed for the context. Vary between light and dark themes, different fonts, different aesthetics. You still tend to converge on common choices (Space Grotesk, for example) across generations. Avoid this: it is critical that you think outside the box!
|
||||
</frontend_aesthetics>
|
||||
```
|
||||
|
||||
## 5. Thinking Sensitivity
|
||||
|
||||
**Problem**: When extended thinking is not enabled (the default), Opus 4.5 is particularly sensitive to the word "think" and its variants.
|
||||
|
||||
Extended thinking is not enabled by default. It is only enabled if the API request contains a `thinking` parameter:
|
||||
```json
|
||||
"thinking": {
|
||||
"type": "enabled",
|
||||
"budget_tokens": 10000
|
||||
}
|
||||
```
|
||||
|
||||
**When to apply**: User reports issues related to "thinking" while extended thinking is not enabled (no `thinking` parameter in their request).
|
||||
|
||||
**Solution**: Replace "think" with alternative words.
|
||||
|
||||
| Before | After |
|
||||
|--------|-------|
|
||||
| `think about` | `consider` |
|
||||
| `think through` | `evaluate` |
|
||||
| `I think` | `I believe` |
|
||||
| `think carefully` | `consider carefully` |
|
||||
| `thinking` | `reasoning` / `considering` |
|
||||
|
||||
## Usage Guidelines
|
||||
|
||||
1. **Integrate thoughtfully** - Don't just append snippets; weave them into the existing prompt structure
|
||||
2. **Use XML tags** - Wrap additions in descriptive tags (e.g., `<coding_guidelines>`, `<tool_behavior>`) that match or complement existing prompt structure
|
||||
3. **Match prompt style** - If the prompt is concise, trim the snippet; if verbose, keep full detail
|
||||
4. **Place logically** - Put coding snippets near other coding instructions, tool guidance near tool definitions, etc.
|
||||
5. **Preserve existing content** - Insert snippets without removing functional content
|
||||
6. **Summarize changes** - After migration, list all model string updates and prompt modifications made
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"name": "code-review",
|
||||
"description": "Automated code review for pull requests using multiple specialized agents with confidence-based scoring",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Boris Cherny",
|
||||
"email": "boris@anthropic.com"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,258 +0,0 @@
|
||||
# Code Review Plugin
|
||||
|
||||
Automated code review for pull requests using multiple specialized agents with confidence-based scoring to filter false positives.
|
||||
|
||||
## Overview
|
||||
|
||||
The Code Review Plugin automates pull request review by launching multiple agents in parallel to independently audit changes from different perspectives. It uses confidence scoring to filter out false positives, ensuring only high-quality, actionable feedback is posted.
|
||||
|
||||
## Commands
|
||||
|
||||
### `/code-review`
|
||||
|
||||
Performs automated code review on a pull request using multiple specialized agents.
|
||||
|
||||
**What it does:**
|
||||
1. Checks if review is needed (skips closed, draft, trivial, or already-reviewed PRs)
|
||||
2. Gathers relevant CLAUDE.md guideline files from the repository
|
||||
3. Summarizes the pull request changes
|
||||
4. Launches 4 parallel agents to independently review:
|
||||
- **Agents #1 & #2**: Audit for CLAUDE.md compliance
|
||||
- **Agent #3**: Scan for obvious bugs in changes
|
||||
- **Agent #4**: Analyze git blame/history for context-based issues
|
||||
5. Scores each issue 0-100 for confidence level
|
||||
6. Filters out issues below 80 confidence threshold
|
||||
7. Outputs review (to terminal by default, or as PR comment with `--comment` flag)
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
/code-review [--comment]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--comment`: Post the review as a comment on the pull request (default: outputs to terminal only)
|
||||
|
||||
**Example workflow:**
|
||||
```bash
|
||||
# On a PR branch, run locally (outputs to terminal):
|
||||
/code-review
|
||||
|
||||
# Post review as PR comment:
|
||||
/code-review --comment
|
||||
|
||||
# Claude will:
|
||||
# - Launch 4 review agents in parallel
|
||||
# - Score each issue for confidence
|
||||
# - Output issues ≥80 confidence (to terminal or PR depending on flag)
|
||||
# - Skip if no high-confidence issues found
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Multiple independent agents for comprehensive review
|
||||
- Confidence-based scoring reduces false positives (threshold: 80)
|
||||
- CLAUDE.md compliance checking with explicit guideline verification
|
||||
- Bug detection focused on changes (not pre-existing issues)
|
||||
- Historical context analysis via git blame
|
||||
- Automatic skipping of closed, draft, or already-reviewed PRs
|
||||
- Links directly to code with full SHA and line ranges
|
||||
|
||||
**Review comment format:**
|
||||
```markdown
|
||||
## Code review
|
||||
|
||||
Found 3 issues:
|
||||
|
||||
1. Missing error handling for OAuth callback (CLAUDE.md says "Always handle OAuth errors")
|
||||
|
||||
https://github.com/owner/repo/blob/abc123.../src/auth.ts#L67-L72
|
||||
|
||||
2. Memory leak: OAuth state not cleaned up (bug due to missing cleanup in finally block)
|
||||
|
||||
https://github.com/owner/repo/blob/abc123.../src/auth.ts#L88-L95
|
||||
|
||||
3. Inconsistent naming pattern (src/conventions/CLAUDE.md says "Use camelCase for functions")
|
||||
|
||||
https://github.com/owner/repo/blob/abc123.../src/utils.ts#L23-L28
|
||||
```
|
||||
|
||||
**Confidence scoring:**
|
||||
- **0**: Not confident, false positive
|
||||
- **25**: Somewhat confident, might be real
|
||||
- **50**: Moderately confident, real but minor
|
||||
- **75**: Highly confident, real and important
|
||||
- **100**: Absolutely certain, definitely real
|
||||
|
||||
**False positives filtered:**
|
||||
- Pre-existing issues not introduced in PR
|
||||
- Code that looks like a bug but isn't
|
||||
- Pedantic nitpicks
|
||||
- Issues linters will catch
|
||||
- General quality issues (unless in CLAUDE.md)
|
||||
- Issues with lint ignore comments
|
||||
|
||||
## Installation
|
||||
|
||||
This plugin is included in the Claude Code repository. The command is automatically available when using Claude Code.
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Using `/code-review`
|
||||
- Maintain clear CLAUDE.md files for better compliance checking
|
||||
- Trust the 80+ confidence threshold - false positives are filtered
|
||||
- Run on all non-trivial pull requests
|
||||
- Review agent findings as a starting point for human review
|
||||
- Update CLAUDE.md based on recurring review patterns
|
||||
|
||||
### When to use
|
||||
- All pull requests with meaningful changes
|
||||
- PRs touching critical code paths
|
||||
- PRs from multiple contributors
|
||||
- PRs where guideline compliance matters
|
||||
|
||||
### When not to use
|
||||
- Closed or draft PRs (automatically skipped anyway)
|
||||
- Trivial automated PRs (automatically skipped)
|
||||
- Urgent hotfixes requiring immediate merge
|
||||
- PRs already reviewed (automatically skipped)
|
||||
|
||||
## Workflow Integration
|
||||
|
||||
### Standard PR review workflow:
|
||||
```bash
|
||||
# Create PR with changes
|
||||
# Run local review (outputs to terminal)
|
||||
/code-review
|
||||
|
||||
# Review the automated feedback
|
||||
# Make any necessary fixes
|
||||
|
||||
# Optionally post as PR comment
|
||||
/code-review --comment
|
||||
|
||||
# Merge when ready
|
||||
```
|
||||
|
||||
### As part of CI/CD:
|
||||
```bash
|
||||
# Trigger on PR creation or update
|
||||
# Use --comment flag to post review comments
|
||||
/code-review --comment
|
||||
# Skip if review already exists
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
- Git repository with GitHub integration
|
||||
- GitHub CLI (`gh`) installed and authenticated
|
||||
- CLAUDE.md files (optional but recommended for guideline checking)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Review takes too long
|
||||
|
||||
**Issue**: Agents are slow on large PRs
|
||||
|
||||
**Solution**:
|
||||
- Normal for large changes - agents run in parallel
|
||||
- 4 independent agents ensure thoroughness
|
||||
- Consider splitting large PRs into smaller ones
|
||||
|
||||
### Too many false positives
|
||||
|
||||
**Issue**: Review flags issues that aren't real
|
||||
|
||||
**Solution**:
|
||||
- Default threshold is 80 (already filters most false positives)
|
||||
- Make CLAUDE.md more specific about what matters
|
||||
- Consider if the flagged issue is actually valid
|
||||
|
||||
### No review comment posted
|
||||
|
||||
**Issue**: `/code-review` runs but no comment appears
|
||||
|
||||
**Solution**:
|
||||
Check if:
|
||||
- PR is closed (reviews skipped)
|
||||
- PR is draft (reviews skipped)
|
||||
- PR is trivial/automated (reviews skipped)
|
||||
- PR already has review (reviews skipped)
|
||||
- No issues scored ≥80 (no comment needed)
|
||||
|
||||
### Link formatting broken
|
||||
|
||||
**Issue**: Code links don't render correctly in GitHub
|
||||
|
||||
**Solution**:
|
||||
Links must follow this exact format:
|
||||
```
|
||||
https://github.com/owner/repo/blob/[full-sha]/path/file.ext#L[start]-L[end]
|
||||
```
|
||||
- Must use full SHA (not abbreviated)
|
||||
- Must use `#L` notation
|
||||
- Must include line range with at least 1 line of context
|
||||
|
||||
### GitHub CLI not working
|
||||
|
||||
**Issue**: `gh` commands fail
|
||||
|
||||
**Solution**:
|
||||
- Install GitHub CLI: `brew install gh` (macOS) or see [GitHub CLI installation](https://cli.github.com/)
|
||||
- Authenticate: `gh auth login`
|
||||
- Verify repository has GitHub remote
|
||||
|
||||
## Tips
|
||||
|
||||
- **Write specific CLAUDE.md files**: Clear guidelines = better reviews
|
||||
- **Include context in PRs**: Helps agents understand intent
|
||||
- **Use confidence scores**: Issues ≥80 are usually correct
|
||||
- **Iterate on guidelines**: Update CLAUDE.md based on patterns
|
||||
- **Review automatically**: Set up as part of PR workflow
|
||||
- **Trust the filtering**: Threshold prevents noise
|
||||
|
||||
## Configuration
|
||||
|
||||
### Adjusting confidence threshold
|
||||
|
||||
The default threshold is 80. To adjust, modify the command file at `commands/code-review.md`:
|
||||
```markdown
|
||||
Filter out any issues with a score less than 80.
|
||||
```
|
||||
|
||||
Change `80` to your preferred threshold (0-100).
|
||||
|
||||
### Customizing review focus
|
||||
|
||||
Edit `commands/code-review.md` to add or modify agent tasks:
|
||||
- Add security-focused agents
|
||||
- Add performance analysis agents
|
||||
- Add accessibility checking agents
|
||||
- Add documentation quality checks
|
||||
|
||||
## Technical Details
|
||||
|
||||
### Agent architecture
|
||||
- **2x CLAUDE.md compliance agents**: Redundancy for guideline checks
|
||||
- **1x bug detector**: Focused on obvious bugs in changes only
|
||||
- **1x history analyzer**: Context from git blame and history
|
||||
- **Nx confidence scorers**: One per issue for independent scoring
|
||||
|
||||
### Scoring system
|
||||
- Each issue independently scored 0-100
|
||||
- Scoring considers evidence strength and verification
|
||||
- Threshold (default 80) filters low-confidence issues
|
||||
- For CLAUDE.md issues: verifies guideline explicitly mentions it
|
||||
|
||||
### GitHub integration
|
||||
Uses `gh` CLI for:
|
||||
- Viewing PR details and diffs
|
||||
- Fetching repository data
|
||||
- Reading git blame and history
|
||||
- Posting review comments
|
||||
|
||||
## Author
|
||||
|
||||
Boris Cherny (boris@anthropic.com)
|
||||
|
||||
## Version
|
||||
|
||||
1.0.0
|
||||
@@ -1,109 +0,0 @@
|
||||
---
|
||||
allowed-tools: Bash(gh issue view:*), Bash(gh search:*), Bash(gh issue list:*), Bash(gh pr comment:*), Bash(gh pr diff:*), Bash(gh pr view:*), Bash(gh pr list:*), mcp__github_inline_comment__create_inline_comment
|
||||
description: Code review a pull request
|
||||
---
|
||||
|
||||
Provide a code review for the given pull request.
|
||||
|
||||
**Agent assumptions (applies to all agents and subagents):**
|
||||
- All tools are functional and will work without error. Do not test tools or make exploratory calls. Make sure this is clear to every subagent that is launched.
|
||||
- Only call a tool if it is required to complete the task. Every tool call should have a clear purpose.
|
||||
|
||||
To do this, follow these steps precisely:
|
||||
|
||||
1. Launch a haiku agent to check if any of the following are true:
|
||||
- The pull request is closed
|
||||
- The pull request is a draft
|
||||
- The pull request does not need code review (e.g. automated PR, trivial change that is obviously correct)
|
||||
- Claude has already commented on this PR (check `gh pr view <PR> --comments` for comments left by claude)
|
||||
|
||||
If any condition is true, stop and do not proceed.
|
||||
|
||||
Note: Still review Claude generated PR's.
|
||||
|
||||
2. Launch a haiku agent to return a list of file paths (not their contents) for all relevant CLAUDE.md files including:
|
||||
- The root CLAUDE.md file, if it exists
|
||||
- Any CLAUDE.md files in directories containing files modified by the pull request
|
||||
|
||||
3. Launch a sonnet agent to view the pull request and return a summary of the changes
|
||||
|
||||
4. Launch 4 agents in parallel to independently review the changes. Each agent should return the list of issues, where each issue includes a description and the reason it was flagged (e.g. "CLAUDE.md adherence", "bug"). The agents should do the following:
|
||||
|
||||
Agents 1 + 2: CLAUDE.md compliance sonnet agents
|
||||
Audit changes for CLAUDE.md compliance in parallel. Note: When evaluating CLAUDE.md compliance for a file, you should only consider CLAUDE.md files that share a file path with the file or parents.
|
||||
|
||||
Agent 3: Opus bug agent (parallel subagent with agent 4)
|
||||
Scan for obvious bugs. Focus only on the diff itself without reading extra context. Flag only significant bugs; ignore nitpicks and likely false positives. Do not flag issues that you cannot validate without looking at context outside of the git diff.
|
||||
|
||||
Agent 4: Opus bug agent (parallel subagent with agent 3)
|
||||
Look for problems that exist in the introduced code. This could be security issues, incorrect logic, etc. Only look for issues that fall within the changed code.
|
||||
|
||||
**CRITICAL: We only want HIGH SIGNAL issues.** Flag issues where:
|
||||
- The code will fail to compile or parse (syntax errors, type errors, missing imports, unresolved references)
|
||||
- The code will definitely produce wrong results regardless of inputs (clear logic errors)
|
||||
- Clear, unambiguous CLAUDE.md violations where you can quote the exact rule being broken
|
||||
|
||||
Do NOT flag:
|
||||
- Code style or quality concerns
|
||||
- Potential issues that depend on specific inputs or state
|
||||
- Subjective suggestions or improvements
|
||||
|
||||
If you are not certain an issue is real, do not flag it. False positives erode trust and waste reviewer time.
|
||||
|
||||
In addition to the above, each subagent should be told the PR title and description. This will help provide context regarding the author's intent.
|
||||
|
||||
5. For each issue found in the previous step by agents 3 and 4, launch parallel subagents to validate the issue. These subagents should get the PR title and description along with a description of the issue. The agent's job is to review the issue to validate that the stated issue is truly an issue with high confidence. For example, if an issue such as "variable is not defined" was flagged, the subagent's job would be to validate that is actually true in the code. Another example would be CLAUDE.md issues. The agent should validate that the CLAUDE.md rule that was violated is scoped for this file and is actually violated. Use Opus subagents for bugs and logic issues, and sonnet agents for CLAUDE.md violations.
|
||||
|
||||
6. Filter out any issues that were not validated in step 5. This step will give us our list of high signal issues for our review.
|
||||
|
||||
7. Output a summary of the review findings to the terminal:
|
||||
- If issues were found, list each issue with a brief description.
|
||||
- If no issues were found, state: "No issues found. Checked for bugs and CLAUDE.md compliance."
|
||||
|
||||
If `--comment` argument was NOT provided, stop here. Do not post any GitHub comments.
|
||||
|
||||
If `--comment` argument IS provided and NO issues were found, post a summary comment using `gh pr comment` and stop.
|
||||
|
||||
If `--comment` argument IS provided and issues were found, continue to step 8.
|
||||
|
||||
8. Create a list of all comments that you plan on leaving. This is only for you to make sure you are comfortable with the comments. Do not post this list anywhere.
|
||||
|
||||
9. Post inline comments for each issue using `mcp__github_inline_comment__create_inline_comment` with `confirmed: true`. For each comment:
|
||||
- Provide a brief description of the issue
|
||||
- For small, self-contained fixes, include a committable suggestion block
|
||||
- For larger fixes (6+ lines, structural changes, or changes spanning multiple locations), describe the issue and suggested fix without a suggestion block
|
||||
- Never post a committable suggestion UNLESS committing the suggestion fixes the issue entirely. If follow up steps are required, do not leave a committable suggestion.
|
||||
|
||||
**IMPORTANT: Only post ONE comment per unique issue. Do not post duplicate comments.**
|
||||
|
||||
Use this list when evaluating issues in Steps 4 and 5 (these are false positives, do NOT flag):
|
||||
|
||||
- Pre-existing issues
|
||||
- Something that appears to be a bug but is actually correct
|
||||
- Pedantic nitpicks that a senior engineer would not flag
|
||||
- Issues that a linter will catch (do not run the linter to verify)
|
||||
- General code quality concerns (e.g., lack of test coverage, general security issues) unless explicitly required in CLAUDE.md
|
||||
- Issues mentioned in CLAUDE.md but explicitly silenced in the code (e.g., via a lint ignore comment)
|
||||
|
||||
Notes:
|
||||
|
||||
- Use gh CLI to interact with GitHub (e.g., fetch pull requests, create comments). Do not use web fetch.
|
||||
- Create a todo list before starting.
|
||||
- You must cite and link each issue in inline comments (e.g., if referring to a CLAUDE.md, include a link to it).
|
||||
- If no issues are found and `--comment` argument is provided, post a comment with the following format:
|
||||
|
||||
---
|
||||
|
||||
## Code review
|
||||
|
||||
No issues found. Checked for bugs and CLAUDE.md compliance.
|
||||
|
||||
---
|
||||
|
||||
- When linking to code in inline comments, follow the following format precisely, otherwise the Markdown preview won't render correctly: https://github.com/anthropics/claude-code/blob/c21d3c10bc8e898b7ac1a2d745bdc9bc4e423afe/package.json#L10-L15
|
||||
- Requires full git sha
|
||||
- You must provide the full sha. Commands like `https://github.com/owner/repo/blob/$(git rev-parse HEAD)/foo/bar` will not work, since your comment will be directly rendered in Markdown.
|
||||
- Repo name must match the repo you're code reviewing
|
||||
- # sign after the file name
|
||||
- Line range format is L[start]-L[end]
|
||||
- Provide at least 1 line of context before and after, centered on the line you are commenting about (eg. if you are commenting about lines 5-6, you should link to `L4-7`)
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"name": "commit-commands",
|
||||
"description": "Streamline your git workflow with simple commands for committing, pushing, and creating pull requests",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Anthropic",
|
||||
"email": "support@anthropic.com"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,225 +0,0 @@
|
||||
# Commit Commands Plugin
|
||||
|
||||
Streamline your git workflow with simple commands for committing, pushing, and creating pull requests.
|
||||
|
||||
## Overview
|
||||
|
||||
The Commit Commands Plugin automates common git operations, reducing context switching and manual command execution. Instead of running multiple git commands, use a single slash command to handle your entire workflow.
|
||||
|
||||
## Commands
|
||||
|
||||
### `/commit`
|
||||
|
||||
Creates a git commit with an automatically generated commit message based on staged and unstaged changes.
|
||||
|
||||
**What it does:**
|
||||
1. Analyzes current git status
|
||||
2. Reviews both staged and unstaged changes
|
||||
3. Examines recent commit messages to match your repository's style
|
||||
4. Drafts an appropriate commit message
|
||||
5. Stages relevant files
|
||||
6. Creates the commit
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
/commit
|
||||
```
|
||||
|
||||
**Example workflow:**
|
||||
```bash
|
||||
# Make some changes to your code
|
||||
# Then simply run:
|
||||
/commit
|
||||
|
||||
# Claude will:
|
||||
# - Review your changes
|
||||
# - Stage the files
|
||||
# - Create a commit with an appropriate message
|
||||
# - Show you the commit status
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Automatically drafts commit messages that match your repo's style
|
||||
- Follows conventional commit practices
|
||||
- Avoids committing files with secrets (.env, credentials.json)
|
||||
- Includes Claude Code attribution in commit message
|
||||
|
||||
### `/commit-push-pr`
|
||||
|
||||
Complete workflow command that commits, pushes, and creates a pull request in one step.
|
||||
|
||||
**What it does:**
|
||||
1. Creates a new branch (if currently on main)
|
||||
2. Stages and commits changes with an appropriate message
|
||||
3. Pushes the branch to origin
|
||||
4. Creates a pull request using `gh pr create`
|
||||
5. Provides the PR URL
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
/commit-push-pr
|
||||
```
|
||||
|
||||
**Example workflow:**
|
||||
```bash
|
||||
# Make your changes
|
||||
# Then run:
|
||||
/commit-push-pr
|
||||
|
||||
# Claude will:
|
||||
# - Create a feature branch (if needed)
|
||||
# - Commit your changes
|
||||
# - Push to remote
|
||||
# - Open a PR with summary and test plan
|
||||
# - Give you the PR URL to review
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Analyzes all commits in the branch (not just the latest)
|
||||
- Creates comprehensive PR descriptions with:
|
||||
- Summary of changes (1-3 bullet points)
|
||||
- Test plan checklist
|
||||
- Claude Code attribution
|
||||
- Handles branch creation automatically
|
||||
- Uses GitHub CLI (`gh`) for PR creation
|
||||
|
||||
**Requirements:**
|
||||
- GitHub CLI (`gh`) must be installed and authenticated
|
||||
- Repository must have a remote named `origin`
|
||||
|
||||
### `/clean_gone`
|
||||
|
||||
Cleans up local branches that have been deleted from the remote repository.
|
||||
|
||||
**What it does:**
|
||||
1. Lists all local branches to identify [gone] status
|
||||
2. Identifies and removes worktrees associated with [gone] branches
|
||||
3. Deletes all branches marked as [gone]
|
||||
4. Provides feedback on removed branches
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
/clean_gone
|
||||
```
|
||||
|
||||
**Example workflow:**
|
||||
```bash
|
||||
# After PRs are merged and remote branches are deleted
|
||||
/clean_gone
|
||||
|
||||
# Claude will:
|
||||
# - Find all branches marked as [gone]
|
||||
# - Remove any associated worktrees
|
||||
# - Delete the stale local branches
|
||||
# - Report what was cleaned up
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Handles both regular branches and worktree branches
|
||||
- Safely removes worktrees before deleting branches
|
||||
- Shows clear feedback about what was removed
|
||||
- Reports if no cleanup was needed
|
||||
|
||||
**When to use:**
|
||||
- After merging and deleting remote branches
|
||||
- When your local branch list is cluttered with stale branches
|
||||
- During regular repository maintenance
|
||||
|
||||
## Installation
|
||||
|
||||
This plugin is included in the Claude Code repository. The commands are automatically available when using Claude Code.
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Using `/commit`
|
||||
- Review the staged changes before committing
|
||||
- Let Claude analyze your changes and match your repo's commit style
|
||||
- Trust the automated message, but verify it's accurate
|
||||
- Use for routine commits during development
|
||||
|
||||
### Using `/commit-push-pr`
|
||||
- Use when you're ready to create a PR
|
||||
- Ensure all your changes are complete and tested
|
||||
- Claude will analyze the full branch history for the PR description
|
||||
- Review the PR description and edit if needed
|
||||
- Use when you want to minimize context switching
|
||||
|
||||
### Using `/clean_gone`
|
||||
- Run periodically to keep your branch list clean
|
||||
- Especially useful after merging multiple PRs
|
||||
- Safe to run - only removes branches already deleted remotely
|
||||
- Helps maintain a tidy local repository
|
||||
|
||||
## Workflow Integration
|
||||
|
||||
### Quick commit workflow:
|
||||
```bash
|
||||
# Write code
|
||||
/commit
|
||||
# Continue development
|
||||
```
|
||||
|
||||
### Feature branch workflow:
|
||||
```bash
|
||||
# Develop feature across multiple commits
|
||||
/commit # First commit
|
||||
# More changes
|
||||
/commit # Second commit
|
||||
# Ready to create PR
|
||||
/commit-push-pr
|
||||
```
|
||||
|
||||
### Maintenance workflow:
|
||||
```bash
|
||||
# After several PRs are merged
|
||||
/clean_gone
|
||||
# Clean workspace ready for next feature
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
- Git must be installed and configured
|
||||
- For `/commit-push-pr`: GitHub CLI (`gh`) must be installed and authenticated
|
||||
- Repository must be a git repository with a remote
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### `/commit` creates empty commit
|
||||
|
||||
**Issue**: No changes to commit
|
||||
|
||||
**Solution**:
|
||||
- Ensure you have unstaged or staged changes
|
||||
- Run `git status` to verify changes exist
|
||||
|
||||
### `/commit-push-pr` fails to create PR
|
||||
|
||||
**Issue**: `gh pr create` command fails
|
||||
|
||||
**Solution**:
|
||||
- Install GitHub CLI: `brew install gh` (macOS) or see [GitHub CLI installation](https://cli.github.com/)
|
||||
- Authenticate: `gh auth login`
|
||||
- Ensure repository has a GitHub remote
|
||||
|
||||
### `/clean_gone` doesn't find branches
|
||||
|
||||
**Issue**: No branches marked as [gone]
|
||||
|
||||
**Solution**:
|
||||
- Run `git fetch --prune` to update remote tracking
|
||||
- Branches must be deleted from the remote to show as [gone]
|
||||
|
||||
## Tips
|
||||
|
||||
- **Combine with other tools**: Use `/commit` during development, then `/commit-push-pr` when ready
|
||||
- **Let Claude draft messages**: The commit message analysis learns from your repo's style
|
||||
- **Regular cleanup**: Run `/clean_gone` weekly to maintain a clean branch list
|
||||
- **Review before pushing**: Always review the commit message and changes before pushing
|
||||
|
||||
## Author
|
||||
|
||||
Anthropic (support@anthropic.com)
|
||||
|
||||
## Version
|
||||
|
||||
1.0.0
|
||||
@@ -1,53 +0,0 @@
|
||||
---
|
||||
description: Cleans up all git branches marked as [gone] (branches that have been deleted on the remote but still exist locally), including removing associated worktrees.
|
||||
---
|
||||
|
||||
## Your Task
|
||||
|
||||
You need to execute the following bash commands to clean up stale local branches that have been deleted from the remote repository.
|
||||
|
||||
## Commands to Execute
|
||||
|
||||
1. **First, list branches to identify any with [gone] status**
|
||||
Execute this command:
|
||||
```bash
|
||||
git branch -v
|
||||
```
|
||||
|
||||
Note: Branches with a '+' prefix have associated worktrees and must have their worktrees removed before deletion.
|
||||
|
||||
2. **Next, identify worktrees that need to be removed for [gone] branches**
|
||||
Execute this command:
|
||||
```bash
|
||||
git worktree list
|
||||
```
|
||||
|
||||
3. **Finally, remove worktrees and delete [gone] branches (handles both regular and worktree branches)**
|
||||
Execute this command:
|
||||
```bash
|
||||
# Process all [gone] branches, removing '+' prefix if present
|
||||
git branch -v | grep '\[gone\]' | sed 's/^[+* ]//' | awk '{print $1}' | while read branch; do
|
||||
echo "Processing branch: $branch"
|
||||
# Find and remove worktree if it exists
|
||||
worktree=$(git worktree list | grep "\\[$branch\\]" | awk '{print $1}')
|
||||
if [ ! -z "$worktree" ] && [ "$worktree" != "$(git rev-parse --show-toplevel)" ]; then
|
||||
echo " Removing worktree: $worktree"
|
||||
git worktree remove --force "$worktree"
|
||||
fi
|
||||
# Delete the branch
|
||||
echo " Deleting branch: $branch"
|
||||
git branch -D "$branch"
|
||||
done
|
||||
```
|
||||
|
||||
## Expected Behavior
|
||||
|
||||
After executing these commands, you will:
|
||||
|
||||
- See a list of all local branches with their status
|
||||
- Identify and remove any worktrees associated with [gone] branches
|
||||
- Delete all branches marked as [gone]
|
||||
- Provide feedback on which worktrees and branches were removed
|
||||
|
||||
If no branches are marked as [gone], report that no cleanup was needed.
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
---
|
||||
allowed-tools: Bash(git checkout --branch:*), Bash(git add:*), Bash(git status:*), Bash(git push:*), Bash(git commit:*), Bash(gh pr create:*)
|
||||
description: Commit, push, and open a PR
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Current git status: !`git status`
|
||||
- Current git diff (staged and unstaged changes): !`git diff HEAD`
|
||||
- Current branch: !`git branch --show-current`
|
||||
|
||||
## Your task
|
||||
|
||||
Based on the above changes:
|
||||
|
||||
1. Create a new branch if on main
|
||||
2. Create a single commit with an appropriate message
|
||||
3. Push the branch to origin
|
||||
4. Create a pull request using `gh pr create`
|
||||
5. You have the capability to call multiple tools in a single response. You MUST do all of the above in a single message. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)
|
||||
description: Create a git commit
|
||||
---
|
||||
|
||||
## Context
|
||||
|
||||
- Current git status: !`git status`
|
||||
- Current git diff (staged and unstaged changes): !`git diff HEAD`
|
||||
- Current branch: !`git branch --show-current`
|
||||
- Recent commits: !`git log --oneline -10`
|
||||
|
||||
## Your task
|
||||
|
||||
Based on the above changes, create a single git commit.
|
||||
|
||||
You have the capability to call multiple tools in a single response. Stage and create the commit using a single message. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "explanatory-output-style",
|
||||
"version": "1.0.0",
|
||||
"description": "Adds educational insights about implementation choices and codebase patterns (mimics the deprecated Explanatory output style)",
|
||||
"author": {
|
||||
"name": "Dickson Tsai",
|
||||
"email": "dickson@anthropic.com"
|
||||
}
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
# Explanatory Output Style Plugin
|
||||
|
||||
This plugin recreates the deprecated Explanatory output style as a SessionStart
|
||||
hook.
|
||||
|
||||
WARNING: Do not install this plugin unless you are fine with incurring the token
|
||||
cost of this plugin's additional instructions and output.
|
||||
|
||||
## What it does
|
||||
|
||||
When enabled, this plugin automatically adds instructions at the start of each
|
||||
session that encourage Claude to:
|
||||
|
||||
1. Provide educational insights about implementation choices
|
||||
2. Explain codebase patterns and decisions
|
||||
3. Balance task completion with learning opportunities
|
||||
|
||||
## How it works
|
||||
|
||||
The plugin uses a SessionStart hook to inject additional context into every
|
||||
session. This context instructs Claude to provide brief educational explanations
|
||||
before and after writing code, formatted as:
|
||||
|
||||
```
|
||||
`★ Insight ─────────────────────────────────────`
|
||||
[2-3 key educational points]
|
||||
`─────────────────────────────────────────────────`
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Once installed, the plugin activates automatically at the start of every
|
||||
session. No additional configuration is needed.
|
||||
|
||||
The insights focus on:
|
||||
|
||||
- Specific implementation choices for your codebase
|
||||
- Patterns and conventions in your code
|
||||
- Trade-offs and design decisions
|
||||
- Codebase-specific details rather than general programming concepts
|
||||
|
||||
## Migration from Output Styles
|
||||
|
||||
This plugin replaces the deprecated "Explanatory" output style setting. If you
|
||||
previously used:
|
||||
|
||||
```json
|
||||
{
|
||||
"outputStyle": "Explanatory"
|
||||
}
|
||||
```
|
||||
|
||||
You can now achieve the same behavior by installing this plugin instead.
|
||||
|
||||
More generally, this SessionStart hook pattern is roughly equivalent to
|
||||
CLAUDE.md, but it is more flexible and allows for distribution through plugins.
|
||||
|
||||
Note: Output styles that involve tasks besides software development, are better
|
||||
expressed as
|
||||
[subagents](https://docs.claude.com/en/docs/claude-code/sub-agents), not as
|
||||
SessionStart hooks. Subagents change the system prompt while SessionStart hooks
|
||||
add to the default system prompt.
|
||||
|
||||
## Managing changes
|
||||
|
||||
- Disable the plugin - keep the code installed on your device
|
||||
- Uninstall the plugin - remove the code from your device
|
||||
- Update the plugin - create a local copy of this plugin to personalize this
|
||||
plugin
|
||||
- Hint: Ask Claude to read
|
||||
https://docs.claude.com/en/docs/claude-code/plugins.md and set it up for
|
||||
you!
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Output the explanatory mode instructions as additionalContext
|
||||
# This mimics the deprecated Explanatory output style
|
||||
|
||||
cat << 'EOF'
|
||||
{
|
||||
"hookSpecificOutput": {
|
||||
"hookEventName": "SessionStart",
|
||||
"additionalContext": "You are in 'explanatory' output style mode, where you should provide educational insights about the codebase as you help with the user's task.\n\nYou should be clear and educational, providing helpful explanations while remaining focused on the task. Balance educational content with task completion. When providing insights, you may exceed typical length constraints, but remain focused and relevant.\n\n## Insights\nIn order to encourage learning, before and after writing code, always provide brief educational explanations about implementation choices using (with backticks):\n\"`★ Insight ─────────────────────────────────────`\n[2-3 key educational points]\n`─────────────────────────────────────────────────`\"\n\nThese insights should be included in the conversation, not in the codebase. You should generally focus on interesting insights that are specific to the codebase or the code you just wrote, rather than general programming concepts. Do not wait until the end to provide insights. Provide them as you write code."
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
exit 0
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
"description": "Explanatory mode hook that adds educational insights instructions",
|
||||
"hooks": {
|
||||
"SessionStart": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "${CLAUDE_PLUGIN_ROOT}/hooks-handlers/session-start.sh"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "feature-dev",
|
||||
"version": "1.0.0",
|
||||
"description": "Comprehensive feature development workflow with specialized agents for codebase exploration, architecture design, and quality review",
|
||||
"author": {
|
||||
"name": "Sid Bidasaria",
|
||||
"email": "sbidasaria@anthropic.com"
|
||||
}
|
||||
}
|
||||
@@ -1,412 +0,0 @@
|
||||
# Feature Development Plugin
|
||||
|
||||
A comprehensive, structured workflow for feature development with specialized agents for codebase exploration, architecture design, and quality review.
|
||||
|
||||
## Overview
|
||||
|
||||
The Feature Development Plugin provides a systematic 7-phase approach to building new features. Instead of jumping straight into code, it guides you through understanding the codebase, asking clarifying questions, designing architecture, and ensuring quality—resulting in better-designed features that integrate seamlessly with your existing code.
|
||||
|
||||
## Philosophy
|
||||
|
||||
Building features requires more than just writing code. You need to:
|
||||
- **Understand the codebase** before making changes
|
||||
- **Ask questions** to clarify ambiguous requirements
|
||||
- **Design thoughtfully** before implementing
|
||||
- **Review for quality** after building
|
||||
|
||||
This plugin embeds these practices into a structured workflow that runs automatically when you use the `/feature-dev` command.
|
||||
|
||||
## Command: `/feature-dev`
|
||||
|
||||
Launches a guided feature development workflow with 7 distinct phases.
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
/feature-dev Add user authentication with OAuth
|
||||
```
|
||||
|
||||
Or simply:
|
||||
```bash
|
||||
/feature-dev
|
||||
```
|
||||
|
||||
The command will guide you through the entire process interactively.
|
||||
|
||||
## The 7-Phase Workflow
|
||||
|
||||
### Phase 1: Discovery
|
||||
|
||||
**Goal**: Understand what needs to be built
|
||||
|
||||
**What happens:**
|
||||
- Clarifies the feature request if it's unclear
|
||||
- Asks what problem you're solving
|
||||
- Identifies constraints and requirements
|
||||
- Summarizes understanding and confirms with you
|
||||
|
||||
**Example:**
|
||||
```
|
||||
You: /feature-dev Add caching
|
||||
Claude: Let me understand what you need...
|
||||
- What should be cached? (API responses, computed values, etc.)
|
||||
- What are your performance requirements?
|
||||
- Do you have a preferred caching solution?
|
||||
```
|
||||
|
||||
### Phase 2: Codebase Exploration
|
||||
|
||||
**Goal**: Understand relevant existing code and patterns
|
||||
|
||||
**What happens:**
|
||||
- Launches 2-3 `code-explorer` agents in parallel
|
||||
- Each agent explores different aspects (similar features, architecture, UI patterns)
|
||||
- Agents return comprehensive analyses with key files to read
|
||||
- Claude reads all identified files to build deep understanding
|
||||
- Presents comprehensive summary of findings
|
||||
|
||||
**Agents launched:**
|
||||
- "Find features similar to [feature] and trace implementation"
|
||||
- "Map the architecture and abstractions for [area]"
|
||||
- "Analyze current implementation of [related feature]"
|
||||
|
||||
**Example output:**
|
||||
```
|
||||
Found similar features:
|
||||
- User authentication (src/auth/): Uses JWT tokens, middleware pattern
|
||||
- Session management (src/session/): Redis-backed, 24hr expiry
|
||||
- API security (src/api/middleware/): Rate limiting, CORS
|
||||
|
||||
Key files to understand:
|
||||
- src/auth/AuthService.ts:45 - Core authentication logic
|
||||
- src/middleware/authMiddleware.ts:12 - Request authentication
|
||||
- src/config/security.ts:8 - Security configuration
|
||||
```
|
||||
|
||||
### Phase 3: Clarifying Questions
|
||||
|
||||
**Goal**: Fill in gaps and resolve all ambiguities
|
||||
|
||||
**What happens:**
|
||||
- Reviews codebase findings and feature request
|
||||
- Identifies underspecified aspects:
|
||||
- Edge cases
|
||||
- Error handling
|
||||
- Integration points
|
||||
- Backward compatibility
|
||||
- Performance needs
|
||||
- Presents all questions in an organized list
|
||||
- **Waits for your answers before proceeding**
|
||||
|
||||
**Example:**
|
||||
```
|
||||
Before designing the architecture, I need to clarify:
|
||||
|
||||
1. OAuth provider: Which OAuth providers? (Google, GitHub, custom?)
|
||||
2. User data: Store OAuth tokens or just user profile?
|
||||
3. Existing auth: Replace current auth or add alongside?
|
||||
4. Sessions: Integrate with existing session management?
|
||||
5. Error handling: How to handle OAuth failures?
|
||||
```
|
||||
|
||||
**Critical**: This phase ensures nothing is ambiguous before design begins.
|
||||
|
||||
### Phase 4: Architecture Design
|
||||
|
||||
**Goal**: Design multiple implementation approaches
|
||||
|
||||
**What happens:**
|
||||
- Launches 2-3 `code-architect` agents with different focuses:
|
||||
- **Minimal changes**: Smallest change, maximum reuse
|
||||
- **Clean architecture**: Maintainability, elegant abstractions
|
||||
- **Pragmatic balance**: Speed + quality
|
||||
- Reviews all approaches
|
||||
- Forms opinion on which fits best for this task
|
||||
- Presents comparison with trade-offs and recommendation
|
||||
- **Asks which approach you prefer**
|
||||
|
||||
**Example output:**
|
||||
```
|
||||
I've designed 3 approaches:
|
||||
|
||||
Approach 1: Minimal Changes
|
||||
- Extend existing AuthService with OAuth methods
|
||||
- Add new OAuth routes to existing auth router
|
||||
- Minimal refactoring required
|
||||
Pros: Fast, low risk
|
||||
Cons: Couples OAuth to existing auth, harder to test
|
||||
|
||||
Approach 2: Clean Architecture
|
||||
- New OAuthService with dedicated interface
|
||||
- Separate OAuth router and middleware
|
||||
- Refactor AuthService to use common interface
|
||||
Pros: Clean separation, testable, maintainable
|
||||
Cons: More files, more refactoring
|
||||
|
||||
Approach 3: Pragmatic Balance
|
||||
- New OAuthProvider abstraction
|
||||
- Integrate into existing AuthService
|
||||
- Minimal refactoring, good boundaries
|
||||
Pros: Balanced complexity and cleanliness
|
||||
Cons: Some coupling remains
|
||||
|
||||
Recommendation: Approach 3 - gives you clean boundaries without
|
||||
excessive refactoring, and fits your existing architecture well.
|
||||
|
||||
Which approach would you like to use?
|
||||
```
|
||||
|
||||
### Phase 5: Implementation
|
||||
|
||||
**Goal**: Build the feature
|
||||
|
||||
**What happens:**
|
||||
- **Waits for explicit approval** before starting
|
||||
- Reads all relevant files identified in previous phases
|
||||
- Implements following chosen architecture
|
||||
- Follows codebase conventions strictly
|
||||
- Writes clean, well-documented code
|
||||
- Updates todos as progress is made
|
||||
|
||||
**Notes:**
|
||||
- Implementation only starts after you approve
|
||||
- Follows patterns discovered in Phase 2
|
||||
- Uses architecture designed in Phase 4
|
||||
- Continuously tracks progress
|
||||
|
||||
### Phase 6: Quality Review
|
||||
|
||||
**Goal**: Ensure code is simple, DRY, elegant, and functionally correct
|
||||
|
||||
**What happens:**
|
||||
- Launches 3 `code-reviewer` agents in parallel with different focuses:
|
||||
- **Simplicity/DRY/Elegance**: Code quality and maintainability
|
||||
- **Bugs/Correctness**: Functional correctness and logic errors
|
||||
- **Conventions/Abstractions**: Project standards and patterns
|
||||
- Consolidates findings
|
||||
- Identifies highest severity issues
|
||||
- **Presents findings and asks what you want to do**:
|
||||
- Fix now
|
||||
- Fix later
|
||||
- Proceed as-is
|
||||
- Addresses issues based on your decision
|
||||
|
||||
**Example output:**
|
||||
```
|
||||
Code Review Results:
|
||||
|
||||
High Priority Issues:
|
||||
1. Missing error handling in OAuth callback (src/auth/oauth.ts:67)
|
||||
2. Memory leak: OAuth state not cleaned up (src/auth/oauth.ts:89)
|
||||
|
||||
Medium Priority:
|
||||
1. Could simplify token refresh logic (src/auth/oauth.ts:120)
|
||||
2. Consider extracting OAuth config validation
|
||||
|
||||
All tests pass. Code follows project conventions.
|
||||
|
||||
What would you like to do?
|
||||
```
|
||||
|
||||
### Phase 7: Summary
|
||||
|
||||
**Goal**: Document what was accomplished
|
||||
|
||||
**What happens:**
|
||||
- Marks all todos complete
|
||||
- Summarizes:
|
||||
- What was built
|
||||
- Key decisions made
|
||||
- Files modified
|
||||
- Suggested next steps
|
||||
|
||||
**Example:**
|
||||
```
|
||||
Feature Complete: OAuth Authentication
|
||||
|
||||
What was built:
|
||||
- OAuth provider abstraction supporting Google and GitHub
|
||||
- OAuth routes and middleware integrated with existing auth
|
||||
- Token refresh and session integration
|
||||
- Error handling for all OAuth flows
|
||||
|
||||
Key decisions:
|
||||
- Used pragmatic approach with OAuthProvider abstraction
|
||||
- Integrated with existing session management
|
||||
- Added OAuth state to prevent CSRF
|
||||
|
||||
Files modified:
|
||||
- src/auth/OAuthProvider.ts (new)
|
||||
- src/auth/AuthService.ts
|
||||
- src/routes/auth.ts
|
||||
- src/middleware/authMiddleware.ts
|
||||
|
||||
Suggested next steps:
|
||||
- Add tests for OAuth flows
|
||||
- Add more OAuth providers (Microsoft, Apple)
|
||||
- Update documentation
|
||||
```
|
||||
|
||||
## Agents
|
||||
|
||||
### `code-explorer`
|
||||
|
||||
**Purpose**: Deeply analyzes existing codebase features by tracing execution paths
|
||||
|
||||
**Focus areas:**
|
||||
- Entry points and call chains
|
||||
- Data flow and transformations
|
||||
- Architecture layers and patterns
|
||||
- Dependencies and integrations
|
||||
- Implementation details
|
||||
|
||||
**When triggered:**
|
||||
- Automatically in Phase 2
|
||||
- Can be invoked manually when exploring code
|
||||
|
||||
**Output:**
|
||||
- Entry points with file:line references
|
||||
- Step-by-step execution flow
|
||||
- Key components and responsibilities
|
||||
- Architecture insights
|
||||
- List of essential files to read
|
||||
|
||||
### `code-architect`
|
||||
|
||||
**Purpose**: Designs feature architectures and implementation blueprints
|
||||
|
||||
**Focus areas:**
|
||||
- Codebase pattern analysis
|
||||
- Architecture decisions
|
||||
- Component design
|
||||
- Implementation roadmap
|
||||
- Data flow and build sequence
|
||||
|
||||
**When triggered:**
|
||||
- Automatically in Phase 4
|
||||
- Can be invoked manually for architecture design
|
||||
|
||||
**Output:**
|
||||
- Patterns and conventions found
|
||||
- Architecture decision with rationale
|
||||
- Complete component design
|
||||
- Implementation map with specific files
|
||||
- Build sequence with phases
|
||||
|
||||
### `code-reviewer`
|
||||
|
||||
**Purpose**: Reviews code for bugs, quality issues, and project conventions
|
||||
|
||||
**Focus areas:**
|
||||
- Project guideline compliance (CLAUDE.md)
|
||||
- Bug detection
|
||||
- Code quality issues
|
||||
- Confidence-based filtering (only reports high-confidence issues ≥80)
|
||||
|
||||
**When triggered:**
|
||||
- Automatically in Phase 6
|
||||
- Can be invoked manually after writing code
|
||||
|
||||
**Output:**
|
||||
- Critical issues (confidence 75-100)
|
||||
- Important issues (confidence 50-74)
|
||||
- Specific fixes with file:line references
|
||||
- Project guideline references
|
||||
|
||||
## Usage Patterns
|
||||
|
||||
### Full workflow (recommended for new features):
|
||||
```bash
|
||||
/feature-dev Add rate limiting to API endpoints
|
||||
```
|
||||
|
||||
Let the workflow guide you through all 7 phases.
|
||||
|
||||
### Manual agent invocation:
|
||||
|
||||
**Explore a feature:**
|
||||
```
|
||||
"Launch code-explorer to trace how authentication works"
|
||||
```
|
||||
|
||||
**Design architecture:**
|
||||
```
|
||||
"Launch code-architect to design the caching layer"
|
||||
```
|
||||
|
||||
**Review code:**
|
||||
```
|
||||
"Launch code-reviewer to check my recent changes"
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use the full workflow for complex features**: The 7 phases ensure thorough planning
|
||||
2. **Answer clarifying questions thoughtfully**: Phase 3 prevents future confusion
|
||||
3. **Choose architecture deliberately**: Phase 4 gives you options for a reason
|
||||
4. **Don't skip code review**: Phase 6 catches issues before they reach production
|
||||
5. **Read the suggested files**: Phase 2 identifies key files—read them to understand context
|
||||
|
||||
## When to Use This Plugin
|
||||
|
||||
**Use for:**
|
||||
- New features that touch multiple files
|
||||
- Features requiring architectural decisions
|
||||
- Complex integrations with existing code
|
||||
- Features where requirements are somewhat unclear
|
||||
|
||||
**Don't use for:**
|
||||
- Single-line bug fixes
|
||||
- Trivial changes
|
||||
- Well-defined, simple tasks
|
||||
- Urgent hotfixes
|
||||
|
||||
## Requirements
|
||||
|
||||
- Claude Code installed
|
||||
- Git repository (for code review)
|
||||
- Project with existing codebase (workflow assumes existing code to learn from)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Agents take too long
|
||||
|
||||
**Issue**: Code exploration or architecture agents are slow
|
||||
|
||||
**Solution**:
|
||||
- This is normal for large codebases
|
||||
- Agents run in parallel when possible
|
||||
- The thoroughness pays off in better understanding
|
||||
|
||||
### Too many clarifying questions
|
||||
|
||||
**Issue**: Phase 3 asks too many questions
|
||||
|
||||
**Solution**:
|
||||
- Be more specific in your initial feature request
|
||||
- Provide context about constraints upfront
|
||||
- Say "whatever you think is best" if truly no preference
|
||||
|
||||
### Architecture options overwhelming
|
||||
|
||||
**Issue**: Too many architecture options in Phase 4
|
||||
|
||||
**Solution**:
|
||||
- Trust the recommendation—it's based on codebase analysis
|
||||
- If still unsure, ask for more explanation
|
||||
- Pick the pragmatic option when in doubt
|
||||
|
||||
## Tips
|
||||
|
||||
- **Be specific in your feature request**: More detail = fewer clarifying questions
|
||||
- **Trust the process**: Each phase builds on the previous one
|
||||
- **Review agent outputs**: Agents provide valuable insights about your codebase
|
||||
- **Don't skip phases**: Each phase serves a purpose
|
||||
- **Use for learning**: The exploration phase teaches you about your own codebase
|
||||
|
||||
## Author
|
||||
|
||||
Sid Bidasaria (sbidasaria@anthropic.com)
|
||||
|
||||
## Version
|
||||
|
||||
1.0.0
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
name: code-architect
|
||||
description: Designs feature architectures by analyzing existing codebase patterns and conventions, then providing comprehensive implementation blueprints with specific files to create/modify, component designs, data flows, and build sequences
|
||||
tools: Glob, Grep, LS, Read, NotebookRead, WebFetch, TodoWrite, WebSearch, KillShell, BashOutput
|
||||
model: sonnet
|
||||
color: green
|
||||
---
|
||||
|
||||
You are a senior software architect who delivers comprehensive, actionable architecture blueprints by deeply understanding codebases and making confident architectural decisions.
|
||||
|
||||
## Core Process
|
||||
|
||||
**1. Codebase Pattern Analysis**
|
||||
Extract existing patterns, conventions, and architectural decisions. Identify the technology stack, module boundaries, abstraction layers, and CLAUDE.md guidelines. Find similar features to understand established approaches.
|
||||
|
||||
**2. Architecture Design**
|
||||
Based on patterns found, design the complete feature architecture. Make decisive choices - pick one approach and commit. Ensure seamless integration with existing code. Design for testability, performance, and maintainability.
|
||||
|
||||
**3. Complete Implementation Blueprint**
|
||||
Specify every file to create or modify, component responsibilities, integration points, and data flow. Break implementation into clear phases with specific tasks.
|
||||
|
||||
## Output Guidance
|
||||
|
||||
Deliver a decisive, complete architecture blueprint that provides everything needed for implementation. Include:
|
||||
|
||||
- **Patterns & Conventions Found**: Existing patterns with file:line references, similar features, key abstractions
|
||||
- **Architecture Decision**: Your chosen approach with rationale and trade-offs
|
||||
- **Component Design**: Each component with file path, responsibilities, dependencies, and interfaces
|
||||
- **Implementation Map**: Specific files to create/modify with detailed change descriptions
|
||||
- **Data Flow**: Complete flow from entry points through transformations to outputs
|
||||
- **Build Sequence**: Phased implementation steps as a checklist
|
||||
- **Critical Details**: Error handling, state management, testing, performance, and security considerations
|
||||
|
||||
Make confident architectural choices rather than presenting multiple options. Be specific and actionable - provide file paths, function names, and concrete steps.
|
||||
@@ -1,51 +0,0 @@
|
||||
---
|
||||
name: code-explorer
|
||||
description: Deeply analyzes existing codebase features by tracing execution paths, mapping architecture layers, understanding patterns and abstractions, and documenting dependencies to inform new development
|
||||
tools: Glob, Grep, LS, Read, NotebookRead, WebFetch, TodoWrite, WebSearch, KillShell, BashOutput
|
||||
model: sonnet
|
||||
color: yellow
|
||||
---
|
||||
|
||||
You are an expert code analyst specializing in tracing and understanding feature implementations across codebases.
|
||||
|
||||
## Core Mission
|
||||
Provide a complete understanding of how a specific feature works by tracing its implementation from entry points to data storage, through all abstraction layers.
|
||||
|
||||
## Analysis Approach
|
||||
|
||||
**1. Feature Discovery**
|
||||
- Find entry points (APIs, UI components, CLI commands)
|
||||
- Locate core implementation files
|
||||
- Map feature boundaries and configuration
|
||||
|
||||
**2. Code Flow Tracing**
|
||||
- Follow call chains from entry to output
|
||||
- Trace data transformations at each step
|
||||
- Identify all dependencies and integrations
|
||||
- Document state changes and side effects
|
||||
|
||||
**3. Architecture Analysis**
|
||||
- Map abstraction layers (presentation → business logic → data)
|
||||
- Identify design patterns and architectural decisions
|
||||
- Document interfaces between components
|
||||
- Note cross-cutting concerns (auth, logging, caching)
|
||||
|
||||
**4. Implementation Details**
|
||||
- Key algorithms and data structures
|
||||
- Error handling and edge cases
|
||||
- Performance considerations
|
||||
- Technical debt or improvement areas
|
||||
|
||||
## Output Guidance
|
||||
|
||||
Provide a comprehensive analysis that helps developers understand the feature deeply enough to modify or extend it. Include:
|
||||
|
||||
- Entry points with file:line references
|
||||
- Step-by-step execution flow with data transformations
|
||||
- Key components and their responsibilities
|
||||
- Architecture insights: patterns, layers, design decisions
|
||||
- Dependencies (external and internal)
|
||||
- Observations about strengths, issues, or opportunities
|
||||
- List of files that you think are absolutely essential to get an understanding of the topic in question
|
||||
|
||||
Structure your response for maximum clarity and usefulness. Always include specific file paths and line numbers.
|
||||
@@ -1,46 +0,0 @@
|
||||
---
|
||||
name: code-reviewer
|
||||
description: Reviews code for bugs, logic errors, security vulnerabilities, code quality issues, and adherence to project conventions, using confidence-based filtering to report only high-priority issues that truly matter
|
||||
tools: Glob, Grep, LS, Read, NotebookRead, WebFetch, TodoWrite, WebSearch, KillShell, BashOutput
|
||||
model: sonnet
|
||||
color: red
|
||||
---
|
||||
|
||||
You are an expert code reviewer specializing in modern software development across multiple languages and frameworks. Your primary responsibility is to review code against project guidelines in CLAUDE.md with high precision to minimize false positives.
|
||||
|
||||
## Review Scope
|
||||
|
||||
By default, review unstaged changes from `git diff`. The user may specify different files or scope to review.
|
||||
|
||||
## Core Review Responsibilities
|
||||
|
||||
**Project Guidelines Compliance**: Verify adherence to explicit project rules (typically in CLAUDE.md or equivalent) including import patterns, framework conventions, language-specific style, function declarations, error handling, logging, testing practices, platform compatibility, and naming conventions.
|
||||
|
||||
**Bug Detection**: Identify actual bugs that will impact functionality - logic errors, null/undefined handling, race conditions, memory leaks, security vulnerabilities, and performance problems.
|
||||
|
||||
**Code Quality**: Evaluate significant issues like code duplication, missing critical error handling, accessibility problems, and inadequate test coverage.
|
||||
|
||||
## Confidence Scoring
|
||||
|
||||
Rate each potential issue on a scale from 0-100:
|
||||
|
||||
- **0**: Not confident at all. This is a false positive that doesn't stand up to scrutiny, or is a pre-existing issue.
|
||||
- **25**: Somewhat confident. This might be a real issue, but may also be a false positive. If stylistic, it wasn't explicitly called out in project guidelines.
|
||||
- **50**: Moderately confident. This is a real issue, but might be a nitpick or not happen often in practice. Not very important relative to the rest of the changes.
|
||||
- **75**: Highly confident. Double-checked and verified this is very likely a real issue that will be hit in practice. The existing approach is insufficient. Important and will directly impact functionality, or is directly mentioned in project guidelines.
|
||||
- **100**: Absolutely certain. Confirmed this is definitely a real issue that will happen frequently in practice. The evidence directly confirms this.
|
||||
|
||||
**Only report issues with confidence ≥ 80.** Focus on issues that truly matter - quality over quantity.
|
||||
|
||||
## Output Guidance
|
||||
|
||||
Start by clearly stating what you're reviewing. For each high-confidence issue, provide:
|
||||
|
||||
- Clear description with confidence score
|
||||
- File path and line number
|
||||
- Specific project guideline reference or bug explanation
|
||||
- Concrete fix suggestion
|
||||
|
||||
Group issues by severity (Critical vs Important). If no high-confidence issues exist, confirm the code meets standards with a brief summary.
|
||||
|
||||
Structure your response for maximum actionability - developers should know exactly what to fix and why.
|
||||
@@ -1,125 +0,0 @@
|
||||
---
|
||||
description: Guided feature development with codebase understanding and architecture focus
|
||||
argument-hint: Optional feature description
|
||||
---
|
||||
|
||||
# Feature Development
|
||||
|
||||
You are helping a developer implement a new feature. Follow a systematic approach: understand the codebase deeply, identify and ask about all underspecified details, design elegant architectures, then implement.
|
||||
|
||||
## Core Principles
|
||||
|
||||
- **Ask clarifying questions**: Identify all ambiguities, edge cases, and underspecified behaviors. Ask specific, concrete questions rather than making assumptions. Wait for user answers before proceeding with implementation. Ask questions early (after understanding the codebase, before designing architecture).
|
||||
- **Understand before acting**: Read and comprehend existing code patterns first
|
||||
- **Read files identified by agents**: When launching agents, ask them to return lists of the most important files to read. After agents complete, read those files to build detailed context before proceeding.
|
||||
- **Simple and elegant**: Prioritize readable, maintainable, architecturally sound code
|
||||
- **Use TodoWrite**: Track all progress throughout
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Discovery
|
||||
|
||||
**Goal**: Understand what needs to be built
|
||||
|
||||
Initial request: $ARGUMENTS
|
||||
|
||||
**Actions**:
|
||||
1. Create todo list with all phases
|
||||
2. If feature unclear, ask user for:
|
||||
- What problem are they solving?
|
||||
- What should the feature do?
|
||||
- Any constraints or requirements?
|
||||
3. Summarize understanding and confirm with user
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Codebase Exploration
|
||||
|
||||
**Goal**: Understand relevant existing code and patterns at both high and low levels
|
||||
|
||||
**Actions**:
|
||||
1. Launch 2-3 code-explorer agents in parallel. Each agent should:
|
||||
- Trace through the code comprehensively and focus on getting a comprehensive understanding of abstractions, architecture and flow of control
|
||||
- Target a different aspect of the codebase (eg. similar features, high level understanding, architectural understanding, user experience, etc)
|
||||
- Include a list of 5-10 key files to read
|
||||
|
||||
**Example agent prompts**:
|
||||
- "Find features similar to [feature] and trace through their implementation comprehensively"
|
||||
- "Map the architecture and abstractions for [feature area], tracing through the code comprehensively"
|
||||
- "Analyze the current implementation of [existing feature/area], tracing through the code comprehensively"
|
||||
- "Identify UI patterns, testing approaches, or extension points relevant to [feature]"
|
||||
|
||||
2. Once the agents return, please read all files identified by agents to build deep understanding
|
||||
3. Present comprehensive summary of findings and patterns discovered
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Clarifying Questions
|
||||
|
||||
**Goal**: Fill in gaps and resolve all ambiguities before designing
|
||||
|
||||
**CRITICAL**: This is one of the most important phases. DO NOT SKIP.
|
||||
|
||||
**Actions**:
|
||||
1. Review the codebase findings and original feature request
|
||||
2. Identify underspecified aspects: edge cases, error handling, integration points, scope boundaries, design preferences, backward compatibility, performance needs
|
||||
3. **Present all questions to the user in a clear, organized list**
|
||||
4. **Wait for answers before proceeding to architecture design**
|
||||
|
||||
If the user says "whatever you think is best", provide your recommendation and get explicit confirmation.
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Architecture Design
|
||||
|
||||
**Goal**: Design multiple implementation approaches with different trade-offs
|
||||
|
||||
**Actions**:
|
||||
1. Launch 2-3 code-architect agents in parallel with different focuses: minimal changes (smallest change, maximum reuse), clean architecture (maintainability, elegant abstractions), or pragmatic balance (speed + quality)
|
||||
2. Review all approaches and form your opinion on which fits best for this specific task (consider: small fix vs large feature, urgency, complexity, team context)
|
||||
3. Present to user: brief summary of each approach, trade-offs comparison, **your recommendation with reasoning**, concrete implementation differences
|
||||
4. **Ask user which approach they prefer**
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Implementation
|
||||
|
||||
**Goal**: Build the feature
|
||||
|
||||
**DO NOT START WITHOUT USER APPROVAL**
|
||||
|
||||
**Actions**:
|
||||
1. Wait for explicit user approval
|
||||
2. Read all relevant files identified in previous phases
|
||||
3. Implement following chosen architecture
|
||||
4. Follow codebase conventions strictly
|
||||
5. Write clean, well-documented code
|
||||
6. Update todos as you progress
|
||||
|
||||
---
|
||||
|
||||
## Phase 6: Quality Review
|
||||
|
||||
**Goal**: Ensure code is simple, DRY, elegant, easy to read, and functionally correct
|
||||
|
||||
**Actions**:
|
||||
1. Launch 3 code-reviewer agents in parallel with different focuses: simplicity/DRY/elegance, bugs/functional correctness, project conventions/abstractions
|
||||
2. Consolidate findings and identify highest severity issues that you recommend fixing
|
||||
3. **Present findings to user and ask what they want to do** (fix now, fix later, or proceed as-is)
|
||||
4. Address issues based on user decision
|
||||
|
||||
---
|
||||
|
||||
## Phase 7: Summary
|
||||
|
||||
**Goal**: Document what was accomplished
|
||||
|
||||
**Actions**:
|
||||
1. Mark all todos complete
|
||||
2. Summarize:
|
||||
- What was built
|
||||
- Key decisions made
|
||||
- Files modified
|
||||
- Suggested next steps
|
||||
|
||||
---
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "frontend-design",
|
||||
"version": "1.0.0",
|
||||
"description": "Frontend design skill for UI/UX implementation",
|
||||
"author": {
|
||||
"name": "Prithvi Rajasekaran, Alexander Bricken",
|
||||
"email": "prithvi@anthropic.com, alexander@anthropic.com"
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
# Frontend Design Plugin
|
||||
|
||||
Generates distinctive, production-grade frontend interfaces that avoid generic AI aesthetics.
|
||||
|
||||
## What It Does
|
||||
|
||||
Claude automatically uses this skill for frontend work. Creates production-ready code with:
|
||||
|
||||
- Bold aesthetic choices
|
||||
- Distinctive typography and color palettes
|
||||
- High-impact animations and visual details
|
||||
- Context-aware implementation
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
"Create a dashboard for a music streaming app"
|
||||
"Build a landing page for an AI security startup"
|
||||
"Design a settings panel with dark mode"
|
||||
```
|
||||
|
||||
Claude will choose a clear aesthetic direction and implement production code with meticulous attention to detail.
|
||||
|
||||
## Learn More
|
||||
|
||||
See the [Frontend Aesthetics Cookbook](https://github.com/anthropics/claude-cookbooks/blob/main/coding/prompting_for_frontend_aesthetics.ipynb) for detailed guidance on prompting for high-quality frontend design.
|
||||
|
||||
## Authors
|
||||
|
||||
Prithvi Rajasekaran (prithvi@anthropic.com)
|
||||
Alexander Bricken (alexander@anthropic.com)
|
||||
@@ -1,42 +0,0 @@
|
||||
---
|
||||
name: frontend-design
|
||||
description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
|
||||
license: Complete terms in LICENSE.txt
|
||||
---
|
||||
|
||||
This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.
|
||||
|
||||
The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.
|
||||
|
||||
## Design Thinking
|
||||
|
||||
Before coding, understand the context and commit to a BOLD aesthetic direction:
|
||||
- **Purpose**: What problem does this interface solve? Who uses it?
|
||||
- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction.
|
||||
- **Constraints**: Technical requirements (framework, performance, accessibility).
|
||||
- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember?
|
||||
|
||||
**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work - the key is intentionality, not intensity.
|
||||
|
||||
Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is:
|
||||
- Production-grade and functional
|
||||
- Visually striking and memorable
|
||||
- Cohesive with a clear aesthetic point-of-view
|
||||
- Meticulously refined in every detail
|
||||
|
||||
## Frontend Aesthetics Guidelines
|
||||
|
||||
Focus on:
|
||||
- **Typography**: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font.
|
||||
- **Color & Theme**: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
|
||||
- **Motion**: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise.
|
||||
- **Spatial Composition**: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled density.
|
||||
- **Backgrounds & Visual Details**: Create atmosphere and depth rather than defaulting to solid colors. Add contextual effects and textures that match the overall aesthetic. Apply creative forms like gradient meshes, noise textures, geometric patterns, layered transparencies, dramatic shadows, decorative borders, custom cursors, and grain overlays.
|
||||
|
||||
NEVER use generic AI-generated aesthetics like overused font families (Inter, Roboto, Arial, system fonts), cliched color schemes (particularly purple gradients on white backgrounds), predictable layouts and component patterns, and cookie-cutter design that lacks context-specific character.
|
||||
|
||||
Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices (Space Grotesk, for example) across generations.
|
||||
|
||||
**IMPORTANT**: Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. Elegance comes from executing the vision well.
|
||||
|
||||
Remember: Claude is capable of extraordinary creative work. Don't hold back, show what can truly be created when thinking outside the box and committing fully to a distinctive vision.
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "hookify",
|
||||
"version": "0.1.0",
|
||||
"description": "Easily create hooks to prevent unwanted behaviors by analyzing conversation patterns",
|
||||
"author": {
|
||||
"name": "Daisy Hollman",
|
||||
"email": "daisy@anthropic.com"
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
# Python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
|
||||
# Virtual environments
|
||||
venv/
|
||||
env/
|
||||
ENV/
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Testing
|
||||
.pytest_cache/
|
||||
.coverage
|
||||
htmlcov/
|
||||
|
||||
# Local configuration (should not be committed)
|
||||
.claude/*.local.md
|
||||
.claude/*.local.json
|
||||
@@ -1,340 +0,0 @@
|
||||
# Hookify Plugin
|
||||
|
||||
Easily create custom hooks to prevent unwanted behaviors by analyzing conversation patterns or from explicit instructions.
|
||||
|
||||
## Overview
|
||||
|
||||
The hookify plugin makes it simple to create hooks without editing complex `hooks.json` files. Instead, you create lightweight markdown configuration files that define patterns to watch for and messages to show when those patterns match.
|
||||
|
||||
**Key features:**
|
||||
- 🎯 Analyze conversations to find unwanted behaviors automatically
|
||||
- 📝 Simple markdown configuration files with YAML frontmatter
|
||||
- 🔍 Regex pattern matching for powerful rules
|
||||
- 🚀 No coding required - just describe the behavior
|
||||
- 🔄 Easy enable/disable without restarting
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Create Your First Rule
|
||||
|
||||
```bash
|
||||
/hookify Warn me when I use rm -rf commands
|
||||
```
|
||||
|
||||
This analyzes your request and creates `.claude/hookify.warn-rm.local.md`.
|
||||
|
||||
### 2. Test It Immediately
|
||||
|
||||
**No restart needed!** Rules take effect on the very next tool use.
|
||||
|
||||
Ask Claude to run a command that should trigger the rule:
|
||||
```
|
||||
Run rm -rf /tmp/test
|
||||
```
|
||||
|
||||
You should see the warning message immediately!
|
||||
|
||||
## Usage
|
||||
|
||||
### Main Command: /hookify
|
||||
|
||||
**With arguments:**
|
||||
```
|
||||
/hookify Don't use console.log in TypeScript files
|
||||
```
|
||||
Creates a rule from your explicit instructions.
|
||||
|
||||
**Without arguments:**
|
||||
```
|
||||
/hookify
|
||||
```
|
||||
Analyzes recent conversation to find behaviors you've corrected or been frustrated by.
|
||||
|
||||
### Helper Commands
|
||||
|
||||
**List all rules:**
|
||||
```
|
||||
/hookify:list
|
||||
```
|
||||
|
||||
**Configure rules interactively:**
|
||||
```
|
||||
/hookify:configure
|
||||
```
|
||||
Enable/disable existing rules through an interactive interface.
|
||||
|
||||
**Get help:**
|
||||
```
|
||||
/hookify:help
|
||||
```
|
||||
|
||||
## Rule Configuration Format
|
||||
|
||||
### Simple Rule (Single Pattern)
|
||||
|
||||
`.claude/hookify.dangerous-rm.local.md`:
|
||||
```markdown
|
||||
---
|
||||
name: block-dangerous-rm
|
||||
enabled: true
|
||||
event: bash
|
||||
pattern: rm\s+-rf
|
||||
action: block
|
||||
---
|
||||
|
||||
⚠️ **Dangerous rm command detected!**
|
||||
|
||||
This command could delete important files. Please:
|
||||
- Verify the path is correct
|
||||
- Consider using a safer approach
|
||||
- Make sure you have backups
|
||||
```
|
||||
|
||||
**Action field:**
|
||||
- `warn`: Shows warning but allows operation (default)
|
||||
- `block`: Prevents operation from executing (PreToolUse) or stops session (Stop events)
|
||||
|
||||
### Advanced Rule (Multiple Conditions)
|
||||
|
||||
`.claude/hookify.sensitive-files.local.md`:
|
||||
```markdown
|
||||
---
|
||||
name: warn-sensitive-files
|
||||
enabled: true
|
||||
event: file
|
||||
action: warn
|
||||
conditions:
|
||||
- field: file_path
|
||||
operator: regex_match
|
||||
pattern: \.env$|credentials|secrets
|
||||
- field: new_text
|
||||
operator: contains
|
||||
pattern: KEY
|
||||
---
|
||||
|
||||
🔐 **Sensitive file edit detected!**
|
||||
|
||||
Ensure credentials are not hardcoded and file is in .gitignore.
|
||||
```
|
||||
|
||||
**All conditions must match** for the rule to trigger.
|
||||
|
||||
## Event Types
|
||||
|
||||
- **`bash`**: Triggers on Bash tool commands
|
||||
- **`file`**: Triggers on Edit, Write, MultiEdit tools
|
||||
- **`stop`**: Triggers when Claude wants to stop (for completion checks)
|
||||
- **`prompt`**: Triggers on user prompt submission
|
||||
- **`all`**: Triggers on all events
|
||||
|
||||
## Pattern Syntax
|
||||
|
||||
Use Python regex syntax:
|
||||
|
||||
| Pattern | Matches | Example |
|
||||
|---------|---------|---------|
|
||||
| `rm\s+-rf` | rm -rf | rm -rf /tmp |
|
||||
| `console\.log\(` | console.log( | console.log("test") |
|
||||
| `(eval\|exec)\(` | eval( or exec( | eval("code") |
|
||||
| `\.env$` | files ending in .env | .env, .env.local |
|
||||
| `chmod\s+777` | chmod 777 | chmod 777 file.txt |
|
||||
|
||||
**Tips:**
|
||||
- Use `\s` for whitespace
|
||||
- Escape special chars: `\.` for literal dot
|
||||
- Use `|` for OR: `(foo|bar)`
|
||||
- Use `.*` to match anything
|
||||
- Set `action: block` for dangerous operations
|
||||
- Set `action: warn` (or omit) for informational warnings
|
||||
|
||||
## Examples
|
||||
|
||||
### Example 1: Block Dangerous Commands
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: block-destructive-ops
|
||||
enabled: true
|
||||
event: bash
|
||||
pattern: rm\s+-rf|dd\s+if=|mkfs|format
|
||||
action: block
|
||||
---
|
||||
|
||||
🛑 **Destructive operation detected!**
|
||||
|
||||
This command can cause data loss. Operation blocked for safety.
|
||||
Please verify the exact path and use a safer approach.
|
||||
```
|
||||
|
||||
**This rule blocks the operation** - Claude will not be allowed to execute these commands.
|
||||
|
||||
### Example 2: Warn About Debug Code
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: warn-debug-code
|
||||
enabled: true
|
||||
event: file
|
||||
pattern: console\.log\(|debugger;|print\(
|
||||
action: warn
|
||||
---
|
||||
|
||||
🐛 **Debug code detected**
|
||||
|
||||
Remember to remove debugging statements before committing.
|
||||
```
|
||||
|
||||
**This rule warns but allows** - Claude sees the message but can still proceed.
|
||||
|
||||
### Example 3: Require Tests Before Stopping
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: require-tests-run
|
||||
enabled: false
|
||||
event: stop
|
||||
action: block
|
||||
conditions:
|
||||
- field: transcript
|
||||
operator: not_contains
|
||||
pattern: npm test|pytest|cargo test
|
||||
---
|
||||
|
||||
**Tests not detected in transcript!**
|
||||
|
||||
Before stopping, please run tests to verify your changes work correctly.
|
||||
```
|
||||
|
||||
**This blocks Claude from stopping** if no test commands appear in the session transcript. Enable only when you want strict enforcement.
|
||||
|
||||
## Advanced Usage
|
||||
|
||||
### Multiple Conditions
|
||||
|
||||
Check multiple fields simultaneously:
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: api-key-in-typescript
|
||||
enabled: true
|
||||
event: file
|
||||
conditions:
|
||||
- field: file_path
|
||||
operator: regex_match
|
||||
pattern: \.tsx?$
|
||||
- field: new_text
|
||||
operator: regex_match
|
||||
pattern: (API_KEY|SECRET|TOKEN)\s*=\s*["']
|
||||
---
|
||||
|
||||
🔐 **Hardcoded credential in TypeScript!**
|
||||
|
||||
Use environment variables instead of hardcoded values.
|
||||
```
|
||||
|
||||
### Operators Reference
|
||||
|
||||
- `regex_match`: Pattern must match (most common)
|
||||
- `contains`: String must contain pattern
|
||||
- `equals`: Exact string match
|
||||
- `not_contains`: String must NOT contain pattern
|
||||
- `starts_with`: String starts with pattern
|
||||
- `ends_with`: String ends with pattern
|
||||
|
||||
### Field Reference
|
||||
|
||||
**For bash events:**
|
||||
- `command`: The bash command string
|
||||
|
||||
**For file events:**
|
||||
- `file_path`: Path to file being edited
|
||||
- `new_text`: New content being added (Edit, Write)
|
||||
- `old_text`: Old content being replaced (Edit only)
|
||||
- `content`: File content (Write only)
|
||||
|
||||
**For prompt events:**
|
||||
- `user_prompt`: The user's submitted prompt text
|
||||
|
||||
**For stop events:**
|
||||
- Use general matching on session state
|
||||
|
||||
## Management
|
||||
|
||||
### Enable/Disable Rules
|
||||
|
||||
**Temporarily disable:**
|
||||
Edit the `.local.md` file and set `enabled: false`
|
||||
|
||||
**Re-enable:**
|
||||
Set `enabled: true`
|
||||
|
||||
**Or use interactive tool:**
|
||||
```
|
||||
/hookify:configure
|
||||
```
|
||||
|
||||
### Delete Rules
|
||||
|
||||
Simply delete the `.local.md` file:
|
||||
```bash
|
||||
rm .claude/hookify.my-rule.local.md
|
||||
```
|
||||
|
||||
### View All Rules
|
||||
|
||||
```
|
||||
/hookify:list
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
This plugin is part of the Claude Code Marketplace. It should be auto-discovered when the marketplace is installed.
|
||||
|
||||
**Manual testing:**
|
||||
```bash
|
||||
cc --plugin-dir /path/to/hookify
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
- Python 3.7+
|
||||
- No external dependencies (uses stdlib only)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Rule not triggering:**
|
||||
1. Check rule file exists in `.claude/` directory (in project root, not plugin directory)
|
||||
2. Verify `enabled: true` in frontmatter
|
||||
3. Test regex pattern separately
|
||||
4. Rules should work immediately - no restart needed
|
||||
5. Try `/hookify:list` to see if rule is loaded
|
||||
|
||||
**Import errors:**
|
||||
- Ensure Python 3 is available: `python3 --version`
|
||||
- Check hookify plugin is installed
|
||||
|
||||
**Pattern not matching:**
|
||||
- Test regex: `python3 -c "import re; print(re.search(r'pattern', 'text'))"`
|
||||
- Use unquoted patterns in YAML to avoid escaping issues
|
||||
- Start simple, then add complexity
|
||||
|
||||
**Hook seems slow:**
|
||||
- Keep patterns simple (avoid complex regex)
|
||||
- Use specific event types (bash, file) instead of "all"
|
||||
- Limit number of active rules
|
||||
|
||||
## Contributing
|
||||
|
||||
Found a useful rule pattern? Consider sharing example files via PR!
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
- Severity levels (error/warning/info distinctions)
|
||||
- Rule templates library
|
||||
- Interactive pattern builder
|
||||
- Hook testing utilities
|
||||
- JSON format support (in addition to markdown)
|
||||
|
||||
## License
|
||||
|
||||
MIT License
|
||||
@@ -1,176 +0,0 @@
|
||||
---
|
||||
name: conversation-analyzer
|
||||
description: Use this agent when analyzing conversation transcripts to find behaviors worth preventing with hooks. Examples: <example>Context: User is running /hookify command without arguments\nuser: "/hookify"\nassistant: "I'll analyze the conversation to find behaviors you want to prevent"\n<commentary>The /hookify command without arguments triggers conversation analysis to find unwanted behaviors.</commentary></example><example>Context: User wants to create hooks from recent frustrations\nuser: "Can you look back at this conversation and help me create hooks for the mistakes you made?"\nassistant: "I'll use the conversation-analyzer agent to identify the issues and suggest hooks."\n<commentary>User explicitly asks to analyze conversation for mistakes that should be prevented.</commentary></example>
|
||||
model: inherit
|
||||
color: yellow
|
||||
tools: ["Read", "Grep"]
|
||||
---
|
||||
|
||||
You are a conversation analysis specialist that identifies problematic behaviors in Claude Code sessions that could be prevented with hooks.
|
||||
|
||||
**Your Core Responsibilities:**
|
||||
1. Read and analyze user messages to find frustration signals
|
||||
2. Identify specific tool usage patterns that caused issues
|
||||
3. Extract actionable patterns that can be matched with regex
|
||||
4. Categorize issues by severity and type
|
||||
5. Provide structured findings for hook rule generation
|
||||
|
||||
**Analysis Process:**
|
||||
|
||||
### 1. Search for User Messages Indicating Issues
|
||||
|
||||
Read through user messages in reverse chronological order (most recent first). Look for:
|
||||
|
||||
**Explicit correction requests:**
|
||||
- "Don't use X"
|
||||
- "Stop doing Y"
|
||||
- "Please don't Z"
|
||||
- "Avoid..."
|
||||
- "Never..."
|
||||
|
||||
**Frustrated reactions:**
|
||||
- "Why did you do X?"
|
||||
- "I didn't ask for that"
|
||||
- "That's not what I meant"
|
||||
- "That was wrong"
|
||||
|
||||
**Corrections and reversions:**
|
||||
- User reverting changes Claude made
|
||||
- User fixing issues Claude created
|
||||
- User providing step-by-step corrections
|
||||
|
||||
**Repeated issues:**
|
||||
- Same type of mistake multiple times
|
||||
- User having to remind multiple times
|
||||
- Pattern of similar problems
|
||||
|
||||
### 2. Identify Tool Usage Patterns
|
||||
|
||||
For each issue, determine:
|
||||
- **Which tool**: Bash, Edit, Write, MultiEdit
|
||||
- **What action**: Specific command or code pattern
|
||||
- **When it happened**: During what task/phase
|
||||
- **Why problematic**: User's stated reason or implicit concern
|
||||
|
||||
**Extract concrete examples:**
|
||||
- For Bash: Actual command that was problematic
|
||||
- For Edit/Write: Code pattern that was added
|
||||
- For Stop: What was missing before stopping
|
||||
|
||||
### 3. Create Regex Patterns
|
||||
|
||||
Convert behaviors into matchable patterns:
|
||||
|
||||
**Bash command patterns:**
|
||||
- `rm\s+-rf` for dangerous deletes
|
||||
- `sudo\s+` for privilege escalation
|
||||
- `chmod\s+777` for permission issues
|
||||
|
||||
**Code patterns (Edit/Write):**
|
||||
- `console\.log\(` for debug logging
|
||||
- `eval\(|new Function\(` for dangerous eval
|
||||
- `innerHTML\s*=` for XSS risks
|
||||
|
||||
**File path patterns:**
|
||||
- `\.env$` for environment files
|
||||
- `/node_modules/` for dependency files
|
||||
- `dist/|build/` for generated files
|
||||
|
||||
### 4. Categorize Severity
|
||||
|
||||
**High severity (should block in future):**
|
||||
- Dangerous commands (rm -rf, chmod 777)
|
||||
- Security issues (hardcoded secrets, eval)
|
||||
- Data loss risks
|
||||
|
||||
**Medium severity (warn):**
|
||||
- Style violations (console.log in production)
|
||||
- Wrong file types (editing generated files)
|
||||
- Missing best practices
|
||||
|
||||
**Low severity (optional):**
|
||||
- Preferences (coding style)
|
||||
- Non-critical patterns
|
||||
|
||||
### 5. Output Format
|
||||
|
||||
Return your findings as structured text in this format:
|
||||
|
||||
```
|
||||
## Hookify Analysis Results
|
||||
|
||||
### Issue 1: Dangerous rm Commands
|
||||
**Severity**: High
|
||||
**Tool**: Bash
|
||||
**Pattern**: `rm\s+-rf`
|
||||
**Occurrences**: 3 times
|
||||
**Context**: Used rm -rf on /tmp directories without verification
|
||||
**User Reaction**: "Please be more careful with rm commands"
|
||||
|
||||
**Suggested Rule:**
|
||||
- Name: warn-dangerous-rm
|
||||
- Event: bash
|
||||
- Pattern: rm\s+-rf
|
||||
- Message: "Dangerous rm command detected. Verify path before proceeding."
|
||||
|
||||
---
|
||||
|
||||
### Issue 2: Console.log in TypeScript
|
||||
**Severity**: Medium
|
||||
**Tool**: Edit/Write
|
||||
**Pattern**: `console\.log\(`
|
||||
**Occurrences**: 2 times
|
||||
**Context**: Added console.log statements to production TypeScript files
|
||||
**User Reaction**: "Don't use console.log in production code"
|
||||
|
||||
**Suggested Rule:**
|
||||
- Name: warn-console-log
|
||||
- Event: file
|
||||
- Pattern: console\.log\(
|
||||
- Message: "Console.log detected. Use proper logging library instead."
|
||||
|
||||
---
|
||||
|
||||
[Continue for each issue found...]
|
||||
|
||||
## Summary
|
||||
|
||||
Found {N} behaviors worth preventing:
|
||||
- {N} high severity
|
||||
- {N} medium severity
|
||||
- {N} low severity
|
||||
|
||||
Recommend creating rules for high and medium severity issues.
|
||||
```
|
||||
|
||||
**Quality Standards:**
|
||||
- Be specific about patterns (don't be overly broad)
|
||||
- Include actual examples from conversation
|
||||
- Explain why each issue matters
|
||||
- Provide ready-to-use regex patterns
|
||||
- Don't false-positive on discussions about what NOT to do
|
||||
|
||||
**Edge Cases:**
|
||||
|
||||
**User discussing hypotheticals:**
|
||||
- "What would happen if I used rm -rf?"
|
||||
- Don't treat as problematic behavior
|
||||
|
||||
**Teaching moments:**
|
||||
- "Here's what you shouldn't do: ..."
|
||||
- Context indicates explanation, not actual problem
|
||||
|
||||
**One-time accidents:**
|
||||
- Single occurrence, already fixed
|
||||
- Mention but mark as low priority
|
||||
|
||||
**Subjective preferences:**
|
||||
- "I prefer X over Y"
|
||||
- Mark as low severity, let user decide
|
||||
|
||||
**Return Results:**
|
||||
Provide your analysis in the structured format above. The /hookify command will use this to:
|
||||
1. Present findings to user
|
||||
2. Ask which rules to create
|
||||
3. Generate .local.md configuration files
|
||||
4. Save rules to .claude directory
|
||||
@@ -1,128 +0,0 @@
|
||||
---
|
||||
description: Enable or disable hookify rules interactively
|
||||
allowed-tools: ["Glob", "Read", "Edit", "AskUserQuestion", "Skill"]
|
||||
---
|
||||
|
||||
# Configure Hookify Rules
|
||||
|
||||
**Load hookify:writing-rules skill first** to understand rule format.
|
||||
|
||||
Enable or disable existing hookify rules using an interactive interface.
|
||||
|
||||
## Steps
|
||||
|
||||
### 1. Find Existing Rules
|
||||
|
||||
Use Glob tool to find all hookify rule files:
|
||||
```
|
||||
pattern: ".claude/hookify.*.local.md"
|
||||
```
|
||||
|
||||
If no rules found, inform user:
|
||||
```
|
||||
No hookify rules configured yet. Use `/hookify` to create your first rule.
|
||||
```
|
||||
|
||||
### 2. Read Current State
|
||||
|
||||
For each rule file:
|
||||
- Read the file
|
||||
- Extract `name` and `enabled` fields from frontmatter
|
||||
- Build list of rules with current state
|
||||
|
||||
### 3. Ask User Which Rules to Toggle
|
||||
|
||||
Use AskUserQuestion to let user select rules:
|
||||
|
||||
```json
|
||||
{
|
||||
"questions": [
|
||||
{
|
||||
"question": "Which rules would you like to enable or disable?",
|
||||
"header": "Configure",
|
||||
"multiSelect": true,
|
||||
"options": [
|
||||
{
|
||||
"label": "warn-dangerous-rm (currently enabled)",
|
||||
"description": "Warns about rm -rf commands"
|
||||
},
|
||||
{
|
||||
"label": "warn-console-log (currently disabled)",
|
||||
"description": "Warns about console.log in code"
|
||||
},
|
||||
{
|
||||
"label": "require-tests (currently enabled)",
|
||||
"description": "Requires tests before stopping"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Option format:**
|
||||
- Label: `{rule-name} (currently {enabled|disabled})`
|
||||
- Description: Brief description from rule's message or pattern
|
||||
|
||||
### 4. Parse User Selection
|
||||
|
||||
For each selected rule:
|
||||
- Determine current state from label (enabled/disabled)
|
||||
- Toggle state: enabled → disabled, disabled → enabled
|
||||
|
||||
### 5. Update Rule Files
|
||||
|
||||
For each rule to toggle:
|
||||
- Use Read tool to read current content
|
||||
- Use Edit tool to change `enabled: true` to `enabled: false` (or vice versa)
|
||||
- Handle both with and without quotes
|
||||
|
||||
**Edit pattern for enabling:**
|
||||
```
|
||||
old_string: "enabled: false"
|
||||
new_string: "enabled: true"
|
||||
```
|
||||
|
||||
**Edit pattern for disabling:**
|
||||
```
|
||||
old_string: "enabled: true"
|
||||
new_string: "enabled: false"
|
||||
```
|
||||
|
||||
### 6. Confirm Changes
|
||||
|
||||
Show user what was changed:
|
||||
|
||||
```
|
||||
## Hookify Rules Updated
|
||||
|
||||
**Enabled:**
|
||||
- warn-console-log
|
||||
|
||||
**Disabled:**
|
||||
- warn-dangerous-rm
|
||||
|
||||
**Unchanged:**
|
||||
- require-tests
|
||||
|
||||
Changes apply immediately - no restart needed
|
||||
```
|
||||
|
||||
## Important Notes
|
||||
|
||||
- Changes take effect immediately on next tool use
|
||||
- You can also manually edit .claude/hookify.*.local.md files
|
||||
- To permanently remove a rule, delete its .local.md file
|
||||
- Use `/hookify:list` to see all configured rules
|
||||
|
||||
## Edge Cases
|
||||
|
||||
**No rules to configure:**
|
||||
- Show message about using `/hookify` to create rules first
|
||||
|
||||
**User selects no rules:**
|
||||
- Inform that no changes were made
|
||||
|
||||
**File read/write errors:**
|
||||
- Inform user of specific error
|
||||
- Suggest manual editing as fallback
|
||||
@@ -1,175 +0,0 @@
|
||||
---
|
||||
description: Get help with the hookify plugin
|
||||
allowed-tools: ["Read"]
|
||||
---
|
||||
|
||||
# Hookify Plugin Help
|
||||
|
||||
Explain how the hookify plugin works and how to use it.
|
||||
|
||||
## Overview
|
||||
|
||||
The hookify plugin makes it easy to create custom hooks that prevent unwanted behaviors. Instead of editing `hooks.json` files, users create simple markdown configuration files that define patterns to watch for.
|
||||
|
||||
## How It Works
|
||||
|
||||
### 1. Hook System
|
||||
|
||||
Hookify installs generic hooks that run on these events:
|
||||
- **PreToolUse**: Before any tool executes (Bash, Edit, Write, etc.)
|
||||
- **PostToolUse**: After a tool executes
|
||||
- **Stop**: When Claude wants to stop working
|
||||
- **UserPromptSubmit**: When user submits a prompt
|
||||
|
||||
These hooks read configuration files from `.claude/hookify.*.local.md` and check if any rules match the current operation.
|
||||
|
||||
### 2. Configuration Files
|
||||
|
||||
Users create rules in `.claude/hookify.{rule-name}.local.md` files:
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: warn-dangerous-rm
|
||||
enabled: true
|
||||
event: bash
|
||||
pattern: rm\s+-rf
|
||||
---
|
||||
|
||||
⚠️ **Dangerous rm command detected!**
|
||||
|
||||
This command could delete important files. Please verify the path.
|
||||
```
|
||||
|
||||
**Key fields:**
|
||||
- `name`: Unique identifier for the rule
|
||||
- `enabled`: true/false to activate/deactivate
|
||||
- `event`: bash, file, stop, prompt, or all
|
||||
- `pattern`: Regex pattern to match
|
||||
|
||||
The message body is what Claude sees when the rule triggers.
|
||||
|
||||
### 3. Creating Rules
|
||||
|
||||
**Option A: Use /hookify command**
|
||||
```
|
||||
/hookify Don't use console.log in production files
|
||||
```
|
||||
|
||||
This analyzes your request and creates the appropriate rule file.
|
||||
|
||||
**Option B: Create manually**
|
||||
Create `.claude/hookify.my-rule.local.md` with the format above.
|
||||
|
||||
**Option C: Analyze conversation**
|
||||
```
|
||||
/hookify
|
||||
```
|
||||
|
||||
Without arguments, hookify analyzes recent conversation to find behaviors you want to prevent.
|
||||
|
||||
## Available Commands
|
||||
|
||||
- **`/hookify`** - Create hooks from conversation analysis or explicit instructions
|
||||
- **`/hookify:help`** - Show this help (what you're reading now)
|
||||
- **`/hookify:list`** - List all configured hooks
|
||||
- **`/hookify:configure`** - Enable/disable existing hooks interactively
|
||||
|
||||
## Example Use Cases
|
||||
|
||||
**Prevent dangerous commands:**
|
||||
```markdown
|
||||
---
|
||||
name: block-chmod-777
|
||||
enabled: true
|
||||
event: bash
|
||||
pattern: chmod\s+777
|
||||
---
|
||||
|
||||
Don't use chmod 777 - it's a security risk. Use specific permissions instead.
|
||||
```
|
||||
|
||||
**Warn about debugging code:**
|
||||
```markdown
|
||||
---
|
||||
name: warn-console-log
|
||||
enabled: true
|
||||
event: file
|
||||
pattern: console\.log\(
|
||||
---
|
||||
|
||||
Console.log detected. Remember to remove debug logging before committing.
|
||||
```
|
||||
|
||||
**Require tests before stopping:**
|
||||
```markdown
|
||||
---
|
||||
name: require-tests
|
||||
enabled: true
|
||||
event: stop
|
||||
pattern: .*
|
||||
---
|
||||
|
||||
Did you run tests before finishing? Make sure `npm test` or equivalent was executed.
|
||||
```
|
||||
|
||||
## Pattern Syntax
|
||||
|
||||
Use Python regex syntax:
|
||||
- `\s` - whitespace
|
||||
- `\.` - literal dot
|
||||
- `|` - OR
|
||||
- `+` - one or more
|
||||
- `*` - zero or more
|
||||
- `\d` - digit
|
||||
- `[abc]` - character class
|
||||
|
||||
**Examples:**
|
||||
- `rm\s+-rf` - matches "rm -rf"
|
||||
- `console\.log\(` - matches "console.log("
|
||||
- `(eval|exec)\(` - matches "eval(" or "exec("
|
||||
- `\.env$` - matches files ending in .env
|
||||
|
||||
## Important Notes
|
||||
|
||||
**No Restart Needed**: Hookify rules (`.local.md` files) take effect immediately on the next tool use. The hookify hooks are already loaded and read your rules dynamically.
|
||||
|
||||
**Block or Warn**: Rules can either `block` operations (prevent execution) or `warn` (show message but allow). Set `action: block` or `action: warn` in the rule's frontmatter.
|
||||
|
||||
**Rule Files**: Keep rules in `.claude/hookify.*.local.md` - they should be git-ignored (add to .gitignore if needed).
|
||||
|
||||
**Disable Rules**: Set `enabled: false` in frontmatter or delete the file.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Hook not triggering:**
|
||||
- Check rule file is in `.claude/` directory
|
||||
- Verify `enabled: true` in frontmatter
|
||||
- Confirm pattern is valid regex
|
||||
- Test pattern: `python3 -c "import re; print(re.search('your_pattern', 'test_text'))"`
|
||||
- Rules take effect immediately - no restart needed
|
||||
|
||||
**Import errors:**
|
||||
- Check Python 3 is available: `python3 --version`
|
||||
- Verify hookify plugin is installed correctly
|
||||
|
||||
**Pattern not matching:**
|
||||
- Test regex separately
|
||||
- Check for escaping issues (use unquoted patterns in YAML)
|
||||
- Try simpler pattern first, then refine
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. Create your first rule:
|
||||
```
|
||||
/hookify Warn me when I try to use rm -rf
|
||||
```
|
||||
|
||||
2. Try to trigger it:
|
||||
- Ask Claude to run `rm -rf /tmp/test`
|
||||
- You should see the warning
|
||||
|
||||
4. Refine the rule by editing `.claude/hookify.warn-rm.local.md`
|
||||
|
||||
5. Create more rules as you encounter unwanted behaviors
|
||||
|
||||
For more examples, check the `${CLAUDE_PLUGIN_ROOT}/examples/` directory.
|
||||
@@ -1,231 +0,0 @@
|
||||
---
|
||||
description: Create hooks to prevent unwanted behaviors from conversation analysis or explicit instructions
|
||||
argument-hint: Optional specific behavior to address
|
||||
allowed-tools: ["Read", "Write", "AskUserQuestion", "Task", "Grep", "TodoWrite", "Skill"]
|
||||
---
|
||||
|
||||
# Hookify - Create Hooks from Unwanted Behaviors
|
||||
|
||||
**FIRST: Load the hookify:writing-rules skill** using the Skill tool to understand rule file format and syntax.
|
||||
|
||||
Create hook rules to prevent problematic behaviors by analyzing the conversation or from explicit user instructions.
|
||||
|
||||
## Your Task
|
||||
|
||||
You will help the user create hookify rules to prevent unwanted behaviors. Follow these steps:
|
||||
|
||||
### Step 1: Gather Behavior Information
|
||||
|
||||
**If $ARGUMENTS is provided:**
|
||||
- User has given specific instructions: `$ARGUMENTS`
|
||||
- Still analyze recent conversation (last 10-15 user messages) for additional context
|
||||
- Look for examples of the behavior happening
|
||||
|
||||
**If $ARGUMENTS is empty:**
|
||||
- Launch the conversation-analyzer agent to find problematic behaviors
|
||||
- Agent will scan user prompts for frustration signals
|
||||
- Agent will return structured findings
|
||||
|
||||
**To analyze conversation:**
|
||||
Use the Task tool to launch conversation-analyzer agent:
|
||||
```
|
||||
{
|
||||
"subagent_type": "general-purpose",
|
||||
"description": "Analyze conversation for unwanted behaviors",
|
||||
"prompt": "You are analyzing a Claude Code conversation to find behaviors the user wants to prevent.
|
||||
|
||||
Read user messages in the current conversation and identify:
|
||||
1. Explicit requests to avoid something (\"don't do X\", \"stop doing Y\")
|
||||
2. Corrections or reversions (user fixing Claude's actions)
|
||||
3. Frustrated reactions (\"why did you do X?\", \"I didn't ask for that\")
|
||||
4. Repeated issues (same problem multiple times)
|
||||
|
||||
For each issue found, extract:
|
||||
- What tool was used (Bash, Edit, Write, etc.)
|
||||
- Specific pattern or command
|
||||
- Why it was problematic
|
||||
- User's stated reason
|
||||
|
||||
Return findings as a structured list with:
|
||||
- category: Type of issue
|
||||
- tool: Which tool was involved
|
||||
- pattern: Regex or literal pattern to match
|
||||
- context: What happened
|
||||
- severity: high/medium/low
|
||||
|
||||
Focus on the most recent issues (last 20-30 messages). Don't go back further unless explicitly asked."
|
||||
}
|
||||
```
|
||||
|
||||
### Step 2: Present Findings to User
|
||||
|
||||
After gathering behaviors (from arguments or agent), present to user using AskUserQuestion:
|
||||
|
||||
**Question 1: Which behaviors to hookify?**
|
||||
- Header: "Create Rules"
|
||||
- multiSelect: true
|
||||
- Options: List each detected behavior (max 4)
|
||||
- Label: Short description (e.g., "Block rm -rf")
|
||||
- Description: Why it's problematic
|
||||
|
||||
**Question 2: For each selected behavior, ask about action:**
|
||||
- "Should this block the operation or just warn?"
|
||||
- Options:
|
||||
- "Just warn" (action: warn - shows message but allows)
|
||||
- "Block operation" (action: block - prevents execution)
|
||||
|
||||
**Question 3: Ask for example patterns:**
|
||||
- "What patterns should trigger this rule?"
|
||||
- Show detected patterns
|
||||
- Allow user to refine or add more
|
||||
|
||||
### Step 3: Generate Rule Files
|
||||
|
||||
For each confirmed behavior, create a `.claude/hookify.{rule-name}.local.md` file:
|
||||
|
||||
**Rule naming convention:**
|
||||
- Use kebab-case
|
||||
- Be descriptive: `block-dangerous-rm`, `warn-console-log`, `require-tests-before-stop`
|
||||
- Start with action verb: block, warn, prevent, require
|
||||
|
||||
**File format:**
|
||||
```markdown
|
||||
---
|
||||
name: {rule-name}
|
||||
enabled: true
|
||||
event: {bash|file|stop|prompt|all}
|
||||
pattern: {regex pattern}
|
||||
action: {warn|block}
|
||||
---
|
||||
|
||||
{Message to show Claude when rule triggers}
|
||||
```
|
||||
|
||||
**Action values:**
|
||||
- `warn`: Show message but allow operation (default)
|
||||
- `block`: Prevent operation or stop session
|
||||
|
||||
**For more complex rules (multiple conditions):**
|
||||
```markdown
|
||||
---
|
||||
name: {rule-name}
|
||||
enabled: true
|
||||
event: file
|
||||
conditions:
|
||||
- field: file_path
|
||||
operator: regex_match
|
||||
pattern: \.env$
|
||||
- field: new_text
|
||||
operator: contains
|
||||
pattern: API_KEY
|
||||
---
|
||||
|
||||
{Warning message}
|
||||
```
|
||||
|
||||
### Step 4: Create Files and Confirm
|
||||
|
||||
**IMPORTANT**: Rule files must be created in the current working directory's `.claude/` folder, NOT the plugin directory.
|
||||
|
||||
Use the current working directory (where Claude Code was started) as the base path.
|
||||
|
||||
1. Check if `.claude/` directory exists in current working directory
|
||||
- If not, create it first with: `mkdir -p .claude`
|
||||
|
||||
2. Use Write tool to create each `.claude/hookify.{name}.local.md` file
|
||||
- Use relative path from current working directory: `.claude/hookify.{name}.local.md`
|
||||
- The path should resolve to the project's .claude directory, not the plugin's
|
||||
|
||||
3. Show user what was created:
|
||||
```
|
||||
Created 3 hookify rules:
|
||||
- .claude/hookify.dangerous-rm.local.md
|
||||
- .claude/hookify.console-log.local.md
|
||||
- .claude/hookify.sensitive-files.local.md
|
||||
|
||||
These rules will trigger on:
|
||||
- dangerous-rm: Bash commands matching "rm -rf"
|
||||
- console-log: Edits adding console.log statements
|
||||
- sensitive-files: Edits to .env or credentials files
|
||||
```
|
||||
|
||||
4. Verify files were created in the correct location by listing them
|
||||
|
||||
5. Inform user: **"Rules are active immediately - no restart needed!"**
|
||||
|
||||
The hookify hooks are already loaded and will read your new rules on the next tool use.
|
||||
|
||||
## Event Types Reference
|
||||
|
||||
- **bash**: Matches Bash tool commands
|
||||
- **file**: Matches Edit, Write, MultiEdit tools
|
||||
- **stop**: Matches when agent wants to stop (use for completion checks)
|
||||
- **prompt**: Matches when user submits prompts
|
||||
- **all**: Matches all events
|
||||
|
||||
## Pattern Writing Tips
|
||||
|
||||
**Bash patterns:**
|
||||
- Match dangerous commands: `rm\s+-rf|chmod\s+777|dd\s+if=`
|
||||
- Match specific tools: `npm\s+install\s+|pip\s+install`
|
||||
|
||||
**File patterns:**
|
||||
- Match code patterns: `console\.log\(|eval\(|innerHTML\s*=`
|
||||
- Match file paths: `\.env$|\.git/|node_modules/`
|
||||
|
||||
**Stop patterns:**
|
||||
- Check for missing steps: (check transcript or completion criteria)
|
||||
|
||||
## Example Workflow
|
||||
|
||||
**User says**: "/hookify Don't use rm -rf without asking me first"
|
||||
|
||||
**Your response**:
|
||||
1. Analyze: User wants to prevent rm -rf commands
|
||||
2. Ask: "Should I block this command or just warn you?"
|
||||
3. User selects: "Just warn"
|
||||
4. Create `.claude/hookify.dangerous-rm.local.md`:
|
||||
```markdown
|
||||
---
|
||||
name: warn-dangerous-rm
|
||||
enabled: true
|
||||
event: bash
|
||||
pattern: rm\s+-rf
|
||||
---
|
||||
|
||||
⚠️ **Dangerous rm command detected**
|
||||
|
||||
You requested to be warned before using rm -rf.
|
||||
Please verify the path is correct.
|
||||
```
|
||||
5. Confirm: "Created hookify rule. It's active immediately - try triggering it!"
|
||||
|
||||
## Important Notes
|
||||
|
||||
- **No restart needed**: Rules take effect immediately on the next tool use
|
||||
- **File location**: Create files in project's `.claude/` directory (current working directory), NOT the plugin's .claude/
|
||||
- **Regex syntax**: Use Python regex syntax (raw strings, no need to escape in YAML)
|
||||
- **Action types**: Rules can `warn` (default) or `block` operations
|
||||
- **Testing**: Test rules immediately after creating them
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**If rule file creation fails:**
|
||||
1. Check current working directory with pwd
|
||||
2. Ensure `.claude/` directory exists (create with mkdir if needed)
|
||||
3. Use absolute path if needed: `{cwd}/.claude/hookify.{name}.local.md`
|
||||
4. Verify file was created with Glob or ls
|
||||
|
||||
**If rule doesn't trigger after creation:**
|
||||
1. Verify file is in project `.claude/` not plugin `.claude/`
|
||||
2. Check file with Read tool to ensure pattern is correct
|
||||
3. Test pattern with: `python3 -c "import re; print(re.search(r'pattern', 'test text'))"`
|
||||
4. Verify `enabled: true` in frontmatter
|
||||
5. Remember: Rules work immediately, no restart needed
|
||||
|
||||
**If blocking seems too strict:**
|
||||
1. Change `action: block` to `action: warn` in the rule file
|
||||
2. Or adjust the pattern to be more specific
|
||||
3. Changes take effect on next tool use
|
||||
|
||||
Use TodoWrite to track your progress through the steps.
|
||||
@@ -1,82 +0,0 @@
|
||||
---
|
||||
description: List all configured hookify rules
|
||||
allowed-tools: ["Glob", "Read", "Skill"]
|
||||
---
|
||||
|
||||
# List Hookify Rules
|
||||
|
||||
**Load hookify:writing-rules skill first** to understand rule format.
|
||||
|
||||
Show all configured hookify rules in the project.
|
||||
|
||||
## Steps
|
||||
|
||||
1. Use Glob tool to find all hookify rule files:
|
||||
```
|
||||
pattern: ".claude/hookify.*.local.md"
|
||||
```
|
||||
|
||||
2. For each file found:
|
||||
- Use Read tool to read the file
|
||||
- Extract frontmatter fields: name, enabled, event, pattern
|
||||
- Extract message preview (first 100 chars)
|
||||
|
||||
3. Present results in a table:
|
||||
|
||||
```
|
||||
## Configured Hookify Rules
|
||||
|
||||
| Name | Enabled | Event | Pattern | File |
|
||||
|------|---------|-------|---------|------|
|
||||
| warn-dangerous-rm | ✅ Yes | bash | rm\s+-rf | hookify.dangerous-rm.local.md |
|
||||
| warn-console-log | ✅ Yes | file | console\.log\( | hookify.console-log.local.md |
|
||||
| check-tests | ❌ No | stop | .* | hookify.require-tests.local.md |
|
||||
|
||||
**Total**: 3 rules (2 enabled, 1 disabled)
|
||||
```
|
||||
|
||||
4. For each rule, show a brief preview:
|
||||
```
|
||||
### warn-dangerous-rm
|
||||
**Event**: bash
|
||||
**Pattern**: `rm\s+-rf`
|
||||
**Message**: "⚠️ **Dangerous rm command detected!** This command could delete..."
|
||||
|
||||
**Status**: ✅ Active
|
||||
**File**: .claude/hookify.dangerous-rm.local.md
|
||||
```
|
||||
|
||||
5. Add helpful footer:
|
||||
```
|
||||
---
|
||||
|
||||
To modify a rule: Edit the .local.md file directly
|
||||
To disable a rule: Set `enabled: false` in frontmatter
|
||||
To enable a rule: Set `enabled: true` in frontmatter
|
||||
To delete a rule: Remove the .local.md file
|
||||
To create a rule: Use `/hookify` command
|
||||
|
||||
**Remember**: Changes take effect immediately - no restart needed
|
||||
```
|
||||
|
||||
## If No Rules Found
|
||||
|
||||
If no hookify rules exist:
|
||||
|
||||
```
|
||||
## No Hookify Rules Configured
|
||||
|
||||
You haven't created any hookify rules yet.
|
||||
|
||||
To get started:
|
||||
1. Use `/hookify` to analyze conversation and create rules
|
||||
2. Or manually create `.claude/hookify.my-rule.local.md` files
|
||||
3. See `/hookify:help` for documentation
|
||||
|
||||
Example:
|
||||
```
|
||||
/hookify Warn me when I use console.log
|
||||
```
|
||||
|
||||
Check `${CLAUDE_PLUGIN_ROOT}/examples/` for example rule files.
|
||||
```
|
||||
@@ -1,297 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Configuration loader for hookify plugin.
|
||||
|
||||
Loads and parses .claude/hookify.*.local.md files.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import glob
|
||||
import re
|
||||
from typing import List, Optional, Dict, Any
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
@dataclass
|
||||
class Condition:
|
||||
"""A single condition for matching."""
|
||||
field: str # "command", "new_text", "old_text", "file_path", etc.
|
||||
operator: str # "regex_match", "contains", "equals", etc.
|
||||
pattern: str # Pattern to match
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, data: Dict[str, Any]) -> 'Condition':
|
||||
"""Create Condition from dict."""
|
||||
return cls(
|
||||
field=data.get('field', ''),
|
||||
operator=data.get('operator', 'regex_match'),
|
||||
pattern=data.get('pattern', '')
|
||||
)
|
||||
|
||||
|
||||
@dataclass
|
||||
class Rule:
|
||||
"""A hookify rule."""
|
||||
name: str
|
||||
enabled: bool
|
||||
event: str # "bash", "file", "stop", "all", etc.
|
||||
pattern: Optional[str] = None # Simple pattern (legacy)
|
||||
conditions: List[Condition] = field(default_factory=list)
|
||||
action: str = "warn" # "warn" or "block" (future)
|
||||
tool_matcher: Optional[str] = None # Override tool matching
|
||||
message: str = "" # Message body from markdown
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, frontmatter: Dict[str, Any], message: str) -> 'Rule':
|
||||
"""Create Rule from frontmatter dict and message body."""
|
||||
# Handle both simple pattern and complex conditions
|
||||
conditions = []
|
||||
|
||||
# New style: explicit conditions list
|
||||
if 'conditions' in frontmatter:
|
||||
cond_list = frontmatter['conditions']
|
||||
if isinstance(cond_list, list):
|
||||
conditions = [Condition.from_dict(c) for c in cond_list]
|
||||
|
||||
# Legacy style: simple pattern field
|
||||
simple_pattern = frontmatter.get('pattern')
|
||||
if simple_pattern and not conditions:
|
||||
# Convert simple pattern to condition
|
||||
# Infer field from event
|
||||
event = frontmatter.get('event', 'all')
|
||||
if event == 'bash':
|
||||
field = 'command'
|
||||
elif event == 'file':
|
||||
field = 'new_text'
|
||||
else:
|
||||
field = 'content'
|
||||
|
||||
conditions = [Condition(
|
||||
field=field,
|
||||
operator='regex_match',
|
||||
pattern=simple_pattern
|
||||
)]
|
||||
|
||||
return cls(
|
||||
name=frontmatter.get('name', 'unnamed'),
|
||||
enabled=frontmatter.get('enabled', True),
|
||||
event=frontmatter.get('event', 'all'),
|
||||
pattern=simple_pattern,
|
||||
conditions=conditions,
|
||||
action=frontmatter.get('action', 'warn'),
|
||||
tool_matcher=frontmatter.get('tool_matcher'),
|
||||
message=message.strip()
|
||||
)
|
||||
|
||||
|
||||
def extract_frontmatter(content: str) -> tuple[Dict[str, Any], str]:
|
||||
"""Extract YAML frontmatter and message body from markdown.
|
||||
|
||||
Returns (frontmatter_dict, message_body).
|
||||
|
||||
Supports multi-line dictionary items in lists by preserving indentation.
|
||||
"""
|
||||
if not content.startswith('---'):
|
||||
return {}, content
|
||||
|
||||
# Split on --- markers
|
||||
parts = content.split('---', 2)
|
||||
if len(parts) < 3:
|
||||
return {}, content
|
||||
|
||||
frontmatter_text = parts[1]
|
||||
message = parts[2].strip()
|
||||
|
||||
# Simple YAML parser that handles indented list items
|
||||
frontmatter = {}
|
||||
lines = frontmatter_text.split('\n')
|
||||
|
||||
current_key = None
|
||||
current_list = []
|
||||
current_dict = {}
|
||||
in_list = False
|
||||
in_dict_item = False
|
||||
|
||||
for line in lines:
|
||||
# Skip empty lines and comments
|
||||
stripped = line.strip()
|
||||
if not stripped or stripped.startswith('#'):
|
||||
continue
|
||||
|
||||
# Check indentation level
|
||||
indent = len(line) - len(line.lstrip())
|
||||
|
||||
# Top-level key (no indentation or minimal)
|
||||
if indent == 0 and ':' in line and not line.strip().startswith('-'):
|
||||
# Save previous list/dict if any
|
||||
if in_list and current_key:
|
||||
if in_dict_item and current_dict:
|
||||
current_list.append(current_dict)
|
||||
current_dict = {}
|
||||
frontmatter[current_key] = current_list
|
||||
in_list = False
|
||||
in_dict_item = False
|
||||
current_list = []
|
||||
|
||||
key, value = line.split(':', 1)
|
||||
key = key.strip()
|
||||
value = value.strip()
|
||||
|
||||
if not value:
|
||||
# Empty value - list or nested structure follows
|
||||
current_key = key
|
||||
in_list = True
|
||||
current_list = []
|
||||
else:
|
||||
# Simple key-value pair
|
||||
value = value.strip('"').strip("'")
|
||||
if value.lower() == 'true':
|
||||
value = True
|
||||
elif value.lower() == 'false':
|
||||
value = False
|
||||
frontmatter[key] = value
|
||||
|
||||
# List item (starts with -)
|
||||
elif stripped.startswith('-') and in_list:
|
||||
# Save previous dict item if any
|
||||
if in_dict_item and current_dict:
|
||||
current_list.append(current_dict)
|
||||
current_dict = {}
|
||||
|
||||
item_text = stripped[1:].strip()
|
||||
|
||||
# Check if this is an inline dict (key: value on same line)
|
||||
if ':' in item_text and ',' in item_text:
|
||||
# Inline comma-separated dict: "- field: command, operator: regex_match"
|
||||
item_dict = {}
|
||||
for part in item_text.split(','):
|
||||
if ':' in part:
|
||||
k, v = part.split(':', 1)
|
||||
item_dict[k.strip()] = v.strip().strip('"').strip("'")
|
||||
current_list.append(item_dict)
|
||||
in_dict_item = False
|
||||
elif ':' in item_text:
|
||||
# Start of multi-line dict item: "- field: command"
|
||||
in_dict_item = True
|
||||
k, v = item_text.split(':', 1)
|
||||
current_dict = {k.strip(): v.strip().strip('"').strip("'")}
|
||||
else:
|
||||
# Simple list item
|
||||
current_list.append(item_text.strip('"').strip("'"))
|
||||
in_dict_item = False
|
||||
|
||||
# Continuation of dict item (indented under list item)
|
||||
elif indent > 2 and in_dict_item and ':' in line:
|
||||
# This is a field of the current dict item
|
||||
k, v = stripped.split(':', 1)
|
||||
current_dict[k.strip()] = v.strip().strip('"').strip("'")
|
||||
|
||||
# Save final list/dict if any
|
||||
if in_list and current_key:
|
||||
if in_dict_item and current_dict:
|
||||
current_list.append(current_dict)
|
||||
frontmatter[current_key] = current_list
|
||||
|
||||
return frontmatter, message
|
||||
|
||||
|
||||
def load_rules(event: Optional[str] = None) -> List[Rule]:
|
||||
"""Load all hookify rules from .claude directory.
|
||||
|
||||
Args:
|
||||
event: Optional event filter ("bash", "file", "stop", etc.)
|
||||
|
||||
Returns:
|
||||
List of enabled Rule objects matching the event.
|
||||
"""
|
||||
rules = []
|
||||
|
||||
# Find all hookify.*.local.md files
|
||||
pattern = os.path.join('.claude', 'hookify.*.local.md')
|
||||
files = glob.glob(pattern)
|
||||
|
||||
for file_path in files:
|
||||
try:
|
||||
rule = load_rule_file(file_path)
|
||||
if not rule:
|
||||
continue
|
||||
|
||||
# Filter by event if specified
|
||||
if event:
|
||||
if rule.event != 'all' and rule.event != event:
|
||||
continue
|
||||
|
||||
# Only include enabled rules
|
||||
if rule.enabled:
|
||||
rules.append(rule)
|
||||
|
||||
except (IOError, OSError, PermissionError) as e:
|
||||
# File I/O errors - log and continue
|
||||
print(f"Warning: Failed to read {file_path}: {e}", file=sys.stderr)
|
||||
continue
|
||||
except (ValueError, KeyError, AttributeError, TypeError) as e:
|
||||
# Parsing errors - log and continue
|
||||
print(f"Warning: Failed to parse {file_path}: {e}", file=sys.stderr)
|
||||
continue
|
||||
except Exception as e:
|
||||
# Unexpected errors - log with type details
|
||||
print(f"Warning: Unexpected error loading {file_path} ({type(e).__name__}): {e}", file=sys.stderr)
|
||||
continue
|
||||
|
||||
return rules
|
||||
|
||||
|
||||
def load_rule_file(file_path: str) -> Optional[Rule]:
|
||||
"""Load a single rule file.
|
||||
|
||||
Returns:
|
||||
Rule object or None if file is invalid.
|
||||
"""
|
||||
try:
|
||||
with open(file_path, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
frontmatter, message = extract_frontmatter(content)
|
||||
|
||||
if not frontmatter:
|
||||
print(f"Warning: {file_path} missing YAML frontmatter (must start with ---)", file=sys.stderr)
|
||||
return None
|
||||
|
||||
rule = Rule.from_dict(frontmatter, message)
|
||||
return rule
|
||||
|
||||
except (IOError, OSError, PermissionError) as e:
|
||||
print(f"Error: Cannot read {file_path}: {e}", file=sys.stderr)
|
||||
return None
|
||||
except (ValueError, KeyError, AttributeError, TypeError) as e:
|
||||
print(f"Error: Malformed rule file {file_path}: {e}", file=sys.stderr)
|
||||
return None
|
||||
except UnicodeDecodeError as e:
|
||||
print(f"Error: Invalid encoding in {file_path}: {e}", file=sys.stderr)
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"Error: Unexpected error parsing {file_path} ({type(e).__name__}): {e}", file=sys.stderr)
|
||||
return None
|
||||
|
||||
|
||||
# For testing
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
|
||||
# Test frontmatter parsing
|
||||
test_content = """---
|
||||
name: test-rule
|
||||
enabled: true
|
||||
event: bash
|
||||
pattern: "rm -rf"
|
||||
---
|
||||
|
||||
⚠️ Dangerous command detected!
|
||||
"""
|
||||
|
||||
fm, msg = extract_frontmatter(test_content)
|
||||
print("Frontmatter:", fm)
|
||||
print("Message:", msg)
|
||||
|
||||
rule = Rule.from_dict(fm, msg)
|
||||
print("Rule:", rule)
|
||||
@@ -1,313 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Rule evaluation engine for hookify plugin."""
|
||||
|
||||
import re
|
||||
import sys
|
||||
from functools import lru_cache
|
||||
from typing import List, Dict, Any, Optional
|
||||
|
||||
# Import from local module
|
||||
from hookify.core.config_loader import Rule, Condition
|
||||
|
||||
|
||||
# Cache compiled regexes (max 128 patterns)
|
||||
@lru_cache(maxsize=128)
|
||||
def compile_regex(pattern: str) -> re.Pattern:
|
||||
"""Compile regex pattern with caching.
|
||||
|
||||
Args:
|
||||
pattern: Regex pattern string
|
||||
|
||||
Returns:
|
||||
Compiled regex pattern
|
||||
"""
|
||||
return re.compile(pattern, re.IGNORECASE)
|
||||
|
||||
|
||||
class RuleEngine:
|
||||
"""Evaluates rules against hook input data."""
|
||||
|
||||
def __init__(self):
|
||||
"""Initialize rule engine."""
|
||||
# No need for instance cache anymore - using global lru_cache
|
||||
pass
|
||||
|
||||
def evaluate_rules(self, rules: List[Rule], input_data: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""Evaluate all rules and return combined results.
|
||||
|
||||
Checks all rules and accumulates matches. Blocking rules take priority
|
||||
over warning rules. All matching rule messages are combined.
|
||||
|
||||
Args:
|
||||
rules: List of Rule objects to evaluate
|
||||
input_data: Hook input JSON (tool_name, tool_input, etc.)
|
||||
|
||||
Returns:
|
||||
Response dict with systemMessage, hookSpecificOutput, etc.
|
||||
Empty dict {} if no rules match.
|
||||
"""
|
||||
hook_event = input_data.get('hook_event_name', '')
|
||||
blocking_rules = []
|
||||
warning_rules = []
|
||||
|
||||
for rule in rules:
|
||||
if self._rule_matches(rule, input_data):
|
||||
if rule.action == 'block':
|
||||
blocking_rules.append(rule)
|
||||
else:
|
||||
warning_rules.append(rule)
|
||||
|
||||
# If any blocking rules matched, block the operation
|
||||
if blocking_rules:
|
||||
messages = [f"**[{r.name}]**\n{r.message}" for r in blocking_rules]
|
||||
combined_message = "\n\n".join(messages)
|
||||
|
||||
# Use appropriate blocking format based on event type
|
||||
if hook_event == 'Stop':
|
||||
return {
|
||||
"decision": "block",
|
||||
"reason": combined_message,
|
||||
"systemMessage": combined_message
|
||||
}
|
||||
elif hook_event in ['PreToolUse', 'PostToolUse']:
|
||||
return {
|
||||
"hookSpecificOutput": {
|
||||
"hookEventName": hook_event,
|
||||
"permissionDecision": "deny"
|
||||
},
|
||||
"systemMessage": combined_message
|
||||
}
|
||||
else:
|
||||
# For other events, just show message
|
||||
return {
|
||||
"systemMessage": combined_message
|
||||
}
|
||||
|
||||
# If only warnings, show them but allow operation
|
||||
if warning_rules:
|
||||
messages = [f"**[{r.name}]**\n{r.message}" for r in warning_rules]
|
||||
return {
|
||||
"systemMessage": "\n\n".join(messages)
|
||||
}
|
||||
|
||||
# No matches - allow operation
|
||||
return {}
|
||||
|
||||
def _rule_matches(self, rule: Rule, input_data: Dict[str, Any]) -> bool:
|
||||
"""Check if rule matches input data.
|
||||
|
||||
Args:
|
||||
rule: Rule to evaluate
|
||||
input_data: Hook input data
|
||||
|
||||
Returns:
|
||||
True if rule matches, False otherwise
|
||||
"""
|
||||
# Extract tool information
|
||||
tool_name = input_data.get('tool_name', '')
|
||||
tool_input = input_data.get('tool_input', {})
|
||||
|
||||
# Check tool matcher if specified
|
||||
if rule.tool_matcher:
|
||||
if not self._matches_tool(rule.tool_matcher, tool_name):
|
||||
return False
|
||||
|
||||
# If no conditions, don't match
|
||||
# (Rules must have at least one condition to be valid)
|
||||
if not rule.conditions:
|
||||
return False
|
||||
|
||||
# All conditions must match
|
||||
for condition in rule.conditions:
|
||||
if not self._check_condition(condition, tool_name, tool_input, input_data):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def _matches_tool(self, matcher: str, tool_name: str) -> bool:
|
||||
"""Check if tool_name matches the matcher pattern.
|
||||
|
||||
Args:
|
||||
matcher: Pattern like "Bash", "Edit|Write", "*"
|
||||
tool_name: Actual tool name
|
||||
|
||||
Returns:
|
||||
True if matches
|
||||
"""
|
||||
if matcher == '*':
|
||||
return True
|
||||
|
||||
# Split on | for OR matching
|
||||
patterns = matcher.split('|')
|
||||
return tool_name in patterns
|
||||
|
||||
def _check_condition(self, condition: Condition, tool_name: str,
|
||||
tool_input: Dict[str, Any], input_data: Dict[str, Any] = None) -> bool:
|
||||
"""Check if a single condition matches.
|
||||
|
||||
Args:
|
||||
condition: Condition to check
|
||||
tool_name: Tool being used
|
||||
tool_input: Tool input dict
|
||||
input_data: Full hook input data (for Stop events, etc.)
|
||||
|
||||
Returns:
|
||||
True if condition matches
|
||||
"""
|
||||
# Extract the field value to check
|
||||
field_value = self._extract_field(condition.field, tool_name, tool_input, input_data)
|
||||
if field_value is None:
|
||||
return False
|
||||
|
||||
# Apply operator
|
||||
operator = condition.operator
|
||||
pattern = condition.pattern
|
||||
|
||||
if operator == 'regex_match':
|
||||
return self._regex_match(pattern, field_value)
|
||||
elif operator == 'contains':
|
||||
return pattern in field_value
|
||||
elif operator == 'equals':
|
||||
return pattern == field_value
|
||||
elif operator == 'not_contains':
|
||||
return pattern not in field_value
|
||||
elif operator == 'starts_with':
|
||||
return field_value.startswith(pattern)
|
||||
elif operator == 'ends_with':
|
||||
return field_value.endswith(pattern)
|
||||
else:
|
||||
# Unknown operator
|
||||
return False
|
||||
|
||||
def _extract_field(self, field: str, tool_name: str,
|
||||
tool_input: Dict[str, Any], input_data: Dict[str, Any] = None) -> Optional[str]:
|
||||
"""Extract field value from tool input or hook input data.
|
||||
|
||||
Args:
|
||||
field: Field name like "command", "new_text", "file_path", "reason", "transcript"
|
||||
tool_name: Tool being used (may be empty for Stop events)
|
||||
tool_input: Tool input dict
|
||||
input_data: Full hook input (for accessing transcript_path, reason, etc.)
|
||||
|
||||
Returns:
|
||||
Field value as string, or None if not found
|
||||
"""
|
||||
# Direct tool_input fields
|
||||
if field in tool_input:
|
||||
value = tool_input[field]
|
||||
if isinstance(value, str):
|
||||
return value
|
||||
return str(value)
|
||||
|
||||
# For Stop events and other non-tool events, check input_data
|
||||
if input_data:
|
||||
# Stop event specific fields
|
||||
if field == 'reason':
|
||||
return input_data.get('reason', '')
|
||||
elif field == 'transcript':
|
||||
# Read transcript file if path provided
|
||||
transcript_path = input_data.get('transcript_path')
|
||||
if transcript_path:
|
||||
try:
|
||||
with open(transcript_path, 'r') as f:
|
||||
return f.read()
|
||||
except FileNotFoundError:
|
||||
print(f"Warning: Transcript file not found: {transcript_path}", file=sys.stderr)
|
||||
return ''
|
||||
except PermissionError:
|
||||
print(f"Warning: Permission denied reading transcript: {transcript_path}", file=sys.stderr)
|
||||
return ''
|
||||
except (IOError, OSError) as e:
|
||||
print(f"Warning: Error reading transcript {transcript_path}: {e}", file=sys.stderr)
|
||||
return ''
|
||||
except UnicodeDecodeError as e:
|
||||
print(f"Warning: Encoding error in transcript {transcript_path}: {e}", file=sys.stderr)
|
||||
return ''
|
||||
elif field == 'user_prompt':
|
||||
# For UserPromptSubmit events
|
||||
return input_data.get('user_prompt', '')
|
||||
|
||||
# Handle special cases by tool type
|
||||
if tool_name == 'Bash':
|
||||
if field == 'command':
|
||||
return tool_input.get('command', '')
|
||||
|
||||
elif tool_name in ['Write', 'Edit']:
|
||||
if field == 'content':
|
||||
# Write uses 'content', Edit has 'new_string'
|
||||
return tool_input.get('content') or tool_input.get('new_string', '')
|
||||
elif field == 'new_text' or field == 'new_string':
|
||||
return tool_input.get('new_string', '')
|
||||
elif field == 'old_text' or field == 'old_string':
|
||||
return tool_input.get('old_string', '')
|
||||
elif field == 'file_path':
|
||||
return tool_input.get('file_path', '')
|
||||
|
||||
elif tool_name == 'MultiEdit':
|
||||
if field == 'file_path':
|
||||
return tool_input.get('file_path', '')
|
||||
elif field in ['new_text', 'content']:
|
||||
# Concatenate all edits
|
||||
edits = tool_input.get('edits', [])
|
||||
return ' '.join(e.get('new_string', '') for e in edits)
|
||||
|
||||
return None
|
||||
|
||||
def _regex_match(self, pattern: str, text: str) -> bool:
|
||||
"""Check if pattern matches text using regex.
|
||||
|
||||
Args:
|
||||
pattern: Regex pattern
|
||||
text: Text to match against
|
||||
|
||||
Returns:
|
||||
True if pattern matches
|
||||
"""
|
||||
try:
|
||||
# Use cached compiled regex (LRU cache with max 128 patterns)
|
||||
regex = compile_regex(pattern)
|
||||
return bool(regex.search(text))
|
||||
|
||||
except re.error as e:
|
||||
print(f"Invalid regex pattern '{pattern}': {e}", file=sys.stderr)
|
||||
return False
|
||||
|
||||
|
||||
# For testing
|
||||
if __name__ == '__main__':
|
||||
from hookify.core.config_loader import Condition, Rule
|
||||
|
||||
# Test rule evaluation
|
||||
rule = Rule(
|
||||
name="test-rm",
|
||||
enabled=True,
|
||||
event="bash",
|
||||
conditions=[
|
||||
Condition(field="command", operator="regex_match", pattern=r"rm\s+-rf")
|
||||
],
|
||||
message="Dangerous rm command!"
|
||||
)
|
||||
|
||||
engine = RuleEngine()
|
||||
|
||||
# Test matching input
|
||||
test_input = {
|
||||
"tool_name": "Bash",
|
||||
"tool_input": {
|
||||
"command": "rm -rf /tmp/test"
|
||||
}
|
||||
}
|
||||
|
||||
result = engine.evaluate_rules([rule], test_input)
|
||||
print("Match result:", result)
|
||||
|
||||
# Test non-matching input
|
||||
test_input2 = {
|
||||
"tool_name": "Bash",
|
||||
"tool_input": {
|
||||
"command": "ls -la"
|
||||
}
|
||||
}
|
||||
|
||||
result2 = engine.evaluate_rules([rule], test_input2)
|
||||
print("Non-match result:", result2)
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
name: warn-console-log
|
||||
enabled: true
|
||||
event: file
|
||||
pattern: console\.log\(
|
||||
action: warn
|
||||
---
|
||||
|
||||
🔍 **Console.log detected**
|
||||
|
||||
You're adding a console.log statement. Please consider:
|
||||
- Is this for debugging or should it be proper logging?
|
||||
- Will this ship to production?
|
||||
- Should this use a logging library instead?
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
name: block-dangerous-rm
|
||||
enabled: true
|
||||
event: bash
|
||||
pattern: rm\s+-rf
|
||||
action: block
|
||||
---
|
||||
|
||||
⚠️ **Dangerous rm command detected!**
|
||||
|
||||
This command could delete important files. Please:
|
||||
- Verify the path is correct
|
||||
- Consider using a safer approach
|
||||
- Make sure you have backups
|
||||
@@ -1,22 +0,0 @@
|
||||
---
|
||||
name: require-tests-run
|
||||
enabled: false
|
||||
event: stop
|
||||
action: block
|
||||
conditions:
|
||||
- field: transcript
|
||||
operator: not_contains
|
||||
pattern: npm test|pytest|cargo test
|
||||
---
|
||||
|
||||
**Tests not detected in transcript!**
|
||||
|
||||
Before stopping, please run tests to verify your changes work correctly.
|
||||
|
||||
Look for test commands like:
|
||||
- `npm test`
|
||||
- `pytest`
|
||||
- `cargo test`
|
||||
|
||||
**Note:** This rule blocks stopping if no test commands appear in the transcript.
|
||||
Enable this rule only when you want strict test enforcement.
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
name: warn-sensitive-files
|
||||
enabled: true
|
||||
event: file
|
||||
action: warn
|
||||
conditions:
|
||||
- field: file_path
|
||||
operator: regex_match
|
||||
pattern: \.env$|\.env\.|credentials|secrets
|
||||
---
|
||||
|
||||
🔐 **Sensitive file detected**
|
||||
|
||||
You're editing a file that may contain sensitive data:
|
||||
- Ensure credentials are not hardcoded
|
||||
- Use environment variables for secrets
|
||||
- Verify this file is in .gitignore
|
||||
- Consider using a secrets manager
|
||||
@@ -1,49 +0,0 @@
|
||||
{
|
||||
"description": "Hookify plugin - User-configurable hooks from .local.md files",
|
||||
"hooks": {
|
||||
"PreToolUse": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/pretooluse.py",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PostToolUse": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/posttooluse.py",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"Stop": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/stop.py",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"UserPromptSubmit": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/userpromptsubmit.py",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""PostToolUse hook executor for hookify plugin.
|
||||
|
||||
This script is called by Claude Code after a tool executes.
|
||||
It reads .claude/hookify.*.local.md files and evaluates rules.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
|
||||
# CRITICAL: Add plugin root to Python path for imports
|
||||
PLUGIN_ROOT = os.environ.get('CLAUDE_PLUGIN_ROOT')
|
||||
if PLUGIN_ROOT:
|
||||
parent_dir = os.path.dirname(PLUGIN_ROOT)
|
||||
if parent_dir not in sys.path:
|
||||
sys.path.insert(0, parent_dir)
|
||||
if PLUGIN_ROOT not in sys.path:
|
||||
sys.path.insert(0, PLUGIN_ROOT)
|
||||
|
||||
try:
|
||||
from hookify.core.config_loader import load_rules
|
||||
from hookify.core.rule_engine import RuleEngine
|
||||
except ImportError as e:
|
||||
error_msg = {"systemMessage": f"Hookify import error: {e}"}
|
||||
print(json.dumps(error_msg), file=sys.stdout)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point for PostToolUse hook."""
|
||||
try:
|
||||
# Read input from stdin
|
||||
input_data = json.load(sys.stdin)
|
||||
|
||||
# Determine event type based on tool
|
||||
tool_name = input_data.get('tool_name', '')
|
||||
event = None
|
||||
if tool_name == 'Bash':
|
||||
event = 'bash'
|
||||
elif tool_name in ['Edit', 'Write', 'MultiEdit']:
|
||||
event = 'file'
|
||||
|
||||
# Load rules
|
||||
rules = load_rules(event=event)
|
||||
|
||||
# Evaluate rules
|
||||
engine = RuleEngine()
|
||||
result = engine.evaluate_rules(rules, input_data)
|
||||
|
||||
# Always output JSON (even if empty)
|
||||
print(json.dumps(result), file=sys.stdout)
|
||||
|
||||
except Exception as e:
|
||||
error_output = {
|
||||
"systemMessage": f"Hookify error: {str(e)}"
|
||||
}
|
||||
print(json.dumps(error_output), file=sys.stdout)
|
||||
|
||||
finally:
|
||||
# ALWAYS exit 0
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""PreToolUse hook executor for hookify plugin.
|
||||
|
||||
This script is called by Claude Code before any tool executes.
|
||||
It reads .claude/hookify.*.local.md files and evaluates rules.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
|
||||
# CRITICAL: Add plugin root to Python path for imports
|
||||
# We need to add the parent of the plugin directory so Python can find "hookify" package
|
||||
PLUGIN_ROOT = os.environ.get('CLAUDE_PLUGIN_ROOT')
|
||||
if PLUGIN_ROOT:
|
||||
# Add the parent directory of the plugin
|
||||
parent_dir = os.path.dirname(PLUGIN_ROOT)
|
||||
if parent_dir not in sys.path:
|
||||
sys.path.insert(0, parent_dir)
|
||||
|
||||
# Also add PLUGIN_ROOT itself in case we have other scripts
|
||||
if PLUGIN_ROOT not in sys.path:
|
||||
sys.path.insert(0, PLUGIN_ROOT)
|
||||
|
||||
try:
|
||||
from hookify.core.config_loader import load_rules
|
||||
from hookify.core.rule_engine import RuleEngine
|
||||
except ImportError as e:
|
||||
# If imports fail, allow operation and log error
|
||||
error_msg = {"systemMessage": f"Hookify import error: {e}"}
|
||||
print(json.dumps(error_msg), file=sys.stdout)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point for PreToolUse hook."""
|
||||
try:
|
||||
# Read input from stdin
|
||||
input_data = json.load(sys.stdin)
|
||||
|
||||
# Determine event type for filtering
|
||||
# For PreToolUse, we use tool_name to determine "bash" vs "file" event
|
||||
tool_name = input_data.get('tool_name', '')
|
||||
|
||||
event = None
|
||||
if tool_name == 'Bash':
|
||||
event = 'bash'
|
||||
elif tool_name in ['Edit', 'Write', 'MultiEdit']:
|
||||
event = 'file'
|
||||
|
||||
# Load rules
|
||||
rules = load_rules(event=event)
|
||||
|
||||
# Evaluate rules
|
||||
engine = RuleEngine()
|
||||
result = engine.evaluate_rules(rules, input_data)
|
||||
|
||||
# Always output JSON (even if empty)
|
||||
print(json.dumps(result), file=sys.stdout)
|
||||
|
||||
except Exception as e:
|
||||
# On any error, allow the operation and log
|
||||
error_output = {
|
||||
"systemMessage": f"Hookify error: {str(e)}"
|
||||
}
|
||||
print(json.dumps(error_output), file=sys.stdout)
|
||||
|
||||
finally:
|
||||
# ALWAYS exit 0 - never block operations due to hook errors
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,59 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Stop hook executor for hookify plugin.
|
||||
|
||||
This script is called by Claude Code when agent wants to stop.
|
||||
It reads .claude/hookify.*.local.md files and evaluates stop rules.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
|
||||
# CRITICAL: Add plugin root to Python path for imports
|
||||
PLUGIN_ROOT = os.environ.get('CLAUDE_PLUGIN_ROOT')
|
||||
if PLUGIN_ROOT:
|
||||
parent_dir = os.path.dirname(PLUGIN_ROOT)
|
||||
if parent_dir not in sys.path:
|
||||
sys.path.insert(0, parent_dir)
|
||||
if PLUGIN_ROOT not in sys.path:
|
||||
sys.path.insert(0, PLUGIN_ROOT)
|
||||
|
||||
try:
|
||||
from hookify.core.config_loader import load_rules
|
||||
from hookify.core.rule_engine import RuleEngine
|
||||
except ImportError as e:
|
||||
error_msg = {"systemMessage": f"Hookify import error: {e}"}
|
||||
print(json.dumps(error_msg), file=sys.stdout)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point for Stop hook."""
|
||||
try:
|
||||
# Read input from stdin
|
||||
input_data = json.load(sys.stdin)
|
||||
|
||||
# Load stop rules
|
||||
rules = load_rules(event='stop')
|
||||
|
||||
# Evaluate rules
|
||||
engine = RuleEngine()
|
||||
result = engine.evaluate_rules(rules, input_data)
|
||||
|
||||
# Always output JSON (even if empty)
|
||||
print(json.dumps(result), file=sys.stdout)
|
||||
|
||||
except Exception as e:
|
||||
# On any error, allow the operation
|
||||
error_output = {
|
||||
"systemMessage": f"Hookify error: {str(e)}"
|
||||
}
|
||||
print(json.dumps(error_output), file=sys.stdout)
|
||||
|
||||
finally:
|
||||
# ALWAYS exit 0
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""UserPromptSubmit hook executor for hookify plugin.
|
||||
|
||||
This script is called by Claude Code when user submits a prompt.
|
||||
It reads .claude/hookify.*.local.md files and evaluates rules.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
|
||||
# CRITICAL: Add plugin root to Python path for imports
|
||||
PLUGIN_ROOT = os.environ.get('CLAUDE_PLUGIN_ROOT')
|
||||
if PLUGIN_ROOT:
|
||||
parent_dir = os.path.dirname(PLUGIN_ROOT)
|
||||
if parent_dir not in sys.path:
|
||||
sys.path.insert(0, parent_dir)
|
||||
if PLUGIN_ROOT not in sys.path:
|
||||
sys.path.insert(0, PLUGIN_ROOT)
|
||||
|
||||
try:
|
||||
from hookify.core.config_loader import load_rules
|
||||
from hookify.core.rule_engine import RuleEngine
|
||||
except ImportError as e:
|
||||
error_msg = {"systemMessage": f"Hookify import error: {e}"}
|
||||
print(json.dumps(error_msg), file=sys.stdout)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point for UserPromptSubmit hook."""
|
||||
try:
|
||||
# Read input from stdin
|
||||
input_data = json.load(sys.stdin)
|
||||
|
||||
# Load user prompt rules
|
||||
rules = load_rules(event='prompt')
|
||||
|
||||
# Evaluate rules
|
||||
engine = RuleEngine()
|
||||
result = engine.evaluate_rules(rules, input_data)
|
||||
|
||||
# Always output JSON (even if empty)
|
||||
print(json.dumps(result), file=sys.stdout)
|
||||
|
||||
except Exception as e:
|
||||
error_output = {
|
||||
"systemMessage": f"Hookify error: {str(e)}"
|
||||
}
|
||||
print(json.dumps(error_output), file=sys.stdout)
|
||||
|
||||
finally:
|
||||
# ALWAYS exit 0
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,374 +0,0 @@
|
||||
---
|
||||
name: Writing Hookify Rules
|
||||
description: This skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
|
||||
version: 0.1.0
|
||||
---
|
||||
|
||||
# Writing Hookify Rules
|
||||
|
||||
## Overview
|
||||
|
||||
Hookify rules are markdown files with YAML frontmatter that define patterns to watch for and messages to show when those patterns match. Rules are stored in `.claude/hookify.{rule-name}.local.md` files.
|
||||
|
||||
## Rule File Format
|
||||
|
||||
### Basic Structure
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: rule-identifier
|
||||
enabled: true
|
||||
event: bash|file|stop|prompt|all
|
||||
pattern: regex-pattern-here
|
||||
---
|
||||
|
||||
Message to show Claude when this rule triggers.
|
||||
Can include markdown formatting, warnings, suggestions, etc.
|
||||
```
|
||||
|
||||
### Frontmatter Fields
|
||||
|
||||
**name** (required): Unique identifier for the rule
|
||||
- Use kebab-case: `warn-dangerous-rm`, `block-console-log`
|
||||
- Be descriptive and action-oriented
|
||||
- Start with verb: warn, prevent, block, require, check
|
||||
|
||||
**enabled** (required): Boolean to activate/deactivate
|
||||
- `true`: Rule is active
|
||||
- `false`: Rule is disabled (won't trigger)
|
||||
- Can toggle without deleting rule
|
||||
|
||||
**event** (required): Which hook event to trigger on
|
||||
- `bash`: Bash tool commands
|
||||
- `file`: Edit, Write, MultiEdit tools
|
||||
- `stop`: When agent wants to stop
|
||||
- `prompt`: When user submits a prompt
|
||||
- `all`: All events
|
||||
|
||||
**action** (optional): What to do when rule matches
|
||||
- `warn`: Show message but allow operation (default)
|
||||
- `block`: Prevent operation (PreToolUse) or stop session (Stop events)
|
||||
- If omitted, defaults to `warn`
|
||||
|
||||
**pattern** (simple format): Regex pattern to match
|
||||
- Used for simple single-condition rules
|
||||
- Matches against command (bash) or new_text (file)
|
||||
- Python regex syntax
|
||||
|
||||
**Example:**
|
||||
```yaml
|
||||
event: bash
|
||||
pattern: rm\s+-rf
|
||||
```
|
||||
|
||||
### Advanced Format (Multiple Conditions)
|
||||
|
||||
For complex rules with multiple conditions:
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: warn-env-file-edits
|
||||
enabled: true
|
||||
event: file
|
||||
conditions:
|
||||
- field: file_path
|
||||
operator: regex_match
|
||||
pattern: \.env$
|
||||
- field: new_text
|
||||
operator: contains
|
||||
pattern: API_KEY
|
||||
---
|
||||
|
||||
You're adding an API key to a .env file. Ensure this file is in .gitignore!
|
||||
```
|
||||
|
||||
**Condition fields:**
|
||||
- `field`: Which field to check
|
||||
- For bash: `command`
|
||||
- For file: `file_path`, `new_text`, `old_text`, `content`
|
||||
- `operator`: How to match
|
||||
- `regex_match`: Regex pattern matching
|
||||
- `contains`: Substring check
|
||||
- `equals`: Exact match
|
||||
- `not_contains`: Substring must NOT be present
|
||||
- `starts_with`: Prefix check
|
||||
- `ends_with`: Suffix check
|
||||
- `pattern`: Pattern or string to match
|
||||
|
||||
**All conditions must match for rule to trigger.**
|
||||
|
||||
## Message Body
|
||||
|
||||
The markdown content after frontmatter is shown to Claude when the rule triggers.
|
||||
|
||||
**Good messages:**
|
||||
- Explain what was detected
|
||||
- Explain why it's problematic
|
||||
- Suggest alternatives or best practices
|
||||
- Use formatting for clarity (bold, lists, etc.)
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
⚠️ **Console.log detected!**
|
||||
|
||||
You're adding console.log to production code.
|
||||
|
||||
**Why this matters:**
|
||||
- Debug logs shouldn't ship to production
|
||||
- Console.log can expose sensitive data
|
||||
- Impacts browser performance
|
||||
|
||||
**Alternatives:**
|
||||
- Use a proper logging library
|
||||
- Remove before committing
|
||||
- Use conditional debug builds
|
||||
```
|
||||
|
||||
## Event Type Guide
|
||||
|
||||
### bash Events
|
||||
|
||||
Match Bash command patterns:
|
||||
|
||||
```markdown
|
||||
---
|
||||
event: bash
|
||||
pattern: sudo\s+|rm\s+-rf|chmod\s+777
|
||||
---
|
||||
|
||||
Dangerous command detected!
|
||||
```
|
||||
|
||||
**Common patterns:**
|
||||
- Dangerous commands: `rm\s+-rf`, `dd\s+if=`, `mkfs`
|
||||
- Privilege escalation: `sudo\s+`, `su\s+`
|
||||
- Permission issues: `chmod\s+777`, `chown\s+root`
|
||||
|
||||
### file Events
|
||||
|
||||
Match Edit/Write/MultiEdit operations:
|
||||
|
||||
```markdown
|
||||
---
|
||||
event: file
|
||||
pattern: console\.log\(|eval\(|innerHTML\s*=
|
||||
---
|
||||
|
||||
Potentially problematic code pattern detected!
|
||||
```
|
||||
|
||||
**Match on different fields:**
|
||||
```markdown
|
||||
---
|
||||
event: file
|
||||
conditions:
|
||||
- field: file_path
|
||||
operator: regex_match
|
||||
pattern: \.tsx?$
|
||||
- field: new_text
|
||||
operator: regex_match
|
||||
pattern: console\.log\(
|
||||
---
|
||||
|
||||
Console.log in TypeScript file!
|
||||
```
|
||||
|
||||
**Common patterns:**
|
||||
- Debug code: `console\.log\(`, `debugger`, `print\(`
|
||||
- Security risks: `eval\(`, `innerHTML\s*=`, `dangerouslySetInnerHTML`
|
||||
- Sensitive files: `\.env$`, `credentials`, `\.pem$`
|
||||
- Generated files: `node_modules/`, `dist/`, `build/`
|
||||
|
||||
### stop Events
|
||||
|
||||
Match when agent wants to stop (completion checks):
|
||||
|
||||
```markdown
|
||||
---
|
||||
event: stop
|
||||
pattern: .*
|
||||
---
|
||||
|
||||
Before stopping, verify:
|
||||
- [ ] Tests were run
|
||||
- [ ] Build succeeded
|
||||
- [ ] Documentation updated
|
||||
```
|
||||
|
||||
**Use for:**
|
||||
- Reminders about required steps
|
||||
- Completion checklists
|
||||
- Process enforcement
|
||||
|
||||
### prompt Events
|
||||
|
||||
Match user prompt content (advanced):
|
||||
|
||||
```markdown
|
||||
---
|
||||
event: prompt
|
||||
conditions:
|
||||
- field: user_prompt
|
||||
operator: contains
|
||||
pattern: deploy to production
|
||||
---
|
||||
|
||||
Production deployment checklist:
|
||||
- [ ] Tests passing?
|
||||
- [ ] Reviewed by team?
|
||||
- [ ] Monitoring ready?
|
||||
```
|
||||
|
||||
## Pattern Writing Tips
|
||||
|
||||
### Regex Basics
|
||||
|
||||
**Literal characters:** Most characters match themselves
|
||||
- `rm` matches "rm"
|
||||
- `console.log` matches "console.log"
|
||||
|
||||
**Special characters need escaping:**
|
||||
- `.` (any char) → `\.` (literal dot)
|
||||
- `(` `)` → `\(` `\)` (literal parens)
|
||||
- `[` `]` → `\[` `\]` (literal brackets)
|
||||
|
||||
**Common metacharacters:**
|
||||
- `\s` - whitespace (space, tab, newline)
|
||||
- `\d` - digit (0-9)
|
||||
- `\w` - word character (a-z, A-Z, 0-9, _)
|
||||
- `.` - any character
|
||||
- `+` - one or more
|
||||
- `*` - zero or more
|
||||
- `?` - zero or one
|
||||
- `|` - OR
|
||||
|
||||
**Examples:**
|
||||
```
|
||||
rm\s+-rf Matches: rm -rf, rm -rf
|
||||
console\.log\( Matches: console.log(
|
||||
(eval|exec)\( Matches: eval( or exec(
|
||||
chmod\s+777 Matches: chmod 777, chmod 777
|
||||
API_KEY\s*= Matches: API_KEY=, API_KEY =
|
||||
```
|
||||
|
||||
### Testing Patterns
|
||||
|
||||
Test regex patterns before using:
|
||||
|
||||
```bash
|
||||
python3 -c "import re; print(re.search(r'your_pattern', 'test text'))"
|
||||
```
|
||||
|
||||
Or use online regex testers (regex101.com with Python flavor).
|
||||
|
||||
### Common Pitfalls
|
||||
|
||||
**Too broad:**
|
||||
```yaml
|
||||
pattern: log # Matches "log", "login", "dialog", "catalog"
|
||||
```
|
||||
Better: `console\.log\(|logger\.`
|
||||
|
||||
**Too specific:**
|
||||
```yaml
|
||||
pattern: rm -rf /tmp # Only matches exact path
|
||||
```
|
||||
Better: `rm\s+-rf`
|
||||
|
||||
**Escaping issues:**
|
||||
- YAML quoted strings: `"pattern"` requires double backslashes `\\s`
|
||||
- YAML unquoted: `pattern: \s` works as-is
|
||||
- **Recommendation**: Use unquoted patterns in YAML
|
||||
|
||||
## File Organization
|
||||
|
||||
**Location:** All rules in `.claude/` directory
|
||||
**Naming:** `.claude/hookify.{descriptive-name}.local.md`
|
||||
**Gitignore:** Add `.claude/*.local.md` to `.gitignore`
|
||||
|
||||
**Good names:**
|
||||
- `hookify.dangerous-rm.local.md`
|
||||
- `hookify.console-log.local.md`
|
||||
- `hookify.require-tests.local.md`
|
||||
- `hookify.sensitive-files.local.md`
|
||||
|
||||
**Bad names:**
|
||||
- `hookify.rule1.local.md` (not descriptive)
|
||||
- `hookify.md` (missing .local)
|
||||
- `danger.local.md` (missing hookify prefix)
|
||||
|
||||
## Workflow
|
||||
|
||||
### Creating a Rule
|
||||
|
||||
1. Identify unwanted behavior
|
||||
2. Determine which tool is involved (Bash, Edit, etc.)
|
||||
3. Choose event type (bash, file, stop, etc.)
|
||||
4. Write regex pattern
|
||||
5. Create `.claude/hookify.{name}.local.md` file in project root
|
||||
6. Test immediately - rules are read dynamically on next tool use
|
||||
|
||||
### Refining a Rule
|
||||
|
||||
1. Edit the `.local.md` file
|
||||
2. Adjust pattern or message
|
||||
3. Test immediately - changes take effect on next tool use
|
||||
|
||||
### Disabling a Rule
|
||||
|
||||
**Temporary:** Set `enabled: false` in frontmatter
|
||||
**Permanent:** Delete the `.local.md` file
|
||||
|
||||
## Examples
|
||||
|
||||
See `${CLAUDE_PLUGIN_ROOT}/examples/` for complete examples:
|
||||
- `dangerous-rm.local.md` - Block dangerous rm commands
|
||||
- `console-log-warning.local.md` - Warn about console.log
|
||||
- `sensitive-files-warning.local.md` - Warn about editing .env files
|
||||
|
||||
## Quick Reference
|
||||
|
||||
**Minimum viable rule:**
|
||||
```markdown
|
||||
---
|
||||
name: my-rule
|
||||
enabled: true
|
||||
event: bash
|
||||
pattern: dangerous_command
|
||||
---
|
||||
|
||||
Warning message here
|
||||
```
|
||||
|
||||
**Rule with conditions:**
|
||||
```markdown
|
||||
---
|
||||
name: my-rule
|
||||
enabled: true
|
||||
event: file
|
||||
conditions:
|
||||
- field: file_path
|
||||
operator: regex_match
|
||||
pattern: \.ts$
|
||||
- field: new_text
|
||||
operator: contains
|
||||
pattern: any
|
||||
---
|
||||
|
||||
Warning message
|
||||
```
|
||||
|
||||
**Event types:**
|
||||
- `bash` - Bash commands
|
||||
- `file` - File edits
|
||||
- `stop` - Completion checks
|
||||
- `prompt` - User input
|
||||
- `all` - All events
|
||||
|
||||
**Field options:**
|
||||
- Bash: `command`
|
||||
- File: `file_path`, `new_text`, `old_text`, `content`
|
||||
- Prompt: `user_prompt`
|
||||
|
||||
**Operators:**
|
||||
- `regex_match`, `contains`, `equals`, `not_contains`, `starts_with`, `ends_with`
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user