Lindy Ci IntegrationSAFE
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
Overview
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
4f83675ca38aOBSERVED · 2026-10-09Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned |
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
--- name: lindy-ci-integration description: 'Configure CI/CD pipelines for testing Lindy AI agent integrations. Use when setting up automated testing, configuring GitHub Actions for webhook receiver tests, or validating agent connectivity in CI. Trigger with phrases like "lindy CI", "lindy GitHub Actions", "lindy automated tests", "CI lindy pipeline". ' allowed-tools: Read, Write, Edit, Bash(gh:*), Bash(npm:*) version: 1.20.0 license: MIT author: Jeremy Longshore <[email protected]> tags: - saas - lindy - testing - ci-cd compatibility: Designed for Claude Code --- # 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-auth` setup ## Instructions ### Step 1: Store Secrets in GitHub ```bash 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 ```yaml # .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 ```typescript // __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 ```typescript // __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 ```yaml # 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)
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (0)
No findings outside the package's declared scope.
Gates applied: no_behavioural_pass.
4f83675ca38afull audit observations/trust-audit/skill/jeremylongshore__lindy-ci-integration.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-09 | 4f83675ca38a | SAFE | B | 89 | first audit |
Questions
What does the Lindy Ci Integration skill do?
Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com.
Is Lindy Ci Integration safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can Lindy Ci Integration access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
Which assistants does Lindy Ci Integration work with?
Its documentation mentions claude-code. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (4f83675ca38a), read on 2026-10-09. The repository is watched, and a new audit runs when it changes — this is the first audit.