$npx -y skills add kv0906/pm-kit --skill vault-opsCore vault file operations — read/write notes, manage wiki-links, process templates with Handlebars syntax, enforce naming conventions. Auto-invoked for all file operations.
| 1 | # Vault Operations Skill |
| 2 | |
| 3 | Core operations for reading, writing, and managing files in a PM-Kit vault. |
| 4 | |
| 5 | ## Vault Structure |
| 6 | |
| 7 | ``` |
| 8 | pm-kit/ |
| 9 | ├── CLAUDE.md # Vault context (read first) |
| 10 | ├── _core/ # config.yaml, MANIFESTO.md, PROCESSING.md |
| 11 | ├── _templates/ # Note templates (ALWAYS USE) |
| 12 | ├── 00-inbox/ # Unprocessed captures |
| 13 | ├── 01-index/ # Project MOCs |
| 14 | ├── daily/ # YYYY-MM-DD.md (multi-project) |
| 15 | ├── docs/{project}/ # PRDs, specs |
| 16 | ├── decisions/{project}/ # Decision records |
| 17 | ├── blockers/{project}/ # Active blockers |
| 18 | ├── meetings/ # Meeting notes |
| 19 | ├── reports/ # Generated reports |
| 20 | │ └── previews/ # HTML previews (/preview, /report --preview) |
| 21 | └── _archive/ # Archived by YYYY-MM/ |
| 22 | ``` |
| 23 | |
| 24 | ## Naming Conventions (Naming-as-API) |
| 25 | |
| 26 | Strict filename patterns enable glob queries without a database: |
| 27 | |
| 28 | | Type | Pattern | Example | |
| 29 | |------|---------|---------| |
| 30 | | Daily | `daily/YYYY-MM-DD.md` | `daily/2026-01-15.md` | |
| 31 | | Doc | `docs/{project}/{slug}.md` | `docs/project-a/checkout-flow.md` | |
| 32 | | Decision | `decisions/{project}/YYYY-MM-DD-{slug}.md` | `decisions/project-a/2026-01-15-auth-approach.md` | |
| 33 | | Blocker | `blockers/{project}/YYYY-MM-DD-{slug}.md` | `blockers/project-a/2026-01-15-api-rate-limit.md` | |
| 34 | | Meeting | `meetings/YYYY-MM-DD-{type}-{slug}.md` | `meetings/2026-01-15-sync-sprint-review.md` | |
| 35 | | Inbox | `00-inbox/YYYY-MM-DD-{slug}.md` | `00-inbox/2026-01-15-quick-thought.md` | |
| 36 | | Index | `01-index/{project}.md` | `01-index/project-a.md` | |
| 37 | |
| 38 | ## File Operations |
| 39 | |
| 40 | ### Creating Notes |
| 41 | 1. Check if note already exists (naming-as-API enables fast lookup) |
| 42 | 2. Load appropriate template from `_templates/` |
| 43 | 3. Replace template variables (Handlebars syntax) |
| 44 | 4. Add YAML frontmatter with type, project, status, date, tags |
| 45 | 5. Insert wiki-links to related notes |
| 46 | 6. Write to correct folder per naming convention |
| 47 | |
| 48 | ### Editing Notes |
| 49 | - Preserve YAML frontmatter structure |
| 50 | - Maintain existing wiki-links |
| 51 | - Use consistent heading hierarchy |
| 52 | - Apply standard tag format |
| 53 | |
| 54 | ### Wiki-Link Format |
| 55 | ```markdown |
| 56 | [[Note Name]] # Simple link |
| 57 | [[Note Name|Display Text]] # Link with alias |
| 58 | [[Note Name#Section]] # Link to heading |
| 59 | [[folder/Note Name]] # Link with path |
| 60 | ``` |
| 61 | |
| 62 | ## Template Variables |
| 63 | |
| 64 | When processing templates, replace Handlebars syntax: |
| 65 | - `{{date}}` → Today's date (YYYY-MM-DD) |
| 66 | - `{{project}}` → Project ID |
| 67 | - `{{project_name}}` → Project display name |
| 68 | - `{{title}}` → Note title |
| 69 | - `{{slug}}` → URL-safe slug |
| 70 | |
| 71 | ## YAML Frontmatter |
| 72 | |
| 73 | All notes require frontmatter: |
| 74 | ```yaml |
| 75 | --- |
| 76 | type: [daily|doc|decision|blocker|meeting|inbox|index] |
| 77 | project: {project-id} |
| 78 | status: {per note_types in config.yaml} |
| 79 | date: YYYY-MM-DD |
| 80 | tags: [] |
| 81 | --- |
| 82 | ``` |
| 83 | |
| 84 | ## Auto-Linking Rules |
| 85 | |
| 86 | | From | Links To | |
| 87 | |------|----------| |
| 88 | | Daily (blocked item) | `blockers/{project}/` | |
| 89 | | Meeting | `decisions/{project}/`, `blockers/{project}/` | |
| 90 | | Decision | `docs/{project}/` | |
| 91 | | Doc | decisions, blockers | |
| 92 | |
| 93 | ## Archive Rules |
| 94 | |
| 95 | Move to `_archive/YYYY-MM/` when: |
| 96 | - Blocker status → resolved |
| 97 | - Doc status → shipped |
| 98 | - Decision status → superseded |