Skip to content
Open
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
9 changes: 5 additions & 4 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ A starter template repository — not a product. Clone it, add a UI component li

## Tech Stack

- **Framework**: Next.js 16 (App Router, React Compiler, TypeScript strict)
- **Styling**: Tailwind CSS v4
- **Testing**: Vitest + Testing Library (unit), Playwright (E2E)
- **Quality**: Biome (lint + format, replaces ESLint/Prettier), Lefthook (git hooks)
- **Framework**: Next.js 16.2 (React 19, App Router, React Compiler, TypeScript 6)
- **Styling**: Tailwind CSS 4.2
- **Testing**: Vitest 4.1 + Testing Library (unit), Playwright 1.59 (E2E)
- **Quality**: Biome 2.4 (lint + format, replaces ESLint/Prettier)
- **Git Hooks**: Lefthook 2.1
- **Deployment**: Vercel (Preview on PR, Production on merge)

## Breaking Changes (Next.js 16 / Tailwind 4)
Expand Down
69 changes: 53 additions & 16 deletions .claude/commands/coderabbit.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
---
description: Evaluate CodeRabbit comment and recommend whether to action it
argument-hint: <comment-url>
allowed-tools: Bash(gh api:*), Read, Glob, Grep
argument-hint: <CodeRabbit comment link (https://github.com/username/repo/pull/3#discussion_r3019655555)>
allowed-tools: Read, Glob, Grep, Bash(gh api *), Bash(rm x_coderabbit_*)
---

## 1. Fetch

Parse `$1` to extract owner, repo, and comment ID.
Parse `$1` to extract owner, repo, PR number, and comment ID.

```bash
# strips analysis chain, includes diff context
Expand All @@ -29,31 +29,68 @@ Evaluate the comment `x_coderabbit_COMMENT_ID.md` against the context of our cod
| **Valuable** | Worth doing? Good practice? Or is it over-engineering? |
| **Elegant** | Is the suggested fix pragmatic and clean? |

## 3. Recommend
## 3. Recommend & Confirm

1. **Summary**: Explain the comment (2-4 simple sentences)
Follow this output structure:

2. **Verdict**: [Action | Skip | Clarify]
- **Action** - Valid and valuable; implement (or with modifications)
- **Skip** - Not applicable, over-engineered, or incorrect
- **Clarify** - Need more information before deciding
<structure>
🐰 CodeRabbit Review: [Terse title for comment]

3. **Reasoning**: Why this verdict (2-3 sentences)
📋 Summary: [Explain the comment, 2-4 simple sentences]

## Output Format
🏷️ Verdict: [Action | Skip | Clarify]
- **Action** - Valid and valuable; implement (or with modifications)
- **Skip** - Not applicable, over-engineered, or incorrect
- **Clarify** - Need more information before deciding

Well structured, use emojis, if using tables keep width <100 chars for readability.
💬 Reasoning: [Why this verdict, 2-3 simple sentences]
</structure>

## Replying to CodeRabbit on GitHub
**Output Format:** Well structured, use emojis, if using tables keep width <100 chars for readability.

When you recommend skipping a fix, ask whether the user would like to reply to CodeRabbit.
Ask for confirmation before proceeding with the verdict.

To reply to a PR review comment, use `in_reply_to` on the pull comments endpoint:
## 4. Reply To CodeRabbit and Resolve

After actioning or skipping, offer to reply to CodeRabbit **and** resolve the thread. Reply first, then resolve. Never do either without user confirmation.

<reply>
Keep replies concise. State reason for action or skip.

```bash
gh api repos/OWNER/REPO/pulls/PULL_NUMBER/comments \
-f body="@coderabbitai ..." \
-F in_reply_to=COMMENT_ID
```
</reply>

<resolve>
Resolve thread:

```bash
gh api graphql -f query='{
repository(owner: "OWNER", name: "REPO") {
pullRequest(number: PULL_NUMBER) {
reviewThreads(first: 50) {
nodes {
id
comments(first: 1) { nodes { databaseId } }
}
}
}
}
}' --jq '.data.repository.pullRequest.reviewThreads.nodes[]
| select(.comments.nodes[0].databaseId == COMMENT_ID) | .id' \
| xargs -I{} gh api graphql -f query='mutation {
resolveReviewThread(input: { threadId: "{}" }) {
thread { isResolved }
}
}' --jq '.data.resolveReviewThread.thread.isResolved'
```
</resolve>

## 5. Wrap-up

Clean up: `rm x_coderabbit_COMMENT_ID.md`

Never reply to a CodeRabbit comment unless confirmed by the user.
State final summary, in 4-10 words and emoji.
4 changes: 1 addition & 3 deletions .claude/commands/commit.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,10 @@ Additional user instructions: $ARGUMENTS
[main_prefix]: [brief main summary in imperative mood]

[Section heading]:

- [Significant changes and impact over minor details]
- [Write for someone reading this git log in 6 months]

[Additional section (for multi-concern commits)]:

- [etc.]

[2-3 terse sentences of why / benefit / impact]
Expand All @@ -46,7 +44,7 @@ Additional user instructions: $ARGUMENTS
- `refactor:` code changes that neither fix bugs nor add features
- `style:` code formatting, visual consistency, linting fixes; no functional change
- `chore:` dev workflow, workspace config, dependency updates, dev tools e.g. `.vscode/**/*`, `pyproject.toml`, `.gitignore`
- `docs:` documentation changes only e.g. `README.md`, `docs/**/*.md`, `x_docs/**/*.md`
- `docs:` documentation changes only e.g. `README.md`, `docs/**/*`, `x_docs/**/*`, `.xdocs/**/*`
- `feat:` new feature for users (adds functionality)
</main_prefix>

Expand Down
99 changes: 43 additions & 56 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,22 +1,51 @@
{
"extraKnownMarketplaces": {
"playwright-skill": {
"source": {
"source": "github",
"repo": "lackeyjb/playwright-skill"
}
}
},
"$schema": "https://json.schemastore.org/claude-code-settings.json",

"permissions": {
"deny": ["Read(**/.env)", "Read(**/.envrc)"],
"ask": [],

"allow": [
"mcp__ide__getDiagnostics",

"Bash(claude mcp get:*)",
"Bash(cat *)",
"Bash(claude mcp get *)",
"Bash(claude mcp list)",

"Bash(echo *)",
"Bash(find *)",
"Bash(gh pr checks *)",
"Bash(gh pr list *)",
"Bash(gh run list *)",
"Bash(gh run view *)",
"Bash(git log *)",
"Bash(ls *)",
"Bash(lsof *)",
"Bash(npm outdated)",
"Bash(npm run build)",
"Bash(npm run check)",
"Bash(npm run dev)",
"Bash(npm run lint)",
"Bash(npm run lint:md *)",
"Bash(npm run start)",
"Bash(npm run test)",
"Bash(npm run test:e2e *)",
"Bash(npm run test:unit *)",
"Bash(npm run typecheck)",
"Bash(npx @biomejs/biome *)",
"Bash(npx lefthook *)",
"Bash(npx playwright *)",
"Bash(npx vercel *)",
"Bash(sed *)",
"Bash(tree *)",
"Bash(vercel --help)",
"Bash(vercel env --help)",
"Bash(vercel env ls *)",
"Bash(vercel git --help)",
"Bash(vercel integration --help)",
"Bash(vercel list *)",
"Bash(vercel open)",
"Bash(vercel project ls *)",
"Bash(vercel whoami)",
"Bash(wc *)",
"Bash(xargs *)",
"mcp__ide__getDiagnostics",
"mcp__playwright__browser_click",
"mcp__playwright__browser_close",
"mcp__playwright__browser_console_messages",
Expand All @@ -29,49 +58,7 @@
"mcp__playwright__browser_snapshot",
"mcp__playwright__browser_tabs",
"mcp__playwright__browser_take_screenshot",
"mcp__playwright__browser_wait_for",

"Bash(cat:*)",
"Bash(echo:*)",
"Bash(find:*)",
"Bash(lsof:*)",
"Bash(ls:*)",
"Bash(sed:*)",
"Bash(tree:*)",
"Bash(wc:*)",
"Bash(xargs:*)",

"Bash(git log:*)",
"Bash(gh pr checks:*)",
"Bash(gh pr list:*)",
"Bash(gh run list:*)",
"Bash(gh run view:*)",

"Bash(npm outdated)",
"Bash(npm run build)",
"Bash(npm run dev)",
"Bash(npm run start)",
"Bash(npm run check)",
"Bash(npm run lint)",
"Bash(npm run lint:md:*)",
"Bash(npm run test)",
"Bash(npm run test:e2e:*)",
"Bash(npm run test:unit:*)",
"Bash(npm run typecheck)",
"Bash(npx @biomejs/biome:*)",
"Bash(npx lefthook:*)",
"Bash(npx playwright:*)",

"Bash(npx vercel:*)",
"Bash(vercel --help)",
"Bash(vercel env --help)",
"Bash(vercel env ls:*)",
"Bash(vercel git --help)",
"Bash(vercel integration --help)",
"Bash(vercel list:*)",
"Bash(vercel open)",
"Bash(vercel project ls:*)",
"Bash(vercel whoami)"
"mcp__playwright__browser_wait_for"
]
}
}
17 changes: 17 additions & 0 deletions .markdownlint-cli2.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Configuration for markdownlint-cli2 and VSCode/Cursor extension
# Extension: davidanson.vscode-markdownlint

ignores:
- "node_modules/**"

# Disable only the rules that interfere with practical markdown writing
config:
MD013: false # Line length (inappropriate for markdown)
MD024: false # Allow duplicate headings ("### Example", "### Example")
MD033: false # Allow inline HTML (<details>, <tags>, etc.)
MD036: false # Allow emphasis (bold/italic) without treating it as heading
MD040: false # Fenced code blocks don't need language specified
MD028: false # Allow blank lines between blockquotes (attributed quotes)
MD041: false # First line doesn't need to be h1
MD060: false # Table column style (compact tables are fine)
MD032: false # Lists in templates don't need surrounding blank lines
11 changes: 0 additions & 11 deletions .markdownlint.yaml

This file was deleted.

1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"files.exclude": {
"**/.next": true, // Hide Next.js build output
"**/node_modules": true, // Hide npm installed dependencies
"**/.ruff_cache": true, // Hide Ruff linter cache
"next-env.d.ts": true, // Hide Next.js file (uneditable)
"tsconfig.tsbuildinfo": true // Hide TypeScript build info file
},
Expand Down
File renamed without changes
Binary file added .xdocs/images/nextjs-hero.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .xdocs/images/rough-notes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes.
Loading
Loading