mirror of
https://github.com/anthropics/claude-code.git
synced 2026-05-19 09:42:39 +00:00
Compare commits
126 Commits
claude/sla
...
v2.1.144
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69d707009e | ||
|
|
2962ecd7a9 | ||
|
|
8bdbb7296d | ||
|
|
d61bfb5b56 | ||
|
|
c5712671c8 | ||
|
|
6b070c31bc | ||
|
|
fdfbc06c7a | ||
|
|
831608a360 | ||
|
|
33a87addb4 | ||
|
|
f7ef09f496 | ||
|
|
2bd8547920 | ||
|
|
6cd790cd21 | ||
|
|
fb063cd5e0 | ||
|
|
60348c9536 | ||
|
|
52b9f247d1 | ||
|
|
71135e41b4 | ||
|
|
5c0e4f96eb | ||
|
|
9fce4e6ed1 | ||
|
|
5bf19945e4 | ||
|
|
a243cad119 | ||
|
|
e512ec9918 | ||
|
|
a609cfbee3 | ||
|
|
1586204194 | ||
|
|
c128568da0 | ||
|
|
7e936457e4 | ||
|
|
c3933441f0 | ||
|
|
ab3ce06c9a | ||
|
|
a5fa36cac7 | ||
|
|
925200dffc | ||
|
|
9afdfd7dc0 | ||
|
|
2fa67717b8 | ||
|
|
fe53778ed9 | ||
|
|
0385848b4e | ||
|
|
71366ecf5d | ||
|
|
2b53fac3b2 | ||
|
|
bf77ee65bc | ||
|
|
5a7bf281ba | ||
|
|
4fb8aa4e0a | ||
|
|
45ae2f5212 | ||
|
|
f348a16da8 | ||
|
|
5c18c787f2 | ||
|
|
194736a4bd | ||
|
|
550aeecc97 | ||
|
|
9772e13f82 | ||
|
|
c5600e0b1e | ||
|
|
d2b22528db | ||
|
|
3c72545dfc | ||
|
|
54c7be5b3f | ||
|
|
22fdf68049 | ||
|
|
227817d0f2 | ||
|
|
b9fbc7796b | ||
|
|
b543a25624 | ||
|
|
1e03cc7fc4 | ||
|
|
a50a91999b | ||
|
|
b4fa5f85f3 | ||
|
|
66ab4ae6e0 | ||
|
|
4411cbae09 | ||
|
|
2d5c1bab92 | ||
|
|
78a44f1b7d | ||
|
|
2923bc87d1 | ||
|
|
f75b6138ef | ||
|
|
a0d9b87038 | ||
|
|
a542f1b4b3 | ||
|
|
cada21c89d | ||
|
|
6aadfbdca2 | ||
|
|
16536693ec | ||
|
|
5e34f198d0 | ||
|
|
a3d9426e3e | ||
|
|
079dc856c6 | ||
|
|
420a188467 | ||
|
|
48b1c6c0ba | ||
|
|
2dc1e69783 | ||
|
|
db8834ba1d | ||
|
|
6f049b620f | ||
|
|
45b5430126 | ||
|
|
f6dbf44cd5 | ||
|
|
540b61b9fd | ||
|
|
00553dec20 | ||
|
|
53a5f3ee07 | ||
|
|
da80366c48 | ||
|
|
9582ad480f | ||
|
|
0b3f7cbbbd | ||
|
|
a8335230bc | ||
|
|
9c63e985f6 | ||
|
|
38281cfd46 | ||
|
|
26a1334ef3 | ||
|
|
cd4956871a | ||
|
|
a772bd6091 | ||
|
|
35b5fe658a | ||
|
|
1f48d799b9 | ||
|
|
7ec9125c54 | ||
|
|
644d6eb37f | ||
|
|
e67079be1f | ||
|
|
016734047d | ||
|
|
d6ab0eafec | ||
|
|
76c0cbaeb5 | ||
|
|
23edca9c9b | ||
|
|
ed58789da7 | ||
|
|
ee4ff289f0 | ||
|
|
b2bab3b743 | ||
|
|
db3858a558 | ||
|
|
a0128f4a40 | ||
|
|
6e7f65eb95 | ||
|
|
8799bb0901 | ||
|
|
05a2bde7be | ||
|
|
3c917dfe50 | ||
|
|
8f0fe03e56 | ||
|
|
baf29b882a | ||
|
|
6aecb15d98 | ||
|
|
76826f2c80 | ||
|
|
3592c8be2a | ||
|
|
3ad3231f0f | ||
|
|
65dfa9898e | ||
|
|
0d996a7c34 | ||
|
|
b18f2e7df0 | ||
|
|
b757fc9ecd | ||
|
|
1718a57495 | ||
|
|
4523c004dd | ||
|
|
32c7ff2b6e | ||
|
|
d787369919 | ||
|
|
8c09097e8c | ||
|
|
edfb5437a4 | ||
|
|
b374a30699 | ||
|
|
a01a88d5ee | ||
|
|
42c62d73ce | ||
|
|
1b50583382 |
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
||||
"$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",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
allowed-tools: Bash(gh issue view:*), Bash(gh search:*), Bash(gh issue list:*), Bash(./scripts/comment-on-duplicates.sh:*)
|
||||
allowed-tools: Bash(./scripts/gh.sh:*), Bash(./scripts/comment-on-duplicates.sh:*)
|
||||
description: Find duplicate GitHub issues
|
||||
---
|
||||
|
||||
@@ -13,11 +13,15 @@ To do this, follow these steps precisely:
|
||||
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 --base-issue <issue-number> --potential-duplicates <dup1> <dup2> <dup3>
|
||||
./scripts/comment-on-duplicates.sh --potential-duplicates <dup1> <dup2> <dup3>
|
||||
```
|
||||
|
||||
Notes (be sure to tell this to your agents, too):
|
||||
|
||||
- Use `gh` to interact with Github, rather than web fetch
|
||||
- Do not use other tools, beyond `gh` and the comment script (eg. don't use other MCP servers, file edit, etc.)
|
||||
- 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,40 +0,0 @@
|
||||
---
|
||||
allowed-tools: Bash(gh issue list:*), Bash(gh issue view:*), Bash(gh issue edit:*), TodoWrite
|
||||
description: Triage GitHub issues and label critical ones for oncall
|
||||
---
|
||||
|
||||
You're an oncall triage assistant for GitHub issues. Your task is to identify critical issues that require immediate oncall attention and apply the "oncall" label.
|
||||
|
||||
Repository: anthropics/claude-code
|
||||
|
||||
Task overview:
|
||||
|
||||
1. First, get all open bugs updated in the last 3 days with at least 50 engagements:
|
||||
```bash
|
||||
gh issue list --repo anthropics/claude-code --state open --label bug --limit 1000 --json number,title,updatedAt,comments,reactions | jq -r '.[] | select((.updatedAt >= (now - 259200 | strftime("%Y-%m-%dT%H:%M:%SZ"))) and ((.comments | length) + ([.reactions[].content] | length) >= 50)) | "\(.number)"'
|
||||
```
|
||||
|
||||
2. Save the list of issue numbers and create a TODO list with ALL of them. This ensures you process every single one.
|
||||
|
||||
3. For each issue in your TODO list:
|
||||
- Use `gh issue view <number> --repo anthropics/claude-code --json title,body,labels,comments` to get full details
|
||||
- Read and understand the full issue content and comments to determine actual user impact
|
||||
- Evaluate: Is this truly blocking users from using Claude Code?
|
||||
- Consider: "crash", "stuck", "frozen", "hang", "unresponsive", "cannot use", "blocked", "broken"
|
||||
- Does it prevent core functionality? Can users work around it?
|
||||
- Be conservative - only flag issues that truly prevent users from getting work done
|
||||
|
||||
4. For issues that are truly blocking and don't already have the "oncall" label:
|
||||
- Use `gh issue edit <number> --repo anthropics/claude-code --add-label "oncall"`
|
||||
- Mark the issue as complete in your TODO list
|
||||
|
||||
5. After processing all issues, provide a summary:
|
||||
- List each issue number that received the "oncall" label
|
||||
- Include the issue title and brief reason why it qualified
|
||||
- If no issues qualified, state that clearly
|
||||
|
||||
Important:
|
||||
- Process ALL issues in your TODO list systematically
|
||||
- Don't post any comments to issues
|
||||
- Only add the "oncall" label, never remove it
|
||||
- Use individual `gh issue view` commands instead of bash for loops to avoid approval prompts
|
||||
74
.claude/commands/triage-issue.md
Normal file
74
.claude/commands/triage-issue.md
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
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.
|
||||
2
.github/workflows/auto-close-duplicates.yml
vendored
2
.github/workflows/auto-close-duplicates.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 (sha-pinned)
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 (sha-pinned)
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
|
||||
14
.github/workflows/claude-dedupe-issues.yml
vendored
14
.github/workflows/claude-dedupe-issues.yml
vendored
@@ -17,7 +17,6 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -27,6 +26,7 @@ jobs:
|
||||
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: "*"
|
||||
@@ -38,10 +38,11 @@ jobs:
|
||||
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: |
|
||||
ISSUE_NUMBER=${{ github.event.issue.number || inputs.issue_number }}
|
||||
REPO=${{ github.repository }}
|
||||
|
||||
if [ -z "$STATSIG_API_KEY" ]; then
|
||||
echo "STATSIG_API_KEY not found, skipping Statsig logging"
|
||||
exit 0
|
||||
@@ -51,7 +52,8 @@ jobs:
|
||||
EVENT_PAYLOAD=$(jq -n \
|
||||
--arg issue_number "$ISSUE_NUMBER" \
|
||||
--arg repo "$REPO" \
|
||||
--arg triggered_by "${{ github.event_name }}" \
|
||||
--arg triggered_by "$TRIGGERED_BY" \
|
||||
--arg workflow_run_id "$WORKFLOW_RUN_ID" \
|
||||
'{
|
||||
events: [{
|
||||
eventName: "github_duplicate_comment_added",
|
||||
@@ -60,7 +62,7 @@ jobs:
|
||||
repository: $repo,
|
||||
issue_number: ($issue_number | tonumber),
|
||||
triggered_by: $triggered_by,
|
||||
workflow_run_id: "${{ github.run_id }}"
|
||||
workflow_run_id: $workflow_run_id
|
||||
},
|
||||
time: (now | floor | tostring)
|
||||
}]
|
||||
|
||||
71
.github/workflows/claude-issue-triage.yml
vendored
71
.github/workflows/claude-issue-triage.yml
vendored
@@ -18,7 +18,6 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -29,76 +28,12 @@ jobs:
|
||||
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: |
|
||||
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:
|
||||
- REPO: ${{ github.repository }}
|
||||
- ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||
- EVENT: ${{ github.event_name }}
|
||||
|
||||
ALLOWED LABELS — you may ONLY use labels from this list. Never invent new labels.
|
||||
|
||||
Type: bug, enhancement, question, documentation, duplicate, invalid
|
||||
Lifecycle: needs-repro, needs-info
|
||||
Platform: platform:linux, platform:macos, platform:windows, platform:wsl, platform:ios, platform:android, platform:vscode, platform:intellij, platform:web, platform:aws-bedrock
|
||||
API: api:bedrock, api:vertex
|
||||
|
||||
TOOLS:
|
||||
- `gh issue view NUMBER`: Read the issue title, body, and labels
|
||||
- `gh issue view NUMBER --comments`: Read the conversation
|
||||
- `gh search issues QUERY`: Find similar or duplicate issues
|
||||
- `gh issue edit NUMBER --add-label` / `--remove-label`: Add or remove labels
|
||||
|
||||
TASK:
|
||||
|
||||
1. Run `gh issue view ${{ github.event.issue.number }}` to read the issue details.
|
||||
2. Run `gh issue view ${{ github.event.issue.number }} --comments` to read the conversation.
|
||||
|
||||
**If EVENT is "issues" (new issue):**
|
||||
|
||||
3. First, check if this issue is actually about Claude Code (the CLI/IDE tool). Issues about the Claude API, claude.ai, the Claude app, Anthropic billing, or other Anthropic products should be labeled `invalid`. If invalid, apply only that label and stop.
|
||||
|
||||
4. Analyze and apply category labels:
|
||||
- Type (bug, enhancement, question, etc.)
|
||||
- Technical areas and platform
|
||||
- Check for duplicates with `gh search issues`. Only mark as duplicate of OPEN issues.
|
||||
|
||||
5. 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.
|
||||
|
||||
6. Apply all selected labels:
|
||||
`gh issue edit ${{ github.event.issue.number }} --add-label "label1" --add-label "label2"`
|
||||
|
||||
**If EVENT is "issue_comment" (comment on existing issue):**
|
||||
|
||||
3. Evaluate lifecycle labels based on the full conversation:
|
||||
- If the issue has `needs-repro` or `needs-info` and the missing information has now been provided, remove the label:
|
||||
`gh issue edit ${{ github.event.issue.number }} --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 labels when substantive details are actually provided.
|
||||
- Do NOT add or remove category labels (bug, enhancement, etc.) on comment events.
|
||||
|
||||
GUIDELINES:
|
||||
- ONLY use labels from the ALLOWED LABELS list above — 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
|
||||
- It's okay to not add any labels if none are clearly applicable
|
||||
prompt: "/triage-issue REPO: ${{ github.repository }} ISSUE_NUMBER: ${{ github.event.issue.number }} EVENT: ${{ github.event_name }}"
|
||||
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||
claude_args: |
|
||||
--model claude-opus-4-6
|
||||
--allowedTools "Bash(gh issue view:*),Bash(gh issue edit:*),Bash(gh search issues:*)"
|
||||
|
||||
27
.github/workflows/issue-lifecycle-comment.yml
vendored
Normal file
27
.github/workflows/issue-lifecycle-comment.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
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 }}
|
||||
47
.github/workflows/non-write-users-check.yml
vendored
Normal file
47
.github/workflows/non-write-users-check.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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 }}
|
||||
118
.github/workflows/oncall-triage.yml
vendored
118
.github/workflows/oncall-triage.yml
vendored
@@ -1,118 +0,0 @@
|
||||
name: Oncall Issue Triage
|
||||
description: Automatically identify and label critical blocking issues requiring oncall attention
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- add-oncall-triage-workflow # Temporary: for testing only
|
||||
schedule:
|
||||
# Run every 6 hours
|
||||
- cron: '0 */6 * * *'
|
||||
workflow_dispatch: # Allow manual trigger
|
||||
|
||||
jobs:
|
||||
oncall-triage:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup GitHub MCP Server
|
||||
run: |
|
||||
mkdir -p /tmp/mcp-config
|
||||
cat > /tmp/mcp-config/mcp-servers.json << 'EOF'
|
||||
{
|
||||
"mcpServers": {
|
||||
"github": {
|
||||
"command": "docker",
|
||||
"args": [
|
||||
"run",
|
||||
"-i",
|
||||
"--rm",
|
||||
"-e",
|
||||
"GITHUB_PERSONAL_ACCESS_TOKEN",
|
||||
"ghcr.io/github/github-mcp-server:sha-7aced2b"
|
||||
],
|
||||
"env": {
|
||||
"GITHUB_PERSONAL_ACCESS_TOKEN": "${{ secrets.GITHUB_TOKEN }}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
- name: Run Claude Code for Oncall Triage
|
||||
timeout-minutes: 10
|
||||
uses: anthropics/claude-code-action@v1
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
allowed_non_write_users: "*"
|
||||
prompt: |
|
||||
You're an oncall triage assistant for GitHub issues. Your task is to identify critical issues that require immediate oncall attention.
|
||||
|
||||
Important: Don't post any comments or messages to the issues. Your only action should be to apply the "oncall" label to qualifying issues.
|
||||
|
||||
Repository: ${{ github.repository }}
|
||||
|
||||
Task overview:
|
||||
1. Fetch all open issues updated in the last 3 days:
|
||||
- Use mcp__github__list_issues with:
|
||||
- state="open"
|
||||
- first=5 (fetch only 5 issues per page)
|
||||
- orderBy="UPDATED_AT"
|
||||
- direction="DESC"
|
||||
- This will give you the most recently updated issues first
|
||||
- For each page of results, check the updatedAt timestamp of each issue
|
||||
- Add issues updated within the last 3 days (72 hours) to your TODO list as you go
|
||||
- Keep paginating using the 'after' parameter until you encounter issues older than 3 days
|
||||
- Once you hit issues older than 3 days, you can stop fetching (no need to fetch all open issues)
|
||||
|
||||
2. Build your TODO list incrementally as you fetch:
|
||||
- As you fetch each page, immediately add qualifying issues to your TODO list
|
||||
- One TODO item per issue number (e.g., "Evaluate issue #123")
|
||||
- This allows you to start processing while still fetching more pages
|
||||
|
||||
3. For each issue in your TODO list:
|
||||
- Use mcp__github__get_issue to read the issue details (title, body, labels)
|
||||
- Use mcp__github__get_issue_comments to read all comments
|
||||
- Evaluate whether this issue needs the oncall label:
|
||||
a) Is it a bug? (has "bug" label or describes bug behavior)
|
||||
b) Does it have at least 50 engagements? (count comments + reactions)
|
||||
c) Is it truly blocking? Read and understand the full content to determine:
|
||||
- Does this prevent core functionality from working?
|
||||
- Can users work around it?
|
||||
- Consider severity indicators: "crash", "stuck", "frozen", "hang", "unresponsive", "cannot use", "blocked", "broken"
|
||||
- Be conservative - only flag issues that truly prevent users from getting work done
|
||||
|
||||
4. For issues that meet all criteria and do not already have the "oncall" label:
|
||||
- Use mcp__github__update_issue to add the "oncall" label
|
||||
- Do not post any comments
|
||||
- Do not remove any existing labels
|
||||
- Do not remove the "oncall" label from issues that already have it
|
||||
|
||||
Important guidelines:
|
||||
- Use the TODO list to track your progress through ALL candidate issues
|
||||
- Process issues efficiently - don't read every single issue upfront, work through your TODO list systematically
|
||||
- Be conservative in your assessment - only flag truly critical blocking issues
|
||||
- Do not post any comments to issues
|
||||
- Your only action should be to add the "oncall" label using mcp__github__update_issue
|
||||
- Mark each issue as complete in your TODO list as you process it
|
||||
|
||||
7. After processing all issues in your TODO list, provide a summary of your actions:
|
||||
- Total number of issues processed (candidate issues evaluated)
|
||||
- Number of issues that received the "oncall" label
|
||||
- For each issue that got the label: list issue number, title, and brief reason why it qualified
|
||||
- Close calls: List any issues that almost qualified but didn't quite meet the criteria (e.g., borderline blocking, had workarounds)
|
||||
- If no issues qualified, state that clearly
|
||||
- Format the summary clearly for easy reading
|
||||
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||
claude_args: |
|
||||
--mcp-config /tmp/mcp-config/mcp-servers.json
|
||||
--allowedTools "mcp__github__list_issues,mcp__github__get_issue,mcp__github__get_issue_comments,mcp__github__update_issue"
|
||||
2
.github/workflows/sweep.yml
vendored
2
.github/workflows/sweep.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 (sha-pinned)
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
|
||||
2183
CHANGELOG.md
2183
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@@ -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/anthropic-vdp/reports/new?type=team&report_type=vulnerability).
|
||||
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).
|
||||
|
||||
## Vulnerability Disclosure Program
|
||||
## Anthropic Bug Bounty
|
||||
|
||||
Our Vulnerability Program Guidelines are defined on our [HackerOne program page](https://hackerone.com/anthropic-vdp).
|
||||
Our Bug Bounty Program Guidelines are defined on our [HackerOne program page](https://hackerone.com/anthropic).
|
||||
|
||||
28
examples/mdm/README.md
Normal file
28
examples/mdm/README.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# 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.
|
||||
56
examples/mdm/macos/com.anthropic.claudecode.mobileconfig
Normal file
56
examples/mdm/macos/com.anthropic.claudecode.mobileconfig
Normal file
@@ -0,0 +1,56 @@
|
||||
<?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>
|
||||
11
examples/mdm/macos/com.anthropic.claudecode.plist
Normal file
11
examples/mdm/macos/com.anthropic.claudecode.plist
Normal file
@@ -0,0 +1,11 @@
|
||||
<?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>
|
||||
5
examples/mdm/managed-settings.json
Normal file
5
examples/mdm/managed-settings.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"permissions": {
|
||||
"disableBypassPermissionsMode": "disable"
|
||||
}
|
||||
}
|
||||
28
examples/mdm/windows/ClaudeCode.admx
Normal file
28
examples/mdm/windows/ClaudeCode.admx
Normal file
@@ -0,0 +1,28 @@
|
||||
<?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>
|
||||
28
examples/mdm/windows/Set-ClaudeCodePolicy.ps1
Normal file
28
examples/mdm/windows/Set-ClaudeCodePolicy.ps1
Normal file
@@ -0,0 +1,28 @@
|
||||
<#
|
||||
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"
|
||||
31
examples/mdm/windows/en-US/ClaudeCode.adml
Normal file
31
examples/mdm/windows/en-US/ClaudeCode.adml
Normal file
@@ -0,0 +1,31 @@
|
||||
<?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,6 +1,6 @@
|
||||
# Settings Examples
|
||||
|
||||
Example Claude Code settings files, primarily intended for organization-wide deployments. Use these are starting points — adjust them to fit your needs.
|
||||
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`).
|
||||
|
||||
@@ -26,6 +26,10 @@ These may be applied at any level of the [settings hierarchy](https://code.claud
|
||||
- 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.
|
||||
|
||||
691
feed.xml
Normal file
691
feed.xml
Normal file
@@ -0,0 +1,691 @@
|
||||
<?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-19T00:48:45Z</updated>
|
||||
<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 ! &lt;cmd&gt; exec sessions not responding to Ctrl+C while attached — now interrupts the running command</p>
|
||||
<p>• Fixed agent view shell-command rows lingering under Working after completion, and pressing Enter on a completed row re-running the command after its output expired</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>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.123</id>
|
||||
<title>Claude Code v2.1.123</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.123"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Fixed OAuth authentication failing with a 401 retry loop when CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 is set</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.122</id>
|
||||
<title>Claude Code v2.1.122</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.122"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added ANTHROPIC_BEDROCK_SERVICE_TIER environment variable to select a Bedrock service tier (default, flex, or priority), sent as the X-Amzn-Bedrock-Service-Tier header</p>
|
||||
<p>• Pasting a PR URL into the /resume search box now finds the session that created that PR (GitHub, GitHub Enterprise, GitLab, and Bitbucket)</p>
|
||||
<p>• /mcp now shows claude.ai connectors hidden by a manually-added server with the same URL, with a hint to remove the duplicate</p>
|
||||
<p>• Clarified the /mcp message shown when an MCP server is still unauthorized after the browser sign-in flow</p>
|
||||
<p>• OpenTelemetry: numeric attributes on api_request/api_error log events are now emitted as numbers, not strings</p>
|
||||
<p>• OpenTelemetry: added claude_code.at_mention log event for @-mention resolution</p>
|
||||
<p>• Fixed /branch producing forks that fail with "tool_use ids were found without tool_result blocks" when the source session contained entries from rewound timelines</p>
|
||||
<p>• Fixed /model not showing the Effort option for Bedrock application inference profile ARNs, and those ARNs not receiving output_config.effort</p>
|
||||
<p>• Fixed Vertex AI / Bedrock returning invalid_request_error: output_config: Extra inputs are not permitted on session-title generation and other structured-output queries</p>
|
||||
<p>• Fixed Vertex AI count_tokens endpoint returning 400 errors for users behind proxy gateways</p>
|
||||
<p>• Fixed spinnerTipsOverride.excludeDefault not suppressing the time-based spinner tips</p>
|
||||
<p>• Fixed ToolSearch missing MCP tools that connected after session start in nonblocking mode</p>
|
||||
<p>• Fixed !exit / !quit in bash mode terminating the CLI instead of running as a shell command</p>
|
||||
<p>• Fixed images sent to newer models being resized to 2576px per side instead of the correct 2000px maximum</p>
|
||||
<p>• Fixed remote control session idle status redrawing twice per second, which could flood tmux -CC control pipes and pause the terminal</p>
|
||||
<p>• Fixed assistant messages appearing blank in some sessions due to a stale view preference</p>
|
||||
<p>• Fixed a malformed hooks entry in settings.json no longer invalidating the entire file</p>
|
||||
<p>• Voice mode: keybindings bound to Caps Lock now show an error since terminals don't deliver Caps Lock as a key event</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.121</id>
|
||||
<title>Claude Code v2.1.121</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.121"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Added alwaysLoad option to MCP server config — when true, all tools from that server skip tool-search deferral and are always available</p>
|
||||
<p>• Added claude plugin prune to remove orphaned auto-installed plugin dependencies; plugin uninstall --prune cascades</p>
|
||||
<p>• Added a type-to-filter search box to /skills so you can find a skill in long lists without scrolling</p>
|
||||
<p>• PostToolUse hooks can now replace tool output for all tools via hookSpecificOutput.updatedToolOutput (previously MCP-only)</p>
|
||||
<p>• Fullscreen mode: typing into the prompt no longer jumps scroll back to the bottom after you've scrolled up to read earlier output</p>
|
||||
<p>• Dialogs that overflow the terminal are now scrollable with arrow keys, PgUp/PgDn, home/end, and mouse wheel in both fullscreen and non-fullscreen modes</p>
|
||||
<p>• Clicking any line of a long URL that wraps across rows in fullscreen mode now opens the full URL</p>
|
||||
<p>• SDK and claude -p: CLAUDE_CODE_FORK_SUBAGENT=1 now works in non-interactive sessions</p>
|
||||
<p>• --dangerously-skip-permissions no longer prompts for writes to .claude/skills/, .claude/agents/, and .claude/commands/</p>
|
||||
<p>• /terminal-setup now enables iTerm2's "Applications in terminal may access clipboard" setting so /copy works, including from tmux</p>
|
||||
<p>• MCP servers that hit a transient error during startup now auto-retry up to 3 times instead of staying disconnected</p>
|
||||
<p>• The terminal tab session title is now generated in your configured language setting</p>
|
||||
<p>• Claude.ai connectors with the same upstream URL are now deduplicated instead of appearing as duplicates</p>
|
||||
<p>• Vertex AI: support X.509 certificate-based Workload Identity Federation (mTLS ADC)</p>
|
||||
<p>• Faster startup after upgrading: removed the Recent Activity panel from the release-notes splash</p>
|
||||
<p>• LSP diagnostic summaries now expand on click/ctrl+o and show the expand hint</p>
|
||||
<p>• SDK: mcp_authenticate now supports redirectUri for custom scheme completion and claude.ai connectors</p>
|
||||
<p>• OpenTelemetry: added stop_reason, gen_ai.response.finish_reasons, and user_system_prompt (gated behind OTEL_LOG_USER_PROMPTS) to LLM request spans</p>
|
||||
<p>• [VSCode] Voice dictation now respects the accessibility.voice.speechLanguage setting when no Claude Code language is configured</p>
|
||||
<p>• [VSCode] /context now opens a native token usage dialog</p>
|
||||
<p>• Fixed unbounded memory growth (multi-GB RSS) when processing many images in a session</p>
|
||||
<p>• Fixed /usage leaking up to ~2GB of memory on machines with large transcript histories</p>
|
||||
<p>• Fixed memory leak when long-running tools fail to emit a clear progress event</p>
|
||||
<p>• Fixed Bash tool becoming permanently unusable when the directory Claude was started in is deleted or moved mid-session</p>
|
||||
<p>• Fixed --resume crashing on startup in external builds</p>
|
||||
<p>• Fixed --resume failing on large sessions when a transcript line was corrupted by an unclean shutdown — the corrupt line is now skipped</p>
|
||||
<p>• Fixed thinking.type.enabled is not supported error when using Bedrock application inference profile ARNs</p>
|
||||
<p>• Fixed Microsoft 365 MCP OAuth failing with duplicate or unsupported prompt parameter</p>
|
||||
<p>• Fixed scrollback duplication when pressing Ctrl+L or triggering a redraw in non-fullscreen mode on tmux, GNOME Terminal, Windows Terminal, and Konsole</p>
|
||||
<p>• Fixed claude.ai MCP connectors silently disappearing when the connector-list fetch hits a transient auth error at startup</p>
|
||||
<p>• Fixed "Always allow" rules for built-in tools in remote sessions not surviving worker restarts</p>
|
||||
<p>• Fixed NO_PROXY not being respected for all HTTP clients when set via managed-settings.json under the native build</p>
|
||||
<p>• Fixed managed settings approval prompt exiting the session even when accepted — now applies settings and continues</p>
|
||||
<p>• Fixed /usage returning "rate limited" after a stale OAuth token — now refreshes automatically</p>
|
||||
<p>• Fixed invalid legacy enum values in settings.json invalidating the entire settings file</p>
|
||||
<p>• Fixed /usage dialog content being clipped when no-flicker mode is off</p>
|
||||
<p>• Fixed /focus showing "Unknown command" when the fullscreen renderer is off — now explains how to enable it</p>
|
||||
<p>• Fixed embedded grep/find/rg shell wrappers failing when the running binary is deleted mid-session — now falls back to installed tools</p>
|
||||
<p>• Reduced peak file descriptor usage during find in the Bash tool on large directory trees</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.120</id>
|
||||
<title>Claude Code v2.1.120</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.120"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• Windows: Git for Windows (Git Bash) is no longer required — when absent, Claude Code uses PowerShell as the shell tool</p>
|
||||
<p>• Added claude ultrareview [target] subcommand to run /ultrareview non-interactively from CI or scripts — prints findings to stdout (--json for raw output) and exits 0 on completion or 1 on failure</p>
|
||||
<p>• Skills can now reference the current effort level with ${CLAUDE_EFFORT} in their content</p>
|
||||
<p>• Set AI_AGENT environment variable for subprocesses so gh can attribute traffic to Claude Code</p>
|
||||
<p>• Spinner tips that recommend installing the desktop app or creating skills/agents are now hidden when you already have them</p>
|
||||
<p>• Show a "use PgUp/PgDn to scroll" hint when the terminal sends arrow keys instead of scroll events</p>
|
||||
<p>• Faster session start when you have many claude.ai connectors configured but not authorized</p>
|
||||
<p>• The auto mode denial message now links to the configuration docs</p>
|
||||
<p>• claude plugin validate now accepts $schema, version, and description at the top level of marketplace.json and $schema in plugin.json</p>
|
||||
<p>• Auto-compact in auto mode now displays auto (lowercase, no token count) instead of a misleading token value</p>
|
||||
<p>• Fixed pressing Esc during a stdio MCP tool call closing the entire server connection (regression in 2.1.105)</p>
|
||||
<p>• Fixed /rewind and other interactive overlays not responding to keyboard input after launching with claude --resume</p>
|
||||
<p>• Fixed terminal scrollback duplication in non-fullscreen mode (resize, dialog dismiss, long sessions)</p>
|
||||
<p>• Fixed DISABLE_TELEMETRY / CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC not suppressing usage metrics telemetry for API and enterprise users</p>
|
||||
<p>• Fixed false-positive "Dangerous rm operation" permission prompts in auto mode for multi-line bash commands containing both a pipe and a redirect</p>
|
||||
<p>• Fixed long selection menus clipping below the terminal in fullscreen mode — the focused option now stays on screen as you scroll</p>
|
||||
<p>• Fixed Write tool output collapsing instead of expanding when clicking "+N lines" in fullscreen</p>
|
||||
<p>• Fixed slash command picker jumping while typing, and improved highlight to only match contiguous substrings in blue</p>
|
||||
<p>• Fixed /plugin marketplace failing to load when one entry uses an unrecognized source format — that entry is shown but installing it prompts you to update</p>
|
||||
<p>• [VSCode] /usage now opens the native Account &amp; Usage dialog instead of returning plain-text session cost</p>
|
||||
<p>• [VSCode] Voice dictation now respects the language setting in ~/.claude/settings.json</p>
|
||||
<p>• Fixed find in the Bash tool exhausting open file descriptors on large directory trees, causing host-wide crashes (macOS/Linux native builds)</p></content>
|
||||
</entry>
|
||||
<entry>
|
||||
<id>https://github.com/anthropics/claude-code/releases/tag/v2.1.119</id>
|
||||
<title>Claude Code v2.1.119</title>
|
||||
<link rel="alternate" type="text/html" href="https://github.com/anthropics/claude-code/releases/tag/v2.1.119"/>
|
||||
<updated>2026-05-18T01:52:01Z</updated>
|
||||
<content type="html"><p>• /config settings (theme, editor mode, verbose, etc.) now persist to ~/.claude/settings.json and participate in project/local/policy override precedence</p>
|
||||
<p>• Added prUrlTemplate setting to point the footer PR badge at a custom code-review URL instead of github.com</p>
|
||||
<p>• Added CLAUDE_CODE_HIDE_CWD environment variable to hide the working directory in the startup logo</p>
|
||||
<p>• --from-pr now accepts GitLab merge-request, Bitbucket pull-request, and GitHub Enterprise PR URLs</p>
|
||||
<p>• --print mode now honors the agent's tools: and disallowedTools: frontmatter, matching interactive-mode behavior</p>
|
||||
<p>• --agent &lt;name&gt; now honors the agent definition's permissionMode for built-in agents</p>
|
||||
<p>• PowerShell tool commands can now be auto-approved in permission mode, matching Bash behavior</p>
|
||||
<p>• Hooks: PostToolUse and PostToolUseFailure hook inputs now include duration_ms (tool execution time, excluding permission prompts and PreToolUse hooks)</p>
|
||||
<p>• Subagent and SDK MCP server reconfiguration now connects servers in parallel instead of serially</p>
|
||||
<p>• Plugins pinned by another plugin's version constraint now auto-update to the highest satisfying git tag</p>
|
||||
<p>• Vim mode: Esc in INSERT no longer pulls a queued message back into the input; press Esc again to interrupt</p>
|
||||
<p>• Slash command suggestions now highlight the characters that matched your query</p>
|
||||
<p>• Slash command picker now wraps long descriptions onto a second line instead of truncating</p>
|
||||
<p>• owner/repo#N shorthand links in output now use your git remote's host instead of always pointing at github.com</p>
|
||||
<p>• Security: blockedMarketplaces now correctly enforces hostPattern and pathPattern entries</p>
|
||||
<p>• OpenTelemetry: tool_result and tool_decision events now include tool_use_id; tool_result also includes tool_input_size_bytes</p>
|
||||
<p>• Status line: stdin JSON now includes effort.level and thinking.enabled</p>
|
||||
<p>• Fixed pasting CRLF content (Windows clipboards, Xcode console) inserting an extra blank line between every line</p>
|
||||
<p>• Fixed multi-line paste losing newlines in terminals using kitty keyboard protocol sequences inside bracketed paste</p>
|
||||
<p>• Fixed Glob and Grep tools disappearing on native macOS/Linux builds when the Bash tool is denied via permissions</p>
|
||||
<p>• Fixed scrolling up in fullscreen mode snapping back to the bottom every time a tool finishes</p>
|
||||
<p>• Fixed MCP HTTP connections failing with "Invalid OAuth error response" when servers returned non-JSON bodies for OAuth discovery requests</p>
|
||||
<p>• Fixed Rewind overlay showing "(no prompt)" for messages with image attachments</p>
|
||||
<p>• Fixed auto mode overriding plan mode with conflicting "Execute immediately" instructions</p>
|
||||
<p>• Fixed async PostToolUse hooks that emit no response payload writing empty entries to the session transcript</p>
|
||||
<p>• Fixed spinner staying on when a subagent task notification is orphaned in the queue</p>
|
||||
<p>• Tool search is now disabled by default on Vertex AI to avoid an unsupported beta header error (opt in with ENABLE_TOOL_SEARCH)</p>
|
||||
<p>• Fixed @-file Tab completion replacing the entire prompt when used inside a slash command with an absolute path</p>
|
||||
<p>• Fixed a stray p character appearing at the prompt on startup in macOS Terminal.app via Docker or SSH</p>
|
||||
<p>• Fixed ${ENV_VAR} placeholders in headers for HTTP/SSE/WebSocket MCP servers not being substituted before requests</p>
|
||||
<p>• Fixed MCP OAuth client secret stored via --client-secret not being sent during token exchange for servers requiring client_secret_post</p>
|
||||
<p>• Fixed /skills Enter key closing the dialog instead of pre-filling /&lt;skill-name&gt; in the prompt</p>
|
||||
<p>• Fixed /agents detail view mislabeling built-in tools unavailable to subagents as "Unrecognized"</p>
|
||||
<p>• Fixed MCP servers from plugins not spawning on Windows when the plugin cache was incomplete</p>
|
||||
<p>• Fixed /export showing the current default model instead of the model the conversation actually used</p>
|
||||
<p>• Fixed verbose output setting not persisting after restart</p>
|
||||
<p>• Fixed /usage progress bars overlapping with their "Resets …" labels</p>
|
||||
<p>• Fixed plugin MCP servers failing when ${user_config.*} references an optional field left blank</p>
|
||||
<p>• Fixed list items containing a sentence-final number wrapping the number onto its own line</p>
|
||||
<p>• Fixed /plan and /plan open not acting on the existing plan when entering plan mode</p>
|
||||
<p>• Fixed skills invoked before auto-compaction being re-executed against the next user message</p>
|
||||
<p>• Fixed /reload-plugins and /doctor reporting load errors for disabled plugins</p>
|
||||
<p>• Fixed Agent tool with isolation: "worktree" reusing stale worktrees from prior sessions</p>
|
||||
<p>• Fixed disabled MCP servers appearing as "failed" in /status</p>
|
||||
<p>• Fixed TaskList returning tasks in arbitrary filesystem order instead of sorted by ID</p>
|
||||
<p>• Fixed spurious "GitHub API rate limit exceeded" hints when gh output contained PR titles mentioning "rate limit"</p>
|
||||
<p>• Fixed SDK/bridge read_file not correctly enforcing size cap on growing files</p>
|
||||
<p>• Fixed PR not linked to session when working in a git worktree</p>
|
||||
<p>• Fixed /doctor warning about MCP server entries overridden by a higher-precedence scope</p>
|
||||
<p>• Windows: removed false-positive "Windows requires 'cmd /c' wrapper" MCP config warning</p>
|
||||
<p>• [VSCode] Fixed voice dictation's first recording producing nothing on macOS while the microphone permission prompt is showing</p></content>
|
||||
</entry>
|
||||
</feed>
|
||||
@@ -68,7 +68,7 @@ Note: Still review Claude generated PR's.
|
||||
|
||||
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`. For each comment:
|
||||
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
|
||||
|
||||
@@ -1,22 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Comments on a GitHub issue with a list of potential duplicates.
|
||||
# Usage: ./comment-on-duplicates.sh --base-issue 123 --potential-duplicates 456 789 101
|
||||
# Usage: ./comment-on-duplicates.sh --potential-duplicates 456 789 101
|
||||
#
|
||||
# The base issue number is read from the workflow event payload.
|
||||
#
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
REPO="anthropics/claude-code"
|
||||
BASE_ISSUE=""
|
||||
|
||||
# Read from event payload so the issue number is bound to the triggering event.
|
||||
# Falls back to workflow_dispatch inputs for manual runs.
|
||||
BASE_ISSUE=$(jq -r '.issue.number // .inputs.issue_number // empty' "${GITHUB_EVENT_PATH:?GITHUB_EVENT_PATH not set}")
|
||||
if ! [[ "$BASE_ISSUE" =~ ^[0-9]+$ ]]; then
|
||||
echo "Error: no issue number in event payload" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DUPLICATES=()
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--base-issue)
|
||||
BASE_ISSUE="$2"
|
||||
shift 2
|
||||
;;
|
||||
--potential-duplicates)
|
||||
shift
|
||||
while [[ $# -gt 0 && ! "$1" =~ ^-- ]]; do
|
||||
@@ -25,23 +31,12 @@ while [[ $# -gt 0 ]]; do
|
||||
done
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
echo "Error: unknown argument (only --potential-duplicates is accepted)" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Validate base issue
|
||||
if [[ -z "$BASE_ISSUE" ]]; then
|
||||
echo "Error: --base-issue is required" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! [[ "$BASE_ISSUE" =~ ^[0-9]+$ ]]; then
|
||||
echo "Error: --base-issue must be a number, got: $BASE_ISSUE" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Validate duplicates
|
||||
if [[ ${#DUPLICATES[@]} -eq 0 ]]; then
|
||||
echo "Error: --potential-duplicates requires at least one issue number" >&2
|
||||
|
||||
84
scripts/edit-issue-labels.sh
Executable file
84
scripts/edit-issue-labels.sh
Executable file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Edits labels on a GitHub issue.
|
||||
# Usage: ./edit-issue-labels.sh --add-label bug --add-label needs-triage --remove-label untriaged
|
||||
#
|
||||
# The issue number is read from the workflow event payload.
|
||||
#
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Read from event payload so the issue number is bound to the triggering event.
|
||||
# Falls back to workflow_dispatch inputs for manual runs.
|
||||
ISSUE=$(jq -r '.issue.number // .inputs.issue_number // empty' "${GITHUB_EVENT_PATH:?GITHUB_EVENT_PATH not set}")
|
||||
if ! [[ "$ISSUE" =~ ^[0-9]+$ ]]; then
|
||||
echo "Error: no issue number in event payload" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ADD_LABELS=()
|
||||
REMOVE_LABELS=()
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--add-label)
|
||||
ADD_LABELS+=("$2")
|
||||
shift 2
|
||||
;;
|
||||
--remove-label)
|
||||
REMOVE_LABELS+=("$2")
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
echo "Error: unknown argument (only --add-label and --remove-label are accepted)" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ${#ADD_LABELS[@]} -eq 0 && ${#REMOVE_LABELS[@]} -eq 0 ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Fetch valid labels from the repo
|
||||
VALID_LABELS=$(gh label list --limit 500 --json name --jq '.[].name')
|
||||
|
||||
# Filter to only labels that exist in the repo
|
||||
FILTERED_ADD=()
|
||||
for label in "${ADD_LABELS[@]}"; do
|
||||
if echo "$VALID_LABELS" | grep -qxF "$label"; then
|
||||
FILTERED_ADD+=("$label")
|
||||
fi
|
||||
done
|
||||
|
||||
FILTERED_REMOVE=()
|
||||
for label in "${REMOVE_LABELS[@]}"; do
|
||||
if echo "$VALID_LABELS" | grep -qxF "$label"; then
|
||||
FILTERED_REMOVE+=("$label")
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ${#FILTERED_ADD[@]} -eq 0 && ${#FILTERED_REMOVE[@]} -eq 0 ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Build gh command arguments
|
||||
GH_ARGS=("issue" "edit" "$ISSUE")
|
||||
|
||||
for label in "${FILTERED_ADD[@]}"; do
|
||||
GH_ARGS+=("--add-label" "$label")
|
||||
done
|
||||
|
||||
for label in "${FILTERED_REMOVE[@]}"; do
|
||||
GH_ARGS+=("--remove-label" "$label")
|
||||
done
|
||||
|
||||
gh "${GH_ARGS[@]}"
|
||||
|
||||
if [[ ${#FILTERED_ADD[@]} -gt 0 ]]; then
|
||||
echo "Added: ${FILTERED_ADD[*]}"
|
||||
fi
|
||||
if [[ ${#FILTERED_REMOVE[@]} -gt 0 ]]; then
|
||||
echo "Removed: ${FILTERED_REMOVE[*]}"
|
||||
fi
|
||||
96
scripts/gh.sh
Executable file
96
scripts/gh.sh
Executable file
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Wrapper around gh CLI that only allows specific subcommands and flags.
|
||||
# All commands are scoped to the current repository via GH_REPO or GITHUB_REPOSITORY.
|
||||
#
|
||||
# Usage:
|
||||
# ./scripts/gh.sh issue view 123
|
||||
# ./scripts/gh.sh issue view 123 --comments
|
||||
# ./scripts/gh.sh issue list --state open --limit 20
|
||||
# ./scripts/gh.sh search issues "search query" --limit 10
|
||||
# ./scripts/gh.sh label list --limit 100
|
||||
|
||||
export GH_HOST=github.com
|
||||
|
||||
REPO="${GH_REPO:-${GITHUB_REPOSITORY:-}}"
|
||||
if [[ -z "$REPO" || "$REPO" == */*/* || "$REPO" != */* ]]; then
|
||||
echo "Error: GH_REPO or GITHUB_REPOSITORY must be set to owner/repo format (e.g., GITHUB_REPOSITORY=anthropics/claude-code)" >&2
|
||||
exit 1
|
||||
fi
|
||||
export GH_REPO="$REPO"
|
||||
|
||||
ALLOWED_FLAGS=(--comments --state --limit --label)
|
||||
FLAGS_WITH_VALUES=(--state --limit --label)
|
||||
|
||||
SUB1="${1:-}"
|
||||
SUB2="${2:-}"
|
||||
CMD="$SUB1 $SUB2"
|
||||
case "$CMD" in
|
||||
"issue view"|"issue list"|"search issues"|"label list")
|
||||
;;
|
||||
*)
|
||||
echo "Error: only 'issue view', 'issue list', 'search issues', 'label list' are allowed (e.g., ./scripts/gh.sh issue view 123)" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
shift 2
|
||||
|
||||
# Separate flags from positional arguments
|
||||
POSITIONAL=()
|
||||
FLAGS=()
|
||||
skip_next=false
|
||||
for arg in "$@"; do
|
||||
if [[ "$skip_next" == true ]]; then
|
||||
FLAGS+=("$arg")
|
||||
skip_next=false
|
||||
elif [[ "$arg" == -* ]]; then
|
||||
flag="${arg%%=*}"
|
||||
matched=false
|
||||
for allowed in "${ALLOWED_FLAGS[@]}"; do
|
||||
if [[ "$flag" == "$allowed" ]]; then
|
||||
matched=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [[ "$matched" == false ]]; then
|
||||
echo "Error: only --comments, --state, --limit, --label flags are allowed (e.g., ./scripts/gh.sh issue list --state open --limit 20)" >&2
|
||||
exit 1
|
||||
fi
|
||||
FLAGS+=("$arg")
|
||||
# If flag expects a value and isn't using = syntax, skip next arg
|
||||
if [[ "$arg" != *=* ]]; then
|
||||
for vflag in "${FLAGS_WITH_VALUES[@]}"; do
|
||||
if [[ "$flag" == "$vflag" ]]; then
|
||||
skip_next=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
POSITIONAL+=("$arg")
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$CMD" == "search issues" ]]; then
|
||||
QUERY="${POSITIONAL[0]:-}"
|
||||
QUERY_LOWER=$(echo "$QUERY" | tr '[:upper:]' '[:lower:]')
|
||||
if [[ "$QUERY_LOWER" == *"repo:"* || "$QUERY_LOWER" == *"org:"* || "$QUERY_LOWER" == *"user:"* ]]; then
|
||||
echo "Error: search query must not contain repo:, org:, or user: qualifiers (e.g., ./scripts/gh.sh search issues \"bug report\" --limit 10)" >&2
|
||||
exit 1
|
||||
fi
|
||||
gh "$SUB1" "$SUB2" "$QUERY" --repo "$REPO" "${FLAGS[@]}"
|
||||
elif [[ "$CMD" == "issue view" ]]; then
|
||||
if [[ ${#POSITIONAL[@]} -ne 1 ]] || ! [[ "${POSITIONAL[0]}" =~ ^[0-9]+$ ]]; then
|
||||
echo "Error: issue view requires exactly one numeric issue number (e.g., ./scripts/gh.sh issue view 123)" >&2
|
||||
exit 1
|
||||
fi
|
||||
gh "$SUB1" "$SUB2" "${POSITIONAL[0]}" "${FLAGS[@]}"
|
||||
else
|
||||
if [[ ${#POSITIONAL[@]} -ne 0 ]]; then
|
||||
echo "Error: issue list and label list do not accept positional arguments (e.g., ./scripts/gh.sh issue list --state open, ./scripts/gh.sh label list --limit 100)" >&2
|
||||
exit 1
|
||||
fi
|
||||
gh "$SUB1" "$SUB2" "${FLAGS[@]}"
|
||||
fi
|
||||
38
scripts/issue-lifecycle.ts
Normal file
38
scripts/issue-lifecycle.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
// Single source of truth for issue lifecycle labels, timeouts, and messages.
|
||||
|
||||
export const lifecycle = [
|
||||
{
|
||||
label: "invalid",
|
||||
days: 3,
|
||||
reason: "this doesn't appear to be about Claude Code",
|
||||
nudge: "This doesn't appear to be about [Claude Code](https://github.com/anthropics/claude-code). For general Anthropic support, visit [support.anthropic.com](https://support.anthropic.com).",
|
||||
},
|
||||
{
|
||||
label: "needs-repro",
|
||||
days: 7,
|
||||
reason: "we still need reproduction steps to investigate",
|
||||
nudge: "We weren't able to reproduce this. Could you provide steps to trigger the issue — what you ran, what happened, and what you expected?",
|
||||
},
|
||||
{
|
||||
label: "needs-info",
|
||||
days: 7,
|
||||
reason: "we still need a bit more information to move forward",
|
||||
nudge: "We need more information to continue investigating. Can you make sure to include your Claude Code version (`claude --version`), OS, and any error messages or logs?",
|
||||
},
|
||||
{
|
||||
label: "stale",
|
||||
days: 14,
|
||||
reason: "inactive for too long",
|
||||
nudge: "This issue has been automatically marked as stale due to inactivity.",
|
||||
},
|
||||
{
|
||||
label: "autoclose",
|
||||
days: 14,
|
||||
reason: "inactive for too long",
|
||||
nudge: "This issue has been marked for automatic closure.",
|
||||
},
|
||||
] as const;
|
||||
|
||||
export type LifecycleLabel = (typeof lifecycle)[number]["label"];
|
||||
|
||||
export const STALE_UPVOTE_THRESHOLD = 10;
|
||||
53
scripts/lifecycle-comment.ts
Normal file
53
scripts/lifecycle-comment.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bun
|
||||
|
||||
// Posts a comment when a lifecycle label is applied to an issue,
|
||||
// giving the author a heads-up and a chance to respond before auto-close.
|
||||
|
||||
import { lifecycle } from "./issue-lifecycle.ts";
|
||||
|
||||
const DRY_RUN = process.argv.includes("--dry-run");
|
||||
const token = process.env.GITHUB_TOKEN;
|
||||
const repo = process.env.GITHUB_REPOSITORY; // owner/repo
|
||||
const label = process.env.LABEL;
|
||||
const issueNumber = process.env.ISSUE_NUMBER;
|
||||
|
||||
if (!DRY_RUN && !token) throw new Error("GITHUB_TOKEN required");
|
||||
if (!repo) throw new Error("GITHUB_REPOSITORY required");
|
||||
if (!label) throw new Error("LABEL required");
|
||||
if (!issueNumber) throw new Error("ISSUE_NUMBER required");
|
||||
|
||||
const entry = lifecycle.find((l) => l.label === label);
|
||||
if (!entry) {
|
||||
console.log(`No lifecycle entry for label "${label}", skipping`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const body = `${entry.nudge} This issue will be closed automatically if there's no activity within ${entry.days} days.`;
|
||||
|
||||
// --
|
||||
|
||||
if (DRY_RUN) {
|
||||
console.log(`Would comment on #${issueNumber} for label "${label}":\n\n${body}`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const response = await fetch(
|
||||
`https://api.github.com/repos/${repo}/issues/${issueNumber}/comments`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
Authorization: `Bearer ${token}`,
|
||||
Accept: "application/vnd.github.v3+json",
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent": "lifecycle-comment",
|
||||
},
|
||||
body: JSON.stringify({ body }),
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
const text = await response.text();
|
||||
throw new Error(`GitHub API ${response.status}: ${text}`);
|
||||
}
|
||||
|
||||
console.log(`Commented on #${issueNumber} for label "${label}"`);
|
||||
@@ -1,23 +1,15 @@
|
||||
#!/usr/bin/env bun
|
||||
|
||||
import { lifecycle, STALE_UPVOTE_THRESHOLD } from "./issue-lifecycle.ts";
|
||||
|
||||
// --
|
||||
|
||||
const NEW_ISSUE = "https://github.com/anthropics/claude-code/issues/new/choose";
|
||||
const DRY_RUN = process.argv.includes("--dry-run");
|
||||
const STALE_DAYS = 14;
|
||||
const STALE_UPVOTE_THRESHOLD = 10;
|
||||
|
||||
const CLOSE_MESSAGE = (reason: string) =>
|
||||
`Closing for now — ${reason}. Please [open a new issue](${NEW_ISSUE}) if this is still relevant.`;
|
||||
|
||||
const lifecycle = [
|
||||
{ label: "invalid", days: 3, reason: "this doesn't appear to be about Claude Code" },
|
||||
{ label: "needs-repro", days: 7, reason: "we still need reproduction steps to investigate" },
|
||||
{ label: "needs-info", days: 7, reason: "we still need a bit more information to move forward" },
|
||||
{ label: "stale", days: 14, reason: "inactive for too long" },
|
||||
{ label: "autoclose", days: 14, reason: "inactive for too long" },
|
||||
];
|
||||
|
||||
// --
|
||||
|
||||
async function githubRequest<T>(
|
||||
@@ -51,12 +43,13 @@ async function githubRequest<T>(
|
||||
// --
|
||||
|
||||
async function markStale(owner: string, repo: string) {
|
||||
const staleDays = lifecycle.find((l) => l.label === "stale")!.days;
|
||||
const cutoff = new Date();
|
||||
cutoff.setDate(cutoff.getDate() - STALE_DAYS);
|
||||
cutoff.setDate(cutoff.getDate() - staleDays);
|
||||
|
||||
let labeled = 0;
|
||||
|
||||
console.log(`\n=== marking stale (${STALE_DAYS}d inactive) ===`);
|
||||
console.log(`\n=== marking stale (${staleDays}d inactive) ===`);
|
||||
|
||||
for (let page = 1; page <= 10; page++) {
|
||||
const issues = await githubRequest<any[]>(
|
||||
@@ -77,11 +70,8 @@ async function markStale(owner: string, repo: string) {
|
||||
);
|
||||
if (alreadyStale) continue;
|
||||
|
||||
const isEnhancement = issue.labels?.some(
|
||||
(l: any) => l.name === "enhancement"
|
||||
);
|
||||
const thumbsUp = issue.reactions?.["+1"] ?? 0;
|
||||
if (isEnhancement && thumbsUp >= STALE_UPVOTE_THRESHOLD) continue;
|
||||
if (thumbsUp >= STALE_UPVOTE_THRESHOLD) continue;
|
||||
|
||||
const base = `/repos/${owner}/${repo}/issues/${issue.number}`;
|
||||
|
||||
@@ -115,6 +105,11 @@ async function closeExpired(owner: string, repo: string) {
|
||||
|
||||
for (const issue of issues) {
|
||||
if (issue.pull_request) continue;
|
||||
if (issue.locked) continue;
|
||||
|
||||
const thumbsUp = issue.reactions?.["+1"] ?? 0;
|
||||
if (thumbsUp >= STALE_UPVOTE_THRESHOLD) continue;
|
||||
|
||||
const base = `/repos/${owner}/${repo}/issues/${issue.number}`;
|
||||
|
||||
const events = await githubRequest<any[]>(`${base}/events?per_page=100`);
|
||||
@@ -126,6 +121,22 @@ async function closeExpired(owner: string, repo: string) {
|
||||
|
||||
if (!labeledAt || labeledAt > cutoff) continue;
|
||||
|
||||
// Skip if a non-bot user commented after the label was applied.
|
||||
// The triage workflow should remove lifecycle labels on human
|
||||
// activity, but check here too as a safety net.
|
||||
const comments = await githubRequest<any[]>(
|
||||
`${base}/comments?since=${labeledAt.toISOString()}&per_page=100`
|
||||
);
|
||||
const hasHumanComment = comments.some(
|
||||
(c) => c.user && c.user.type !== "Bot"
|
||||
);
|
||||
if (hasHumanComment) {
|
||||
console.log(
|
||||
`#${issue.number}: skipping (human activity after ${label} label)`
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (DRY_RUN) {
|
||||
const age = Math.floor((Date.now() - labeledAt.getTime()) / 86400000);
|
||||
console.log(`#${issue.number}: would close (${label}, ${age}d old) — ${issue.title}`);
|
||||
@@ -144,20 +155,14 @@ async function closeExpired(owner: string, repo: string) {
|
||||
|
||||
// --
|
||||
|
||||
async function main() {
|
||||
const owner = process.env.GITHUB_REPOSITORY_OWNER;
|
||||
const repo = process.env.GITHUB_REPOSITORY_NAME;
|
||||
if (!owner || !repo)
|
||||
throw new Error("GITHUB_REPOSITORY_OWNER and GITHUB_REPOSITORY_NAME required");
|
||||
const owner = process.env.GITHUB_REPOSITORY_OWNER;
|
||||
const repo = process.env.GITHUB_REPOSITORY_NAME;
|
||||
if (!owner || !repo)
|
||||
throw new Error("GITHUB_REPOSITORY_OWNER and GITHUB_REPOSITORY_NAME required");
|
||||
|
||||
if (DRY_RUN) console.log("DRY RUN — no changes will be made\n");
|
||||
if (DRY_RUN) console.log("DRY RUN — no changes will be made\n");
|
||||
|
||||
const labeled = await markStale(owner, repo);
|
||||
const closed = await closeExpired(owner, repo);
|
||||
const labeled = await markStale(owner, repo);
|
||||
const closed = await closeExpired(owner, repo);
|
||||
|
||||
console.log(`\nDone: ${labeled} ${DRY_RUN ? "would be labeled" : "labeled"} stale, ${closed} ${DRY_RUN ? "would be closed" : "closed"}`);
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
|
||||
export {};
|
||||
console.log(`\nDone: ${labeled} ${DRY_RUN ? "would be labeled" : "labeled"} stale, ${closed} ${DRY_RUN ? "would be closed" : "closed"}`);
|
||||
|
||||
Reference in New Issue
Block a user