复制安装命令
用 Codex 或 Claude 安装复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它先审查 Skill 页面再帮你安装。
复制前请先查看来源、License 和安全提示。
A model-agnostic agent-skills platform.
用 Codex 或 Claude 安装复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它先审查 Skill 页面再帮你安装。
复制前请先查看来源、License 和安全提示。
来源文件:README.md
A model-agnostic agent-skills platform. The canonical layer is harness-free by construction; Claude Code is currently the verified-native harness. Other harnesses remain engineering candidates until their native-path integration is verified; source research alone is never presented as public support.
Version semantics: the release badge is this marketplace's display version. npm packages, including the
ccpiCLI and publishable plugins, retain their own package versions; they are intentionally not expected to equal the display version. The version-surface checker governs the display surfaces without rewriting package semver.
Inside Claude Code, one command installs the whole marketplace:
/plugin marketplace add jeremylongshore/claude-code-plugins
Or use the CLI:
pnpm add -g @intentsolutionsio/ccpi
ccpi install devops-automation-pack
Browse the marketplace · Explore plugins · Download bundles
Killer Skill of the Week — no-ai-slop by Peter Yang
Strip AI slop from any draft — named-pattern edits that keep the writer's real voice
no-ai-slop does two jobs and refuses to fake a third. In Edit mode it makes the minimum effective edit — cutting throat-clearing, weak verbs, and abstract nouns while deliberately preserving the writer's cadence, bluntness, humor, and honest admissions, so a rough draft still sounds like the same person afterward. In Detect mode it names each AI-slop pattern it finds, quotes the offending line, and gives the fix in a few words — and pointedly does NOT score the draft or guess whether an AI wrote it. That restraint is the whole point: AI detectors guess; named patterns are evidence the reader can check. MIT-licensed, single focused skill, actively maintained by Peter Yang.
"AI detectors guess. Named patterns are evidence the user can check." — Peter Yang
Grade: A | Week of July 22, 2026 (W30) | View on GitHub
Previous picks: tonone, mnemos, databricks-pack, kobiton-automate, code-cleanup, web-analytics, token-optimizer, executive-assistant-skills, skill-creator, cursor-pack, crypto-portfolio-tracker. See all at tonsofskills.com.
Every number below names the cohort it counts and the command that reproduces it — an unlabeled count is how a corpus ends up with five contradictory answers to "how many skills."
| Count | Cohort | Reproduce with |
|---|---|---|
| 440 | catalog plugins (catalog-entry cohort) | node scripts/generate-readme-toc.mjs over marketplace.extended.json |
| 2,984 | marketplace-visible skills (distinct) | node -e "import('./scripts/corpus-resolver.mjs').then(m=>console.log(m.resolveCorpus('marketplace-visible').length))" |
| 347 | agent definitions in plugins | git ls-files 'plugins/**' | grep '/agents/.*\.md' |
| 19 | plugin categories | ls -d plugins/*/ |
Across 396 published packages in the claude-code-plugins namespace. Updated daily by GitHub Actions.
| Window | All packages | Established (>30d) |
|---|---|---|
| Last 24 hours | 962 | 962 |
| Last 7 days | 2,920 | 2,916 |
| Last 30 days | 12,868 | 12,779 |
"Established" excludes packages first published within the last 30 days, so a bulk-publish event doesn't dominate the headline.
Top 10 by last 30 days:
Last refreshed 2026-08-19T03:03:05.709Z.
Five real questions, five doors — each resolves to a live, generated surface, never a hand-maintained list:
The 19 categories below link into the live marketplace. Plugin counts are the catalog-entry cohort — regenerated from marketplace.extended.json by this generator; the catalog itself lives on tonsofskills.com, never in this file (§ 6A of the platform blueprint).
| Category | Plugins | |
|---|---|---|
| 🤖 | AI & Machine Learning | 37 |
| 🎭 | AI Agents & Agency | 9 |
| 🔌 | API Development | 26 |
| 💼 | Business Tools | 6 |
| 👥 | Community | 20 |
| ₿ | Crypto & Web3 | 27 |
| 💾 | Database | 26 |
| 🎨 | Design | 2 |
| 🔧 | DevOps & Infrastructure | 36 |
| 📚 | Examples & Templates | 5 |
| 🧩 | MCP Servers | 17 |
| 📦 | Packages | 5 |
| ⚡ | Performance | 25 |
| ✅ | Productivity | 29 |
| 🎁 | SaaS Skill Packs | 105 |
| 🔐 | Security | 27 |
| ✨ | Skill Enhancers | 9 |
| 🧪 | Testing | 28 |
| 📁 | Analytics | 1 |
Four artifact classes live in this repository, distinguished on sight and never blurred — provenance is a truth requirement here, not a UX nicety:
| Class | What it is | How the reader can tell |
|---|---|---|
| Canonical skill | First-party, harness-free, the source of truth | No .source.json in its plugin directory |
| Generated adapter | A thin, machine-produced harness projection | Lives under a generated path with a "generated — do not edit" header |
| First-party package | An Intent Solutions distribution (npm, cowork zip) | @intentsolutionsio scope, IS-authored license |
| Upstream mirror | Somebody else's work, hosted mirror-by-default | .source.json present — upstream author, license, and pinned commit recorded |
Not yet certified. The certification program (tiers T0–T4 with retained, hash-matched evidence) is a later epic of the platform blueprint; until its report exists, no artifact on this surface claims a tier. This line is rendered from the absence of certification-report.json — honestly, not cosmetically.
Start with the contribution guide, then the intake and review standards every submission passes through:
External plugins are hosted mirror-by-default: the contributor's repository stays the source of truth, every mirrored source is pinned in a content lockfile, and upstream credit — author, license, resolved commit — is recorded in the mirror itself. Improvements flow by upstreaming to the author's repository, never by silently editing the mirror. The full decision record is the external-sync model.
MIT for the repository scaffolding and first-party tooling; each plugin carries its own license in its manifest, and mirrored plugins keep their upstream license verbatim.
name: bamboohr-local-dev-loop
description: 'Configure BambooHR local development with hot reload, mocking, and testing.
Use when setting up a development environment, configuring test workflows,
or establishing a fast iteration cycle with BambooHR API.
Trigger with phrases like "bamboohr dev setup", "bamboohr local development",
"bamboohr dev environment", "develop with bamboohr", "bamboohr mock".
'
allowed-tools: Read, Write, Edit, Bash(npm:*), Bash(pnpm:*), Grep
version: 1.4.0
license: MIT
author: Jeremy Longshore <jeremy@intentsolutions.io>
tags:
- saas
- hr
- bamboohr
- development
compatibility: Designed for Claude CodeSet up a fast, reproducible local development workflow for BambooHR integrations with request mocking, hot reload, and integration testing against the real API.
bamboohr-install-auth setupBAMBOOHR_API_KEY and BAMBOOHR_COMPANY_DOMAIN set in .envmy-bamboohr-project/
├── src/
│ ├── bamboohr/
│ │ ├── client.ts # Reusable API client
│ │ ├── types.ts # BambooHR response types
│ │ └── employees.ts # Employee operations
│ └── index.ts
├── tests/
│ ├── mocks/
│ │ └── bamboohr.ts # API response fixtures
│ ├── unit/
│ │ └── employees.test.ts
│ └── integration/
│ └── bamboohr.test.ts
├── .env.local # Real API key (git-ignored)
├── .env.example # Template for team
├── .env.test # Test config (sandbox key)
└── package.json
// src/bamboohr/client.ts
import 'dotenv/config';
export class BambooHRClient {
private baseUrl: string;
private authHeader: string;
constructor(companyDomain?: string, apiKey?: string) {
const domain = companyDomain || process.env.BAMBOOHR_COMPANY_DOMAIN!;
const key = apiKey || process.env.BAMBOOHR_API_KEY!;
this.baseUrl = `https://api.bamboohr.com/api/gateway.php/${domain}/v1`;
this.authHeader = `Basic ${Buffer.from(`${key}:x`).toString('base64')}`;
}
async request<T>(path: string, options: RequestInit = {}): Promise<T> {
const res = await fetch(`${this.baseUrl}${path}`, {
...options,
headers: {
Authorization: this.authHeader,
Accept: 'application/json',
'Content-Type': 'application/json',
...options.headers,
},
});
if (!res.ok) {
const errMsg = res.headers.get('X-BambooHR-Error-Message') || res.statusText;
throw new BambooHRError(res.status, errMsg, path);
}
return res.json() as Promise<T>;
}
async getEmployee(id: number | string, fields: string[]): Promise<Record<string, string>> {
return this.request(`/employees/${id}/?fields=${fields.join(',')}`);
}
async getDirectory(): Promise<{ employees: BambooEmployee[] }> {
return this.request('/employees/directory');
}
}
export class BambooHRError extends Error {
constructor(public status: number, message: string, public path: string) {
super(`BambooHR ${status}: ${message} [${path}]`);
this.name = 'BambooHRError';
}
}
{
"scripts": {
"dev": "tsx watch src/index.ts",
"test": "vitest run",
"test:watch": "vitest --watch",
"test:integration": "DOTENV_CONFIG_PATH=.env.test vitest run tests/integration/",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
"tsx": "^4.0.0",
"vitest": "^2.0.0",
"typescript": "^5.5.0",
"msw": "^2.0.0"
}
}
// tests/mocks/bamboohr.ts
import { http, HttpResponse } from 'msw';
const MOCK_COMPANY = 'testcompany';
const BASE = `https://api.bamboohr.com/api/gateway.php/${MOCK_COMPANY}/v1`;
export const bamboohrHandlers = [
// Employee directory
http.get(`${BASE}/employees/directory`, () => {
return HttpResponse.json({
fields: [{ id: 'displayName', type: 'text', name: 'Display Name' }],
employees: [
{
id: '1', displayName: 'Jane Smith', firstName: 'Jane',
lastName: 'Smith', jobTitle: 'Engineer', department: 'Engineering',
workEmail: 'jane@test.com', location: 'Remote',
},
{
id: '2', displayName: 'Bob Jones', firstName: 'Bob',
lastName: 'Jones', jobTitle: 'Designer', department: 'Design',
workEmail: 'bob@test.com', location: 'NYC',
},
],
});
}),
// Single employee
http.get(`${BASE}/employees/:id/`, ({ params }) => {
return HttpResponse.json({
id: params.id, firstName: 'Jane', lastName: 'Smith',
jobTitle: 'Engineer', department: 'Engineering',
hireDate: '2023-01-15', workEmail: 'jane@test.com',
status: 'Active',
});
}),
// Custom report
http.post(`${BASE}/reports/custom`, () => {
return HttpResponse.json({
title: 'Test Report', employees: [
{ firstName: 'Jane', lastName: 'Smith', department: 'Engineering' },
],
});
}),
];
// tests/unit/employees.test.ts
import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';
import { setupServer } from 'msw/node';
import { bamboohrHandlers } from '../mocks/bamboohr';
import { BambooHRClient } from '../../src/bamboohr/client';
const server = setupServer(...bamboohrHandlers);
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }));
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
describe('BambooHRClient', () => {
const client = new BambooHRClient('testcompany', 'fake-key');
it('fetches the employee directory', async () => {
const dir = await client.getDirectory();
expect(dir.employees).toHaveLength(2);
expect(dir.employees[0].displayName).toBe('Jane Smith');
});
it('fetches a single employee', async () => {
const emp = await client.getEmployee(1, ['firstName', 'lastName', 'jobTitle']);
expect(emp.firstName).toBe('Jane');
expect(emp.jobTitle).toBe('Engineer');
});
});
// tests/integration/bamboohr.test.ts
import { describe, it, expect } from 'vitest';
import { BambooHRClient } from '../../src/bamboohr/client';
const HAS_KEY = !!process.env.BAMBOOHR_API_KEY;
describe.skipIf(!HAS_KEY)('BambooHR Integration', () => {
const client = new BambooHRClient();
it('should fetch the real employee directory', async () => {
const dir = await client.getDirectory();
expect(dir.employees.length).toBeGreaterThan(0);
expect(dir.employees[0]).toHaveProperty('displayName');
}, 15_000);
});
BambooHRClient with typed methodsBAMBOOHR_API_KEY presencetsx watchDevelop against mocked responses and synthetic employee fixtures by default. If a sandbox call is needed, use a dedicated least-privilege credential, request only the named test fields, avoid caching raw responses outside the protected test directory, and delete the artifact when the test completes.
| Error | Cause | Solution |
|---|---|---|
BambooHRError 401 | Wrong key in .env.local | Re-copy from BambooHR dashboard |
MSW onUnhandledRequest | Unmocked endpoint hit | Add handler to bamboohrHandlers |
ECONNREFUSED in tests | MSW server not started | Ensure beforeAll(() => server.listen()) |
| Slow integration tests | Real API latency | Increase vitest timeout to 15s |
See bamboohr-sdk-patterns for production-ready code patterns.
评论 (0)
暂无评论,成为第一个评论者吧!