Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion addyosmani/.claude/skills/api-and-interface-design/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,9 @@ The unique constraint *is* the mechanism. A store that cannot enforce uniqueness

```typescript
if (existing.requestHash !== hash(req.body)) {
return res.status(422).json({ error: 'idempotency key reused with a different payload' });
return res.status(422).json({
error: { code: 'IDEMPOTENCY_KEY_REUSED', message: 'Idempotency key reused with a different payload' },
});
}
```

Expand Down
11 changes: 7 additions & 4 deletions addyosmani/.claude/skills/ci-cd-and-automation/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ Agent fixes → pushes → CI runs again
**Key patterns:**

```
Lint failure → Agent runs `npm run lint --fix` and commits
Lint failure → Agent runs `npm run lint -- --fix` and commits
Type error → Agent reads the error location and fixes the type
Test failure → Agent follows debugging-and-error-recovery skill
Build error → Agent checks config and dependencies
Expand Down Expand Up @@ -263,9 +263,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Rollback deployment
env:
VERSION: ${{ inputs.version }}
run: |
# Deploy the specified previous version
npx vercel rollback ${{ inputs.version }}
# Deploy the specified previous version. Pass the input through env,
# never interpolate it into the script (shell injection).
npx vercel rollback "$VERSION"
```

## Environment Management
Expand Down Expand Up @@ -313,7 +316,7 @@ When the pipeline exceeds 10 minutes, apply these strategies in order of impact:
```
Slow CI pipeline?
├── Cache dependencies
│ └── Use actions/cache or setup-node cache option for node_modules
│ └── Use the setup-node cache option (or actions/cache) for the package manager cache, not node_modules
├── Run jobs in parallel
│ └── Split lint, typecheck, test, build into separate parallel jobs
├── Only run what changed
Expand Down
2 changes: 1 addition & 1 deletion addyosmani/.claude/skills/code-simplification/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: code-simplification
description: Simplifies code for clarity. Use when refactoring code for clarity without changing behavior. Use when code works but is harder to read, maintain, or extend than it should be. Use when reviewing code that has accumulated unnecessary complexity.
description: Simplifies code for clarity. Use when refactoring code for clarity without changing behavior. Use when code works but is harder to read, maintain, or extend than it should be. Use when reviewing code that has accumulated unnecessary complexity. Use when asked to simplify, clean up, or reduce the nesting of a function or module that already works, even when the code is pasted inline and nothing else needs to change.
---

# Code Simplification
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ Last reviewed: 2026-08-08 by @addy
|-----------|------|-----------|---------|
| Types | Zero type errors | `tsc --noEmit` | every edit |
| Lint | Zero errors from our config | `biome check` | every edit |
| Secrets | No secrets in source | `gitleaks detect --redact` | every edit |
| Secrets | No secrets in source | `gitleaks dir . --redact` | every edit |
| Coverage | Changed lines ≥ 80% covered | `vitest run --coverage` + git diff | task end, CI |
| Security: code | No high findings | `semgrep scan --config p/default` | CI |
| Security: deps | Nothing at high or above | `osv-scanner scan source -r .` | CI |
Expand Down Expand Up @@ -148,10 +148,10 @@ Picking a dimension means installing something. Don't leave the user with a numb
| Types (TS) | tsc | already there | `tsc --noEmit` | any error |
| Types (Python) | mypy | `pip install mypy` | `mypy .` | any error |
| Lint | your existing config | already there | `eslint .` / `biome check` / `ruff check` | any error |
| Coverage (JS) | your test runner | already there | `vitest run --coverage` (or `jest --coverage`) | coverage of changed lines |
| Coverage (JS) | your test runner | Vitest: `npm i -D @vitest/coverage-v8`; Jest: already there | `vitest run --coverage` (or `jest --coverage`) | coverage of changed lines |
| Coverage (Python) | pytest-cov | `pip install pytest-cov` | `pytest --cov --cov-report=lcov` | same |
| Security: code | Semgrep | `pipx install semgrep` | `semgrep scan --config p/default --config p/owasp-top-ten` | any high finding |
| Security: secrets | gitleaks | `brew install gitleaks` | `gitleaks detect --redact --no-banner` | any finding |
| Security: secrets | gitleaks | `brew install gitleaks` | `gitleaks dir . --redact --no-banner` | any finding |
| Security: dependencies | osv-scanner | `brew install osv-scanner` | `osv-scanner scan source -r .` | high or above |
| Performance: page | Lighthouse | `npm i -D lighthouse` | `lighthouse $URL --output=json --quiet` | LCP, CLS, performance score |
| Performance: bundle | size-limit | `npm i -D size-limit` | `size-limit --json` | per-entry byte budget |
Expand All @@ -172,7 +172,7 @@ Add each one to the project's own script so it's reproducible without an agent:
```json
{
"scripts": {
"check:fast": "tsc --noEmit && eslint . && gitleaks detect --redact --no-banner",
"check:fast": "tsc --noEmit && eslint . && gitleaks dir . --redact --no-banner",
"check:task": "npm run check:fast && vitest run --coverage",
"check:full": "npm run check:task && semgrep scan --config p/default && osv-scanner scan source -r ."
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@ const ruleKey = (t) => {
const isException = (t) => /^\| *(W|E)\d+ *\|/.test(t.trim());
const MIN_BEFORE = /(>=|>|≥|at least|minimum|\bmin\b|no less than|not fall|not drop)\s*$/;
const MAX_BEFORE = /(<=|<|≤|at most|maximum|\bmax\b|no more than|under|below|not grow|not exceed)\s*$/;
const MIN_AFTER = /^\s*\S*\s*(or more|or higher|must not fall|must not drop)/;
const MAX_AFTER = /^\s*\S*\s*(or less|or lower|must not grow|must not exceed)/;
const MIN_AFTER = /^\s*\S*\s*(?:\|\s*)?(or more|or higher|must not fall|must not drop)/;
const MAX_AFTER = /^\s*\S*\s*(?:\|\s*)?(or less|or lower|must not grow|must not exceed)/;
const thresholds = (t) => {
const out = [], re = /\d+(?:\.\d+)?/g;
let m;
Expand Down
2 changes: 1 addition & 1 deletion addyosmani/.claude/skills/context-engineering/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Create a rules file that persists across sessions. This is the highest-leverage
## Commands
- Build: `npm run build`
- Test: `npm test`
- Lint: `npm run lint --fix`
- Lint: `npm run lint -- --fix`
- Dev: `npm run dev`
- Type check: `npx tsc --noEmit`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ npm test -- --grep "test name"
npm test -- --verbose

# Run in isolation (rules out test pollution)
npm test -- --testPathPattern="specific-file" --runInBand
npm test -- specific-file --runInBand
```

### Step 2: Localize
Expand Down
7 changes: 6 additions & 1 deletion addyosmani/.claude/skills/deprecation-and-migration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,11 @@ class LegacyTaskService implements OldTaskAPI {
const task = this.newService.findById(String(id));
return this.toOldFormat(task);
}

// Translate the new shape back into what old consumers expect
private toOldFormat(task: Task): OldTask {
return { id: Number(task.id), title: task.title, done: task.status === 'done' };
}
}
```

Expand All @@ -157,7 +162,7 @@ function getTaskService(userId: string): TaskService {
if (featureFlags.isEnabled('new-task-service', { userId })) {
return new NewTaskService();
}
return new LegacyTaskService();
return new OldTaskService();
}
```

Expand Down
5 changes: 3 additions & 2 deletions addyosmani/.claude/skills/documentation-and-adrs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,9 @@ Comment the *why*, not the *what*:
counter += 1;

// GOOD: Explains non-obvious intent
// Rate limit uses a sliding window — reset counter at window boundary,
// not on a fixed schedule, to prevent burst attacks at window edges
// Rate limit uses a fixed window that opens on the first request after the
// previous one expires, not on a clock schedule. Known gap: a client can spend
// the full limit just before a reset and again just after (2x in a moment)
if (now - windowStart > WINDOW_SIZE_MS) {
counter = 0;
windowStart = now;
Expand Down
12 changes: 6 additions & 6 deletions addyosmani/.claude/skills/frontend-ui-engineering/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,20 +79,20 @@ export function TaskItem({ task, onToggle, onDelete }: TaskItemProps) {
```tsx
// Container: handles data
export function TaskListContainer() {
const { tasks, isLoading, error, refetch } = useTasks();
const { tasks, isLoading, error, refetch, toggleTask, deleteTask } = useTasks();

if (isLoading) return <TaskListSkeleton />;
if (error) return <ErrorState message="Failed to load tasks" retry={refetch} />;
if (tasks.length === 0) return <EmptyState message="No tasks yet" />;

return <TaskList tasks={tasks} />;
return <TaskList tasks={tasks} onToggle={toggleTask} onDelete={deleteTask} />;
}

// Presentation: handles rendering
export function TaskList({ tasks }: { tasks: Task[] }) {
export function TaskList({ tasks, onToggle, onDelete }: { tasks: Task[] } & Pick<TaskItemProps, 'onToggle' | 'onDelete'>) {
return (
<ul role="list" className="divide-y">
{tasks.map(task => <TaskItem key={task.id} task={task} />)}
{tasks.map(task => <TaskItem key={task.id} task={task} onToggle={onToggle} onDelete={onDelete} />)}
</ul>
);
}
Expand Down Expand Up @@ -234,7 +234,7 @@ function Dialog({ isOpen, onClose }: DialogProps) {

```tsx
// Don't show blank screens
function TaskList({ tasks }: { tasks: Task[] }) {
function TaskList({ tasks, onCreateTask }: { tasks: Task[]; onCreateTask: () => void }) {
if (tasks.length === 0) {
return (
<div role="status" className="text-center py-12">
Expand Down Expand Up @@ -272,7 +272,7 @@ Test at these breakpoints: 320px, 768px, 1024px, 1440px.
// Skeleton loading (not spinners for content)
function TaskListSkeleton() {
return (
<div className="space-y-3" aria-busy="true" aria-label="Loading tasks">
<div className="space-y-3" role="status" aria-busy="true" aria-label="Loading tasks">
{Array.from({ length: 3 }).map((_, i) => (
<div key={i} className="h-12 bg-muted animate-pulse rounded" />
))}
Expand Down
6 changes: 4 additions & 2 deletions addyosmani/.claude/skills/idea-refine/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@ Refines raw ideas into sharp, actionable concepts worth building through structu
This skill is primarily an interactive dialogue. Invoke it with an idea, and the agent will guide you through the process.

```bash
# Optional: Initialize the ideas directory
bash skills/idea-refine/scripts/idea-refine.sh
# Optional. Run from the project root so this creates ./docs/ideas.
# <skill-dir> is the directory that contains this SKILL.md
# (for example .agents/skills/idea-refine or .cursor/skills/idea-refine).
bash <skill-dir>/scripts/idea-refine.sh
```

## Output
Expand Down
4 changes: 2 additions & 2 deletions addyosmani/.claude/skills/performance-optimization/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@ Lighthouse Performance score: ≥ 90
# Bundle size check
npx bundlesize --config bundlesize.config.json

# Lighthouse CI
npx lhci autorun
# Lighthouse CI. The CLI package is @lhci/cli; unscoped `lhci` on npm is not it.
npx --package=@lhci/cli lhci autorun
```

## See Also
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ const clean = DOMPurify.sanitize(userInput);
// Always check authorization, not just authentication
app.patch('/api/tasks/:id', authenticate, async (req, res) => {
const task = await taskService.findById(req.params.id);
if (!task) {
return res.status(404).json({
error: { code: 'NOT_FOUND', message: 'Task not found' }
});
}

// Check that the authenticated user owns this resource
if (task.ownerId !== req.user.id) {
Expand Down
5 changes: 3 additions & 2 deletions addyosmani/.claude/skills/source-driven-development/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,9 @@ form submission state. React 19 replaced the manual
isPending/setIsPending pattern with this hook.

Source: https://react.dev/blog/2024/12/05/react-19#actions
"useTransition now supports async functions [...] to handle
pending states automatically"
"In React 19, we're adding support for using async functions in
transitions to handle pending states, errors, forms, and optimistic
updates automatically."
```

**Citation rules:**
Expand Down
2 changes: 1 addition & 1 deletion addyosmani/.claude/skills/spec-driven-development/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ Don't silently fill in ambiguous requirements. The spec's entire purpose is to s
```
Build: npm run build
Test: npm test -- --coverage
Lint: npm run lint --fix
Lint: npm run lint -- --fix
Dev: npm run dev
```

Expand Down
28 changes: 14 additions & 14 deletions addyosmani/skills-lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/api-and-interface-design/SKILL.md",
"computedHash": "8bdbf1fca81bef9258d7e0d9726f933f25677ec8537792e084a3fb7c54acf2ba"
"computedHash": "0d823e9ff32f529f21492a3fd7635fc75b43ff1eb1788d4be0974bfa42e22ae3"
},
"browser-testing-with-devtools": {
"source": "addyosmani/agent-skills",
Expand All @@ -17,7 +17,7 @@
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/ci-cd-and-automation/SKILL.md",
"computedHash": "578b098a7d2352ccdac8b8abdc40eb6803538e81cf8382f138da6188a655087c"
"computedHash": "f655c44b80ec36532fa058f7b94e7463330b8ccacda35eba05d85c677a4f6a7d"
},
"code-review-and-quality": {
"source": "addyosmani/agent-skills",
Expand All @@ -29,37 +29,37 @@
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/code-simplification/SKILL.md",
"computedHash": "7973e746e8e2ea5004d520da970c15a106824b8d6be1bcff48908aec021f3677"
"computedHash": "e4c1f0c12274be9981e1301bfbb9b3112b63e2209413071728b132c9b4ee2f5b"
},
"constraint-driven-development": {
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/constraint-driven-development/SKILL.md",
"computedHash": "7cdf20ff7d27eb3103b206033a1d87af7afe4a648162f09cd382fc8e3cb9a42b"
"computedHash": "e7edf3955e685b52c078ca313b518266bd33bab5510358c9f323c0fa21558946"
},
"context-engineering": {
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/context-engineering/SKILL.md",
"computedHash": "807434a4b178635a5539a1da241815ba7228f00b71f8e3ccd529472ce3bcaf80"
"computedHash": "e02e84c9af9e5ba8b22161cc2c60517062a13bcc7d4e8763478257cae992e137"
},
"debugging-and-error-recovery": {
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/debugging-and-error-recovery/SKILL.md",
"computedHash": "6f437bc609eb8d0dc7f4768c17c9aeb85c9c7632bc36703af9f1367ffb47237a"
"computedHash": "b6888f4fa9b5d683b6ac912a881c57e2ba521e5b1099d9340413538efb23cb84"
},
"deprecation-and-migration": {
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/deprecation-and-migration/SKILL.md",
"computedHash": "0d7b2002e250c02a260f6bc502d7a798ab8e8ca0c020c54d7b0f16053935c72c"
"computedHash": "5b6d695fac255087957d27b7006d5aba2dcafbfed0dd3bae93b10ae3a7547568"
},
"documentation-and-adrs": {
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/documentation-and-adrs/SKILL.md",
"computedHash": "f1bd038e74194364c1dcdb3dd0a72194ffd3ca9d3a103c125ca1a62e801a0cc4"
"computedHash": "85db994c5d2853bbd9ebdb8542e43d92b7229918a0c70126f0e94280ea1ceeec"
},
"doubt-driven-development": {
"source": "addyosmani/agent-skills",
Expand All @@ -71,7 +71,7 @@
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/frontend-ui-engineering/SKILL.md",
"computedHash": "49bb6ccfc41753bdd679f368ce75629ae9d424c5b8abc33faf949a4a55f919a1"
"computedHash": "22ee43d0367d2c3f611585eead5f0c413bcefa947da34b25a4935726ed76533e"
},
"git-workflow-and-versioning": {
"source": "addyosmani/agent-skills",
Expand All @@ -83,7 +83,7 @@
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/idea-refine/SKILL.md",
"computedHash": "77739c4f6a29c0fad465a30bab9e862445a3f1b0f92808ffcd541fa02ed0637b"
"computedHash": "f4400771e231aeaa6d954cc41ea5845b71d96d8f4d1df5e312849cd75bff97dd"
},
"incremental-implementation": {
"source": "addyosmani/agent-skills",
Expand All @@ -107,7 +107,7 @@
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/performance-optimization/SKILL.md",
"computedHash": "a2cdba94ff8f898183b3d5af736272dc439826083723b17a88782e75d2351530"
"computedHash": "276aec00aaabae98f4bd6d565745378b498e0d11688315f32179587746b93805"
},
"planning-and-task-breakdown": {
"source": "addyosmani/agent-skills",
Expand All @@ -119,7 +119,7 @@
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/security-and-hardening/SKILL.md",
"computedHash": "32a1243d6eb45fd342c1f4e9f9ee5f1651a1e9fdccb86dcbbbee5d6f455ed362"
"computedHash": "dbab1f4697ece5cab24a90911ae052320d8f8b191324df7f836aa42344699b89"
},
"shipping-and-launch": {
"source": "addyosmani/agent-skills",
Expand All @@ -131,13 +131,13 @@
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/source-driven-development/SKILL.md",
"computedHash": "d1923bb807f7db157a794f07a590ca639b3789b2f1a5eabef993f8df24791e2a"
"computedHash": "1397b7866630cda47bb5659d1ebb250012ca930c8217bf12b78200345f3328f6"
},
"spec-driven-development": {
"source": "addyosmani/agent-skills",
"sourceType": "github",
"skillPath": "skills/spec-driven-development/SKILL.md",
"computedHash": "90a53ee823e49fd1518a01e6cf64968d4848bce3fc0b0115b1c19b7e5a87a5ca"
"computedHash": "6ecb6a4920d1ae2ce03b81d69a06e3855008c669082afd830bf2c49a5b44abf6"
},
"test-driven-development": {
"source": "addyosmani/agent-skills",
Expand Down
2 changes: 1 addition & 1 deletion mattpocock/.claude/skills/chief-of-staff/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Harness-permitting, you will suggest recurring schedules which can help in achie

All work should be done in subagents. Protect your context window.

Use background agents so you can stay in active dialogue with the user.
Use background agents so you can stay in active dialogue with the user. Start every subagent with a fresh context window.

Communication to and from subagents should be sparse. Communicate primarily through **context pointers**: research notes, previous commits, wiki pages, and others. Don't duplicate information already available via pointers.

Expand Down
2 changes: 1 addition & 1 deletion mattpocock/.claude/skills/code-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Two-axis review of the diff between `HEAD` and a fixed point the user supplies:
- **Standards**: does the code conform to this repo's documented coding standards?
- **Spec**: does the code faithfully implement the originating issue / spec?

Both axes run as **parallel sub-agents** so they don't pollute each other's context, then this skill aggregates their findings.
Both axes run as **parallel sub-agents** so they don't pollute each other's context, then this skill aggregates their findings. Start every sub-agent with a fresh context window.

The issue tracker should have been provided to you. If not, tell the user to run `/setup-matt-pocock-skills`.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Show this to the user, then immediately proceed to Step 2. The user reads and th

### 2. Spawn sub-agents

Spawn 3+ sub-agents in parallel. Each must produce a **radically different** interface for the deepened module.
Spawn 3+ sub-agents in parallel, each with a fresh context window. Each must produce a **radically different** interface for the deepened module.

Prompt each sub-agent with a separate technical brief (file paths, coupling details, dependency category from [DEEPENING.md](DEEPENING.md), what sits behind the seam). The brief is independent of the user-facing problem-space explanation in Step 1. Give each agent a different design constraint:

Expand Down
Loading