flashbacker
Version:
Claude Code state management with session continuity and AI personas
86 lines • 3.53 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.registerHooks = registerHooks;
exports.checkHooksInstalled = checkHooksInstalled;
exports.unregisterHooks = unregisterHooks;
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const claude_config_1 = require("../utils/claude-config");
async function registerHooks(projectDir) {
const scriptsDir = path_1.default.join(projectDir, '.claude', 'flashback', 'scripts');
// Write hooks to PROJECT-LEVEL settings to ensure precedence over global
const projectSettingsPath = path_1.default.join(projectDir, '.claude', 'settings.json');
let settings = {};
if (await fs_extra_1.default.pathExists(projectSettingsPath)) {
try {
settings = JSON.parse(await fs_extra_1.default.readFile(projectSettingsPath, 'utf-8'));
}
catch {
settings = {};
}
}
settings.hooks = settings.hooks || {};
// SessionStart hooks: run session-start.sh and clear statusline cache
settings.hooks.SessionStart = [
{
hooks: [{
type: 'command',
command: `bash "${path_1.default.join(scriptsDir, 'session-start.sh')}"`,
}],
},
{
hooks: [{
type: 'command',
command: `bash -lc 'rm -f "$CLAUDE_PROJECT_DIR/.claude/statusline/state.json"'`
}],
},
];
await fs_extra_1.default.ensureDir(path_1.default.dirname(projectSettingsPath));
await fs_extra_1.default.writeFile(projectSettingsPath, JSON.stringify(settings, null, 2));
}
async function checkHooksInstalled(projectDir) {
if (projectDir) {
const projectSettingsPath = path_1.default.join(projectDir, '.claude', 'settings.json');
if (!await fs_extra_1.default.pathExists(projectSettingsPath))
return false;
try {
const settings = JSON.parse(await fs_extra_1.default.readFile(projectSettingsPath, 'utf-8'));
return !!(settings.hooks?.SessionStart?.length);
}
catch {
return false;
}
}
const settings = await (0, claude_config_1.getClaudeSettings)();
return !!(settings.hooks?.SessionStart?.length);
}
async function unregisterHooks(projectDir) {
if (projectDir) {
const projectSettingsPath = path_1.default.join(projectDir, '.claude', 'settings.json');
if (!await fs_extra_1.default.pathExists(projectSettingsPath))
return;
try {
const settings = JSON.parse(await fs_extra_1.default.readFile(projectSettingsPath, 'utf-8'));
if (!settings.hooks)
return;
delete settings.hooks.PreCompact;
delete settings.hooks.SessionStart;
await fs_extra_1.default.writeFile(projectSettingsPath, JSON.stringify(settings, null, 2));
return;
}
catch {
return;
}
}
// Fallback: operate on global if no projectDir specified
const settings = await (0, claude_config_1.getClaudeSettings)();
if (!settings.hooks)
return;
delete settings.hooks.PreCompact;
delete settings.hooks.SessionStart;
await (0, claude_config_1.updateClaudeSettings)(settings);
}
//# sourceMappingURL=hooks.js.map
;