"""Canonical ContextGuard command/package manifest.

This module is intentionally side-effect free. It centralizes command, copy,
package, and smoke-test inventories that were previously repeated across the
runtime dispatcher, release gates, sync tooling, smoke tests, and unit tests.
"""

IMPLEMENTATION_PAIRS = (('context_guard_cli.py', 'context-guard'),
 ('cost_guard.py', 'context-guard-cost'),
 ('cache_score.py', 'context-guard-cache-score'),
 ('benchmark_runner.py', 'context-guard-bench'),
 ('context_escrow.py', 'context-guard-artifact'),
 ('task_memory.py', 'context-guard-task-memory'),
 ('context_compress.py', 'context-guard-compress'),
 ('context_guard_mcp.py', 'context-guard-mcp'),
 ('context_pack.py', 'context-guard-pack'),
 ('context_filter.py', 'context-guard-filter'),
 ('tool_schema_pruner.py', 'context-guard-tool-prune'),
 ('claude_transcript_cost_audit.py', 'context-guard-audit'),
 ('context_guard_diet.py', 'context-guard-diet'),
 ('failed_attempt_nudge.py', 'context-guard-failed-nudge'),
 ('guard_large_read.py', 'context-guard-guard-read'),
 ('read_symbol.py', 'context-guard-read-symbol'),
 ('rewrite_bash_for_token_budget.py', 'context-guard-rewrite-bash'),
 ('sanitize_output.py', 'context-guard-sanitize-output'),
 ('setup_wizard.py', 'context-guard-setup'),
 ('statusline.sh', 'context-guard-statusline'),
 ('statusline_merged.sh', 'context-guard-statusline-merged'),
 ('trim_command_output.py', 'context-guard-trim-output'),
 ('hook_switch.py', 'context-guard-hooks'))

HELPER_PAIRS = (('hook_secret_patterns.py', 'lib/hook_secret_patterns.py'),
 ('bash_reference_policy.py', 'bin/bash_reference_policy.py'),
 ('credential_policy.py', 'lib/credential_policy.py'),
 ('context_guard_commands.py', 'lib/context_guard_commands.py'),
 ('context_guard_command_manifest_loader.py',
  'lib/context_guard_command_manifest_loader.py'),
 ('transcript_usage_reducer.py', 'lib/transcript_usage_reducer.py'),
 ('context_pack_identity.py', 'lib/context_pack_identity.py'),
 ('context_pack_scanning.py', 'lib/context_pack_scanning.py'),
 ('context_pack_selection.py', 'lib/context_pack_selection.py'),
 ('context_pack_rendering.py', 'lib/context_pack_rendering.py'),
 ('context_pack_git_boundary.py', 'lib/context_pack_git_boundary.py'),
 ('context_pack_receipts.py', 'lib/context_pack_receipts.py'),
 ('hook_journal.py', 'lib/hook_journal.py'),
 ('hook_switch.py', 'lib/hook_switch.py'))

NPM_BINS = ('context-guard',
 'context-guard-cost',
 'context-guard-cache-score',
 'context-guard-bench',
 'context-guard-artifact',
 'context-guard-task-memory',
 'context-guard-compress',
 'context-guard-mcp',
 'context-guard-pack',
 'context-guard-filter',
 'context-guard-tool-prune',
 'context-guard-audit',
 'context-guard-diet',
 'context-guard-failed-nudge',
 'context-guard-guard-read',
 'context-guard-read-symbol',
 'context-guard-rewrite-bash',
 'context-guard-sanitize-output',
 'context-guard-setup',
 'context-guard-statusline',
 'context-guard-statusline-merged',
 'context-guard-trim-output',
 'context-guard-hooks')

NPM_BIN_PATHS = {'context-guard': 'plugins/context-guard/bin/context-guard',
 'context-guard-cost': 'plugins/context-guard/bin/context-guard-cost',
 'context-guard-cache-score': 'plugins/context-guard/bin/context-guard-cache-score',
 'context-guard-bench': 'plugins/context-guard/bin/context-guard-bench',
 'context-guard-artifact': 'plugins/context-guard/bin/context-guard-artifact',
 'context-guard-task-memory': 'plugins/context-guard/bin/context-guard-task-memory',
 'context-guard-compress': 'plugins/context-guard/bin/context-guard-compress',
 'context-guard-mcp': 'plugins/context-guard/bin/context-guard-mcp',
 'context-guard-pack': 'plugins/context-guard/bin/context-guard-pack',
 'context-guard-filter': 'plugins/context-guard/bin/context-guard-filter',
 'context-guard-tool-prune': 'plugins/context-guard/bin/context-guard-tool-prune',
 'context-guard-audit': 'plugins/context-guard/bin/context-guard-audit',
 'context-guard-diet': 'plugins/context-guard/bin/context-guard-diet',
 'context-guard-failed-nudge': 'plugins/context-guard/bin/context-guard-failed-nudge',
 'context-guard-guard-read': 'plugins/context-guard/bin/context-guard-guard-read',
 'context-guard-read-symbol': 'plugins/context-guard/bin/context-guard-read-symbol',
 'context-guard-rewrite-bash': 'plugins/context-guard/bin/context-guard-rewrite-bash',
 'context-guard-sanitize-output': 'plugins/context-guard/bin/context-guard-sanitize-output',
 'context-guard-setup': 'plugins/context-guard/bin/context-guard-setup',
 'context-guard-statusline': 'plugins/context-guard/bin/context-guard-statusline',
 'context-guard-statusline-merged': 'plugins/context-guard/bin/context-guard-statusline-merged',
 'context-guard-trim-output': 'plugins/context-guard/bin/context-guard-trim-output',
 'context-guard-hooks': 'plugins/context-guard/bin/context-guard-hooks'}

DISPATCHER_SUBCOMMANDS = {'setup': ('context-guard-setup',),
 'doctor': ('context-guard-setup', '--verify'),
 'audit': ('context-guard-audit',),
 'diet': ('context-guard-diet',),
 'scan': ('context-guard-diet', 'scan'),
 'trim-output': ('context-guard-trim-output',),
 'trim': ('context-guard-trim-output',),
 'reference': ('context-guard-trim-output', '--expand-bash-reference'),
 'sanitize-output': ('context-guard-sanitize-output',),
 'sanitize': ('context-guard-sanitize-output',),
 'filter': ('context-guard-filter',),
 'artifact': ('context-guard-artifact',),
 'task-memory': ('context-guard-task-memory',),
 'pack': ('context-guard-pack',),
 'tool-prune': ('context-guard-tool-prune',),
 'compress': ('context-guard-compress',),
 'mcp': ('context-guard-mcp',),
 'cost': ('context-guard-cost',),
 'cache-score': ('context-guard-cache-score',),
 'bench': ('context-guard-bench',),
 'read-symbol': ('context-guard-read-symbol',),
 'rewrite-bash': ('context-guard-rewrite-bash',),
 'guard-read': ('context-guard-guard-read',),
 'failed-nudge': ('context-guard-failed-nudge',),
 'statusline': ('context-guard-statusline',),
 'statusline-merged': ('context-guard-statusline-merged',),
 'hooks': ('context-guard-hooks',)}

# 레거시 `claude-*` 래퍼는 삭제됐다. prepublish_check.py 가 이 이름의 존재를
# 요구하므로(required 집합) 빈 튜플로 남긴다.
LEGACY_WRAPPERS = ()

ENTRYPOINT_SMOKE_CASES = {'context-guard': {'args': ['--version'], 'mode': 'text'},
 'context-guard-read-symbol': {'args': ['--help'], 'mode': 'text'},
 'context-guard-sanitize-output': {'args': ['--help'], 'mode': 'text'},
 'context-guard-artifact': {'args': ['--help'], 'mode': 'text'},
 'context-guard-task-memory': {'args': ['--help'], 'mode': 'text'},
 'context-guard-audit': {'args': ['--help'], 'mode': 'text'},
 'context-guard-bench': {'args': ['--help'], 'mode': 'text'},
 'context-guard-compress': {'args': ['--help'], 'mode': 'text'},
 'context-guard-mcp': {'args': ['--help'], 'mode': 'text'},
 'context-guard-cost': {'args': ['--help'], 'mode': 'text'},
 'context-guard-cache-score': {'args': ['--help'], 'mode': 'text'},
 'context-guard-pack': {'args': ['--help'], 'mode': 'text'},
 'context-guard-tool-prune': {'args': ['--help'], 'mode': 'text'},
 'context-guard-diet': {'args': ['--help'], 'mode': 'text'},
 'context-guard-failed-nudge': {'args': [], 'mode': 'hook-json'},
 'context-guard-filter': {'args': ['--help'], 'mode': 'text'},
 'context-guard-guard-read': {'args': [], 'mode': 'hook-json'},
 'context-guard-hooks': {'args': ['--help'], 'mode': 'text'},
 'context-guard-rewrite-bash': {'args': [], 'mode': 'hook-json'},
 'context-guard-setup': {'args': ['--help'], 'mode': 'text'},
 'context-guard-statusline': {'args': [], 'mode': 'statusline'},
 'context-guard-statusline-merged': {'args': [], 'mode': 'statusline'},
 'context-guard-trim-output': {'args': ['--help'], 'mode': 'text'}}

PLUGIN_ENTRYPOINTS = ('context-guard',
 'context-guard-artifact',
 'context-guard-task-memory',
 'context-guard-audit',
 'context-guard-bench',
 'context-guard-compress',
 'context-guard-mcp',
 'context-guard-cost',
 'context-guard-cache-score',
 'context-guard-diet',
 'context-guard-failed-nudge',
 'context-guard-filter',
 'context-guard-guard-read',
 'context-guard-hooks',
 'context-guard-pack',
 'context-guard-read-symbol',
 'context-guard-rewrite-bash',
 'context-guard-sanitize-output',
 'context-guard-setup',
 'context-guard-statusline',
 'context-guard-statusline-merged',
 'context-guard-tool-prune',
 'context-guard-trim-output')

DISPATCHER_SMOKE_CASES = ({'entrypoint': 'context-guard', 'args': ['reference', '--help'], 'mode': 'text'},
 {'entrypoint': 'context-guard', 'args': ['cost', '--help'], 'mode': 'text'},
 {'entrypoint': 'context-guard', 'args': ['cache-score', '--help'], 'mode': 'text'},
 {'entrypoint': 'context-guard', 'args': ['mcp', '--help'], 'mode': 'text'},
 {'entrypoint': 'context-guard', 'args': ['task-memory', '--help'], 'mode': 'text'},
 {'entrypoint': 'context-guard-pack', 'args': ['suggest', '--help'], 'mode': 'text'},
 {'entrypoint': 'context-guard-pack', 'args': ['auto', '--help'], 'mode': 'text'})

EXPECTED_COMMAND_PACK_FILES = ('plugins/context-guard/bin/bash_reference_policy.py',
 'plugins/context-guard/bin/context-guard',
 'plugins/context-guard/bin/context-guard-artifact',
 'plugins/context-guard/bin/context-guard-task-memory',
 'plugins/context-guard/bin/context-guard-audit',
 'plugins/context-guard/bin/context-guard-bench',
 'plugins/context-guard/bin/context-guard-cache-score',
 'plugins/context-guard/bin/context-guard-compress',
 'plugins/context-guard/bin/context-guard-mcp',
 'plugins/context-guard/bin/context-guard-cost',
 'plugins/context-guard/bin/context-guard-diet',
 'plugins/context-guard/bin/context-guard-failed-nudge',
 'plugins/context-guard/bin/context-guard-filter',
 'plugins/context-guard/bin/context-guard-guard-read',
 'plugins/context-guard/bin/context-guard-hooks',
 'plugins/context-guard/bin/context-guard-pack',
 'plugins/context-guard/bin/context-guard-read-symbol',
 'plugins/context-guard/bin/context-guard-rewrite-bash',
 'plugins/context-guard/bin/context-guard-sanitize-output',
 'plugins/context-guard/bin/context-guard-setup',
 'plugins/context-guard/bin/context-guard-statusline',
 'plugins/context-guard/bin/context-guard-statusline-merged',
 'plugins/context-guard/bin/context-guard-tool-prune',
 'plugins/context-guard/bin/context-guard-trim-output',
 'plugins/context-guard/lib/credential_policy.py',
 'plugins/context-guard/lib/context_guard_command_manifest_loader.py',
 'plugins/context-guard/lib/context_guard_commands.py',
 'plugins/context-guard/lib/context_pack_git_boundary.py',
 'plugins/context-guard/lib/context_pack_identity.py',
 'plugins/context-guard/lib/context_pack_receipts.py',
 'plugins/context-guard/lib/context_pack_rendering.py',
 'plugins/context-guard/lib/context_pack_scanning.py',
 'plugins/context-guard/lib/context_pack_selection.py',
 'plugins/context-guard/lib/hook_journal.py',
 'plugins/context-guard/lib/hook_secret_patterns.py',
 'plugins/context-guard/lib/hook_switch.py',
 'plugins/context-guard/lib/transcript_usage_reducer.py')
