From fd2dc58687f50fbe716d1a1183b7d0d78865c1e5 Mon Sep 17 00:00:00 2001 From: S Smith Date: Fri, 12 Jun 2026 07:53:13 +0000 Subject: [PATCH 1/4] add agents --- AGENTS.md | 184 ++++++++++++++++++++++ CLAUDE.md | 1 + roles/devcontainer_sync/defaults/main.yml | 2 + 3 files changed, 187 insertions(+) create mode 100644 AGENTS.md create mode 100644 CLAUDE.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..bc2fe69 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,184 @@ +# AGENTS.md + +Navigation guide for AI agents. Organized by the type of change being requested. + +## Architecture overview + +`group_vars/all.yml` — the user's configuration: a list of containers and global AWS SSO settings. +`roles/devcontainer_sync/defaults/main.yml` — role defaults: all plugin definitions, default image, and base container settings. + +Ansible merges in this order (last wins): `devcontainer_defaults` → merged plugin values → per-container config from `devcontainers[*]`. + +--- + +## Query: "add/change something for [language] containers" + +`rust`, `python`, `typescript`, `terraform`, `java`, etc. are **primary languages**. A primary language is just a plugin that also sets the container image automatically. + +**Global plugin config** (affects every container using that language): +``` +roles/devcontainer_sync/defaults/main.yml + devcontainer_plugins.: + install_steps: [...] + vscode_extensions: [...] + vscode_settings: {...} + features: {...} + mounts: [...] + post_create_commands: [...] + container_env: {...} +``` + +**Language → image mapping** (which base image a language container gets): +``` +roles/devcontainer_sync/defaults/main.yml + devcontainer_primary_language_images: + rust: ... + python: ... + typescript: ... + java: ... +``` + +**Per-container override** (affects only one container): +``` +group_vars/all.yml + devcontainers: + - name: + primary_language: rust # sets image + activates rust plugin + install_steps: [...] # appended to plugin's install_steps +``` + +--- + +## Query: "add/change something for all containers" + +Defaults applied to every container before plugins and per-container config: +``` +roles/devcontainer_sync/defaults/main.yml + devcontainer_defaults: + image: ... + install_steps: [...] + vscode_extensions: [...] + vscode_settings: {...} + features: {...} + mounts: [...] + post_create_commands: [...] + post_start_commands: [...] + post_attach_commands: [...] + initialize_commands: [...] + container_env: {...} + remote_env: {...} + run_args: [...] + plugins: [...] # plugins active on every container by default +``` + +--- + +## Query: "add a new plugin" + +Add an entry to: +``` +roles/devcontainer_sync/defaults/main.yml + devcontainer_plugins: + : + install_steps: [...] + vscode_extensions: [...] + ... +``` + +Containers opt in via: +``` +group_vars/all.yml + devcontainers: + - name: + plugins: + - +``` + +--- + +## Query: "add/modify a specific container" + +``` +group_vars/all.yml + devcontainers: + - name: # required; also the workspace subfolder name by default + path: # optional override if workspace path differs from name + primary_language: # optional; sets image + activates language plugin + image: # optional; overrides primary_language image + plugins: [...] # additional plugins beyond defaults + install_steps: [...] + vscode_extensions: [...] + vscode_settings: {...} + features: {...} + mounts: [...] + run_args: [...] + container_env: {...} + remote_env: {...} + post_create_commands: [...] + post_start_commands: [...] + post_attach_commands: [...] + initialize_commands: [...] + update_remote_user_uid: true # optional +``` + +--- + +## Query: "add/change VS Code extensions" + +| Scope | Path | +|---|---| +| All containers | `defaults/main.yml → devcontainer_defaults.vscode_extensions` | +| All rust containers | `defaults/main.yml → devcontainer_plugins.rust.vscode_extensions` | +| One container | `group_vars/all.yml → devcontainers[name=X].vscode_extensions` | + +--- + +## Query: "add/change mounts" + +| Scope | Path | +|---|---| +| All containers | `defaults/main.yml → devcontainer_defaults.mounts` | +| Language/plugin | `defaults/main.yml → devcontainer_plugins..mounts` | +| One container | `group_vars/all.yml → devcontainers[name=X].mounts` | + +Cache-related plugins (`cache_cargo`, `cache_node`, `cache_python`, etc.) manage their own mounts. + +--- + +## Query: "add an install step" + +| Scope | Path | +|---|---| +| All containers | `defaults/main.yml → devcontainer_defaults.install_steps` | +| Language/plugin | `defaults/main.yml → devcontainer_plugins..install_steps` | +| One container | `group_vars/all.yml → devcontainers[name=X].install_steps` | + +`install_steps` are rendered into `.devcontainer/install.sh` via `templates/install.sh.j2`. Lists from defaults, plugins, and per-container config are **appended** (not replaced). + +--- + +## Query: "add a devcontainer feature" + +``` +roles/devcontainer_sync/defaults/main.yml + devcontainer_plugins.: + features: + ghcr.io/devcontainers/features/:: + optionKey: value +``` + +Or per-container in `group_vars/all.yml → devcontainers[name=X].features`. + +--- + +## File map + +| File | Purpose | +|---|---| +| `group_vars/all.yml` | User config: container list, AWS SSO | +| `group_vars/all.example.yml` | Example showing all common patterns | +| `roles/devcontainer_sync/defaults/main.yml` | All plugin definitions, defaults, image map | +| `roles/devcontainer_sync/tasks/sync_devcontainer.yml` | Merge logic: how defaults + plugins + per-container combine | +| `roles/devcontainer_sync/templates/install.sh.j2` | Template for the generated install.sh | +| `roles/devcontainer_sync/templates/aws_configure.sh.j2` | Template for AWS SSO setup script | +| `files//` | Extra static files copied into a container's `.devcontainer/` | diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/roles/devcontainer_sync/defaults/main.yml b/roles/devcontainer_sync/defaults/main.yml index c3f3494..e2af723 100644 --- a/roles/devcontainer_sync/defaults/main.yml +++ b/roles/devcontainer_sync/defaults/main.yml @@ -74,6 +74,7 @@ devcontainer_plugins: rust: install_steps: + - sudo apt install -y python-is-python3 - cargo install --locked cargo-nextest vscode_settings: rust-analyzer.runnables.test.overrideCommand: @@ -153,6 +154,7 @@ devcontainer_plugins: typescript: install_steps: + - sudo apt update && sudo apt install -y npm --no-install-recommends - npm install github: From e9cb408f3ac6be4cdc0f0b3dcea8408de5ff5d94 Mon Sep 17 00:00:00 2001 From: S Smith Date: Fri, 12 Jun 2026 07:54:37 +0000 Subject: [PATCH 2/4] update tests --- tests/golden_output | 4 ++++ tests/node-example/.devcontainer/install.sh | 2 ++ tests/rust-example/.devcontainer/install.sh | 2 ++ 3 files changed, 8 insertions(+) diff --git a/tests/golden_output b/tests/golden_output index 018bde7..e12b1d7 100644 --- a/tests/golden_output +++ b/tests/golden_output @@ -180,6 +180,8 @@ sudo apt update && sudo apt install -y ripgrep sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata +sudo apt update && sudo apt install -y npm --no-install-recommends + npm install curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh @@ -413,6 +415,8 @@ sudo apt update && sudo apt install -y ripgrep sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata +sudo apt install -y python-is-python3 + cargo install --locked cargo-nextest curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh diff --git a/tests/node-example/.devcontainer/install.sh b/tests/node-example/.devcontainer/install.sh index 79c9937..c6e2156 100755 --- a/tests/node-example/.devcontainer/install.sh +++ b/tests/node-example/.devcontainer/install.sh @@ -9,6 +9,8 @@ sudo apt update && sudo apt install -y ripgrep sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata +sudo apt update && sudo apt install -y npm --no-install-recommends + npm install curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh diff --git a/tests/rust-example/.devcontainer/install.sh b/tests/rust-example/.devcontainer/install.sh index bc3e9be..db679d4 100755 --- a/tests/rust-example/.devcontainer/install.sh +++ b/tests/rust-example/.devcontainer/install.sh @@ -9,6 +9,8 @@ sudo apt update && sudo apt install -y ripgrep sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata +sudo apt install -y python-is-python3 + cargo install --locked cargo-nextest curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh From 0ce983d62ea1302e413b542106dda43aaee138f0 Mon Sep 17 00:00:00 2001 From: S Smith Date: Sun, 21 Jun 2026 19:22:58 +0000 Subject: [PATCH 3/4] update defaults --- roles/devcontainer_sync/defaults/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/roles/devcontainer_sync/defaults/main.yml b/roles/devcontainer_sync/defaults/main.yml index e2af723..8ee132f 100644 --- a/roles/devcontainer_sync/defaults/main.yml +++ b/roles/devcontainer_sync/defaults/main.yml @@ -23,7 +23,7 @@ devcontainer_defaults: post_attach_commands: [] initialize_commands: [] install_steps: - - sudo apt update && sudo apt install -y ripgrep + - sudo apt update && sudo apt install -y ripgrep ncat - sudo ln -sf /usr/share/zoneinfo/{{ local_timezone }} /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata container_env: {} remote_env: {} @@ -54,6 +54,8 @@ devcontainer_plugins: - touch /opt/claude-code-config/.claude.json - ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json - ln -sfn /opt/claude-code-config/.claude $HOME/.claude + # devcontainers are supposed to be sandboxes; cron will be unreliable/unavailable + - echo "export CLAUDE_CODE_DISABLE_CRON=1" >> ~/.bashrc mounts: - source=claude-code-config,target=/opt/claude-code-config,type=volume - source=claude-scope-project-${localWorkspaceFolderBasename},target=${containerWorkspaceFolder}/.claude,type=volume From c3c97f0579fee49b61baa81305614e91a9be77ad Mon Sep 17 00:00:00 2001 From: S Smith Date: Sun, 21 Jun 2026 19:24:52 +0000 Subject: [PATCH 4/4] update tests --- .../.devcontainer/devcontainer.json | 2 +- tests/cloud-example/.devcontainer/install.sh | 2 +- tests/golden_output | 16 ++++++++-------- .../node-example/.devcontainer/devcontainer.json | 2 +- tests/node-example/.devcontainer/install.sh | 2 +- .../.devcontainer/devcontainer.json | 2 +- tests/python-example/.devcontainer/install.sh | 2 +- .../rust-example/.devcontainer/devcontainer.json | 2 +- tests/rust-example/.devcontainer/install.sh | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/cloud-example/.devcontainer/devcontainer.json b/tests/cloud-example/.devcontainer/devcontainer.json index f1ba7e6..64c422a 100644 --- a/tests/cloud-example/.devcontainer/devcontainer.json +++ b/tests/cloud-example/.devcontainer/devcontainer.json @@ -44,5 +44,5 @@ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "cloud-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && sudo mkdir -p /opt/devcontainer-cache/terraform && sudo chown -R $USER:$USER /opt/devcontainer-cache/terraform && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo mkdir -p /opt/devcontainer-cache/terraform && sudo chown -R $USER:$USER /opt/devcontainer-cache/terraform && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } diff --git a/tests/cloud-example/.devcontainer/install.sh b/tests/cloud-example/.devcontainer/install.sh index 370161e..469893f 100755 --- a/tests/cloud-example/.devcontainer/install.sh +++ b/tests/cloud-example/.devcontainer/install.sh @@ -5,7 +5,7 @@ DEVCONTAINER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" containerWorkspaceFolder="$(dirname -- "$DEVCONTAINER_DIR")" export containerWorkspaceFolder -sudo apt update && sudo apt install -y ripgrep +sudo apt update && sudo apt install -y ripgrep ncat sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata diff --git a/tests/golden_output b/tests/golden_output index e12b1d7..88b9f5b 100644 --- a/tests/golden_output +++ b/tests/golden_output @@ -103,7 +103,7 @@ grep -qxF "$bashrc_hook" "$HOME/.bashrc" || printf '\n%s\n' "$bashrc_hook" >> "$ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "cloud-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && sudo mkdir -p /opt/devcontainer-cache/terraform && sudo chown -R $USER:$USER /opt/devcontainer-cache/terraform && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo mkdir -p /opt/devcontainer-cache/terraform && sudo chown -R $USER:$USER /opt/devcontainer-cache/terraform && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } #!/bin/bash set -euo pipefail @@ -112,7 +112,7 @@ DEVCONTAINER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" containerWorkspaceFolder="$(dirname -- "$DEVCONTAINER_DIR")" export containerWorkspaceFolder -sudo apt update && sudo apt install -y ripgrep +sudo apt update && sudo apt install -y ripgrep ncat sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata @@ -167,7 +167,7 @@ trim_trailing_whitespace = false "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "node-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && sudo mkdir -p /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && sudo chown -R $USER:$USER /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && touch $HOME/.npmrc && (grep -qxF 'store-dir=/opt/devcontainer-cache/pnpm' $HOME/.npmrc || echo 'store-dir=/opt/devcontainer-cache/pnpm' >> $HOME/.npmrc) && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo mkdir -p /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && sudo chown -R $USER:$USER /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && touch $HOME/.npmrc && (grep -qxF 'store-dir=/opt/devcontainer-cache/pnpm' $HOME/.npmrc || echo 'store-dir=/opt/devcontainer-cache/pnpm' >> $HOME/.npmrc) && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } #!/bin/bash set -euo pipefail @@ -176,7 +176,7 @@ DEVCONTAINER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" containerWorkspaceFolder="$(dirname -- "$DEVCONTAINER_DIR")" export containerWorkspaceFolder -sudo apt update && sudo apt install -y ripgrep +sudo apt update && sudo apt install -y ripgrep ncat sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata @@ -314,7 +314,7 @@ grep -qxF "$bashrc_hook" "$HOME/.bashrc" || printf '\n%s\n' "$bashrc_hook" >> "$ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "python-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && sudo mkdir -p /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo chown -R $USER:$USER /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo mkdir -p /opt/devcontainer-cache/ansible/collections && sudo chown -R $USER:$USER /opt/devcontainer-cache/ansible && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo mkdir -p /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo chown -R $USER:$USER /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo mkdir -p /opt/devcontainer-cache/ansible/collections && sudo chown -R $USER:$USER /opt/devcontainer-cache/ansible && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } #!/bin/bash set -euo pipefail @@ -323,7 +323,7 @@ DEVCONTAINER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" containerWorkspaceFolder="$(dirname -- "$DEVCONTAINER_DIR")" export containerWorkspaceFolder -sudo apt update && sudo apt install -y ripgrep +sudo apt update && sudo apt install -y ripgrep ncat sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata @@ -402,7 +402,7 @@ trim_trailing_whitespace = false "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "rust-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && sudo mkdir -p /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo chown -R $USER:$USER /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo mkdir -p /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo chown -R $USER:$USER /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } #!/bin/bash set -euo pipefail @@ -411,7 +411,7 @@ DEVCONTAINER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" containerWorkspaceFolder="$(dirname -- "$DEVCONTAINER_DIR")" export containerWorkspaceFolder -sudo apt update && sudo apt install -y ripgrep +sudo apt update && sudo apt install -y ripgrep ncat sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata diff --git a/tests/node-example/.devcontainer/devcontainer.json b/tests/node-example/.devcontainer/devcontainer.json index 45b86a8..f9e46dc 100644 --- a/tests/node-example/.devcontainer/devcontainer.json +++ b/tests/node-example/.devcontainer/devcontainer.json @@ -27,5 +27,5 @@ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "node-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && sudo mkdir -p /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && sudo chown -R $USER:$USER /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && touch $HOME/.npmrc && (grep -qxF 'store-dir=/opt/devcontainer-cache/pnpm' $HOME/.npmrc || echo 'store-dir=/opt/devcontainer-cache/pnpm' >> $HOME/.npmrc) && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo mkdir -p /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && sudo chown -R $USER:$USER /opt/devcontainer-cache/npm /opt/devcontainer-cache/pnpm && touch $HOME/.npmrc && (grep -qxF 'store-dir=/opt/devcontainer-cache/pnpm' $HOME/.npmrc || echo 'store-dir=/opt/devcontainer-cache/pnpm' >> $HOME/.npmrc) && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } diff --git a/tests/node-example/.devcontainer/install.sh b/tests/node-example/.devcontainer/install.sh index c6e2156..51fa75b 100755 --- a/tests/node-example/.devcontainer/install.sh +++ b/tests/node-example/.devcontainer/install.sh @@ -5,7 +5,7 @@ DEVCONTAINER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" containerWorkspaceFolder="$(dirname -- "$DEVCONTAINER_DIR")" export containerWorkspaceFolder -sudo apt update && sudo apt install -y ripgrep +sudo apt update && sudo apt install -y ripgrep ncat sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata diff --git a/tests/python-example/.devcontainer/devcontainer.json b/tests/python-example/.devcontainer/devcontainer.json index a3fda2f..89dc5bb 100644 --- a/tests/python-example/.devcontainer/devcontainer.json +++ b/tests/python-example/.devcontainer/devcontainer.json @@ -55,5 +55,5 @@ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "python-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && sudo mkdir -p /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo chown -R $USER:$USER /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo mkdir -p /opt/devcontainer-cache/ansible/collections && sudo chown -R $USER:$USER /opt/devcontainer-cache/ansible && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo mkdir -p /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo chown -R $USER:$USER /opt/devcontainer-cache/pip /opt/devcontainer-cache/uv && sudo mkdir -p /opt/devcontainer-cache/ansible/collections && sudo chown -R $USER:$USER /opt/devcontainer-cache/ansible && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } diff --git a/tests/python-example/.devcontainer/install.sh b/tests/python-example/.devcontainer/install.sh index 6345b2c..a49293f 100755 --- a/tests/python-example/.devcontainer/install.sh +++ b/tests/python-example/.devcontainer/install.sh @@ -5,7 +5,7 @@ DEVCONTAINER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" containerWorkspaceFolder="$(dirname -- "$DEVCONTAINER_DIR")" export containerWorkspaceFolder -sudo apt update && sudo apt install -y ripgrep +sudo apt update && sudo apt install -y ripgrep ncat sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata diff --git a/tests/rust-example/.devcontainer/devcontainer.json b/tests/rust-example/.devcontainer/devcontainer.json index 346d117..0238006 100644 --- a/tests/rust-example/.devcontainer/devcontainer.json +++ b/tests/rust-example/.devcontainer/devcontainer.json @@ -42,5 +42,5 @@ "source=devcontainer-history-${localWorkspaceFolderBasename},target=/commandhistory,type=volume" ], "name": "rust-example", - "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && sudo mkdir -p /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo chown -R $USER:$USER /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" + "postCreateCommand": "sudo chown $USER:$USER /opt/.codex && ln -sfn /opt/.codex $HOME/.codex && sudo chown $USER:$USER /opt/.agents && ln -sfn /opt/.agents $HOME/.agents && sudo chown $USER:$USER ${containerWorkspaceFolder}/.claude && sudo chown $USER:$USER /opt/claude-code-config && mkdir -p /opt/claude-code-config/.claude && touch /opt/claude-code-config/.claude.json && ln -sfn /opt/claude-code-config/.claude.json $HOME/.claude.json && ln -sfn /opt/claude-code-config/.claude $HOME/.claude && echo \"export CLAUDE_CODE_DISABLE_CRON=1\" >> ~/.bashrc && sudo mkdir -p /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo chown -R $USER:$USER /usr/local/cargo/registry /usr/local/cargo/git ${containerWorkspaceFolder}/target && sudo mkdir -p /commandhistory && sudo touch /commandhistory/.bash_history && sudo chown -R $USER:$USER /commandhistory && bash \"${containerWorkspaceFolder}/.devcontainer/install.sh\"" } diff --git a/tests/rust-example/.devcontainer/install.sh b/tests/rust-example/.devcontainer/install.sh index db679d4..f736273 100755 --- a/tests/rust-example/.devcontainer/install.sh +++ b/tests/rust-example/.devcontainer/install.sh @@ -5,7 +5,7 @@ DEVCONTAINER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" containerWorkspaceFolder="$(dirname -- "$DEVCONTAINER_DIR")" export containerWorkspaceFolder -sudo apt update && sudo apt install -y ripgrep +sudo apt update && sudo apt install -y ripgrep ncat sudo ln -sf /usr/share/zoneinfo/America/Chicago /etc/localtime && sudo dpkg-reconfigure -f noninteractive tzdata