Tech 5 min read

Claude Code 2.1.0 release: true permission wildcards, skill hot reload, and better Vim support

IkesanContents

Claude Code 2.1.0 is here. The biggest improvement for me is real wildcard support in Bash permissions. Until now, permissions only supported prefix matching like Bash(npm run:*), so npm install still needed a separate rule. Now Bash(npm *) covers the whole family in one shot.

There is a lot more in this release too: hot reload for skills, major Vim expansions, agent fork support, and security improvements.

Bash permissions finally support true wildcards

Before 2.1.0, Claude Code permission settings only did prefix matching.

{
  "permissions": {
    "allow": ["Bash(npm run:*)"]
  }
}

That allows npm run build, but npm install still needs another rule. As subcommands pile up, settings.local.json keeps growing.

What changed in 2.1.0

{
  "permissions": {
    "allow": ["Bash(npm *)"]
  }
}

Now * works as a true wildcard. Anything starting with npm is allowed: run, install, update, exec, all of it.

A practical example

{
  "permissions": {
    "allow": [
      "Bash(npm *)",
      "Bash(pnpm *)",
      "Bash(git *)",
      "Bash(docker *)"
    ]
  }
}

With a setup like that, most routine commands can run without hitting the Ask dialog. In my earlier article on Claude Code settings, I wrote that wildcards were not quite enough. In 2.1.0, that part improved a lot.

Skill hot reload

Anyone who has built custom Claude Code skills has probably run into this:

Edit a skill under .claude/skills/ -> restart Claude Code -> lose the flow of the conversation

That is fixed in 2.1.0.

How it works

Skills stored under ~/.claude/skills or .claude/skills are now synced in real time. Save the file and the new version is immediately available. No restart required.

Why it matters

BeforeSince 2.1.0
Edit skill -> restart -> conversation resetEdit skill -> use new version immediately
Frequent interruptions during testingContinuous skill development
Slow iterationMuch faster iteration

If you create and revise skills often, this probably saves hours over time.

Example

# example-skill.md

---
name: "Japanese -> English"
description: "A skill for translating text into English"
language: japanese
---

# Usage

Paste text and run it.

Target text: {text}

Edit .claude/skills/example-skill.md, save it, and the updated version is available immediately.

Note: This works for both global skills in ~/.claude/skills and project-local skills in .claude/skills.

Agent execution now supports forks

If you set context: fork in a skill frontmatter block, the skill or slash command can run in a forked context.

How this differs from subagents

This is the important part. Compared with conventional subagents via the Task tool:

FeatureContext behaviorBest use
SubagentDoes not inherit parent historyDelegate a specialized task to another agent
context: forkCopies parent history and branches from itDo separate work with full awareness of the current context

In practice, context: fork means:

  • It can read the main conversation history
  • Intermediate reasoning inside the skill does not clutter the main thread
  • Only the result comes back

With subagents, you often had to restate the current situation explicitly in the prompt. A fork can already understand the ongoing context.

Example

---
name: "Code analysis"
context: fork
---

# Code analysis skill

Analyze the files discussed in the current conversation
and summarize possible improvements.

This looks especially useful for long analysis and research workflows.

/plan command and language setting

/plan was added

You can now enter plan mode immediately without typing a whole sentence like “please create a plan.”

/plan
-> enter plan mode immediately

Language can be specified

Skill frontmatter can now declare a language.

---
name: "Skill name"
language: "japanese"
---

That makes it easier to force responses into Japanese or another specific language in multilingual projects.

Other UX improvements

Shift+Enter now works across multiple terminals

It works out of the box in iTerm2, WezTerm, Ghostty, and Kitty. Previously, terminal-specific setup was often required.

Ctrl+O shows thinking in real time

You can view Extended Thinking live. That is useful when you want to understand what the model is doing during debugging.

Ctrl+B sends work to the background

Bash commands and agents can both be sent to the background with Ctrl+B, which makes parallel work easier.

Security improvements

Prevents secret exposure in debug logs

This is not flashy, but it matters. The release fixes a case where OAuth tokens, API keys, passwords, and similar sensitive data could be exposed intentionally in debug logs.

If you use Claude Code around security-sensitive work, this alone is worth taking.

Other bug fixes

  • Files and skills not being detected when resuming a session
  • Pasted content getting lost during history replay
  • Improved Esc key queueing behavior
  • Security improvements around IME handling

Expanded Vim support

For people who actually live in Vim, there are several meaningful additions.

New Vim motions

KeyBehavior
; / ,Repeat or reverse f/F/t/T
y / YYank operator
p / PPaste
>> / <<Increase or decrease indent
JJoin lines

Text objects

You can now use text objects like iw, aw, i", a", i(, and a( to operate inside quotes and brackets.

Summary

Claude Code 2.1.0 is a collection of small but high-impact improvements. The biggest ones are:

  1. Wildcard Bash permissions: Bash(npm *) now covers the whole npm family.
  2. Skill hot reload: skill edits apply immediately without restarting.
  3. Security fixes: reduced risk of sensitive data exposure in debug logs.

If you have been fighting with permission rules or revising skills often, this is a very welcome release. Vim users also get a solid upgrade.

References