514 lines
9.8 KiB
Markdown
514 lines
9.8 KiB
Markdown
# Troubleshooting - Skill Activation Issues
|
|
|
|
Complete debugging guide for skill activation problems.
|
|
|
|
## Table of Contents
|
|
|
|
- [Skill Not Triggering](#skill-not-triggering)
|
|
- [UserPromptSubmit Not Suggesting](#userpromptsubmit-not-suggesting)
|
|
- [PreToolUse Not Blocking](#pretooluse-not-blocking)
|
|
- [False Positives](#false-positives)
|
|
- [Hook Not Executing](#hook-not-executing)
|
|
- [Performance Issues](#performance-issues)
|
|
|
|
---
|
|
|
|
## Skill Not Triggering
|
|
|
|
### UserPromptSubmit Not Suggesting
|
|
|
|
**Symptoms:** Ask a question, but no skill suggestion appears in output.
|
|
|
|
**Common Causes:**
|
|
|
|
#### 1. Keywords Don't Match
|
|
|
|
**Check:**
|
|
- Look at `promptTriggers.keywords` in skill-rules.json
|
|
- Are the keywords actually in your prompt?
|
|
- Remember: case-insensitive substring matching
|
|
|
|
**Example:**
|
|
```json
|
|
"keywords": ["layout", "grid"]
|
|
```
|
|
- "how does the layout work?" → ✅ Matches "layout"
|
|
- "how does the grid system work?" → ✅ Matches "grid"
|
|
- "how do layouts work?" → ✅ Matches "layout"
|
|
- "how does it work?" → ❌ No match
|
|
|
|
**Fix:** Add more keyword variations to skill-rules.json
|
|
|
|
#### 2. Intent Patterns Too Specific
|
|
|
|
**Check:**
|
|
- Look at `promptTriggers.intentPatterns`
|
|
- Test regex at https://regex101.com/
|
|
- May need broader patterns
|
|
|
|
**Example:**
|
|
```json
|
|
"intentPatterns": [
|
|
"(create|add).*?(database.*?table)" // Too specific
|
|
]
|
|
```
|
|
- "create a database table" → ✅ Matches
|
|
- "add new table" → ❌ Doesn't match (missing "database")
|
|
|
|
**Fix:** Broaden the pattern:
|
|
```json
|
|
"intentPatterns": [
|
|
"(create|add).*?(table|database)" // Better
|
|
]
|
|
```
|
|
|
|
#### 3. Typo in Skill Name
|
|
|
|
**Check:**
|
|
- Skill name in SKILL.md frontmatter
|
|
- Skill name in skill-rules.json
|
|
- Must match exactly
|
|
|
|
**Example:**
|
|
```yaml
|
|
# SKILL.md
|
|
name: project-catalog-developer
|
|
```
|
|
```json
|
|
// skill-rules.json
|
|
"project-catalogue-developer": { // ❌ Typo: catalogue vs catalog
|
|
...
|
|
}
|
|
```
|
|
|
|
**Fix:** Make names match exactly
|
|
|
|
#### 4. JSON Syntax Error
|
|
|
|
**Check:**
|
|
```bash
|
|
cat .claude/skills/skill-rules.json | jq .
|
|
```
|
|
|
|
If invalid JSON, jq will show the error.
|
|
|
|
**Common errors:**
|
|
- Trailing commas
|
|
- Missing quotes
|
|
- Single quotes instead of double
|
|
- Unescaped characters in strings
|
|
|
|
**Fix:** Correct JSON syntax, validate with jq
|
|
|
|
#### Debug Command
|
|
|
|
Test the hook manually:
|
|
|
|
```bash
|
|
echo '{"session_id":"debug","prompt":"your test prompt here"}' | \
|
|
npx tsx .claude/hooks/skill-activation-prompt.ts
|
|
```
|
|
|
|
Expected: Your skill should appear in the output.
|
|
|
|
---
|
|
|
|
### PreToolUse Not Blocking
|
|
|
|
**Symptoms:** Edit a file that should trigger a guardrail, but no block occurs.
|
|
|
|
**Common Causes:**
|
|
|
|
#### 1. File Path Doesn't Match Patterns
|
|
|
|
**Check:**
|
|
- File path being edited
|
|
- `fileTriggers.pathPatterns` in skill-rules.json
|
|
- Glob pattern syntax
|
|
|
|
**Example:**
|
|
```json
|
|
"pathPatterns": [
|
|
"frontend/src/**/*.tsx"
|
|
]
|
|
```
|
|
- Editing: `frontend/src/components/Dashboard.tsx` → ✅ Matches
|
|
- Editing: `frontend/tests/Dashboard.test.tsx` → ✅ Matches (add exclusion!)
|
|
- Editing: `backend/src/app.ts` → ❌ Doesn't match
|
|
|
|
**Fix:** Adjust glob patterns or add the missing path
|
|
|
|
#### 2. Excluded by pathExclusions
|
|
|
|
**Check:**
|
|
- Are you editing a test file?
|
|
- Look at `fileTriggers.pathExclusions`
|
|
|
|
**Example:**
|
|
```json
|
|
"pathExclusions": [
|
|
"**/*.test.ts",
|
|
"**/*.spec.ts"
|
|
]
|
|
```
|
|
- Editing: `services/user.test.ts` → ❌ Excluded
|
|
- Editing: `services/user.ts` → ✅ Not excluded
|
|
|
|
**Fix:** If test exclusion too broad, narrow it or remove
|
|
|
|
#### 3. Content Pattern Not Found
|
|
|
|
**Check:**
|
|
- Does the file actually contain the pattern?
|
|
- Look at `fileTriggers.contentPatterns`
|
|
- Is the regex correct?
|
|
|
|
**Example:**
|
|
```json
|
|
"contentPatterns": [
|
|
"import.*[Pp]risma"
|
|
]
|
|
```
|
|
- File has: `import { PrismaService } from './prisma'` → ✅ Matches
|
|
- File has: `import { Database } from './db'` → ❌ Doesn't match
|
|
|
|
**Debug:**
|
|
```bash
|
|
# Check if pattern exists in file
|
|
grep -i "prisma" path/to/file.ts
|
|
```
|
|
|
|
**Fix:** Adjust content patterns or add missing imports
|
|
|
|
#### 4. Session Already Used Skill
|
|
|
|
**Check session state:**
|
|
```bash
|
|
ls .claude/hooks/state/
|
|
cat .claude/hooks/state/skills-used-{session-id}.json
|
|
```
|
|
|
|
**Example:**
|
|
```json
|
|
{
|
|
"skills_used": ["database-verification"],
|
|
"files_verified": []
|
|
}
|
|
```
|
|
|
|
If the skill is in `skills_used`, it won't block again in this session.
|
|
|
|
**Fix:** Delete the state file to reset:
|
|
```bash
|
|
rm .claude/hooks/state/skills-used-{session-id}.json
|
|
```
|
|
|
|
#### 5. File Marker Present
|
|
|
|
**Check file for skip marker:**
|
|
```bash
|
|
grep "@skip-validation" path/to/file.ts
|
|
```
|
|
|
|
If found, the file is permanently skipped.
|
|
|
|
**Fix:** Remove the marker if verification is needed again
|
|
|
|
#### 6. Environment Variable Override
|
|
|
|
**Check:**
|
|
```bash
|
|
echo $SKIP_DB_VERIFICATION
|
|
echo $SKIP_SKILL_GUARDRAILS
|
|
```
|
|
|
|
If set, the skill is disabled.
|
|
|
|
**Fix:** Unset the environment variable:
|
|
```bash
|
|
unset SKIP_DB_VERIFICATION
|
|
```
|
|
|
|
#### Debug Command
|
|
|
|
Test the hook manually:
|
|
|
|
```bash
|
|
cat <<'EOF' | npx tsx .claude/hooks/skill-verification-guard.ts 2>&1
|
|
{
|
|
"session_id": "debug",
|
|
"tool_name": "Edit",
|
|
"tool_input": {"file_path": "/root/git/your-project/form/src/services/user.ts"}
|
|
}
|
|
EOF
|
|
echo "Exit code: $?"
|
|
```
|
|
|
|
Expected:
|
|
- Exit code 2 + stderr message if should block
|
|
- Exit code 0 + no output if should allow
|
|
|
|
---
|
|
|
|
## False Positives
|
|
|
|
**Symptoms:** Skill triggers when it shouldn't.
|
|
|
|
**Common Causes & Solutions:**
|
|
|
|
### 1. Keywords Too Generic
|
|
|
|
**Problem:**
|
|
```json
|
|
"keywords": ["user", "system", "create"] // Too broad
|
|
```
|
|
- Triggers on: "user manual", "file system", "create directory"
|
|
|
|
**Solution:** Make keywords more specific
|
|
```json
|
|
"keywords": [
|
|
"user authentication",
|
|
"user tracking",
|
|
"create feature"
|
|
]
|
|
```
|
|
|
|
### 2. Intent Patterns Too Broad
|
|
|
|
**Problem:**
|
|
```json
|
|
"intentPatterns": [
|
|
"(create)" // Matches everything with "create"
|
|
]
|
|
```
|
|
- Triggers on: "create file", "create folder", "create account"
|
|
|
|
**Solution:** Add context to patterns
|
|
```json
|
|
"intentPatterns": [
|
|
"(create|add).*?(database|table|feature)" // More specific
|
|
]
|
|
```
|
|
|
|
**Advanced:** Use negative lookaheads to exclude
|
|
```regex
|
|
(create)(?!.*test).*?(feature) // Don't match if "test" appears
|
|
```
|
|
|
|
### 3. File Paths Too Generic
|
|
|
|
**Problem:**
|
|
```json
|
|
"pathPatterns": [
|
|
"form/**" // Matches everything in form/
|
|
]
|
|
```
|
|
- Triggers on: test files, config files, everything
|
|
|
|
**Solution:** Use narrower patterns
|
|
```json
|
|
"pathPatterns": [
|
|
"form/src/services/**/*.ts", // Only service files
|
|
"form/src/controllers/**/*.ts"
|
|
]
|
|
```
|
|
|
|
### 4. Content Patterns Catching Unrelated Code
|
|
|
|
**Problem:**
|
|
```json
|
|
"contentPatterns": [
|
|
"Prisma" // Matches in comments, strings, etc.
|
|
]
|
|
```
|
|
- Triggers on: `// Don't use Prisma here`
|
|
- Triggers on: `const note = "Prisma is cool"`
|
|
|
|
**Solution:** Make patterns more specific
|
|
```json
|
|
"contentPatterns": [
|
|
"import.*[Pp]risma", // Only imports
|
|
"PrismaService\\.", // Only actual usage
|
|
"prisma\\.(findMany|create)" // Specific methods
|
|
]
|
|
```
|
|
|
|
### 5. Adjust Enforcement Level
|
|
|
|
**Last resort:** If false positives are frequent:
|
|
|
|
```json
|
|
{
|
|
"enforcement": "block" // Change to "suggest"
|
|
}
|
|
```
|
|
|
|
This makes it advisory instead of blocking.
|
|
|
|
---
|
|
|
|
## Hook Not Executing
|
|
|
|
**Symptoms:** Hook doesn't run at all - no suggestion, no block.
|
|
|
|
**Common Causes:**
|
|
|
|
### 1. Hook Not Registered
|
|
|
|
**Check `.claude/settings.json`:**
|
|
```bash
|
|
cat .claude/settings.json | jq '.hooks.UserPromptSubmit'
|
|
cat .claude/settings.json | jq '.hooks.PreToolUse'
|
|
```
|
|
|
|
Expected: Hook entries present
|
|
|
|
**Fix:** Add missing hook registration:
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"UserPromptSubmit": [
|
|
{
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/skill-activation-prompt.sh"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### 2. Bash Wrapper Not Executable
|
|
|
|
**Check:**
|
|
```bash
|
|
ls -l .claude/hooks/*.sh
|
|
```
|
|
|
|
Expected: `-rwxr-xr-x` (executable)
|
|
|
|
**Fix:**
|
|
```bash
|
|
chmod +x .claude/hooks/*.sh
|
|
```
|
|
|
|
### 3. Incorrect Shebang
|
|
|
|
**Check:**
|
|
```bash
|
|
head -1 .claude/hooks/skill-activation-prompt.sh
|
|
```
|
|
|
|
Expected: `#!/bin/bash`
|
|
|
|
**Fix:** Add correct shebang to first line
|
|
|
|
### 4. npx/tsx Not Available
|
|
|
|
**Check:**
|
|
```bash
|
|
npx tsx --version
|
|
```
|
|
|
|
Expected: Version number
|
|
|
|
**Fix:** Install dependencies:
|
|
```bash
|
|
cd .claude/hooks
|
|
npm install
|
|
```
|
|
|
|
### 5. TypeScript Compilation Error
|
|
|
|
**Check:**
|
|
```bash
|
|
cd .claude/hooks
|
|
npx tsc --noEmit skill-activation-prompt.ts
|
|
```
|
|
|
|
Expected: No output (no errors)
|
|
|
|
**Fix:** Correct TypeScript syntax errors
|
|
|
|
---
|
|
|
|
## Performance Issues
|
|
|
|
**Symptoms:** Hooks are slow, noticeable delay before prompt/edit.
|
|
|
|
**Common Causes:**
|
|
|
|
### 1. Too Many Patterns
|
|
|
|
**Check:**
|
|
- Count patterns in skill-rules.json
|
|
- Each pattern = regex compilation + matching
|
|
|
|
**Solution:** Reduce patterns
|
|
- Combine similar patterns
|
|
- Remove redundant patterns
|
|
- Use more specific patterns (faster matching)
|
|
|
|
### 2. Complex Regex
|
|
|
|
**Problem:**
|
|
```regex
|
|
(create|add|modify|update|implement|build).*?(feature|endpoint|route|service|controller|component|UI|page)
|
|
```
|
|
- Long alternations = slow
|
|
|
|
**Solution:** Simplify
|
|
```regex
|
|
(create|add).*?(feature|endpoint) // Fewer alternatives
|
|
```
|
|
|
|
### 3. Too Many Files Checked
|
|
|
|
**Problem:**
|
|
```json
|
|
"pathPatterns": [
|
|
"**/*.ts" // Checks ALL TypeScript files
|
|
]
|
|
```
|
|
|
|
**Solution:** Be more specific
|
|
```json
|
|
"pathPatterns": [
|
|
"form/src/services/**/*.ts", // Only specific directory
|
|
"form/src/controllers/**/*.ts"
|
|
]
|
|
```
|
|
|
|
### 4. Large Files
|
|
|
|
Content pattern matching reads entire file - slow for large files.
|
|
|
|
**Solution:**
|
|
- Only use content patterns when necessary
|
|
- Consider file size limits (future enhancement)
|
|
|
|
### Measure Performance
|
|
|
|
```bash
|
|
# UserPromptSubmit
|
|
time echo '{"prompt":"test"}' | npx tsx .claude/hooks/skill-activation-prompt.ts
|
|
|
|
# PreToolUse
|
|
time cat <<'EOF' | npx tsx .claude/hooks/skill-verification-guard.ts
|
|
{"tool_name":"Edit","tool_input":{"file_path":"test.ts"}}
|
|
EOF
|
|
```
|
|
|
|
**Target metrics:**
|
|
- UserPromptSubmit: < 100ms
|
|
- PreToolUse: < 200ms
|
|
|
|
---
|
|
|
|
**Related Files:**
|
|
- [SKILL.md](SKILL.md) - Main skill guide
|
|
- [HOOK_MECHANISMS.md](HOOK_MECHANISMS.md) - How hooks work
|
|
- [SKILL_RULES_REFERENCE.md](SKILL_RULES_REFERENCE.md) - Configuration reference |