# Wiki Ingest

> Ingest a single source file into the vault wiki. Reads the source, extracts knowledge by file type, creates or updates wiki pages, updates _index.md and _log.md, and records the operation in _manifest.json. Use when the user wants to add a specific file to the wiki. Triggers on: wiki-ingest, ingest this file, add this to the wiki, process this source, wiki ingest.

- Skill: `ihudak/wiki-ingest` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ihudak/wiki-ingest`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ihudak/wiki-ingest/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: ihudak (https://skillmd.com/u/ihudak)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ihudak/wiki-ingest

---


# wiki-ingest

Read `~/.copilot/installed-plugins/ihudak-copilot-plugins/obsidian-llm-wiki/skills/wiki-schema/SKILL.md` fully before proceeding.

Invoke with: `/wiki-ingest @filepath`

---

## Step 1 — Resolve VAULT_PATH

Vault path: `~/obsidian_vault` by default; set `VAULT_PATH` to override. WSL users with a Windows-side vault must set `VAULT_PATH` explicitly (e.g. `/mnt/c/Users/<name>/obsidian_vault`).
All file paths in this skill are relative to the vault root.

---

## Step 2 — Delta check

Read `wiki/_manifest.json` (create it from the schema template if it does not
exist yet).

Compute the source file hash:
```bash
md5sum "<filepath>" | cut -d' ' -f1
```

If the path exists in `_manifest.json` with the same hash: stop and report
`Already ingested (unchanged). Use 'force' keyword to re-ingest.`

Proceed if: path is absent, hash differs, or user said `force`.

---

## Step 3 — Read the source file completely

Do not skim. Read every section.

---

## Step 4 — Identify file type and extract accordingly

| Path prefix | Type | What to extract |
|---|---|---|
| `Meetings/` | Meeting note | Decisions made, technologies discussed, action items (flag them — do NOT create tasks directly; `/wiki-tasks-extract` consumes these flags later), people present, open questions |
| `Daily/` | Daily note | `## Notes` and `## Worklog` sections only. Skip all Dataview/Obsidian Tasks query blocks — those are not content |
| `Projects/` | Project file | Tech stack, decisions, key links, patterns discovered, status |
| `Customers/` | Customer note | Use cases, pain points, customer context, integrations mentioned |
| `People/` | Person note | Role, team, expertise areas, relationships |
| `Clippings/` or `Research/` | Research/clip | Key concepts, takeaways, relevant decisions |
| `.raw/` | Inbox source | Full extraction — this is a deliberate ingest target; extract everything |

> Note: Daily notes must use level-2 `## Notes` and `## Worklog` headings; other heading levels are skipped.

**For `.raw/` HTML files**: check if defuddle is available first:
```bash
npx defuddle --version 2>/dev/null && echo "available" || echo "not available"
```
If available: `npx defuddle parse "<filepath>" --md` and use that output.
If not: read the file directly.

**Action items from meeting notes**: flag them in the log entry as
`action-item: <description>` but do NOT create tasks. The user creates tasks via
`/wiki-task` or extracts them in batch via `/wiki-tasks-extract`.

---

## Step 5 — Resolve against existing wiki

Before creating any new page:
1. Read `wiki/_index.md` to see what already exists.
2. Search for an existing page with a matching or near-matching title:
   ```bash
   find "wiki" -name "*.md" | grep -i "${CONCEPT}"  # substitute the actual concept name
   ```
3. If an existing page covers this concept/entity/decision: **update it**, do not create
   a duplicate.
4. Create a new page only if genuinely new content with no existing home.

When updating an existing page:
- Add new information; do not overwrite existing content unless it is factually wrong.
- If new info contradicts existing content, add a `> [!warning] Potential contradiction`
  callout on both pages noting the conflict. Do not silently overwrite.
- Update the `updated:` frontmatter date.

---

## Step 6 — Write wiki pages

Apply the frontmatter schema from `wiki-schema` for the correct page type.

File naming: Title Case with spaces. `MCP Server.md`, not `mcp-server.md`.

Place files in the correct subdirectory:
- `wiki/concepts/`
- `wiki/entities/`
- `wiki/decisions/`
- `wiki/patterns/`
- `wiki/sources/` (.raw/ files only)

For the page body:
- Write in declarative present tense. "X does Y", not "X basically does Y".
- Cross-link on first mention of any concept, entity, or decision.
- Keep pages 100–300 lines. If content would exceed 300 lines, split into related pages.
- Do NOT add Dataview queries to wiki pages.

---

## Step 7 — Update _index.md

Add a row for every new page to the correct section table. Update the `Summary` and
`Updated` columns for any existing page that was significantly changed. Sort alphabetically
within each section. Update the `updated:` frontmatter date on `_index.md`.

---

## Step 8 — Append to _log.md

New entry at the TOP of the file (newest first):

```markdown
## [YYYY-MM-DD] ingest | <source file path>
- Pages created: [[concept/Name]], [[entity/Name]]
- Pages updated: [[entity/Existing]]
- Key insight: One sentence on what is genuinely new.
- Action items flagged: <description> (if any from meeting notes)
- tag-needed: <proposed-tag> (if any tag was missing from tag-index.md)
```

---

## Step 9 — Update _manifest.json

Write or update the entry for the ingested file:
```json
"<filepath>": {
  "hash": "<md5>",
  "ingested_at": "YYYY-MM-DD",
  "wiki_pages": ["wiki/concepts/Name.md", ...]
}
```

---

## Step 10 — Update hot.md

Update `wiki/hot.md` following the format in `wiki-schema`:
- Set `## Last Updated` to today and one sentence describing this ingest.
- Add key facts learned to `## Key Recent Facts`.
- List created/updated pages in `## Recent Changes`.
- Keep the file ≤300 words total.

---

## Finish

Report:
```
Ingested: <source file>
Pages created: N  (<list>)
Pages updated: M  (<list>)
Tags flagged: <list or "none">
Action items flagged: <list or "none">
```

