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
11 changes: 7 additions & 4 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin.json",
"name": "claude-code-template",
"version": "0.2.0",
"description": "A comprehensive Claude Code starter template: devcontainer, commands, skills, subagents, plugin scaffolding, hooks, MCP, CI/CD, and SDK examples.",
"version": "0.3.0",
"description": "A comprehensive Claude Code starter template: devcontainer, commands, skills, subagents, plugin scaffolding, hooks, themes, MCP, CI/CD, and SDK examples.",
"author": {
"name": "Scott Havird",
"url": "https://github.com/scotthavird"
Expand All @@ -17,7 +17,8 @@
"starter",
"hooks",
"skills",
"subagents"
"subagents",
"themes"
],
"components": {
"commands": ".claude/commands",
Expand All @@ -26,6 +27,8 @@
"hooks": ".claude/settings.json",
"outputStyles": ".claude/output-styles",
"statusLine": ".claude/statusline/statusline.sh",
"mcpServers": ".mcp.json"
"mcpServers": ".mcp.json",
"themes": ".claude/themes",
"bin": "bin"
}
}
7 changes: 7 additions & 0 deletions .claude/agents/dependency-auditor.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@ name: dependency-auditor
description: Audits project dependencies for CVEs, deprecated packages, license risks, and drift from lockfiles. Use before releases or when the user asks "are my deps safe?".
tools: Bash, Read, Grep, Glob
model: sonnet
permissionMode: plan
mcpServers:
- fetch
hooks:
PostToolUse:
- matcher: Bash
command: bash scripts/log-hook-event.sh
---

You audit third-party dependencies for risk. You run the native audit
Expand Down
42 changes: 39 additions & 3 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,23 @@
]
},

"sandbox": {
"network": {
"deniedDomains": [
"metadata.google.internal",
"169.254.169.254"
]
}
},

"statusLine": {
"type": "command",
"command": ".claude/statusline/statusline.sh"
"command": ".claude/statusline/statusline.sh",
"refreshInterval": 5
},

"prUrlTemplate": "https://github.com/{owner}/{repo}/pull/{number}",

"hooks": {
"SessionStart": [
{
Expand Down Expand Up @@ -80,6 +92,7 @@
},
{
"matcher": "Bash",
"if": "Bash(*)",
"hooks": [
{
"type": "command",
Expand All @@ -97,7 +110,7 @@
{
"type": "command",
"command": "bash scripts/log-hook-event.sh",
"description": "Log PostToolUse events"
"description": "Log PostToolUse events (now includes duration_ms)"
}
]
},
Expand All @@ -110,6 +123,29 @@
"description": "Run formatter on edited files"
}
]
},
{
"matcher": "Bash|Read|Grep",
"hooks": [
{
"type": "command",
"command": "bash scripts/hooks/redact-secrets.sh",
"description": "Redact secret-shaped strings from tool output before the model sees it"
}
]
}
],

"PreCompact": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash scripts/hooks/pre-compact.sh",
"description": "Save a checkpoint before compaction drops context"
}
]
}
],

Expand Down Expand Up @@ -151,7 +187,7 @@
{
"type": "command",
"command": "bash scripts/hooks/session-cost.sh",
"description": "Surface session cost summary"
"description": "Surface session cost summary plus per-tool timing"
}
]
}
Expand Down
32 changes: 29 additions & 3 deletions .claude/settings.local.json.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@
"// INSTRUCTIONS": "Copy this file to .claude/settings.local.json and customize. It is gitignored.",

"// MODEL": "Override the default model per session. Omit to inherit global/default.",
"model": "claude-sonnet-4-6",
"model": "claude-opus-4-7",

"// PERMISSION_MODE": "default | acceptEdits | plan | bypassPermissions",
"// EFFORT": "Default effort level. Recommended: xhigh on Opus 4.7 for coding work.",
"// effort": "xhigh",

"// PERMISSION_MODE": "default | acceptEdits | plan | bypassPermissions | auto",
"permissions": {
"defaultMode": "default",
"allow": [
Expand All @@ -14,19 +17,42 @@
]
},

"// AUTO_MODE": "Optional opt-in to auto mode (v2.1.111+). A classifier handles permission prompts so safe actions run without interruption and risky ones are blocked. Use $defaults to extend the built-in lists rather than replace them.",
"// autoMode": {
"// allow": ["$defaults", "Bash(my-internal-tool:*)"],
"// soft_deny": ["$defaults"],
"// environment": ["$defaults"]
},

"// ADDITIONAL_DIRS": "Let Claude also read code outside the repo (monorepos, shared libs).",
"additionalDirectories": [
"~/src/shared-libs",
"~/src/design-system"
],

"// ENV": "API keys and provider selection. See https://code.claude.com/docs/en/env-vars",
"// ENV": "API keys, provider selection, and feature toggles. See https://code.claude.com/docs/en/env-vars",
"env": {
"ANTHROPIC_API_KEY": "sk-ant-api-...",

"// CACHING": "1-hour prompt cache TTL (v2.1.108+). Default is 5 minutes.",
"// ENABLE_PROMPT_CACHING_1H": "1",

"// RENDERING": "Flicker-free fullscreen rendering (v2.1.89+).",
"// CLAUDE_CODE_NO_FLICKER": "1",

"// PRIVACY": "Hide working directory in startup logo (v2.1.119+).",
"// CLAUDE_CODE_HIDE_CWD": "1",

"// SUBAGENTS": "Enable forked subagents on external builds (v2.1.117+).",
"// CLAUDE_CODE_FORK_SUBAGENT": "1",

"// UPDATES": "Block all update paths including manual `claude update` (v2.1.118+).",
"// DISABLE_UPDATES": "1",

"// BEDROCK": "Uncomment to route through Amazon Bedrock instead of the Anthropic API.",
"// CLAUDE_CODE_USE_BEDROCK": "1",
"// AWS_REGION": "us-west-2",
"// ANTHROPIC_BEDROCK_SERVICE_TIER": "priority",

"// VERTEX": "Uncomment to route through Google Vertex AI.",
"// CLAUDE_CODE_USE_VERTEX": "1",
Expand Down
55 changes: 55 additions & 0 deletions .claude/skills/effort-aware/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
name: effort-aware
description: Demonstrates branching skill behavior on the current effort level using ${CLAUDE_EFFORT} (Claude Code v2.1.120+). Activates when discussing how to scope work across effort levels.
allowed-tools: Read, Grep, Glob
---

# Effort-Aware Skill

Demonstrates how a skill can adapt its instructions to the current effort
level. Claude Code injects `${CLAUDE_EFFORT}` into skill text at load
time (v2.1.120+), so the same skill can give terse advice on `low` and
exhaustive advice on `xhigh` without needing separate skills.

## Current effort: `${CLAUDE_EFFORT}`

### Guidance for this effort level

**If `${CLAUDE_EFFORT}` is `low` or `medium`:**
- Make the smallest correct change. Don't refactor surrounding code.
- Skip exploring alternatives — pick the obvious path.
- One pass, no self-review beyond a re-read.
- Don't write tests for trivial changes (one-liner config, doc fix).

**If `${CLAUDE_EFFORT}` is `high`:**
- Sketch 2–3 approaches before picking one. Note the tradeoffs in your
response.
- Add tests for new behavior.
- Self-review the diff before reporting done.

**If `${CLAUDE_EFFORT}` is `xhigh` or `max`:**
- Map invariants the change must preserve. Read enough surrounding code
to be confident.
- Build a sequence of small, reversible commits if the change is large.
- Tests cover happy path, error path, and at least two boundary cases.
- Run a `pr-reviewer` self-review pass before reporting done.
- Note follow-ups (debt, deferred work) explicitly so the human can
triage.

## Why this exists

Older Claude Code versions had no way for skills to adapt their tone to
the user's effort setting. You either had to write conservatively (and
under-deliver on `xhigh`) or aggressively (and over-engineer on `low`).
Effort interpolation closes that gap.

## When this skill activates

When the user discusses scoping, planning a change, or asks how
thoroughly to do something. The skill helps you calibrate effort to
match `${CLAUDE_EFFORT}` rather than picking a single fixed default.

## See also

- `/effort` slash command — interactive slider to change effort mid-session.
- [Effort levels in the official docs](https://code.claude.com/docs/en/model-config).
14 changes: 14 additions & 0 deletions .claude/themes/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Themes

Custom themes shipped with this template. Switch with `/theme` from
inside a session, or set the default in `~/.claude/settings.json`.

| Theme | Notes |
|---|---|
| `anthropic-clay` | Warm, low-contrast. Auto-adapts to light/dark terminal background. |

Plugins can ship themes via a `themes/` directory at the plugin root.
This template's `.claude-plugin/plugin.json` registers `themes:` so any
JSON file dropped here is picked up.

See [official themes docs](https://code.claude.com/docs/en/settings#themes).
25 changes: 25 additions & 0 deletions .claude/themes/anthropic-clay.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"$schema": "https://json.schemastore.org/claude-code-theme.json",
"name": "anthropic-clay",
"displayName": "Anthropic Clay",
"description": "A warm, low-contrast theme inspired by Anthropic's clay/slate palette. Pairs well with light or dark terminals — the accent colors stay legible against either.",
"type": "auto",
"colors": {
"accent": "#d97757",
"accentMuted": "#c6613f",
"background": null,
"foreground": null,
"secondary": "#73726c",
"muted": "#91908a",
"success": "#22c55e",
"warning": "#eab308",
"error": "#dc2626",
"info": "#3b82f6",
"diffAdded": "#22c55e",
"diffRemoved": "#dc2626",
"diffContext": "#73726c",
"promptBorder": "#d97757",
"selectionBackground": "#d97757",
"selectionForeground": "#ffffff"
}
}
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ logs/
# Local Claude settings (may contain sensitive data)
.claude/settings.local.json

# Claude Code runtime state
.claude/scheduled_tasks.lock
.claude/checkpoints/
.claude/*.lock

# Node modules and dependencies
node_modules/
npm-debug.log*
Expand Down
18 changes: 10 additions & 8 deletions .mcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,27 @@
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "."],
"description": "Sandboxed filesystem access rooted at the project directory"
"alwaysLoad": true,
"description": "Sandboxed filesystem access rooted at the project directory. alwaysLoad=true so its tools skip tool-search deferral."
},
"memory": {
"git": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"],
"description": "Persistent knowledge graph memory across sessions"
"args": ["-y", "@modelcontextprotocol/server-git", "--repository", "."],
"alwaysLoad": true,
"description": "Git operations (log, diff, blame, show) via MCP."
},
"git": {
"memory": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-git", "--repository", "."],
"description": "Git operations (log, diff, blame, show) via MCP"
"args": ["-y", "@modelcontextprotocol/server-memory"],
"description": "Persistent knowledge graph memory across sessions."
},
"fetch": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-fetch"],
"description": "Fetch and convert web content to markdown"
"description": "Fetch and convert web content to markdown."
}
}
}
Loading
Loading