sf-industry-commoncore-callable-apex

Salesforce Industries Common Core (OmniStudio/Vlocity) Apex callable generation and review with 120-point scoring. TRIGGER when: user creates or reviews System.Callable classes, migrates `VlocityOpenInterface` / `VlocityOpenInterface2`, or builds Industries callable extensions used by OmniStudio, In

By jaganpro · 950 installs

npx skills add jaganpro/sf-skills --skill sf-industry-commoncore-callable-apex

Source repository · Upstream listing

sf industry commoncore callable apex: Callable Apex for Salesforce Industries Common Core Specialist for Salesforce Industries Common Core callable Apex implementations. Produce secure, deterministic, and configurable Apex that cleanly integrates with OmniStudio and Industries extension points. Core Responsibilities 1. Callable Generation : Build System.Callable classes with safe action dispatch 2. Callable Review : Audit existing callable implementations for correctness and risks 3. Validation & Scoring : Evaluate against the 120 point rubric 4. Industries Fit : Ensure compatibility with OmniStudio/Industries extension points Workflow (4 Phase Pattern) Phase 1: Requirements Gathering Ask for: Entry point (OmniScript, Integration Procedure, DataRaptor, or other Industries hook) Action names (strings passed into call ) Input/output contract (required keys, types, and response shape) Data access needs (objects/fields, CRUD/FLS rules) Side effects (DML, callouts, async requirements) Then: 1. Scan for existing callable classes: Glob: / Callable .cls 2. Identify shared utilities or base classes used for Industries extensions 3. Create a task list Phase 2: Design & Contract Definition Define the callable contract : Action list (explicit, versioned strings) Input schema (required keys + types) Output schema (consistent response envelope) Recommended response envelope : Action dispatch rules : Use switch on action Default case throws a typed exception No dynamic method invocation or reflection VlocityOpenInterface / VlocityOpenInterface2 contract mapping : When designing for legacy Open Interface extensions (or dual Callable + Open Interface support), map the signature: Parameter Role Callable equivalent methodName Action selector (same semantics as action ) action in call(action, args) inputMap Primary input data (required keys, types) args.get('inputMap') outputMap Mutable map where results are written (out by reference) Return value; Callable returns envelope instead options Additional context (parent DataRaptor/OmniScript context, invocation metadata) args.get('options') Design rules for Open Interface contracts: Treat inputMap and options as the combined input schema Define what keys must be written to outputMap per action (success and error cases) Preserve methodName strings so they align with Callable action strings Document whether options is required, optional, or unused for each action Phase 3: Implementation Pattern Vanilla System.Callable (flat args, no Open Interface coupling): Use the vanilla pattern when callers pass flat args and no VlocityOpenInterface integration is required. Callable skeleton (same inputs as VlocityOpenInterface): Use inputMap and options keys in args when integrating with Open Interface or when callers pass that structure: Input format : Callers pass args as { 'inputMap' = Map<String, Object , 'options' = Map<String, Object } . For backward compatibility with flat callers, if args lacks 'inputMap' , treat args itself as inputMap and use an empty map for options . Implementation rules : 1. Keep call() thin; delegate to private methods or service classes 2. Validate and coerce input types early (null safe) 3. Enforce CRUD/FLS and sharing ( with sharing , Security.stripInaccessible() ) 4. Bulkify when args include record collections 5. Use WITH USER MODE for SOQL when appropriate VlocityOpenInterface / VlocityOpenInterface2 implementation : When implementing omnistudio.VlocityOpenInterface or omnistudio.VlocityOpenInterface2 , use the signature: Open Interface skeleton: Open Interface implementation rules: Write results into outputMap via putAll() or individual put() calls; do not return the envelope from invokeMethod Return true for success, false for unsupported or failed actions Use the same internal private methods as the Callable (same inputMap and options parameters); only the entry point differs Populate outputMap with the same envelope shape ( success , data , errors ) for consistency Both Callable and Open Interface accept the same inputs ( inputMap , options ) and delegate to identical private method signatures for shared logic. Phase 4: Testing & Validation Minimum tests: Positive : Supported action executes successfully Negative : Unsupported action throws expected exception Contract : Missing/invalid inputs return error envelope Bulk : Handles list inputs without hitting limits Example test class : Migration: VlocityOpenInterface to System.Callable When modernizing Industries extensions, move VlocityOpenInterface or VlocityOpenInterface2 implementations to System.Callable and keep the action contract stable. Use the Salesforce guidance as the source of truth. [Salesforce Help](https://help.salesforce.com/s/articleView?id=ind.v dev t callable implementations 651821.htm&type=5) Guidance : Preserve action names ( methodName ) as action strings in call() Pass inputMap and options as keys in args : { 'inputMap' = inputMap, 'options' = options } Return a consistent response envelope instead of mutating outMap Keep call() thin; delegate to the same internal methods with (inputMap, options) signature Add tests for each action and unsupported action Example migration (pattern) : Best Practices (120 Point Scoring) Category Points Key Rules Contract & Dispatch 20 Explicit action list; switch on ; versioned action strings Input Validation 20 Required keys validated; types coerced safely; null guards Security 20 with sharing ; CRUD/FLS checks; Security.stripInaccessible() Error Handling 15 Typed exceptions; consistent error envelope; no empty catch Bulkification & Limits 20 No SOQL/DML in loops; supports list inputs Testing 15 Positive/negative/contract/bulk tests Documentation 10 ApexDoc for class and action methods Thresholds : ✅ 90+ (Ready) ⚠️ 70 89 (Review) ❌ <70 (Block) ⛔ Guardrails (Mandatory) Stop and ask the user if any of these would be introduced: Dynamic method execution based on user input (no reflection) SOQL/DML inside loops without sharing on callable classes Silent failures (empty catch, swallowed exceptions) Inconsistent response shapes across actions Common Anti Patterns call() contains business logic instead of delegating Action names are unversioned or not documented Input maps assumed to have keys without checks Mixed response types (sometimes Map, sometimes String) No tests for unsupported actions Cross Skill Integration Skill When to Use Example sf apex General Apex work beyond callable implementations "Create trigger for Account" sf metadata Verify object/field availability before coding "Describe Product2" sf deploy Validate/deploy callable classes "Deploy to sandbox" Reference Skill Use the core Apex standards, testing patterns, and guardrails in: [skills/sf apex/SKILL.md](../sf apex/SKILL.md) Bundled Examples [examples/Test QuoteByProductCallable/](examples/Test QuoteByProductCallable/) — read only query example with WITH USER MODE [examples/Test VlocityOpenInterfaceConversion/](examples/Test VlocityOpenInterfaceConversion/) — migration from legacy VlocityOpenInterface [examples/Test VlocityOpenInterface2Conversion/](examples/Test VlocityOpenInterface2Conversion/) — migration from VlocityOpenInterface2 Notes Prefer deterministic, side effect aware callable actions Keep action contracts stable; introduce new actions for breaking changes Avoid long running work in synchronous callables; use async when needed