303 lines
7.4 KiB
Markdown
303 lines
7.4 KiB
Markdown
# Oracle SessionStart Hook Setup
|
|
|
|
This guide explains how to configure Claude Code to automatically load Oracle context when sessions start.
|
|
|
|
## Overview
|
|
|
|
The SessionStart hook automatically injects Oracle knowledge into every new or resumed Claude Code session, ensuring Claude always has access to:
|
|
- Critical gotchas and warnings
|
|
- Recent corrections
|
|
- High-priority patterns and solutions
|
|
- Project-specific preferences
|
|
|
|
## Quick Setup
|
|
|
|
### 1. Add Hook to Claude Code Settings
|
|
|
|
Edit your Claude Code settings file (location varies by platform):
|
|
- **macOS**: `~/Library/Application Support/Claude/settings.json`
|
|
- **Linux**: `~/.config/Claude/settings.json`
|
|
- **Windows**: `%APPDATA%\Claude\settings.json`
|
|
|
|
Add this configuration to the `hooks` section:
|
|
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"SessionStart": [
|
|
{
|
|
"matcher": "startup",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "python /full/path/to/ClaudeShack/skills/oracle/scripts/session_start_hook.py"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Important**: Replace `/full/path/to/ClaudeShack` with the actual absolute path to your ClaudeShack directory.
|
|
|
|
### 2. Test the Hook
|
|
|
|
Test that the hook works by running it manually:
|
|
|
|
```bash
|
|
cd /path/to/your/project
|
|
python /path/to/ClaudeShack/skills/oracle/scripts/session_start_hook.py --debug
|
|
```
|
|
|
|
You should see Oracle context output to stderr. If you see "Oracle: Not initialized", run:
|
|
|
|
```bash
|
|
python /path/to/ClaudeShack/skills/oracle/scripts/init_oracle.py
|
|
```
|
|
|
|
### 3. Start a New Session
|
|
|
|
Start a new Claude Code session. Oracle context should automatically be injected!
|
|
|
|
You'll see something like:
|
|
|
|
```markdown
|
|
# Oracle Project Knowledge
|
|
|
|
Knowledge Base: 25 entries | 5 sessions recorded
|
|
|
|
## Key Knowledge
|
|
|
|
### Gotchas (Watch Out!)
|
|
|
|
- **[CRITICAL]** Database connections must be closed explicitly
|
|
- **API rate limit is 100 req/min**
|
|
|
|
### Recent Corrections
|
|
|
|
- Use textContent instead of innerHTML for user input (XSS prevention)
|
|
- Always use async/await, not callbacks
|
|
```
|
|
|
|
## Configuration Options
|
|
|
|
### Context Tier Levels
|
|
|
|
Control how much context is loaded using the `ORACLE_CONTEXT_TIER` environment variable:
|
|
|
|
```bash
|
|
# In your shell profile (.bashrc, .zshrc, etc.):
|
|
export ORACLE_CONTEXT_TIER=1 # Default: Critical + High priority only
|
|
export ORACLE_CONTEXT_TIER=2 # Include Medium priority
|
|
export ORACLE_CONTEXT_TIER=3 # All knowledge
|
|
```
|
|
|
|
Or pass it directly in the hook configuration:
|
|
|
|
```json
|
|
{
|
|
"type": "command",
|
|
"command": "ORACLE_CONTEXT_TIER=2 python /path/to/session_start_hook.py"
|
|
}
|
|
```
|
|
|
|
Or use the CLI argument:
|
|
|
|
```json
|
|
{
|
|
"type": "command",
|
|
"command": "python /path/to/session_start_hook.py --tier 2"
|
|
}
|
|
```
|
|
|
|
### Maximum Context Length
|
|
|
|
Limit context size to avoid overwhelming the session:
|
|
|
|
```bash
|
|
export ORACLE_MAX_CONTEXT_LENGTH=5000 # Default: 5000 characters
|
|
export ORACLE_MAX_CONTEXT_LENGTH=10000 # More context
|
|
export ORACLE_MAX_CONTEXT_LENGTH=2000 # Less context
|
|
```
|
|
|
|
Or via CLI:
|
|
|
|
```json
|
|
{
|
|
"type": "command",
|
|
"command": "python /path/to/session_start_hook.py --max-length 10000"
|
|
}
|
|
```
|
|
|
|
## Advanced Configuration
|
|
|
|
### Hook on Resume Only
|
|
|
|
To load Oracle context only when resuming sessions (not on new sessions):
|
|
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"SessionStart": [
|
|
{
|
|
"matcher": "resume",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "python /path/to/session_start_hook.py --source resume"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Hook on Both Startup and Resume
|
|
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"SessionStart": [
|
|
{
|
|
"matcher": "startup",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "python /path/to/session_start_hook.py --source startup"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"matcher": "resume",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "python /path/to/session_start_hook.py --source resume"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Per-Project Configuration
|
|
|
|
If you work with multiple projects, you can use different configurations:
|
|
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"SessionStart": [
|
|
{
|
|
"matcher": "startup",
|
|
"pathPattern": "**/my-critical-project/**",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "ORACLE_CONTEXT_TIER=1 python /path/to/session_start_hook.py"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"matcher": "startup",
|
|
"pathPattern": "**/my-casual-project/**",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "ORACLE_CONTEXT_TIER=3 python /path/to/session_start_hook.py"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Hook Not Running
|
|
|
|
1. **Check settings file syntax**: Ensure valid JSON (no trailing commas, proper quotes)
|
|
2. **Check paths**: Use absolute paths, not relative
|
|
3. **Check permissions**: Ensure script is executable (`chmod +x session_start_hook.py`)
|
|
4. **Test manually**: Run the script from your project directory
|
|
|
|
### No Context Showing
|
|
|
|
1. **Verify Oracle is initialized**: Run `ls -la .oracle/` in your project
|
|
2. **Check if knowledge exists**: Run `python /path/to/query_knowledge.py --summary`
|
|
3. **Test hook in debug mode**: `python session_start_hook.py --debug`
|
|
|
|
### Context Too Large
|
|
|
|
Reduce context with:
|
|
- Lower tier level (`ORACLE_CONTEXT_TIER=1`)
|
|
- Smaller max length (`ORACLE_MAX_CONTEXT_LENGTH=3000`)
|
|
- Prioritize your knowledge entries (set priority to `low` for less critical items)
|
|
|
|
### Context Not Relevant
|
|
|
|
The SessionStart hook loads critical/high priority items only. To get task-specific context:
|
|
|
|
1. Use the oracle skill manually: `/oracle` (if available)
|
|
2. Run: `python /path/to/generate_context.py --task "your task description"`
|
|
3. Query specific knowledge: `python /path/to/query_knowledge.py "keywords"`
|
|
|
|
## Best Practices
|
|
|
|
1. **Keep critical items truly critical**: Only mark security, data loss, and breaking issues as critical
|
|
2. **Regular cleanup**: Review and remove outdated knowledge monthly
|
|
3. **Use tags**: Tag knowledge for better organization
|
|
4. **Record sessions**: Use `record_session.py` after important sessions
|
|
5. **Analyze history**: Run `analyze_history.py --auto-populate` weekly to mine conversation history
|
|
|
|
## Hook Output Format
|
|
|
|
The hook outputs JSON in this format:
|
|
|
|
```json
|
|
{
|
|
"hookSpecificOutput": {
|
|
"hookEventName": "SessionStart",
|
|
"additionalContext": "# Oracle Project Knowledge\n\n..."
|
|
}
|
|
}
|
|
```
|
|
|
|
Claude Code reads the `additionalContext` field and injects it into the session context.
|
|
|
|
## Verification
|
|
|
|
To verify the hook is working:
|
|
|
|
1. Start a new session
|
|
2. Ask Claude: "What do you know about this project from Oracle?"
|
|
3. Claude should reference the injected knowledge
|
|
|
|
## Disable Hook Temporarily
|
|
|
|
To temporarily disable the hook without removing configuration:
|
|
|
|
1. Add a condition to the matcher that won't match
|
|
2. Or comment out the hook in settings (use `//` in JSONC format if supported)
|
|
3. Or set environment variable: `export ORACLE_HOOK_DISABLED=1`
|
|
|
|
## Related Scripts
|
|
|
|
- `init_oracle.py` - Initialize Oracle for a project
|
|
- `record_session.py` - Record session learnings
|
|
- `query_knowledge.py` - Query knowledge base
|
|
- `generate_context.py` - Generate context summaries
|
|
- `analyze_history.py` - Mine conversation history
|
|
|
|
## Support
|
|
|
|
For issues or questions:
|
|
1. Check the troubleshooting section above
|
|
2. Review Claude Code hooks documentation
|
|
3. Test the script manually with `--debug` flag
|
|
4. Check Claude Code logs for hook execution errors
|