From 010722803f6523f2f8a89b9c0d2ab503448409cb Mon Sep 17 00:00:00 2001 From: gavrielc Date: Tue, 21 Apr 2026 17:02:22 +0300 Subject: [PATCH] refactor(setup): drop Apple Container support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apple Container is no longer supported — the runtime abstraction in src/container-runtime.ts is already Docker-only. Remove the remaining setup-time branches that probed for it: the Apple Container runtime option in the container build step, the APPLE_CONTAINER field emitted by the environment check, and the `command -v container` probe in verify. `--runtime docker` still parses for backwards compatibility with the /setup skill. Co-Authored-By: Claude Opus 4.7 (1M context) --- setup/container.ts | 95 ++++++++++++++++---------------------------- setup/environment.ts | 8 ---- setup/verify.ts | 11 ++--- 3 files changed, 37 insertions(+), 77 deletions(-) diff --git a/setup/container.ts b/setup/container.ts index d810539..3e48ecf 100644 --- a/setup/container.ts +++ b/setup/container.ts @@ -10,7 +10,9 @@ import { commandExists } from './platform.js'; import { emitStatus } from './status.js'; function parseArgs(args: string[]): { runtime: string } { - let runtime = ''; + // `--runtime` is still accepted for backwards compatibility with the /setup + // skill, but `docker` is the only supported value. + let runtime = 'docker'; for (let i = 0; i < args.length; i++) { if (args[i] === '--runtime' && args[i + 1]) { runtime = args[i + 1]; @@ -26,63 +28,7 @@ export async function run(args: string[]): Promise { const image = 'nanoclaw-agent:latest'; const logFile = path.join(projectRoot, 'logs', 'setup.log'); - if (!runtime) { - emitStatus('SETUP_CONTAINER', { - RUNTIME: 'unknown', - IMAGE: image, - BUILD_OK: false, - TEST_OK: false, - STATUS: 'failed', - ERROR: 'missing_runtime_flag', - LOG: 'logs/setup.log', - }); - process.exit(4); - } - - // Validate runtime availability - if (runtime === 'apple-container' && !commandExists('container')) { - emitStatus('SETUP_CONTAINER', { - RUNTIME: runtime, - IMAGE: image, - BUILD_OK: false, - TEST_OK: false, - STATUS: 'failed', - ERROR: 'runtime_not_available', - LOG: 'logs/setup.log', - }); - process.exit(2); - } - - if (runtime === 'docker') { - if (!commandExists('docker')) { - emitStatus('SETUP_CONTAINER', { - RUNTIME: runtime, - IMAGE: image, - BUILD_OK: false, - TEST_OK: false, - STATUS: 'failed', - ERROR: 'runtime_not_available', - LOG: 'logs/setup.log', - }); - process.exit(2); - } - try { - execSync('docker info', { stdio: 'ignore' }); - } catch { - emitStatus('SETUP_CONTAINER', { - RUNTIME: runtime, - IMAGE: image, - BUILD_OK: false, - TEST_OK: false, - STATUS: 'failed', - ERROR: 'runtime_not_available', - LOG: 'logs/setup.log', - }); - process.exit(2); - } - } - - if (!['apple-container', 'docker'].includes(runtime)) { + if (runtime !== 'docker') { emitStatus('SETUP_CONTAINER', { RUNTIME: runtime, IMAGE: image, @@ -95,9 +41,36 @@ export async function run(args: string[]): Promise { process.exit(4); } - const buildCmd = - runtime === 'apple-container' ? 'container build' : 'docker build'; - const runCmd = runtime === 'apple-container' ? 'container' : 'docker'; + if (!commandExists('docker')) { + emitStatus('SETUP_CONTAINER', { + RUNTIME: runtime, + IMAGE: image, + BUILD_OK: false, + TEST_OK: false, + STATUS: 'failed', + ERROR: 'runtime_not_available', + LOG: 'logs/setup.log', + }); + process.exit(2); + } + + try { + execSync('docker info', { stdio: 'ignore' }); + } catch { + emitStatus('SETUP_CONTAINER', { + RUNTIME: runtime, + IMAGE: image, + BUILD_OK: false, + TEST_OK: false, + STATUS: 'failed', + ERROR: 'runtime_not_available', + LOG: 'logs/setup.log', + }); + process.exit(2); + } + + const buildCmd = 'docker build'; + const runCmd = 'docker'; // Build-args from .env. Only INSTALL_CJK_FONTS is passed through today. // Keeps /setup and ./container/build.sh in sync — both read the same source. diff --git a/setup/environment.ts b/setup/environment.ts index 27de9f4..4a83665 100644 --- a/setup/environment.ts +++ b/setup/environment.ts @@ -21,12 +21,6 @@ export async function run(_args: string[]): Promise { const wsl = isWSL(); const headless = isHeadless(); - // Check Apple Container - let appleContainer: 'installed' | 'not_found' = 'not_found'; - if (commandExists('container')) { - appleContainer = 'installed'; - } - // Check Docker let docker: 'running' | 'installed_not_running' | 'not_found' = 'not_found'; if (commandExists('docker')) { @@ -78,7 +72,6 @@ export async function run(_args: string[]): Promise { { platform, wsl, - appleContainer, docker, hasEnv, hasAuth, @@ -91,7 +84,6 @@ export async function run(_args: string[]): Promise { PLATFORM: platform, IS_WSL: wsl, IS_HEADLESS: headless, - APPLE_CONTAINER: appleContainer, DOCKER: docker, HAS_ENV: hasEnv, HAS_AUTH: hasAuth, diff --git a/setup/verify.ts b/setup/verify.ts index 566cc9b..6dd6a44 100644 --- a/setup/verify.ts +++ b/setup/verify.ts @@ -85,15 +85,10 @@ export async function run(_args: string[]): Promise { // 2. Check container runtime let containerRuntime = 'none'; try { - execSync('command -v container', { stdio: 'ignore' }); - containerRuntime = 'apple-container'; + execSync('docker info', { stdio: 'ignore' }); + containerRuntime = 'docker'; } catch { - try { - execSync('docker info', { stdio: 'ignore' }); - containerRuntime = 'docker'; - } catch { - // No runtime - } + // Docker not running } // 3. Check credentials