mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-02-15 19:03:22 +08:00
session-end.js: Extract meaningful summaries from CLAUDE_TRANSCRIPT_PATH instead of writing blank template files. Pulls user messages, tools used, and files modified from the session transcript JSONL. session-start.js: Output the latest session summary to stdout (via the output() helper) so it gets injected into Claude's conversation context, instead of only logging to stderr which just shows briefly in the terminal.
82 lines
2.5 KiB
JavaScript
82 lines
2.5 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* SessionStart Hook - Load previous context on new session
|
|
*
|
|
* Cross-platform (Windows, macOS, Linux)
|
|
*
|
|
* Runs when a new Claude session starts. Loads the most recent session
|
|
* summary into Claude's context via stdout, and reports available
|
|
* sessions and learned skills.
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const {
|
|
getSessionsDir,
|
|
getLearnedSkillsDir,
|
|
findFiles,
|
|
ensureDir,
|
|
readFile,
|
|
log,
|
|
output
|
|
} = require('../lib/utils');
|
|
const { getPackageManager, getSelectionPrompt } = require('../lib/package-manager');
|
|
const { listAliases } = require('../lib/session-aliases');
|
|
|
|
async function main() {
|
|
const sessionsDir = getSessionsDir();
|
|
const learnedDir = getLearnedSkillsDir();
|
|
|
|
// Ensure directories exist
|
|
ensureDir(sessionsDir);
|
|
ensureDir(learnedDir);
|
|
|
|
// Check for recent session files (last 7 days)
|
|
const recentSessions = findFiles(sessionsDir, '*-session.tmp', { maxAge: 7 });
|
|
|
|
if (recentSessions.length > 0) {
|
|
const latest = recentSessions[0];
|
|
log(`[SessionStart] Found ${recentSessions.length} recent session(s)`);
|
|
log(`[SessionStart] Latest: ${latest.path}`);
|
|
|
|
// Read and inject the latest session content into Claude's context
|
|
const content = readFile(latest.path);
|
|
if (content && !content.includes('[Session context goes here]')) {
|
|
// Only inject if the session has actual content (not the blank template)
|
|
output(`Previous session summary:\n${content}`);
|
|
}
|
|
}
|
|
|
|
// Check for learned skills
|
|
const learnedSkills = findFiles(learnedDir, '*.md');
|
|
|
|
if (learnedSkills.length > 0) {
|
|
log(`[SessionStart] ${learnedSkills.length} learned skill(s) available in ${learnedDir}`);
|
|
}
|
|
|
|
// Check for available session aliases
|
|
const aliases = listAliases({ limit: 5 });
|
|
|
|
if (aliases.length > 0) {
|
|
const aliasNames = aliases.map(a => a.name).join(', ');
|
|
log(`[SessionStart] ${aliases.length} session alias(es) available: ${aliasNames}`);
|
|
log(`[SessionStart] Use /sessions load <alias> to continue a previous session`);
|
|
}
|
|
|
|
// Detect and report package manager
|
|
const pm = getPackageManager();
|
|
log(`[SessionStart] Package manager: ${pm.name} (${pm.source})`);
|
|
|
|
// If package manager was detected via fallback, show selection prompt
|
|
if (pm.source === 'fallback' || pm.source === 'default') {
|
|
log('[SessionStart] No package manager preference found.');
|
|
log(getSelectionPrompt());
|
|
}
|
|
|
|
process.exit(0);
|
|
}
|
|
|
|
main().catch(err => {
|
|
console.error('[SessionStart] Error:', err.message);
|
|
process.exit(0); // Don't block on errors
|
|
});
|