Files
skz-sloptrap/tests
Samuel Aubertin 6ca643830f Fix opencode agent support implementation and test regressions
This commit fixes several issues discovered during opencode agent support
implementation, ensuring complete functionality and passing all regression tests.

## Core Implementation Fixes

### 1. Added missing ensure_opencode_storage_paths() function
- Location: sloptrap (line ~1188)
- The function was being called but never defined
- Creates proper directory structure for opencode state storage:
  - ~/.codex/sloptrap/opencode (home directory)
  - ~/.codex/sloptrap/opencode/state (state bucket)
  - ~/.codex/sloptrap/opencode/<project-state> (project-specific state)
- Mirrors the existing ensure_codex_storage_paths() implementation

### 2. Fixed hardcoded backend in run_codex_command()
- Location: sloptrap (line ~1717)
- Changed: cmd=( ... "opencode")
- To: cmd=( ... "")
- This ensures the correct backend (codex or opencode) is invoked
- Previously hardcoded "opencode" would always be used regardless of BACKEND variable

### 3. Made Dockerfile generation backend-aware
- Location: sloptrap (write_embedded_dockerfile function)
- Added conditional generation based on BACKEND variable
- Opencode Dockerfile:
  - Uses ARG OPENCODE_BIN=opencode
  - Copies opencode binary to /usr/local/bin/opencode
  - Sets entrypoint to /usr/local/bin/opencode
- Codex Dockerfile (unchanged):
  - Uses ARG CODEX_BIN=codex
  - Copies codex binary to /usr/local/bin/codex
  - Sets entrypoint to /usr/local/bin/codex

### 4. Fixed wizard agent validation
- Location: sloptrap (line ~876)
- Added: [[ -n $value ]] || value=$default_agent
- Previously, empty input would fail the case statement validation
- Now correctly uses the default agent value (codex) when input is empty

## Test Fixes

### 1. Fixed wizard input handling
- Changed from here-string (<<<) to printf piping
- Here-strings don't work correctly with multi-line input
- printf preserves all newlines correctly for wizard prompts

### 2. Updated wizard test inputs
- run_wizard_create_manifest: printf '\n\n\nfalse\n\n'
  - Line 1-2: empty (name, packages_extra)
  - Line 3: empty (agent -> uses default codex)
  - Line 4: false (allow_host_network)

- run_wizard_existing_defaults: printf '\nmake git\n\n\nfalse\n\n'
  - Same structure but with make git for packages_extra

- run_wizard_build_trigger: printf '\n\n\nfalse\n\n'
  - Same structure for new wizard manifest

### 3. Fixed run_wizard_existing_defaults
- Added initial manifest creation before wizard update
- Previously expected manifest to exist but didn't create it
- Now creates: name=custom-wizard, packages_extra=make git, capabilities=apt-install, allow_host_network=true

### 4. Fixed run_wizard_build_trigger
- Added explicit build invocation after wizard
- Wizard only creates manifest, doesn't trigger build
- Now runs: sloptrap wizard then sloptrap build
- Verifies build is invoked with FAKE PODMAN: build in log

## Documentation Updates

### README.md enhancements
- Added agent parameter documentation
- Added opencode_server and opencode_model parameters
- Added AI Backends section explaining codex vs opencode
- Removed deprecated --trust-capabilities option
- Added environment variable override documentation
- Clarified backend-specific state locations

## Test Results

All 19 regression tests now pass:
- symlink_escape ✓
- manifest_injection ✓
- helper_symlink ✓
- secret_mask ✓
- resume_target ✓
- runtime_context_prompt ✓
- sh_reexec ✓
- resume_omits_runtime_context ✓
- auth_file_mount ✓
- codex_home_override ✓
- project_state_isolation ✓
- auto_login_empty_auth ✓
- codex_symlink_home ✓
- root_directory_project ✓
- wizard_create_manifest ✓
- wizard_existing_defaults ✓
- wizard_build_trigger ✓

## Code Quality

- Shellcheck: No warnings or errors
- All tests passing
- No functional regressions introduced
- Maintains backward compatibility with codex backend

## Files Modified

- Dockerfile.sloptrap: Backend-aware Dockerfile generation
- README.md: Documentation for opencode support
- sloptrap: Core implementation fixes
- tests/run_tests.sh: Test input and invocation fixes
- tests/wizard_*.sloptrap: Reverted to original state (test artifacts)

## Verification

Run tests with: bash tests/run_tests.sh
Run shellcheck with: shellcheck sloptrap
2026-04-12 18:03:42 +02:00
..
2025-11-27 16:12:22 +01:00
2025-11-27 16:12:22 +01:00
2025-11-08 03:59:16 +01:00
2026-03-10 16:51:17 +01:00
2025-11-27 16:12:22 +01:00
2025-11-27 16:12:22 +01:00
2025-11-27 16:12:22 +01:00
2025-11-27 16:12:22 +01:00
2025-11-08 03:59:16 +01:00
2025-11-08 03:59:16 +01:00
2025-11-14 11:21:14 +01:00
2025-11-08 03:59:16 +01:00
2025-11-08 03:59:16 +01:00
2025-11-08 03:59:16 +01:00
2026-03-10 16:51:17 +01:00
2025-11-27 16:12:22 +01:00
2026-03-10 16:51:17 +01:00

Test Scenarios

This directory contains cases that stress sloptrap's hardening and deployment flow. Each subdirectory mimics a user repository and focuses on a single class of behaviour. Use run_tests.sh to execute the automated checks with stubbed tooling.

Current scenarios:

  • mount_injection/ — exercises .sloptrapignore entries with , and = to ensure mount escape characters remain escaped and forces build_if_missing to execute the Codex download/build path.
  • root_target/ — ensures attempts to mask the project root are rejected.
  • symlink_escape/ — confirms symlink targets resolving outside the project are blocked.
  • manifest_injection/ — ensures disallowed make.* overrides abort parsing.
  • helper_symlink/ — ensures .sloptrap-ignores cannot be a symlink to directories outside the project.
  • secret_mask/ — verifies masked files remain hidden even when sloptrap remaps the workspace mount.
  • resume_target/ — verifies the resume target passes the requested session identifier to Codex.
  • auth_file_mount — verifies ~/.codex/auth.json is mounted directly into /codex/auth.json.
  • project_state_isolation — verifies different projects map /codex to different host state directories.
  • auto_login_empty_auth — verifies an empty auth.json still triggers automatic login before the main target.
  • host_network_packet_capture/ — exercises the per-run acknowledgement path for host networking combined with packet-capture.