anthropics / anthropics/claude-code

[BUG] plugin install copies gitignored files, including a root .env, from a directory marketplace

Abierto
#93,423 0 comentarios 0 reacciones 0 asignados Ver en GitHub
area:plugins area:security bug has repro platform:macos
Lenguaje dominante
Python
Estrellas
145k
Forks
23.1k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

### Preflight

- Searched open issues for plugin cache and gitignore reports; found none matching.
- Single bug report.
- Running the latest version (2.1.266).

### What's Wrong?

`claude plugin install` and `claude plugin update` copy the marketplace root into `~/.claude/plugins/cache////`. When the marketplace source is a `directory`, which is the local plugin development path, the copy includes files git ignores.

Measured on my checkout (github.com/bostonaholic/team, 90 skills and 13 agents):

- cache copy: 128M
- content tracked by git: 4.5M
- `node_modules/` accounts for 51M of that difference. The rest is local scratch: `.playwright-mcp/`, `.claude/worktrees/`, `.agents/friction-log/`.

The copy already excludes `.git`, so some filtering happens, but it does not read `.gitignore`.

`.gitignore` is also where local secrets go by convention. My repo reserves a root `.env` for the API key its eval suite reads. I confirmed that file gets copied by writing a probe value to it and reinstalling:

```
$ cat ~/.claude/plugins/cache/team-dev/team/0.97.0-claude.20260910173552/.env
TEAM_DEV_COPY_PROBE=not-a-real-secret
```

The install prints no warning, and the copied file stays until the install is replaced.

### What Should Happen?

When the marketplace source is a directory, skip files git ignores, honoring global excludes and `core.excludesFile`. An explicit exclude list in `marketplace.json` or `plugin.json` would work too.

### Steps to Reproduce

1. Clone a plugin repo whose `.gitignore` covers `node_modules/` and a root `.env`.
2. `bun install` (or `npm install`), and write any value to `.env`.
3. `claude plugin marketplace add --scope user`
4. `claude plugin install @ --scope user`
5. `ls -A ~/.claude/plugins/cache////` shows both `node_modules/` and `.env` in the copy.

### Is this a regression?

Unknown. This is the first version I have measured.

### Claude Code Version

2.1.266

### Platform

macOS (arm64)

### Operating System

macOS 26.6.2

### Terminal/Shell

zsh

### Additional Information

`--plugin-dir` skips the copy for a session, and I use it while iterating. My dev install script goes through `plugin install` so the install I test is the one users get, and that path is where the ignored files come along.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Línea de trabajo

Start with the implementation behind `claude plugin install` and `claude plugin update` for directory marketplaces, then reproduce the copy using the listed marketplace and cache commands. Trace the directory-copy step and identify how `.gitignore`, global excludes, and `core.excludesFile` could be honored. Done means ignored paths such as `node_modules/` and a root `.env` are absent from the cache while tracked plugin files remain.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
git
Área
cli, security, tooling
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Activo
Claridad
Bastante claro
Aptitud para principiantes
55/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.