From 50a931cf4dc235ca7ca54824aac27b6e0a496b00 Mon Sep 17 00:00:00 2001 From: Sander Declerck Date: Thu, 26 Mar 2026 13:36:20 +0100 Subject: [PATCH] Add manual setup and teardown instructions on failure --- .../safe-chain/src/shell-integration/setup.js | 10 +++++++--- .../src/shell-integration/shellDetection.js | 2 ++ .../shell-integration/supported-shells/bash.js | 18 ++++++++++++++++++ .../shell-integration/supported-shells/fish.js | 18 ++++++++++++++++++ .../supported-shells/powershell.js | 18 ++++++++++++++++++ .../supported-shells/windowsPowershell.js | 18 ++++++++++++++++++ .../shell-integration/supported-shells/zsh.js | 18 ++++++++++++++++++ .../src/shell-integration/teardown.js | 8 +++++++- 8 files changed, 106 insertions(+), 4 deletions(-) diff --git a/packages/safe-chain/src/shell-integration/setup.js b/packages/safe-chain/src/shell-integration/setup.js index 4138db6..66c6533 100644 --- a/packages/safe-chain/src/shell-integration/setup.js +++ b/packages/safe-chain/src/shell-integration/setup.js @@ -91,9 +91,7 @@ async function setupShell(shell) { ); } else { ui.writeError( - `${chalk.bold("- " + shell.name + ":")} ${chalk.red( - "Setup failed", - )}. Please check your ${shell.name} configuration.`, + `${chalk.bold("- " + shell.name + ":")} ${chalk.red("Setup failed")}`, ); if (error) { let message = ` Error: ${error.message}`; @@ -102,6 +100,12 @@ async function setupShell(shell) { } ui.writeError(message); } + ui.emptyLine(); + ui.writeInformation(` ${chalk.bold("To set up manually:")}`); + for (const instruction of shell.getManualSetupInstructions()) { + ui.writeInformation(` ${instruction}`); + } + ui.emptyLine(); } return success; diff --git a/packages/safe-chain/src/shell-integration/shellDetection.js b/packages/safe-chain/src/shell-integration/shellDetection.js index 996125c..c471244 100644 --- a/packages/safe-chain/src/shell-integration/shellDetection.js +++ b/packages/safe-chain/src/shell-integration/shellDetection.js @@ -11,6 +11,8 @@ import { ui } from "../environment/userInteraction.js"; * @property {() => boolean} isInstalled * @property {(tools: import("./helpers.js").AikidoTool[]) => boolean|Promise} setup * @property {(tools: import("./helpers.js").AikidoTool[]) => boolean} teardown + * @property {() => string[]} getManualSetupInstructions + * @property {() => string[]} getManualTeardownInstructions */ /** diff --git a/packages/safe-chain/src/shell-integration/supported-shells/bash.js b/packages/safe-chain/src/shell-integration/supported-shells/bash.js index 07d89cb..cc50223 100644 --- a/packages/safe-chain/src/shell-integration/supported-shells/bash.js +++ b/packages/safe-chain/src/shell-integration/supported-shells/bash.js @@ -123,6 +123,22 @@ function cygpathw(path) { } } +function getManualTeardownInstructions() { + return [ + `Remove the following line from your ~/.bashrc file:`, + ` source ~/.safe-chain/scripts/init-posix.sh`, + `Then restart your terminal or run: source ~/.bashrc`, + ]; +} + +function getManualSetupInstructions() { + return [ + `Add the following line to your ~/.bashrc file:`, + ` source ~/.safe-chain/scripts/init-posix.sh`, + `Then restart your terminal or run: source ~/.bashrc`, + ]; +} + /** * @type {import("../shellDetection.js").Shell} */ @@ -131,4 +147,6 @@ export default { isInstalled, setup, teardown, + getManualSetupInstructions, + getManualTeardownInstructions, }; diff --git a/packages/safe-chain/src/shell-integration/supported-shells/fish.js b/packages/safe-chain/src/shell-integration/supported-shells/fish.js index 0af6ae3..a623d0b 100644 --- a/packages/safe-chain/src/shell-integration/supported-shells/fish.js +++ b/packages/safe-chain/src/shell-integration/supported-shells/fish.js @@ -66,6 +66,22 @@ function getStartupFile() { } } +function getManualTeardownInstructions() { + return [ + `Remove the following line from your ~/.config/fish/config.fish file:`, + ` source ~/.safe-chain/scripts/init-fish.fish`, + `Then restart your terminal or run: source ~/.config/fish/config.fish`, + ]; +} + +function getManualSetupInstructions() { + return [ + `Add the following line to your ~/.config/fish/config.fish file:`, + ` source ~/.safe-chain/scripts/init-fish.fish`, + `Then restart your terminal or run: source ~/.config/fish/config.fish`, + ]; +} + /** * @type {import("../shellDetection.js").Shell} */ @@ -74,4 +90,6 @@ export default { isInstalled, setup, teardown, + getManualSetupInstructions, + getManualTeardownInstructions, }; diff --git a/packages/safe-chain/src/shell-integration/supported-shells/powershell.js b/packages/safe-chain/src/shell-integration/supported-shells/powershell.js index 96eb219..4bbc332 100644 --- a/packages/safe-chain/src/shell-integration/supported-shells/powershell.js +++ b/packages/safe-chain/src/shell-integration/supported-shells/powershell.js @@ -71,6 +71,22 @@ function getStartupFile() { } } +function getManualTeardownInstructions() { + return [ + `Remove the following line from your PowerShell profile (run "echo $PROFILE" to find its location):`, + ` . "$HOME\\.safe-chain\\scripts\\init-pwsh.ps1"`, + `Then restart your terminal or run: . $PROFILE`, + ]; +} + +function getManualSetupInstructions() { + return [ + `Add the following line to your PowerShell profile (run "echo $PROFILE" to find its location):`, + ` . "$HOME\\.safe-chain\\scripts\\init-pwsh.ps1"`, + `Then restart your terminal or run: . $PROFILE`, + ]; +} + /** * @type {import("../shellDetection.js").Shell} */ @@ -79,4 +95,6 @@ export default { isInstalled, setup, teardown, + getManualSetupInstructions, + getManualTeardownInstructions, }; diff --git a/packages/safe-chain/src/shell-integration/supported-shells/windowsPowershell.js b/packages/safe-chain/src/shell-integration/supported-shells/windowsPowershell.js index 2740456..3e81da7 100644 --- a/packages/safe-chain/src/shell-integration/supported-shells/windowsPowershell.js +++ b/packages/safe-chain/src/shell-integration/supported-shells/windowsPowershell.js @@ -71,6 +71,22 @@ function getStartupFile() { } } +function getManualTeardownInstructions() { + return [ + `Remove the following line from your PowerShell profile (run "echo $PROFILE" to find its location):`, + ` . "$HOME\\.safe-chain\\scripts\\init-pwsh.ps1"`, + `Then restart your terminal or run: . $PROFILE`, + ]; +} + +function getManualSetupInstructions() { + return [ + `Add the following line to your PowerShell profile (run "echo $PROFILE" to find its location):`, + ` . "$HOME\\.safe-chain\\scripts\\init-pwsh.ps1"`, + `Then restart your terminal or run: . $PROFILE`, + ]; +} + /** * @type {import("../shellDetection.js").Shell} */ @@ -79,4 +95,6 @@ export default { isInstalled, setup, teardown, + getManualSetupInstructions, + getManualTeardownInstructions, }; diff --git a/packages/safe-chain/src/shell-integration/supported-shells/zsh.js b/packages/safe-chain/src/shell-integration/supported-shells/zsh.js index 6086095..f187af3 100644 --- a/packages/safe-chain/src/shell-integration/supported-shells/zsh.js +++ b/packages/safe-chain/src/shell-integration/supported-shells/zsh.js @@ -66,9 +66,27 @@ function getStartupFile() { } } +function getManualTeardownInstructions() { + return [ + `Remove the following line from your ~/.zshrc file:`, + ` source ~/.safe-chain/scripts/init-posix.sh`, + `Then restart your terminal or run: source ~/.zshrc`, + ]; +} + +function getManualSetupInstructions() { + return [ + `Add the following line to your ~/.zshrc file:`, + ` source ~/.safe-chain/scripts/init-posix.sh`, + `Then restart your terminal or run: source ~/.zshrc`, + ]; +} + export default { name: shellName, isInstalled, setup, teardown, + getManualSetupInstructions, + getManualTeardownInstructions, }; diff --git a/packages/safe-chain/src/shell-integration/teardown.js b/packages/safe-chain/src/shell-integration/teardown.js index de3fbd7..bcf6346 100644 --- a/packages/safe-chain/src/shell-integration/teardown.js +++ b/packages/safe-chain/src/shell-integration/teardown.js @@ -47,8 +47,14 @@ export async function teardown() { ui.writeError( `${chalk.bold("- " + shell.name + ":")} ${chalk.red( "Teardown failed" - )}. Please check your ${shell.name} configuration.` + )}` ); + ui.emptyLine(); + ui.writeInformation(` ${chalk.bold("To tear down manually:")}`); + for (const instruction of shell.getManualTeardownInstructions()) { + ui.writeInformation(` ${instruction}`); + } + ui.emptyLine(); } }