hosts/claude/host.psd1

@{
    # Identity
    Kind          = 'claude'
    DisplayName   = 'Claude Code CLI'
    Status        = 'supported'
    SchemaVersion = 1
    MenuPriority  = 1  # Highest priority in interactive host-selection menu (iter-011)

    # Binary detection
    Binary           = 'claude'
    InstallUrl       = 'https://docs.anthropic.com/en/docs/claude-code/installation'
    InstallGuidance  = 'Claude Code CLI not found on PATH. Install: https://docs.anthropic.com/en/docs/claude-code/installation'

    # Runtime layout
    SkillRoot                  = '.claude/skills'
    HasUserSlashCommandSurface = $true
    SettingsPath               = '.claude/settings.json'
    AgentDir                   = '.claude/agents/'
    InstructionsFile           = 'CLAUDE.md'
    StructuredQuestionPrimitive = 'AskUserQuestion'
    StructuredQuestionGuidance  = 'Use Claude Code AskUserQuestion for human approval gates when it is available in the current session.'

    # Spec-kit + Squad coupling
    SpeckitAiFlag  = 'claude'
    PreferredAgent = 'claude'

    # Phase B handler file (not yet present)
    HandlersFile         = 'handlers.ps1'
    CoordinatorRulesFile = 'coordinator-rules.psd1'

    # Feature 171 (FR-013): refocus hook-binding declaration. Claude has the full
    # documented hook surface; it binds B1 + B2 via SessionStart (see BoundTriggers
    # below), and B3 is delivered via channel 1 (the boundary-sync wrapper stdout),
    # not a hook — so BoundTriggers is @('b1','b2') by design (TG-004a). Consumed by
    # scripts/internal/deploy-refocus-hooks.ps1; deploys to the PER-USER
    # project-local settings file (C6 decision: never the shared settings.json,
    # so cloning a repo can never import auto-executing hooks).
    # NOTE: PreToolUse is deliberately ABSENT — the gate seat is dormant until
    # the first gate-kind provider row exists (F-165 coordination).
    # NOTE: PostToolUse is UNREGISTERED per TG-004 option (a), approved at the
    # iteration-001 review-signoff (measured ~920ms/call vs the 150ms bar; pwsh
    # spawn structural). B3 rides channel 1 (boundary-sync wrapper stdout) on
    # every host; iteration 002 re-evaluates (UserPromptSubmit / engine inlining).
    RefocusHookBindings = @{
        BoundTriggers       = @('b1', 'b2')   # b3 via channel 1 (TG-004 option a)
        Events              = @('SessionStart')
        SettingsFile        = '.claude/settings.local.json'
        OptOutMarkerFile    = '.specrew/runtime/refocus-hooks-optout'
        DispatcherPath      = '.specify/extensions/specrew-speckit/scripts/specrew-hook-dispatcher.ps1'
        ConfigShape         = 'event-map'
        CommandMode         = 'project-placeholder'
        ProjectDirPlaceholder = '${CLAUDE_PROJECT_DIR}'
        ProjectRootEnvironmentVariables = @('CLAUDE_PROJECT_DIR')
        DispatcherRuntime   = @{
            BootstrapDeliveryEvents = @('SessionStart')
            B3DeliveryEvents        = @('PostToolUse', 'UserPromptSubmit')
            RefocusTriggerByEvent   = @{ PostToolUse = 'b3'; UserPromptSubmit = 'b3' }
            SuppressedRefocusEvents = @()
            OutputShape             = 'plain-or-hookSpecificOutput'
            DecisionOnlyEvents      = @()
            BootstrapDeliveryMode   = 'pointer'
        }
        Registrations       = @(
            @{ Event = 'SessionStart'; DispatcherEvent = 'SessionStart'; HandlerShape = 'hooks-array' },
            @{ Event = 'Stop'; DispatcherEvent = 'Stop'; HandlerShape = 'hooks-array' },
            @{ Event = 'PostToolUse'; DispatcherEvent = 'PostToolUse'; HandlerShape = 'hooks-array' }
        )
    }
}