generating-apex について
本番向け Salesforce Apex の生成とレビューを支援するスキルです。クラス、トリガー、非同期ジョブなどを扱い、結果の報告前にコード解析と Apex テストの実行を求めます。
主な機能
- 01Apex クラスとトリガーの作成ガイド
- 02プロジェクト規約の確認
- 03テンプレートと参考例の確認
- 04セキュリティとガバナ制限のルール
- 05コードアナライザーによる検証
- 06Apex テストの実行
活用シーン
- 01Apex サービス、セレクター、非同期ジョブの作成
- 02既存 Apex クラスやトリガーのレビュー
- 03デプロイに向けた Apex 変更の準備
MCP 対応
生成または更新した Apex ファイルの解析に `run_code_analyzer` MCP ツールを呼び出すよう定めています。MCP を使った Apex テスト実行も認めています。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ forcedotcom/ sf-skills --skill generating-apexインストール後、Claude Code で/generating-apexを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
CREDITS.mdassets/abstract.clsbatch.clsdomain.clsdto.clsexception.clsinterface.clsinvocable.clsqueueable.clsrest-resource.clsschedulable.clsselector.clsservice.clstrigger.clsutility.clsreferences/AccountDeduplicationBatch.clsAccountSelector.clsAccountService.cls詳細
Apex の生成
本番環境向けの Apex を作成する際に、このスキルを使用します。新しいクラス、セレクター、サービス、非同期ジョブ、呼び出し可能メソッド、トリガーの作成や、既存の .cls または .trigger の根拠に基づくレビューが対象です。
必要な入力
作成を始める前に、以下の情報を収集するか、推定してください。
- クラスの種類(サービス、セレクター、ドメイン、バッチ、キュー可能、スケジュール可能、呼び出し可能、トリガー、トリガーアクション、DTO、ユーティリティ、インターフェース、抽象クラス、例外、REST リソース)
- 対象オブジェクトとビジネス上の目的
- クラス名(以下の命名表に従って決定)
- 新規作成か、リファクタリング/修正か。組織や API に関する制約があるか
- デプロイ対象(デフォルトでは
runSpecifiedTestsを使用し、該当する場合は生成したテストを使用)
特に指定がない場合のデフォルト:
- 共有設定:
with sharing(種類ごとの共有ルールは以下を参照) - アクセス修飾子:
public(マネージドパッケージまたは@RestResourceで必要な場合に限りglobalを使用) - API バージョン:
66.0(最小バージョン) - ApexDoc コメント:あり
ユーザーの依頼が明確かつ完全であれば、不要な確認を挟まず、すぐに生成してください。
ワークフロー
すべての手順を順番に実行してください。省略、統合、順序の入れ替えは禁止です。作業が妨げられた場合は停止し、不足している情報を確認してください。該当しない場合は、レポートに一行の理由を添えて N/A と記載してください。
フェーズ 1 — 作成
-
プロジェクトの規約を確認する
- サービス・セレクター・ドメインのレイヤー構成、ログユーティリティ
- 既存のクラス/トリガーと、現在のトリガーフレームワークまたはハンドラーパターン
- Trigger Actions Framework(TAF)がすでに使用されているか
-
適切な最小限のパターンを選択する(以下の種類別ガイダンスを参照)
-
テンプレートとアセットを確認する
- 作成前に、
assets/から該当するテンプレートを読み込む(ファイルの対応関係は種類別ガイダンスを参照) - その種類の
references/にサンプルがある場合は、具体的なスタイルガイドとして読み込む - テストクラスを作成する場合は、必ず
generating-apex-testスキルを読み込んで使用する
- 作成前に、
-
ガードレールを適用して作成する — 以下の「ルール」セクションにあるすべてのルールを適用してください
- ApexDoc を付けて
{ClassName}.clsを生成する {ClassName}.cls-meta.xmlを生成する
- ApexDoc を付けて
-
テストクラスを生成する —
generating-apex-testスキルを読み込み、{ClassName}Test.clsと{ClassName}Test.cls-meta.xmlを作成します。デプロイには Apex テストを必ず生成する必要があります。generating-apex-testスキルを読み込まずに、テストファイルを作成または編集することはできません。
フェーズ 2 — 検証(レポート前に必須)
ファイルの書き込みは中間地点であり、完了ではありません。手順 6 と 7 ではそれぞれツールを呼び出し、その出力を手順 8 のレポートに記載する必要があります。両方の手順を実行し、出力を取得するまで、要約やレポートの提示を行わないでください。
-
コードアナライザーを実行する
- 生成または更新したすべての
.clsファイルに対して、MCPrun_code_analyzerを呼び出します。 - すべての
sev0、sev1、sev2の違反を修正し、問題がなくなるまで再実行します。 - 最終的なツール出力をそのまま取得し、レポートに記載します。
- 代替手段:
sf code-analyzer run --target <target>。どちらも利用できない場合は、レポートにrun_code_analyzer=unavailable: <error>と記録します。
- 生成または更新したすべての
-
Apex テストを実行する
sf apex run testまたは MCP を使用して、{ClassName}Testを含む組織のテストを実行します。- テストの生成、修正、カバレッジ対応はすべて
generating-apex-testに委任し、テストが成功するまで繰り返します。 - 成功/失敗の件数とカバレッジ率を取得し、レポートに記載します。
- 利用できない場合は、レポートに
test_execution=unavailable: <error>と記録します。
フェーズ 3 — レポート
- レポート — このファイルの末尾にある出力形式を使用します。
Analyzer行には、手順 6 の実際のツール出力を含める必要があります(呼び出しを試みた後に利用できない場合は、run_code_analyzer=unavailable: <reason>)。Testing行には、手順 7 の実際の結果を含める必要があります(呼び出しを試みた後に利用できない場合は、test_execution=unavailable: <reason>)。- どちらか一方でも欠けているレポートは不完全です。利用できないと記録する前に、必ずツールの呼び出しを試みてください。
ルール
必ず遵守する制約
生成されるコードでいずれかの制約に違反する場合は、処理を中止し、先に問題を説明してください。
| 制約 | 理由 |
|---|---|
| すべての SOQL をループの外に配置する | クエリガバナー制限(100 クエリ)を回避するため |
| すべての DML をループの外に配置する | DML ガバナー制限(150 ステートメント)を回避するため |
| すべてのクラスで共有キーワードを宣言する | 意図しない without sharing のデフォルト設定とデータ漏えいを防ぐため |
| ハードコードされた ID の代わりに、カスタムメタデータ/ラベル/describe コールを使用する | 組織間の移植性を確保するため |
| 常に例外を処理する(ログに記録、再スロー、または回復) | サイレントな失敗を防ぐため |
| ユーザー入力を含むすべての動的 SOQL でバインド変数を使用する | SOQL インジェクションを防ぐため |
Java の型ではなく、Apex ネイティブのコレクション(List、Map、Set)を使用する | コンパイルエラーを防ぐため |
| 使用前にメソッドが Apex に存在することを確認する | 存在しない API への依存を防ぐため |
メインのコードパスで System.debug() を使用しない | ロギングが有効でなくてもデバッグステートメントは評価され、CPU を消費します。メインのコードパスで必要な場合は、ロギングフレームワークを使用してください |
@future メソッドを使用しない | System.Finalizer を使った Queueable を使用してください。@future はチェーンできず、Batch から呼び出せず、プリミティブ型以外の型を受け取れません |
一括処理とガバナー制限
- すべての公開 API はコレクションを受け取り、処理します。単一レコード用のオーバーロードは一括処理メソッドに処理を委譲します
- バッチ/一括処理フローでは、部分成功 DML(
Database.update(records, false))を優先し、エラーに対してSaveResultを処理します - クエリ結果から ID に基づく検索を効率的に行うには、
Map<Id, SObject>コンストラクターを使用します - 子レコードを親ごとにグループ化するには
Map<Id, List<SObject>>を使用します。処理前に単一のループでマップを作成します - 重複排除とメンバーシップ確認には
Set<Id>を使用します。List.contains()よりSet.contains()を優先します - 親レコードと子レコードの両方が必要な場合は、リレーションシップサブクエリを使い、1 回の SOQL で取得します
- ロールアップ計算では、Apex でクエリ結果を取得してカウントする代わりに、
GROUP BYを指定したAggregateResultを使用します - 実際に変更されたレコードのみを DML 対象にします。更新リストに追加する前に
Trigger.oldMapまたは以前の状態と比較します - 複雑なトランザクションでの消費量を監視するには、
Limits.getQueries()、Limits.getDmlStatements()、Limits.getCpuTime()を使用します
SOQL の最適化
- 適切な
WHERE句を指定した選択性の高いクエリを使用します。可能な場合は、フィルターにインデックス付きフィールド(Id、Name、OwnerId、参照/主従関係フィールド、ExternalIdフィールド、カスタムインデックス)を使用します - SOQL に
SELECT *はありません。必要なフィールドを必ず正確に指定してください - 結果セットの範囲を制限するには
LIMIT句を適用します。決定的な結果を得るにはORDER BYを使用します - カスタムメタデータ型(名前が
__mdtで終わるオブジェクト)をクエリする場合、SOQL は使用しないでください。組み込みメソッド({CustomMdt__mdt}.getAll().values()、getInstance()など)を使用します
キャッシュ
- 頻繁にアクセスされ、変更頻度の低いデータにはプラットフォームキャッシュ(
Cache.Org/Cache.Session)を使用します。TTL を設定し、キャッシュミスを必ず処理してください。キャッシュはいつでも破棄される可能性があります - 同じ実行コンテキスト内での重複クエリを防ぐには、トランザクションスコープのキャッシュとして
private static Mapフィールドを使用します。初回アクセス時に遅延初期化します
セキュリティ
- デフォルトで
with sharingを使用します。without sharingまたはinherited sharingを使用する場合は、その理由を文書化します - CRUD/FLS の適用には、SOQL で
WITH USER_MODE、DatabaseDML でAccessLevel.USER_MODEを使用します - 許可リストまたは
Schema.describeを使用して、動的なフィールド名/演算子名を検証します - 外部の認証情報/API キーにはすべて名前付き認証情報を使用します
- ユーザー向けの
@AuraEnabledエラーにはAuraHandledExceptionを使用し、内部の詳細を含めないでください without sharingを使用するには、カスタム権限のチェックが必要ですwithout sharingのロジックは専用のヘルパークラスに隔離し、with sharingのエントリーポイントから呼び出して、権限昇格の範囲を制限します- 個人情報/機密データは、保存時にプラットフォーム暗号化で暗号化します。デバッグステートメント、エラーメッセージ、API レスポンスで個人情報を公開しないでください
セキュリティ検証
最終確認の前に、次の点を検証してください:CRUD/FLS が適用されている(SOQL + DML) · すべてのクラスに明示的な共有キーワードが指定されている · ハードコードされたシークレットやレコード ID がない · ログやエラーメッセージに PII が含まれていない · エンドユーザー向けのエラーメッセージがサニタイズされている。
エラー処理
- 汎用的な
Exceptionより先に具体的な例外を捕捉し、メッセージにコンテキストを含めます - 例外が発生する可能性のあるコード(DML、コールアウト、JSON の解析、キャスト)のみを
try/catchで囲みます。単純な代入、コレクション操作、算術演算を防御的に囲むことは避けます - 例外の原因チェーンを保持します:
new CustomException('message', cause)(スタックトレースを連結したメッセージで置き換えないでください) - 意味がある場合は、サービスドメインごとにカスタム例外クラスを用意します
@AuraEnabledメソッドでは、例外を捕捉してAuraHandledExceptionとして再スローします- 代替案:意味のあるドメイン例外がない場合は、汎用的な
Exceptionを捕捉し、そのまま再スローするか、元の原因を保持する最小限のカスタム例外でラップします。
Null 安全性
- すべての public メソッドの先頭で、null または空の入力に対するガード節を追加します。コンテキストに合わせた書き方にしてください:private メソッドやトリガーハンドラーでは早期に
returnし、public API では例外をスローし、検証サービスではrecord.addError()を使用します nullではなく空のコレクションを返します- 連鎖したプロパティアクセスにはセーフナビゲーション(
?.)を使用します - 存在が保証されていない限り、
map.get(key)をそのまま参照しないでください。先にcontainsKeyを使う、値を代入して null チェックを行う、またはセーフナビゲーションを使用します - デフォルト値には null 合体演算子(
??)を使用します value == null || value.trim().isEmpty()のような手動チェックより、String.isBlank(value)を優先します
定数とリテラル
- 可能な場合は文字列定数より enum を使用し、enum 値には
UPPER_SNAKE_CASEを使用します - 繰り返し使われる文字列や数値のリテラルは、
private static final定数または定数クラスに切り出します - ユーザー向けの文字列には
Label.カスタムラベルを使用します - 設定可能な値(しきい値、マッピング、機能フラグ)にはカスタムメタデータを使用します
- コードで HTML エスケープされたエンティティ(例:
')を出力しないでください。Apex の文字列リテラルでは、リテラルのシングルクォート'を使用します
命名規則
| 種類 | パターン | 例 |
|---|---|---|
| サービス | {SObject}Service | AccountService |
| セレクター | {SObject}Selector | AccountSelector |
| ドメイン | {SObject}Domain | OpportunityDomain |
| バッチ | {Descriptive}Batch | AccountDeduplicationBatch |
| キュー可能 | {Descriptive}Queueable | ExternalSyncQueueable |
| スケジュール可能 | {Descriptive}Schedulable | DailyCleanupSchedulable |
| DTO | {Descriptive}DTO | AccountMergeRequestDTO |
| ラッパー | {Descriptive}Wrapper | OpportunityLineWrapper |
| ユーティリティ | {Descriptive}Util | StringUtil |
| インターフェース | I{Descriptive} | INotificationService |
| 抽象クラス | Abstract{Descriptive} | AbstractIntegrationService |
| 例外 | {Descriptive}Exception | AccountServiceException |
| REST リソース | {SObject}RestResource | AccountRestResource |
| トリガー | {SObject}Trigger | AccountTrigger |
| トリガーアクション | TA_{SObject}_{Action} | TA_Account_SetDefaults |
その他の命名規則:
- クラス:
PascalCase - メソッド:
camelCase。動詞(get、create、process、validate、is、has、can)で始めます - 変数:
camelCaseのわかりやすい名詞を使用します。リストは複数形の名詞(例:accounts、relatedContacts)、マップは{value}By{key}(例:accountsById)、セットは{noun}Idsとします - 定数:
UPPER_SNAKE_CASE - 略語(
acc、tks、rec)ではなく、完全でわかりやすい名前を使用します
ApexDoc
- クラスヘッダーと、すべての
public/globalメソッドに必須です - 次の内容を含めます:簡単な説明、
@param、@return、@throws、役立つ場合は@example
クラスレベルの形式:
/**
* Provides services for geolocation and address conversion.
*/
public with sharing class GeolocationService { }
メソッドレベルの形式:
/**
* @param paramName Description of the parameter
* @return Description of the return value
* @example
* List<Account> results = AccountService.deduplicateAccounts(accountIds);
*/
コード構造とアーキテクチャ
- 各クラスの責務は 1 つに限定し、最大 500 行とします。超えた場合は分割してください。
- 早期リターン:メソッドの冒頭で事前条件を検証し、直ちにリターンまたは例外をスローします。
- 約 40 行を超えるメソッドでは、プライベートなヘルパーを抽出します。
- テストしやすいように、依存性注入(コンストラクター/メソッドのパラメーター)を使用します。
- 深い継承よりもコンポジションと狭いインターフェースを優先します。変更ではなく、新しい実装で拡張します。
- レイヤーの境界をまたいで、メソッドごとに抽象化レベルを 1 つに保ちます。
| レイヤー | 担当する内容 | 含めてはならないもの |
|---|---|---|
| トリガー | イベントのルーティングのみ | ビジネスロジック、オーケストレーション |
| ハンドラー/サービス | フロー制御、調整 | インラインの SOQL/DML/HTTP/解析 |
| ドメイン | ビジネスルール、検証 | クエリ、コールアウト、永続化の詳細 |
| データ/インテグレーション | SOQL、DML、HTTP | ビジネス上の判断 |
- 禁止事項:オーケストレーションとインラインの SOQL/DML/HTTP が混在するメソッド、ビジネスルールと解析の内部処理が混在するメソッド、検証・永続化・システム間の処理を 1 つにまとめたメソッド
非同期処理の判断マトリックス
| シナリオ | デフォルト | 主な特性 |
|---|---|---|
| 標準的な非同期処理 | Queueable | ジョブ ID、チェーン処理、プリミティブ型以外の型、設定可能な遅延(AsyncOptions を使用して最大 10 分)、重複排除シグネチャ |
| 非常に大規模なデータセット | Batch Apex | チャンク単位の処理、同時実行は最大 5 件。大規模な範囲には QueryLocator を使用 |
| 最新のバッチ処理の代替手段 | CursorStep(Database.Cursor) | 2000 レコード単位のチャンク、より高いスループット、5 ジョブの上限なし |
| 定期的なスケジュール実行 | Scheduled Flow(推奨)または Schedulable | Schedulable には 100 ジョブの上限があります。Batch へのチェーン処理、または複雑な Apex ロジックが必要な場合にのみ使用してください。 |
| ジョブ後のクリーンアップ | Finalizer(System.Finalizer) | Queueable の成否にかかわらず実行 |
| 長時間実行されるコールアウト | Continuation | トランザクションあたり最大 3 件、並列実行は 3 件 |
| 10 分を超える遅延 | System.scheduleBatch() | 特定の将来時刻に Batch ジョブをスケジュール |
| レガシーのファイア・アンド・フォーゲット | @future | 新しいコードでは使用しないでください — ハードストップ制約を参照してください。Queueable + Finalizer に置き換えてください。 |
型ごとのガイダンス
サービス
- テンプレート:
assets/service.cls· 参考:references/AccountService.cls with sharingを指定します。ステートレスに保ちます(publicフィールドや変更可能なインスタンス状態は使用しません)。公開 API は目的を絞り、妥当な場合はstaticにします。- すべての SOQL は Selector に、SObject の動作は Domain に委譲します。
- ビジネスエラーはカスタム例外(例:
AccountServiceException)でラップします。
Selector
- テンプレート:
assets/selector.cls· 参考:references/AccountSelector.cls inherited sharingを指定し、SObject またはクエリドメインごとに 1 つ作成します。List<SObject>またはMap<Id, SObject>を返します。共通のベースフィールドリスト定数を使用し、インラインで重複させないでください。- フィルターパラメーターを受け取り、常に
WITH USER_MODEを含めます。
Domain
- テンプレート:
assets/domain.cls with sharingを指定し、フィールドのデフォルト値、導出値、検証をカプセル化します。- メモリー内のリストのみを操作します。SOQL/DML は使用しません(Services/Selectors の担当です)。
Batch
- テンプレート:
assets/batch.cls· 参考:references/AccountDeduplicationBatch.cls with sharingを指定し、Database.Batchable<SObject>を実装します(チャンクをまたいで状態を追跡する場合はDatabase.Statefulを追加します)。start()= クエリ定義、execute()= ビジネスロジック、finish()= ログ記録/通知- 大規模なデータセットには
QueryLocatorを使用し、部分的な失敗はDatabase.SaveResultで処理します。 - 再利用できるよう、コンストラクターでフィルターパラメーターを受け取ります。
Queueable
- テンプレート:
assets/queueable.cls with sharingを指定し、Queueableを実装します。HTTP コールアウトが必要な場合は、必要に応じてDatabase.AllowsCalloutsも実装します。- コンストラクターでデータを受け取ります。
- 無限のチェーン処理を防ぐため、チェーンの深さをチェックします。
- 必要に応じて
Finalizerを実装し、復旧/クリーンアップを行います。 - 設定可能な遅延(最大 10 分)と重複排除シグネチャには
AsyncOptionsを使用します。
スケジュール可能
- テンプレート:
assets/schedulable.cls with sharingを指定し、execute()から Queueable または Batch に処理を委譲します- CRON 定数と、利便性のための
scheduleDaily()ヘルパーを用意します
DTO/ラッパー
- テンプレート:
assets/dto.cls - 純粋なデータコンテナーなので、共有キーワードは不要です
- シンプルな public プロパティ、引数なしコンストラクターと引数付きコンストラクターを用意します。順序付けが必要な場合は
Comparableを実装します - シリアライズ/デシリアライズされる private/protected の内部 DTO には
@JsonAccessを使用します
ユーティリティ
- テンプレート:
assets/utility.cls - 共有キーワードは不要です。すべてのメソッドを
public staticにし、コンストラクターはprivateにします - 純粋で副作用のない処理にし、SOQL/DML は使用しません
インターフェース
- テンプレート:
assets/interface.cls - 各メソッドシグネチャに ApexDoc を付け、明確な契約を定義します
抽象クラス
- テンプレート:
assets/abstract.cls with sharingを指定し、virtualメソッドでデフォルトの動作を提供します- 拡張ポイントには
protected virtualまたはprotected abstractを指定します - ApexDoc に、クラスの拡張方法を示す具体例を含めます
カスタム例外
- テンプレート:
assets/exception.cls - 共有キーワードは不要です。説明的な名前で
Exceptionを拡張します - サポートするコンストラクター:
(),('msg'),(cause),('msg', cause)
トリガー
- テンプレート:
assets/trigger.cls - オブジェクトごとにトリガーを 1 つだけ作成し、すべてのロジックをハンドラー/TAF アクションクラスに委譲します
- 関連するすべての DML コンテキストを含めます。TAF を使用する場合は
new MetadataTriggerHandler().run();とします
トリガーアクション(TAF)
- コンテキストごとに、関心事 1 つにつきクラスを 1 つ作成し、
TriggerAction.{Context}を実装します Trigger_Action__mdtを使用して登録します(登録されていないアクションは無効です)- 名前:
TA_{SObject}_{ActionName}。再帰の制御には、static boolean よりフィールド値の比較を優先します
呼び出し可能メソッド(@InvocableMethod)
- テンプレート:
assets/invocable.cls with sharingを指定し、内部に@InvocableVariableを持つRequest/Responseを定義します- メソッドは
public staticでなければなりません。static でないメソッドや単一オブジェクトのシグネチャはコンパイルできません List<Request>を受け取り、List<Response>を返します。バルク化し、SOQL/DML をループの外で実行します- デコレーターのパラメーター:
label(必須 — Flow Builder での表示名)、description、category(Builder でアクションをグループ化)、callout=true(メソッドが HTTP コールアウトを行う場合に必須) @InvocableVariableのパラメーター:label(必須)、description、required=true/false@InvocableVariableがサポートする型:プリミティブ型、Id、SObject、List<T>のみ(Map/Set/Blobは不可)。Flow のコレクション入出力にはList<Id>またはList<SObject>のフィールドを使用します- Response には必ず
isSuccess、errorMessage、errorType(e.getTypeName())を含めます - エラーは Response で返すことを推奨します。例外をスローすると Flow の Fault パスが実行されるため、回復不能なエラーの場合に限って使用します
REST リソース(@RestResource)
- テンプレート:
assets/rest-resource.cls global with sharingを指定し、クラスとメソッドの両方をglobalにします- バージョン付き URL:
@RestResource(urlMapping='/{resource}/v1/*') - 分岐ごとに適切な HTTP ステータスコード(
200/201/400/404/422/500)を使用します。すべてのエラーをデフォルトで500にしないでください - 入力を検証します(Id 形式:
Pattern.matches('[a-zA-Z0-9]{15,18}', value))。SOQL ではすべてのユーザー入力をバインドします - クエリには
LIMIT/ORDER BYを含め、ページネーション(pageSize/offset)を実装します - 標準化された
ApiResponseラッパー(success、message、data/records)と、内部のリクエスト/レスポンス DTO を使用します - コントローラーは薄く保ち、ビジネスロジックを Service クラスに委譲します
@AuraEnabled コントローラー
with sharingを指定し、すべての SOQL でWITH USER_MODEを使用します- 読み取り専用のクエリに限り
@AuraEnabled(cacheable=true)を使用します。DML 操作ではcacheableを設定しません - 例外を捕捉し、ユーザーにわかりやすいメッセージを付けた
AuraHandledExceptionとして再スローします
出力の想定
クラスごとの成果物:
{ClassName}.cls{ClassName}.cls-meta.xml(指定がない場合、デフォルトの API バージョンは66.0以上){ClassName}Test.cls(generating-apex-testスキルで生成){ClassName}Test.cls-meta.xml(generating-apex-testスキルで生成)
トリガーごとの成果物:
{TriggerName}.trigger{TriggerName}.trigger-meta.xml(指定がない場合、デフォルトの API バージョンは66.0以上)
メタ XML テンプレート:
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>{API_VERSION}</apiVersion>
<status>Active</status>
</ApexClass>
次の順序で報告してください:
Apex work: <summary>
Files: <paths>
Design: <pattern / framework choices>
Workflow: all steps completed (1-8); any N/A justified
Risks: <security, bulkification, async, dependency notes>
Analyzer: <REQUIRED -- paste actual run_code_analyzer output or state "run_code_analyzer=unavailable: <reason>">
Testing: <REQUIRED -- paste actual test execution results (pass/fail, coverage) or state "test_execution=unavailable: <reason>">
Deploy: <dry-run or next step>
スキル間の連携
| 必要な作業 | 委任先 |
|---|---|
| Apex テスト/失敗の修正 | generating-apex-test スキル |
| オブジェクト/項目の説明 | メタデータスキル(利用可能な場合) |
| 組織へのデプロイ | デプロイスキル(利用可能な場合) |
| Apex を呼び出す Flow | Flow スキル(利用可能な場合) |
| Apex を呼び出す LWC | LWC スキル(利用可能な場合) |
トラブルシューティングの範囲
このスキルが対応するのは、本番環境の .cls/.trigger/.apex の問題のみです。コンパイル/解析の失敗、デプロイ時の依存関係エラー、実行時のガバナ制限エラーが対象です。テストの実行、アサーション、カバレッジ、または sf apex run test の失敗については、generating-apex-test に委任してください。