Preflight Checklist
What's Wrong?
Plugin hooks defined in hooks/hooks.json are never discovered or fired in Cowork Desktop sessions. Skills, commands, and MCP servers from the same plugin load and work correctly.
The Cowork VM host spawns the Claude CLI process with --setting-sources user, which restricts settings resolution to user-scope only. Plugin hooks discovered by convention from hooks/hooks.json are plugin-scoped, so they are silently excluded.
This affects all marketplace plugins with hooks in Cowork, not just a specific plugin.
What Should Happen?
Hooks defined in hooks/hooks.json at the plugin root should be auto-discovered and fired on matching events inside the Cowork VM, consistent with how Claude Code CLI behaves outside of Cowork.
Error Messages/Logs
Steps to Reproduce
Install Claude Desktop with Cowork enabled on Windows
Add a third-party marketplace via Cowork > Manage Plugins > Add Marketplace
Install a plugin from that marketplace that defines hooks/hooks.json at the plugin root (standard convention location)
Start a new Cowork session
Interact with the session to trigger hook events (e.g. SessionStart, UserPromptSubmit, PostToolUse)
Observe that skills from the same plugin work, but hooks never fire
Check %APPDATA%\Claude\logs\cowork_vm_node.log — the [Spawn:create] command shows --setting-sources user which excludes plugin-scoped hook discovery
Claude Model
None
Is this a regression?
No, this never worked
Last Working Version
No response
Claude Code Version
Cowork VM is running 2.1.49
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
Other
Additional Information
No errors are logged — hooks are silently skipped. The proof is in the spawn command from cowork_vm_node.log:
2026-02-21 11:41:51 [info] [Spawn:create] id=0976ba25-42a5-4edb-ab68-3d75539687cb
name=upbeat-zealous-goldberg
cmd=/usr/local/bin/claude
args=
--output-format stream-json
--verbose
--input-format stream-json
--model claude-opus-4-6
--permission-prompt-tool stdio
--setting-sources user <-- CAUSES HOOKS TO BE SKIPPED
--permission-mode default
--plugin-dir /sessions/upbeat-zealous-goldberg/mnt/.local-plugins/cache/systemprompt-marketplace/common-skills/1.0.0-d264998e6ded16c1
--plugin-dir /sessions/upbeat-zealous-goldberg/mnt/.local-plugins/cache/systemprompt-marketplace/marta-skills/1.0.0-90cecaa921de572e
Skills from --plugin-dir load because they're resolved from the directory directly. MCP servers load because they're passed explicitly via --mcp-config. But hooks/hooks.json is discovered during settings resolution, which respects --setting-sources user and excludes plugin scope.
Steps to Reproduce
- Add a marketplace that contains plugins with hooks (e.g. a marketplace URL from systemprompt.io)
- Install a plugin from that marketplace that defines
hooks/hooks.json at the plugin root
- Start a new Cowork session
- Interact with the session to trigger hook events (e.g.
SessionStart, UserPromptSubmit, PostToolUse)
- Observe that skills from the same plugin work, but hooks never fire
- Confirm by checking that the hook script's output log is never written
The plugin follows the exact same file structure convention as official Anthropic plugins (ralph-loop, security-guidance):
my-plugin/
.claude-plugin/plugin.json # No hooks field needed — convention-based discovery
hooks/hooks.json # Standard location, auto-discovered by CLI
skills/ # These work fine in Cowork
scripts/ # Hook scripts — never called in Cowork
Example hooks/hooks.json:
{
"hooks": {
"SessionStart": [{ "hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/my-hook.sh" }] }],
"PostToolUse": [{ "hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/my-hook.sh" }] }]
}
}
Claude Model
claude-opus-4-6
Is this a regression?
Unknown — hooks in Cowork marketplace plugins may have never worked on Windows, since Cowork for Windows launched Feb 10, 2026.
Claude Code Version
2.1.49 (inside Cowork VM), 2.1.45 (local CLI)
Platform
Anthropic (claude.ai Pro)
Operating System
Windows 11 Pro — Claude Desktop v1.1.3770 (Microsoft Store / MSIX)
Terminal/Shell
N/A (Cowork tab in Claude Desktop)
Additional Information
- Related issue: #18547 — same symptom (plugin hooks not firing) but in VSCode extension, different root cause
- Related issue: #24859 — Cowork Windows plugin skills searched at wrong path
- The same plugin's hooks work correctly in Claude Code CLI outside of Cowork
- Every spawn command in
cowork_vm_node.log includes --setting-sources user — this is hardcoded in the Cowork host code, not user-configurable
- Log path:
%APPDATA%\Claude\logs\cowork_vm_node.log
Preflight Checklist
What's Wrong?
Plugin hooks defined in
hooks/hooks.jsonare never discovered or fired in Cowork Desktop sessions. Skills, commands, and MCP servers from the same plugin load and work correctly.The Cowork VM host spawns the Claude CLI process with
--setting-sources user, which restricts settings resolution to user-scope only. Plugin hooks discovered by convention fromhooks/hooks.jsonare plugin-scoped, so they are silently excluded.This affects all marketplace plugins with hooks in Cowork, not just a specific plugin.
What Should Happen?
Hooks defined in
hooks/hooks.jsonat the plugin root should be auto-discovered and fired on matching events inside the Cowork VM, consistent with how Claude Code CLI behaves outside of Cowork.Error Messages/Logs
Steps to Reproduce
Install Claude Desktop with Cowork enabled on Windows
Add a third-party marketplace via Cowork > Manage Plugins > Add Marketplace
Install a plugin from that marketplace that defines hooks/hooks.json at the plugin root (standard convention location)
Start a new Cowork session
Interact with the session to trigger hook events (e.g. SessionStart, UserPromptSubmit, PostToolUse)
Observe that skills from the same plugin work, but hooks never fire
Check %APPDATA%\Claude\logs\cowork_vm_node.log — the [Spawn:create] command shows --setting-sources user which excludes plugin-scoped hook discovery
Claude Model
None
Is this a regression?
No, this never worked
Last Working Version
No response
Claude Code Version
Cowork VM is running 2.1.49
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
Other
Additional Information
No errors are logged — hooks are silently skipped. The proof is in the spawn command from
cowork_vm_node.log:Skills from
--plugin-dirload because they're resolved from the directory directly. MCP servers load because they're passed explicitly via--mcp-config. Buthooks/hooks.jsonis discovered during settings resolution, which respects--setting-sources userand excludes plugin scope.Steps to Reproduce
hooks/hooks.jsonat the plugin rootSessionStart,UserPromptSubmit,PostToolUse)The plugin follows the exact same file structure convention as official Anthropic plugins (
ralph-loop,security-guidance):Example
hooks/hooks.json:{ "hooks": { "SessionStart": [{ "hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/my-hook.sh" }] }], "PostToolUse": [{ "hooks": [{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/my-hook.sh" }] }] } }Claude Model
claude-opus-4-6
Is this a regression?
Unknown — hooks in Cowork marketplace plugins may have never worked on Windows, since Cowork for Windows launched Feb 10, 2026.
Claude Code Version
2.1.49 (inside Cowork VM), 2.1.45 (local CLI)
Platform
Anthropic (claude.ai Pro)
Operating System
Windows 11 Pro — Claude Desktop v1.1.3770 (Microsoft Store / MSIX)
Terminal/Shell
N/A (Cowork tab in Claude Desktop)
Additional Information
cowork_vm_node.logincludes--setting-sources user— this is hardcoded in the Cowork host code, not user-configurable%APPDATA%\Claude\logs\cowork_vm_node.log