<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python Developer Tooling Handbook – AI Assistants</title>
    <link>https://pydevtools.com/handbook/topics/ai-assistants/</link>
    <description>Configure Claude Code, Cursor, Codex, and GitHub Copilot for Python work.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 08 Apr 2026 13:59:07 -0400</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/handbook/topics/ai-assistants/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Claude Code for Python: A Complete Guide</title>
      <link>https://pydevtools.com/handbook/explanation/claude-code-complete-guide/</link>
      <pubDate>Wed, 06 May 2026 06:23:27 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/claude-code-complete-guide/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://code.claude.com/docs/en/overview&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; is a terminal-based AI assistant that reads your files, runs commands, edits code, and iterates on errors. Describe what you want in plain English, and Claude Code determines which files to read, which commands to run, and what code to write. When something breaks, it reads the error, adjusts, and tries again.&lt;/p&gt;
&lt;p&gt;This guide covers how to use Claude Code for Python development specifically. Each section is self-contained, so skip to whatever is relevant.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting Started with Python Using Codex</title>
      <link>https://pydevtools.com/handbook/explanation/codex-complete-guide/</link>
      <pubDate>Tue, 28 Apr 2026 21:54:51 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/codex-complete-guide/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://developers.openai.com/codex/cli&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Codex CLI&lt;/a&gt; is OpenAI&amp;rsquo;s terminal-based coding agent. It reads your repository, edits files, runs commands, and iterates on errors, all from your terminal. Describe what you want in plain English, and Codex decides which files to read, which commands to run, and what code to write.&lt;/p&gt;
&lt;p&gt;What separates Codex from other terminal agents is how it sandboxes every command the model runs. Codex isolates execution with OS-level enforcement (Seatbelt on macOS, Landlock and seccomp on Linux), not just application-layer checks. This means you can grant Codex more autonomy without worrying that a bad command will reach beyond your project directory or make network calls you didn&amp;rsquo;t authorize.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enough Git to Supervise Your AI Coding Agent</title>
      <link>https://pydevtools.com/handbook/explanation/enough-git-to-supervise-your-ai-coding-agent/</link>
      <pubDate>Tue, 28 Apr 2026 21:54:51 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/enough-git-to-supervise-your-ai-coding-agent/</guid>
      <description>&lt;p&gt;AI coding agents like &lt;a href=&#34;https://pydevtools.com/handbook/explanation/claude-code-complete-guide/&#34;&gt;Claude Code&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/explanation/codex-complete-guide/&#34;&gt;Codex&lt;/a&gt;, Cursor, and GitHub Copilot run Git commands on your behalf. You don&amp;rsquo;t need to memorize those commands, but you do need to understand what they mean. Otherwise you&amp;rsquo;re approving operations you can&amp;rsquo;t verify.&lt;/p&gt;
&lt;p&gt;When your agent says &amp;ldquo;I&amp;rsquo;ve committed the changes and pushed to GitHub,&amp;rdquo; you should know where those changes went and how to undo them if something is wrong. This article provides that mental model. A companion how-to guide walks through &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-put-your-python-project-on-github/&#34;&gt;putting your project on GitHub&lt;/a&gt; for the first time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Claude Code to use uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-to-use-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-to-use-uv/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://claude.com/product/claude-code&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; defaults to &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt; when it needs to install packages or run scripts. A &lt;a href=&#34;https://code.claude.com/docs/en/memory#set-up-a-project-claude-md&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CLAUDE.md&lt;/a&gt; file in your project root overrides that default so every session uses &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; instead.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z&#34;/&gt;&lt;/svg&gt;Tip&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Claude Code to use virtual environments</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-to-use-virtual-environments/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-to-use-virtual-environments/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://code.claude.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; starts a fresh shell for every Bash tool call, so &lt;code&gt;source .venv/bin/activate&lt;/code&gt; in one command has no effect on the next. Without configuration, Claude reaches for system Python and installs packages outside the project&amp;rsquo;s &lt;a href=&#34;https://pydevtools.com/handbook/explanation/what-is-a-virtual-environment/&#34;&gt;virtual environment&lt;/a&gt;. Four configuration patterns work around the stateless-shell limitation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv run&lt;/code&gt; for projects on &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, which sidesteps activation entirely&lt;/li&gt;
&lt;li&gt;A CLAUDE.md instruction that tells Claude to call the venv&amp;rsquo;s interpreter directly&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;.claude/settings.json&lt;/code&gt; &lt;code&gt;env&lt;/code&gt; block that pre-sets &lt;code&gt;VIRTUAL_ENV&lt;/code&gt; and &lt;code&gt;PATH&lt;/code&gt; for every session&lt;/li&gt;
&lt;li&gt;A PreToolUse hook that blocks bare &lt;code&gt;python&lt;/code&gt; and &lt;code&gt;pip&lt;/code&gt; so the rules are enforced, not just suggested&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Trace why &lt;code&gt;source activate&lt;/code&gt; doesn&amp;rsquo;t persist&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;trace-why-source-activate-doesnt-persist&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#trace-why-source-activate-doesnt-persist&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Each Bash tool call Claude Code runs spawns a separate shell process. Environment changes made by &lt;code&gt;source .venv/bin/activate&lt;/code&gt; (it sets &lt;code&gt;VIRTUAL_ENV&lt;/code&gt; and prepends &lt;code&gt;.venv/bin&lt;/code&gt; to &lt;code&gt;PATH&lt;/code&gt;) live only inside that shell. When the next tool call starts a new shell, those variables are gone.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Claude Code with a Python type checker</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-with-a-python-type-checker/</link>
      <pubDate>Fri, 15 May 2026 21:28:17 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-with-a-python-type-checker/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://code.claude.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; does not run a Python type checker by default, and the gap is wider than it looks. Listing &lt;code&gt;uv run ty check&lt;/code&gt; in &lt;code&gt;CLAUDE.md&lt;/code&gt; looks like enough configuration, but &lt;a href=&#34;https://pyrefly.org/blog/pyrefly-agentic-loop/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pyrefly&amp;rsquo;s documented agentic-loop pattern&lt;/a&gt; shows that models routinely skip the command unless the type checker is wrapped in a loop that runs after every edit. With the wrapper in place, the model engages with errors; without it, the model treats the checker as optional.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Cursor for a uv project</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-cursor-for-a-uv-project/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-cursor-for-a-uv-project/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;This guide assumes you have a Python project managed with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt;. If you haven&amp;rsquo;t created a project yet, see the &lt;a href=&#34;https://pydevtools.com/handbook/tutorial/create-your-first-python-project/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;project creation tutorial&lt;/a&gt;.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Cursor is a fork of VS Code, so most Python tooling configuration works the same way. The key difference is Cursor&amp;rsquo;s AI agent, which needs explicit rules to use uv instead of pip. This guide covers both the editor setup and the agent configuration.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Cursor rules to use uv</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-cursor-rules-to-use-uv/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-cursor-rules-to-use-uv/</guid>
      <description>&lt;p&gt;This guide shows you how to configure &lt;a href=&#34;https://cursor.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cursor&lt;/a&gt; &lt;a href=&#34;https://docs.cursor.com/context/rules&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;editor rules&lt;/a&gt; to automatically use &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; for Python package management instead of &lt;a href=&#34;https://pydevtools.com/handbook/reference/pip/&#34;&gt;pip&lt;/a&gt;. Cursor rules help ensure consistent tooling across your development workflow by providing context to the AI about your project preferences.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cursor.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Cursor editor&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv installed&lt;/a&gt; on your system&lt;/li&gt;
&lt;li&gt;A uv-based Python project (e.g. created with &lt;code&gt;uv init&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Create Cursor rules to use uv&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;create-cursor-rules-to-use-uv&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#create-cursor-rules-to-use-uv&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;hextra-steps hx:ml-4 hx:mb-12 hx:ltr:border-l hx:rtl:border-r hx:border-gray-200 hx:ltr:pl-6 hx:rtl:pr-6 hx:dark:border-neutral-800 [counter-reset:step]&#34;&gt;
&lt;h3&gt;1. Create a global Cursor rules file&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;1-create-a-global-cursor-rules-file&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#1-create-a-global-cursor-rules-file&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To apply uv rules across all your Python projects, create a global Cursor rules file by opening the Cursor Command Palette (View Menu → Command Palette), search for &amp;ldquo;New Cursor Rule&amp;rdquo;, and create a new rule named &amp;ldquo;uv&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Ruff with Claude Code</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-ruff-with-claude-code/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-ruff-with-claude-code/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://code.claude.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; does not run &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt; by default, so Python edits land unformatted and lint errors slip through unless you wire Ruff in yourself. Out of the box, Claude often calls bare &lt;code&gt;ruff&lt;/code&gt; (which may resolve outside the project&amp;rsquo;s virtual environment) and skips formatting after edits. Wiring Ruff in correctly takes four layers, each with a different job.&lt;/p&gt;
&lt;p&gt;This guide covers all four and how they stack together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A CLAUDE.md instruction that points Claude at Ruff&lt;/li&gt;
&lt;li&gt;The Astral plugin&amp;rsquo;s &lt;code&gt;/astral:ruff&lt;/code&gt; skill for on-demand Ruff guidance&lt;/li&gt;
&lt;li&gt;A PostToolUse hook that auto-formats every Python edit&lt;/li&gt;
&lt;li&gt;A &lt;a href=&#34;https://pre-commit.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pre-commit&lt;/a&gt; gate that catches anything Claude missed before commit time&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://code.claude.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;A Python project with Ruff added as a dev dependency (&lt;code&gt;uv add --dev ruff&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jq&lt;/code&gt; installed if you want to use the shell version of the auto-format hook&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Pick the right layer for your goal&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;pick-the-right-layer-for-your-goal&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#pick-the-right-layer-for-your-goal&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Each layer answers a different question. Pick the ones that match what you actually need; nothing requires installing all four.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to create a new Python project with Codex</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-create-a-new-python-project-with-codex/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-create-a-new-python-project-with-codex/</guid>
      <description>&lt;p&gt;Codex produces consistent project scaffolding when you explicitly point it at the &lt;a href=&#34;https://pydevtools.com/handbook/explanation/modern-python-project-setup-guide-for-ai-assistants/&#34;&gt;Modern Python Project Setup Guide for AI Assistants&lt;/a&gt;. Use the canonical Markdown URL (&lt;code&gt;https://pydevtools.com/handbook/explanation/modern-python-project-setup-guide-for-ai-assistants/index.md&lt;/code&gt;) inside your first prompt so Codex follows the uv-based workflow on macOS, Linux, and Windows.&lt;/p&gt;
&lt;h2&gt;Launch Codex with the guide loaded&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;launch-codex-with-the-guide-loaded&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#launch-codex-with-the-guide-loaded&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;hextra-steps hx:ml-4 hx:mb-12 hx:ltr:border-l hx:rtl:border-r hx:border-gray-200 hx:ltr:pl-6 hx:rtl:pr-6 hx:dark:border-neutral-800 [counter-reset:step]&#34;&gt;
&lt;h3&gt;1. Open a terminal in your repository root&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;1-open-a-terminal-in-your-repository-root&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#1-open-a-terminal-in-your-repository-root&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Codex works best when it starts in the directory that already contains your project files (or the Git repo where the project will live). On macOS/Linux you can &lt;code&gt;cd /path/to/repo&lt;/code&gt;; on Windows use PowerShell&amp;rsquo;s &lt;code&gt;Set-Location&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install the Astral plugins for Claude Code</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-install-astral-plugins-for-claude-code/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-install-astral-plugins-for-claude-code/</guid>
      <description>&lt;p&gt;Astral publishes an &lt;a href=&#34;https://github.com/astral-sh/claude-code-plugins&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;official Claude Code plugin&lt;/a&gt; that bundles three skills (&lt;code&gt;/astral:uv&lt;/code&gt;, &lt;code&gt;/astral:ruff&lt;/code&gt;, &lt;code&gt;/astral:ty&lt;/code&gt;) and a &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; language server. The skills give Claude up-to-date usage guidance for each tool, and the language server feeds live type-checking diagnostics into the conversation.&lt;/p&gt;
&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://claude.com/product/claude-code&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-install-uv/&#34;&gt;uv installed&lt;/a&gt; (required by the ty language server)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Install the plugin for yourself&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;install-the-plugin-for-yourself&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#install-the-plugin-for-yourself&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&#34;hextra-steps hx:ml-4 hx:mb-12 hx:ltr:border-l hx:rtl:border-r hx:border-gray-200 hx:ltr:pl-6 hx:rtl:pr-6 hx:dark:border-neutral-800 [counter-reset:step]&#34;&gt;
&lt;h3&gt;1. Add the Astral marketplace&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;1-add-the-astral-marketplace&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#1-add-the-astral-marketplace&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Run this slash command inside Claude Code:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Set Up CLAUDE.md for a Python Project</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-use-the-pydevtools-claude-md-template/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-use-the-pydevtools-claude-md-template/</guid>
      <description>&lt;p&gt;Claude Code reads a &lt;code&gt;CLAUDE.md&lt;/code&gt; file in your project root every session. Without one, it falls back to &lt;code&gt;pip install&lt;/code&gt;, bare &lt;code&gt;python&lt;/code&gt; commands, and &lt;code&gt;setup.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://pydevtools.com/&#34;&gt;Python Developer Tooling Handbook&lt;/a&gt; maintains a &lt;a href=&#34;https://pydevtools.com/configs/CLAUDE.md&#34;&gt;CLAUDE.md template&lt;/a&gt; for Python projects using &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/pytest/&#34;&gt;pytest&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What the template covers&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;what-the-template-covers&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#what-the-template-covers&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Package management with uv (&lt;code&gt;uv add&lt;/code&gt;, &lt;code&gt;uv run&lt;/code&gt;, &lt;code&gt;uv sync&lt;/code&gt; instead of pip)&lt;/li&gt;
&lt;li&gt;Project creation with &lt;code&gt;uv init&lt;/code&gt; and &lt;code&gt;pyproject.toml&lt;/code&gt; (never &lt;code&gt;setup.py&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Testing with pytest (discovery conventions, file layout, execution)&lt;/li&gt;
&lt;li&gt;Linting and formatting with ruff&lt;/li&gt;
&lt;li&gt;Type checking with ty or mypy&lt;/li&gt;
&lt;li&gt;Pre-commit hooks with &lt;a href=&#34;https://pydevtools.com/handbook/reference/prek/&#34;&gt;prek&lt;/a&gt; or pre-commit&lt;/li&gt;
&lt;li&gt;Anti-patterns Claude should avoid (manual venvs, &lt;code&gt;pip install&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At 86 lines, the template stays inside Anthropic&amp;rsquo;s &lt;a href=&#34;https://code.claude.com/docs/en/best-practices&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;recommended 200-line limit&lt;/a&gt; for CLAUDE.md files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to stop AI agents from bypassing pre-commit hooks</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-stop-ai-agents-from-bypassing-pre-commit-hooks/</link>
      <pubDate>Fri, 15 May 2026 22:01:03 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-stop-ai-agents-from-bypassing-pre-commit-hooks/</guid>
      <description>&lt;p&gt;Claude Code can ship broken code by running &lt;code&gt;git commit --no-verify&lt;/code&gt; to skip your pre-commit hooks. The behavior is documented and persistent: Anthropic&amp;rsquo;s &lt;a href=&#34;https://github.com/anthropics/claude-code/issues/40117&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;claude-code issue #40117&lt;/a&gt; describes Claude Code Opus 4.6 bypassing explicit deny rules and CLAUDE.md instructions across six consecutive commits, using &lt;code&gt;--no-verify&lt;/code&gt;, &lt;code&gt;git stash&lt;/code&gt;, and quiet flags. The issue was closed as &amp;ldquo;not planned,&amp;rdquo; which means defense comes from outside the agent.&lt;/p&gt;
&lt;p&gt;This guide walks four enforcement layers plus a CI backstop:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to use Python skills with Claude Code</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-use-python-skills-with-claude-code/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-use-python-skills-with-claude-code/</guid>
      <description>&lt;p&gt;Skills bottle up your Python workflow. Instead of re-explaining &amp;ldquo;tighten these type annotations&amp;rdquo; or &amp;ldquo;use &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; instead of pip&amp;rdquo; every session, save the procedure to a markdown file once and let &lt;a href=&#34;https://code.claude.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; reach for it when you ask, either by slash command or by describing the task in plain English. Long reference material that would crowd a &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-use-the-pydevtools-claude-md-template/&#34;&gt;CLAUDE.md&lt;/a&gt; only loads when the skill runs.&lt;/p&gt;
&lt;p&gt;This guide installs the Astral plugin, walks through writing a custom Python skill, and shows when a skill beats CLAUDE.md or a hook.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to write Claude Code hooks for Python projects</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-write-claude-code-hooks-for-python-projects/</link>
      <pubDate>Sat, 16 May 2026 06:16:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-write-claude-code-hooks-for-python-projects/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://code.claude.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; hooks are scripts that run at specific points during a session, letting you enforce project conventions programmatically. A &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-to-use-uv/&#34;&gt;CLAUDE.md file&lt;/a&gt; suggests how Claude should behave; hooks guarantee it by blocking disallowed commands, auto-formatting files, or injecting context before Claude sees your prompt. See the &lt;a href=&#34;https://code.claude.com/docs/en/hooks&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;official hooks documentation&lt;/a&gt; for the full reference.&lt;/p&gt;
&lt;h2&gt;How hooks work&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;how-hooks-work&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#how-hooks-work&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hooks fire on events during a Claude Code session. Claude Code supports over 25 event types (SessionStart, PreToolUse, PostToolUse, UserPromptSubmit, Stop, and more). This guide covers the four most useful for Python projects:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Modern Python Project Setup Guide for AI Assistants</title>
      <link>https://pydevtools.com/handbook/explanation/modern-python-project-setup-guide-for-ai-assistants/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/modern-python-project-setup-guide-for-ai-assistants/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-purple-200 hx:bg-purple-100 hx:text-purple-900 hx:dark:border-purple-200/30 hx:dark:bg-purple-900/30 hx:dark:text-purple-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;Important&lt;/p&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;&lt;p&gt;For AI assistants: this guide is meant to be ingested directly. Paste it (or link it) into your project&amp;rsquo;s &lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;.cursorrules&lt;/code&gt;, or &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; so coding agents follow the same conventions you would. A &lt;a href=&#34;index.md&#34;&gt;plain markdown version&lt;/a&gt; is available for direct ingestion into agent contexts.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
