ai-agents-development
Build AI agents and knowledge bases for Falcon Foundry apps. TRIGGER when user asks to "create an AI agent", "add a Foundry…
End-to-end testing for Falcon Foundry apps using Playwright and @crowdstrike/foundry-playwright. TRIGGER when user asks to "add e2e tests", "add playwright tests", "write end-to-end tests", "test my app", or mentions "e2e", "playwright", or "end-to-end" in the context of testing
Claude Code
$ npx -y skills add CrowdStrike/foundry-skills --skill e2e-testing --agent claude-code
Codex
$ npx skills add CrowdStrike/foundry-skills --skill e2e-testing -a codex -y
Cursor
$ npx skills add CrowdStrike/foundry-skills --skill e2e-testing -a cursor -y
Gemini CLI
$ npx skills add CrowdStrike/foundry-skills --skill e2e-testing -a gemini-cli -y
GitHub Copilot
$ npx skills add CrowdStrike/foundry-skills --skill e2e-testing -a github-copilot -y
OpenCode
$ npx skills add CrowdStrike/foundry-skills --skill e2e-testing -a opencode -y
Windsurf
$ npx skills add CrowdStrike/foundry-skills --skill e2e-testing -a windsurf -y
name: e2e-testing description: End-to-end testing for Falcon Foundry apps using Playwright and @crowdstrike/foundry-playwright. TRIGGER when user asks to "add e2e tests", "add playwright tests", "write end-to-end tests", "test my app", or mentions "e2e", "playwright", or "end-to-end" in the context of testing a Foundry app. DO NOT TRIGGER during normal app creation, UI development, or function development. This skill is opt-in; not all apps need e2e tests. version: 1.7.1 updated: 2026-11-10 tags: [foundry, e2e, playwright, testing] author: CrowdStrike license: MIT compatibility: Claude Code >=1.0 metadata: category: testing
End-to-end testing for Falcon Foundry apps using [Playwright](https://playwright.dev/) and the [`@crowdstrike/foundry-playwright`](https://github.com/CrowdStrike/foundry-playwright) library.
The library provides authentication, app install/uninstall, page objects, and configuration so each app only writes its app-specific tests.
> **Part of a suite.** If `development-workflow` has not already run, and this is a new app or its first capability, load the `development-workflow` skill first — it owns the CLI prerequisite check, scaffolding order, and manifest coordination.
my-foundry-app/ ├── e2e/ │ ├── .env # Local credentials (git-ignored) │ ├── .env.sample # Template for other developers │ ├── .gitignore │ ├── package.json │ ├── playwright.config.ts │ └── tests/ │ └── foundry.spec.ts ├── manifest.yml └── ...
Node.js LTS is recommended.
{
"name": "playwright-foundry",
"version": "1.0.0",
"scripts": {
"test": "npx playwright test",
"test:ui": "npx playwright test --ui",
"test:debug": "npx playwright test --debug",
"test:verbose": "DEBUG=true npx playwright test --reporter=list"
},
"type": "commonjs",
"devDependencies": {
"@crowdstrike/foundry-playwright": "0.5.6",
"@types/node": "25.6.0"
}
}**Always pin exact versions** — never use `"latest"`, `"^"`, or `"~"`. Check npm for the current version of each package.
The library brings `@playwright/test`, `@dotenvx/dotenvx`, and `otpauth` as transitive dependencies; don't install them separately.
FALCON_USERNAME=your.email@company.com FALCON_PASSWORD=your-password FALCON_AUTH_SECRET=your-totp-secret FALCON_BASE_URL=https://falcon.us-2.crowdstrike.com APP_NAME=your-app-name
**Convention for sample apps:** Set `APP_NAME` to match the manifest `name` field, which should match the repo name (e.g., `foundry-sample-functions-python`). This avoids spaces in names and simplifies CI. This is a convention, not a hard requirement.
import { defineFoundryConfig } from '@crowdstrike/foundry-playwright';
export default defineFoundryConfig();This gives you the standard 4-project pipeline automatically: 1. **setup**: authenticate and save session state 2. **app-install**: install the app via App Catalog 3. **chromium**: run your tests 4. **app-uninstall**: clean up after tests
node_modules/ playwright/.auth/ playwright-report/ test-results/ .env
cd e2e npm install npx playwright install chromium --with-deps npm test
The library provides these page objects:
| Class | Purpose | |-------|---------| | `WorkflowsPage` | Search, open, execute, and verify Falcon Fusion SOAR workflows | | `DetectionExtensionPage` | Navigate to Endpoint Detections, expand extensions, return iframe FrameLocator | | `HostManagementPage` | Navigate to host management, retrieve host IDs | | `AppCatalogPage` | Install, uninstall, and navigate to apps | | `AppBuilderPage` | Disable workflow provisioning before install | | `AppManagerPage` | Find and navigate to apps in App Manager | | `FoundryHomePage` | Navigate to Falcon Foundry home |
Create `src/fixtures.ts` to wire up page objects as Playwright fixtures. **Only import what your tests actually use** — don't define unused fixtures:
import { test as baseTest } from '@playwright/test';
import { DetectionExtensionPage, WorkflowsPage, HostManagementPage } from '@crowdstrike/foundry-playwright';
type FoundryFixtures = {
detectionExtensionPage: DetectionExtensionPage;
workflowsPage: WorkflowsPage;
hostManagementPage: HostManagementPage;
};
export const test = baseTest.extend<FoundryFixtures>({
detectionExtensionPage: async ({ page }, use) => { await use(new DetectionExtensionPage(page)); },
workflowsPage: async ({ page }, use) => { await use(new WorkflowsPage(page)); },
hostManagementPage: async ({ page }, use) => { await use(new HostManagementPage(page)); },
});
export { expect } from '@playwright/test';Playwright fixtures are lazy, so unused ones cost nothing at runtime, but they're dead code. Add fixtures as tests need them.
import { test } from '../src/fixtures';
test.describe.configure({ mode: 'serial' });
test('should execute workflow', async ({ workflowsPage }) => {
test.setTimeout(180000);
await workflowsPage.navigateToWorkflows();
await workflowsPage.executeAndVerifyWorkflow('My Workflow Name');
await workflowsPage.verifyWorkflowExecutionCompleted();
});
test('should execute workflow with input', async ({ workflowsPage, hostManagementPage }) => {
test.setTimeout(180000);
const hostId = await hostManagementPage.getFirstHostId();
if (!hostId) { test.skip(true, 'No hosts available'); return; }
await workflowsPage.navigateToWorkflows();
await workflowsPage.executeAndVerifyWorkflow('Host Details Workflow', {
inputs: { 'Host ID': hostId },
});
await workflowsPage.verifyWorkflowExecutionCompleted();
});`executeAndVerifyWorkflow()` handles search, execution trigger, and initial ve
AI coding assistant skills for building CrowdStrike Falcon Foundry apps. Build Foundry apps from a natural language prompt — API integrations, workflows, UI pages, functions, collections, AI agents, and knowledge bases — all scaffolded with the Foundry CLI
Build AI agents and knowledge bases for Falcon Foundry apps. TRIGGER when user asks to "create an AI agent", "add a Foundry…
Expose external APIs to Falcon Foundry via OpenAPI specs. TRIGGER when user asks to "create an API integration", "adapt an…
Audit an existing Falcon Foundry app for documented anti-patterns and fix the safe ones, like npm audit. TRIGGER when user asks…
Upgrade a Falcon Foundry app that was installed from a template to a newer version of that template, in place. TRIGGER when user…
Design JSON Schema collections and CRUD patterns for Falcon Foundry apps. TRIGGER when user asks to "create a collection",…
Systematic troubleshooting for Falcon Foundry CLI errors, manifest validation failures, deploy failures, artifact runtime errors,…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.