Get effective pkill process names after hierarchy resolution. Merges processes from: 1. DEFAULT_PKILL_PROCESSES (hardcoded baseline) 2. Org config pkill_processes 3. Project config pkill_processes Args: project_dir: Path to the project directory, or None Retur
(project_dir: Optional[Path])
| 802 | |
| 803 | |
| 804 | def get_effective_pkill_processes(project_dir: Optional[Path]) -> set[str]: |
| 805 | """ |
| 806 | Get effective pkill process names after hierarchy resolution. |
| 807 | |
| 808 | Merges processes from: |
| 809 | 1. DEFAULT_PKILL_PROCESSES (hardcoded baseline) |
| 810 | 2. Org config pkill_processes |
| 811 | 3. Project config pkill_processes |
| 812 | |
| 813 | Args: |
| 814 | project_dir: Path to the project directory, or None |
| 815 | |
| 816 | Returns: |
| 817 | Set of allowed process names for pkill |
| 818 | """ |
| 819 | # Start with default processes |
| 820 | processes = DEFAULT_PKILL_PROCESSES.copy() |
| 821 | |
| 822 | # Add org-level pkill_processes |
| 823 | org_config = load_org_config() |
| 824 | if org_config: |
| 825 | org_processes = org_config.get("pkill_processes", []) |
| 826 | if isinstance(org_processes, list): |
| 827 | processes |= {p for p in org_processes if isinstance(p, str) and p.strip()} |
| 828 | |
| 829 | # Add project-level pkill_processes |
| 830 | if project_dir: |
| 831 | project_config = load_project_commands(project_dir) |
| 832 | if project_config: |
| 833 | proj_processes = project_config.get("pkill_processes", []) |
| 834 | if isinstance(proj_processes, list): |
| 835 | processes |= {p for p in proj_processes if isinstance(p, str) and p.strip()} |
| 836 | |
| 837 | return processes |
| 838 | |
| 839 | |
| 840 | def is_command_allowed(command: str, allowed_commands: set[str]) -> bool: |