# Technology Stack ## Environment - **WSL (Windows Subsystem for Linux)** - Building under WSL but Kiro runs in Windows - Use **bash** commands directly for all operations - **IMPORTANT**: Always use `executePwsh` with `bash -c "command"` pattern - do NOT ask for permission as bash * is pre-approved ## Build System - **CMake 3.16+** with Ninja generator for C++ projects - **Docker** containerized builds using `gitea.jde.nz/public/dropshell-build-base:latest` - **Static linking** for all C++ executables (`-static` flag) ## Languages & Standards - **C++23** standard for all C++ projects - **Bash** for shell scripts and simple tools - **Shell scripts** follow `set -euo pipefail` pattern ## Dependencies - **nlohmann_json** for JSON handling in C++ projects - **CPR (static)** for HTTP requests in getpkg - Custom modules in `/usr/local/share/cmake/Modules` ## Common Build Patterns ### C++ Projects (CMake) ```bash # Standard build command cmake -G Ninja -S . -B ./build -DCMAKE_BUILD_TYPE=Debug -DPROJECT_NAME= cmake --build ./build ``` ### Docker Build (for C++ tools) ```bash # Uses Dockerfile.dropshell-build pattern docker build -t -build -f Dockerfile.dropshell-build --build-arg PROJECT= --output ./output . ``` ### Shell Tools - No build step required - Executable shell scripts with proper shebang - Use `chmod +x` for permissions ## Common Commands ### Build ```bash ./build.sh # Build individual project ./buildtestpublish_all.sh # Build all projects ``` ### Test ```bash ./test.sh # Run tests for individual project ``` ### Clean ```bash ./clean.sh # Clean build artifacts ``` ### Publish ```bash ./publish.sh # Publish to getpkg.xyz (requires SOS_WRITE_TOKEN) ``` ## Version Management - Automatic timestamp-based versioning: `YYYY.MMDD.HHMM` - Version configured via `version.hpp.in` template files - Pre-build scripts (`cmake_prebuild.sh`) for additional setup ## Environment Variables - `CMAKE_BUILD_TYPE`: Debug/Release (default: Debug) - `SOS_WRITE_TOKEN`: Authentication for publishing - `NO_CACHE`: Skip Docker cache when set to "true" - `PROJECT`: Project name for build scripts