Vault Project
Manage multi-note research projects in an Obsidian vault with phased subdirectory structure.
Prerequisites
Skill Required Purpose
doc-obsidian Yes Vault CRUD via notesmd-cli + search via qmd
Directory Structure
projects/{project-slug}/ ├── _index.md # MOC: status, component links, linked research ├── concept/ # Problem definition, threat models, requirements ├── research/ # Deep dives per component, tech evaluation ├── design/ # Architecture, API design, data models └── implementation/ # Build plans, code refs, test plans
Projects live in projects/ (top-level). Separate from research/ (knowledge).
Four phases are always created. Empty dirs signal "not started yet."
Step 0: Setup
Run before every operation:
VAULT=$(notesmd-cli print-default --path-only) qmd status
If either fails, stop and tell the user to set up doc-obsidian first.
Commands
init — Scaffold New Project
Trigger: "create project {name}", "new project {name}", "project init {name}"
Workflow
-
Parse project name → kebab-case slug (max 40 chars)
-
Check if projects/{slug}/ exists — if yes, abort and show existing project
-
Create directory structure:
VAULT=$(notesmd-cli print-default --path-only) mkdir -p "$VAULT/projects/{slug}/concept" mkdir -p "$VAULT/projects/{slug}/research" mkdir -p "$VAULT/projects/{slug}/design" mkdir -p "$VAULT/projects/{slug}/implementation"
-
Load references/index-template.md and references/frontmatter-schemas.md
-
Build _index.md with project frontmatter and empty status table
-
Write _index.md :
Use Write tool → "$VAULT/projects/{slug}/_index.md"
-
Re-index: qmd update && qmd embed
-
Confirm:
Created: [[{slug}]] Path: projects/{slug}/ Phases: concept/ research/ design/ implementation/ Components: 0
add — Add Component Note
Trigger: "add {note} to project {name}", "project add {note} to {phase}"
Workflow
-
Identify project slug and target phase (concept/research/design/implementation)
-
If phase not specified, infer from content:
-
Problem/threat/requirement → concept
-
Deep dive/evaluation/comparison → research
-
Architecture/API/data model → design
-
Plan/code/test/deploy → implementation
-
If ambiguous, ask the user
-
Generate note slug (kebab-case, max 60 chars)
-
Check for duplicates in the phase directory
-
Load frontmatter schema from references/frontmatter-schemas.md
-
Build component note with type: project-component frontmatter
-
Save:
VAULT=$(notesmd-cli print-default --path-only)
Write tool → "$VAULT/projects/{project-slug}/{phase}/{note-slug}.md"
-
Update _index.md :
-
Add wikilink under the correct phase section
-
Update status table counts
-
Update components: and updated: in frontmatter
-
Re-index: qmd update && qmd embed
-
Confirm:
Added: [[{note-slug}]] Path: projects/{project-slug}/{phase}/{note-slug} Phase: {phase} Status: pending Project components: {N}
status — Show Project Status
Trigger: "project status", "project status {name}", "how is project {name}"
Workflow
- If no project specified, list all projects:
VAULT=$(notesmd-cli print-default --path-only) ls "$VAULT/projects/"
- For a specific project, read _index.md frontmatter and list components:
VAULT=$(notesmd-cli print-default --path-only)
Read _index.md for project metadata
List files in each phase directory
Read frontmatter status from each component
- Display:
Project: {name} Status: {project-status} Updated: {date}
| Phase | Component | Status |
|---|---|---|
| concept | [[threat-model]] | complete |
| concept | [[gap-analysis]] | in-progress |
| research | [[endpoint-security]] | pending |
| design | — | — |
| implementation | — | — |
Progress: 1/3 complete
link — Link Existing Research
Trigger: "link research to project {name}", "project link {note} to {name}"
Workflow
-
Identify project and target research notes
-
If no specific notes given, search for related research:
qmd vsearch "{project topic}" --json -n 10
-
Filter results: only notes in research/ , exclude score < 0.3
-
Present candidates with scores, let user pick
-
Read project _index.md
-
Add wikilinks under ### Linked Research section:
Linked Research
-
[[existing-note]] — {brief relevance}
-
Do NOT move files — research stays in research/
-
Update updated: in frontmatter
-
Re-index: qmd update && qmd embed
-
Confirm:
Linked to [[{project}]]:
- [[note-1]] — {relevance}
- [[note-2]] — {relevance}
promote — Promote Research Topic to Project
Trigger: "promote {topic} to project", "make {topic} a project"
Workflow
- Find existing research notes on the topic:
qmd vsearch "{topic}" --json -n 15
-
Present candidates, let user confirm which notes relate
-
Run init to scaffold the project
-
Run link to wikilink the existing research notes
-
Optionally create initial component notes in concept/ if the research already covers problem definition
-
Confirm:
Promoted: {topic} → [[{project}]] Linked research: {N} notes Components: {N} created
Promote does NOT move existing notes. It creates a project that references them.
Constraints
DO:
-
Always run Step 0 first
-
Always use fixed four phases (concept/research/design/implementation)
-
Always update _index.md after adding/linking components
-
Always re-index after changes
-
Resolve vault path dynamically via notesmd-cli print-default --path-only
-
Keep research notes in research/ — link, don't move
-
Read notes before editing
DON'T:
-
Create custom phases or skip phase directories
-
Move existing research notes into project directories
-
Create projects without _index.md
-
Skip re-indexing
-
Hardcode vault paths
-
Auto-trigger — only respond to explicit project commands
References
-
references/frontmatter-schemas.md — Frontmatter for _index.md and component notes, field rules, status transitions
-
references/index-template.md — _index.md scaffold template, status table update rules, linked research format