The CLI expands an unexpanded tilde (a quoted flag value, or a value injected from a script) in every user-supplied local path input — --config, $CREWSTER_CONFIG / $HPC_CONFIG, --project-dir, and sync.pull_dir — through the shared _expand_user_path helper in src/crewster/cli.py. The --script option of crewster exec and crewster submit is the one remaining local path input outside that rule: it is checked raw, so --script '~/jobs/run.sh' fails with Script not found: ~/jobs/run.sh even though the same tilde in --config or --project-dir on the same command line expands fine.
Proposal
Route --script through _expand_user_path before the existence check in both commands. Alternatively fold it into a shared script-loading helper: the block that accepts either a positional command or --script and reads the script file is duplicated between exec_cmd and submit in src/crewster/cli.py. Add a test mirroring test_project_dir_expands_tilde / test_config_expands_tilde in tests/test_cli.py.
The CLI expands an unexpanded tilde (a quoted flag value, or a value injected from a script) in every user-supplied local path input —
--config,$CREWSTER_CONFIG/$HPC_CONFIG,--project-dir, andsync.pull_dir— through the shared_expand_user_pathhelper insrc/crewster/cli.py. The--scriptoption ofcrewster execandcrewster submitis the one remaining local path input outside that rule: it is checked raw, so--script '~/jobs/run.sh'fails withScript not found: ~/jobs/run.sheven though the same tilde in--configor--project-diron the same command line expands fine.Proposal
Route
--scriptthrough_expand_user_pathbefore the existence check in both commands. Alternatively fold it into a shared script-loading helper: the block that accepts either a positional command or--scriptand reads the script file is duplicated betweenexec_cmdandsubmitinsrc/crewster/cli.py. Add a test mirroringtest_project_dir_expands_tilde/test_config_expands_tildeintests/test_cli.py.