Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Releases/v3.0/.claude/hooks/AlgorithmTracker.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ function parseCriterion(text: string): { id: string; description: string } | nul

// ── Session Activation (replaces SessionReactivator) ──

const BASE_DIR = process.env.PAI_DIR || join(process.env.HOME!, '.claude');
const BASE_DIR = process.env.PAI_DIR || join((process.env.HOME || process.env.USERPROFILE || require('os').homedir()), '.claude');

function getSessionName(sid: string): string {
try {
Expand Down
2 changes: 1 addition & 1 deletion Releases/v3.0/.claude/hooks/AutoWorkCreation.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ interface PromptClassification {
is_new_topic: boolean;
}

const BASE_DIR = process.env.PAI_DIR || join(process.env.HOME!, '.claude');
const BASE_DIR = process.env.PAI_DIR || join((process.env.HOME || process.env.USERPROFILE || require('os').homedir()), '.claude');
const WORK_DIR = join(BASE_DIR, 'MEMORY', 'WORK');
const STATE_DIR = join(BASE_DIR, 'MEMORY', 'STATE');
// Session-scoped state files prevent parallel sessions from overwriting each other
Expand Down
6 changes: 3 additions & 3 deletions Releases/v3.0/.claude/hooks/LoadContext.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -442,8 +442,8 @@ async function checkActiveProgress(paiDir: string): Promise<string | null> {
}
}

summary += '\n💡 To resume project: `bun run ~/.claude/skills/PAI/Tools/SessionProgress.ts resume <project>`\n';
summary += '💡 To complete project: `bun run ~/.claude/skills/PAI/Tools/SessionProgress.ts complete <project>`\n';
summary += `\n💡 To resume project: \`bun run "${join(paiDir, 'skills', 'PAI', 'Tools', 'SessionProgress.ts')}" resume <project>\`\n`;
summary += `💡 To complete project: \`bun run "${join(paiDir, 'skills', 'PAI', 'Tools', 'SessionProgress.ts')}" complete <project>\`\n`;

return summary;
}
Expand Down Expand Up @@ -520,7 +520,7 @@ async function main() {
if (needsRebuild) {
console.error('🔨 Rebuilding SKILL.md (components changed)...');
try {
execSync('bun ~/.claude/skills/PAI/Tools/RebuildPAI.ts', {
execSync(`bun "${join(paiDir, 'skills', 'PAI', 'Tools', 'RebuildPAI.ts')}"`, {
cwd: paiDir,
stdio: 'pipe',
timeout: 5000
Expand Down
4 changes: 2 additions & 2 deletions Releases/v3.0/.claude/hooks/RatingCapture.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ import { captureFailure } from '../skills/PAI/Tools/FailureCapture';
// Read Algorithm version dynamically from LATEST file (never hardcode)
const ALGO_VERSION = (() => {
try {
const paiDir = process.env.PAI_DIR || join(process.env.HOME!, '.claude');
const paiDir = process.env.PAI_DIR || join((process.env.HOME || process.env.USERPROFILE || require('os').homedir()), '.claude');
return readFileSync(join(paiDir, 'skills', 'PAI', 'Components', 'Algorithm', 'LATEST'), 'utf-8').trim();
} catch { return 'v?.?.?'; }
})();
Expand Down Expand Up @@ -98,7 +98,7 @@ interface RatingEntry {

// ── Shared Constants ──

const BASE_DIR = process.env.PAI_DIR || join(process.env.HOME!, '.claude');
const BASE_DIR = process.env.PAI_DIR || join((process.env.HOME || process.env.USERPROFILE || require('os').homedir()), '.claude');
const SIGNALS_DIR = join(BASE_DIR, 'MEMORY', 'LEARNING', 'SIGNALS');
const RATINGS_FILE = join(SIGNALS_DIR, 'ratings.jsonl');
const TRENDING_SCRIPT = join(BASE_DIR, 'tools', 'TrendingAnalysis.ts');
Expand Down
2 changes: 1 addition & 1 deletion Releases/v3.0/.claude/hooks/SessionSummary.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ import { join } from 'path';
import { getISOTimestamp } from './lib/time';
import { setTabState, cleanupKittySession } from './lib/tab-setter';

const BASE_DIR = process.env.PAI_DIR || join(process.env.HOME!, '.claude');
const BASE_DIR = process.env.PAI_DIR || join((process.env.HOME || process.env.USERPROFILE || require('os').homedir()), '.claude');
const MEMORY_DIR = join(BASE_DIR, 'MEMORY');
const STATE_DIR = join(MEMORY_DIR, 'STATE');
const WORK_DIR = join(MEMORY_DIR, 'WORK');
Expand Down
2 changes: 1 addition & 1 deletion Releases/v3.0/.claude/hooks/WorkCompletionLearning.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ import { join, dirname } from 'path';
import { getISOTimestamp, getPSTDate } from './lib/time';
import { getLearningCategory } from './lib/learning-utils';

const BASE_DIR = process.env.PAI_DIR || join(process.env.HOME!, '.claude');
const BASE_DIR = process.env.PAI_DIR || join((process.env.HOME || process.env.USERPROFILE || require('os').homedir()), '.claude');
const MEMORY_DIR = join(BASE_DIR, 'MEMORY');
const STATE_DIR = join(MEMORY_DIR, 'STATE');
const WORK_DIR = join(MEMORY_DIR, 'WORK');
Expand Down
4 changes: 2 additions & 2 deletions Releases/v3.0/.claude/hooks/handlers/RebuildSkill.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { join } from 'path';
import { spawn } from 'child_process';

export async function handleRebuildSkill(): Promise<void> {
const CORE_DIR = join(process.env.HOME!, '.claude/skills/PAI');
const CORE_DIR = join((process.env.PAI_DIR || join((process.env.HOME || process.env.USERPROFILE || require('os').homedir()), '.claude')), 'skills', 'PAI');
const COMPONENTS_DIR = join(CORE_DIR, 'Components');
const SKILL_MD = join(CORE_DIR, 'SKILL.md');
const BUILD_SCRIPT = join(CORE_DIR, 'Tools/RebuildPAI.ts');
Expand Down Expand Up @@ -69,7 +69,7 @@ function rebuild(buildScript: string): Promise<void> {
}, 10000);

const child = spawn('bun', [buildScript], {
cwd: join(process.env.HOME!, '.claude/skills/PAI'),
cwd: CORE_DIR,
stdio: ['ignore', 'pipe', 'pipe'],
});

Expand Down
2 changes: 1 addition & 1 deletion Releases/v3.0/.claude/hooks/lib/algorithm-state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ export interface AlgorithmState {

// ── Paths ──

const BASE_DIR = process.env.PAI_DIR || join(process.env.HOME!, '.claude');
const BASE_DIR = process.env.PAI_DIR || join((process.env.HOME || process.env.USERPROFILE || require('os').homedir()), '.claude');
const ALGORITHMS_DIR = join(BASE_DIR, 'MEMORY', 'STATE', 'algorithms');
const SESSION_NAMES_PATH = join(BASE_DIR, 'MEMORY', 'STATE', 'session-names.json');

Expand Down
5 changes: 2 additions & 3 deletions Releases/v3.0/.claude/hooks/lib/identity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@
*/

import { readFileSync, existsSync } from 'fs';
import { join } from 'path';
import { getSettingsPath } from './paths';

const HOME = process.env.HOME!;
const SETTINGS_PATH = join(HOME, '.claude/settings.json');
const SETTINGS_PATH = getSettingsPath();

// Default identity (fallback if settings.json doesn't have identity section)
const DEFAULT_IDENTITY = {
Expand Down
25 changes: 24 additions & 1 deletion Releases/v3.0/.claude/hooks/lib/paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
* const paiDir = getPaiDir(); // Always returns expanded absolute path
*/

import { homedir } from 'os';
import { homedir, tmpdir } from 'os';
import { join } from 'path';

/**
Expand Down Expand Up @@ -73,3 +73,26 @@ export function getSkillsDir(): string {
export function getMemoryDir(): string {
return paiPath('MEMORY');
}

/**
* Get the user's home directory (cross-platform)
* Priority: HOME (Unix/Git Bash) → USERPROFILE (Windows) → os.homedir()
*/
export function getHome(): string {
return process.env.HOME || process.env.USERPROFILE || homedir();
}

/**
* Get a cross-platform temp path
* Uses os.tmpdir() instead of hardcoded /tmp/
*/
export function getTempPath(...segments: string[]): string {
return join(tmpdir(), ...segments);
}

/**
* Check if running on Windows
*/
export function isWindows(): boolean {
return process.platform === 'win32';
}
Loading