fix(linux): normalize runtime-root dir casing (LifeOS → LIFEOS) — silent memory failure on case-sensitive FS#1406
Conversation
|
Note for triage: the diff is a pure |
Native runtime tools/hooks resolve the config-root runtime as mixed-case `~/.claude/LifeOS`, but DeployCore deploys it to all-caps `~/.claude/LIFEOS` (to match the `@LIFEOS/...` imports in CLAUDE.md). On macOS (case-insensitive FS) these coincide; on Linux (case-sensitive) the tools read a nonexistent path and silently return empty — e.g. MemoryStatus reports the KNOWLEDGE corpus as "no dir yet" despite it existing at LIFEOS/MEMORY/KNOWLEDGE. Normalizes the runtime-root path segment to the canonical LIFEOS across the install payload (119 refs / 91 files). No-op on macOS; fixes the silent failure on Linux. Leaves the legitimately mixed-case `skills/LifeOS` and `install/LifeOS` source-dir references untouched. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
088754b to
de168be
Compare
|
Thanks a lot for this, @christauff — really appreciate you flagging it and taking the time to write the fix. When I went back through the current source, this turns out to already be handled: linux path-casing fix already landed in source — every PULSE runtime-root literal is all-caps LIFEOS, so the next release ships it automatically. The system has moved a fair bit since you opened this (the PAI → LifeOS rename and a few subsystem rewrites), so the gap you spotted has since been closed independently. Going to close this one out on that basis — but genuinely grateful for the contribution. 🙏 |
Context (friendly heads-up: people are already deploying v6 on Linux!)
First — congrats on the 6.0.0 "one skill, one install" release. I picked it up within hours of the tag and installed it on Linux (Ubuntu), and it mostly came up beautifully. This PR reports one silent failure I hit during that deploy, with a fix. Sharing it partly because it's the kind of thing that only surfaces off-macOS, and you probably want to know early.
The bug:
LifeOSvsLIFEOS— a case-sensitivity silent failure on LinuxThe runtime is deployed to the all-caps
<configRoot>/LIFEOS/—DeployCoredoes this deliberately (its own comment: "Targets the config-root runtime at the ALL-CAPS<configRoot>/LIFEOS/so it matches the@LIFEOS/...imports in CLAUDE.md"), andCLAUDE.template.mdimports@LIFEOS/....But many runtime tools and hooks resolve the root as mixed-case
~/.claude/LifeOS— e.g.const LIFEOS_DIR = join(HOME, ".claude", "LifeOS").LifeOSandLIFEOSare the same inode → everything works, invisible.Repro (Linux)
It's looking at
~/.claude/LifeOS/MEMORY/KNOWLEDGE(nonexistent on Linux) instead of~/.claude/LIFEOS/MEMORY/KNOWLEDGE. No error is thrown — the corpus just appears empty, which is the dangerous part. After normalizing the path casing,MemoryStatuscorrectly reports the corpus.The fix
Normalize the runtime-root path segment
"LifeOS"→"LIFEOS"(the canonicalDeployCore/CLAUDE.mdalready use) across the install-payload tools and hooks — 119 references across 91 files..claude/LifeOS,CLAUDE_ROOT/"LifeOS", etc.). The legitimately mixed-caseskills/LifeOSandinstall/LifeOSsource-directory references are deliberately left untouched (verified).Notes / happy to adjust
lifeosDir()helper the tools import, instead of each re-deriving the path) would prevent the casing from drifting again — glad to follow up with that if you'd prefer it over the flat normalization.PLATFORM.mdlists Linux as "Fully Supported," so this seemed worth fixing rather than working around locally (a~/.claude/LifeOS → LIFEOSsymlink also masks it, but that's a band-aid).Thanks for building and open-sourcing this — genuinely a pleasure to deploy.
🤖 Generated with Claude Code