Skip to content

[BUG] Cowork: Plugin hooks from hooks/hooks.json never fire — --setting-sources user excludes plugin scope #27398

@Ejb503

Description

@Ejb503

Preflight Checklist

  • I have searched existing issues and this hasn't been reported yet
  • This is a single bug report (please file separate reports for different bugs)
  • I am using the latest version of Claude Code

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

  1. Add a marketplace that contains plugins with hooks (e.g. a marketplace URL from systemprompt.io)
  2. Install a plugin from that marketplace that defines hooks/hooks.json at the plugin root
  3. Start a new Cowork session
  4. Interact with the session to trigger hook events (e.g. SessionStart, UserPromptSubmit, PostToolUse)
  5. Observe that skills from the same plugin work, but hooks never fire
  6. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    duplicateThis issue or pull request already exists

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions