On this page
State persistence for claudewheel.
#claudewheel.state
#claudewheel.state
Persist launch state (selections, counts, recent dirs) and project inodes.
#project_key
def project_key(directory: str) -> strReturn the canonical per-project state key for directory.
This is THE rule for keying per-project state: the symlink-resolved (os.path.realpath) absolute path. A symlink and its target, and a relative path and its absolute form, all map to the same key so per-project state is never split across aliases of the same directory.
#_get_project_value
def _get_project_value(sf: 'StateFile', top_key: str, directory: str, default: Any=None) -> AnyRead a per-project sub-value from the top_key mapping in state.json.
#_set_project_value
def _set_project_value(sf: 'StateFile', top_key: str, directory: str, value: Any) -> NoneWrite a per-project sub-value under top_key, via set_value (single-key, multi-session-safe read-modify-write of the top-level key).
#get_project_hook_approvals
def get_project_hook_approvals(sf: 'StateFile', directory: str, default: Any=None) -> AnyRead the hook-approval record for directory (canonical key).
#set_project_hook_approvals
def set_project_hook_approvals(sf: 'StateFile', directory: str, value: Any) -> NonePersist the hook-approval record for directory (canonical key).
#get_vanilla_guardrails_opt_in
def get_vanilla_guardrails_opt_in(sf: 'StateFile', default: Any=None) -> AnyRead the machine-global vanilla-guardrails opt-in tri-state from state.
A leftover per-project dict value (from the old, superseded per-project shape) is not a valid answer -- it reads as unset (default).
#set_vanilla_guardrails_opt_in
def set_vanilla_guardrails_opt_in(sf: 'StateFile', value: Any) -> NonePersist the machine-global vanilla-guardrails opt-in tri-state to state.
#get_scratchpad_snooze_until
def get_scratchpad_snooze_until(sf: 'StateFile', default: Any=None) -> AnyRead the scratchpad-cleanup snooze deadline (ISO-8601 string) from state.
#set_scratchpad_snooze_until
def set_scratchpad_snooze_until(sf: 'StateFile', value: str) -> NonePersist the scratchpad-cleanup snooze deadline (ISO-8601 string).
#save_launch_state
def save_launch_state(cfg: 'AppConfigStore', selections: dict[str, str | None]) -> NoneSave current selections to state.json before launch.
#record_inode
def record_inode(shared: 'SharedStore', directory: str) -> NoneRecord the inode of a project directory for rename detection.