{"slug": "my-claude-code-setup-guide", "title": "My Claude Code Setup Guide", "summary": "A developer published a step-by-step guide for installing and configuring Claude Code on macOS, covering the curl and Homebrew install paths, GitHub CLI authentication, and connecting the Atlassian Rovo MCP server for Jira and Confluence access. The setup also includes a vim-style powerline status bar via the claude-powerline package to display git info, token usage, session cost, and model name.", "body_md": "A step-by-step guide to installing and configuring Claude Code on macOS, the way I use it. This isn't meant to be the definitive reference -- it's just my personal setup that's been working well for me. Things change fast, so if something looks off, check the [official docs](https://code.claude.com/docs/en/overview) or let me know.\n\nOfficial docs: [https://code.claude.com/docs/en/setup](https://code.claude.com/docs/en/setup)\n\n- macOS 13.0+ (Ventura or later)\n- 4 GB+ RAM\n- Internet connection\n\n```\ncurl -fsSL https://claude.ai/install.sh | bash\n```\n\nAlternatively, via Homebrew (note: won't auto-update):\n\n```\nbrew install --cask claude-code\n# Check it installed correctly\nclaude --version\n\n# Run a health check\nclaude doctor\n\n# Start Claude Code and log in\nclaude\n/login\n```\n\nFollow the prompts to authenticate with your Claude Pro, Max, Team, or Enterprise account.\n\nOfficial docs: [https://cli.github.com/](https://cli.github.com/)\n\nI use `gh` extensively to interact with GitHub repos from the terminal, and Claude Code uses it too when working with private repos. GitHub also offers an official MCP server, but `gh` is the better choice for Claude Code: it consumes far less context, is faster to execute, easier to debug when things fail, and Claude already knows how to compose `gh` commands fluently since it's well-represented in its training data.\n\n```\nbrew install gh\ngh auth login\n```\n\nYou'll be prompted to choose:\n\n- **GitHub.com** or GitHub Enterprise\n- **HTTPS** or**SSH** protocol\n- **Web browser** authentication (recommended)\n\n```\ngh auth status\ngh repo clone owner/repo   # Clone a repo\ngh pr create                # Create a pull request\ngh pr list                  # List open PRs\ngh pr checkout 123          # Check out a PR locally\ngh issue list               # List issues\ngh issue view 456           # View an issue\ngh browse                   # Open repo in browser\n```\n\nOfficial docs: [https://support.atlassian.com/atlassian-rovo-mcp-server/docs/getting-started-with-the-atlassian-remote-mcp-server/](https://support.atlassian.com/atlassian-rovo-mcp-server/docs/getting-started-with-the-atlassian-remote-mcp-server/)\n\nThis connects Claude Code to Jira and Confluence via the official Atlassian Rovo MCP Server. It uses OAuth 2.1 so no API tokens are needed.\n\n```\nclaude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp\n```\n\nYou can scope it to different levels:\n\n```\n# Available across all your projects (user-level)\nclaude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp --scope user\n\n# Shared with your team via .mcp.json (project-level)\nclaude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp --scope project\n```\n\n1. Start Claude Code with `claude`\n2. Run `/mcp` to see MCP servers\n3. Follow the browser-based OAuth flow to log in with your Atlassian account\n\n```\nclaude mcp list\nclaude mcp get atlassian\n```\n\nOfficial docs: [https://code.claude.com/docs/en/statusline](https://code.claude.com/docs/en/statusline)\nPackage: [https://github.com/Owloops/claude-powerline](https://github.com/Owloops/claude-powerline)\n\nThis one is purely cosmetic but I really like it. It adds a vim-style powerline bar at the bottom of Claude Code showing git info, token usage, session cost, model name, and more.\n\nAdd to `~/.claude/settings.json`:\n\n```\n{\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"npx @owloops/claude-powerline@latest\"\n  }\n}\n```\n\nNo manual install needed -- `npx` fetches the latest version automatically.\n\nYou can pass flags to customize the appearance:\n\n```\n{\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"npx @owloops/claude-powerline@latest --style=powerline --theme=nord\"\n  }\n}\n```\n\nAvailable styles: `minimal`, `powerline`, `capsule`\nAvailable themes: `dark`, `light`, `nord`, `tokyo-night`, `rose-pine`, `gruvbox`\n\nIf you don't have a Nerd Font installed, add `--charset=text` for ASCII-only mode.\n\nOfficial docs: [https://code.claude.com/docs/en/settings](https://code.claude.com/docs/en/settings)\n\nBy default, Claude Code appends a `Co-Authored-By: Claude ...` trailer to every git commit and a generated-by note to pull request descriptions. This is totally a personal preference, but I like clean commits and PRs, so I disable it.\n\nAdd to `~/.claude/settings.json`:\n\n```\n{\n  \"attribution\": {\n    \"commit\": \"\",\n    \"pr\": \"\"\n  }\n}\n```\n\nSetting both to empty strings removes all attribution from commits and pull request descriptions. You can also customize them individually if you want attribution on one but not the other.\n\nOfficial docs: [https://code.claude.com/docs/en/hooks](https://code.claude.com/docs/en/hooks)\n\nThis is one of my favorite little tweaks. Hooks let you run shell commands when certain events happen in Claude Code. I use them to play a sound when Claude finishes a task or needs my attention, so I can context-switch to something else and know when to come back.\n\nAdd to `~/.claude/settings.json`:\n\n```\n{\n  \"hooks\": {\n    \"Stop\": [\n      {\n        \"matcher\": \"\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"afplay /System/Library/Sounds/Hero.aiff &\"\n          }\n        ]\n      }\n    ],\n    \"Notification\": [\n      {\n        \"matcher\": \"\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"afplay /System/Library/Sounds/Hero.aiff &\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n- **Stop** : Fires when Claude finishes responding. Great for long tasks.\n- **Notification** : Fires when Claude needs attention (e.g., a permission prompt or idle input).\n- **matcher** : An empty string matches all events. You can filter by specific notification types like`\"permission_prompt\"` or`\"idle_prompt\"` .\n- **`&` at the end** : Runs the sound in the background so it doesn't block Claude.\n\nYou can swap `Hero.aiff` for any sound file in `/System/Library/Sounds/` (macOS). Try `Submarine.aiff`, `Glass.aiff`, `Ping.aiff`, etc.\n\nOfficial docs: [https://code.claude.com/docs/en/permissions](https://code.claude.com/docs/en/permissions)\n\nPermissions control which tools Claude can use without asking. My setup is tailored to a Ruby/Rails workflow -- you'll want to adjust the allow list to match your own stack. The idea is to pre-allow the commands you trust so you don't get prompted constantly, while keeping sensitive files locked down.\n\nAdd to `~/.claude/settings.json`:\n\n```\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(rbenv:*)\",\n      \"Bash(ruby:*)\",\n      \"Bash(bundle:*)\",\n      \"Bash(gem:*)\",\n      \"Bash(rspec:*)\",\n      \"Bash(find:*)\",\n      \"Bash(cat:*)\",\n      \"Bash(gh:*)\",\n      \"Bash(ls:*)\",\n      \"Read(~/.zshrc)\",\n      \"Read(~/projects/src/intellum/dev-context-docs/**)\",\n      \"Write(~/projects/src/intellum/dev-context-docs/**)\",\n      \"Edit(~/projects/src/intellum/dev-context-docs/**)\"\n    ],\n    \"deny\": [\n      \"Read(./secrets/**)\"\n    ]\n  }\n}\n```\n\n- **`Bash(command:*)`** -- Allow any arguments for that command (e.g.,` Bash(gh:*)` allows`gh pr list` ,`gh issue view 123` , etc.)\n- **`Read(path)`** /**` Write(path)`** /**` Edit(path)`** -- Allow file operations on matching paths. Supports glob patterns (`**` for recursive,`*` for single level).\n- **`deny` always wins** -- Deny rules are evaluated first, so`Read(./secrets/**)` blocks access even if a broader allow rule would match.\n\nAdjust the allow list to match the tools and paths you use day-to-day. The goal is to reduce permission prompts for trusted operations while keeping sensitive files protected.\n\nOfficial docs: [https://code.claude.com/docs/en/chrome](https://code.claude.com/docs/en/chrome)\n\nClaude in Chrome is a browser extension that lets Claude Code control your browser -- navigate pages, click buttons, fill forms, read console logs, and more.\n\n- Google Chrome or Microsoft Edge (Arc, Brave, etc. are **not** supported)\n- Claude Code 2.0.73+\n- A direct Anthropic paid plan (Pro, Max, Team, or Enterprise)\n\n1. Go to the [Chrome Web Store](https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn)\n2. Click **Add to Chrome**\n3. Sign in with your Claude account\n4. Pin the extension (click the puzzle piece icon in Chrome toolbar, then the pin)\n\n```\n# Start Claude Code with Chrome enabled\nclaude --chrome\n```\n\nOr enable it from within a session:\n\n```\n/chrome\n```\n\nTo enable it by default (so you don't need `--chrome` every time), run `/chrome` and select \"Enabled by default\".\n\nRun `/mcp` inside Claude Code and check that `claude-in-chrome` appears as a connected server.\n\nOfficial docs: [https://code.claude.com/docs/en/memory](https://code.claude.com/docs/en/memory)\n\nThe `CLAUDE.md` file is Claude Code's memory. Instructions placed here are included in every conversation. I keep mine in `~/.claude/CLAUDE.md` so they apply globally across all projects.\n\nCreate or edit `~/.claude/CLAUDE.md`:\n\n```\n- Always respond in English, even when questions are asked in other languages.\n- Use the gh CLI for all GitHub operations (repos, PRs, issues).\n- When my instructions are unclear or conflicting, stop and ask for clarification instead of guessing.\n- Never override or skip my instructions without asking first.\n- Always ask for confirmation before making git commits, unless I explicitly tell you to commit.\n```\n\n- **Respond in English** -- I work in multilingual environments but want consistent English responses.\n- **Use gh CLI** -- Ensures Claude uses`gh` for all GitHub operations, which works with private repos via my authenticated session.\n- **Ask for clarification** -- Prevents Claude from guessing when instructions are ambiguous. Better to stop and ask than go in the wrong direction.\n- **Don't override my instructions** -- Claude sometimes decides it knows better and skips what you asked. This keeps it in check.\n- **Confirm before committing** -- I want to review changes before any git commit happens, unless I explicitly tell Claude to commit.\n\n| File Location | Scope | \n|---|---|\n| `~/.claude/CLAUDE.md` | Global -- all projects | \n| `project-root/CLAUDE.md` | Project -- shared with team via git | \n| `project-root/CLAUDE.local.md` | Local -- auto-gitignored, private to you | \n\nYou can also create a CLAUDE.md with `/init` inside a project directory.\n\nOfficial docs: [https://code.claude.com/docs/en/cli-reference](https://code.claude.com/docs/en/cli-reference)\n\n```\n# Continue the most recent conversation\nclaude --continue\n# or\nclaude -c\n\n# Pick a conversation to resume (interactive picker)\nclaude --resume\n# or\nclaude -r\n\n# Resume a specific named session\nclaude -r \"auth-refactor\"\n```\n\nTip: Name your sessions with `/rename my-feature` so they're easy to find later.\n\n```\n# Ask a question and get the answer printed (non-interactive)\nclaude -p \"explain what this regex does: ^[a-z]+$\"\n\n# Pipe content into Claude\ncat error.log | claude -p \"explain these errors\"\n# Use a specific model\nclaude --model opus\nclaude --model sonnet\n```\n\n| Flag | What It Does | \n|---|---|\n| `--continue` ,`-c` | Resume most recent conversation | \n| `--resume` ,`-r` | Pick a previous conversation to resume | \n| `--print` ,`-p` | Non-interactive mode (prints answer and exits) | \n| `--model` | Choose model ( `sonnet` ,`opus` , or full model ID) | \n| `--verbose` | Show detailed turn-by-turn output | \n| `--chrome` | Enable browser automation | \n| `--add-dir ../other-project` | Add extra directories as context | \n| `--max-turns N` | Limit number of agentic turns (print mode) | \n| `--allowedTools \"Bash(npm test)\"` | Pre-allow specific tools | \n| `--append-system-prompt \"...\"` | Add custom instructions for the session | \n\nOfficial docs: [https://code.claude.com/docs/en/interactive-mode](https://code.claude.com/docs/en/interactive-mode)\n\n| Command | What It Does | \n|---|---|\n| `/help` | Show all commands | \n| `/compact` | Compress conversation to free up context | \n| `/context` | Visualize how much context is used | \n| `/cost` | Show token usage and costs | \n| `/stats` | View usage statistics | \n| `/model` | Switch models mid-session | \n| `/memory` | Edit your CLAUDE.md | \n| `/rename name` | Name the current session | \n| `/resume` | Resume a previous session | \n| `/mcp` | Manage MCP server connections | \n| `/doctor` | Check installation health | \n| `/chrome` | Manage Chrome integration | \n\n| Shortcut | Action | \n|---|---|\n| `Shift+Tab` | Toggle permission modes (Auto-Accept / Plan / Normal) | \n| `Ctrl+G` | Open prompt in your text editor | \n| `Ctrl+V` | Paste an image from clipboard | \n| `Esc` +`Esc` | Rewind to a previous point in conversation | \n| `\\` +`Enter` | Multiline input | \n| `!command` | Run a bash command directly (e.g., `!git status` ) | \n| `@path` | Reference a file with autocomplete | \n\nRun `/terminal-setup` once to enable additional shortcuts like `Option+T` (toggle thinking) and `Shift+Enter` (multiline).\n\nA few things I've picked up that make the day-to-day experience smoother.\n\nYou can interrupt Claude at any time with two different keys:\n\n| Keystroke | What It Does | \n|---|---|\n| `Esc` | Stops Claude mid-action. Context is preserved so you can redirect with a follow-up prompt. Also dismisses autocomplete menus, permission dialogs, and other UI elements depending on context. | \n| `Ctrl+C` | Standard interrupt. Cancels the current generation or input. If pressed at an empty prompt, it exits the session (same as `Ctrl+D` ). | \n\nIn practice, **Esc is the one you'll use most** -- it cleanly stops Claude and lets you course-correct. `Ctrl+C` is the heavier hammer.\n\nPressing `Esc` twice opens the **rewind menu**, which lets you restore code and/or conversation to a previous point (see the keyboard shortcuts table above).\n\n`Ctrl+C` is handy for discarding what you've typed before sending it, but **be careful**: if Claude is actively running, `Ctrl+C` will interrupt the execution instead of just clearing your text. Safer alternatives:\n\n| Shortcut | What It Does | \n|---|---|\n| `Ctrl+U` | Deletes the entire line. Pure text editing -- will never interrupt Claude. You can recover the deleted text with `Ctrl+Y` . | \n| `Ctrl+K` | Deletes from the cursor to the end of the line. Also safe during generation. | \n| `Ctrl+S` | Stashes your current prompt for later instead of discarding it. | \n\n**Tip:** Build the habit of using `Ctrl+U` instead of `Ctrl+C` to clear your input. It's always safe regardless of whether Claude is running or not.\n\nClaude Code can read images when you give it a file path. On macOS, take a screenshot with `Cmd+Shift+4` (saves to Desktop by default), then get the path to Claude:\n\n**Option A: Drag and drop (terminal only)**\nDrag the screenshot file from Finder straight into the terminal. It pastes the full path for you -- fewest clicks.\n\n**Option B: Copy path and paste**\nSelect the file in Finder, press `Cmd+Opt+C` to copy its full path, then paste it into Claude.\n\nEither way, Claude recognizes it as an image and reads it visually. Really handy for sharing error dialogs, UI bugs, or design mockups.\n\n**Note:** Drag and drop only works when running Claude Code in a terminal. If you're using Claude inside an IDE like VS Code or IntelliJ, use Option B instead.\n\nOfficial docs: [https://code.claude.com/docs/en/vs-code](https://code.claude.com/docs/en/vs-code)\n\nIf you're using Claude Code in VS Code or Cursor, the default experience is a chat panel that feels a lot like ChatGPT. It works, but it only gives you a subset of what Claude Code can do. I'd recommend switching to **terminal mode**, which runs the full CLI inside your IDE and unlocks everything in this guide.\n\nAdd this to your VS Code settings (`Cmd+,` → search \"Claude Code\"):\n\n```\n{\n  \"claudeCode.useTerminal\": true§\n}\n```\n\nThis replaces the chat panel with the full CLI running in your IDE's integrated terminal. You still get IDE features like native diff viewing and selection context sharing, but now with the complete set of commands and shortcuts.\n\nJetBrains already works this way by default -- the [Claude Code plugin](https://plugins.jetbrains.com/plugin/27310-claude-code-beta-) is just a connector that runs `claude` in the integrated terminal. No setting to change.\n\nThe chat panel only exposes a subset of features. Terminal mode gives you everything:\n\n| Feature | Chat Panel | Terminal Mode | \n|---|---|---|\n| Slash commands | Partial subset | All commands | \n| Keyboard shortcuts | Limited | Full set (vim mode, history search, etc.) | \n| Status line | Not supported | Fully customizable | \n| `!` bash shortcut | Not available | `!git status` runs inline | \n| Tab completion | Not available | Full autocomplete | \n| MCP configuration | Must use CLI | Direct setup | \n\nOnce you switch, run `/terminal-setup` inside a Claude Code session to configure `Shift+Enter` for multi-line prompts.\n\nOne thing I use all the time: select some lines in your editor and press the shortcut to insert an `@file.ts#5-10` reference directly into the Claude prompt with the file path and line numbers. No need to copy-paste code.\n\n| IDE | Shortcut | \n|---|---|\n| VS Code / Cursor | `Option+K` (Mac) /`Alt+K` (Windows/Linux) | \n| JetBrains (IntelliJ, RubyMine, etc.) | `Cmd+Option+K` (Mac) /`Alt+Ctrl+K` (Windows/Linux) | \n\nYou can also type `@` followed by a filename for manual references with fuzzy matching.\n\nOn top of that, Claude automatically sees whatever you have selected in the editor -- there's a small indicator in the prompt box footer showing how many lines are highlighted. No shortcut needed for that, it just works in the background.\n\nHere's the complete `~/.claude/settings.json` with all the settings described above:\n\n```\n{\n  \"attribution\": {\n    \"commit\": \"\",\n    \"pr\": \"\"\n  },\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(rbenv:*)\",\n      \"Bash(ruby:*)\",\n      \"Bash(bundle:*)\",\n      \"Bash(gem:*)\",\n      \"Bash(rspec:*)\",\n      \"Bash(find:*)\",\n      \"Bash(cat:*)\",\n      \"Bash(gh:*)\",\n      \"Bash(ls:*)\",\n      \"Read(~/.zshrc)\",\n      \"Read(~/projects/src/intellum/dev-context-docs/**)\",\n      \"Write(~/projects/src/intellum/dev-context-docs/**)\",\n      \"Edit(~/projects/src/intellum/dev-context-docs/**)\"\n    ],\n    \"deny\": [\n      \"Read(./secrets/**)\"\n    ]\n  },\n  \"hooks\": {\n    \"Stop\": [\n      {\n        \"matcher\": \"\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"afplay /System/Library/Sounds/Hero.aiff &\"\n          }\n        ]\n      }\n    ],\n    \"Notification\": [\n      {\n        \"matcher\": \"\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"afplay /System/Library/Sounds/Hero.aiff &\"\n          }\n        ]\n      }\n    ]\n  },\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"npx @owloops/claude-powerline@latest\"\n  }\n}\n```\n\nThat's it! This is the setup that works for me day-to-day. Claude Code evolves quickly, so some of this might be outdated by the time you read it -- when in doubt, the [official docs](https://code.claude.com/docs/en/overview) are always the best reference. If you spot anything wrong or have suggestions, I'd love to hear them.", "url": "https://wpnews.pro/news/my-claude-code-setup-guide", "canonical_source": "https://gist.github.com/andrewxiang333-max/a367dae567ee550f5c49bb588df8d568", "published_at": "2026-09-04 01:40:22+00:00", "updated_at": "2026-09-10 00:47:39.800667+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "ai-agents"], "entities": ["Claude Code", "Anthropic", "GitHub", "GitHub CLI", "Atlassian", "Jira", "Confluence", "macOS"], "alternates": {"html": "https://wpnews.pro/news/my-claude-code-setup-guide", "markdown": "https://wpnews.pro/news/my-claude-code-setup-guide.md", "text": "https://wpnews.pro/news/my-claude-code-setup-guide.txt", "jsonld": "https://wpnews.pro/news/my-claude-code-setup-guide.jsonld"}}