Skip to content

Modules need a standard convention for stable persistent storage #782

Description

@mafredri

Modules that need to persist data across workspace restarts (state files, cached binaries, scripts) have no standard way to do it. This has led to several ad-hoc patterns, each with its own problems.

Current situation

CODER_SCRIPT_DATA_DIR doesn't work for persistence. It was originally intended as a per-module cache directory, but the path contains a per-script UUID that changes on every workspace start. The module gets a fresh empty directory each time, and the previous one is left orphaned. We never noticed because the default base path is /tmp.

For reference, the on-disk layout when CODER_AGENT_SCRIPT_DATA_DIR=~/.coder:

~/.coder/coder-script-data/
  07967256-3f92-4f6b-ab50-b078c13b996a/   # per-script UUID, new each start
  fac108ad-1028-47b0-ad60-c71ddc6188be/   # per-script UUID, new each start
  bin/                                    # shared, stable, this one works

CODER_SCRIPT_BIN_DIR (bin/) is stable and shared across scripts. The per-script UUID directories are not.

Some modules write to /tmp with fixed generic names. For example, agentapi writes bootstrap scripts to /tmp/main.sh, which can collide with other modules or be accidentally overwritten. #771 started addressing this for agentapi specifically.

Several modules have independently invented $HOME/<name>/ directories:

  • agentapi: $HOME/${MODULE_DIR_NAME}
  • amazon-q: $HOME/.aws/.amazonq
  • cursor-cli: $HOME/.cursor-cli-module
  • kiro-cli: $HOME/.kiro

This works, but every module picks its own name and location with no shared convention, and it scatters dotdirs across the user's home directory.

A couple of modules still use CODER_SCRIPT_DATA_DIR directly (devcontainers-cli, archive). Whether that's a problem depends on whether they actually need data to survive restarts.

Proposal

Short term (registry convention):

Establish a shared parent directory like $HOME/.coder-modules/ where each module namespaces its own data:

$HOME/.coder-modules/
  agentapi/
  claude-code/
  amazon-q/

This groups module data in one place instead of scattering it across $HOME, and is forward-compatible with a future agent-provided directory (see below).

The work:

  1. Audit existing modules to understand which need persistent storage, which are fine with ephemeral, and which might have bugs from UUID rotation or /tmp collisions.
  2. Document the $HOME/.coder-modules/<name>/ convention so new modules follow it.
  3. Migrate modules that currently use /tmp paths or CODER_SCRIPT_DATA_DIR incorrectly.

Longer term (coder/coder):

The agent could provide a CODER_MODULE_DATA_DIR pointing to a stable shared directory, similar to how CODER_SCRIPT_BIN_DIR works for binaries. Modules would use $CODER_MODULE_DATA_DIR/<name>/. A shared directory fits better than per-module named ones since the agent sees scripts, not Terraform modules.

Related

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions