Initial commit
This commit is contained in:
302
skills/oracle/scripts/HOOK_SETUP.md
Normal file
302
skills/oracle/scripts/HOOK_SETUP.md
Normal file
@@ -0,0 +1,302 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user