用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/jeremylongshore/claude-code-plugins-plus-skills --skill linktree-ci-integration命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
Implement user sign-up and sign-in flows with Clerk. Use when building authentication UI, customizing sign-in experience, or implementing OAuth social login. Trigger with phrases like "clerk sign-in", "clerk sign-up", "clerk login flow", "clerk OAuth", "clerk social login".
Implement session management and middleware with Clerk. Use when managing user sessions, configuring route protection, or implementing token refresh and custom JWT templates. Trigger with phrases like "clerk session", "clerk middleware", "clerk route protection", "clerk token", "clerk JWT".
Configure enterprise SSO, role-based access control, and organization management. Use when implementing SSO integration, configuring role-based permissions, or setting up organization-level controls. Trigger with phrases like "clerk SSO", "clerk RBAC", "clerk enterprise", "clerk roles", "clerk permissions", "clerk organizations".
正在显示 SKILL.md
| name | linktree-ci-integration |
| description | Ci Integration for Linktree. Trigger: "linktree ci integration". |
| allowed-tools | Read, Write, Edit, Grep |
| version | 1.7.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","linktree","social"] |
| compatibility | Designed for Claude Code |
Configure CI pipelines that validate Linktree link-in-bio API integrations using a two-tier testing approach. Unit tests mock the Linktree REST API to verify profile retrieval, link CRUD operations, and click analytics aggregation without needing an API key. Integration tests authenticate with a real Bearer token on main-branch merges to confirm link ordering, analytics endpoints, and rate limit handling against the live Linktree API. This ensures every PR gets instant feedback while production-critical flows are verified before deploy.
# .github/workflows/linktree-tests.yml
name: Linktree API Tests
on: [push, pull_request]
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npm run lint && npm run typecheck
- run: npm test -- --testPathPattern=unit # No Bearer token needed
integration-tests:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
needs: unit-tests
steps:
- uses: actions/checkout@v4
-
{ }
// tests/unit/link-service.test.ts
import { describe, it, expect, vi } from 'vitest';
import { reorderLinks } from '../../src/services/link-service';
import * as linktreeApi from '../../src/lib/linktree-api';
vi.mock('../../src/lib/linktree-api');
describe('LinkService', () => {
it('reorders links and returns updated positions', async () => {
vi.mocked(linktreeApi.patch).mockResolvedValue({
links: [
{ id: 'lnk-1', title: 'Portfolio', position: 0 },
{ id: 'lnk-2', title: 'GitHub', position: 1 },
],
});
const result = await reorderLinks(['lnk-1', 'lnk-2']);
expect(result.links[0].position).toBe(0);
expect(linktreeApi.patch).toHaveBeenCalledWith('/links/reorder', {
: [, ],
});
});
});
// tests/integration/profile-analytics.test.ts
import { describe, it, expect } from 'vitest';
import { LinktreeClient } from '../../src/lib/linktree-api';
const canRun = !!process.env.LINKTREE_API_KEY;
describe.skipIf(!canRun)('Linktree Analytics (live API)', () => {
const client = new LinktreeClient({
apiKey: process.env.LINKTREE_API_KEY!,
});
it('fetches click analytics for the authenticated profile', async () => {
const analytics = await client.get('/analytics', {
period: 'last_7_days',
});
expect(analytics).toHaveProperty('total_clicks');
expect(typeof analytics.total_clicks).toBe('number');
});
});
// tests/helpers/api-budget.ts
let callCount = 0;
const MAX_CALLS_PER_RUN = 30; // Linktree API: 60 req/min for standard tier
export function trackApiCall(): void {
callCount++;
if (callCount > MAX_CALLS_PER_RUN) {
throw new Error(
`CI API budget exceeded: ${callCount}/${MAX_CALLS_PER_RUN} calls. ` +
'Linktree standard tier allows 60 req/min — reduce test scope or add delays.'
);
}
}
export function getCallCount(): number { return callCount; }
| CI Issue | Cause | Fix |
|---|---|---|
| 401 Unauthorized | Expired or revoked Bearer token | Regenerate LINKTREE_API_KEY in Linktree admin and update GitHub Secrets |
| 429 Rate Limited | Exceeded 60 req/min on standard tier | Add --maxWorkers=1 and insert small delays between integration tests |
| Empty analytics response | Profile has zero traffic in test period | Use a longer period param or seed test clicks via the Links API |
| Link creation returns 409 | Duplicate URL already exists on profile | Add cleanup in afterEach to delete test links by ID |
| Integration job never runs | Branch name mismatch in workflow if | Confirm default branch is main, not master |
See linktree-deploy-integration.