Skip to content
Automation
Hook

Hooks

What totally-integrated-claude runs automatically, and when. A hook is a command Claude Code fires at a fixed moment, without you asking for it.

From plugin
totally-integrated-claude
6219 skills1 hook1 MCP
Install
> /plugin marketplace add Czarnak/totally-integrated-claude
> /plugin install totally-integrated-claude@totally-integrated-claude

Ships with totally-integrated-claude. Installing the plugin gets these hooks.

What fires, and when

PreToolUse

  • Matchesmcp__tia-portal__.*powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${CLAUDE_PLUGIN_ROOT}\hooks\tia-write-guard.ps1"
Read hooks/hooks.json

Where it lives

  • hooks/tia-write-guard.ps1RunsGitHub
    Read the script
    $ErrorActionPreference = "Stop"
    
    function Write-Allow {
        $response = @{
            decision = "allow"
            suppressOutput = $true
            hookSpecificOutput = @{
                hookEventName = "PreToolUse"
                permissionDecision = "allow"
            }
        }
        $response | ConvertTo-Json -Depth 10 -Compress
        exit 0
    }
    
    function Write-Deny {
        param([string] $Reason)
    
        $response = @{
            decision = "deny"
            reason = $Reason
            suppressOutput = $true
            hookSpecificOutput = @{
                hookEventName = "PreToolUse"
                permissionDecision = "deny"
                permissionDecisionReason = $Reason
            }
        }
        $response | ConvertTo-Json -Depth 10 -Compress
        exit 0
    }
    
    function Get-JsonProperty {
        param(
            [object] $Object,
            [string[]] $Names
        )
    
        if ($null -eq $Object) {
            return $null
        }
    
        foreach ($name in $Names) {
            $property = $Object.PSObject.Properties[$name]
            if ($null -ne $property) {
                return $property.Value
            }
        }
    
        return $null
    }
    
    $rawInput = [Console]::In.ReadToEnd()
    if ([string]::IsNullOrWhiteSpace($rawInput)) {
        Write-Allow
    }
    
    try {
        $hookInput = $rawInput | ConvertFrom-Json
    } catch {
        Write-Deny "TIA Portal write guard could not parse Claude Code hook input as JSON."
    }
    
    $toolName = [string](Get-JsonProperty -Object $hookInput -Names @("tool_name", "toolName"))
    if ([string]::IsNullOrWhiteSpace($toolName)) {
        Write-Allow
    }
    
    $previewByWriteTool = @{
        "mcp__tia-portal__update_block_logic" = "preview_update_block_logic"
        "mcp__tia-portal__create_tag_table" = "preview_create_tag_table"
        "mcp__tia-portal__delete_tag_table" = "preview_delete_tag_table"
        "mcp__tia-portal__create_tag" = "preview_create_tag"
        "mcp__tia-portal__update_tag" = "preview_update_tag"
        "mcp__tia-portal__delete_tag" = "preview_delete_tag"
        "mcp__tia-portal__create_user_constant" = "preview_create_user_constant"
        "mcp__tia-portal__update_user_constant" = "preview_update_user_constant"
        "mcp__tia-portal__delete_user_constant" = "preview_delete_user_constant"
        "mcp__tia-portal__add_network_device" = "preview_add_network_device"
        "mcp__tia-portal__configure_network_device" = "preview_configure_network_device"
        "mcp__tia-portal__open_project" = "preview_open_project"
        "mcp__tia-portal__create_project" = "preview_create_project"
        "mcp__tia-portal__save_project" = "preview_save_project"
        "mcp__tia-portal__save_project_as" = "preview_save_project_as"
        "mcp__tia-portal__archive_project" = "preview_archive_project"
        "mcp__tia-portal__close_project" = "preview_close_project"
        "mcp_tia-portal_update_block_logic" = "preview_update_block_logic"
        "mcp_tia-portal_create_tag_table" = "preview_create_tag_table"
        "mcp_tia-portal_delete_tag_table" = "preview_delete_tag_table"
        "mcp_tia-portal_create_tag" = "preview_create_tag"
        "mcp_tia-portal_update_tag" = "preview_update_tag"
        "mcp_tia-portal_delete_tag" = "preview_delete_tag"
        "mcp_tia-portal_create_user_constant" = "preview_create_user_constant"
        "mcp_tia-portal_update_user_constant" = "preview_update_user_constant"
        "mcp_tia-portal_delete_user_constant" = "preview_delete_user_constant"
        "mcp_tia-portal_add_network_device" = "preview_add_network_device"
        "mcp_tia-portal_configure_network_device" = "preview_configure_network_device"
        "mcp_tia-portal_open_project" = "preview_open_project"
        "mcp_tia-portal_create_project" = "preview_create_project"
        "mcp_tia-portal_save_project" = "preview_save_project"
        "mcp_tia-portal_save_project_as" = "preview_save_project_as"
        "mcp_tia-portal_archive_project" = "preview_archive_project"
        "mcp_tia-portal_close_project" = "preview_close_project"
    }
    
    if (-not $previewByWriteTool.ContainsKey($toolName)) {
        Write-Allow
    }
    
    $toolInput = Get-JsonProperty -Object $hookInput -Names @("tool_input", "toolInput")
    if ($null -eq $toolInput) {
        Write-Deny "TIA Portal write '$toolName' blocked: missing tool_input. Call $($previewByWriteTool[$toolName]) first, then retry with confirm=true and safetyToken."
    }
    
    $confirmProperty = $toolInput.PSObject.Properties["confirm"]
    if ($null -eq $confirmProperty -or $confirmProperty.Value -ne $true) {
        Write-Deny "TIA Portal write '$toolName' blocked: confirm=true is required."
    }
    
    $tokenProperty = $toolInput.PSObject.Properties["safetyToken"]
    if ($null -eq $tokenProperty -or [string]::IsNullOrWhiteSpace([string]$tokenProperty.Value)) {
        Write-Deny "TIA Portal write '$toolName' blocked: safetyToken is required. Call $($previewByWriteTool[$toolName]) first and pass the returned token."
    }
    
    Write-Allow
    

Read the script before you install anything that runs on your machine. This is the one part of a plugin that acts without being asked.

Ships withtotally-integrated-claude

A Claude Code plugin for Siemens TIA Portal engineering automation. Provides a routed skill framework for TIA Portal engineering automation: Siemens TIA Scripting Python V1.4.3 for its supported wrapper surface, audited C# Openness skills for advanced

Get the whole plugin
Stats
62
Stars
11
Forks
Maintained
Maintenance
PowerShell
Language
MIT
License
1mo ago
Last commit
5mo ago
Created

Repo: Czarnak/totally-integrated-claude