From obsidian
Initializes a new Obsidian vault with a PKM methodology (LYT-ACE, PARA, Zettelkasten, or Minimal) via the obsidian:init command and init.py wrapper. Creates folder structure, settings.yaml configuration, sample notes, templates, Bases views, and Home.md. Use this skill whenever the user wants to create or initialize a new vault, set up a vault with a specific methodology, scaffold a PKM system, check vault initialization status (--check), list available methodologies (--list), reset or migrate an existing vault, or run obsidian:init. This is a multi-step interactive wizard — the skill contains the exact prompt_type flow and CLI flags needed. Always consult for vault initialization, vault setup, or methodology selection. This skill only handles initial setup — not ongoing config changes (use config), not validation (use validate), not template management (use templates), not note type changes after init (use note-types).
How this skill is triggered — by the user, by Claude, or both
Slash command
/obsidian:initThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Initialize a new Obsidian vault with a chosen Personal Knowledge Management (PKM) methodology.
Initialize a new Obsidian vault with a chosen Personal Knowledge Management (PKM) methodology.
# Check vault status
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /path/to/vault --check
# List available methodologies
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" --list
# Initialize with interactive wizard (follow JSON prompt_type responses)
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /path/to/vault
| prompt_type | User Choice | Flag |
|---|---|---|
action_required | continue/abort/reset | --action= |
methodology_required | lyt-ace/para/zettelkasten/minimal | -m |
note_types_required | all/custom | --note-types= |
ranking_system_required | rank/priority | --ranking-system= |
properties_required | all/custom | --core-properties= |
custom_properties_input | free text / none | --custom-properties= |
per_type_properties_combined | per-type selection | --per-type-props= |
git_init_required | yes/no | --git= |
NEVER call these scripts directly:
skills/init/scripts/init_vault.py - FORBIDDENskills/init/scripts/wizard.py - FORBIDDENskills/init/scripts/content_generators.py - FORBIDDENskills/init/scripts/ - FORBIDDENONLY call the wrapper:
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" - CORRECTIf you call the internal scripts directly, you will get an error:
{"error": "Direct call not allowed", "message": "This script must be called through the wrapper."}
| Methodology | Description |
|---|---|
| lyt-ace | Linking Your Thinking + ACE Framework |
| para | Tiago Forte's PARA Method |
| zettelkasten | Traditional slip-box system |
| minimal | Simple starter structure |
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> [options]skills/init/scripts/ directly - they will reject the call!next_step field to see the exact command to run nextprompt_type in JSON outputThe wrapper handles ALL execution internally. You NEVER need to call another script.
The wrapper outputs JSON with prompt_type. Handle each type sequentially:
⚠️ IMPORTANT: For ALL prompts with multi_select: true or options array, you MUST use the AskUserQuestion tool - NEVER ask as free text!
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path>
prompt_type: "action_required" (existing vault)→ Use AskUserQuestion with options from JSON
→ Call wrapper again WITH --action=<chosen>:
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue
prompt_type: "methodology_required"→ Use AskUserQuestion with methodology options
→ Call wrapper again WITH -m <methodology> AND keep --action:
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para
prompt_type: "note_types_required"→ Use AskUserQuestion with "All (Recommended)" or "Custom" options
→ If user chooses "all": --note-types=all
→ If user chooses "custom": --note-types=custom (triggers Step 4b)
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para --note-types=all
prompt_type: "note_types_select" (only if custom)→ MUST use AskUserQuestion tool with multi-select from options array
→ Each option has id, label, description - use these for the question
→ Set multiSelect: true in AskUserQuestion
→ Join selected IDs with comma in --note-types
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para --note-types=project,area
Example AskUserQuestion for note_types_select:
{
"questions": [{
"question": "Which note types do you want to include?",
"header": "Note Types",
"multiSelect": true,
"options": [
{"label": "Map", "description": "Map of Content - Overview and navigation notes"},
{"label": "Dot", "description": "Atomic concepts and ideas"},
...
]
}]
}
prompt_type: "ranking_system_required"→ Use AskUserQuestion with ranking options from JSON → Options: "rank" (numeric 1-5) or "priority" (text-based high/medium/low)
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para --note-types=all --ranking-system=rank
prompt_type: "properties_required"→ Use AskUserQuestion with "All (Recommended)" or "Custom" options
→ If user chooses "all": --core-properties=all
→ If user chooses "custom": --core-properties=custom (triggers Step 5b)
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para --note-types=all --ranking-system=rank --core-properties=all
prompt_type: "properties_select" (only if custom)→ MUST use AskUserQuestion tool with multi-select from options array
→ Options with disabled: true (type, created) are mandatory - pre-select them
→ Set multiSelect: true in AskUserQuestion
→ Join selected IDs with comma in --core-properties
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para --note-types=all --core-properties=type,created,up,tags
prompt_type: "custom_properties_input"⚠️ CRITICAL: This is a FREE TEXT input - do NOT add options like "None", "Custom", etc!
→ Simply ask the user to type property names (comma-separated)
→ If user types property names: use them in --custom-properties=<names>
→ If user says "none", "skip", or similar: use --custom-properties=none
Correct approach:
Claude: "Enter custom property names for ALL note types (comma-separated), or 'none' to skip:"
User types: "myProp1, myProp2"
WRONG approach (do NOT do this):
Claude shows options: [None] [Custom] [Type something] ← NEVER DO THIS
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para --note-types=all --core-properties=all --custom-properties=myProp1,myProp2
prompt_type: "per_type_properties_combined"⚠️ CRITICAL: Pass user input EXACTLY as typed - do NOT map to existing properties!
For each note type in type_sections:
optional properties (from methodology)Format: --per-type-props=type1:selected1,selected2,custom1;type2:none;type3:customOnly
Example flow:
Daily notes - optional properties available: [mood] [weather]
User selects: (none)
User types custom: "motto"
Result for daily: "motto" (NOT "mood"!)
Project notes - optional properties available: [deadline] [priority]
User selects: [deadline] ✓
User types custom: (empty)
Result for project: "deadline"
CRITICAL: If user types "motto", pass "motto" - do NOT change it to "mood" because it looks similar!
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para --note-types=all --ranking-system=rank --core-properties=all --custom-properties=priority --per-type-props=project:deadline,budget;daily:motto;area:none
prompt_type: "git_init_required"→ Use AskUserQuestion with git options from JSON → Options: "yes" (initialize git repo) or "no" (skip)
uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" <vault_path> --action=continue -m para --note-types=all --ranking-system=rank --core-properties=all --custom-properties=none --per-type-props=project:none;area:none --git=yes
The wrapper automatically executes when all parameters are provided.
1. User: /obsidian:init
2. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault
→ JSON: {"prompt_type": "action_required", ...}
→ AskUserQuestion → User: "continue"
3. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue
→ JSON: {"prompt_type": "methodology_required", ...}
→ AskUserQuestion → User: "para"
4. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para
→ JSON: {"prompt_type": "note_types_required", ...}
→ AskUserQuestion (All/Custom) → User: "all"
5. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para --note-types=all
→ JSON: {"prompt_type": "ranking_system_required", ...}
→ AskUserQuestion (Rank/Priority) → User: "rank"
6. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para --note-types=all --ranking-system=rank
→ JSON: {"prompt_type": "properties_required", ...}
→ AskUserQuestion (All/Custom) → User: "all"
7. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para --note-types=all --ranking-system=rank --core-properties=all
→ JSON: {"prompt_type": "custom_properties_input", ...}
→ User types: "none"
8. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para --note-types=all --ranking-system=rank --core-properties=all --custom-properties=none
→ JSON: {"prompt_type": "per_type_properties_combined", ...}
→ AskUserQuestion (per type) → User: "project:none;area:none;..."
9. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para --note-types=all --ranking-system=rank --core-properties=all --custom-properties=none --per-type-props=project:none;area:none;resource:none;archive:none
→ JSON: {"prompt_type": "git_init_required", ...}
→ AskUserQuestion (Yes/No) → User: "yes"
10. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para --note-types=all --ranking-system=rank --core-properties=all --custom-properties=none --per-type-props=project:none;area:none;resource:none;archive:none --git=yes
→ Initialization runs! Show results.
1. User: /obsidian:init
2-4. (action, methodology selection as above)
5. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para
→ JSON: {"prompt_type": "note_types_required", ...}
→ AskUserQuestion → User: "all"
6. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para --note-types=all
→ JSON: {"prompt_type": "ranking_system_required", ...}
→ AskUserQuestion → User: "rank"
7. Run: uv run "${CLAUDE_PLUGIN_ROOT}/commands/init.py" /vault --action=continue -m para --note-types=all --ranking-system=rank
→ JSON: {"prompt_type": "properties_required", ...}
→ AskUserQuestion → User: "all"
8-10. (custom_properties, per_type_props, git_init as above with defaults/none)
Final: Initialization runs! Show results.
Show what was created and suggest:
/obsidian:validate to check frontmatter/obsidian:config show to view settings| Option | Description |
|---|---|
<path> | Path to vault (positional, required) |
--action | Action for existing vault: abort, continue, reset, migrate |
-m, --methodology | Methodology: lyt-ace, para, zettelkasten, minimal |
--note-types | Comma-separated list of note types to include |
--ranking-system | Ranking system: rank (numeric 1-5) or priority (text) |
--core-properties | Comma-separated list of core properties to include |
--custom-properties | Comma-separated list of custom global properties |
--per-type-props | Per-type properties: type1:prop1,prop2;type2:prop3 |
--git | Initialize git repository: yes or no |
--defaults | Skip note type and property selection (use all) |
--check | Output vault status as JSON (no changes) |
--list | List methodologies and exit |
⚠️ DO NOT use init_vault.py directly - it is an internal script called by the wrapper.
.claude/settings.yaml with validation rulesx/templates/x/bases/ for folder navigationIn terminal mode, the interactive wizard guides you through vault initialization step by step.
When called without a terminal (e.g., in Claude Code), JSON is returned:
{
"interactive_required": true,
"action": "init",
"config_schema": {...}
}
Use --config='...' or --yes to pass values directly.
0 - Success (including --check output)1 - Error (invalid methodology, file creation failed)Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub wep4you/wep4you-agent-skills --plugin obsidian