Skip to content

Commit 1202b4b

Browse files
Marvinclaude
andcommitted
fix(tools): use PAI_DIR env var instead of hardcoded ~/.claude paths
Add process.env.PAI_DIR fallback to 15 PAI Tools that hardcode ~/.claude as the base directory. Each tool now checks PAI_DIR first, falling back to ~/.claude for backward compatibility. This enables PAI_DIR portability — users can set PAI_DIR to install PAI outside ~/.claude/ (e.g. to work around Claude Code v2.1.78+ sensitive directory protection). Special case: BuildCLAUDE.ts still writes CLAUDE.md to ~/.claude/ since Claude Code reads it from that fixed location, but reads PAI content from PAI_DIR. Tools fixed: ActivityParser, AlgorithmPhaseReport, Banner, BannerMatrix, BannerNeofetch, BannerRetro, BuildCLAUDE, FeatureRegistry, LearningPatternSynthesis, LoadSkillConfig, NeofetchBanner, pai, RebuildPAI, SessionHarvester, SessionProgress. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 4560c95 commit 1202b4b

15 files changed

Lines changed: 22 additions & 17 deletions

Releases/v4.0.3/.claude/PAI/Tools/ActivityParser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import * as path from "path";
2121
// Configuration
2222
// ============================================================================
2323

24-
const CLAUDE_DIR = path.join(process.env.HOME!, ".claude");
24+
const CLAUDE_DIR = process.env.PAI_DIR || path.join(process.env.HOME!, ".claude");
2525
const MEMORY_DIR = path.join(CLAUDE_DIR, "MEMORY");
2626
const USERNAME = process.env.USER || require("os").userInfo().username;
2727
const PROJECTS_DIR = path.join(CLAUDE_DIR, "projects", `-Users-${USERNAME}--claude`); // Claude Code native storage

Releases/v4.0.3/.claude/PAI/Tools/AlgorithmPhaseReport.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import { join } from "path";
1515
import { homedir } from "os";
1616
import { parseArgs } from "util";
1717

18-
const STATE_DIR = join(homedir(), ".claude", "MEMORY", "STATE");
18+
const PAI_DIR = process.env.PAI_DIR || join(homedir(), ".claude");
19+
const STATE_DIR = join(PAI_DIR, "MEMORY", "STATE");
1920
const STATE_FILE = join(STATE_DIR, "algorithm-phase.json");
2021

2122
interface AlgorithmState {

Releases/v4.0.3/.claude/PAI/Tools/Banner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { join } from "path";
1313
import { spawnSync } from "child_process";
1414

1515
const HOME = process.env.HOME!;
16-
const CLAUDE_DIR = join(HOME, ".claude");
16+
const CLAUDE_DIR = process.env.PAI_DIR || join(HOME, ".claude");
1717

1818
// ═══════════════════════════════════════════════════════════════════════════
1919
// Terminal Width Detection

Releases/v4.0.3/.claude/PAI/Tools/BannerMatrix.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { join } from "path";
2222
import { spawnSync } from "child_process";
2323

2424
const HOME = process.env.HOME!;
25-
const CLAUDE_DIR = join(HOME, ".claude");
25+
const CLAUDE_DIR = process.env.PAI_DIR || join(HOME, ".claude");
2626

2727
// =============================================================================
2828
// Terminal Width Detection

Releases/v4.0.3/.claude/PAI/Tools/BannerNeofetch.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { join } from "path";
1515
import { spawnSync } from "child_process";
1616

1717
const HOME = process.env.HOME!;
18-
const CLAUDE_DIR = join(HOME, ".claude");
18+
const CLAUDE_DIR = process.env.PAI_DIR || join(HOME, ".claude");
1919

2020
// ═══════════════════════════════════════════════════════════════════════
2121
// Terminal Width Detection

Releases/v4.0.3/.claude/PAI/Tools/BannerRetro.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { join } from "path";
2020
import { spawnSync } from "child_process";
2121

2222
const HOME = process.env.HOME!;
23-
const CLAUDE_DIR = join(HOME, ".claude");
23+
const CLAUDE_DIR = process.env.PAI_DIR || join(HOME, ".claude");
2424

2525
// ═══════════════════════════════════════════════════════════════════════════
2626
// Terminal Width Detection

Releases/v4.0.3/.claude/PAI/Tools/BuildCLAUDE.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import { readFileSync, writeFileSync, existsSync } from "fs";
1616
import { join } from "path";
1717

18-
const PAI_DIR = join(process.env.HOME!, ".claude");
18+
const PAI_DIR = process.env.PAI_DIR || join(process.env.HOME!, ".claude");
1919
const TEMPLATE_PATH = join(PAI_DIR, "CLAUDE.md.template");
20-
const OUTPUT_PATH = join(PAI_DIR, "CLAUDE.md");
20+
const OUTPUT_PATH = join(process.env.HOME!, ".claude", "CLAUDE.md"); // Always ~/.claude/ — Claude Code reads from fixed location
2121
const SETTINGS_PATH = join(PAI_DIR, "settings.json");
2222
const ALGORITHM_DIR = join(PAI_DIR, "PAI/Algorithm");
2323
const LATEST_PATH = join(ALGORITHM_DIR, "LATEST");

Releases/v4.0.3/.claude/PAI/Tools/FeatureRegistry.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ interface FeatureRegistry {
5555
};
5656
}
5757

58-
const REGISTRY_DIR = join(process.env.HOME || '', '.claude', 'MEMORY', 'progress');
58+
const PAI_DIR = process.env.PAI_DIR || join(process.env.HOME || '', '.claude');
59+
const REGISTRY_DIR = join(PAI_DIR, 'MEMORY', 'progress');
5960

6061
function getRegistryPath(project: string): string {
6162
return join(REGISTRY_DIR, `${project}-features.json`);

Releases/v4.0.3/.claude/PAI/Tools/LearningPatternSynthesis.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import * as path from "path";
2424
// Configuration
2525
// ============================================================================
2626

27-
const CLAUDE_DIR = path.join(process.env.HOME!, ".claude");
27+
const CLAUDE_DIR = process.env.PAI_DIR || path.join(process.env.HOME!, ".claude");
2828
const LEARNING_DIR = path.join(CLAUDE_DIR, "MEMORY", "LEARNING");
2929
const RATINGS_FILE = path.join(LEARNING_DIR, "SIGNALS", "ratings.jsonl");
3030
const SYNTHESIS_DIR = path.join(LEARNING_DIR, "SYNTHESIS");

Releases/v4.0.3/.claude/PAI/Tools/LoadSkillConfig.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ interface ExtendManifest {
3535

3636
// Constants
3737
const HOME = homedir();
38-
const CUSTOMIZATION_DIR = join(HOME, '.claude', 'PAI', 'USER', 'SKILLCUSTOMIZATIONS');
38+
const PAI_DIR = process.env.PAI_DIR || join(HOME, '.claude');
39+
const CUSTOMIZATION_DIR = join(PAI_DIR, 'PAI', 'USER', 'SKILLCUSTOMIZATIONS');
3940

4041
/**
4142
* Deep merge two objects recursively

0 commit comments

Comments
 (0)