Skip to content
Development
Hook

Hooks

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

From plugin
nunchi
81 skill2 commands3 hooks
Install
> /plugin marketplace add seob717/nunchi
> /plugin install nunchi@nunchi-marketplace

Ships with nunchi. Installing the plugin gets these hooks.

What fires, and when

PreToolUse

  • python3 "${CLAUDE_PLUGIN_ROOT}/hooks/pretooluse.py"

SessionStart

Fires once when a session begins, and again after a context compaction. It is where a plugin sets up its environment, or restores state the compaction dropped.

  • Matchescompactpython3 "${CLAUDE_PLUGIN_ROOT}/hooks/sessionstart.py"

InstructionsLoaded

  • python3 "${CLAUDE_PLUGIN_ROOT}/hooks/instructionsloaded.py"
Read hooks/hooks.json

In the plugin's words

How nunchi describes its own hook set.

nunchi — JIT rule delivery

Where it lives

  • hooks/instructionsloaded.pyRunsGitHub
    Read the script
    #!/usr/bin/env python3
    """nunchi InstructionsLoaded 엔트리포인트 — 세션 관측 기록 (#10).
    
    CLAUDE.md/.claude/rules가 컨텍스트에 로드될 때마다 발화하므로 모든 세션을
    잡는다. 세션당 1줄만 기록한다(record_session이 마커로 dedupe).
    어떤 실패도 exit 0. stdout은 컨텍스트에 주입되므로 절대 아무것도 쓰지 않는다.
    """
    
    import json
    import os
    import sys
    
    sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
    
    try:
        from core.engine import record_session
    
        input_data = json.load(sys.stdin)
        project_dir = (
            os.environ.get("CLAUDE_PROJECT_DIR") or input_data.get("cwd") or os.getcwd()
        )
        record_session(input_data, project_dir)
    except Exception as e:
        print(f"nunchi: instructionsloaded hook error: {e}", file=sys.stderr)
    sys.exit(0)
    
  • hooks/pretooluse.pyRunsGitHub
    Read the script
    #!/usr/bin/env python3
    """nunchi PreToolUse 엔트리포인트. 어떤 실패도 exit 0 + 무출력(allow)."""
    
    import json
    import os
    import sys
    
    sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
    
    try:
        from core.engine import decide
    
        input_data = json.load(sys.stdin)
        project_dir = (
            os.environ.get("CLAUDE_PROJECT_DIR") or input_data.get("cwd") or os.getcwd()
        )
        result = decide(input_data, project_dir)
        if result:
            print(json.dumps(result, ensure_ascii=False))
    except Exception as e:
        print(f"nunchi: hook error: {e}", file=sys.stderr)
    sys.exit(0)
    
  • hooks/sessionstart.pyRunsGitHub
    Read the script
    #!/usr/bin/env python3
    """nunchi SessionStart(compact) 엔트리포인트 — 배달 마커 재무장.
    
    어떤 실패도 exit 0. stdout은 컨텍스트에 주입되므로 절대 아무것도 쓰지 않는다.
    """
    
    import json
    import os
    import sys
    
    sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
    
    try:
        from core.engine import rearm
    
        input_data = json.load(sys.stdin)
        # hooks.json의 matcher("compact")가 1차 방어, 코드 가드가 2차 방어.
        if input_data.get("source") == "compact":
            project_dir = (
                os.environ.get("CLAUDE_PROJECT_DIR") or input_data.get("cwd") or os.getcwd()
            )
            rearm(input_data, project_dir)
    except Exception as e:
        print(f"nunchi: sessionstart hook error: {e}", file=sys.stderr)
    sys.exit(0)
    

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 withnunchi

"Rules with nunchi — delivered before you have to ask." nunchi is a Claude Code plugin that turns CLAUDE.md rules into event listeners.

Get the whole plugin
Stats
8
Stars
0
Forks
Active
Maintenance
Python
Language
MIT
License
6d ago
Last commit
2mo ago
Created

Repo: seob717/nunchi