Communitygithub.com

generating-python-installer

A commercial-grade Python installer expert for Windows. Ideal for shipping minimal, fast-starting installers; not for basic script-to-exe conversion.

What is generating-python-installer?

This AI agent skill is designed for advanced Windows Python packaging and optimization. It guides the user through a complete workflow from Nuitka compilation to Inno Setup packaging, focusing on minimizing installer size and startup speed. The skill is best used when a Python application needs to be distributed as a professional, minimal, and fast-launching Windows installer. It supports platforms like Claude Code, Cursor, and Codex. The core approach is Nuitka folder mode (dist) plus Inno Setup, avoiding single-file builds or console windows. It includes detailed steps: confirming build parameters (app name, version, etc.), verifying the source build (console disabled, LTO enabled, VC++ runtime), compiling with Nuitka using a specific module exclusion and plugin strategy, slimming the `dist` folder (removing debug symbols, caches, tests, and docs), analyzing DLLs to identify and trim large dependencies, and finally packaging with Inno Setup using LZMA2 ultra compression, full metadata, clean uninstall, and an architecturally matched VC++ redistributable. The skill provides reference projects, optimization strategies (e.g., 32-bit vs 64-bit), pre-built scripts (`build_optimized.bat`, `slim_dist.ps1`), and a recommended module exclusion list to achieve significant size reductions (e.g., from 323 MB to a much smaller size). It also includes case studies and expected size comparisons for different GUI frameworks (Tkinter, PyQt, PySide).

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/generating-python-installer

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

Generating Python Installer (Commercial-Grade)

You are a Python commercial deployment expert. Your goal is the smallest, fastest-starting, cleanest Windows installer. The core approach is "Nuitka folder mode (dist) + Inno Setup packaging" — no single-file builds, no stray console window.

When to Activate

Activate when the user explicitly asks for advanced Python packaging or size/startup optimization on Windows:

  • Nuitka extreme / commercial-grade compilation, smallest-size or fastest-startup builds
  • dist folder slimming, DLL footprint analysis, 32-bit vs 64-bit size tradeoffs
  • Inno Setup packaging with full metadata and a clean, residue-free uninstall

This skill targets advanced size/startup optimization — not basic one-file "script to exe" conversion.

How It Works

  1. Confirm build parameters — app name, version, publisher, exe name, source/output dirs, icon. Never auto-fill; ask the user.
  2. Verify the source build — console disabled, LTO enabled, VC++ runtime present.
  3. Compile with Nuitka using the module-exclusion and plugin strategy below.
  4. Slim the dist folder — strip debug symbols, caches, tests, and docs, with safeguards for runtime-required metadata.
  5. Analyze DLLs to find and trim the largest dependencies.
  6. Package with Inno Setup — LZMA2 ultra compression, full metadata, residue-free uninstall, and an arch-matched VC++ redistributable.

Examples

  • "Package this PySide2 project into the smallest commercial installer with Nuitka" → run the full workflow: recommend 32-bit, exclude WebEngine/3D/Charts, slim dist, package with Inno Setup.
  • "My exe is 400 MB, how to slim it down to half" → analyze DLLs, switch to opencv-python-headless, drop opengl32sw, apply dist slimming.
  • "Can't open after installation on a clean system" → ensure the matching-arch VC++ redistributable is bundled in the Inno Setup script.

Core Philosophy

Adhere to the "Nuitka folder mode (dist) + Inno Setup packaging" approach. Reject single-file builds and console windows.


Practical Reference Case (Production PySide2 Desktop App, 323 MB, with OpenCV / Playwright)

Project Overview

  • Total size: 323 MB
  • Packaging tool: PyInstaller 4.7 (32-bit)
  • Main dependencies: PySide2 (22.52 MB), OpenCV (62.38 MB), Playwright (76.74 MB)
  • Python version: Python 3.8 (32-bit)
  • DLL count: 71, totaling 93.23 MB

Key Optimization Strategies

  1. PASS: Use 32-bit Python → reduces size by 20-30%
  2. PASS: Compress standard library with base_library.zip → 0.74 MB
  3. PASS: Exclude redundant modules → no pytest/unittest/setuptools
  4. PASS: Trim Qt plugins → keep only necessary plugins

Size Distribution

ComponentSizePercentageOptimization Suggestion
playwright76.74 MB23.8%Remove if not needed
OpenCV62.38 MB19.3%Use opencv-python-headless
PySide222.52 MB7.0%Exclude WebEngine/3D/Charts
Other dependencies161.36 MB49.9%-

Expected Size Comparison

Project TypeNuitka OriginalOptimizedReference Project Actual
Tkinter + stdlib150-250 MB80-120 MB-
PyQt/PySide200-400 MB120-250 MB323 MB (including OpenCV, etc.)
With numpy/pandas300-600 MB180-350 MB-

Core Workflow - WARNING: Strictly Follow

When the user requests packaging, follow these steps:

Step 1: Mandatory Parameter Confirmation (FAIL: Do not use defaults)

WARNING: Important Rule: All the following parameters must be confirmed with the user one by one. Never auto-fill or use default values!

You must ask the user and confirm the following information (wait for the user's explicit reply before proceeding):

ParameterDescriptionExample
App NameSoftware display nameRedInk Annotation
VersionSemantic version number1.0.0
PublisherPublisher name shown in Control PanelYourCompany
Exe NameMain executable filenameRedInk.exe
Source DirAbsolute path to the Nuitka dist folderD:\project\dist
Output DirLocation for the installer packageD:\project\output
Icon PathAbsolute path to the .ico file (optional but recommended)D:\project\icon.ico
URLOptional, for Control Panel linkhttps://example.com

Query Template:

"Please provide the following packaging parameters, I need you to confirm each one:

  1. App Name:
  2. Version:
  3. Publisher:
  4. Main executable filename (e.g., xxx.exe):
  5. Source Dir (Nuitka dist folder):
  6. Output Dir (installer save location):
  7. Icon Path (.ico file, can be left blank):
  8. URL (can be left blank):

Please fill in one by one, or reply 'Skip' to use empty values."

Step 2: Source File Quality and Compilation Check (Critical) Before generating the code, you must issue the following critical confirmation to the user (because Inno Setup is just a packaging tool and cannot change the runtime properties of the program itself):

"WARNING: Compilation Parameter Check:

  1. Remove Console Window: Please confirm your dist folder was compiled using nuitka --windows-console-mode=disable. (Otherwise, a console window will still appear after installation)
  2. High Performance: Please confirm you used --lto=yes. (Otherwise, startup speed may be suboptimal)
  3. Runtime Library: Please ensure the necessary VC++ runtime libraries are included in your dist folder to prevent issues on clean systems.

Please reply 'Confirmed' when the source files are ready, otherwise please recompile first."

Step 3: Generate Code After the user confirms, output the code with full metadata and uninstall icon fix.


Nuitka Extreme Optimized Compilation (Based on Reference Project Experience)

I. 32-bit vs 64-bit Selection Strategy

Reason for using 32-bit Python in the reference project:

Component64-bit Size32-bit SizeSavings
python3x.dll~4.5 MB~3.8 MB15%
Qt5Core.dll~8 MB~5 MB37%
numpy~30 MB~20 MB33%
TotalBaseline-20~30%-

Conditions for recommending 32-bit:

  • PASS: Program memory usage < 2GB
  • PASS: Not processing very large files (< 2GB)
  • PASS: Target users are on standard office computers

How to compile with 32-bit:

# 1. Install 32-bit Python (can coexist with 64-bit)
# Download: https://www.python.org/downloads/windows/

# 2. Install dependencies with 32-bit Python
py -3.12-32 -m pip install -r requirements.txt

# 3. Compile with 32-bit Python
py -3.12-32 -m nuitka --standalone ...your parameters

II. Module Exclusion List (Verified by Reference Project)

Safe exclusions (not needed at runtime):

unittest,test,pytest,_pytest,doctest,pdb,pdbpp,
setuptools,pip,distutils,pkg_resources,
email.mime,http.server,xmlrpc,pydoc

Expected Savings: 30-50 MB

III. GUI Framework-Specific Optimizations

Tkinter Extreme Optimization (Recommended, Lightest)

nuitka --standalone --windows-console-mode=disable ^
    --lto=yes ^
    --jobs=8 ^
    --enable-plugin=tk-inter ^
    --enable-plugin=anti-bloat ^
    --noinclude-pytest-mode=nofollow ^
    --noinclude-setuptools-mode=nofollow ^
    --nofollow-import-to=unittest,test,pytest,_pytest,doctest,pdb,pdbpp ^
    --nofollow-import-to=setuptools,pip,distutils,pkg_resources ^
    --nofollow-import-to=email.mime,http.server,xmlrpc,pydoc ^
    --python-flag=no_docstrings ^
    --output-dir=dist ^
    --windows-icon-from-ico=icon.ico ^
    --remove-output ^
    main.py

Expected Size: 80-120 MB (after optimization)

PyQt5 / PySide2 Optimization

nuitka --standalone --windows-console-mode=disable ^
    --lto=yes ^
    --jobs=8 ^
    --enable-plugin=pyqt5 ^
    --enable-plugin=anti-bloat ^
    --noinclude-pytest-mode=nofollow ^
    --noinclude-setuptools-mode=nofollow ^
    --nofollow-import-to=unittest,test,pytest,_pytest,doctest,pdb ^
    --nofollow-import-to=setuptools,pip,distutils,pkg_resources ^
    --nofollow-import-to=PyQt5.QtWebEngine,PyQt5.QtWebEngineWidgets ^
    --nofollow-import-to=PyQt5.Qt3D,PyQt5.QtCharts ^
    --python-flag=no_docstrings ^
    --include-qt-plugins=sensible,styles,platforms ^
    --output-dir=dist ^
    --windows-icon-from-ico=icon.ico ^
    --remove-output ^
    main.py

Expected Size: 120-250 MB (after optimization)

IV. One-Click Compilation Script Template

Save as build_optimized.bat (project root directory):

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

echo ========================================
echo Nuitka Extreme Optimized Compilation (Reference: Reference Project)
echo ========================================

REM === Configuration Area (Modify to your actual values) ===
set APP_NAME=YourAppName
set MAIN_FILE=main.py
set ICON_FILE=icon.ico

REM === Auto-detect CPU Cores ===
REM Use Windows built-in environment variable (wmic is removed in Win11 22H2+, not detecting will make --jobs=0 single-threaded)
set CPU_CORES=%NUMBER_OF_PROCESSORS%
if not defined CPU_CORES set CPU_CORES=4
set /a BUILD_JOBS=%CPU_CORES%

REM === Reference Project's Module Exclusion List ===
set EXCLUDE_MODULES=unittest,test,pytest,_pytest,doctest,pdb,pdbpp
set EXCLUDE_MODULES=%EXCLUDE_MODULES%,setuptools,pip,distutils,pkg_resources
set EXCLUDE_MODULES=%EXCLUDE_MODULES%,email.mime,http.server,xmlrpc,pydoc

echo.
echo [1/4] Cleaning old builds...
if exist dist rd /s /q dist
if exist build rd /s /q build

echo.
echo [2/4] Running Nuitka compilation (Applying Reference Project Optimization Strategies)...
echo - CPU Cores: %CPU_CORES% (Using %BUILD_JOBS% threads)
echo - Module Exclusion: %EXCLUDE_MODULES%
echo.

nuitka --standalone ^
    --windows-console-mode=disable ^
    --lto=yes ^
    --jobs=%BUILD_JOBS% ^
    --enable-plugin=anti-bloat ^
    --enable-plugin=tk-inter ^
    --noinclude-pytest-mode=nofollow ^
    --noinclude-setuptools-mode=nofollow ^
    --nofollow-import-to=%EXCLUDE_MODULES% ^
    --python-flag=no_docstrings ^
    --output-dir=dist ^
    --windows-icon-from-ico=%ICON_FILE% ^
    --remove-output ^
    %MAIN_FILE%

if %errorlevel% neq 0 (
    echo.
    echo [ERROR] Compilation failed!
    pause
    exit /b 1
)

echo.
echo [3/4] Counting compilation results...
for /f %%a in ('powershell -NoProfile -Command "(Get-ChildItem -LiteralPath 'dist\%APP_NAME%.dist' -Recurse -File | Measure-Object -Property Length -Sum).Sum"') do set TOTAL_SIZE=%%a
set TOTAL_SIZE=%TOTAL_SIZE:,=%
set /a SIZE_MB=%TOTAL_SIZE% / 1048576
echo - Build size: %SIZE_MB% MB

echo.
echo [4/4] Running slimming cleanup (Applying Reference Project Strategy)...
powershell -ExecutionPolicy Bypass -File slim_dist.ps1 -DistPath "dist\%APP_NAME%.dist"

echo.
echo ========================================
echo Compilation Complete!
echo ========================================
pause

V. dist Slimming Script (Reference Project Level Cleanup)

Save as slim_dist.ps1 (in the same directory as build_optimized.bat):

param(
    [string]$DistPath
)

$ErrorActionPreference = "Continue"  # Don't silently swallow errors: show deletion failures to avoid false success

Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "dist Slimming Cleanup (Reference Project Strategy)" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan

if (-not (Test-Path $DistPath)) {
    Write-Host "[ERROR] Directory not found: $DistPath" -ForegroundColor Red
    exit 1
}

# Count initial size
$InitialSize = (Get-ChildItem -Path $DistPath -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
Write-Host "`nInitial size: $([math]::Round($InitialSize, 2)) MB" -ForegroundColor Yellow

# Reference project characteristics: no .pdb, .pyi, __pycache__, test, etc.
Write-Host "`n[Applying Reference Project Cleanup Strategy...]" -ForegroundColor Green

# 1. Delete debug symbols
Write-Host "`n[1/7] Deleting .pdb debug symbols..." -ForegroundColor Green
$pdbFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pdb -File
$pdbSize = ($pdbFiles | Measure-Object -Property Length -Sum).Sum / 1MB
if ($pdbFiles.Count -gt 0) {
    $pdbFiles | Remove-Item -Force
    Write-Host "  Deleted $($pdbFiles.Count) files, saved $([math]::Round($pdbSize, 2)) MB"
} else {
    Write-Host "  No .pdb files found (already optimized)" -ForegroundColor Gray
}

# 2. Delete type hints
Write-Host "`n[2/7] Deleting .pyi type hints..." -ForegroundColor Green
$pyiFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pyi -File
$pyiSize = ($pyiFiles | Measure-Object -Property Length -Sum).Sum / 1MB
if ($pyiFiles.Count -gt 0) {
    $pyiFiles | Remove-Item -Force
    Write-Host "  Deleted $($pyiFiles.Count) files, saved $([math]::Round($pyiSize, 2)) MB"
} else {
    Write-Host "  No .pyi files found (already optimized)" -ForegroundColor Gray
}

# 3. Delete __pycache__
Write-Host "`n[3/7] Deleting __pycache__ cache..." -ForegroundColor Green
$pycacheDirs = Get-ChildItem -Path $DistPath -Recurse -Directory -Filter "__pycache__"
$pycacheSize = 0
foreach ($dir in $pycacheDirs) {
    $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
    $pycacheSize += $size
    Remove-Item -Path $dir.FullName -Recurse -Force
}
if ($pycacheDirs.Count -gt 0) {
    Write-Host "  Deleted $($pycacheDirs.Count) directories, saved $([math]::Round($pycacheSize / 1MB, 2)) MB"
} else {
    Write-Host "  No __pycache__ found (already optimized)" -ForegroundColor Gray
}

# 4. Delete test directories
Write-Host "`n[4/7] Deleting test/tests directories..." -ForegroundColor Green
$testDirs = Get-ChildItem -Path $DistPath -Recurse -Directory | Where-Object { $_.Name -match '^tests?$' }
$testSize = 0
foreach ($dir in $testDirs) {
    $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
    $testSize += $size
    Remove-Item -Path $dir.FullName -Recurse -Force
}
if ($testDirs.Count -gt 0) {
    Write-Host "  Deleted $($testDirs.Count) directories, saved $([math]::Round($testSize / 1MB, 2)) MB"
} else {
    Write-Host "  No test directories found (already optimized)" -ForegroundColor Gray
}

# 5. Delete documentation and examples
Write-Host "`n[5/7] Deleting docs/examples directories..." -ForegroundColor Green
$docDirs = Get-ChildItem -Path $DistPath -Recurse -Directory | Where-Object { $_.Name -match '^(docs|examples|samples|demo)$' }
$docSize = 0
foreach ($dir in $docDirs) {
    $size = (Get-ChildItem -Path $dir.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
    $docSize += $size
    Remove-Item -Path $dir.FullName -Recurse -Force
}
if ($docDirs.Count -gt 0) {
    Write-Host "  Deleted $($docDirs.Count) directories, saved $([math]::Round($docSize / 1MB, 2)) MB"
} else {
    Write-Host "  No documentation directories found (already optimized)" -ForegroundColor Gray
}

# 6. Delete .pyc files
Write-Host "`n[6/7] Deleting .pyc bytecode..." -ForegroundColor Green
$pycFiles = Get-ChildItem -Path $DistPath -Recurse -Include *.pyc -File
$pycSize = ($pycFiles | Measure-Object -Property Length -Sum).Sum / 1MB
if ($pycFiles.Count -gt 0) {
    $pycFiles | Remove-Item -Force
    Write-Host "  Deleted $($pycFiles.Count) files, saved $([math]::Round($pycSize, 2)) MB"
} else {
    Write-Host "  No .pyc files found (already optimized)" -ForegroundColor Gray
}

# 7. Trim .dist-info metadata
Write-Host "`n[7/7] Trimming .dist-info metadata..." -ForegroundColor Green
$distInfoDirs = Get-ChildItem -Path $DistPath -Recurse -Directory -Filter "*.dist-info"
$removedCount = 0
$removedSize = 0
foreach ($infoDir in $distInfoDirs) {
    # Only delete installation accounting files; keep METADATA and entry_points.txt (runtime-read by importlib.metadata, deleting them breaks plugin discovery)
    $filesToRemove = @("RECORD", "INSTALLER", "direct_url.json")
    foreach ($fileName in $filesToRemove) {
        $file = Join-Path $infoDir.FullName $fileName
        if (Test-Path $file) {
            $size = (Get-Item $file).Length
            $removedSize += $size
            Remove-Item $file -Force
            $removedCount++
        }
    }
}
if ($removedCount -gt 0) {
    Write-Host "  Deleted $removedCount metadata files, saved $([math]::Round($removedSize / 1MB, 2)) MB"
} else {
    Write-Host "  No cleanable metadata found (already optimized)" -ForegroundColor Gray
}

# Count final size
$FinalSize = (Get-ChildItem -Path $DistPath -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
$SavedSize = $InitialSize - $FinalSize
$SavedPercent = if ($InitialSize -gt 0) { ($SavedSize / $InitialSize) * 100 } else { 0 }

Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "Cleanup Complete!" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Initial size: $([math]::Round($InitialSize, 2)) MB" -ForegroundColor Yellow
Write-Host "Final size: $([math]::Round($FinalSize, 2)) MB" -ForegroundColor Green
Write-Host "Space saved: $([math]::Round($SavedSize, 2)) MB ($([math]::Round($SavedPercent, 1))%)" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan

Inno Setup Script Generation

This skill is also responsible for generating the final Inno Setup script (installer.iss) and optionally compiling it to produce the smallest possible installer. The generated script will include:

  • Full metadata: AppName, AppVersion, AppPublisher, AppURL (if provided)
  • Clean uninstall: Uses UninstallFilesDir and UninstallDisplayIcon to ensure a residue-free uninstall
  • Arch-matched VC++ redistributable: Detects whether the built files are 32-bit or 64-bit and includes the correct redistributable installer
  • LZMA2 ultra compression: For the smallest possible installer size

(Note: The actual Inno Setup script generation is triggered in a separate command after the user confirms the parameters. The details of the script will be provided upon request.)

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Related Skills