From obsidian
Manages YAML configuration files (settings.yaml, default.yaml) for Obsidian vaults via obsidian:config commands, settings_loader.py, and config_loader.py. Use this skill to inspect current vault config (obsidian:config show), validate config structure (obsidian:config validate), view config diffs from defaults (obsidian:config diff), edit settings (obsidian:config edit), create missing settings.yaml (obsidian:config create), list available methodologies, merge YAML overrides, check the config hierarchy (defaults vs vault-specific overrides), debug YAML parsing errors, or understand how settings_loader.py and config_loader.py work programmatically. Always consult for obsidian:config commands, settings.yaml questions, config file management, or methodology listings. This skill manages configuration files only — not frontmatter property schemas (use frontmatter), not note validation (use validate), not note type definitions (use note-types), not templates (use templates), not vault initialization (use init).
How this skill is triggered — by the user, by Claude, or both
Slash command
/obsidian:configThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Loads, manages, and merges YAML configuration files for Obsidian vault management with support for vault-specific overrides.
Loads, manages, and merges YAML configuration files for Obsidian vault management with support for vault-specific overrides.
| Command | Description |
|---|---|
obsidian:config | Show current vault configuration |
obsidian:config show | Show detailed configuration (with --verbose) |
obsidian:config edit | Edit settings in system editor |
obsidian:config validate | Validate configuration structure |
obsidian:config methodologies | List available methodologies |
obsidian:config create --methodology para | Create default settings |
obsidian:config diff | Show difference from defaults |
This skill provides three complementary modules:
.claude/settings.yaml as the primary configuration sourceMETHODOLOGIES proxy for dict-like access# Load user settings (PRIMARY - use this for validation)
uv run scripts/settings_loader.py --vault /path/to/vault --show --validate
# Load YAML config files (UTILITY)
uv run scripts/config_loader.py --vault /path/to/vault --show
# Create default settings if missing
uv run scripts/settings_loader.py --vault /path/to/vault --create --show
.claude/settings.yaml as source of truthThe config loader merges configurations in this order (later overrides earlier):
skills/config/config/{name}.yaml).claude/config/{name}.yaml in vault)from pathlib import Path
from settings_loader import load_settings, get_note_type, get_validation_rules
# Load settings (creates default if create_if_missing=True)
settings = load_settings(Path("/path/to/vault"), create_if_missing=True)
# Get note type configuration
map_type = get_note_type(settings, "map")
print(map_type.description) # "Map of Content - Overview and navigation notes"
print(map_type.required_properties) # ["type", "up", "created", ...]
# Get validation rules
rules = get_validation_rules(settings)
print(rules.require_core_properties) # True
print(rules.allow_empty_properties) # ["tags", "collection", "related"]
from pathlib import Path
from settings_loader import (
load_settings,
infer_note_type_from_path,
get_up_link_for_path,
should_exclude,
)
settings = load_settings(Path("/vault"))
file_path = Path("/vault/Atlas/Dots/Concept.md")
# Infer note type
note_type = infer_note_type_from_path(settings, file_path)
print(note_type) # "dot"
# Get expected UP link
up_link = get_up_link_for_path(settings, file_path)
print(up_link) # "[[Atlas/Maps/Dots]]"
# Check if excluded from validation
inbox_file = Path("/vault/+/new_idea.md")
print(should_exclude(settings, inbox_file)) # True
from pathlib import Path
from config_loader import load_config
# Load default configuration
config = load_config(Path("/path/to/vault"))
# Load custom configuration
config = load_config(Path("/path/to/vault"), "custom.yaml")
from pathlib import Path
from config_loader import save_config
custom_config = {
"core_properties": ["type", "up", "created", "daily", "tags", "collection", "related"],
"note_types": {
"custom": {
"description": "Custom note type",
"properties": ["type", "up", "created", "daily", "tags", "collection", "related"]
}
}
}
save_config(Path("/path/to/vault"), custom_config, "custom.yaml")
from config_loader import merge_configs
base = {
"core_properties": ["type", "up"],
"validation": {"strict": true}
}
override = {
"core_properties": ["type", "up", "created"],
"auto_fix": {"enabled": true}
}
merged = merge_configs(base, override)
# Result: All keys from both, override takes precedence for conflicts
from config_loader import load_config, get_note_type_config
config = load_config(Path("/path/to/vault"))
map_config = get_note_type_config(config, "map")
print(map_config["description"]) # "Map of Content - Overview and navigation notes"
print(map_config["properties"]) # ["type", "up", "created", "daily", ...]
from pathlib import Path
from config_loader import load_config, infer_note_type
config = load_config(Path("/vault"))
file_path = Path("/vault/Atlas/Maps/My Map.md")
note_type = infer_note_type(file_path, config)
print(note_type) # "map"
from config_loader import load_config, validate_config
config = load_config(Path("/path/to/vault"))
errors = validate_config(config)
if errors:
for error in errors:
print(f"Error: {error}")
else:
print("Configuration is valid")
Core configuration with:
core_properties: Required frontmatter properties for all notesnote_types: Note type definitions with folder hints and propertiesvalidation: Validation rulesauto_fix: Auto-fix togglesexclude_paths: Paths to exclude from processingexclude_files: Files to exclude from processingDefault frontmatter templates for:
Extended note type configuration with:
The default configuration includes these note types:
| Type | Description | Folder Hints |
|---|---|---|
| map | Map of Content - Overview and navigation notes | Atlas/Maps/, Maps/ |
| dot | Dot notes - Atomic concepts and ideas | Atlas/Dots/, Dots/ |
| source | Source notes - External references | Atlas/Sources/, Sources/ |
| effort | Effort notes - Work and tasks | Efforts/ |
| project | Project notes - Defined outcomes | Efforts/Projects/, Projects/ |
| area | Area notes - Ongoing responsibilities | Efforts/Areas/, Areas/ |
| daily | Daily notes - Date-based journal entries | Calendar/daily/, daily/ |
All notes require these 7 properties (per vault standards):
type: dot # Note type
up: "[[Parent]]" # Parent note link (quoted)
created: 2025-01-15 # Creation date (YYYY-MM-DD)
daily: "[[2025-01-15]]" # Daily note link (quoted)
tags: # Tags for categorization (can be empty)
collection: # Collection classification (can be empty)
related: # Related notes (can be empty)
To customize configuration for a specific vault:
.claude/config/ directory in vault rootcustom.yaml)Example .claude/config/custom.yaml:
# Override just the note types
note_types:
blog:
description: "Blog post notes"
folder_hints:
- "Blog/"
properties:
- type
- up
- created
- daily
- published
- tags
# Keep all other defaults from skill config
Load configuration with hierarchical merging.
Parameters:
vault_path (Path): Path to Obsidian vault rootconfig_name (str): Config file name (default: "default.yaml")Returns: dict[str, Any] - Merged configuration
Raises:
Save configuration to vault-specific location.
Parameters:
vault_path (Path): Path to vault rootconfig (dict): Configuration to saveconfig_name (str): Config file name (default: "custom.yaml")Raises:
Deep merge two configuration dictionaries.
Parameters:
base (dict): Base configurationoverride (dict): Override configurationReturns: dict[str, Any] - Merged configuration
Get configuration for specific note type.
Parameters:
config (dict): Configuration dictionarynote_type (str): Note type identifierReturns: dict[str, Any] | None - Note type config or None
Infer note type from file path using folder hints.
Parameters:
file_path (Path): Path to markdown fileconfig (dict): Configuration dictionaryReturns: str | None - Inferred note type or None
Validate configuration structure.
Parameters:
config (dict): Configuration to validateReturns: list[str] - Validation errors (empty if valid)
When user requests configuration management:
0: Success1: Error (invalid vault, YAML error, validation failed)Need validation rules, note types, UP links?
→ settings_loader.py (PRIMARY)
Need to merge YAML config files?
→ config_loader.py (UTILITY)
Need methodology definitions for vault init?
→ methodology loader (config/methodologies/loader.py)
Recommended entry point: Always start with settings_loader.py unless you specifically need YAML file merging.
In terminal mode, the interactive wizard guides you through configuration options.
When called without a terminal (e.g., in Claude Code), JSON is returned:
{
"interactive_required": true,
"action": "edit",
"config_schema": {...}
}
Use --config='...' or --yes to pass values directly.
npx claudepluginhub wep4you/wep4you-agent-skills --plugin obsidianGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.