๐Ÿ M141-3 โ€” PyPI scaffold (orchestkit-hook-contract)

Python sibling of @orchestkit/hook-contract. Both packages regenerate from spec/hook-events.spec.yml. Closes the npmโ†”Python schema drift class.

๐Ÿ“ฆ Package surface

from orchestkit_hook_contract import (
    HOOK_EVENT_NAMES,         # tuple of 19 event names
    HookEvent,                 # Pydantic v2 envelope (event, timestamp, ...)
    HookEventName,             # Literal[...] type
    PAYLOAD_MAP,               # event name -> payload class
    HOOK_EVENT_SCHEMAS,        # per-event JSON Schema (draft-07)
    validate_hook_event,       # structural validator
    is_hook_event_name,        # type guard

    # Per-event payload classes (13 of 19 events covered)
    PreToolUsePayload, PostToolUsePayload, PostToolUseFailurePayload,
    UserPromptSubmitPayload, NotificationPayload, PermissionRequestPayload,
    SubagentStartPayload, SubagentStopPayload, StopPayload,
    SessionStartPayload, PreCompactPayload, TeammateIdlePayload,
    TaskCompletedPayload,
)

๐Ÿ” Cross-language parity

SurfacenpmPyPI
event namesHOOK_EVENT_NAMES (19)HOOK_EVENT_NAMES (19)
typed payloadsPayloadFor<'PreToolUse'>PreToolUsePayload
JSON schemasHOOK_EVENT_SCHEMASHOOK_EVENT_SCHEMAS
structural validatorvalidateHookEventvalidate_hook_event
codegen sourcespec/hook-events.spec.ymlspec/hook-events.spec.yml
drift gatecodegen.mjs --checkcodegen-py.py --check

๐Ÿ›  What ships in this PR (M141-3)

๐Ÿ”ฎ What's deferred (still under M141)

โœ… Verified locally

$ python scripts/codegen-py.py
[codegen-py] wrote src/orchestkit_hook_contract/events.py
[codegen-py] wrote src/orchestkit_hook_contract/schemas.py

$ python scripts/codegen-py.py --check
[codegen-py --check] OK: events.py + schemas.py match spec.

$ pytest -v
============================== 82 passed in 0.93s ==============================

$ python -c 'from orchestkit_hook_contract import PreToolUsePayload; PreToolUsePayload(tool_name="Bash", tool_input={"cmd": "ls"})'
# typed Pydantic v2 model โœ“