Common pitfalls that are slow to troubleshoot and that tend to get "fixed" by going in circles, because the error message points nowhere near the actual cause.

MITAuto-check: notesDevelopment

Install Dev Pitfalls

skills CLI
$ npx skills add TheDecipherist/claude-code-mastery-project-starter-kit --skill dev-pitfalls -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install TheDecipherist/claude-code-mastery-project-starter-kit dev-pitfalls --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/TheDecipherist/claude-code-mastery-project-starter-kit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/dev-pitfalls .claude/skills/dev-pitfalls && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
dev-pitfalls
GitHub stars
338
Token cost
~3.3k tokens
SKILL.md length
1,747 words
Files
1
Skills in repo
24
Repo updated
First seen
Licence
MIT

At a glance

Common pitfalls that are slow to troubleshoot and that tend to get "fixed" by going in circles, because the error message points nowhere near the actual cause.

  • Tasks that involve Debugging
  • SKILL.md covers Check project state before…, WSL: put the project on the…, Opening a browser from WSL… and Line endings: LF everywhere…, plus 3 more sections
  • Calls git, kubectl and npm
  • Tasks that involve Git workflow

What it does

Dev Pitfalls is an agent skill from TheDecipherist/claude-code-mastery-project-starter-kit. Common pitfalls that are slow to troubleshoot and that tend to get "fixed" by going in circles, because the error message points nowhere near the actual cause. Use before and during git, project, and WSL work, checking a repo is initialized and nodemodules is ignored, putting WSL projects on the right filesystem, opening a browser from WSL for auth, normalizing line endings, and matching import case. Check the layer here first instead of debugging the wrong one.

Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Debugging and Git workflow. It works with Git and Linux. The repository describes itself as: The definitive starting point for Claude Code projects. Based on Claude Code Mastery Guides V1-V5. The licence is MIT.

When your agent uses it

  • Tasks that involve Debugging
  • Tasks that involve Git workflow

Example prompts

  • “/dev-pitfalls”

Requirements

  • Node.js
  • Docker

What it can do on your machine

Read from SKILL.md and the folder at commit 61fbb99. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • kubectl
    • npm
    • helm
    • docker
    • npx
    • terraform
    • aws
    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, kubectl, npm, helm, docker, npx, aws and gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Dev Pitfalls loads about 3.3k tokens when it runs. Until then it costs about 120 tokens; SKILL.md has 1,747 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~120
When it runs · the whole SKILL.md, loaded when a task matches
~3.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:26
    Ntracked files.** If `node_modules` (or `.env`, or build output) was already committed, adding it to `.gitignore` change
  • NoteMentions a .env fileSKILL.md:73
    ` globally (in `~/.bashrc` or a sourced `.env`) instead of setting it inline on the test command, it overrides your desk
  • NoteRuns commands with sudoSKILL.md:110
    cho fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p`. Inside a container, set `CHOKI

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from TheDecipherist/claude-code-mastery-project-starter-kit at commit 61fbb99, republished under its MIT licence (© TheDecipherist). 1,747 words, ~3,271 tokens.

Download SKILL.mdSave it as .claude/skills/dev-pitfalls/SKILL.md (or your agent's skills folder).
name
dev-pitfalls
description
Common pitfalls that are slow to troubleshoot and that tend to get "fixed" by going in circles, because the error message points nowhere near the actual cause. Use before and during git, project, and WSL work, checking a repo is initialized and node_modules is ignored, putting WSL projects on the right filesystem, opening a browser from WSL for auth, normalizing line endings, and matching import case. Check the layer here first instead of debugging the wrong one.
when_to_use
- Starting git work in a directory (is it even a repo? is node_modules ignored?) - A WSL project is slow, hot reload / file watchers miss changes, or chmod /…

Common Dev Pitfalls (check the layer before debugging it)

These cost hours because the symptom points at the wrong thing, and they're easy to "fix" by going in circles. When something matches below, check the cause here before debugging the code.

Check project state before acting

Claude's frequent miss is assuming project state instead of verifying it. Two checks, stated plainly to the user:

  • Is it even a git repo? Before staging, committing, or diffing, confirm the repo exists (git rev-parse --is-inside-work-tree). If it doesn't, say so directly, "this directory isn't a git repository yet, run git init first", rather than running git commands that fail confusingly or silently acting on a parent repo.
  • Is node_modules ignored? Before the first commit, confirm .gitignore exists and lists node_modules/. Create .gitignore BEFORE npm install so it is never tracked. If it isn't ignored yet, say so before anything gets committed.

.gitignore only ignores UNtracked files. If node_modules (or .env, or build output) was already committed, adding it to .gitignore changes nothing, git keeps tracking it, and this is a classic "my .gitignore isn't working" loop. Untrack it, then commit:

bash
git rm -r --cached node_modules
git commit -m "Stop tracking node_modules"

Confirm a rule actually bites with git check-ignore -v node_modules. Committed node_modules bloats the repo and breaks CI, its platform-specific compiled binaries fail on Linux runners. Same fix for anything that "won't stop showing up" after you ignored it.

WSL: put the project on the Linux filesystem, not /mnt/c

The single biggest WSL pitfall, and Claude rarely thinks to check it. A project under /mnt/c (any Windows drive) is reached from Linux over a 9P bridge, so:

  • file operations run 10-100x slower, npm install, git status, and test runs crawl
  • inotify is flaky across the bridge, so file watchers fire intermittently, hot reload and test watchers "work randomly" then silently stop, which becomes a circular debugging session if you chase it as a config problem
  • Linux permission bits are only emulated, chmod +x can silently fail and ssh rejects keys as "bad permissions"
  • editor integration breaks: Claude often can't see your active selection or the code you've highlighted, so it's working blind on what you're pointing at

Keep repos on the Linux side (~/projects/..., ~/code/...) and open them with VS Code Remote-WSL. If a project sits on /mnt/c and shows any of the above, that location IS the bug, move it:

bash
mv /mnt/c/Users/<you>/projects/my-app ~/projects/

Use /mnt/c only when a file genuinely needs to live on the Windows side for a Windows GUI app.

Don't chase this through settings. The circular trap is treating intermittent watchers or a blind editor as a config problem and tweaking watcher polling, exclude globs, and a pile of VS Code settings. On a Windows machine showing these symptoms, check the path FIRST. If it's /mnt/c, the answer is almost always "you're on the Windows filesystem, open the folder in WSL (Remote-WSL) and move it to ~/", say that before suggesting a single setting.

Opening a browser from WSL (auth / SSO)

A CLI runs an OAuth/SSO login, tries to open a browser from WSL, and either nothing opens or it opens a browser that isn't signed into the corporate IdP (Okta, Entra), so the login fails. Why your own browser matters: the SSO session lives in your real Chrome profile, a fresh or other browser context doesn't have it.

Default to launching your real Chrome via an executable shim on PATH (~/.local/bin/chrome, chmod +x):

sh
#!/bin/sh
exec "/mnt/c/Program Files/Google/Chrome/Application/chrome.exe" "$@"
bash
export BROWSER=chrome   # in ~/.bashrc

That opens your actual browser, your bookmarks and your live Okta session, which is what you want about 99% of the time.

wslview (from the wslu package) is the alternative, but in a corporate setup the browser it routes to may not carry your IdP session, so the login page loads unauthenticated. Offer it as a fallback, not the default. If neither is configured, ask the user which they want (own Chrome vs wslview) before wiring it in.

Check $BROWSER hasn't been hijacked. BROWSER has two unrelated meanings: the desktop convention (which browser opens URLs, used by auth flows) and Playwright's test-runner convention, where BROWSER=chromium selects which browser to run tests in. If a Playwright project exports BROWSER=chromium globally (in ~/.bashrc or a sourced .env) instead of setting it inline on the test command, it overrides your desktop browser, so auth flows either fail outright (no executable named chromium on PATH) or open Playwright's bundled Chromium, a clean isolated context with none of your sessions. Same class of problem as VS Code's built-in browser. Diagnose with echo $BROWSER: if it shows chromium, firefox, or webkit, that's the hijack. Keep BROWSER=chrome (your shim) for desktop and auth, and scope Playwright's to the command only: BROWSER=chromium npx playwright test.

Use a shim, not a bash alias. An alias exists only in interactive shells, so when a program execs $BROWSER it never sees the alias and the open silently fails, which is the exact programmatic case auth needs.

Line endings: LF everywhere (CRLF is the silent killer)

Windows CRLF breaks things in ways that take forever to trace: YAML parsing wrong, shell scripts dying with bad interpreter: /bin/bash^M, Docker entrypoints not executing, diffs showing every line changed when nothing did. YAML and .sh scripts are the usual victims because a stray \r rides along invisibly.

The symptom that wastes the most time: a deploy failing with a type error. A Kubernetes apply (or any YAML-driven deploy) that throws "expected a string, got a map/object" or "cannot unmarshal object into ... string" usually has nothing wrong with the field it names. A stray \r from CRLF has broken how the parser reads the value, so a scalar gets read as a structure. The manifest looks correct because the \r is invisible, which is exactly why this eats hours: the error points at the data, not the line ending. Before debugging the field, the schema, or the value, check the file's line endings, normalize to LF and re-apply.

Make the repo LF-only with .gitattributes at the root:

* text=auto eol=lf

text=auto lets git detect text vs binary (binaries untouched); eol=lf forces LF in both the committed blob and the working tree, regardless of anyone's local core.autocrlf. For a repo that already committed CRLF, the attribute alone won't rewrite it, renormalize once: git add --renormalize . && git commit -m "Normalize line endings to LF". Set .editorconfig end_of_line = lf so files are authored as LF too.

Show full SKILL.md (702 more words)Show less

Case sensitivity: Linux is strict, Windows and macOS usually aren't

import './Button' resolves on a case-insensitive Windows/macOS filesystem even when the file is button.tsx, then fails on Linux and CI with "module not found." Match import casing to the real filename exactly. The same trap hits two files differing only in case (README.md vs Readme.md): they coexist on Linux but collide or shadow each other on Windows/macOS.

Don't guess config field names, look them up (especially Kubernetes)

Structured config (Kubernetes, Helm, Terraform, cloud CLIs) is a typed, nested schema of objects and arrays, not flat KEY=VALUE. Guessing a field path is how an hour disappears into service.port vs spec.ports[0].port. The exact path is one command away, so query it instead of guessing.

  • kubectl explain <resource>.<path> returns the real schema, including whether a field is an object or an array. kubectl explain service.spec.ports shows ports is a list, so the value lives at spec.ports[0].port, not spec.port. Add --recursive for the full nested tree.
  • kubectl get <resource> <name> -o yaml shows the actual structure and values of a live object. Read the path off that, then pull a value precisely with -o jsonpath='{.spec.ports[0].port}'.
  • KEY=VALUE is not how Kubernetes models things. Env vars are a list of objects, env: [{name: FOO, value: bar}], not a map env: {FOO: bar}. Ports, containers, and volumes are arrays too (spec.containers[0].image). Flat-config instincts break here.
  • Helm values are chart-specific. service.port can be valid in one chart's values.yaml and meaningless in another, that structure is defined by the chart, not by Kubernetes. Run helm show values <chart> and read the real keys instead of carrying an assumed path between charts.

General rule: when a tool ships an introspection command (kubectl explain, kubectl get -o yaml, helm show values, terraform state show, aws ... describe-*, gh api), use it to get the exact names the first time. A two-second lookup beats an hour on a path that "looked right."

Errors that lie about their cause

The worst time-sinks are errors whose message points at the wrong thing, so you debug what the text says for hours. When you see one of these, check the real cause first.

  • ENOSPC: no space left on device from a dev server, npm start, Vite, nodemon, or VS Code is almost never disk space. It's the Linux inotify file-watcher limit (default ~8192), exhausted by a large project's file count. Confirm disk is fine with df -h, check the limit with cat /proc/sys/fs/inotify/max_user_watches, then raise it: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p. Inside a container, set CHOKIDAR_USEPOLLING=true instead.
  • exec format error (exec /entrypoint.sh: exec format error, or standard_init_linux.go: ... exec format error) means the binary's CPU architecture doesn't match the host: an arm64 image on an amd64 host or the reverse. Common now that dev laptops are ARM (Apple Silicon) while prod or CI is x86 (or ARM Graviton). Image metadata can claim the right arch while the binary inside doesn't, so trust file <binary> run inside the container over docker inspect. Fix: pull/run with --platform linux/amd64, or build multi-arch with docker buildx build --platform linux/amd64,linux/arm64. Second possible cause: CRLF in the entrypoint script (see line endings above), check that too.
  • fatal: detected dubious ownership in repository is a UID mismatch, not corruption: the repo files are owned by a different user than the one running git. Classic on /mnt/c (Windows files look root-owned to WSL) and in containers (host UID does not match container UID). Git offers the band-aid (git config --global --add safe.directory <path>), but the durable fix is matching ownership: chown -R $(whoami) <repo>, moving the repo to ~/, or running the container with --user $(id -u):$(id -g).
  • EADDRINUSE: address already in use is a leftover process holding the port, usually a dev server that didn't exit. Find and kill it: lsof -t -i:3000 | xargs kill, or use another port. Don't reconfigure the app.
  • JavaScript heap out of memory is V8's default heap ceiling, not always a leak. For a heavy build, raise it: NODE_OPTIONS=--max-old-space-size=4096. If it recurs at low memory, then look for a real leak.

This skill is built to grow. Each new pitfall is another short section: the symptom you actually see, the cause, and the fix that ends the loop.

© TheDecipherist, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/dev-pitfalls of TheDecipherist/claude-code-mastery-project-starter-kit.

Open the folder on GitHubat commit 61fbb99

Compare with similar skills

Dev Pitfalls next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Dev Pitfalls compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Dev Pitfalls this skillTheDecipherist/claude-code-mastery-project-starter-kit338—~3.3kAutomated safety check: NotesMIT
Git History Bug Auditben-manes/caffeine18k—~3.3kAutomated safety check: PassApache-2.0
Stax Devcesarferreira/stax128—~987Automated safety check: PassMIT
Antigravity CLI StatuslineAndyAWD/antigravity-cli-statusline100—~2.2kAutomated safety check: PassMIT
SetupProrise-cool/Claude-Code-Multi-Agent305—~3kAutomated safety check: NotesNone
Git ConfigProrise-cool/Claude-Code-Multi-Agent305—~4.4kAutomated safety check: NotesNone

Similar skills

  • Git History Bug Audit

    ben-manes/caffeine

    Audits a module by walking its git history commit by commit, tracking unresolved issues forward, and reporting the ones that survive to HEAD as findings.

    18k GitHub stars~3.3k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Stax Dev

    cesarferreira/stax

    Development harness for the stax Rust CLI project. An agent skill from cesarferreira/stax.

    128 GitHub stars~987 tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Antigravity CLI Statusline

    AndyAWD/antigravity-cli-statusline

    本技能用於設定 Antigravity 命令列介面(CLI)(agy)的狀態列(Statusline / Footer)顯示指標、顯示順序與多語系介面(繁體中文 zh-tw / English us / 日本語 jp),並自動部署跨平台 Node.js 掛鉤(Hook)腳本(statusline-quota.mjs、fetch-local-quota.mjs)至…

    100 GitHub stars~2.2k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Setup

    Prorise-cool/Claude-Code-Multi-Agent

    Complete guide to installing Git and performing basic configuration across all platforms (Windows, macOS, Linux, WSL).

    305 GitHub stars~3k tokensUpdated 21 days ago
    DevelopmentAuto-check: notes
  • Git Config

    Prorise-cool/Claude-Code-Multi-Agent

    Comprehensive Git configuration guide covering global settings, aliases, performance tuning, credential management, maintenance, .gitattributes, clone shortcuts, and troubleshooting.

    305 GitHub stars~4.4k tokensUpdated 21 days ago
    DevelopmentAuto-check: notes
  • Anchor Vet

    lynxlangya/techne

    Evidence-gated diff review for PRs, branches, commit ranges, staged code changes, and merge readiness checks.

    105 GitHub stars~1.3k tokensUpdated 3 mo ago
    DevelopmentAuto-check passed

More from TheDecipherist/claude-code-mastery-project-starter-kit

All 24 skills in this repo
  • Create Service

    TheDecipherist/claude-code-mastery-project-starter-kit

    Scaffold a new microservice that follows the project's server/handlers/adapters architecture.

    338 GitHub stars~1.8k tokensUpdated 3 mo ago
    Auto-check: notes
  • CSS Structure

    TheDecipherist/claude-code-mastery-project-starter-kit

    Where CSS should live. An agent skill from TheDecipherist/claude-code-mastery-project-starter-kit.

    338 GitHub stars~1k tokensUpdated 3 mo ago
    Auto-check passed
  • Docker

    TheDecipherist/claude-code-mastery-project-starter-kit

    Production Docker best practices for writing Dockerfiles, Compose files, and Swarm stacks.

    338 GitHub stars~1.6k tokensUpdated 3 mo ago
    Auto-check: notes
  • Docker Swarm

    TheDecipherist/claude-code-mastery-project-starter-kit

    Production Docker Swarm deployment rules: what changes when a compose file goes from a single node to a multi-node Swarm.

    338 GitHub stars~1.8k tokensUpdated 3 mo ago
    Auto-check passed
  • Mongodb Backups

    TheDecipherist/claude-code-mastery-project-starter-kit

    Production MongoDB backup and restore practices that the documentation gets wrong.

    338 GitHub stars~1.3k tokensUpdated 3 mo ago
    Auto-check passed
  • Mongodb Replica Sets

    TheDecipherist/claude-code-mastery-project-starter-kit

    Production MongoDB replica-set operation: topology, durability, host tuning, and the container-specific gotchas Claude gets wrong.

    338 GitHub stars~1.6k tokensUpdated 3 mo ago
    Auto-check passed

Works with

Categories

Questions about Dev Pitfalls

What does Dev Pitfalls do?

Common pitfalls that are slow to troubleshoot and that tend to get "fixed" by going in circles, because the error message points nowhere near the actual cause. Dev Pitfalls is an agent skill from TheDecipherist/claude-code-mastery-project-starter-kit. Common pitfalls that are slow to troubleshoot and that tend to get "fixed" by going in circles, because the error message points nowhere near the actual cause.

When should I use Dev Pitfalls?

Dev Pitfalls fits situations like: tasks that involve Debugging; tasks that involve Git workflow.

How do I install Dev Pitfalls in Claude Code?

Run `npx skills add TheDecipherist/claude-code-mastery-project-starter-kit --skill dev-pitfalls -a claude-code`. Or copy the skill folder (.claude/skills/dev-pitfalls in TheDecipherist/claude-code-mastery-project-starter-kit) into .claude/skills/dev-pitfalls in your project. Claude Code loads it when a task matches its description.

How do I install Dev Pitfalls in Codex?

Run `npx skills add TheDecipherist/claude-code-mastery-project-starter-kit --skill dev-pitfalls -a codex`. Or copy the skill folder (.claude/skills/dev-pitfalls in TheDecipherist/claude-code-mastery-project-starter-kit) into .agents/skills/dev-pitfalls in your project. Codex loads it when a task matches its description.

Can I use Dev Pitfalls in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add TheDecipherist/claude-code-mastery-project-starter-kit --skill dev-pitfalls -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dev-pitfalls, .gemini/skills/dev-pitfalls, .github/skills/dev-pitfalls and .opencode/skills/dev-pitfalls in your project.

What does Dev Pitfalls need to run?

Going by SKILL.md and its folder, Dev Pitfalls needs the command-line tools its instructions call (git, kubectl, npm, helm, docker and npx). Our summary lists: Node.js; Docker.

Does Dev Pitfalls access the network?

SKILL.md contains no URLs. Its commands use git, npm, docker, npx and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Dev Pitfalls safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file; runs commands with sudo), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Dev Pitfalls use?

Dev Pitfalls is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Dev Pitfalls use?

About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Dev Pitfalls?

Skills that share tags, products or a category with Dev Pitfalls: Git History Bug Audit (ben-manes/caffeine, 18k stars), Stax Dev (cesarferreira/stax, 128 stars), Antigravity CLI Statusline (AndyAWD/antigravity-cli-statusline, 100 stars) and Setup (Prorise-cool/Claude-Code-Multi-Agent, 305 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Dev Pitfalls?

TheDecipherist (a GitHub user) maintains it in TheDecipherist/claude-code-mastery-project-starter-kit, which has 338 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on June 29, 2026.

Source: TheDecipherist/claude-code-mastery-project-starter-kit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.