Customerio 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-08Host 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: customerio-ci-integration description: 'Configure Customer.io CI/CD integration with automated testing. Use when setting up GitHub Actions, integration test suites, or pre-commit validation for Customer.io code. Trigger: "customer.io ci", "customer.io github actions", "customer.io pipeline", "customer.io automated testing". ' allowed-tools: Read, Write, Edit, Bash(npm:*), Bash(gh:*), Glob, Grep version: 1.14.0 license: MIT author: Jeremy Longshore <[email protected]> tags: - saas - customer-io - ci-cd - testing - github-actions compatibility: Designed for Claude Code --- # Customer.io CI Integration ## Output - A credential-free pull-request lane for schema/template/unit checks and a trusted scoped lane for optional integration tests. - A redacted CI receipt with validation results and a safe failure/retry procedure. ## Examples Run event-schema and template tests on every pull request using fixtures, then execute a single synthetic integration event only from a protected branch with a development workspace secret. If a live check fails, retain redacted status and back off; never expose workspace credentials to forked code or bypass protected checks. ## Overview Set up CI/CD pipelines for Customer.io integrations: GitHub Actions workflow with unit + integration tests, test fixtures with automatic cleanup, pre-commit hooks, and environment-specific credential management. ## Prerequisites - GitHub repository with Node.js project - Separate Customer.io workspace for CI testing (do NOT use production) - GitHub Actions secrets configured ## Instructions ### Step 1: GitHub Actions Workflow ```yaml # .github/workflows/customerio-tests.yml name: Customer.io Integration Tests on: push: paths: - "lib/customerio-*.ts" - "services/customerio-*.ts" - "tests/customerio*" pull_request: paths: - "lib/customerio-*.ts" - "services/customerio-*.ts" env: CUSTOMERIO_SITE_ID: ${{ secrets.CIO_TEST_SITE_ID }} CUSTOMERIO_TRACK_API_KEY: ${{ secrets.CIO_TEST_TRACK_API_KEY }} CUSTOMERIO_APP_API_KEY: ${{ secrets.CIO_TEST_APP_API_KEY }} CUSTOMERIO_REGION: us jobs: unit-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: npm - run: npm ci - run: npx vitest run tests/customerio --reporter=verbose env: CUSTOMERIO_DRY_RUN: "true" # Unit tests use mocks integration-tests: runs-on: ubuntu-latest needs: unit-tests # Only run if unit tests pass steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: npm - run: npm ci - name: Validate credentials run: | if [ -z "$CUSTOMERIO_SITE_ID" ]; then echo "::warning::CIO credentials not configured — skipping integration tests" exit 0 fi - name: Run integration tests run: npx vitest run tests/customerio.integration --reporter=verbose - name: Cleanup test users if: always() run: npx tsx scripts/cio-cleanup-test-users.ts ``` ### Step 2: Test Fixtures and Helpers ```typescript // tests/helpers/cio-test-utils.ts import { TrackClient, RegionUS } from "customerio-node"; const TEST_RUN_ID = `ci-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`; const createdUsers: string[] = []; export function getCioTestClient(): TrackClient { return new TrackClient( process.env.CUSTOMERIO_SITE_ID!, process.env.CUSTOMERIO_TRACK_API_KEY!, { region: RegionUS } ); } export function testUserId(label: string): string { const id = `${TEST_RUN_ID}-${label}`; createdUsers.push(id); return id; } export async function cleanupTestUsers(client: TrackClient): Promise<void> { console.log(`Cleaning up ${createdUsers.length} test users...`); for (const userId of createdUsers) { try { await client.suppress(userId); await client.destroy(userId); } catch { // Ignore cleanup errors } } createdUsers.length = 0; } ``` ### Step 3: Integration Test Suite ```typescript // tests/customerio.integration.test.ts import { describe, it, expect, afterAll } from "vitest"; import { getCioTestClient, testUserId, cleanupTestUsers } from "./helpers/cio-test-utils"; const cio = getCioTestClient(); describe("Customer.io Integration", () => { afterAll(async () => { await cleanupTestUsers(cio); }); it("should identify a new user", async () => { const userId = testUserId("identify-new"); await expect( cio.identify(userId, { email: `${userId}@test.example.com`, created_at: Math.floor(Date.now() / 1000), }) ).resolves.not.toThrow(); }); it("should update an existing user", async () => { const userId = testUserId("identify-update"); await cio.identify(userId, { email: `${userId}@test.example.com` }); await expect( cio.identify(userId, { plan: "pro", updated: true }) ).resolves.not.toThrow(); }); it("should track an event on a user", async () => { const userId = testUserId("track-event"); await cio.identify(userId, { email: `${userId}@test.example.com` }); await expect( cio.track(userId, { name: "ci_test_event", data: { test_run: true, timestamp: Date.now() }, }) ).resolves.not.toThrow(); }); it("should track an anonymous event", async () => { await expect( cio.trackAnonymous({ anonymous_id: testUserId("anon"), name: "ci_anonymous_test", data: { page: "/test" }, }) ).resolves.not.toThrow(); }); it("should suppress a user", async () => { const userId = testUserId("suppress"); await cio.identify(userId, { email: `${userId}@test.example.com` }); await expect(cio.suppress(userId)).resolves.not.toThrow(); }); it("should reject invalid credentials", asyn
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__customerio-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-08 | 4f83675ca38a | SAFE | B | 89 | first audit |
Questions
What does the Customerio 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 Customerio 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 Customerio Ci Integration access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
Which assistants does Customerio 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-08. The repository is watched, and a new audit runs when it changes — this is the first audit.