Skip to content

原文(日本語に翻訳)

安全チェックがask応答をトリガーしたときにパーミッション提案が設定されるようになり、SDKコンシューマーがパーミッションオプションを表示できるようになりました。

原文(英語)

Permission suggestions are now populated when safety checks trigger an ask response, enabling SDK consumers to display permission options

概要

Claude Code SDKを使用する開発者向けの機能改善です。安全チェックによって操作の確認が必要になった際(ask応答)、SDKのレスポンスにパーミッションの提案が含まれるようになりました。これにより、SDKを使ったカスタムUIやアプリケーションで、ユーザーに適切なパーミッション選択肢を提示することが可能になります。

基本的な使い方

SDKでask応答を受け取った際に、パーミッション提案を確認します。

typescript
import { ClaudeCode } from '@anthropic-ai/claude-code';

const sdk = new ClaudeCode();

// メッセージストリームを処理
for await (const event of sdk.stream({ prompt: 'rm -rf /tmp/test を実行して' })) {
  if (event.type === 'ask_response') {
    // パーミッション提案が含まれる
    console.log('確認が必要です:', event.reason);

    if (event.permissionSuggestions && event.permissionSuggestions.length > 0) {
      console.log('パーミッション選択肢:');
      event.permissionSuggestions.forEach((suggestion, index) => {
        console.log(`  ${index + 1}. ${suggestion.label}: ${suggestion.rule}`);
      });
    }
  }
}

実践例

ユースケース1: カスタムUIでのパーミッション管理

SDKを使ったWebアプリやCLIツールでパーミッション選択UIを実装する場合。

typescript
import { ClaudeCode } from '@anthropic-ai/claude-code';
import * as readline from 'readline';

const sdk = new ClaudeCode();

async function handleWithPermissions(userPrompt: string) {
  for await (const event of sdk.stream({ prompt: userPrompt })) {
    if (event.type === 'ask_response') {
      console.log('\n⚠️  確認が必要です:', event.reason);

      if (event.permissionSuggestions && event.permissionSuggestions.length > 0) {
        console.log('\nパーミッション選択肢:');
        event.permissionSuggestions.forEach((suggestion, index) => {
          console.log(`  ${index + 1}. ${suggestion.label}`);
          console.log(`     ルール: ${suggestion.rule}`);
          if (suggestion.description) {
            console.log(`     説明: ${suggestion.description}`);
          }
        });

        // ユーザーに選択肢を提示
        const choice = await getUserChoice('どのオプションを選択しますか?');

        // 選択されたパーミッションでセッションを継続
        if (choice !== null) {
          await event.respond(event.permissionSuggestions[choice]);
        } else {
          await event.respond('deny');
        }
      }
    } else if (event.type === 'content') {
      process.stdout.write(event.text);
    }
  }
}

ユースケース2: 自動パーミッション承認システム

事前定義されたルールに基づいてパーミッションを自動承認するシステム。

typescript
import { ClaudeCode } from '@anthropic-ai/claude-code';

const sdk = new ClaudeCode();

// 自動承認するパーミッションのリスト
const AUTO_APPROVE_PATTERNS = [
  /^Read\(.*\)$/,      // 読み取りは常に許可
  /^Bash\(git:.*\)$/,  // gitコマンドは許可
];

async function streamWithAutoApprove(prompt: string) {
  for await (const event of sdk.stream({ prompt })) {
    if (event.type === 'ask_response' && event.permissionSuggestions) {
      // 自動承認できるパーミッションを探す
      const autoApprove = event.permissionSuggestions.find(suggestion =>
        AUTO_APPROVE_PATTERNS.some(pattern => pattern.test(suggestion.rule))
      );

      if (autoApprove) {
        console.log(`自動承認: ${autoApprove.rule}`);
        await event.respond(autoApprove);
      } else {
        // 自動承認できない場合はユーザーに委ねる
        console.log('手動確認が必要です:', event.reason);
        await event.respond('deny');
      }
    }
  }
}

ユースケース3: パーミッション監査ログの記録

すべてのパーミッション要求と承認状況を記録する場合。

typescript
import { ClaudeCode } from '@anthropic-ai/claude-code';
import * as fs from 'fs';

const sdk = new ClaudeCode();

async function streamWithAuditLog(prompt: string, sessionId: string) {
  const auditLog: any[] = [];

  for await (const event of sdk.stream({ prompt })) {
    if (event.type === 'ask_response') {
      const auditEntry = {
        timestamp: new Date().toISOString(),
        sessionId,
        reason: event.reason,
        suggestions: event.permissionSuggestions?.map(s => s.rule),
        decision: 'pending',
      };

      // 処理後に決定を記録
      auditLog.push(auditEntry);

      // デフォルトは拒否
      auditEntry.decision = 'denied';
      await event.respond('deny');
    }
  }

  // 監査ログを保存
  fs.appendFileSync(
    '/var/log/claude-permissions-audit.log',
    auditLog.map(e => JSON.stringify(e)).join('\n') + '\n'
  );
}

注意点

  • この機能はClaude Code SDKを通じてアプリケーションを構築している開発者向けです。
  • 通常のCLI使用では、この改善により安全チェック時のプロンプトの理由が表示されるようになります(別記事参照)。
  • パーミッション提案のデータ構造(フィールド名など)は実装によって異なる場合があります。公式ドキュメントを確認してください。
  • SDK APIの詳細はClaude Code Agent SDKのドキュメントを参照してください。

関連情報