172 lines
5.7 KiB
JavaScript
172 lines
5.7 KiB
JavaScript
/**
|
|
* Session Start Hook Integration
|
|
*
|
|
* Auto-starts workers when Claude Code session begins.
|
|
*/
|
|
import { createWorkerManager } from './index.js';
|
|
import * as path from 'path';
|
|
// ============================================================================
|
|
// Session Hook Functions
|
|
// ============================================================================
|
|
/**
|
|
* Initialize workers on session start
|
|
*
|
|
* Call this from your SessionStart hook to auto-start the worker system.
|
|
*/
|
|
export async function onSessionStart(config = {}) {
|
|
const { projectRoot = process.cwd(), autoStart = true, runInitialScan = true, workers = ['health', 'security', 'git'], } = config;
|
|
try {
|
|
// Create and initialize manager
|
|
const manager = createWorkerManager(projectRoot);
|
|
await manager.initialize();
|
|
let initialResults;
|
|
// Run initial scan of critical workers
|
|
if (runInitialScan && workers.length > 0) {
|
|
initialResults = {};
|
|
for (const workerName of workers) {
|
|
try {
|
|
const result = await manager.runWorker(workerName);
|
|
initialResults[workerName] = {
|
|
success: result.success,
|
|
data: result.data,
|
|
alerts: result.alerts,
|
|
};
|
|
}
|
|
catch {
|
|
initialResults[workerName] = { success: false, error: 'Worker failed' };
|
|
}
|
|
}
|
|
}
|
|
// Start scheduled workers
|
|
if (autoStart) {
|
|
await manager.start({
|
|
autoSave: true,
|
|
statuslineUpdate: true,
|
|
});
|
|
}
|
|
return {
|
|
success: true,
|
|
manager,
|
|
initialResults,
|
|
};
|
|
}
|
|
catch (error) {
|
|
return {
|
|
success: false,
|
|
manager: createWorkerManager(projectRoot),
|
|
error: error instanceof Error ? error.message : String(error),
|
|
};
|
|
}
|
|
}
|
|
/**
|
|
* Clean up workers on session end
|
|
*/
|
|
export async function onSessionEnd(manager) {
|
|
await manager.stop();
|
|
}
|
|
/**
|
|
* Generate session start output for Claude Code hooks
|
|
*
|
|
* Returns formatted output suitable for Claude Code SessionStart hook.
|
|
*/
|
|
export function formatSessionStartOutput(result) {
|
|
const lines = [];
|
|
if (result.success) {
|
|
lines.push('[Workers] System initialized');
|
|
if (result.initialResults) {
|
|
const healthResult = result.initialResults.health;
|
|
const securityResult = result.initialResults.security;
|
|
const gitResult = result.initialResults.git;
|
|
if (healthResult?.data) {
|
|
const status = healthResult.data.status || 'unknown';
|
|
const icon = status === 'healthy' ? '✓' : status === 'warning' ? '⚠' : '✗';
|
|
lines.push(` ${icon} Health: ${status}`);
|
|
}
|
|
if (securityResult?.data) {
|
|
const status = securityResult.data.status || 'unknown';
|
|
const issues = securityResult.data.totalIssues || 0;
|
|
const icon = status === 'clean' ? '✓' : status === 'warning' ? '⚠' : '✗';
|
|
lines.push(` ${icon} Security: ${status} (${issues} issues)`);
|
|
}
|
|
if (gitResult?.data) {
|
|
const branch = gitResult.data.branch || 'unknown';
|
|
const uncommitted = gitResult.data.uncommitted || 0;
|
|
lines.push(` ├─ Branch: ${branch}`);
|
|
lines.push(` └─ Uncommitted: ${uncommitted}`);
|
|
}
|
|
}
|
|
lines.push('[Workers] Background scheduling started');
|
|
}
|
|
else {
|
|
lines.push(`[Workers] Failed to initialize: ${result.error}`);
|
|
}
|
|
return lines.join('\n');
|
|
}
|
|
// ============================================================================
|
|
// Shell Script Generator
|
|
// ============================================================================
|
|
/**
|
|
* Generate a shell hook script for integration with .claude/settings.json
|
|
*/
|
|
export function generateShellHook(projectRoot) {
|
|
const hookPath = path.join(projectRoot, 'v3', '@claude-flow', 'hooks');
|
|
return `#!/bin/bash
|
|
# Claude Flow V3 Workers - Session Start Hook
|
|
# Auto-generated - do not edit manually
|
|
|
|
set -euo pipefail
|
|
|
|
PROJECT_ROOT="${projectRoot}"
|
|
HOOKS_PATH="${hookPath}"
|
|
|
|
# Run worker initialization via Node.js
|
|
node --experimental-specifier-resolution=node -e "
|
|
const { onSessionStart, formatSessionStartOutput } = require('\${HOOKS_PATH}/dist/workers/session-hook.js');
|
|
|
|
async function main() {
|
|
const result = await onSessionStart({
|
|
projectRoot: '\${PROJECT_ROOT}',
|
|
autoStart: true,
|
|
runInitialScan: true,
|
|
workers: ['health', 'security', 'git'],
|
|
});
|
|
|
|
console.log(formatSessionStartOutput(result));
|
|
}
|
|
|
|
main().catch(err => {
|
|
console.error('[Workers] Error:', err.message);
|
|
process.exit(1);
|
|
});
|
|
"
|
|
`;
|
|
}
|
|
// ============================================================================
|
|
// Integration Helper
|
|
// ============================================================================
|
|
/**
|
|
* Create a global worker manager instance for the session
|
|
*/
|
|
let globalManager = null;
|
|
export function getGlobalManager() {
|
|
return globalManager;
|
|
}
|
|
export function setGlobalManager(manager) {
|
|
globalManager = manager;
|
|
}
|
|
export async function initializeGlobalManager(projectRoot) {
|
|
if (globalManager) {
|
|
return globalManager;
|
|
}
|
|
const result = await onSessionStart({
|
|
projectRoot,
|
|
autoStart: true,
|
|
runInitialScan: true,
|
|
});
|
|
if (!result.success) {
|
|
throw new Error(result.error || 'Failed to initialize worker manager');
|
|
}
|
|
globalManager = result.manager;
|
|
return globalManager;
|
|
}
|
|
//# sourceMappingURL=session-hook.js.map
|