Communitygithub.com

django-security

Djangoのセキュリティベストプラクティス:認証、認可、CSRF対策、SQLインジェクション対策、XSS対策、安全なデプロイ設定。Djangoの認証、認可、入力処理、またはデプロイ設定をレビューする際に使用します。

django-security とは?

このスキルは、Djangoアプリケーションを開発する開発者とAIエージェント向けに設計された、包括的なセキュリティガイドラインです。本番環境の設定、認証・認可メカニズム、SQLインジェクションやXSS、CSRFなどの一般的な脆弱性に対する防御策、ファイルアップロードのセキュリティ、APIセキュリティ(レート制限や認証)、セキュアなデプロイ設定(環境変数管理やSSL/TLS)までを網羅しています。 設定例はPythonコードブロックとして提供され、すぐにプロジェクトに適用できます。例えば、本番用settingsのひな形やカスタムユーザーモデル、パーミッション管理、安全なORMクエリ、テンプレートエスケープ、ファイルバリデーション、Django REST Framework向けの設定などが含まれます。 このスキルは主にDjangoフレームワークを対象としていますが、Django REST FrameworkやシンプルJWTなど関連ライブラリの設定例も含んでいます。CI/CDや監査ログ、レート制限ミドルウェアといった高度なトピックにも言及しており、プロダクション環境での堅牢なセキュリティを実現するための実践的なリファレンスとなります。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/django-security

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Djangoセキュリティベストプラクティス

Djangoアプリケーションを一般的な脆弱性から保護するための包括的なセキュリティガイドライン。

アクティベーションのタイミング

  • Djangoの認証と認可を設定するとき
  • ユーザーの権限とロールを実装するとき
  • 本番環境のセキュリティ設定を構成するとき
  • Djangoアプリケーションのセキュリティ問題をレビューするとき
  • Djangoアプリケーションを本番環境にデプロイするとき

コアセキュリティ設定

本番環境設定の構成

# settings/production.py
import os

DEBUG = False  # 重要:本番環境では絶対にTrueにしないでください

ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '').split(',')

# セキュリティヘッダー
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000  # 1年間
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = 'DENY'

# HTTPSとクッキー
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Lax'
CSRF_COOKIE_SAMESITE = 'Lax'

# シークレットキー(環境変数で設定する必要があります)
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
if not SECRET_KEY:
    raise ImproperlyConfigured('DJANGO_SECRET_KEY環境変数は必須です')

# パスワードバリデーション
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 12,
        }
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

認証

カスタムユーザーモデル

# apps/users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    """セキュリティを強化するためのカスタムユーザーモデル。"""

    email = models.EmailField(unique=True)
    phone = models.CharField(max_length=20, blank=True)

    USERNAME_FIELD = 'email'  # メールアドレスをユーザー名として使用
    REQUIRED_FIELDS = ['username']

    class Meta:
        db_table = 'users'
        verbose_name = 'ユーザー'
        verbose_name_plural = 'ユーザー'

    def __str__(self):
        return self.email

# settings/base.py
AUTH_USER_MODEL = 'users.User'

パスワードハッシュ

# DjangoはデフォルトでPBKDF2を使用します。より強力なセキュリティが必要な場合:
PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]

セッション管理

# セッション設定
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # または 'db'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 3600 * 24 * 7  # 1週間
SESSION_SAVE_EVERY_REQUEST = False
SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # UXは向上しますが、セキュリティは低下します

認可

パーミッション

# models.py
from django.db import models
from django.contrib.auth.models import Permission

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        permissions = [
            ('can_publish', '投稿を公開できる'),
            ('can_edit_others', '他の人の投稿を編集できる'),
        ]

    def user_can_edit(self, user):
        """ユーザーがこの投稿を編集できるかどうかを確認します。"""
        return self.author == user or user.has_perm('app.can_edit_others')

# views.py
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import UpdateView

class PostUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
    model = Post
    permission_required = 'app.can_edit_others'
    raise_exception = True  # リダイレクトではなく403を返します

    def get_queryset(self):
        """ユーザーが自分の投稿のみを編集できるようにします。"""
        return Post.objects.filter(author=self.request.user)

カスタムパーミッション

# permissions.py
from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    """オーナーのみがオブジェクトを編集できるようにします。"""

    def has_object_permission(self, request, view, obj):
        # 読み取り権限はすべてのリクエストに許可
        if request.method in permissions.SAFE_METHODS:
            return True

        # 書き込み権限はオーナーのみ
        return obj.author == request.user

class IsAdminOrReadOnly(permissions.BasePermission):
    """管理者は何でもでき、その他は読み取り専用です。"""

    def has_permission(self, request, view):
        if request.method in permissions.SAFE_METHODS:
            return True
        return request.user and request.user.is_staff

class IsVerifiedUser(permissions.BasePermission):
    """確認済みユーザーのみを許可します。"""

    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated and request.user.is_verified

ロールベースアクセス制御(RBAC)

# models.py
from django.contrib.auth.models import AbstractUser, Group

class User(AbstractUser):
    ROLE_CHOICES = [
        ('admin', '管理者'),
        ('moderator', 'モデレーター'),
        ('user', '一般ユーザー'),
    ]
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='user')

    def is_admin(self):
        return self.role == 'admin' or self.is_superuser

    def is_moderator(self):
        return self.role in ['admin', 'moderator']

# Mixins
class AdminRequiredMixin:
    """管理者ロールを要求するMixin。"""

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated or not request.user.is_admin():
            from django.core.exceptions import PermissionDenied
            raise PermissionDenied
        return super().dispatch(request, *args, **kwargs)

SQLインジェクション対策

Django ORMによる保護

# 良い例:Django ORMは自動的にパラメータをエスケープします
def get_user(username):
    return User.objects.get(username=username)  # 安全

# 良い例:raw()でパラメータを使用する
def search_users(query):
    return User.objects.raw('SELECT * FROM users WHERE username = %s', [query])

# 悪い例:ユーザー入力を直接補間しないでください
def get_user_bad(username):
    return User.objects.raw(f'SELECT * FROM users WHERE username = {username}')  # 脆弱!

# 良い例:適切なエスケープを使用したfilter
def get_users_by_email(email):
    return User.objects.filter(email__iexact=email)  # 安全

# 良い例:複雑なクエリにQオブジェクトを使用する
from django.db.models import Q
def search_users_complex(query):
    return User.objects.filter(
        Q(username__icontains=query) |
        Q(email__icontains=query)
    )  # 安全

raw()を使用する際の追加セキュリティ

# 生SQLを使用する必要がある場合は、常にパラメータを使用してください
User.objects.raw(
    'SELECT * FROM users WHERE email = %s AND status = %s',
    [user_input_email, status]
)

XSS対策

テンプレートエスケープ

{# Djangoはデフォルトで変数を自動エスケープします - 安全 #}
{{ user_input }}  {# エスケープされたHTML #}

{# 信頼できるコンテンツに対してのみ明示的にsafeをマーク #}
{{ trusted_html|safe }}  {# エスケープされない #}

{# 安全なHTMLにはテンプレートフィルターを使用 #}
{{ user_input|escape }}  {# デフォルトと同じ #}
{{ user_input|striptags }}  {# すべてのHTMLタグを削除 #}

{# JavaScriptエスケープ #}
<script>
    var username = {{ username|escapejs }};
</script>

安全な文字列処理

from django.utils.safestring import mark_safe
from django.utils.html import escape

# 悪い例:エスケープせずにユーザー入力をsafeとマークしないでください
def render_bad(user_input):
    return mark_safe(user_input)  # 脆弱!

# 良い例:最初にエスケープしてからsafeとマーク
def render_good(user_input):
    return mark_safe(escape(user_input))

# 良い例:変数を含むHTMLにはformat_htmlを使用
from django.utils.html import format_html

def greet_user(username):
    return format_html('<span class="user">{}</span>', escape(username))

HTTPヘッダー

# settings.py
SECURE_CONTENT_TYPE_NOSNIFF = True  # MIMEスニッフィングを防止
SECURE_BROWSER_XSS_FILTER = True  # XSSフィルターを有効化
X_FRAME_OPTIONS = 'DENY'  # クリックジャッキングを防止

# カスタムミドルウェア
from django.conf import settings

class SecurityHeaderMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response['X-Content-Type-Options'] = 'nosniff'
        response['X-Frame-Options'] = 'DENY'
        response['X-XSS-Protection'] = '1; mode=block'
        response['Content-Security-Policy'] = "default-src 'self'"
        return response

CSRF対策

デフォルトのCSRF対策

# settings.py - CSRFはデフォルトで有効
CSRF_COOKIE_SECURE = True  # HTTPS経由でのみ送信
CSRF_COOKIE_HTTPONLY = True  # JavaScriptからのアクセスを防止
CSRF_COOKIE_SAMESITE = 'Lax'  # 一部のCSRFを防止
CSRF_TRUSTED_ORIGINS = ['https://example.com']  # 信頼できるドメイン

# テンプレートでの使用
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">送信</button>
</form>

# AJAXリクエスト
function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

fetch('/api/endpoint/', {
    method: 'POST',
    headers: {
        'X-CSRFToken': getCookie('csrftoken'),
        'Content-Type': 'application/json',
    },
    body: JSON.stringify(data)
});

ビューの除外(注意して使用)

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt  # 絶対に必要な場合のみ使用!
def webhook_view(request):
    # 外部サービスからのWebhook
    pass

ファイルアップロードのセキュリティ

ファイル検証

import os
import magic  # pip install python-magic
from django.core.exceptions import ValidationError

ALLOWED_MIMES = {
    'image/jpeg', 'image/png', 'image/gif', 'application/pdf',
}

MIME_TO_EXTENSIONS = {
    'image/jpeg': {'.jpg', '.jpeg'},
    'image/png': {'.png'},
    'image/gif': {'.gif'},
    'application/pdf': {'.pdf'},
}

def validate_file_type(value):
    """マジックバイトを使用してファイルタイプを検証し、拡張子と相互チェックします。"""
    mime = magic.from_buffer(value.read(2048), mime=True)
    value.seek(0)

    if mime not in ALLOWED_MIMES:
        raise ValidationError('サポートされていないファイルタイプです。')

    ext = os.path.splitext(value.name)[1].lower()
    if ext not in MIME_TO_EXTENSIONS.get(mime, set()):
        raise ValidationError('ファイル拡張子がファイルの内容と一致しません。')

def validate_file_size(value):
    """ファイルサイズを検証します(最大5MB)。"""
    if value.size > 5 * 1024 * 1024:
        raise ValidationError('ファイルが大きすぎます。最大サイズは5MBです。')

# models.py
class Document(models.Model):
    file = models.FileField(
        upload_to='documents/',
        validators=[validate_file_type, validate_file_size]
    )

libmagicのインストールが難しい環境(例:最小限のコンテナ)では、代わりに純粋なPythonパッケージfiletypeを代替として使用してください:

import os
from django.core.exceptions import ValidationError

import filetype  # pip install filetype

ALLOWED_MIMES = {
    'image/jpeg', 'image/png', 'image/gif', 'application/pdf',
}

MIME_TO_EXTENSIONS = {
    'image/jpeg': {'.jpg', '.jpeg'},
    'image/png': {'.png'},
    'image/gif': {'.gif'},
    'application/pdf': {'.pdf'},
}

def validate_file_type(value):
    """マジックバイトを使用してファイルタイプを検証します。"""
    kind = filetype.guess(value.read(2048))
    value.seek(0)

    if kind is None or kind.mime not in ALLOWED_MIMES:
        raise ValidationError('サポートされていないファイルタイプです。')

    ext = os.path.splitext(value.name)[1].lower()
    if ext not in MIME_TO_EXTENSIONS.get(kind.mime, set()):
        raise ValidationError('ファイル拡張子がファイルの内容と一致しません。')

安全なファイルストレージ

# settings.py
MEDIA_ROOT = '/var/www/media/'
MEDIA_URL = '/media/'

# 本番環境ではメディア用に別のドメインを使用する
MEDIA_DOMAIN = 'https://media.example.com'

# ユーザーアップロードを直接提供しないでください
# 静的ファイルにはwhitenoiseまたはCDNを使用してください
# メディアファイルには別のサーバーまたはS3を使用してください

APIセキュリティ

レート制限

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day',
        'upload': '10/hour',
    }
}

# カスタムスロットル
from rest_framework.throttling import UserRateThrottle

class BurstRateThrottle(UserRateThrottle):
    scope = 'burst'
    rate = '60/min'

class SustainedRateThrottle(UserRateThrottle):
    scope = 'sustained'
    rate = '1000/day'

APIの認証

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

# views.py
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated

@api_view(['GET', 'POST'])
@permission_classes([IsAuthenticated])
def secure_api_view(request):
    # 認証されたユーザーのみがアクセス可能
    pass

デプロイメントセキュリティ

環境変数による設定管理

# .envファイル(本番環境では.envは使用しないでください。実際の環境変数を使用してください)
DJANGO_SECRET_KEY=your-secret-key-here
DB_NAME=myapp
DB_USER=myuser
DB_PASSWORD=mypassword
DB_HOST=localhost
DB_PORT=5432

# settings.pyで環境変数を読み込む
import os
from pathlib import Path
from dotenv import load_dotenv

load_dotenv()  # 開発用。本番環境では環境変数を直接管理してください

SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME', 'myapp'),
        'USER': os.environ.get('DB_USER', 'myuser'),
        'PASSWORD': os.environ.get('DB_PASSWORD', ''),
        'HOST': os.environ.get('DB_HOST', 'localhost'),
        'PORT': os.environ.get('DB_PORT', '5432'),
    }
}

SSL/TLS設定

# ロードバランサーまたはリバースプロキシの背後にいる場合:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# セキュアなSSL設定
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

# HSTS設定
SECURE_HSTS_SECONDS = 31536000  # 1年間
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

CI/CDにおけるセキュリティスキャン

# .github/workflows/security.yml
name: セキュリティチェック
on: [push, pull_request]

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Bandit(Pythonセキュリティスキャナー)を実行
        run: |
          pip install bandit
          bandit -r . -ll -ii
      - name: Djangoチェックを実行
        run: |
          pip install -r requirements.txt
          python manage.py check --deploy
      - name: 依存関係の脆弱性をスキャン
        run: |
          pip install safety
          safety check

監査とモニタリング

監査ログ

# audit/models.py
from django.db import models
from django.conf import settings

class AuditLog(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
    action = models.CharField(max_length=255)
    model_name = models.CharField(max_length=255)
    object_id = models.IntegerField()
    changes = models.JSONField()
    ip_address = models.GenericIPAddressField()
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-timestamp']

# audit/middleware.py
class AuditMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        # 重要なアクションをログに記録
        if request.method in ['POST', 'PUT', 'PATCH', 'DELETE']:
            AuditLog.objects.create(
                user=request.user if request.user.is_authenticated else None,
                action=f'{request.method} {request.path}',
                ip_address=self.get_client_ip(request),
            )
        return response

    def get_client_ip(self, request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip

補足: セキュリティチェックリスト

  • 本番環境でDEBUGがFalseに設定されている
  • SECRET_KEYが強力で、環境変数から読み込まれている
  • ALLOWED_HOSTSが適切に設定されている
  • HTTPSが有効で、SSL設定が適切に構成されている
  • セッションとCSRFクッキーが安全に設定されている
  • テンプレートがXSSに対して自動エスケープされている
  • データベースクエリが安全に作成されている(生SQLを使用していない、または適切にパラメータ化されている)
  • ファイルアップロードが検証され、安全な方法で保存されている
  • APIのレート制限と認証が設定されている
  • パスワードが安全にハッシュ化されている(Argon2推奨)
  • カスタムユーザーモデルが定義されている(拡張性とセキュリティのため)
  • 権限とロールが適切に実装されている
  • データベースの資格情報が環境変数に保存され、コード管理されていない
  • CI/CDパイプラインがセキュリティスキャンを実行している
  • 監査ログが有効になっている
  • 依存関係が定期的にパッチ適用され、更新されている

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/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

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.

関連スキル