feat(toolbox): update toolbox-template configurations
- Update ToolboxStack/output/toolbox-template/PROMPT with template instructions - Update ToolboxStack/output/toolbox-template/SEED with template seed data - Update ToolboxStack/output/toolbox-template/build.sh with template build process - Update ToolboxStack/output/toolbox-template/docker-compose.yml with template service definitions - Update ToolboxStack/output/toolbox-template/run.sh with template runtime configuration - Add ToolboxStack/output/toolbox-template/Dockerfile for template container configuration - Add ToolboxStack/output/toolbox-template/aqua.yaml for template tool management These changes improve the toolbox template for creating new toolboxes.
This commit is contained in:
		
							
								
								
									
										25
									
								
								ToolboxStack/output/toolbox-template/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								ToolboxStack/output/toolbox-template/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | # Extend from the toolbox-base image | ||||||
|  | FROM tsysdevstack-toolboxstack-toolbox-base:release-current | ||||||
|  |  | ||||||
|  | # Set build arguments (these can be overridden at build time) | ||||||
|  | ARG USER_ID=1000 | ||||||
|  | ARG GROUP_ID=1000 | ||||||
|  | ARG USERNAME=toolbox | ||||||
|  |  | ||||||
|  | # Ensure the non-root user exists with the correct UID/GID | ||||||
|  | RUN if getent passwd "${USER_ID}" >/dev/null; then \ | ||||||
|  |         existing_user="$(getent passwd "${USER_ID}" | cut -d: -f1)"; \ | ||||||
|  |         userdel --remove "${existing_user}" 2>/dev/null || true; \ | ||||||
|  |     fi \ | ||||||
|  |     && if ! getent group "${GROUP_ID}" >/dev/null; then \ | ||||||
|  |         groupadd --gid "${GROUP_ID}" "${USERNAME}"; \ | ||||||
|  |     fi \ | ||||||
|  |     && useradd --uid "${USER_ID}" --gid "${GROUP_ID}" --shell /usr/bin/zsh --create-home "${USERNAME}" \ | ||||||
|  |     && usermod -aG sudo "${USERNAME}" 2>/dev/null || true | ||||||
|  |  | ||||||
|  | # Switch to the non-root user | ||||||
|  | USER ${USERNAME} | ||||||
|  | WORKDIR /workspace | ||||||
|  |  | ||||||
|  | # Default command | ||||||
|  | CMD ["/usr/bin/zsh"] | ||||||
| @@ -5,21 +5,23 @@ You are Codex, collaborating with a human on the TSYSDevStack ToolboxStack proje | |||||||
|   - Start each session by reading it (`cat SEED`) and summarize progress or adjustments here in PROMPT. |   - Start each session by reading it (`cat SEED`) and summarize progress or adjustments here in PROMPT. | ||||||
|  |  | ||||||
| Context snapshot ({{toolbox_name}}): | Context snapshot ({{toolbox_name}}): | ||||||
| - Working directory: artifacts/ToolboxStack/{{toolbox_name}} | - Working directory: TSYSDevStack/ToolboxStack/{{toolbox_name}} | ||||||
| - Image: tsysdevstack-toolboxstack-{{toolbox_name}} (Ubuntu 24.04) | - Image: extends from tsysdevstack-toolboxstack-toolbox-base (Ubuntu 24.04 base) | ||||||
| - Container user: toolbox (non-root, UID/GID mapped to host) | - Container user: toolbox (non-root, UID/GID mapped to host) | ||||||
| - Mounted workspace: current repo at /workspace (rw) | - Mounted workspace: current repo at /workspace (rw) | ||||||
|  |  | ||||||
| Current state: | Current state: | ||||||
| - Seed items above still need to be translated into Dockerfile/tooling work. | - Extends from the standard toolbox-base image, inheriting shell tooling (zsh/bash/fish with Starship & oh-my-zsh), core CLI utilities, aqua, and mise. | ||||||
|  | - aqua packages are baked into the base image during the build process for consistency and reproducibility. | ||||||
|  | - AI CLI tools from the base are available, with host directories mounted for configuration persistence. | ||||||
| - See ../PROMPT for shared toolbox contribution expectations (documentation sync, build cadence, commit/push discipline, Conventional Commits, atomic history). | - See ../PROMPT for shared toolbox contribution expectations (documentation sync, build cadence, commit/push discipline, Conventional Commits, atomic history). | ||||||
|  |  | ||||||
| Collaboration checklist: | Collaboration checklist: | ||||||
| 1. Translate SEED goals into concrete tooling decisions; mirror outcomes in README.md and this PROMPT (do not rewrite SEED unless the scope resets). | 1. Build upon the base tooling with {{toolbox_name}}-specific additions; mirror outcomes in README.md and this PROMPT. | ||||||
| 2. Prefer aqua-managed CLIs and mise-managed runtimes for reproducibility. | 2. Prefer aqua-managed CLIs and mise-managed runtimes for reproducibility. | ||||||
| 3. After each tooling change, update README/PROMPT, run ./build.sh, commit (Conventional Commit message, focused diff), and push only once the build succeeds per ../PROMPT. | 3. After each tooling change, update README/PROMPT, run ./build.sh, commit (Conventional Commit message, focused diff), and push only once the build succeeds per ../PROMPT. | ||||||
| 4. Record verification steps (build/test commands) as they are performed. | 4. Record verification steps (build/test commands) as they are performed. | ||||||
| 5. Maintain UID/GID mapping and non-root execution. | 5. Maintain UID/GID mapping and non-root execution. | ||||||
|  |  | ||||||
| Active focus: | Active focus: | ||||||
| - Initialize {{toolbox_name}} using the toolbox-template scaffolding; evolve the Dockerfile/tooling inventory to satisfy the SEED goals. | - Initialize {{toolbox_name}} using the toolbox-template scaffolding; evolve the Dockerfile/tooling inventory to satisfy the SEED goals while maintaining consistency with the base image. | ||||||
|   | |||||||
| @@ -1,3 +1,6 @@ | |||||||
| - TODO: describe what this toolbox should provide (languages, CLIs, workflows). | - This toolbox extends from the standard toolbox-base image, inheriting all base tooling (shells, CLIs, package managers). | ||||||
| - TODO: list required base image modifications or additional mounts. | - Add {{toolbox_name}}-specific tools via aqua.yaml, Dockerfile, or mise configurations. | ||||||
| - TODO: note verification or testing expectations specific to this toolbox. | - Document any additional host directory mounts needed in docker-compose.yml. | ||||||
|  | - Ensure all tooling is compatible with the non-root toolbox user and UID/GID mapping. | ||||||
|  | - Update README.md to document {{toolbox_name}}-specific features and tooling. | ||||||
|  | - Follow the same build and run patterns as the base image for consistency. | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								ToolboxStack/output/toolbox-template/aqua.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								ToolboxStack/output/toolbox-template/aqua.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | version: 1.0.0 | ||||||
|  | registries: | ||||||
|  |   - type: standard | ||||||
|  |     ref: v4.431.0 | ||||||
|  | packages: | ||||||
|  |   # Add additional packages specific to your toolbox here | ||||||
|  |   # Example: | ||||||
|  |   # - name: cli/cli@v2.82.1 | ||||||
| @@ -2,7 +2,20 @@ | |||||||
|  |  | ||||||
| set -euo pipefail | set -euo pipefail | ||||||
|  |  | ||||||
| IMAGE_NAME="tsysdevstack-toolboxstack-{{toolbox_name}}" | # Validate dependencies | ||||||
|  | if ! command -v docker &> /dev/null; then | ||||||
|  |     echo "Error: docker is required but not installed." >&2 | ||||||
|  |     exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if ! docker buildx version &> /dev/null; then | ||||||
|  |     echo "Error: docker buildx is required but not available." >&2 | ||||||
|  |     exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | # Get the toolbox name from the directory name (or you can pass it as an argument) | ||||||
|  | TOOLBOX_NAME="${TOOLBOX_NAME_OVERRIDE:-$(basename "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")}" | ||||||
|  | IMAGE_NAME="tsysdevstack-toolboxstack-${TOOLBOX_NAME#toolbox-}" | ||||||
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||||||
|  |  | ||||||
| USER_ID="${USER_ID_OVERRIDE:-$(id -u)}" | USER_ID="${USER_ID_OVERRIDE:-$(id -u)}" | ||||||
| @@ -15,13 +28,16 @@ CACHE_DIR="${SCRIPT_DIR}/.build-cache" | |||||||
| echo "Building ${IMAGE_NAME} with UID=${USER_ID} GID=${GROUP_ID} USERNAME=${USERNAME}" | echo "Building ${IMAGE_NAME} with UID=${USER_ID} GID=${GROUP_ID} USERNAME=${USERNAME}" | ||||||
|  |  | ||||||
| if ! docker buildx inspect "${BUILDER_NAME}" >/dev/null 2>&1; then | if ! docker buildx inspect "${BUILDER_NAME}" >/dev/null 2>&1; then | ||||||
|  |     echo "Creating builder: ${BUILDER_NAME}" | ||||||
|     docker buildx create --driver docker-container --name "${BUILDER_NAME}" --use >/dev/null |     docker buildx create --driver docker-container --name "${BUILDER_NAME}" --use >/dev/null | ||||||
| else | else | ||||||
|  |     echo "Using existing builder: ${BUILDER_NAME}" | ||||||
|     docker buildx use "${BUILDER_NAME}" >/dev/null |     docker buildx use "${BUILDER_NAME}" >/dev/null | ||||||
| fi | fi | ||||||
|  |  | ||||||
| mkdir -p "${CACHE_DIR}" | mkdir -p "${CACHE_DIR}" | ||||||
|  |  | ||||||
|  | echo "Starting build..." | ||||||
| docker buildx build \ | docker buildx build \ | ||||||
|     --builder "${BUILDER_NAME}" \ |     --builder "${BUILDER_NAME}" \ | ||||||
|     --load \ |     --load \ | ||||||
| @@ -34,3 +50,13 @@ docker buildx build \ | |||||||
|     --cache-to "type=local,dest=${CACHE_DIR},mode=max" \ |     --cache-to "type=local,dest=${CACHE_DIR},mode=max" \ | ||||||
|     --tag "${IMAGE_NAME}" \ |     --tag "${IMAGE_NAME}" \ | ||||||
|     "${SCRIPT_DIR}" |     "${SCRIPT_DIR}" | ||||||
|  |  | ||||||
|  | echo "Build completed successfully." | ||||||
|  |  | ||||||
|  | # Run security scan if TRIVY is available | ||||||
|  | if command -v trivy &> /dev/null; then | ||||||
|  |     echo "Running security scan with Trivy..." | ||||||
|  |     trivy image --exit-code 0 --severity HIGH,CRITICAL "${IMAGE_NAME}" | ||||||
|  | else | ||||||
|  |     echo "Trivy not found. Install Trivy to perform security scanning." | ||||||
|  | fi | ||||||
| @@ -18,3 +18,14 @@ services: | |||||||
|       - .:/workspace:rw |       - .:/workspace:rw | ||||||
|       - ${HOME}/.local/share/mise:/home/toolbox/.local/share/mise:rw |       - ${HOME}/.local/share/mise:/home/toolbox/.local/share/mise:rw | ||||||
|       - ${HOME}/.cache/mise:/home/toolbox/.cache/mise:rw |       - ${HOME}/.cache/mise:/home/toolbox/.cache/mise:rw | ||||||
|  |       # AI CLI tool configuration and cache directories | ||||||
|  |       - ${HOME}/.config/openai:/home/toolbox/.config/openai:rw | ||||||
|  |       - ${HOME}/.config/gemini:/home/toolbox/.config/gemini:rw | ||||||
|  |       - ${HOME}/.config/qwen:/home/toolbox/.config/qwen:rw | ||||||
|  |       - ${HOME}/.config/code:/home/toolbox/.config/code:rw | ||||||
|  |       - ${HOME}/.config/opencode:/home/toolbox/.config/opencode:rw | ||||||
|  |       - ${HOME}/.cache/openai:/home/toolbox/.cache/openai:rw | ||||||
|  |       - ${HOME}/.cache/gemini:/home/toolbox/.cache/gemini:rw | ||||||
|  |       - ${HOME}/.cache/qwen:/home/toolbox/.cache/qwen:rw | ||||||
|  |       - ${HOME}/.cache/code:/home/toolbox/.cache/code:rw | ||||||
|  |       - ${HOME}/.cache/opencode:/home/toolbox/.cache/opencode:rw | ||||||
|   | |||||||
| @@ -2,6 +2,17 @@ | |||||||
|  |  | ||||||
| set -euo pipefail | set -euo pipefail | ||||||
|  |  | ||||||
|  | # Validate dependencies | ||||||
|  | if ! command -v docker &> /dev/null; then | ||||||
|  |     echo "Error: docker is required but not installed." >&2 | ||||||
|  |     exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if ! command -v docker compose &> /dev/null; then | ||||||
|  |     echo "Error: docker compose is required but not installed." >&2 | ||||||
|  |     exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||||||
| COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml" | COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml" | ||||||
|  |  | ||||||
| @@ -18,15 +29,21 @@ ACTION="${1:-up}" | |||||||
| shift || true | shift || true | ||||||
|  |  | ||||||
| if [[ "${ACTION}" == "up" ]]; then | if [[ "${ACTION}" == "up" ]]; then | ||||||
|  |     # Create necessary directories for the toolbox tools | ||||||
|     mkdir -p "${HOME}/.local/share/mise" "${HOME}/.cache/mise" |     mkdir -p "${HOME}/.local/share/mise" "${HOME}/.cache/mise" | ||||||
|  |     mkdir -p "${HOME}/.config" "${HOME}/.local/share" | ||||||
|  |     mkdir -p "${HOME}/.cache/openai" "${HOME}/.cache/gemini" "${HOME}/.cache/qwen" "${HOME}/.cache/code" "${HOME}/.cache/opencode" | ||||||
|  |     mkdir -p "${HOME}/.config/openai" "${HOME}/.config/gemini" "${HOME}/.config/qwen" "${HOME}/.config/code" "${HOME}/.config/opencode" | ||||||
| fi | fi | ||||||
|  |  | ||||||
| case "${ACTION}" in | case "${ACTION}" in | ||||||
|     up) |     up) | ||||||
|         docker compose -f "${COMPOSE_FILE}" up --build --detach "$@" |         docker compose -f "${COMPOSE_FILE}" up --build --detach "$@" | ||||||
|  |         echo "Container started. Use 'docker exec -it $(basename "$SCRIPT_DIR" | sed 's/toolbox-//') zsh' to access the shell." | ||||||
|         ;; |         ;; | ||||||
|     down) |     down) | ||||||
|         docker compose -f "${COMPOSE_FILE}" down "$@" |         docker compose -f "${COMPOSE_FILE}" down "$@" | ||||||
|  |         echo "Container stopped." | ||||||
|         ;; |         ;; | ||||||
|     *) |     *) | ||||||
|         echo "Usage: $0 [up|down] [additional docker compose args]" >&2 |         echo "Usage: $0 [up|down] [additional docker compose args]" >&2 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user