I'm running daimon-memory's server in Docker Desktop on Windows (Linux containers via WSL2) and the clients (Claude Code, Codex, Hermes) from Git Bash. The server-side path is clean — docker compose up works on Windows out of the box. The three client install scripts, however, have POSIX assumptions that don't survive Git Bash for Windows.
Blocker 1: integrations/codex/install.sh
- Lines 90–92:
sed -i.bak is used three times to substitute __DAIMON_PLUGIN_ROOT__, __DAIMON_MCP_URL__, and __DAIMON_API_KEY__ in staged plugin files. MSYS sed (Git Bash) handles -i.bak differently than GNU sed and can produce stray .bak files in the plugin directory or mangle paths with backslashes.
- Lines 43, 98:
command -v python3 and a heredoc Python patcher. python3 is not in Git Bash's default PATH on Windows. The installer silently skips enabling Codex native memory, leaving the mirror broken (the warning is just a soft return-1).
The same file already uses Python for config.toml patching, so Python is already a known dependency — the rest of the script just needs to follow suit.
Blocker 2: integrations/hermes/install.sh
- Uses POSIX
sed to edit $HERMES_HOME/config.yaml. If a user has previously edited that file on Windows (CRLF), the sed line injection produces mixed line endings that yaml.safe_load rejects on next read.
Blocker 3: integrations/claude-code/plugins/daimon-memory/scripts/
recall-state.mjs:11, nudge-lib.mjs:57, precompact-state.mjs:13: state directory falls back to homedir() + ".local/state" when XDG_STATE_HOME is unset. On Windows this is C:\Users\<user>\.local\state\... — functional but non-idiomatic. %LOCALAPPDATA%\daimon-memory\... would be the Windows-correct path.
Acceptance criteria
- All three install scripts either use Python (with a
py -3 fallback) or portable shell that survives Git Bash.
- A Windows + Git Bash + Docker Desktop smoke test is documented in
README.md (analogous to the existing "Quick start" section).
- Per-script Windows path handling: prefer
%LOCALAPPDATA% (Windows) / ~/.local/state (POSIX).
- The cross-client parity test at
integrations/tests/nudge-lib.test.mjs continues to pass.
Why this matters
The README's headline claim is "One backend for Claude Code, Codex, Hermes, and your own agents." A Windows + Git Bash user is a real second user — without this fix, the Codex and Hermes clients are effectively Linux/macOS-only.
Related sub-issues I'd like to land before this umbrella can close:
- Codex
sed -i.bak → Python rewrite
- Claude Code state path: prefer
%LOCALAPPDATA% on Windows
- Hermes
sed on YAML → Python rewrite
- Promote the
XDG_STATE_HOME fallback helper to lib/state-paths.mjs and share it across Claude and Codex
I'm running daimon-memory's server in Docker Desktop on Windows (Linux containers via WSL2) and the clients (Claude Code, Codex, Hermes) from Git Bash. The server-side path is clean —
docker compose upworks on Windows out of the box. The three client install scripts, however, have POSIX assumptions that don't survive Git Bash for Windows.Blocker 1:
integrations/codex/install.shsed -i.bakis used three times to substitute__DAIMON_PLUGIN_ROOT__,__DAIMON_MCP_URL__, and__DAIMON_API_KEY__in staged plugin files. MSYS sed (Git Bash) handles-i.bakdifferently than GNU sed and can produce stray.bakfiles in the plugin directory or mangle paths with backslashes.command -v python3and a heredoc Python patcher.python3is not in Git Bash's default PATH on Windows. The installer silently skips enabling Codex native memory, leaving the mirror broken (the warning is just a soft return-1).The same file already uses Python for
config.tomlpatching, so Python is already a known dependency — the rest of the script just needs to follow suit.Blocker 2:
integrations/hermes/install.shsedto edit$HERMES_HOME/config.yaml. If a user has previously edited that file on Windows (CRLF), the sed line injection produces mixed line endings thatyaml.safe_loadrejects on next read.Blocker 3:
integrations/claude-code/plugins/daimon-memory/scripts/recall-state.mjs:11,nudge-lib.mjs:57,precompact-state.mjs:13: state directory falls back tohomedir() + ".local/state"whenXDG_STATE_HOMEis unset. On Windows this isC:\Users\<user>\.local\state\...— functional but non-idiomatic.%LOCALAPPDATA%\daimon-memory\...would be the Windows-correct path.Acceptance criteria
py -3fallback) or portable shell that survives Git Bash.README.md(analogous to the existing "Quick start" section).%LOCALAPPDATA%(Windows) /~/.local/state(POSIX).integrations/tests/nudge-lib.test.mjscontinues to pass.Why this matters
The README's headline claim is "One backend for Claude Code, Codex, Hermes, and your own agents." A Windows + Git Bash user is a real second user — without this fix, the Codex and Hermes clients are effectively Linux/macOS-only.
Related sub-issues I'd like to land before this umbrella can close:
sed -i.bak→ Python rewrite%LOCALAPPDATA%on Windowssedon YAML → Python rewriteXDG_STATE_HOMEfallback helper tolib/state-paths.mjsand share it across Claude and Codex