@raishin/vanguard-frontier-agentic 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +31 -1
- package/.cursor-plugin/plugin.json +31 -1
- package/.github/plugin/marketplace.json +1 -1
- package/README.md +15 -12
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/AGENT.md +1 -1
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/claude-code.agent.md +1 -1
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/copilot.agent.md +1 -1
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/cursor.agent.md +1 -1
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/gemini.agent.md +1 -1
- package/agents/dotnet/dotnet-aspnetcore-api-review-agent/harnesses/kiro-ide.agent.md +1 -1
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/AGENT.md +2 -2
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/claude-code.agent.md +2 -2
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/copilot.agent.md +2 -2
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/cursor.agent.md +2 -2
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/gemini.agent.md +2 -2
- package/agents/dotnet/dotnet-csharp-runtime-review-agent/harnesses/kiro-ide.agent.md +2 -2
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/AGENT.md +3 -3
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/claude-code.agent.md +3 -3
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/copilot.agent.md +3 -3
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/cursor.agent.md +3 -3
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/gemini.agent.md +3 -3
- package/agents/dotnet/dotnet-efcore-data-access-review-agent/harnesses/kiro-ide.agent.md +3 -3
- package/agents/hetzner/README.md +1 -1
- package/agents/oci/oci-devops-container-platform-engineer-agent/AGENT.md +1 -1
- package/agents/oci/oci-exadata-platform-architect-agent/AGENT.md +1 -1
- package/agents/oci/oci-multi-cloud-architect-agent/AGENT.md +1 -1
- package/agents/prometheus/README.md +1 -1
- package/agents/qa/playwright-e2e-suite-review-agent/AGENT.md +3 -3
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/claude-code.agent.md +3 -3
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/copilot.agent.md +3 -3
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/cursor.agent.md +3 -3
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/gemini.agent.md +3 -3
- package/agents/qa/playwright-e2e-suite-review-agent/harnesses/kiro-ide.agent.md +3 -3
- package/agents/salesforce/AGENTS.md +31 -0
- package/agents/salesforce/README.md +135 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/AGENT.md +117 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/LEAST-PRIVILEGES.md +91 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/harnesses/claude-code.agent.md +69 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/harnesses/codex.toml +30 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/harnesses/copilot.agent.md +69 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/harnesses/cursor.agent.md +69 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/harnesses/gemini.agent.md +69 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/harnesses/kiro-ide.agent.md +69 -0
- package/agents/salesforce/salesforce-adaptive-access-agent/metadata.json +30 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/AGENT.md +126 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/LEAST-PRIVILEGES.md +92 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/harnesses/claude-code.agent.md +81 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/harnesses/codex.toml +36 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/harnesses/copilot.agent.md +81 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/harnesses/cursor.agent.md +81 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/harnesses/gemini.agent.md +81 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/harnesses/kiro-ide.agent.md +49 -0
- package/agents/salesforce/salesforce-agentforce-ai-agent/metadata.json +41 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/AGENT.md +119 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/LEAST-PRIVILEGES.md +81 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/harnesses/claude-code.agent.md +75 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/harnesses/copilot.agent.md +75 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/harnesses/cursor.agent.md +75 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/harnesses/gemini.agent.md +75 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/harnesses/kiro-ide.agent.md +45 -0
- package/agents/salesforce/salesforce-analytics-tableau-agent/metadata.json +41 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/AGENT.md +112 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/LEAST-PRIVILEGES.md +86 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/harnesses/claude-code.agent.md +50 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/harnesses/copilot.agent.md +50 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/harnesses/cursor.agent.md +50 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/harnesses/gemini.agent.md +50 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/harnesses/kiro-ide.agent.md +50 -0
- package/agents/salesforce/salesforce-app-builder-automation-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-business-analyst-agent/AGENT.md +110 -0
- package/agents/salesforce/salesforce-business-analyst-agent/LEAST-PRIVILEGES.md +89 -0
- package/agents/salesforce/salesforce-business-analyst-agent/harnesses/claude-code.agent.md +48 -0
- package/agents/salesforce/salesforce-business-analyst-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-business-analyst-agent/harnesses/copilot.agent.md +48 -0
- package/agents/salesforce/salesforce-business-analyst-agent/harnesses/cursor.agent.md +48 -0
- package/agents/salesforce/salesforce-business-analyst-agent/harnesses/gemini.agent.md +48 -0
- package/agents/salesforce/salesforce-business-analyst-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-business-analyst-agent/harnesses/kiro-ide.agent.md +48 -0
- package/agents/salesforce/salesforce-business-analyst-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/AGENT.md +112 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/LEAST-PRIVILEGES.md +81 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/harnesses/claude-code.agent.md +66 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/harnesses/codex.toml +30 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/harnesses/copilot.agent.md +66 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/harnesses/cursor.agent.md +66 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/harnesses/gemini.agent.md +66 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/harnesses/kiro-ide.agent.md +66 -0
- package/agents/salesforce/salesforce-certificate-lifecycle-agent/metadata.json +30 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/AGENT.md +121 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/LEAST-PRIVILEGES.md +87 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/harnesses/claude-code.agent.md +74 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/harnesses/codex.toml +30 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/harnesses/copilot.agent.md +74 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/harnesses/cursor.agent.md +74 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/harnesses/gemini.agent.md +74 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/harnesses/kiro-ide.agent.md +74 -0
- package/agents/salesforce/salesforce-change-impact-analyst-agent/metadata.json +30 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/AGENT.md +119 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/LEAST-PRIVILEGES.md +88 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/harnesses/claude-code.agent.md +67 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/harnesses/codex.toml +30 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/harnesses/copilot.agent.md +67 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/harnesses/cursor.agent.md +67 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/harnesses/gemini.agent.md +67 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/harnesses/kiro-ide.agent.md +67 -0
- package/agents/salesforce/salesforce-code-analyzer-orchestrator-agent/metadata.json +31 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/AGENT.md +130 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/LEAST-PRIVILEGES.md +85 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/harnesses/claude-code.agent.md +84 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/harnesses/codex.toml +36 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/harnesses/copilot.agent.md +84 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/harnesses/cursor.agent.md +84 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/harnesses/gemini.agent.md +84 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/harnesses/kiro-ide.agent.md +49 -0
- package/agents/salesforce/salesforce-compliance-privacy-agent/metadata.json +41 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/AGENT.md +113 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/LEAST-PRIVILEGES.md +90 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/harnesses/claude-code.agent.md +64 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/harnesses/codex.toml +30 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/harnesses/copilot.agent.md +64 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/harnesses/cursor.agent.md +64 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/harnesses/gemini.agent.md +64 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/harnesses/kiro-ide.agent.md +64 -0
- package/agents/salesforce/salesforce-continuous-verification-agent/metadata.json +31 -0
- package/agents/salesforce/salesforce-data-architecture-agent/AGENT.md +113 -0
- package/agents/salesforce/salesforce-data-architecture-agent/LEAST-PRIVILEGES.md +92 -0
- package/agents/salesforce/salesforce-data-architecture-agent/harnesses/claude-code.agent.md +49 -0
- package/agents/salesforce/salesforce-data-architecture-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-data-architecture-agent/harnesses/copilot.agent.md +49 -0
- package/agents/salesforce/salesforce-data-architecture-agent/harnesses/cursor.agent.md +49 -0
- package/agents/salesforce/salesforce-data-architecture-agent/harnesses/gemini.agent.md +49 -0
- package/agents/salesforce/salesforce-data-architecture-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-data-architecture-agent/harnesses/kiro-ide.agent.md +49 -0
- package/agents/salesforce/salesforce-data-architecture-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-development-agent/AGENT.md +114 -0
- package/agents/salesforce/salesforce-development-agent/LEAST-PRIVILEGES.md +89 -0
- package/agents/salesforce/salesforce-development-agent/harnesses/claude-code.agent.md +50 -0
- package/agents/salesforce/salesforce-development-agent/harnesses/codex.toml +36 -0
- package/agents/salesforce/salesforce-development-agent/harnesses/copilot.agent.md +50 -0
- package/agents/salesforce/salesforce-development-agent/harnesses/cursor.agent.md +50 -0
- package/agents/salesforce/salesforce-development-agent/harnesses/gemini.agent.md +50 -0
- package/agents/salesforce/salesforce-development-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-development-agent/harnesses/kiro-ide.agent.md +50 -0
- package/agents/salesforce/salesforce-development-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-devops-release-agent/AGENT.md +115 -0
- package/agents/salesforce/salesforce-devops-release-agent/LEAST-PRIVILEGES.md +90 -0
- package/agents/salesforce/salesforce-devops-release-agent/harnesses/claude-code.agent.md +51 -0
- package/agents/salesforce/salesforce-devops-release-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-devops-release-agent/harnesses/copilot.agent.md +51 -0
- package/agents/salesforce/salesforce-devops-release-agent/harnesses/cursor.agent.md +51 -0
- package/agents/salesforce/salesforce-devops-release-agent/harnesses/gemini.agent.md +51 -0
- package/agents/salesforce/salesforce-devops-release-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-devops-release-agent/harnesses/kiro-ide.agent.md +51 -0
- package/agents/salesforce/salesforce-devops-release-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/AGENT.md +128 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/LEAST-PRIVILEGES.md +92 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/harnesses/claude-code.agent.md +81 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/harnesses/codex.toml +36 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/harnesses/copilot.agent.md +81 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/harnesses/cursor.agent.md +81 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/harnesses/gemini.agent.md +81 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/harnesses/kiro-ide.agent.md +49 -0
- package/agents/salesforce/salesforce-enterprise-architect-agent/metadata.json +41 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/AGENT.md +124 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/LEAST-PRIVILEGES.md +80 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/harnesses/claude-code.agent.md +79 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/harnesses/copilot.agent.md +79 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/harnesses/cursor.agent.md +79 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/harnesses/gemini.agent.md +79 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/harnesses/kiro-ide.agent.md +59 -0
- package/agents/salesforce/salesforce-experience-cloud-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/AGENT.md +113 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/LEAST-PRIVILEGES.md +80 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/harnesses/claude-code.agent.md +72 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/harnesses/codex.toml +28 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/harnesses/copilot.agent.md +72 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/harnesses/cursor.agent.md +72 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/harnesses/gemini.agent.md +72 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/harnesses/kiro-ide.agent.md +72 -0
- package/agents/salesforce/salesforce-hyperforce-security-agent/metadata.json +30 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/AGENT.md +125 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/LEAST-PRIVILEGES.md +88 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/harnesses/claude-code.agent.md +80 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/harnesses/codex.toml +41 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/harnesses/copilot.agent.md +80 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/harnesses/cursor.agent.md +80 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/harnesses/gemini.agent.md +80 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/harnesses/kiro-ide.agent.md +48 -0
- package/agents/salesforce/salesforce-industry-cloud-agent/metadata.json +42 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/AGENT.md +115 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/LEAST-PRIVILEGES.md +91 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/harnesses/claude-code.agent.md +50 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/harnesses/copilot.agent.md +50 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/harnesses/cursor.agent.md +50 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/harnesses/gemini.agent.md +50 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/harnesses/kiro-ide.agent.md +50 -0
- package/agents/salesforce/salesforce-integration-mulesoft-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-live-guard-agent/AGENT.md +126 -0
- package/agents/salesforce/salesforce-live-guard-agent/LEAST-PRIVILEGES.md +100 -0
- package/agents/salesforce/salesforce-live-guard-agent/harnesses/claude-code.agent.md +85 -0
- package/agents/salesforce/salesforce-live-guard-agent/harnesses/codex.toml +50 -0
- package/agents/salesforce/salesforce-live-guard-agent/harnesses/copilot.agent.md +85 -0
- package/agents/salesforce/salesforce-live-guard-agent/harnesses/cursor.agent.md +85 -0
- package/agents/salesforce/salesforce-live-guard-agent/harnesses/gemini.agent.md +85 -0
- package/agents/salesforce/salesforce-live-guard-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-live-guard-agent/harnesses/kiro-ide.agent.md +58 -0
- package/agents/salesforce/salesforce-live-guard-agent/metadata.json +39 -0
- package/agents/salesforce/salesforce-maestro-agent/AGENT.md +77 -0
- package/agents/salesforce/salesforce-maestro-agent/LEAST-PRIVILEGES.md +93 -0
- package/agents/salesforce/salesforce-maestro-agent/README.md +593 -0
- package/agents/salesforce/salesforce-maestro-agent/harnesses/claude-code.agent.md +65 -0
- package/agents/salesforce/salesforce-maestro-agent/harnesses/codex.toml +66 -0
- package/agents/salesforce/salesforce-maestro-agent/harnesses/copilot.agent.md +65 -0
- package/agents/salesforce/salesforce-maestro-agent/harnesses/cursor.agent.md +65 -0
- package/agents/salesforce/salesforce-maestro-agent/harnesses/gemini.agent.md +65 -0
- package/agents/salesforce/salesforce-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-maestro-agent/harnesses/kiro-ide.agent.md +65 -0
- package/agents/salesforce/salesforce-maestro-agent/metadata.json +38 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/AGENT.md +124 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/LEAST-PRIVILEGES.md +86 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/harnesses/claude-code.agent.md +78 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/harnesses/codex.toml +34 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/harnesses/copilot.agent.md +78 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/harnesses/cursor.agent.md +78 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/harnesses/gemini.agent.md +78 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/harnesses/kiro-ide.agent.md +48 -0
- package/agents/salesforce/salesforce-marketing-cloud-agent/metadata.json +41 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/AGENT.md +113 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/LEAST-PRIVILEGES.md +87 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/harnesses/claude-code.agent.md +72 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/harnesses/codex.toml +28 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/harnesses/copilot.agent.md +72 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/harnesses/cursor.agent.md +72 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/harnesses/gemini.agent.md +72 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/harnesses/kiro-ide.agent.md +72 -0
- package/agents/salesforce/salesforce-network-policy-architect-agent/metadata.json +31 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/AGENT.md +113 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/LEAST-PRIVILEGES.md +88 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/harnesses/claude-code.agent.md +49 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/harnesses/codex.toml +36 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/harnesses/copilot.agent.md +49 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/harnesses/cursor.agent.md +49 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/harnesses/gemini.agent.md +49 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/harnesses/kiro-ide.agent.md +49 -0
- package/agents/salesforce/salesforce-platform-admin-review-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/AGENT.md +115 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/LEAST-PRIVILEGES.md +83 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/harnesses/claude-code.agent.md +50 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/harnesses/copilot.agent.md +50 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/harnesses/cursor.agent.md +50 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/harnesses/gemini.agent.md +50 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/harnesses/kiro-ide.agent.md +50 -0
- package/agents/salesforce/salesforce-sales-cloud-revenue-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/AGENT.md +120 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/LEAST-PRIVILEGES.md +80 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/harnesses/claude-code.agent.md +72 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/harnesses/codex.toml +30 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/harnesses/copilot.agent.md +72 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/harnesses/cursor.agent.md +72 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/harnesses/gemini.agent.md +72 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/harnesses/kiro-ide.agent.md +72 -0
- package/agents/salesforce/salesforce-sandbox-governance-agent/metadata.json +30 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/AGENT.md +113 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/LEAST-PRIVILEGES.md +90 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/harnesses/claude-code.agent.md +71 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/harnesses/codex.toml +28 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/harnesses/copilot.agent.md +71 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/harnesses/cursor.agent.md +71 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/harnesses/gemini.agent.md +71 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/harnesses/kiro-ide.agent.md +71 -0
- package/agents/salesforce/salesforce-sandbox-isolation-agent/metadata.json +30 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/AGENT.md +118 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/LEAST-PRIVILEGES.md +85 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/harnesses/claude-code.agent.md +52 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/harnesses/codex.toml +36 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/harnesses/copilot.agent.md +52 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/harnesses/cursor.agent.md +52 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/harnesses/gemini.agent.md +52 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/harnesses/kiro-ide.agent.md +52 -0
- package/agents/salesforce/salesforce-security-identity-access-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-service-field-service-agent/AGENT.md +115 -0
- package/agents/salesforce/salesforce-service-field-service-agent/LEAST-PRIVILEGES.md +82 -0
- package/agents/salesforce/salesforce-service-field-service-agent/harnesses/claude-code.agent.md +50 -0
- package/agents/salesforce/salesforce-service-field-service-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-service-field-service-agent/harnesses/copilot.agent.md +50 -0
- package/agents/salesforce/salesforce-service-field-service-agent/harnesses/cursor.agent.md +50 -0
- package/agents/salesforce/salesforce-service-field-service-agent/harnesses/gemini.agent.md +50 -0
- package/agents/salesforce/salesforce-service-field-service-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-service-field-service-agent/harnesses/kiro-ide.agent.md +50 -0
- package/agents/salesforce/salesforce-service-field-service-agent/metadata.json +40 -0
- package/agents/salesforce/salesforce-session-governance-agent/AGENT.md +116 -0
- package/agents/salesforce/salesforce-session-governance-agent/LEAST-PRIVILEGES.md +91 -0
- package/agents/salesforce/salesforce-session-governance-agent/harnesses/claude-code.agent.md +74 -0
- package/agents/salesforce/salesforce-session-governance-agent/harnesses/codex.toml +28 -0
- package/agents/salesforce/salesforce-session-governance-agent/harnesses/copilot.agent.md +74 -0
- package/agents/salesforce/salesforce-session-governance-agent/harnesses/cursor.agent.md +74 -0
- package/agents/salesforce/salesforce-session-governance-agent/harnesses/gemini.agent.md +74 -0
- package/agents/salesforce/salesforce-session-governance-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-session-governance-agent/harnesses/kiro-ide.agent.md +74 -0
- package/agents/salesforce/salesforce-session-governance-agent/metadata.json +30 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/AGENT.md +123 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/LEAST-PRIVILEGES.md +86 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/harnesses/claude-code.agent.md +79 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/harnesses/codex.toml +35 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/harnesses/copilot.agent.md +79 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/harnesses/cursor.agent.md +79 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/harnesses/gemini.agent.md +79 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/harnesses/kiro-ide.agent.md +48 -0
- package/agents/salesforce/salesforce-slack-collaboration-agent/metadata.json +41 -0
- package/assets/logos/cloud/salesforce/salesforce.svg +34 -0
- package/catalog/agents.json +1451 -283
- package/catalog/asset-integrity.json +2152 -327
- package/catalog/install-roles.json +68 -0
- package/catalog/skill-manifest.json +1040 -155
- package/catalog/skills.json +1242 -262
- package/package.json +3 -2
- package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
- package/powers/vanguard-salesforce/POWER.md +42 -0
- package/schemas/agent.schema.json +2 -1
- package/schemas/skill.frontmatter.schema.json +33 -3
- package/schemas/skill.schema.json +2 -1
- package/scripts/export-marketplace-agents.mjs +17 -1
- package/scripts/generate-kiro-powers.mjs +12 -0
- package/scripts/release-prepare.mjs +35 -0
- package/skills/aws/aws-agentcore/references/official-sources.md +19 -19
- package/skills/aws/aws-generative-ai-developer/references/official-sources.md +10 -10
- package/skills/azure/azure-ai-foundry-ops-governor/references/workflow-and-output.md +2 -2
- package/skills/azure/azure-aks-platform-operator/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-app-service-production-readiness/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-cosmosdb-application-developer/references/official-sources.md +11 -11
- package/skills/azure/azure-cosmosdb-performance-investigator/references/official-sources.md +11 -11
- package/skills/azure/azure-cosmosdb-platform-operator/references/official-sources.md +10 -10
- package/skills/azure/azure-cost-estimation-review/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-cost-optimization-governor/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-entra-id-specialist/references/official-sources.md +28 -28
- package/skills/azure/azure-identity-governance-review/references/official-sources.md +11 -11
- package/skills/azure/azure-identity-governance-review/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-key-vault-secret-lifecycle-auditor/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-migrate-landing-zone-cutover/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-platform-automation-devops/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-private-endpoint-adoption-planner/references/workflow-and-output.md +1 -1
- package/skills/azure/azure-resource-health-incident-triage/references/workflow-and-output.md +6 -6
- package/skills/azure/azure-subscription-resource-organization/references/workflow-and-output.md +1 -1
- package/skills/cross-functional/salesforce-case-capsule/SKILL.md +164 -0
- package/skills/cross-functional/salesforce-case-capsule/metadata.json +19 -0
- package/skills/cross-functional/salesforce-data-exposure-escalation-protocol/SKILL.md +165 -0
- package/skills/cross-functional/salesforce-data-exposure-escalation-protocol/metadata.json +19 -0
- package/skills/cross-functional/salesforce-live-change-approval-protocol/SKILL.md +118 -0
- package/skills/cross-functional/salesforce-live-change-approval-protocol/metadata.json +19 -0
- package/skills/cross-functional/salesforce-risk-taxonomy/SKILL.md +162 -0
- package/skills/cross-functional/salesforce-risk-taxonomy/metadata.json +19 -0
- package/skills/cross-functional/salesforce-routing-protocol/SKILL.md +159 -0
- package/skills/cross-functional/salesforce-routing-protocol/metadata.json +19 -0
- package/skills/dotnet/dotnet-aspnetcore-api-review/SKILL.md +1 -1
- package/skills/dotnet/dotnet-aspnetcore-api-review/references/workflow-and-output.md +2 -2
- package/skills/dotnet/dotnet-csharp-runtime-review/SKILL.md +2 -2
- package/skills/dotnet/dotnet-csharp-runtime-review/references/workflow-and-output.md +7 -7
- package/skills/dotnet/dotnet-efcore-data-access-review/SKILL.md +4 -4
- package/skills/dotnet/dotnet-efcore-data-access-review/references/workflow-and-output.md +3 -3
- package/skills/dotnet/dotnet-performance-aot-review/references/workflow-and-output.md +1 -1
- package/skills/dotnet/dotnet-testing-quality-review/SKILL.md +1 -1
- package/skills/dotnet/dotnet-testing-quality-review/references/workflow-and-output.md +2 -2
- package/skills/finops/focus-spec-normalizer/references/focus-columns.md +2 -2
- package/skills/gcp/gcp-alloydb-ai-developer/SKILL.md +1 -1
- package/skills/gcp/gcp-gemini-api-developer/SKILL.md +2 -2
- package/skills/nvidia/nvidia-model-promotion-gatekeeper/SKILL.md +1 -1
- package/skills/nvidia/nvidia-model-promotion-gatekeeper/references/allowlist-commands.md +1 -1
- package/skills/oci/oci-compute-platform-operator/SKILL.md +0 -2
- package/skills/oci/oci-cost-finops-analyst/SKILL.md +0 -2
- package/skills/oci/oci-database-platform-dba/SKILL.md +0 -2
- package/skills/oci/oci-devops-container-platform-engineer/SKILL.md +0 -2
- package/skills/oci/oci-identity-access-governor/SKILL.md +0 -2
- package/skills/oci/oci-multi-cloud-architect/SKILL.md +0 -2
- package/skills/oci/oci-network-architect/SKILL.md +0 -2
- package/skills/oci/oci-observability-incident-responder/SKILL.md +0 -2
- package/skills/oci/oci-security-compliance-reviewer/SKILL.md +0 -2
- package/skills/oci/oci-solution-architect/SKILL.md +1 -3
- package/skills/oci/oci-storage-backup-steward/SKILL.md +0 -2
- package/skills/prometheus/prometheus-alerting-cardinality-review/SKILL.md +1 -1
- package/skills/prometheus/prometheus-alerting-cardinality-review/references/workflow-and-output.md +4 -4
- package/skills/qa/ci-test-pipeline-review/references/workflow-and-output.md +1 -1
- package/skills/qa/llm-ai-pipeline-test-review/references/workflow-and-output.md +1 -1
- package/skills/qa/playwright-e2e-suite-review/SKILL.md +4 -4
- package/skills/qa/playwright-e2e-suite-review/references/workflow-and-output.md +12 -12
- package/skills/qa/plc-control-logic-safety-review/references/workflow-and-output.md +2 -2
- package/skills/qa/test-coverage-quality-review/SKILL.md +1 -1
- package/skills/qa/test-coverage-quality-review/references/workflow-and-output.md +8 -8
- package/skills/qa/test-flakiness-triage/SKILL.md +1 -1
- package/skills/qa/test-flakiness-triage/references/workflow-and-output.md +1 -1
- package/skills/salesforce/README.md +117 -0
- package/skills/salesforce/salesforce-agentforce-risk-review-skill/SKILL.md +206 -0
- package/skills/salesforce/salesforce-agentforce-risk-review-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-agentforce-risk-review-skill/references/action-safety-matrix.md +160 -0
- package/skills/salesforce/salesforce-agentforce-risk-review-skill/references/agentforce-anti-patterns.md +193 -0
- package/skills/salesforce/salesforce-agentforce-risk-review-skill/references/grounding-source-evaluation.md +162 -0
- package/skills/salesforce/salesforce-agentforce-stdm-observer-skill/SKILL.md +557 -0
- package/skills/salesforce/salesforce-agentforce-stdm-observer-skill/metadata.json +41 -0
- package/skills/salesforce/salesforce-agentforce-stdm-observer-skill/references/observability-rubric.md +219 -0
- package/skills/salesforce/salesforce-agentforce-stdm-observer-skill/references/privacy-redaction.md +240 -0
- package/skills/salesforce/salesforce-agentforce-stdm-observer-skill/references/stdm-queries.md +436 -0
- package/skills/salesforce/salesforce-apex-generator-skill/SKILL.md +307 -0
- package/skills/salesforce/salesforce-apex-generator-skill/metadata.json +30 -0
- package/skills/salesforce/salesforce-apex-generator-skill/references/apex-patterns.md +224 -0
- package/skills/salesforce/salesforce-apex-generator-skill/references/governor-limits.md +175 -0
- package/skills/salesforce/salesforce-apex-generator-skill/references/security-defaults.md +155 -0
- package/skills/salesforce/salesforce-apex-log-analyzer-skill/SKILL.md +360 -0
- package/skills/salesforce/salesforce-apex-log-analyzer-skill/metadata.json +38 -0
- package/skills/salesforce/salesforce-apex-log-analyzer-skill/references/governor-limit-signatures.md +174 -0
- package/skills/salesforce/salesforce-apex-log-analyzer-skill/references/log-format-reference.md +154 -0
- package/skills/salesforce/salesforce-apex-log-analyzer-skill/references/redaction-rules.md +178 -0
- package/skills/salesforce/salesforce-apex-lwc-code-review-skill/SKILL.md +195 -0
- package/skills/salesforce/salesforce-apex-lwc-code-review-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-apex-lwc-code-review-skill/references/apex-anti-patterns.md +270 -0
- package/skills/salesforce/salesforce-apex-lwc-code-review-skill/references/governor-limits-reference.md +198 -0
- package/skills/salesforce/salesforce-apex-lwc-code-review-skill/references/lwc-security.md +206 -0
- package/skills/salesforce/salesforce-apex-test-generator-skill/SKILL.md +274 -0
- package/skills/salesforce/salesforce-apex-test-generator-skill/metadata.json +29 -0
- package/skills/salesforce/salesforce-apex-test-generator-skill/references/assertion-patterns.md +174 -0
- package/skills/salesforce/salesforce-apex-test-generator-skill/references/async-testing.md +217 -0
- package/skills/salesforce/salesforce-apex-test-generator-skill/references/test-data-factory.md +174 -0
- package/skills/salesforce/salesforce-apex-test-runner-skill/SKILL.md +344 -0
- package/skills/salesforce/salesforce-apex-test-runner-skill/metadata.json +37 -0
- package/skills/salesforce/salesforce-apex-test-runner-skill/references/cli-commands.md +162 -0
- package/skills/salesforce/salesforce-apex-test-runner-skill/references/coverage-analysis.md +107 -0
- package/skills/salesforce/salesforce-apex-test-runner-skill/references/failure-diagnosis.md +187 -0
- package/skills/salesforce/salesforce-bulk-data-ops-skill/SKILL.md +356 -0
- package/skills/salesforce/salesforce-bulk-data-ops-skill/metadata.json +29 -0
- package/skills/salesforce/salesforce-bulk-data-ops-skill/references/anonymous-apex-patterns.md +380 -0
- package/skills/salesforce/salesforce-bulk-data-ops-skill/references/data-loader-templates.md +209 -0
- package/skills/salesforce/salesforce-bulk-data-ops-skill/references/rollback-strategy.md +209 -0
- package/skills/salesforce/salesforce-deployment-validator-skill/SKILL.md +380 -0
- package/skills/salesforce/salesforce-deployment-validator-skill/metadata.json +37 -0
- package/skills/salesforce/salesforce-deployment-validator-skill/references/cli-commands.md +264 -0
- package/skills/salesforce/salesforce-deployment-validator-skill/references/production-refusal-rules.md +243 -0
- package/skills/salesforce/salesforce-deployment-validator-skill/references/test-selection-strategy.md +250 -0
- package/skills/salesforce/salesforce-devsecops-pipeline-skill/SKILL.md +195 -0
- package/skills/salesforce/salesforce-devsecops-pipeline-skill/metadata.json +19 -0
- package/skills/salesforce/salesforce-devsecops-pipeline-skill/references/change-impact-categories.md +216 -0
- package/skills/salesforce/salesforce-devsecops-pipeline-skill/references/sandbox-masking-strategy.md +193 -0
- package/skills/salesforce/salesforce-devsecops-pipeline-skill/references/sca-rule-catalog.md +226 -0
- package/skills/salesforce/salesforce-field-mapping-skill/SKILL.md +348 -0
- package/skills/salesforce/salesforce-field-mapping-skill/metadata.json +29 -0
- package/skills/salesforce/salesforce-field-mapping-skill/references/api-name-normalization.md +141 -0
- package/skills/salesforce/salesforce-field-mapping-skill/references/picklist-value-mapping.md +245 -0
- package/skills/salesforce/salesforce-field-mapping-skill/references/type-mismatch-detection.md +187 -0
- package/skills/salesforce/salesforce-flow-automation-review-skill/SKILL.md +163 -0
- package/skills/salesforce/salesforce-flow-automation-review-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-flow-automation-review-skill/references/automation-conflict-matrix.md +193 -0
- package/skills/salesforce/salesforce-flow-automation-review-skill/references/fault-path-design.md +189 -0
- package/skills/salesforce/salesforce-flow-automation-review-skill/references/flow-anti-patterns.md +211 -0
- package/skills/salesforce/salesforce-flow-debugger-skill/SKILL.md +355 -0
- package/skills/salesforce/salesforce-flow-debugger-skill/metadata.json +35 -0
- package/skills/salesforce/salesforce-flow-debugger-skill/references/fault-path-design.md +175 -0
- package/skills/salesforce/salesforce-flow-debugger-skill/references/flow-error-patterns.md +247 -0
- package/skills/salesforce/salesforce-flow-debugger-skill/references/interview-log-redaction.md +171 -0
- package/skills/salesforce/salesforce-infrastructure-audit-skill/SKILL.md +137 -0
- package/skills/salesforce/salesforce-infrastructure-audit-skill/metadata.json +19 -0
- package/skills/salesforce/salesforce-infrastructure-audit-skill/references/hyperforce-deployment-controls.md +181 -0
- package/skills/salesforce/salesforce-infrastructure-audit-skill/references/network-policy-reference.md +200 -0
- package/skills/salesforce/salesforce-infrastructure-audit-skill/references/session-policy-reference.md +219 -0
- package/skills/salesforce/salesforce-integration-review-skill/SKILL.md +186 -0
- package/skills/salesforce/salesforce-integration-review-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-integration-review-skill/references/integration-anti-patterns.md +280 -0
- package/skills/salesforce/salesforce-integration-review-skill/references/integration-pattern-reference.md +239 -0
- package/skills/salesforce/salesforce-integration-review-skill/references/named-credential-design.md +211 -0
- package/skills/salesforce/salesforce-marketing-consent-review-skill/SKILL.md +204 -0
- package/skills/salesforce/salesforce-marketing-consent-review-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-marketing-consent-review-skill/references/consent-anti-patterns.md +247 -0
- package/skills/salesforce/salesforce-marketing-consent-review-skill/references/consent-model-reference.md +205 -0
- package/skills/salesforce/salesforce-marketing-consent-review-skill/references/regulatory-mapping.md +192 -0
- package/skills/salesforce/salesforce-metadata-fetcher-skill/SKILL.md +418 -0
- package/skills/salesforce/salesforce-metadata-fetcher-skill/metadata.json +50 -0
- package/skills/salesforce/salesforce-metadata-fetcher-skill/references/cli-commands.md +347 -0
- package/skills/salesforce/salesforce-metadata-fetcher-skill/references/delegation-routing.md +416 -0
- package/skills/salesforce/salesforce-metadata-fetcher-skill/references/sanitization-rules.md +392 -0
- package/skills/salesforce/salesforce-metadata-review-skill/SKILL.md +148 -0
- package/skills/salesforce/salesforce-metadata-review-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-metadata-review-skill/references/deprecated-metadata.md +217 -0
- package/skills/salesforce/salesforce-metadata-review-skill/references/field-hygiene-rules.md +182 -0
- package/skills/salesforce/salesforce-metadata-review-skill/references/object-design-patterns.md +187 -0
- package/skills/salesforce/salesforce-org-assessment-skill/SKILL.md +137 -0
- package/skills/salesforce/salesforce-org-assessment-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-org-assessment-skill/references/assessment-rubric.md +228 -0
- package/skills/salesforce/salesforce-org-assessment-skill/references/risk-register-template.md +211 -0
- package/skills/salesforce/salesforce-org-assessment-skill/references/tech-debt-indicators.md +252 -0
- package/skills/salesforce/salesforce-permission-model-review-skill/SKILL.md +165 -0
- package/skills/salesforce/salesforce-permission-model-review-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-permission-model-review-skill/references/fls-review-patterns.md +235 -0
- package/skills/salesforce/salesforce-permission-model-review-skill/references/permission-set-strategy.md +203 -0
- package/skills/salesforce/salesforce-permission-model-review-skill/references/toxic-combinations.md +228 -0
- package/skills/salesforce/salesforce-release-readiness-skill/SKILL.md +185 -0
- package/skills/salesforce/salesforce-release-readiness-skill/metadata.json +18 -0
- package/skills/salesforce/salesforce-release-readiness-skill/references/release-checklist.md +191 -0
- package/skills/salesforce/salesforce-release-readiness-skill/references/rollback-strategy.md +234 -0
- package/skills/salesforce/salesforce-release-readiness-skill/references/test-coverage-strategy.md +314 -0
- package/skills/salesforce/salesforce-soql-explorer-skill/SKILL.md +391 -0
- package/skills/salesforce/salesforce-soql-explorer-skill/metadata.json +35 -0
- package/skills/salesforce/salesforce-soql-explorer-skill/references/cli-commands.md +266 -0
- package/skills/salesforce/salesforce-soql-explorer-skill/references/least-privilege-scope.md +224 -0
- package/skills/salesforce/salesforce-soql-explorer-skill/references/safe-query-patterns.md +317 -0
- package/skills/salesforce/salesforce-soql-generator-skill/SKILL.md +305 -0
- package/skills/salesforce/salesforce-soql-generator-skill/metadata.json +25 -0
- package/skills/salesforce/salesforce-soql-generator-skill/references/common-patterns.md +293 -0
- package/skills/salesforce/salesforce-soql-generator-skill/references/governor-limits.md +171 -0
- package/skills/salesforce/salesforce-soql-generator-skill/references/soql-syntax-quickref.md +255 -0
- package/skills/salesforce/salesforce-validation-rule-writer-skill/SKILL.md +329 -0
- package/skills/salesforce/salesforce-validation-rule-writer-skill/metadata.json +28 -0
- package/skills/salesforce/salesforce-validation-rule-writer-skill/references/error-message-style.md +132 -0
- package/skills/salesforce/salesforce-validation-rule-writer-skill/references/formula-syntax-quickref.md +182 -0
- package/skills/salesforce/salesforce-validation-rule-writer-skill/references/validation-patterns.md +214 -0
- package/skills/salesforce/salesforce-zero-trust-maturity-skill/SKILL.md +164 -0
- package/skills/salesforce/salesforce-zero-trust-maturity-skill/metadata.json +19 -0
- package/skills/salesforce/salesforce-zero-trust-maturity-skill/references/continuous-verification-patterns.md +209 -0
- package/skills/salesforce/salesforce-zero-trust-maturity-skill/references/maturity-scoring-rubric.md +179 -0
- package/skills/salesforce/salesforce-zero-trust-maturity-skill/references/nist-zta-pillars.md +194 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/001-happy-platform-admin-review.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/002-happy-business-analyst.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/003-happy-app-builder-automation.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/004-happy-development.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/005-happy-devops-release.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/006-happy-security-identity-access.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/007-happy-data-architecture.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/008-happy-integration-mulesoft.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/009-happy-sales-cloud-revenue.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/010-happy-marketing-cloud.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/011-happy-agentforce-ai.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/012-happy-analytics-tableau.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/013-happy-compliance-privacy.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/014-happy-network-policy-architect.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/015-happy-hyperforce-security.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/016-happy-sandbox-isolation.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/017-happy-session-governance.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/018-happy-continuous-verification.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/019-happy-certificate-lifecycle.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/020-happy-adaptive-access.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/021-happy-code-analyzer-orchestrator.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/022-happy-sandbox-governance.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/023-happy-change-impact-analyst.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/adv-liveguard-01-live-org-deploy-guard.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/adv-liveguard-02-live-mass-delete-guard.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/adv-liveguard-03-live-release-to-prod-guard.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/001-happy-platform-admin-review.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/002-happy-business-analyst.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/003-happy-app-builder-automation.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/004-happy-development.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/005-happy-devops-release.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/006-happy-security-identity-access.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/007-happy-data-architecture.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/008-happy-integration-mulesoft.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/009-happy-sales-cloud-revenue.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/010-happy-marketing-cloud.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/011-happy-agentforce-ai.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/012-happy-analytics-tableau.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/013-happy-compliance-privacy.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/014-happy-network-policy-architect.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/015-happy-hyperforce-security.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/016-happy-sandbox-isolation.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/017-happy-session-governance.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/018-happy-continuous-verification.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/019-happy-certificate-lifecycle.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/020-happy-adaptive-access.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/021-happy-code-analyzer-orchestrator.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/022-happy-sandbox-governance.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/023-happy-change-impact-analyst.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/adv-liveguard-01-live-org-deploy-guard.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/adv-liveguard-02-live-mass-delete-guard.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/adv-liveguard-03-live-release-to-prod-guard.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/salesforce-maestro-routing/taxonomy.json +371 -0
- package/tests/test-vfa-export-coverage.test.mjs +8 -4
- package/tests/validate-catalog.py +12 -1
- package/tests/validate-plugin-manifest.py +11 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# LWC Security Reference
|
|
2
|
+
|
|
3
|
+
Security vulnerabilities specific to Lightning Web Components and the
|
|
4
|
+
Lightning Platform security model.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. XSS in Lightning Web Components
|
|
9
|
+
|
|
10
|
+
### Lightning Locker and LWS
|
|
11
|
+
|
|
12
|
+
Lightning Web Security (LWS)
|
|
13
|
+
replaced Lightning Locker as the
|
|
14
|
+
default security model for LWC. LWS provides DOM isolation via a JavaScript
|
|
15
|
+
membrane rather than a full sandbox iframe.
|
|
16
|
+
|
|
17
|
+
Key properties:
|
|
18
|
+
- Third-party scripts that manipulate `window` or `document` directly may break
|
|
19
|
+
under LWS — this is by design.
|
|
20
|
+
- `eval`, `new Function`, and dynamic script injection are blocked.
|
|
21
|
+
- Cross-namespace DOM access is restricted.
|
|
22
|
+
|
|
23
|
+
### XSS Risk: `innerHTML` Assignment
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
// VULNERABLE: setting innerHTML from user-supplied data
|
|
27
|
+
this.template.querySelector('.content').innerHTML = this.userInput;
|
|
28
|
+
|
|
29
|
+
// SAFE: use textContent for text-only content
|
|
30
|
+
this.template.querySelector('.content').textContent = this.userInput;
|
|
31
|
+
|
|
32
|
+
// SAFE: use lwc:dom="manual" only when HTML structure is needed
|
|
33
|
+
// and sanitize with DOMPurify (self-hosted) before assignment
|
|
34
|
+
import DOMPurify from 'c/domPurify'; // if available in your org
|
|
35
|
+
const clean = DOMPurify.sanitize(this.userInput, { ALLOWED_TAGS: ['b', 'i', 'em'] });
|
|
36
|
+
this.template.querySelector('.content').innerHTML = clean;
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### `lwc:dom="manual"` Risks
|
|
40
|
+
|
|
41
|
+
Using `lwc:dom="manual"` opts an element out of LWC's rendering pipeline and
|
|
42
|
+
puts DOM management responsibility on the developer.
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<!-- Requires careful handling -->
|
|
46
|
+
<div lwc:dom="manual" class="rich-content"></div>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Rules when using `lwc:dom="manual"`:
|
|
50
|
+
- Never assign `element.innerHTML = userControlledString` without sanitization.
|
|
51
|
+
- Sanitize all content before insertion.
|
|
52
|
+
- Remove event listeners when component is disconnected to prevent memory leaks.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 2. SOQL Injection in LWC (via Apex)
|
|
57
|
+
|
|
58
|
+
LWC does not execute SOQL directly. The risk is when user input from an LWC
|
|
59
|
+
is passed to an Apex method that concatenates it into a SOQL string.
|
|
60
|
+
|
|
61
|
+
### Vulnerable Pattern
|
|
62
|
+
```apex
|
|
63
|
+
@AuraEnabled
|
|
64
|
+
public static List<Account> searchAccounts(String searchTerm) {
|
|
65
|
+
// VULNERABLE: SOQL injection via string concatenation
|
|
66
|
+
String query = 'SELECT Id, Name FROM Account WHERE Name LIKE \'%' + searchTerm + '%\'';
|
|
67
|
+
return Database.query(query);
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Adversarial input: `%' OR OwnerId != NULL OR Name LIKE '%`
|
|
72
|
+
This returns all accounts regardless of filter intent.
|
|
73
|
+
|
|
74
|
+
### Secure Pattern
|
|
75
|
+
```apex
|
|
76
|
+
@AuraEnabled
|
|
77
|
+
public static List<Account> searchAccounts(String searchTerm) {
|
|
78
|
+
// SAFE: bind variable prevents injection
|
|
79
|
+
String searchPattern = '%' + String.escapeSingleQuotes(searchTerm) + '%';
|
|
80
|
+
return [SELECT Id, Name FROM Account WHERE Name LIKE :searchPattern WITH SECURITY_ENFORCED LIMIT 100];
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Additional hardening:
|
|
85
|
+
- `String.escapeSingleQuotes` on any dynamic string used in SOQL.
|
|
86
|
+
- Use bind variables (`:variable`) rather than concatenation.
|
|
87
|
+
- `WITH SECURITY_ENFORCED` enforces FLS and object-level security at query time.
|
|
88
|
+
- `WITH USER_MODE` (API 57.0+)
|
|
89
|
+
enforces full user-context security
|
|
90
|
+
including sharing rules, FLS, and CRUD.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 3. Field-Level Security Enforcement in LWC Apex
|
|
95
|
+
|
|
96
|
+
### Problem
|
|
97
|
+
`@AuraEnabled` Apex methods with `with sharing` enforce row-level access but
|
|
98
|
+
NOT field-level security. Users can receive field values they lack FLS access
|
|
99
|
+
to if the Apex code does not explicitly check FLS.
|
|
100
|
+
|
|
101
|
+
### Detection
|
|
102
|
+
Review all `@AuraEnabled` methods that return SObjects or field values. Check
|
|
103
|
+
whether field values are stripped before returning.
|
|
104
|
+
|
|
105
|
+
### Solutions
|
|
106
|
+
|
|
107
|
+
**Option A: `WITH SECURITY_ENFORCED` in SOQL**
|
|
108
|
+
```apex
|
|
109
|
+
@AuraEnabled
|
|
110
|
+
public static List<Contact> getContacts {
|
|
111
|
+
// Throws QueryException if FLS blocks any field in SELECT list
|
|
112
|
+
return [SELECT Id, Name, Email, SSN__c FROM Contact WITH SECURITY_ENFORCED LIMIT 50];
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Option B: `Security.stripInaccessible`**
|
|
117
|
+
```apex
|
|
118
|
+
@AuraEnabled
|
|
119
|
+
public static List<Contact> getContacts {
|
|
120
|
+
List<Contact> rawContacts = [SELECT Id, Name, Email, SSN__c FROM Contact LIMIT 50];
|
|
121
|
+
SObjectAccessDecision decision = Security.stripInaccessible(AccessType.READABLE, rawContacts);
|
|
122
|
+
return (List<Contact>) decision.getRecords;
|
|
123
|
+
// SSN__c is automatically stripped if user lacks read FLS
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 4. Cross-Site Request Forgery (CSRF) in LWC
|
|
130
|
+
|
|
131
|
+
Salesforce's platform automatically includes anti-CSRF tokens on Visualforce
|
|
132
|
+
pages but LWC-to-Apex wire/imperative calls use session cookies that are
|
|
133
|
+
same-site by default.
|
|
134
|
+
|
|
135
|
+
**Risk areas:**
|
|
136
|
+
- Custom REST endpoints (`@RestResource`) called by LWC via `fetch`.
|
|
137
|
+
- Aura endpoints exposed to unauthenticated access.
|
|
138
|
+
|
|
139
|
+
**Mitigation:**
|
|
140
|
+
- For custom REST endpoints called from LWC, verify the `Origin` header server-side.
|
|
141
|
+
- Set `Samesite=Strict` or `Samesite=Lax` on session cookies (configured in
|
|
142
|
+
Setup > Session Settings
|
|
143
|
+
).
|
|
144
|
+
- Do not expose `@AuraEnabled(cacheable=false)` methods to unauthenticated sites
|
|
145
|
+
without additional CSRF protection.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 5. Secure Wire Adapter Usage
|
|
150
|
+
|
|
151
|
+
The `@wire` decorator fetches data reactively. Misuse can cause excessive data
|
|
152
|
+
exposure or SOQL limit exhaustion.
|
|
153
|
+
|
|
154
|
+
```javascript
|
|
155
|
+
// SAFE: wire with specific ID, not open-ended query
|
|
156
|
+
import { LightningElement, wire, api } from 'lwc';
|
|
157
|
+
import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
|
|
158
|
+
import NAME_FIELD from '@salesforce/schema/Account.Name';
|
|
159
|
+
|
|
160
|
+
export default class AccountDetail extends LightningElement {
|
|
161
|
+
@api recordId;
|
|
162
|
+
|
|
163
|
+
@wire(getRecord, { recordId: '$recordId', fields: [NAME_FIELD] })
|
|
164
|
+
account;
|
|
165
|
+
|
|
166
|
+
get name {
|
|
167
|
+
return getFieldValue(this.account.data, NAME_FIELD);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**Anti-patterns with @wire:**
|
|
173
|
+
- Using `@wire` to fetch unbounded lists (no LIMIT or filter) — use Apex with
|
|
174
|
+
server-side pagination instead.
|
|
175
|
+
- Passing `recordId` from URL parameters directly to a wire without validating
|
|
176
|
+
the ID format (18-character Salesforce ID: `[a-zA-Z0-9]{18}`).
|
|
177
|
+
- Exposing a wire result directly in the template without null checks.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 6. Content Security Policy Compliance
|
|
182
|
+
|
|
183
|
+
Experience Cloud sites
|
|
184
|
+
and Embedded Service can apply CSP.
|
|
185
|
+
LWC components must comply:
|
|
186
|
+
|
|
187
|
+
- Do not load scripts from external CDNs inline; use Static Resources.
|
|
188
|
+
- Do not use `eval` or `setTimeout(string)`.
|
|
189
|
+
- If using third-party libraries, host them in Static Resources and declare
|
|
190
|
+
their origin in CSP Trusted Sites (Setup > CSP Trusted Sites).
|
|
191
|
+
- Images fetched via `fetch` from external sources require the domain listed
|
|
192
|
+
in CSP `img-src`.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## LWC Security Review Checklist
|
|
197
|
+
|
|
198
|
+
- [ ] No `innerHTML` assignment from user-controlled data without sanitization.
|
|
199
|
+
- [ ] No dynamic SOQL string concatenation in Apex methods called from LWC.
|
|
200
|
+
- [ ] All `@AuraEnabled` methods use `with sharing`.
|
|
201
|
+
- [ ] FLS is enforced via `WITH SECURITY_ENFORCED` or `Security.stripInaccessible`.
|
|
202
|
+
- [ ] No hardcoded Salesforce IDs in component JavaScript.
|
|
203
|
+
- [ ] `lwc:dom="manual"` usage documented and reviewed for XSS.
|
|
204
|
+
- [ ] External scripts hosted as Static Resources, not loaded from CDN inline.
|
|
205
|
+
- [ ] API responses from custom REST endpoints checked for CSRF exposure.
|
|
206
|
+
- [ ] Wire adapters include error handling (`account.error` checked alongside `account.data`).
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: salesforce-apex-test-generator-skill
|
|
3
|
+
description: "Generates Apex test classes with TestDataFactory patterns, Assert class usage, bulkification (200+ records), positive/negative/bulk test method separation, async test patterns (Test.startTest/stopTest), and proper @TestSetup usage. T0 static generation — no org connection required. TRIGGER when: user asks to write Apex test classes, create @isTest code, generate test setup data, scaffold test coverage for a class, or add a test class for a .cls file. Trigger phrases: write apex tests, test class for, @isTest class, test setup data, generate test coverage. DO NOT TRIGGER when: user wants to execute tests against a live org (use salesforce-apex-test-runner-skill), generating production Apex logic (use salesforce-apex-generator-skill), debugging test failures from log output (use salesforce-apex-log-analyzer-skill)."
|
|
4
|
+
license: MIT
|
|
5
|
+
allowed-tools: Read Grep Glob
|
|
6
|
+
metadata:
|
|
7
|
+
author: "github: Raishin"
|
|
8
|
+
version: "0.1.0"
|
|
9
|
+
updated: "2026-05-21"
|
|
10
|
+
category: generation
|
|
11
|
+
lifecycle: experimental
|
|
12
|
+
execution_tier: static-review
|
|
13
|
+
mcp_servers: []
|
|
14
|
+
oauth_scopes: []
|
|
15
|
+
run_as_permissions:
|
|
16
|
+
required: []
|
|
17
|
+
denied: []
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# salesforce-apex-test-generator-skill
|
|
21
|
+
|
|
22
|
+
T0 static code generation for Apex test classes. This skill authors test coverage
|
|
23
|
+
that is **bulkified, assertion-rich, and factory-patterned** — the three qualities
|
|
24
|
+
most often missing from hand-rolled Apex tests. No org connection required.
|
|
25
|
+
|
|
26
|
+
## When This Skill Owns the Task
|
|
27
|
+
|
|
28
|
+
Use `salesforce-apex-test-generator-skill` when the work requires **authoring new test classes**:
|
|
29
|
+
|
|
30
|
+
- "Write tests for the AccountService class"
|
|
31
|
+
- "Generate a @isTest class for my Queueable job"
|
|
32
|
+
- "Create test setup data using TestDataFactory"
|
|
33
|
+
- "Add positive, negative, and bulk test methods for OrderTriggerHandler"
|
|
34
|
+
- "Scaffold an @TestSetup method for the Contact selector tests"
|
|
35
|
+
- "Write async test patterns for my batch class"
|
|
36
|
+
|
|
37
|
+
**Delegate elsewhere when:**
|
|
38
|
+
|
|
39
|
+
| Situation | Skill to use |
|
|
40
|
+
|---|---|
|
|
41
|
+
| User wants to run the tests against a live org | `salesforce-apex-test-runner-skill` |
|
|
42
|
+
| User needs the production Apex class authored first | `salesforce-apex-generator-skill` |
|
|
43
|
+
| User is analyzing a test failure from logs | `salesforce-apex-log-analyzer-skill` |
|
|
44
|
+
| User needs to deploy validated code | `salesforce-deployment-validator-skill` |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Required Context to Gather First
|
|
49
|
+
|
|
50
|
+
Before generating, confirm:
|
|
51
|
+
|
|
52
|
+
1. **Class under test** — the production Apex class name and its purpose
|
|
53
|
+
2. **Class type** — service, selector, domain, batch, queueable, schedulable, invocable, REST resource, trigger
|
|
54
|
+
3. **SObjects involved** — what objects the production class creates, reads, or updates
|
|
55
|
+
4. **TestDataFactory availability** — does the project already have a TestDataFactory class?
|
|
56
|
+
If yes, use it. If no, scaffold a minimal factory or factory pattern.
|
|
57
|
+
5. **Key behaviors to test** — what are the main positive paths, exception paths, and
|
|
58
|
+
governor-limit edge cases?
|
|
59
|
+
6. **API version** — default `62.0` minimum
|
|
60
|
+
|
|
61
|
+
If the user provides the production class source, read it to infer what test scenarios
|
|
62
|
+
are needed. If not, ask for the class name and its purpose.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Recommended Workflow
|
|
67
|
+
|
|
68
|
+
### Step 1 — Read the production class (if available)
|
|
69
|
+
|
|
70
|
+
Use `Read` or `Grep` to locate the class under test. Identify:
|
|
71
|
+
- Public methods that need coverage
|
|
72
|
+
- Exception paths (try/catch blocks, explicit throws)
|
|
73
|
+
- DML operations that need TestDataFactory data
|
|
74
|
+
- Async paths (Queueable, Batch, Schedulable enqueue/execute calls)
|
|
75
|
+
- callout paths (HTTP callout mocks needed?)
|
|
76
|
+
|
|
77
|
+
### Step 2 — Design test structure
|
|
78
|
+
|
|
79
|
+
Map each method to test scenarios using the three-path model:
|
|
80
|
+
|
|
81
|
+
| Path | What to test |
|
|
82
|
+
|---|---|
|
|
83
|
+
| **Positive** | Happy path with valid data; asserts on expected outcome |
|
|
84
|
+
| **Negative** | Invalid input, missing required data, exception thrown; asserts on expected error |
|
|
85
|
+
| **Bulk** | 200+ record insert/update/delete; asserts governor-limit safety |
|
|
86
|
+
|
|
87
|
+
### Step 3 — Plan TestDataFactory usage
|
|
88
|
+
|
|
89
|
+
Consult `references/test-data-factory.md`. If a project factory exists, extend it.
|
|
90
|
+
If not, scaffold factory methods as static helpers in the test class or a companion
|
|
91
|
+
`TestDataFactory` class.
|
|
92
|
+
|
|
93
|
+
### Step 4 — Author the test class
|
|
94
|
+
|
|
95
|
+
Follow all hard-stop constraints (see Rules section). Generate:
|
|
96
|
+
- `@isTest` class declaration with `private` access
|
|
97
|
+
- `@TestSetup` for shared data (when multiple methods need the same records)
|
|
98
|
+
- Separate `@isTest` methods for each positive, negative, and bulk scenario
|
|
99
|
+
- `Test.startTest` / `Test.stopTest` wrapping all async enqueue or execute calls
|
|
100
|
+
- `Assert` class usage throughout (never bare `System.assert`)
|
|
101
|
+
- No `SeeAllData=true` unless explicitly required by an external tool pattern
|
|
102
|
+
|
|
103
|
+
### Step 5 — Generate metadata XML
|
|
104
|
+
|
|
105
|
+
Produce `{ClassName}Test.cls-meta.xml` with correct `apiVersion` and `status: Active`.
|
|
106
|
+
|
|
107
|
+
### Step 6 — Score against the quality rubric
|
|
108
|
+
|
|
109
|
+
Run the 100-point rubric (see below). If score is below 80, revise before presenting.
|
|
110
|
+
|
|
111
|
+
### Step 7 — Recommend test runner pairing
|
|
112
|
+
|
|
113
|
+
Always end with an explicit recommendation to execute the tests using
|
|
114
|
+
`salesforce-apex-test-runner-skill`, noting the test class name and expected coverage.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Rules
|
|
119
|
+
|
|
120
|
+
### Hard-Stop Constraints (Must Enforce)
|
|
121
|
+
|
|
122
|
+
| Constraint | Rationale |
|
|
123
|
+
|---|---|
|
|
124
|
+
| Never use `@isTest(SeeAllData=true)` unless testing external tools that require live data | Test isolation; prevents reliance on org-specific state |
|
|
125
|
+
| Every test method must have at least one `Assert` statement | Tests without assertions give false confidence |
|
|
126
|
+
| Bulk test methods must use 200+ records | Triggers process in batches of 200; 201 records crosses the boundary |
|
|
127
|
+
| Use `Assert` class methods (`Assert.areEqual`, `Assert.isTrue`, etc.) not bare `System.assert` | Produces meaningful failure messages; follows Apex best practices |
|
|
128
|
+
| Use `Test.startTest` / `Test.stopTest` around all async enqueue or execute calls | Flushes async queue; required for governor-limit isolation in tests |
|
|
129
|
+
| All DML in test setup must use `insert` not `Database.insert` unless testing saveResults | Clarity; reserve `Database.insert` for tests specifically checking partial success |
|
|
130
|
+
| Do not hardcode record Ids in test assertions | Ids vary by org; use the returned record.Id |
|
|
131
|
+
| Separate positive, negative, and bulk methods — do not combine in one method | Maintainability and clarity of failure attribution |
|
|
132
|
+
|
|
133
|
+
### Naming Conventions
|
|
134
|
+
|
|
135
|
+
| Element | Pattern | Example |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| Test class | `{ProductionClass}Test` | `AccountServiceTest` |
|
|
138
|
+
| Positive test | `test{Method}Success` or `test{Scenario}` | `testGetAccountByOwnerSuccess` |
|
|
139
|
+
| Negative test | `test{Method}ThrowsWhenInvalid` or `test{Scenario}Error` | `testGetAccountByOwnerThrowsWhenNullId` |
|
|
140
|
+
| Bulk test | `test{Method}Bulk` or `test{Scenario}Bulk` | `testGetAccountByOwnerBulk` |
|
|
141
|
+
| @TestSetup | `setup` (conventional) | `static void setup` |
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Quality Scoring Rubric (100-point)
|
|
146
|
+
|
|
147
|
+
Score the test class before presenting. Threshold: 80+ pass, 60–79 caveat, below 60 revise.
|
|
148
|
+
|
|
149
|
+
| Dimension | Points | What earns full marks |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| **Bulkification** | 25 | At least one bulk test method with 200+ records; asserts on all bulk records not just first |
|
|
152
|
+
| **Positive/negative/bulk coverage** | 25 | All three paths present and distinct; each method has a clear purpose |
|
|
153
|
+
| **TestDataFactory used** | 15 | Factory methods used or scaffolded; no inline SObject construction scattered across methods |
|
|
154
|
+
| **Assert class used** | 15 | `Assert.areEqual`, `Assert.isTrue`, `Assert.isNotNull` used throughout; no bare `System.assert(condition)` |
|
|
155
|
+
| **Governor-limit aware** | 10 | `Test.startTest` / `Test.stopTest` wraps async paths; no unnecessary SOQL in each test method |
|
|
156
|
+
| **No SeeAllData** | 10 | `@isTest(SeeAllData=true)` is absent unless explicitly justified with a comment |
|
|
157
|
+
|
|
158
|
+
**Scoring penalties:**
|
|
159
|
+
- Missing bulk test: -20
|
|
160
|
+
- Bare `System.assert` without message: -10 per occurrence (max -20)
|
|
161
|
+
- `SeeAllData=true` without justification: -15
|
|
162
|
+
- No `Test.startTest` on async path: -10
|
|
163
|
+
- Assertions only on first record in bulk test: -10
|
|
164
|
+
- Missing `@TestSetup` when multiple methods share data setup: -5
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## T0 Contract
|
|
169
|
+
|
|
170
|
+
This skill operates exclusively at T0 — static generation only.
|
|
171
|
+
|
|
172
|
+
- **No org connection:** No `sf` CLI calls, no MCP tool calls, no live execution.
|
|
173
|
+
- **No OAuth required:** Zero-scope, zero-credential, zero-network.
|
|
174
|
+
- **Output is draft code:** All generated test classes are starting points for review.
|
|
175
|
+
Coverage percentages are estimated, not measured. Use `salesforce-apex-test-runner-skill`
|
|
176
|
+
for actual execution and coverage measurement.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Refusal Triggers
|
|
181
|
+
|
|
182
|
+
Stop and do not generate if:
|
|
183
|
+
|
|
184
|
+
- The user requests `SeeAllData=true` for a standard use case — explain the isolation risk
|
|
185
|
+
and generate test-isolated factory data instead. Only emit `SeeAllData=true` if the user
|
|
186
|
+
provides a documented reason (e.g., testing a legacy package that requires live data).
|
|
187
|
+
- The user requests test methods that assert on hardcoded record Ids — explain the org-portability
|
|
188
|
+
risk and generate assertions using returned record Ids instead.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Output Format
|
|
193
|
+
|
|
194
|
+
```yaml
|
|
195
|
+
verdict: "pass | caveat | reject"
|
|
196
|
+
quality_score: <0-100>
|
|
197
|
+
quality_notes: "<scoring rationale>"
|
|
198
|
+
|
|
199
|
+
generated_files:
|
|
200
|
+
- path: "{ClassName}Test.cls"
|
|
201
|
+
content: |
|
|
202
|
+
<apex test code>
|
|
203
|
+
- path: "{ClassName}Test.cls-meta.xml"
|
|
204
|
+
content: |
|
|
205
|
+
<meta xml>
|
|
206
|
+
|
|
207
|
+
test_scenarios_covered:
|
|
208
|
+
positive: ["<method name: scenario description>"]
|
|
209
|
+
negative: ["<method name: scenario description>"]
|
|
210
|
+
bulk: ["<method name: scenario description>"]
|
|
211
|
+
|
|
212
|
+
factory_approach: "existing-factory | scaffolded-factory | inline-helpers"
|
|
213
|
+
factory_notes: "<what factory methods were used or created>"
|
|
214
|
+
|
|
215
|
+
estimated_coverage_areas:
|
|
216
|
+
- "<class/method: coverage area>"
|
|
217
|
+
|
|
218
|
+
async_patterns_used: ["Test.startTest/stopTest", "callout mock", "schedulable mock"]
|
|
219
|
+
|
|
220
|
+
runner_recommendation:
|
|
221
|
+
companion_skill: "salesforce-apex-test-runner-skill"
|
|
222
|
+
test_class: "{ClassName}Test"
|
|
223
|
+
expected_coverage_target: ">=75%"
|
|
224
|
+
|
|
225
|
+
assumptions:
|
|
226
|
+
- "<list of assumptions made>"
|
|
227
|
+
|
|
228
|
+
missing_context:
|
|
229
|
+
- "<what the user should provide to improve coverage>"
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Handoff Rules
|
|
235
|
+
|
|
236
|
+
| Output | Hand off to |
|
|
237
|
+
|---|---|
|
|
238
|
+
| Generated test class ready for execution | `salesforce-apex-test-runner-skill` (T1) |
|
|
239
|
+
| Production class still needed | `salesforce-apex-generator-skill` |
|
|
240
|
+
| Test failures need log analysis | `salesforce-apex-log-analyzer-skill` |
|
|
241
|
+
| Ready for sandbox deploy | `salesforce-deployment-validator-skill` (T2) |
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Stop Conditions
|
|
246
|
+
|
|
247
|
+
Stop and do not continue if:
|
|
248
|
+
|
|
249
|
+
- The production class under test cannot be located and the user has not provided its
|
|
250
|
+
source or purpose — ask for the class content or a description of its methods.
|
|
251
|
+
- The requested test patterns would require live org data not expressible via factory
|
|
252
|
+
records — explain the limitation and recommend an approach.
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Security Notes
|
|
257
|
+
|
|
258
|
+
- **T0 static generation only:** No org connection, no OAuth, no secrets.
|
|
259
|
+
- **No SeeAllData by default:** Test isolation is enforced. Live org data access in tests
|
|
260
|
+
is a security and reliability anti-pattern.
|
|
261
|
+
- **No credential generation:** Test classes never contain hardcoded credentials, org Ids,
|
|
262
|
+
or session tokens.
|
|
263
|
+
- **Factory data only:** All test data is generated via factory methods in the test class
|
|
264
|
+
or `TestDataFactory`. No reliance on existing org records.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Reference File Index
|
|
269
|
+
|
|
270
|
+
| File | When to read |
|
|
271
|
+
|---|---|
|
|
272
|
+
| `references/test-data-factory.md` | TestDataFactory pattern, builder pattern, field overrides, lazy init, duplicate rule handling |
|
|
273
|
+
| `references/assertion-patterns.md` | Assert class methods, error messages, multi-assert vs single, bulk assertion patterns |
|
|
274
|
+
| `references/async-testing.md` | Test.startTest/stopTest, mocking Schedulable/Batchable, HTTP callout mocks |
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "salesforce-apex-test-generator-skill",
|
|
3
|
+
"name": "Salesforce Apex Test Generator Skill",
|
|
4
|
+
"type": "skill",
|
|
5
|
+
"provider": "salesforce",
|
|
6
|
+
"harnesses": ["claude-code", "codex", "cursor", "gemini", "kiro", "other"],
|
|
7
|
+
"summary": "Generates Apex test classes with TestDataFactory patterns, Assert class usage, bulkification (200+ records), positive/negative/bulk test method separation, async test patterns (Test.startTest/stopTest), and proper @TestSetup usage. T0 static generation — no org connection required. Emits @isTest .cls + .cls-meta.xml with a 100-point quality score. Pairs with salesforce-apex-test-runner-skill for live execution.",
|
|
8
|
+
"source_type": "adapted",
|
|
9
|
+
"source_attribution": "Adapted from forcedotcom/sf-skills generating-apex-test (Apache-2.0). Vanguard-specific additions: T0 tier declaration, 100-point scoring rubric with bulkification gate, Assert class enforcement, SeeAllData refusal policy, and handoff routing model.",
|
|
10
|
+
"category": "generation",
|
|
11
|
+
"execution_tier": "static-review",
|
|
12
|
+
"oauth_scopes": [],
|
|
13
|
+
"mcp_servers": [],
|
|
14
|
+
"run_as_permissions": {},
|
|
15
|
+
"sandbox_only": false,
|
|
16
|
+
"production_allowed": true,
|
|
17
|
+
"official_docs": [
|
|
18
|
+
"https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_testing.htm",
|
|
19
|
+
"https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_testing_testsetup_annotation.htm",
|
|
20
|
+
"https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_testing_assert_class.htm",
|
|
21
|
+
"https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_testing_data_factory.htm",
|
|
22
|
+
"https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_testing_tools_start_stop_test.htm"
|
|
23
|
+
],
|
|
24
|
+
"security_notes": "T0 static generation only. No org connection, no OAuth, no secrets. Generated test classes use SeeAllData=false by default to ensure test isolation. No hardcoded credentials, org IDs, session tokens, or record IDs are generated. All test data created via factory methods. Output is draft code requiring human review before deployment.",
|
|
25
|
+
"last_verified": "2026-05-21",
|
|
26
|
+
"path": "skills/salesforce/salesforce-apex-test-generator-skill",
|
|
27
|
+
"author": "github: Raishin",
|
|
28
|
+
"version": "0.1.0"
|
|
29
|
+
}
|
package/skills/salesforce/salesforce-apex-test-generator-skill/references/assertion-patterns.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# Apex Assertion Patterns Reference
|
|
2
|
+
|
|
3
|
+
Adapted from forcedotcom/sf-skills generating-apex-test references (Apache-2.0).
|
|
4
|
+
|
|
5
|
+
## Assert Class (Apex API v55.0+)
|
|
6
|
+
|
|
7
|
+
Always use the `Assert` class instead of bare `System.assert`. The `Assert` class
|
|
8
|
+
provides meaningful failure messages by default and aligns with modern Apex best practices.
|
|
9
|
+
|
|
10
|
+
## Core Assert Methods
|
|
11
|
+
|
|
12
|
+
```apex
|
|
13
|
+
// Assert equality (most common)
|
|
14
|
+
Assert.areEqual(expected, actual, 'Optional failure message');
|
|
15
|
+
|
|
16
|
+
// Assert inequality
|
|
17
|
+
Assert.areNotEqual(unexpected, actual, 'Optional failure message');
|
|
18
|
+
|
|
19
|
+
// Assert boolean true
|
|
20
|
+
Assert.isTrue(condition, 'Optional failure message');
|
|
21
|
+
|
|
22
|
+
// Assert boolean false
|
|
23
|
+
Assert.isFalse(condition, 'Optional failure message');
|
|
24
|
+
|
|
25
|
+
// Assert not null
|
|
26
|
+
Assert.isNotNull(value, 'Optional failure message');
|
|
27
|
+
|
|
28
|
+
// Assert null
|
|
29
|
+
Assert.isNull(value, 'Optional failure message');
|
|
30
|
+
|
|
31
|
+
// Assert instanceof (type check)
|
|
32
|
+
Assert.isInstanceOfType(obj, MyClass.class, 'Optional failure message');
|
|
33
|
+
|
|
34
|
+
// Explicit failure (use in exception testing)
|
|
35
|
+
Assert.fail('Should have thrown an exception before reaching this line');
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Error Messages
|
|
39
|
+
|
|
40
|
+
Always provide a descriptive failure message. Bare assertions without messages produce
|
|
41
|
+
"Assertion failed" with no context — useless when multiple assertions fail in a test run.
|
|
42
|
+
|
|
43
|
+
```apex
|
|
44
|
+
// BAD — no context on failure
|
|
45
|
+
Assert.areEqual(5, results.size);
|
|
46
|
+
|
|
47
|
+
// GOOD — clear what failed and what was expected
|
|
48
|
+
Assert.areEqual(5, results.size, 'Expected 5 accounts returned for active owners');
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Positive Path Assertions
|
|
52
|
+
|
|
53
|
+
```apex
|
|
54
|
+
@isTest
|
|
55
|
+
static void testGetAccountsByOwner_Success {
|
|
56
|
+
// Arrange
|
|
57
|
+
User owner = TestDataFactory.createUser(true);
|
|
58
|
+
List<Account> accounts = TestDataFactory.createAccounts(3, false);
|
|
59
|
+
for (Account acc : accounts) acc.OwnerId = owner.Id;
|
|
60
|
+
insert accounts;
|
|
61
|
+
|
|
62
|
+
// Act
|
|
63
|
+
Test.startTest;
|
|
64
|
+
List<Account> results = AccountSelector.getAccountsByOwnerId(owner.Id);
|
|
65
|
+
Test.stopTest;
|
|
66
|
+
|
|
67
|
+
// Assert
|
|
68
|
+
Assert.areEqual(3, results.size, 'Expected 3 accounts for owner');
|
|
69
|
+
Assert.areEqual(owner.Id, results[0].OwnerId, 'OwnerId should match');
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Negative Path / Exception Assertions
|
|
74
|
+
|
|
75
|
+
```apex
|
|
76
|
+
@isTest
|
|
77
|
+
static void testGetAccountsByOwner_ThrowsOnNullId {
|
|
78
|
+
// Arrange — no setup needed
|
|
79
|
+
|
|
80
|
+
// Act + Assert
|
|
81
|
+
Test.startTest;
|
|
82
|
+
try {
|
|
83
|
+
AccountSelector.getAccountsByOwnerId(null);
|
|
84
|
+
Assert.fail('Expected IllegalArgumentException for null ownerId');
|
|
85
|
+
} catch (IllegalArgumentException e) {
|
|
86
|
+
Assert.isTrue(
|
|
87
|
+
e.getMessage.contains('ownerId cannot be null'),
|
|
88
|
+
'Exception message should mention ownerId: ' + e.getMessage
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
Test.stopTest;
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Bulk Assertions
|
|
96
|
+
|
|
97
|
+
Do not assert only on the first record. Assert on all records when testing bulk behavior.
|
|
98
|
+
|
|
99
|
+
```apex
|
|
100
|
+
@isTest
|
|
101
|
+
static void testUpdateIndustry_Bulk {
|
|
102
|
+
// Arrange
|
|
103
|
+
List<Account> accounts = TestDataFactory.createAccounts(201, true);
|
|
104
|
+
|
|
105
|
+
// Act
|
|
106
|
+
Test.startTest;
|
|
107
|
+
AccountService.updateIndustry(new Map<Id, Account>(accounts).keySet, 'Finance');
|
|
108
|
+
Test.stopTest;
|
|
109
|
+
|
|
110
|
+
// Assert — check ALL records
|
|
111
|
+
List<Account> updated = [SELECT Industry FROM Account WHERE Id IN :accounts];
|
|
112
|
+
Assert.areEqual(201, updated.size, 'All 201 accounts should be retrieved');
|
|
113
|
+
for (Account acc : updated) {
|
|
114
|
+
Assert.areEqual('Finance', acc.Industry,
|
|
115
|
+
'Industry should be Finance for account: ' + acc.Id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Multi-Assert vs Single Assert
|
|
121
|
+
|
|
122
|
+
Prefer multiple specific assertions over a single compound assertion. Each assertion
|
|
123
|
+
provides independent failure context:
|
|
124
|
+
|
|
125
|
+
```apex
|
|
126
|
+
// BAD — single compound assertion hides which field failed
|
|
127
|
+
Assert.isTrue(acc.Name == 'Acme' && acc.Industry == 'Tech' && acc.Active__c == true);
|
|
128
|
+
|
|
129
|
+
// GOOD — each assertion independently identifiable
|
|
130
|
+
Assert.areEqual('Acme', acc.Name, 'Account Name mismatch');
|
|
131
|
+
Assert.areEqual('Tech', acc.Industry, 'Account Industry mismatch');
|
|
132
|
+
Assert.isTrue(acc.Active__c, 'Account should be active');
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Asserting Exception Types
|
|
136
|
+
|
|
137
|
+
When testing that specific exception types are thrown, assert the type explicitly:
|
|
138
|
+
|
|
139
|
+
```apex
|
|
140
|
+
@isTest
|
|
141
|
+
static void testService_ThrowsCustomException {
|
|
142
|
+
Test.startTest;
|
|
143
|
+
try {
|
|
144
|
+
MyService.processWithInvalidData(null);
|
|
145
|
+
Assert.fail('Expected MyCustomException was not thrown');
|
|
146
|
+
} catch (MyCustomException e) {
|
|
147
|
+
Assert.isTrue(
|
|
148
|
+
e.getMessage.startsWith('Invalid'),
|
|
149
|
+
'Exception message should start with Invalid: ' + e.getMessage
|
|
150
|
+
);
|
|
151
|
+
} catch (Exception e) {
|
|
152
|
+
Assert.fail('Unexpected exception type: ' + e.getTypeName + ': ' + e.getMessage);
|
|
153
|
+
}
|
|
154
|
+
Test.stopTest;
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Deprecated Patterns to Avoid
|
|
159
|
+
|
|
160
|
+
```apex
|
|
161
|
+
// DEPRECATED — use Assert.isTrue instead
|
|
162
|
+
System.assert(condition);
|
|
163
|
+
System.assert(condition, 'message');
|
|
164
|
+
|
|
165
|
+
// DEPRECATED — use Assert.areEqual instead
|
|
166
|
+
System.assertEquals(expected, actual);
|
|
167
|
+
System.assertEquals(expected, actual, 'message');
|
|
168
|
+
|
|
169
|
+
// DEPRECATED — use Assert.areNotEqual instead
|
|
170
|
+
System.assertNotEquals(unexpected, actual);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
These deprecated forms still compile and work but are not the modern Apex testing
|
|
174
|
+
standard. All new test code should use the `Assert` class.
|