Anthropic renamed function hooks to "Claude Mods", committed to shipping them in
weeks and published the built-in mods' source plus the full TypeScript
declarations (anthropics/claude-code#91870, mods/ in the claude-code repo).
This aligns our component type with that.
Rename
- Component type `function-hooks` -> `mods` (dir, catalog key, route /mods,
CLI `--mod` with `--function-hook` kept as a hidden alias, tracking `mod`).
Old URLs redirect via dashboard/public/_redirects.
- Banners, blog, CLAUDE.md and .claude/rules updated from "proposal" to
"early access behind CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 (2.1.259+)".
Format: one directory = one complete plugin (Anthropic's mods/ layout)
- cli-tool/components/mods/{category}/{name}/ with .claude-plugin/plugin.json
(name, description, userConfig), hooks/hooks.json, hooks/** (any number of
files, relative imports), optional types/, tests/, README.md.
- Generator: README.md is the content; every text file ships in the
per-component content file (`files`), plus `modules` and `userConfig`.
- CLI: recursive download of the plugin directory (like skills), written
verbatim to .claude/skills/{name}/; validates manifest + hooks.json + modules.
- Site: SkillExplorer generalized (componentType, mainFile, files) so the
detail page shows README + the full file tree from the content file;
SendToRepoModal writes the whole plugin.
Modules rewritten against the real API
- types/claude-code.d.ts (as /plugin-types writes it, 2.1.271), tsconfig and
a CI job (mods-typecheck.yml) running tsc over every mod.
- All 10 existing mods fixed to the shipped shapes ($.fs.read(path),
$.http.fetch(url, init), $.ui.ask, { refuse } on plugin.register, Box/Text
elements, {result}/{deny}/context, static engine.create withholding) and
verified on Claude Code 2.1.272: claude plugin validate passes on all, and
deny / modifying / after / cache / audit / withhold+refuse were exercised
end to end with `claude -p --plugin-dir --debug-file`.
- Options need `userConfig` in plugin.json and are read from user/managed
settings (pluginConfigs[name].options), never project settings; documented.
Games
- games/cc-arcade vendored as-is (MIT, Seza Akgün) with two runtime fixes
($.clock.now() is a Promise in the 2.1.271 API).
- games/{snake,tetris,2048,minesweeper,flappy,pong,invaders,typing-test,
doom,pet}: each cc-arcade game as its own installable mod with its own
command (/tetris, /snake, ...), attributed to the original author.
- games/{pacman,tool-defense,diff-invaders}: new, written for aitmpl.
Pac-Man with the original ghost behaviours; Tool Defense, a tower defense
where every tool call Claude makes is an enemy; Diff Invaders, where every
Edit/Write's added lines become the alien formation. Pure logic with bun
tests, surface-module boards, typechecked and validated.
Catalog regenerated (24 mods).
The skill's "code the user will execute" exemption was blanket: it
suppressed the discernment nudge for any code the user would run,
including scripts that delete data, expose secrets, or change
production state, where merely running the code doesn't verify those
risks.
Restrict the exemption to trivial, local, reversible code, and keep
nudging code that affects production, external systems, security, or
data.
Addresses a cubic-dev-ai review finding (P1, confidence 8/10) on PR
#898 that landed after the PR was merged, so following up here rather
than reopening the merged PR.
Claude-Session: https://claude.ai/code/session_012T1LgFb24v87ZAUk9RjP6C
Co-authored-by: Claude <noreply@anthropic.com>
* feat: Sync new skills from anthropics/skills
Migrated from github.com/anthropics/skills (Apache 2.0):
- Add `academy-guide` (productivity) - recommends matching Claude Academy
courses/tutorials for "how do I use Claude" style questions
- Add `discernment-nudge` (productivity) - prompts 2-3 follow-up questions
after substantive answers to help users check facts/reasoning before acting
- Refresh `frontend-design` (creative-design) SKILL.md with the newer,
more detailed upstream guidance on aesthetic direction and self-critique
- Fix placeholder copyright line in `web-artifacts-builder` LICENSE.txt to
match upstream ("Copyright 2026 Anthropic, PBC.")
All other skills already present locally were compared against upstream
and left untouched: several (docx, pptx, xlsx, mcp-builder, skill-creator,
claude-api) have local customizations beyond the upstream reference
versions, and the rest (algorithmic-art, brand-guidelines, canvas-design,
internal-comms, theme-factory, slack-gif-creator, webapp-testing,
doc-coauthoring, web-artifacts-builder) are unchanged from upstream.
Regenerated the component catalog (docs/components.json,
dashboard/public/components.json and split artifacts) via
scripts/generate_components_json.py, which also refreshed live download
counts from Supabase.
Validated with the component-reviewer agent: no critical issues.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012T1LgFb24v87ZAUk9RjP6C
* chore: regenerate catalog after merging main
Claude-Session: https://claude.ai/code/session_01JVP5nv7a7bMkwvy67LgtPF
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat: add worktree-context-statusline setting
Minimal worktree-aware status line: project | branch | model | context.
Shows the main project name (not the worktree dir) inside linked
worktrees, marks the branch with ⑂, and reads accurate context usage
from Claude Code's context_window (200k or 1M) instead of guessing.
Regenerates the component catalog.
Claude-Session: https://claude.ai/code/session_01QHCvqCvD9JD9J6ZeAK8NS7
* fix(cli): make statusline script paths scope-aware
- Detect the companion .py from the statusLine command, not only the statusline/ name prefix
- For user/enterprise installs, rewrite .claude/scripts/ in the command to the absolute scripts dir where the file is actually written
Claude-Session: https://claude.ai/code/session_01WsWgpvgeJgRMoLiYDcRXMU
* feat: add Function Hooks component type (experimental) with 10 hooks and blog
Introduce "function-hooks" as a new first-class component type based on
the Anthropic proposal in anthropics/claude-code#91870 (TypeScript hooks
as Koa-style middleware on a $ engine interface). The feature is not
shipped; every API name is provisional and the section is labelled
experimental everywhere.
- 10 function hooks under cli-tool/components/function-hooks/
(security, productivity, observability, ui, integrations, enterprise),
each as a .md doc page plus the installable .ts/.tsx hooks-module
- CLI: --function-hook installs the module as a local plugin under
.claude/plugins/<name>/ (plugin.json, hooks/hooks.json with modules)
and prints the experimental warning
- Catalog generator: scan function-hooks and emit dashboard artifacts
- Dashboard: type wiring, /function-hooks page with experimental banner
linking to the issue, Events/Module cards on the detail page,
sitemap, cart, webmcp; track-download now accepts loop/function-hook
- Blog: "Claude Code Function Hooks (Experimental)" article with cover
- Docs: CLAUDE.md and cli-tool rule
Claude-Session: https://claude.ai/code/session_01YBoJbmNMcRCexuKpH9mQtW
* fix: store function hooks as hooks.json + module, install as skills-dir plugin
Function hooks are not markdown docs. Per the proposal's architecture doc,
a function hook is a plugin's hooks/hooks.json with a "modules" key naming
a .ts/.tsx hooks-module beside it. Align the catalog and the CLI with that:
- Components are now {name}.json (hooks.json + catalog description) plus
the {name}.ts/.tsx module it names, mirroring how shell hooks store
.json + .py/.sh. The .md docs are removed.
- Generator reads the named module into the per-component content file
(module, moduleSource); the detail page renders the JSON and the module
with the experimental notice.
- CLI --function-hook downloads hooks.json and every module it names,
strips description, and writes the plugin to .claude/skills/{name}/,
which Claude Code auto-loads as {name}@skills-dir per the plugins
reference (no --plugin-dir needed).
- Docs and blog updated to the same install path.
Claude-Session: https://claude.ai/code/session_01YBoJbmNMcRCexuKpH9mQtW
* fix(function-hooks): address review findings
- CartSidebar: add --loop and --function-hook to TYPE_FLAGS so stack commands install them
- SendToRepoModal: export loops and function hooks (plugin layout with hooks.json + module)
- CLI: validate function hook identifier and hooks-module file names before building URLs/paths
- block-destructive-commands: rm rule now catches split flags, --recursive, quoted/trailing-slash targets, --no-preserve-root
- admin-capability-lockdown: shellPolicy deny|guardrail|allow; default withholds Bash, guardrail is labelled bypassable
- regenerate catalog
Claude-Session: https://claude.ai/code/session_01WsWgpvgeJgRMoLiYDcRXMU