Skip to main content
Version: 1.8.x

Troubleshooting

Start by running shine --version to record the version. Then use shine list, shine info <TARGET>, or the relevant command's --dry-run option to collect state.

A command is missing after installation

Shell preset commands are exposed through ~/.shine/bin/. Open a new terminal after installation or reload the shell profile:

source ~/.zshrc
# Or: source ~/.bashrc

Then inspect the preset:

shine list
shine info proxy

If a source script exists but its command entry is missing, shine list does not list that command as a separate lifecycle resource; a multi-command category may still appear as partial. Use shine info shell/<CATEGORY> for command-level details, then rebuild managed files and entries with shine shell install <CATEGORY> --replace-managed.

Application configuration is reported as user-modified

Shine preserves files changed after installation by default. Inspect the difference first:

shine info app/starship --diff

Run shine app install starship --replace-managed to use the preset version. During uninstall, use shine app uninstall starship --force only when you explicitly want to delete those local changes; preview the same command with --dry-run first.

Shine is using an unexpected preset source

External directories, project configuration, and environment variables can change the active source. Check Preset Source and Presets Overlay in command output and compare the precedence rules in the configuration reference.

To isolate the check from existing configuration, use a separate directory:

SHINE_CONFIG_DIR=/tmp/shine-check shine app list

Shine uses this directory for configuration and runtime state and does not read the original ~/.shine/.

Installed configuration does not change after updating an environment value

shine env set updates the value but does not automatically rewrite installed templates. Run:

shine update --verbose
shine upgrade --verbose

If you use a project shine.config.toml, project shine.env.toml, or overlay, confirm the current working directory and override precedence.

If a private domain or 192.168.x.x address is still intercepted by a terminal proxy, continue with the Chinese Biulight knowledge-base guide 排查终端代理误拦截 ZeroTier 私有域名.

Shine reports an old configuration file after upgrading to 0.40

Project config.toml and .env.toml files are no longer read as Shine configuration. Rename them to shine.config.toml and shine.env.toml, respectively.

If Shine reports a global ~/.shine/env.toml, do not delete values that are still in use. Move it to ~/.shine/shine.env.toml; if the destination already exists, merge it manually and check for duplicate keys. Alternatively, before upgrading, load the configuration once with v0.39 so that the old version performs its automatic migration.

Refreshing a generated application file fails

Confirm that the category is installed, the selector is the relative [[files]].source path, and the generator's environment prerequisites are present:

shine app info surge
shine env list
shine app refresh surge subscription-proxies.conf

The built-in Surge generator requires an HTTPS SURGE_SUBSCRIPTION_URL and Bun at runtime. A failed refresh does not remove the last successfully generated file. If the destination is user-modified, inspect the difference and use --force only when you intend to replace it. Routine shine update and shine upgrade runs never access this manual subscription generator.

shine preset pull refuses to update a source

shine preset pull performs a fast-forward update only for a clean normal branch with an upstream. Enter the repository shown in the error and inspect it:

git status
git branch --show-current
git branch -vv
git pull --ff-only

Commit or stash local changes and resolve branch divergence yourself, then rerun shine preset pull. Shine never discards changes or resolves conflicts automatically. If Git is missing, install it and make sure git is in PATH. Non-Git preset directories are skipped normally.

Preview system initialization effects

shine sys info <ITEM>
shine sys bootstrap --dry-run
shine sys uninstall <ITEM> --dry-run

Do not infer available items from planning documents. Use shine sys list and shine sys info from the installed version.

PowerShell, bash, or zsh profiles rewritten by Windows or other tools may use CRLF line endings. System-profile merging matches managed blocks by content and does not repeatedly rewrite files only because CRLF and LF differ. If an older version left conflict markers, resolve them manually before rerunning shine sys bootstrap --dry-run or the relevant upgrade.

A resource is unavailable through the local HTTP service

Check the service and URL:

shine serve status
shine serve url app/surge/custom-rules.sgmodule

shine serve install uses launchd on macOS, a systemd user unit on Linux, and a current-user scheduled task on Windows. The service publishes only files under ~/.shine/http/ (or the active --config-dir). If a resource is missing, first run the relevant shine app artifact apply <APP_ID>.

Do not put sensitive files under ~/.shine/http/. The service binds to 127.0.0.1 but has no additional authentication.

A saved task behaves differently from the original command

shine task does not invoke a shell; it starts the saved argument array directly. Commands that use pipes, redirection, variable expansion, or globs must save an explicit shell:

shine task save kill-port -- sh -c 'lsof -ti :3000 | xargs kill'

Additional arguments are appended to the saved command:

shine task run my-task -- --verbose

SSH file transfer is unavailable

shine local works only inside a remote shell opened by shine ssh. If SHINE_SSH_SESSION, SHINE_SSH_TOKEN, or SHINE_SSH_REMOTE_SOCK is missing, exit and reconnect with shine ssh <HOST>.

The remote host must also be able to run a compatible shine local. Check:

shine local status
which shine
shine --version

Preview paths and overwrite behavior before transferring:

shine local download ./remote.log ./remote.log --dry-run
shine local upload ./local.log /tmp/local.log --dry-run

Existing files are not overwritten by default. Add --force only after confirming the target. For an existing directory target, --force means merge into the directory.

Automatic update checks fail

When the network or GitHub API is unavailable, Shine skips the version check and continues the original command. After connectivity returns, bypass the 24-hour cache and check again:

shine update --refresh-release