10 KiB
10 KiB
AGENTS.md
Purpose
- This repository is primarily infrastructure-as-code for Docker Compose, Docker Swarm, Kubernetes, Helm, and Ansible.
- There is also a small Python Flask service in
webhook/and a Streamlit app insrc/. - Prefer narrow, low-risk edits. Many files are deployment manifests where a small typo can break production behavior.
Agent Priorities
- Preserve the existing structure and conventions of the file you are editing.
- Favor minimal diffs over broad refactors.
- Do not rotate secrets, change domains, or alter deployment targets unless the task explicitly requires it.
- Treat
archive/as historical unless the task explicitly mentions it. - When changing runtime configuration, update only the active path (
compose/,swarm/,cluster/,ansible/,webhook/,src/) relevant to the request.
Rule Files
- No
.cursor/rules/directory was found. - No
.cursorrulesfile was found. - No
.github/copilot-instructions.mdfile was found. - This file therefore acts as the main agent guidance for the repository.
Repository Areas
makefile: top-level operator commands for Compose and Swarm deploys.compose.yml+compose/: Docker Compose configuration assembled viainclude:.swarm/: Docker Swarm stacks, environment-driven labels, and Traefik config.cluster/: Kubernetes manifests and Helm charts.ansible/: playbooks and RKE2 automation.webhook/: Poetry-managed Flask app.src/: Streamlit app and Python requirements.scripts/: setup, build, and smoke-test scripts.
Build Commands
- Full local compose stack:
make serve - Stop local compose stack:
make down - Validate merged compose config:
docker compose -f compose.yml config - Bring local compose stack up manually:
docker compose -f compose.yml up -d --build --pull always - Legacy CI-style compose build path:
./scripts/build.sh - Local Streamlit app only:
streamlit run src/app.py - Local webhook app only:
cd webhook && poetry run python http_server.py - Swarm core deploy:
make deploy-core - Swarm app deploy:
make deploy-apps - Swarm services deploy:
make deploy-services - Ansible RKE2 cluster bootstrap:
cd ansible/rke2 && ansible-playbook site.yaml -i inventory/hosts.ini --key-file ~/.ssh/id_rsa -K
Lint And Validation Commands
- There is no repo-wide lint target or CI workflow checked into the repository.
- There are no configured
ruff,black,flake8,mypy,yamllint,ansible-lint, orpytestconfigs in the root. - Use syntax and render validation that matches the area you changed.
- Compose validation:
docker compose -f compose.yml config - Swarm file validation:
docker stack deploy --compose-file ./swarm/<stack>.yml <stack> --dry-runis not available in Docker Swarm, so usedocker compose configpatterns where possible and review label/env interpolation carefully. - Helm chart render check:
helm template test-release cluster/coder-chart - Helm chart lint check:
helm lint cluster/coder-chart - Helm dependency check for
cluster/code-server:helm dependency update cluster/code-server - Kubernetes manifest spot check:
kubectl apply --dry-run=client -f <file> - Ansible syntax check:
ansible-playbook --syntax-check <playbook> -i <inventory> - Python webhook dependency install:
cd webhook && poetry install - Python webhook quick import/run check:
cd webhook && poetry run python http_server.py
Test Commands
- Main end-to-end smoke test script:
./scripts/test.sh - Legacy CI path:
./scripts/travis.sh - The smoke test expects a populated
.env, reachable hosts, and a running local Traefik/Compose environment. - It verifies redirects and dashboard auth using values from
.env. - Helm chart test hook exists for
cluster/coder-chart; after install, run:helm test <release-name> - There are example/test deployment files under
test/, but no unified automated test runner is wired to them. - There are currently no checked-in Python unit tests for
webhook/orsrc/.
Running A Single Test
- There is no first-class single-test command for the main smoke suite in
./scripts/test.sh; it is a single shell script. - To run one smoke assertion, copy the relevant
curlcommand from./scripts/test.shand execute it directly. - For Helm, the narrowest useful check is a single chart render/lint:
helm lint cluster/coder-charthelm template test-release cluster/coder-chart- For a single Kubernetes manifest, use:
kubectl apply --dry-run=client -f path/to/file.yaml - For a single Ansible playbook, use:
ansible-playbook --syntax-check path/to/playbook.yml -i inventory - If Python tests are added later, the expected targeted form would be:
cd webhook && poetry run pytest path/to/test_file.py::test_name - Do not claim pytest support exists today unless you also add the test dependency and test files.
Working Safely With Config
- Many YAML files interpolate env vars like
${DOMAINNAME},${POSTGRES_PASSWORD}, or${VAR?Variable not set}. - Preserve existing variable names exactly; accidental renames will break deployments.
- Prefer existing anchors and aliases, such as
x-environmentblocks, over duplicating env declarations. - Preserve quoting style when editing Traefik labels or shell-sensitive strings.
- Be careful with
$escaping inside labels and regex replacements. - Avoid changing published ports, hostnames, or Traefik router rules unless explicitly requested.
Code Style: General
- Match the local style of the file you touch rather than imposing a new formatter.
- Keep YAML keys, Helm templates, and Ansible tasks visually aligned and easy to scan.
- Prefer small, direct changes over restructuring files.
- Keep comments only when they explain a non-obvious operational constraint.
- Reuse existing naming patterns like
api_server,postgres_db,streamlit-fin, anddeploy-core. - Preserve file-specific indentation conventions: YAML uses spaces, Make uses tabs for recipe lines, shell scripts use the existing shell style.
Imports
- In Python, keep imports at the top of the file.
- Prefer standard library imports first, then third-party imports.
- Avoid unused imports.
- Follow the existing concise import style unless you are already refactoring the file for readability.
- When touching
webhook/http_server.pyorsrc/app.py, it is acceptable to improve import ordering if part of a necessary edit.
Formatting
- YAML: two-space indentation, no tab characters.
- Helm templates: preserve current whitespace trimming markers like
{{-and-}}. - Python: use four-space indentation even though some existing files are inconsistent.
- Shell: keep
set -eorset -evwhen present; do not remove safety flags casually. - Markdown: keep bullets short and operational.
- Do not introduce large-scale formatting churn in files that are otherwise working.
Types And Data Shapes
- Python code in this repo is lightly typed today; there is no mypy configuration.
- Add type hints when they clarify new or changed Python logic, but do not force a repo-wide typing conversion.
- For YAML, respect the existing scalar style and only quote when interpolation, special characters, or parser ambiguity require it.
- Keep environment values as strings unless the target format clearly expects booleans or integers.
- In Helm values and templates, preserve the expected shape of objects and lists; changing key structure is usually a breaking change.
Naming Conventions
- Docker Compose services commonly use snake_case or hyphenated names already established in the file; follow the surrounding pattern.
- Ansible task names should be descriptive imperative phrases.
- Kubernetes resource names should stay lowercase and DNS-safe.
- Python function names should be
snake_case. - Python constants and environment variable names should be uppercase.
- Keep public-facing hostnames and router names consistent with nearby services.
Error Handling
- Do not swallow errors silently in new Python code.
- Avoid bare
except:; catch specific exceptions where practical. - Return clear HTTP responses in Flask handlers.
- In shell scripts, prefer failing fast over ignoring command failures.
- In Ansible, use
register,when, andchanged_whenintentionally; do not mark tasks changed without a reason. - In deployment config, prefer explicit required vars like
${VAR?Variable not set}for critical settings.
Python-Specific Notes
webhook/http_server.pycurrently uses minimal Flask code and would benefit from improved formatting and more explicit error handling when modified.src/app.pycontains Streamlit logic with some inconsistent spacing and a bareexcept:; fix such issues only when your change touches that area.- Preserve current runtime entrypoints unless the task explicitly changes startup behavior.
Ansible-Specific Notes
- Prefer fully qualified module names such as
ansible.builtin.commandwhere the surrounding file already uses them. - Keep playbooks idempotent where possible.
- Avoid unnecessary
shellusage whencommand,template,copy, or dedicated modules work. - Respect existing inventory and variable layout under
ansible/rke2/inventory/. - Be cautious with
become_user,changed_when, and cluster bootstrap sequencing.
Helm And Kubernetes Notes
- Render Helm templates locally before making broad chart changes.
- Preserve helper usage like
include,toYaml,nindent, and existing label helpers. - Avoid renaming values keys unless you also update every template consumer.
- Maintain probe, volume, and securityContext structure unless there is a concrete reason to change them.
- For plain manifests, keep apiVersion, kind, metadata, and spec ordering consistent with nearby files.
Docker And Traefik Notes
- Traefik labels are heavily used and are sensitive to quoting and interpolation.
- Keep router, middleware, and service label names consistent across related files.
- Prefer extending shared env blocks and shared network definitions over one-off duplication.
- Be careful with
host-gateway, mounted Docker sockets, and certificate storage paths. - Do not commit real secrets into compose, swarm, or manifest files.
When Unsure
- Validate the smallest affected surface first.
- Prefer commands that only render or syntax-check before commands that deploy.
- If a task spans multiple deployment systems, confirm which path is active before editing all of them.
- Document assumptions in the final response if the repo does not provide a definitive source of truth.