The scripts were hardcoded to look for OpenSMTPD at a custom workspace path, but the Dockerfile installs it via apt to /usr/sbin/smtpd. This change adds fallback logic to check multiple locations: 1. Custom workspace path (for backward compatibility) 2. System path /usr/sbin/smtpd 3. Anywhere in PATH Also adds graceful handling when OpenSMTPD is not installed, logging an informative message instead of failing with "No such file or directory".
Utility Scripts
This directory contains utility scripts for managing the Shopify AI App Builder.
Environment File Scripts
validate-env.sh
Validates .env files for common issues including invisible Unicode characters.
Usage:
./scripts/validate-env.sh [env-file-path]
# Examples:
./scripts/validate-env.sh .env
./scripts/validate-env.sh /path/to/custom.env
What it checks:
- U+200E (Left-to-Right Mark) - the most common issue
- U+200F (Right-to-Left Mark)
- U+200B (Zero Width Space)
- U+FEFF (Byte Order Mark / BOM)
- Other directional formatting characters (U+202A-202E)
- Windows line endings (CRLF)
- Trailing spaces in variable definitions
- Spaces in variable names
Exit codes:
0- File is clean1- Issues found
clean-env.sh
Removes invisible Unicode characters from .env files.
Usage:
./scripts/clean-env.sh [env-file-path]
# Examples:
./scripts/clean-env.sh .env
./scripts/clean-env.sh /path/to/custom.env
What it does:
- Creates a backup of the original file (
.backupextension) - Removes all invisible Unicode characters
- Preserves all valid content
Always creates a backup before modifying the file, so you can restore if needed:
mv .env.backup .env
Typical Workflow
When you encounter Portainer deployment errors with invisible characters:
# 1. Validate your env file
./scripts/validate-env.sh .env
# 2. If issues found, clean it
./scripts/clean-env.sh .env
# 3. Verify it's fixed
./scripts/validate-env.sh .env
# 4. Deploy to Portainer
Other Scripts
check-duplicate-classes.php
Comprehensive PHP/WordPress Plugin Static Analyzer that detects runtime errors, duplicate declarations, missing dependencies, and code issues. Optimized for minimal memory usage via streaming token parsing.
Usage:
php scripts/check-duplicate-classes.php /path/to/plugin
php scripts/check-duplicate-classes.php /path/to/plugin --verbose
php scripts/check-duplicate-classes.php /path/to/plugin --quiet
php scripts/check-duplicate-classes.php /path/to/plugin --strict
Options:
--verbose- Show detailed output and statistics--strict- Enable stricter checks (may have false positives)--quiet- Suppress informational messages--no-cache- Skip caching (useful for CI/CD)
What it detects:
- Duplicate class, interface, trait, function, and constant declarations (prevents "Cannot redeclare" errors)
- Missing include/require files
- Usage of undefined classes (new, instanceof, extends, implements, catch)
- Undefined functions - Calls to functions that don't exist in the codebase or PHP/WP core
- Early function calls - Functions called before they are defined in the same file
- Potential undefined arrays - Array accesses on variables that may not be initialized
- CSS overlap risks - CSS patterns that may cause UI elements to overlap
- Namespace-aware detection (prevents false positives across namespaces)
CSS Overlap Detection: The script analyzes CSS files for patterns that commonly cause overlapping UI elements:
- Absolute positioned elements at z-index 0
- Elements anchored to both top/bottom or left/right
- Negative margins that can pull elements into overlapping positions
Exit codes:
0- No issues found1- Issues detected
Example output:
Checking for undefined functions...
✓ No undefined functions found
Checking for early function calls...
EARLY FUNCTION CALL: 'my_function' called at line 15 but defined at line 45 in includes/helper.php
...
✓ No early function calls found
Checking for potential undefined arrays and array keys...
POTENTIAL UNDEFINED ARRAY: '$options' accessed as array at functions.php:23
This array may not be initialized before use.
Consider using isset() or !empty() check before access.
...
Checking for potential CSS overlaps...
POTENTIAL CSS OVERLAP in admin/css/admin.css:156
Reason: Negative margin (may cause overlap)
Context: margin-left: -15px;...
...
DUPLICATE CLASS: 'PCFB_Field_Icons' declared in 2 locations:
admin/class-admin-helper.php:167
admin/page-form-builder.php:206
MISSING CLASS/TYPE: 'Undefined_Class' used but not declared:
admin/some-file.php:42 (new)
================================================================================
VALIDATION SUMMARY
================================================================================
Runtime issues (duplicates, missing classes): FOUND
Undefined functions: 0 found
Early function calls: 1 found
Potential undefined arrays: 1 found
Potential CSS overlaps: 1 found
FAIL: Issues detected that should be reviewed
entrypoint.sh
Container entrypoint script that:
- Sets up the environment
- Starts the web server (port 4000)
- Starts the terminal service (port 4001)
This script runs automatically when the Docker container starts. You don't need to run it manually.
healthcheck.sh
Docker health check script that verifies:
- The web server is responding on port 4000
- The service is healthy
This is used by Docker to monitor container health. You don't need to run it manually.
Troubleshooting
Permission denied
If you get "Permission denied" errors:
chmod +x scripts/*.sh
Command not found
Make sure you're running from the project root:
cd /path/to/shopify-ai
./scripts/validate-env.sh .env
Or use full paths:
/path/to/shopify-ai/scripts/validate-env.sh /path/to/.env