Skip to content

Commit de168be

Browse files
christauffclaude
andcommitted
fix(memory,linux): normalize runtime-root dir casing LifeOS -> LIFEOS
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>
1 parent 8e28514 commit de168be

91 files changed

Lines changed: 119 additions & 119 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

LifeOS/install/LifeOS/PULSE/Observability/observability.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export interface ObservabilityConfig {
5555
// ── Path Construction ──
5656

5757
const HOME = process.env.HOME ?? ""
58-
const LIFEOS_DIR = join(HOME, ".claude", "LifeOS")
58+
const LIFEOS_DIR = join(HOME, ".claude", "LIFEOS")
5959
const MEMORY_DIR = join(LIFEOS_DIR, "MEMORY")
6060

6161
const WORK_JSON_PATH = join(MEMORY_DIR, "STATE", "work.json")
@@ -142,7 +142,7 @@ function getDashboardDir(): string {
142142
const dir = config.dashboard_dir ?? DEFAULT_DASHBOARD_DIR
143143
// Resolve relative paths against Pulse directory
144144
if (!dir.startsWith("/")) {
145-
return join(HOME, ".claude", "LifeOS", "PULSE", dir)
145+
return join(HOME, ".claude", "LIFEOS", "PULSE", dir)
146146
}
147147
return dir
148148
}
@@ -1626,7 +1626,7 @@ function readDirMdFiles(dir: string): { name: string, content: string, sections:
16261626

16271627
function handleUserIndexApi(filter: string | null): Response {
16281628
try {
1629-
const LIFEOS_DIR = process.env.LIFEOS_DIR || join(process.env.HOME || "", ".claude", "LifeOS")
1629+
const LIFEOS_DIR = process.env.LIFEOS_DIR || join(process.env.HOME || "", ".claude", "LIFEOS")
16301630
const indexPath = join(LIFEOS_DIR, "PULSE", "state", "user-index.json")
16311631
const raw = Bun.file(indexPath)
16321632
if (!raw.size) {

LifeOS/install/LifeOS/PULSE/Performance/cost-aggregator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { join, basename, dirname } from "path"
1414
import { existsSync, readFileSync, writeFileSync, appendFileSync, readdirSync, statSync, mkdirSync } from "fs"
1515

1616
const HOME = process.env.HOME ?? ""
17-
const LIFEOS_DIR = join(HOME, ".claude", "LifeOS")
17+
const LIFEOS_DIR = join(HOME, ".claude", "LIFEOS")
1818
const PROJECTS_DIR = join(HOME, ".claude", "projects")
1919
const OUTPUT_FILE = join(LIFEOS_DIR, "MEMORY", "OBSERVABILITY", "session-costs.jsonl")
2020
const STATE_FILE = join(LIFEOS_DIR, "PULSE", "Performance", "aggregator-state.json")

LifeOS/install/LifeOS/PULSE/Performance/module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { join } from "path"
1414
import { existsSync, readFileSync } from "fs"
1515

1616
const HOME = process.env.HOME ?? ""
17-
const LIFEOS_DIR = join(HOME, ".claude", "LifeOS")
17+
const LIFEOS_DIR = join(HOME, ".claude", "LIFEOS")
1818
const MEMORY_DIR = join(LIFEOS_DIR, "MEMORY")
1919
const SESSION_COSTS_PATH = join(MEMORY_DIR, "OBSERVABILITY", "session-costs.jsonl")
2020
const TOOL_FAILURES_PATH = join(MEMORY_DIR, "OBSERVABILITY", "tool-failures.jsonl")
@@ -278,7 +278,7 @@ async function handleAnthropicCostApi(): Promise<Response> {
278278
const { readFileSync, existsSync } = await import("fs")
279279
const { join } = await import("path")
280280
const home = process.env.HOME ?? ""
281-
const obsDir = join(home, ".claude", "LifeOS", "MEMORY", "OBSERVABILITY")
281+
const obsDir = join(home, ".claude", "LIFEOS", "MEMORY", "OBSERVABILITY")
282282
const ledgerPath = join(obsDir, "anthropic-cost.jsonl")
283283
const sitesPath = join(obsDir, "anthropic-call-sites.json")
284284

LifeOS/install/LifeOS/PULSE/Tools/SnapshotFromFixture.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import type { PageData } from "../Schema/PulseSchema";
66
import { PageDataSchema } from "../Schema/PulseSchema";
77

88
const HOME = process.env.HOME!;
9-
const FIX_DIR = resolve(HOME, ".claude", "LifeOS", "PULSE", "Schema", "Fixtures");
10-
const OUT_DIR = resolve(HOME, ".claude", "LifeOS", "PULSE", "Schema", "Snapshots");
9+
const FIX_DIR = resolve(HOME, ".claude", "LIFEOS", "PULSE", "Schema", "Fixtures");
10+
const OUT_DIR = resolve(HOME, ".claude", "LIFEOS", "PULSE", "Schema", "Snapshots");
1111
mkdirSync(OUT_DIR, { recursive: true });
1212

1313
const fixtures = readdirSync(FIX_DIR).filter((f) => f.endsWith(".json") && !f.startsWith("invalid"));

LifeOS/install/LifeOS/PULSE/Tools/SnapshotPages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { readIndex, readPage } from "../lib/data-plane";
77
import { loadAllManifests } from "../lib/manifest-loader";
88

99
const HOME = process.env.HOME!;
10-
const SNAP_DIR = resolve(HOME, ".claude", "LifeOS", "PULSE", "Schema", "Snapshots");
10+
const SNAP_DIR = resolve(HOME, ".claude", "LIFEOS", "PULSE", "Schema", "Snapshots");
1111
mkdirSync(SNAP_DIR, { recursive: true });
1212

1313
const idx = readIndex();

LifeOS/install/LifeOS/PULSE/VoiceServer/voice.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ function escapeRegex(str: string): string {
163163
}
164164

165165
function loadPronunciations(customPath?: string): void {
166-
const paiDir = join(process.env.HOME ?? "~", ".claude", "LifeOS")
166+
const paiDir = join(process.env.HOME ?? "~", ".claude", "LIFEOS")
167167
const userPronPath = customPath ?? join(paiDir, "USER", "PRINCIPAL", "PRONUNCIATIONS.json")
168168

169169
try {

LifeOS/install/LifeOS/PULSE/adapters/AdapterRunner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { getProvenance } from "../lib/frontmatter";
88
import { inference, type InferenceLevel } from "../../TOOLS/Inference";
99

1010
const HOME = process.env.HOME!;
11-
const OBSERVABILITY_DIR = resolve(HOME, ".claude", "LifeOS", "MEMORY", "OBSERVABILITY");
11+
const OBSERVABILITY_DIR = resolve(HOME, ".claude", "LIFEOS", "MEMORY", "OBSERVABILITY");
1212
const RUNS_LOG = join(OBSERVABILITY_DIR, "adapter-runs.jsonl");
1313

1414
const ADAPTER_TIMEOUT_MS = 120_000;

LifeOS/install/LifeOS/PULSE/checks/airgradient-poll.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { join } from "node:path"
1414
import { mkdirSync, writeFileSync, appendFileSync, readFileSync, existsSync } from "node:fs"
1515

1616
const HOME = process.env.HOME ?? ""
17-
const CACHE_DIR = join(HOME, ".claude", "LifeOS", "MEMORY", "_AIRGRADIENT")
17+
const CACHE_DIR = join(HOME, ".claude", "LIFEOS", "MEMORY", "_AIRGRADIENT")
1818
const LATEST = join(CACHE_DIR, "latest.json")
1919
const HISTORY = join(CACHE_DIR, "history.jsonl")
2020

LifeOS/install/LifeOS/PULSE/checks/github-work.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { parse } from "smol-toml"
1414
import { SignJWT, importPKCS8 } from "jose"
1515

1616
const HOME = process.env.HOME ?? ""
17-
const PULSE_DIR = join(HOME, ".claude", "LifeOS", "PULSE")
17+
const PULSE_DIR = join(HOME, ".claude", "LIFEOS", "PULSE")
1818
const STATE_FILE = join(PULSE_DIR, "state", "work-token.json")
1919

2020
// ── Worker Config (from PULSE.toml [worker] section) ──

LifeOS/install/LifeOS/PULSE/checks/github.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, writeF
1212
import { dirname, join } from "path"
1313

1414
const HOME = process.env.HOME ?? ""
15-
const LEGACY_STATE_FILE = join(HOME, ".claude", "LifeOS", "PULSE", "state", "github-seen.json")
16-
const STATE_FILE = join(HOME, ".claude", "LifeOS", "PULSE", "state", "github-seen.jsonl")
15+
const LEGACY_STATE_FILE = join(HOME, ".claude", "LIFEOS", "PULSE", "state", "github-seen.json")
16+
const STATE_FILE = join(HOME, ".claude", "LIFEOS", "PULSE", "state", "github-seen.jsonl")
1717
// Repos to monitor for new issues / activity. Override via LIFEOS_PULSE_REPOS
1818
// env var (comma-separated "owner/name" pairs). Empty default keeps fresh
1919
// installs from polling repos the user hasn't opted into.

0 commit comments

Comments
 (0)