lindy-ci-integration
Set up GitHub Actions to test Lindy agent webhook receivers and application logic.
Install
mkdir -p .claude/skills/lindy-ci-integration && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8271" && unzip -o skill.zip -d .claude/skills/lindy-ci-integration && rm skill.zipInstalls to .claude/skills/lindy-ci-integration
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Configure CI/CD pipelines for testing Lindy AI agent integrations.Key capabilities
- →Store Lindy API keys and webhook secrets in GitHub
- →Create GitHub Actions workflows for Lindy integration tests
- →Validate webhook signature verification in CI
- →Test Lindy payload processing logic
- →Perform connectivity checks to Lindy webhook endpoints
How it works
The skill configures GitHub Actions to run tests that validate webhook signature verification, process Lindy payloads, and check connectivity to Lindy endpoints. It uses GitHub secrets for secure credential management.
Inputs & outputs
When to use lindy-ci-integration
- →Validate webhook signature verification
- →Test Lindy payload processing logic
- →Automate integration tests in GitHub Actions
- →Configure secrets for secure agent testing
About this skill
Lindy CI Integration
Overview
Lindy agents run on Lindy's managed platform — CI/CD tests your integration code: webhook receivers, callback handlers, and application logic that interacts with Lindy agents. Test webhook signature verification, payload processing, and error handling without hitting live Lindy endpoints.
Prerequisites
- GitHub repository with Actions enabled
- Lindy API key and webhook secret stored as GitHub secrets
- Node.js project with webhook receiver code
- Completed
lindy-install-authsetup
Instructions
Step 1: Store Secrets in GitHub
gh secret set LINDY_API_KEY --body "lnd_live_xxxxxxxxxxxx"
gh secret set LINDY_WEBHOOK_SECRET --body "whsec_xxxxxxxxxxxx"
Step 2: Create GitHub Actions Workflow
# .github/workflows/lindy-integration.yml
name: Lindy Integration Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- name: Run unit tests
run: npm test
env:
LINDY_WEBHOOK_SECRET: ${{ secrets.LINDY_WEBHOOK_SECRET }}
- name: Validate webhook handler
run: npm run test:webhook
- name: Connectivity check (non-blocking)
continue-on-error: true
run: |
curl -s -o /dev/null -w "%{http_code}" \
-X POST "https://public.lindy.ai/api/v1/webhooks/health" \
-H "Authorization: Bearer ${{ secrets.LINDY_API_KEY }}"
Step 3: Write Webhook Handler Tests
// __tests__/webhook-handler.test.ts
import { describe, it, expect, vi } from 'vitest';
import request from 'supertest';
import { app } from '../src/server';
describe('Lindy Webhook Handler', () => {
const VALID_SECRET = process.env.LINDY_WEBHOOK_SECRET || 'test-secret';
it('rejects requests without auth header', async () => {
const res = await request(app)
.post('/lindy/callback')
.send({ event: 'test' });
expect(res.status).toBe(401);
});
it('rejects requests with wrong auth token', async () => {
const res = await request(app)
.post('/lindy/callback')
.set('Authorization', 'Bearer wrong-token')
.send({ event: 'test' });
expect(res.status).toBe(401);
});
it('accepts requests with valid auth token', async () => {
const res = await request(app)
.post('/lindy/callback')
.set('Authorization', `Bearer ${VALID_SECRET}`)
.set('Content-Type', 'application/json')
.send({
taskId: 'task_123',
status: 'completed',
result: { summary: 'Test result' },
});
expect(res.status).toBe(200);
expect(res.body.received).toBe(true);
});
it('handles malformed payload gracefully', async () => {
const res = await request(app)
.post('/lindy/callback')
.set('Authorization', `Bearer ${VALID_SECRET}`)
.set('Content-Type', 'application/json')
.send('not-json');
expect(res.status).toBeLessThan(500);
});
it('processes webhook payload fields correctly', async () => {
const payload = {
taskId: 'task_456',
status: 'completed',
result: {
classification: 'billing',
sentiment: 'neutral',
summary: 'Customer asks about invoice #789',
},
};
const res = await request(app)
.post('/lindy/callback')
.set('Authorization', `Bearer ${VALID_SECRET}`)
.set('Content-Type', 'application/json')
.send(payload);
expect(res.status).toBe(200);
});
});
Step 4: Add Smoke Test for Live Connectivity
// __tests__/connectivity.test.ts
import { describe, it, expect } from 'vitest';
describe('Lindy Connectivity (smoke)', () => {
it('can reach Lindy webhook endpoint', async () => {
const webhookUrl = process.env.LINDY_WEBHOOK_URL;
if (!webhookUrl) {
console.warn('LINDY_WEBHOOK_URL not set, skipping connectivity test');
return;
}
const response = await fetch(webhookUrl, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.LINDY_WEBHOOK_SECRET}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ test: true, ci: true }),
});
expect(response.ok).toBe(true);
});
});
Step 5: PR Status Check
# Add to existing workflow
- name: Post test results
if: always()
uses: actions/github-script@v7
with:
script: |
const status = '${{ job.status }}' === 'success' ? 'Passed' : 'Failed';
if (context.payload.pull_request) {
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: `Lindy Integration Tests: **${status}**`
});
}
Test Categories
| Category | What It Tests | Requires Live Lindy? |
|---|---|---|
| Auth verification | Webhook signature checking | No |
| Payload processing | Data extraction and transformation | No |
| Error handling | Malformed input, edge cases | No |
| Connectivity | Webhook endpoint reachability | Yes (non-blocking) |
| End-to-end | Full trigger -> callback cycle | Yes |
Error Handling
| Issue | Cause | Solution |
|---|---|---|
| Secret not found in CI | Not configured | gh secret set LINDY_WEBHOOK_SECRET |
| Connectivity test fails | Lindy endpoint unreachable in CI | Mark as continue-on-error: true |
| Tests timeout | Network latency | Set timeout-minutes: 10 on job |
| Flaky live tests | Lindy processing delay | Add retry logic or mock external calls |
Resources
Next Steps
Proceed to lindy-deploy-integration for deployment automation.
Prerequisites
Limitations
- →Connectivity tests can fail if the Lindy endpoint is unreachable in CI
- →Tests may timeout due to network latency
- →Live tests can be flaky due to Lindy processing delays
How it compares
This skill automates the testing of Lindy integration code within a CI/CD pipeline, providing continuous validation unlike manual testing.
Compared to similar skills
lindy-ci-integration side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| lindy-ci-integration (this skill) | 0 | 25d | Caution | Intermediate |
| perf-lighthouse | 13 | 5mo | Review | Intermediate |
| smoke-test | 6 | 4mo | Review | Beginner |
| 1k-dev-commands | 2 | 26d | Review | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
perf-lighthouse
tech-leads-club
Run Lighthouse audits locally via CLI or Node API, parse and interpret reports, set performance budgets. Use when measuring site performance, understanding Lighthouse scores, setting up budgets, or integrating audits into CI. Triggers on: lighthouse, run lighthouse, lighthouse score, performance audit, performance budget.
smoke-test
mastra-ai
Create a Mastra project using create-mastra and smoke test the studio in Chrome
1k-dev-commands
OneKeyHQ
Development commands — yarn scripts for dev servers, building, linting, testing, and troubleshooting.
instantly-ci-integration
jeremylongshore
Configure Instantly CI/CD integration with GitHub Actions and testing. Use when setting up automated testing, configuring CI pipelines, or integrating Instantly tests into your build process. Trigger with phrases like "instantly CI", "instantly GitHub Actions", "instantly automated tests", "CI instantly".
groq-ci-integration
jeremylongshore
Configure Groq CI/CD integration with GitHub Actions and testing. Use when setting up automated testing, configuring CI pipelines, or integrating Groq tests into your build process. Trigger with phrases like "groq CI", "groq GitHub Actions", "groq automated tests", "CI groq".
obsidian-ci-integration
jeremylongshore
Set up GitHub Actions CI/CD for Obsidian plugin development. Use when automating builds, tests, and releases for your plugin, or setting up continuous integration for Obsidian projects. Trigger with phrases like "obsidian CI", "obsidian github actions", "obsidian automated build", "obsidian CI/CD".