mirror of
https://github.com/anthropics/claude-code.git
synced 2026-02-19 04:27:33 -08:00
Compare commits
28 Commits
v2.1.23
...
chrislloyd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a17040212c | ||
|
|
0a0135f687 | ||
|
|
e74abe58ab | ||
|
|
7a7bed74e3 | ||
|
|
9b64827a25 | ||
|
|
54f0b535b3 | ||
|
|
675baffdb3 | ||
|
|
bae169824d | ||
|
|
0b641a77ce | ||
|
|
be5d08fe5f | ||
|
|
19bb071fe0 | ||
|
|
85f2807991 | ||
|
|
e7f36bcdf0 | ||
|
|
2bc62d1456 | ||
|
|
ef1e0ac098 | ||
|
|
d7e3cfb31c | ||
|
|
bd78b216ed | ||
|
|
a4e0c5b4c8 | ||
|
|
36d9ee2c2e | ||
|
|
4936302293 | ||
|
|
43d0eac708 | ||
|
|
f298d940fa | ||
|
|
34f551fa91 | ||
|
|
90c07d1c7e | ||
|
|
f93f614768 | ||
|
|
e58014371b | ||
|
|
5862adf641 | ||
|
|
38f1f93052 |
31
.github/workflows/sweep.yml
vendored
Normal file
31
.github/workflows/sweep.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
name: "Daily Issue Sweep"
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 10 * * *" # 2am Pacific
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
concurrency:
|
||||
group: daily-issue-sweep
|
||||
|
||||
jobs:
|
||||
sweep:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Enforce lifecycle timeouts
|
||||
run: bun run scripts/sweep.ts
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
|
||||
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
|
||||
129
CHANGELOG.md
129
CHANGELOG.md
@@ -1,5 +1,134 @@
|
||||
# Changelog
|
||||
|
||||
## 2.1.39
|
||||
|
||||
- Added guard against launching Claude Code inside another Claude Code session
|
||||
- Fixed Agent Teams using wrong model identifier for Bedrock, Vertex, and Foundry customers
|
||||
- Fixed a crash when MCP tools return image content during streaming
|
||||
- Fixed /resume session previews showing raw XML tags instead of readable command names
|
||||
- Improved model error messages for Bedrock/Vertex/Foundry users with fallback suggestions
|
||||
- Fixed plugin browse showing misleading "Space to Toggle" hint for already-installed plugins
|
||||
- Fixed hook blocking errors (exit code 2) not showing stderr to the user
|
||||
- Added `speed` attribute to OTel events and trace spans for fast mode visibility
|
||||
- Improved terminal rendering performance
|
||||
- Fixed fatal errors being swallowed instead of displayed
|
||||
- Fixed process hanging after session close
|
||||
- Fixed character loss at terminal screen boundary
|
||||
- Fixed blank lines in verbose transcript view
|
||||
|
||||
## 2.1.38
|
||||
|
||||
- Fixed VS Code terminal scroll-to-top regression introduced in 2.1.37
|
||||
- Fixed Tab key queueing slash commands instead of autocompleting
|
||||
- Fixed bash permission matching for commands using environment variable wrappers
|
||||
- Fixed text between tool uses disappearing when not using streaming
|
||||
- Fixed duplicate sessions when resuming in VS Code extension
|
||||
- Improved heredoc delimiter parsing to prevent command smuggling
|
||||
- Blocked writes to `.claude/skills` directory in sandbox mode
|
||||
|
||||
## 2.1.37
|
||||
|
||||
- Fixed an issue where /fast was not immediately available after enabling /extra-usage
|
||||
|
||||
## 2.1.36
|
||||
|
||||
- Fast mode is now available for Opus 4.6. Learn more at https://code.claude.com/docs/en/fast-mode
|
||||
|
||||
## 2.1.34
|
||||
|
||||
- Fixed a crash when agent teams setting changed between renders
|
||||
- Fixed a bug where commands excluded from sandboxing (via `sandbox.excludedCommands` or `dangerouslyDisableSandbox`) could bypass the Bash ask permission rule when `autoAllowBashIfSandboxed` was enabled
|
||||
|
||||
## 2.1.33
|
||||
|
||||
- Fixed agent teammate sessions in tmux to send and receive messages
|
||||
- Fixed warnings about agent teams not being available on your current plan
|
||||
- Added `TeammateIdle` and `TaskCompleted` hook events for multi-agent workflows
|
||||
- Added support for restricting which sub-agents can be spawned via `Task(agent_type)` syntax in agent "tools" frontmatter
|
||||
- Added `memory` frontmatter field support for agents, enabling persistent memory with `user`, `project`, or `local` scope
|
||||
- Added plugin name to skill descriptions and `/skills` menu for better discoverability
|
||||
- Fixed an issue where submitting a new message while the model was in extended thinking would interrupt the thinking phase
|
||||
- Fixed an API error that could occur when aborting mid-stream, where whitespace text combined with a thinking block would bypass normalization and produce an invalid request
|
||||
- Fixed API proxy compatibility issue where 404 errors on streaming endpoints no longer triggered non-streaming fallback
|
||||
- Fixed an issue where proxy settings configured via `settings.json` environment variables were not applied to WebFetch and other HTTP requests on the Node.js build
|
||||
- Fixed `/resume` session picker showing raw XML markup instead of clean titles for sessions started with slash commands
|
||||
- Improved error messages for API connection failures — now shows specific cause (e.g., ECONNREFUSED, SSL errors) instead of generic "Connection error"
|
||||
- Errors from invalid managed settings are now surfaced
|
||||
- VSCode: Added support for remote sessions, allowing OAuth users to browse and resume sessions from claude.ai
|
||||
- VSCode: Added git branch and message count to the session picker, with support for searching by branch name
|
||||
- VSCode: Fixed scroll-to-bottom under-scrolling on initial session load and session switch
|
||||
|
||||
## 2.1.32
|
||||
|
||||
- Claude Opus 4.6 is now available!
|
||||
- Added research preview agent teams feature for multi-agent collaboration (token-intensive feature, requires setting CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1)
|
||||
- Claude now automatically records and recalls memories as it works
|
||||
- Added "Summarize from here" to the message selector, allowing partial conversation summarization.
|
||||
- Skills defined in `.claude/skills/` within additional directories (`--add-dir`) are now loaded automatically.
|
||||
- Fixed `@` file completion showing incorrect relative paths when running from a subdirectory
|
||||
- Updated --resume to re-use --agent value specified in previous conversation by default.
|
||||
- Fixed: Bash tool no longer throws "Bad substitution" errors when heredocs contain JavaScript template literals like `${index + 1}`, which previously interrupted tool execution
|
||||
- Skill character budget now scales with context window (2% of context), so users with larger context windows can see more skill descriptions without truncation
|
||||
- Fixed Thai/Lao spacing vowels (สระ า, ำ) not rendering correctly in the input field
|
||||
- VSCode: Fixed slash commands incorrectly being executed when pressing Enter with preceding text in the input field
|
||||
- VSCode: Added spinner when loading past conversations list
|
||||
|
||||
## 2.1.31
|
||||
|
||||
- Added session resume hint on exit, showing how to continue your conversation later
|
||||
- Added support for full-width (zenkaku) space input from Japanese IME in checkbox selection
|
||||
- Fixed PDF too large errors permanently locking up sessions, requiring users to start a new conversation
|
||||
- Fixed bash commands incorrectly reporting failure with "Read-only file system" errors when sandbox mode was enabled
|
||||
- Fixed a crash that made sessions unusable after entering plan mode when project config in `~/.claude.json` was missing default fields
|
||||
- Fixed `temperatureOverride` being silently ignored in the streaming API path, causing all streaming requests to use the default temperature (1) regardless of the configured override
|
||||
- Fixed LSP shutdown/exit compatibility with strict language servers that reject null params
|
||||
- Improved system prompts to more clearly guide the model toward using dedicated tools (Read, Edit, Glob, Grep) instead of bash equivalents (`cat`, `sed`, `grep`, `find`), reducing unnecessary bash command usage
|
||||
- Improved PDF and request size error messages to show actual limits (100 pages, 20MB)
|
||||
- Reduced layout jitter in the terminal when the spinner appears and disappears during streaming
|
||||
- Removed misleading Anthropic API pricing from model selector for third-party provider (Bedrock, Vertex, Foundry) users
|
||||
|
||||
## 2.1.30
|
||||
|
||||
- Added `pages` parameter to the Read tool for PDFs, allowing specific page ranges to be read (e.g., `pages: "1-5"`). Large PDFs (>10 pages) now return a lightweight reference when `@` mentioned instead of being inlined into context.
|
||||
- Added pre-configured OAuth client credentials for MCP servers that don't support Dynamic Client Registration (e.g., Slack). Use `--client-id` and `--client-secret` with `claude mcp add`.
|
||||
- Added `/debug` for Claude to help troubleshoot the current session
|
||||
- Added support for additional `git log` and `git show` flags in read-only mode (e.g., `--topo-order`, `--cherry-pick`, `--format`, `--raw`)
|
||||
- Added token count, tool uses, and duration metrics to Task tool results
|
||||
- Added reduced motion mode to the config
|
||||
- Fixed phantom "(no content)" text blocks appearing in API conversation history, reducing token waste and potential model confusion
|
||||
- Fixed prompt cache not correctly invalidating when tool descriptions or input schemas changed, only when tool names changed
|
||||
- Fixed 400 errors that could occur after running `/login` when the conversation contained thinking blocks
|
||||
- Fixed a hang when resuming sessions with corrupted transcript files containing `parentUuid` cycles
|
||||
- Fixed rate limit message showing incorrect "/upgrade" suggestion for Max 20x users when extra-usage is unavailable
|
||||
- Fixed permission dialogs stealing focus while actively typing
|
||||
- Fixed subagents not being able to access SDK-provided MCP tools because they were not synced to the shared application state
|
||||
- Fixed a regression where Windows users with a `.bashrc` file could not run bash commands
|
||||
- Improved memory usage for `--resume` (68% reduction for users with many sessions) by replacing the session index with lightweight stat-based loading and progressive enrichment
|
||||
- Improved `TaskStop` tool to display the stopped command/task description in the result line instead of a generic "Task stopped" message
|
||||
- Changed `/model` to execute immediately instead of being queued
|
||||
- [VSCode] Added multiline input support to the "Other" text input in question dialogs (use Shift+Enter for new lines)
|
||||
- [VSCode] Fixed duplicate sessions appearing in the session list when starting a new conversation
|
||||
|
||||
## 2.1.29
|
||||
|
||||
- Fixed startup performance issues when resuming sessions that have `saved_hook_context`
|
||||
|
||||
## 2.1.27
|
||||
|
||||
- Added tool call failures and denials to debug logs
|
||||
- Fixed context management validation error for gateway users, ensuring `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1` avoids the error
|
||||
- Added `--from-pr` flag to resume sessions linked to a specific GitHub PR number or URL
|
||||
- Sessions are now automatically linked to PRs when created via `gh pr create`
|
||||
- Fixed /context command not displaying colored output
|
||||
- Fixed status bar duplicating background task indicator when PR status was shown
|
||||
- Windows: Fixed bash command execution failing for users with `.bashrc` files
|
||||
- Windows: Fixed console windows flashing when spawning child processes
|
||||
- VSCode: Fixed OAuth token expiration causing 401 errors after extended sessions
|
||||
|
||||
## 2.1.25
|
||||
|
||||
- Fixed beta header validation error for gateway users on Bedrock and Vertex, ensuring `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1` avoids the error
|
||||
|
||||
## 2.1.23
|
||||
|
||||
- Added customizable spinner verbs setting (`spinnerVerbs`)
|
||||
|
||||
31
examples/settings/README.md
Normal file
31
examples/settings/README.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# Settings Examples
|
||||
|
||||
Example Claude Code settings files, primarily intended for organization-wide deployments. Use these are starting points — adjust them to fit your needs.
|
||||
|
||||
These may be applied at any level of the [settings hierarchy](https://code.claude.com/docs/en/settings#settings-files), though certain properties only take effect if specified in enterprise settings (e.g. `strictKnownMarketplaces`, `allowManagedHooksOnly`, `allowManagedPermissionRulesOnly`).
|
||||
|
||||
|
||||
## Configuration Examples
|
||||
|
||||
> [!WARNING]
|
||||
> These examples are community-maintained snippets which may be unsupported or incorrect. You are responsible for the correctness of your own settings configuration.
|
||||
|
||||
| Setting | [`settings-lax.json`](./settings-lax.json) | [`settings-strict.json`](./settings-strict.json) | [`settings-bash-sandbox.json`](./settings-bash-sandbox.json) |
|
||||
|---------|:---:|:---:|:---:|
|
||||
| Disable `--dangerously-skip-permissions` | ✅ | ✅ | |
|
||||
| Block plugin marketplaces | ✅ | ✅ | |
|
||||
| Block user and project-defined permission `allow` / `ask` / `deny` | | ✅ | ✅ |
|
||||
| Block user and project-defined hooks | | ✅ | |
|
||||
| Deny web fetch and search tools | | ✅ | |
|
||||
| Bash tool requires approval | | ✅ | |
|
||||
| Bash tool must run inside of sandbox | | | ✅ |
|
||||
|
||||
## Tips
|
||||
- Consider merging snippets of the above examples to reach your desired configuration
|
||||
- Settings files must be valid JSON
|
||||
- Before deploying configuration files to your organization, test them locally by applying to `managed-settings.json`, `settings.json` or `settings.local.json`
|
||||
- The `sandbox` property only applies to the `Bash` tool; it does not apply to other tools (like Read, Write, WebSearch, WebFetch, MCPs), hooks, or internal commands
|
||||
|
||||
## Full Documentation
|
||||
|
||||
See https://code.claude.com/docs/en/settings for complete documentation on all available managed settings.
|
||||
18
examples/settings/settings-bash-sandbox.json
Normal file
18
examples/settings/settings-bash-sandbox.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"allowManagedPermissionRulesOnly": true,
|
||||
"sandbox": {
|
||||
"enabled": true,
|
||||
"autoAllowBashIfSandboxed": false,
|
||||
"allowUnsandboxedCommands": false,
|
||||
"excludedCommands": [],
|
||||
"network": {
|
||||
"allowUnixSockets": [],
|
||||
"allowAllUnixSockets": false,
|
||||
"allowLocalBinding": false,
|
||||
"allowedDomains": [],
|
||||
"httpProxyPort": null,
|
||||
"socksProxyPort": null
|
||||
},
|
||||
"enableWeakerNestedSandbox": false
|
||||
}
|
||||
}
|
||||
6
examples/settings/settings-lax.json
Normal file
6
examples/settings/settings-lax.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"permissions": {
|
||||
"disableBypassPermissionsMode": "disable"
|
||||
},
|
||||
"strictKnownMarketplaces": []
|
||||
}
|
||||
28
examples/settings/settings-strict.json
Normal file
28
examples/settings/settings-strict.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"permissions": {
|
||||
"disableBypassPermissionsMode": "disable",
|
||||
"ask": [
|
||||
"Bash"
|
||||
],
|
||||
"deny": [
|
||||
"WebSearch",
|
||||
"WebFetch"
|
||||
]
|
||||
},
|
||||
"allowManagedPermissionRulesOnly": true,
|
||||
"allowManagedHooksOnly": true,
|
||||
"strictKnownMarketplaces": [],
|
||||
"sandbox": {
|
||||
"autoAllowBashIfSandboxed": false,
|
||||
"excludedCommands": [],
|
||||
"network": {
|
||||
"allowUnixSockets": [],
|
||||
"allowAllUnixSockets": false,
|
||||
"allowLocalBinding": false,
|
||||
"allowedDomains": [],
|
||||
"httpProxyPort": null,
|
||||
"socksProxyPort": null
|
||||
},
|
||||
"enableWeakerNestedSandbox": false
|
||||
}
|
||||
}
|
||||
106
scripts/sweep.ts
Normal file
106
scripts/sweep.ts
Normal file
@@ -0,0 +1,106 @@
|
||||
#!/usr/bin/env bun
|
||||
|
||||
// --
|
||||
|
||||
const NEW_ISSUE = "https://github.com/anthropics/claude-code/issues/new/choose";
|
||||
const DRY_RUN = process.argv.includes("--dry-run");
|
||||
|
||||
const lifecycle = [
|
||||
{ label: "needs-repro", days: 7 },
|
||||
{ label: "needs-info", days: 7 },
|
||||
{ label: "needs-votes", days: 30 },
|
||||
{ label: "stale", days: 30 },
|
||||
];
|
||||
|
||||
const closeMessages: Record<string, string> = {
|
||||
"needs-repro": `Closing — we weren't able to get the reproduction steps needed to investigate.\n\nIf this is still a problem, please [open a new issue](${NEW_ISSUE}) with steps to reproduce.`,
|
||||
"needs-info": `Closing — we didn't receive the information needed to move forward.\n\nIf this is still a problem, please [open a new issue](${NEW_ISSUE}) with the requested details.`,
|
||||
"needs-votes": `Closing this feature request — it didn't get enough community support to prioritize.\n\nIf you'd still like to see this, please [open a new feature request](${NEW_ISSUE}) with more context about the use case.`,
|
||||
stale: `Closing due to inactivity.\n\nIf this is still a problem, please [open a new issue](${NEW_ISSUE}) with up-to-date information.`,
|
||||
};
|
||||
|
||||
// --
|
||||
|
||||
async function githubRequest<T>(
|
||||
endpoint: string,
|
||||
method = "GET",
|
||||
body?: unknown
|
||||
): Promise<T> {
|
||||
const token = process.env.GITHUB_TOKEN;
|
||||
if (!token) throw new Error("GITHUB_TOKEN required");
|
||||
|
||||
const response = await fetch(`https://api.github.com${endpoint}`, {
|
||||
method,
|
||||
headers: {
|
||||
Authorization: `Bearer ${token}`,
|
||||
Accept: "application/vnd.github.v3+json",
|
||||
"User-Agent": "sweep",
|
||||
...(body && { "Content-Type": "application/json" }),
|
||||
},
|
||||
...(body && { body: JSON.stringify(body) }),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
if (response.status === 404) return {} as T;
|
||||
const text = await response.text();
|
||||
throw new Error(`GitHub API ${response.status}: ${text}`);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
}
|
||||
|
||||
// --
|
||||
|
||||
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");
|
||||
|
||||
if (DRY_RUN) console.log("DRY RUN — no issues will be closed\n");
|
||||
|
||||
let closed = 0;
|
||||
|
||||
for (const { label, days } of lifecycle) {
|
||||
const cutoff = new Date();
|
||||
cutoff.setDate(cutoff.getDate() - days);
|
||||
console.log(`\n=== ${label} (${days}d timeout) ===`);
|
||||
|
||||
for (let page = 1; page <= 10; page++) {
|
||||
const issues = await githubRequest<any[]>(
|
||||
`/repos/${owner}/${repo}/issues?state=open&labels=${label}&sort=updated&direction=asc&per_page=100&page=${page}`
|
||||
);
|
||||
if (issues.length === 0) break;
|
||||
|
||||
for (const issue of issues) {
|
||||
if (issue.pull_request) continue;
|
||||
const base = `/repos/${owner}/${repo}/issues/${issue.number}`;
|
||||
|
||||
const events = await githubRequest<any[]>(`${base}/events?per_page=100`);
|
||||
|
||||
const labeledAt = events
|
||||
.filter((e) => e.event === "labeled" && e.label?.name === label)
|
||||
.map((e) => new Date(e.created_at))
|
||||
.pop();
|
||||
|
||||
if (!labeledAt || labeledAt > cutoff) 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}`);
|
||||
} else {
|
||||
await githubRequest(`${base}/comments`, "POST", { body: closeMessages[label] });
|
||||
await githubRequest(base, "PATCH", { state: "closed", state_reason: "not_planned" });
|
||||
console.log(`#${issue.number}: closed (${label})`);
|
||||
}
|
||||
closed++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\nDone: ${closed} ${DRY_RUN ? "would be closed" : "closed"}`);
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
|
||||
export {};
|
||||
Reference in New Issue
Block a user