Skip to content

FileWatcher: Dynamic Discovery of Skills and Photons ​

Overview ​

The FileWatcher enables automatic discovery and indexing of skills and photons without requiring NCP to restart. When you add, modify, or delete skill/photon files, NCP immediately detects and makes them available.

This replaces the old workflow where you had to restart NCP to use newly added skills and photons.

How It Works ​

  1. File Monitoring: FileWatcher continuously monitors:

    • ~/.ncp/skills/ directory for skill changes
    • ~/.ncp/photons/ directory for photon changes (if Photon runtime is enabled)
  2. Event Detection: When files are added, modified, or deleted:

    • Event is debounced to prevent duplicate processing
    • Temporary/system files are automatically filtered out
    • Orchestrator is notified via callbacks
  3. Index Update: Skills/photons are:

    • Loaded and parsed
    • Added to discovery index
    • Made available to Claude immediately
    • Execution time tracked and logged

Configuration ​

Environment Variables ​

NCP_ENABLE_SKILLS (default: true) ​

Enables skill discovery. Set to false to disable skills:

bash
export NCP_ENABLE_SKILLS=false

NCP_ENABLE_PHOTON_RUNTIME (default: true) ​

Enables photon runtime. Set to false if you need to temporarily disable photons:

bash
export NCP_ENABLE_PHOTON_RUNTIME=false
  • CLI / npm installs: Update ~/.ncp/settings.json (enablePhotonRuntime) to make the change stick across shells.
  • DXT / client bundles: These builds ignore ~/.ncp/settings.json, so specify the env var in your client config ("NCP_ENABLE_PHOTON_RUNTIME": "true").

Note: FileWatcher only starts if at least one of these is enabled.

NCP_FILE_WATCHER_DEBOUNCE_MS (default: 300) ​

Debounce interval in milliseconds. Prevents rapid file changes from triggering multiple updates:

bash
export NCP_FILE_WATCHER_DEBOUNCE_MS=500  # 500ms debounce
  • Lower values (100-200ms): More responsive, but higher CPU usage
  • Higher values (500-1000ms): Less responsive, but more stable with slow editors
  • Default (300ms): Good balance for most use cases

Usage Examples ​

Adding a New Skill ​

  1. Create skill directory and file:
bash
mkdir -p ~/.ncp/skills/my-skill
echo "# My Skill" > ~/.ncp/skills/my-skill/SKILL.md
  1. NCP automatically detects it:
⭐ Skill added (auto-detected): my-skill
✅ Skill indexed: my-skill (125ms)
  1. Skill is immediately available to Claude without restart

Modifying an Existing Skill ​

  1. Edit the SKILL.md file:
bash
nano ~/.ncp/skills/my-skill/SKILL.md
  1. NCP automatically detects the change:
🔄 Skill modified (auto-detected): my-skill
✅ Skill updated: my-skill (142ms)
  1. Updated version available immediately

Removing a Skill ​

  1. Delete the skill directory:
bash
rm -rf ~/.ncp/skills/my-skill
  1. NCP automatically detects removal:
🗑️  Skill removed (auto-detected): my-skill
✅ Skill unindexed: my-skill
  1. Skill no longer available to Claude

File Filtering ​

FileWatcher automatically ignores:

  • Editor backups: ~, .swp, .swo, .bak
  • Temp files: .tmp, .orig
  • macOS: ._*, .DS_Store
  • Windows: Thumbs.db
  • Office: ~123 (Word/Excel backups)

These are silently ignored and don't trigger updates.

Logging ​

Log Levels ​

Enable detailed logging to debug FileWatcher:

bash
export NCP_DEBUG=true

Log Messages ​

Different emoji indicators show operation type:

  • ⭐: File added (new detection)
  • 🔄: File modified (update detection)
  • 🗑️: File deleted (removal detection)
  • ✅: Operation succeeded
  • ❌: Operation failed
  • 📁: FileWatcher startup/shutdown

Example Log Output ​

📁 File watcher started for skills and photons directories (debounce: 300ms)
⭐ Skill added (auto-detected): my-skill
✅ Skill indexed: my-skill (125ms)
🔄 Skill modified (auto-detected): my-skill
✅ Skill updated: my-skill (142ms)
🗑️  Skill removed (auto-detected): my-skill
✅ Skill unindexed: my-skill

Troubleshooting ​

FileWatcher Not Detecting Changes ​

Symptom: Files added but not appearing in NCP

Causes & Solutions:

  1. Skills are disabled:

    bash
    # Check if enabled (should be 'true')
    echo $NCP_ENABLE_SKILLS
    
    # Enable if disabled
    export NCP_ENABLE_SKILLS=true
  2. Photon runtime disabled (for photons):

    bash
    # Enable photon runtime
    export NCP_ENABLE_PHOTON_RUNTIME=true
  3. File in wrong location:

    • Skills must be in ~/.ncp/skills/
    • Photons must be in ~/.ncp/photons/
    • Use full paths: ~ expands to your home directory
  4. File not matching expected format:

    • Skills: Directory with SKILL.md file
    • Photons: Files ending in .photon.ts or .photon.js
  5. Editor hasn't saved file:

    • FileWatcher only detects saved changes
    • Ensure file is fully saved before checking logs

Updates Taking Too Long ​

Symptom: Skill/photon updates are slow (>1-2 seconds)

Possible Causes:

  1. Debounce interval too high:

    bash
    # Reduce debounce (but watch for duplicates)
    export NCP_FILE_WATCHER_DEBOUNCE_MS=200
  2. Slow filesystem:

    • Updates are slower on network shares or cloud storage
    • Consider using local filesystem for .ncp/ directory
  3. Large skill/photon files:

    • Parsing large files takes time
    • Consider splitting into smaller files

FileWatcher Not Starting ​

Symptom: No "File watcher started" message in logs

Possible Causes:

  1. Both features disabled:

    bash
    # At least one must be enabled
    export NCP_ENABLE_SKILLS=true
  2. NCP not initialized yet:

    • FileWatcher starts during background initialization
    • Wait for "MCP server ready" message
  3. File system permissions:

    bash
    # Check directory is readable
    ls -la ~/.ncp/skills/
    ls -la ~/.ncp/photons/

Duplicate Updates ​

Symptom: Same skill updated multiple times for single change

Cause: Debounce interval too low, editor creates multiple save events

Solution:

bash
# Increase debounce to reduce duplicates
export NCP_FILE_WATCHER_DEBOUNCE_MS=500

Performance Considerations ​

Memory Usage ​

FileWatcher uses minimal memory:

  • Per-file debounce timers: ~1KB each
  • Watcher instances: ~2MB total
  • No significant impact on NCP's memory footprint

CPU Usage ​

FileWatcher has minimal CPU impact:

  • Idle state: <0.1% CPU
  • Processing updates: <1% CPU per update
  • Debounce prevents rapid processing

Filesystem Impact ​

FileWatcher uses OS-level file monitoring:

  • macOS: Uses FSEvents (efficient)
  • Linux: Uses inotify (efficient)
  • Windows: Uses file system watcher API (efficient)

No polling or scanning required.

Best Practices ​

1. Use Local Filesystem ​

Avoid:

  • Network shares (NFS, SMB)
  • Cloud-synced folders (Dropbox, OneDrive, iCloud)
  • Virtual filesystems

These can have delayed file change detection.

2. One SKILL.md Per Directory ​

✅ Good:

~/.ncp/skills/
  └─ my-skill/
     └─ SKILL.md

❌ Bad:

~/.ncp/skills/
  └─ SKILL.md  (ambiguous - what's the skill name?)

3. Use Consistent File Extensions ​

✅ Good:

my-photon.photon.ts
my-photon.photon.js

❌ Bad:

my-photon.ts (missing .photon marker)

4. Let Editor Fully Save ​

Always ensure files are fully saved:

  • VSCode: Wait for white dot to disappear from tab
  • Vim: Confirm :w command completes
  • Don't force-save in middle of write

5. Check Logs When Adding Skills ​

Always verify the skill was detected:

bash
# Look for success message
tail -50 ~/.ncp/logs/ncp.log | grep -i "skill.*indexed"

Advanced Configuration ​

Custom Debounce Per Skill ​

Currently not supported, but can be achieved by:

  1. Temporarily increase debounce for bulk operations
  2. Return to normal debounce for regular use
bash
# Bulk add multiple skills
export NCP_FILE_WATCHER_DEBOUNCE_MS=1000
# ...copy/add many skill files...
# Then reduce back for normal use
export NCP_FILE_WATCHER_DEBOUNCE_MS=300

Monitoring FileWatcher Events ​

To track all file changes:

bash
export NCP_DEBUG=true
tail -f ~/.ncp/logs/ncp.log | grep -E "⭐|🔄|🗑️|❌"

FAQ ​

Q: Does FileWatcher require a restart? A: No! That's the whole point - NCP keeps running and detects changes automatically.

Q: Can I disable FileWatcher but keep skills enabled? A: Currently no - if skills are enabled, FileWatcher will start. This is by design to ensure consistency.

Q: What if I'm editing a skill and someone else is too? A: The last save wins. FileWatcher detects the final modification and indexes that version. Consider using version control for collaboration.

Q: How long does a skill update take? A: Typically 100-300ms, depending on:

  • File size
  • Filesystem speed
  • System load
  • Debounce interval

Q: Can I use network shares for ~/.ncp/? A: Not recommended. Network latency causes delayed change detection. Use local filesystem for best results.

Q: What happens if a skill has syntax errors? A: The update fails with an error message. Previous version remains in index. Fix the error and re-save to update.

Q: Do deleted skills clean up immediately? A: Yes. Deletion removes the skill from discovery index immediately (within debounce window).

See Also ​

Released under the Elastic License 2.0.