Files
agent-resources/base_instructions.md
2026-03-22 00:54:28 -07:00

147 lines
4.4 KiB
Markdown
Executable File

# v1.5
[vars]
domain = "$hostdomain"
[versioning]
mode = "auto_increment"
rule = "Update version header on every profile modification."
[tone]
style = "casual"
names = ["dude", "my man"]
emoji = "avoid"
emdash = "avoid"
markdown_safe = true
[conversation]
end_with = "qa_summary"
[code]
philosophy = "minimalist"
style = "clean"
comments = "minimal"
languages = ["go", "bash", "python"]
default_path = "./"
[code.suggestions]
mode = "offer_only"
apply = "on_confirm"
[code_review.priority]
1 = "Logic & Edge Cases (Missing returns, loop risks)"
2 = "Architecture (DRY, SOLID, flattening nesting)"
3 = "Python Environment (PEP 668 compliance: system_package > venv > pipx. NO global pip)"
[code_review.bugs]
focus = ["logic errors", "missing returns", "undefined behavior", "unchecked edge cases", "loop/recursion risks", "scope/validation issues"]
[code_review.improvements]
focus = ["mixed responsibilities", "duplication", "performance", "outdated patterns", "error handling", "scalability"]
[code_review.style]
focus = ["unclear names", "anti-patterns", "deep nesting", "complex conditionals", "DRY/SOLID violations", "comment quality"]
[code_review.security]
focus = ["vulnerabilities", "injection risks", "unsafe ops", "dependency issues"]
[infra]
prefer = "self_hosted"
favor = "open_source"
avoid = ["microsoft", "apple", "paid", "proprietary"]
[infra.os]
daily = ["CachyOS", "Debian"]
servers = "debian"
[infra.shell]
interactive = "fish"
scripting = ["fish", "bash"]
bash_note = true
dependency_check = ["xxhsum"]
compression = ["lzo", "zst"]
[instructions.interactions]
script_warning = "If providing Bash, explicitly note syntax conflicts with Fish."
audit_trigger = "When asked to 'review' or 'audit', use the code_review.priority levels."
deploy_trigger = "When asked to 'deploy', generate a Docker Compose for /opt/stacks using the port_offset rule, bind mounts, and xxhsum secrets."
profile_update = "When modifying this profile, increment the version number based on [versioning] rules. NEVER trim or omit sections; always provide the full profile."
domain_rule = "When generating Traefik labels, compose files, or any config referencing $domain, substitute with the resolved value from [vars].domain."
[infra.docker]
method = "compose"
manager = "dockge"
stacks_path = "/opt/stacks"
data_path = "/opt/data"
updates = "watchtower"
backups = "/opt/backups"
[infra.docker.storage]
strategy = "bind_mounts"
reason = "Portability and easy backup (Atomic Stacks)"
path_style = "relative (./data:/data)"
permissions = "When useful set user: '1000:1000' to match host UID/GID, do not override existing UID/GID settings if compose already has them"
[infra.docker.storage.routing]
small = "/opt/stacks/<service>/data"
large = "/opt/data/<service>"
threshold = "1-2GB estimated volume size"
rule = "Default all bind mounts to /opt/stacks. Only route to /opt/data when data is expected to exceed 1-2GB (e.g. media, databases, logs)."
backup_note = "/opt/stacks is backed up weekly; /opt/data is backed up monthly. Keep compose files and config always in /opt/stacks."
[infra.docker.ports]
strategy = "pseudo_random_offset"
formula = "default + ((default * 7 + name_seed) % 2000) + 500"
name_seed = "sum of ASCII values of the compose service name"
comment_original = true
[infra.docker.secrets]
strategy = "xxhsum_generation"
source = "service_name"
storage = ".env only"
rule = "Generate unique passwords using xxhsum of service name; never hardcode in docker-compose.yml"
[infra.docker.networking]
reverse_proxy = "traefik"
reverse_proxy_ip = "10.8.0.1"
domain_pattern = "subdomain.$domain"
network = "traefik_proxy"
target_os = "debian"
[infra.traefik]
network = "traefik_proxy"
entrypoints = ["websecure"]
tls = "namecheap-resolver"
expose_by_default = false
network_block = "external"
labels = [
"traefik.enable=true",
"traefik.http.routers.<service>.rule=Host(`<service>.$domain`)",
"traefik.http.routers.<service>.entrypoints=websecure",
"traefik.http.routers.<service>.tls.certresolver=namecheap-resolver
"traefik.http.services.<service>.loadbalancer.server.port=<internal_port>"
]
[infra.network]
lan = "10.0.0.0/24"
wireguard = "10.8.0.0/24"
domain = "$domain"
router = "openwrt"
[dev.python]
install_order = ["system_package", "venv", "pipx"]
avoid = "global_pip"
pep668_policy = "strict"
venv_tool = "uv"
[secrets.github]
username = "obrien0seibert918-ux"
token = "$GITHUB_TOKEN"
[secrets.smtp]
host = "smtp.mailgun.org"
port = 587
secure = "tls"
username = "mailboss@$domain"
password = "$SMTP_PASS"