skillwiki 0.10.67 → 0.10.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.67",
3
+ "version": "0.10.69",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "skillwiki": "dist/cli.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.67",
3
+ "version": "0.10.69",
4
4
  "skills": "./",
5
- "description": "Project-aware Karpathy-style knowledge base for Claude Code: 20 prompt-only skills (wiki-*, proj-*, using-skillwiki) backed by the deterministic `skillwiki` CLI.",
5
+ "description": "Project-aware Karpathy-style knowledge base for Claude Code: 21 prompt-only skills (wiki-*, proj-*, using-skillwiki, skillwiki-mcp) backed by the deterministic `skillwiki` CLI.",
6
6
  "author": {
7
7
  "name": "karlorz",
8
8
  "url": "https://github.com/karlorz"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "skillwiki",
3
- "version": "0.10.67",
4
- "description": "Project-aware Karpathy-style knowledge base for Codex with 20 prompt-only skills backed by the deterministic skillwiki CLI.",
3
+ "version": "0.10.69",
4
+ "description": "Project-aware Karpathy-style knowledge base for Codex with 21 prompt-only skills backed by the deterministic skillwiki CLI.",
5
5
  "author": {
6
6
  "name": "karlorz",
7
7
  "url": "https://github.com/karlorz"
@@ -22,7 +22,7 @@
22
22
  "interface": {
23
23
  "displayName": "SkillWiki",
24
24
  "shortDescription": "Project-aware wiki skills for Codex agents",
25
- "longDescription": "20 prompt-only skills (wiki-*, proj-*, using-skillwiki) for deterministic, project-aware knowledge workflows.",
25
+ "longDescription": "21 prompt-only skills (wiki-*, proj-*, using-skillwiki, skillwiki-mcp) for deterministic, project-aware knowledge workflows.",
26
26
  "developerName": "karlorz",
27
27
  "category": "Productivity",
28
28
  "capabilities": [
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "skillwiki": {
4
+ "type": "http",
5
+ "url": "${SKILLWIKI_MCP_URL:-https://wiki.karldigi.dev/mcp}",
6
+ "headers": {
7
+ "Authorization": "Bearer ${SKILLWIKI_MCP_TOKEN}"
8
+ }
9
+ }
10
+ }
11
+ }
package/skills/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Prompt-only Markdown skills for Claude Code. Installed via `skillwiki install`
4
4
  or the Claude/Codex/Antigravity plugin packaging paths.
5
5
 
6
- Current package inventory: **20 skills**.
6
+ Current package inventory: **21 skills**.
7
7
 
8
8
  Publication policy: new or updated typed-knowledge and meta pages must use
9
9
  `skillwiki page publish` from a temporary draft, inspect its dry-run, and add
@@ -26,6 +26,7 @@ fixed papers/transcripts taxonomy.
26
26
  | `wiki-*` | `wiki-init`, `wiki-ingest`, `wiki-query`, `wiki-lint`, `wiki-crystallize`, `wiki-audit`, `wiki-archive`, `wiki-reingest`, `wiki-adapter-prd`, `wiki-add-task`, `wiki-sync`, `wiki-canvas`, `wiki-gate-plan-mode` |
27
27
  | `proj-*` | `proj-init`, `proj-work`, `proj-distill`, `proj-decide` |
28
28
  | onboarding | `using-skillwiki` |
29
+ | mcp | `skillwiki-mcp` |
29
30
 
30
31
  Verify the live inventory from source:
31
32
 
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "skillwiki": {
4
+ "type": "http",
5
+ "url": "https://wiki.karldigi.dev/mcp",
6
+ "headers": {
7
+ "Authorization": "Bearer ${env:SKILLWIKI_MCP_TOKEN}"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "skillwiki": {
4
+ "type": "http",
5
+ "url": "${SKILLWIKI_MCP_URL:-https://wiki.karldigi.dev/mcp}",
6
+ "headers": {
7
+ "Authorization": "Bearer ${SKILLWIKI_MCP_TOKEN}"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -1,13 +1,18 @@
1
1
  {
2
2
  "name": "@skillwiki/skills",
3
- "version": "0.10.67",
3
+ "version": "0.10.69",
4
4
  "private": true,
5
5
  "files": [
6
6
  "wiki-*",
7
7
  "proj-*",
8
8
  "using-skillwiki",
9
+ "skillwiki-mcp",
9
10
  "skills",
10
11
  "agents",
12
+ "scripts",
13
+ "mcp.json",
14
+ ".mcp.json",
15
+ "cursor-cli-mcp.example.json",
11
16
  ".claude-plugin",
12
17
  ".codex-plugin",
13
18
  "hooks",
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env python3
2
+ """SkillWiki HTTP MCP plugin readiness probe.
3
+
4
+ Interface: probe(environ) -> {status, reasons, url, migrated, warnings}.
5
+ Does not write ~/.cursor/mcp.json, config.toml, or mcp.env.
6
+ Never prints SKILLWIKI_MCP_TOKEN.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import argparse
11
+ import json
12
+ import os
13
+ import sys
14
+ from typing import Mapping
15
+
16
+ PRODUCTION_MCP_URL = "https://wiki.karldigi.dev/mcp"
17
+ TOKEN_ENV = "SKILLWIKI_MCP_TOKEN"
18
+ URL_ENV = "SKILLWIKI_MCP_URL"
19
+
20
+
21
+ def _strip(value: str | None) -> str:
22
+ return (value or "").strip()
23
+
24
+
25
+ def probe(environ: Mapping[str, str] | None = None) -> dict:
26
+ source = os.environ if environ is None else environ
27
+ token = _strip(source.get(TOKEN_ENV))
28
+ url = _strip(source.get(URL_ENV))
29
+ warnings: list[str] = []
30
+ reasons: list[str] = []
31
+
32
+ if not token:
33
+ return {
34
+ "status": "missing_prereq",
35
+ "reasons": [f"{TOKEN_ENV} unset"],
36
+ "url": url or None,
37
+ "migrated": False,
38
+ "warnings": warnings,
39
+ }
40
+
41
+ migrated = False
42
+ if not url:
43
+ url = PRODUCTION_MCP_URL
44
+ migrated = True
45
+ reasons.append(f"{URL_ENV} empty; using {PRODUCTION_MCP_URL}")
46
+
47
+ return {
48
+ "status": "in_sync",
49
+ "reasons": reasons,
50
+ "url": url,
51
+ "migrated": migrated,
52
+ "warnings": warnings,
53
+ }
54
+
55
+
56
+ def apply(environ: dict[str, str] | None = None) -> dict:
57
+ """Apply the URL default to this process and Claude's env handoff only."""
58
+ target = os.environ if environ is None else environ
59
+ result = probe(target)
60
+ if result["status"] != "in_sync" or not result.get("migrated"):
61
+ return result
62
+ url = result["url"]
63
+ target[URL_ENV] = url
64
+ env_file = _strip(target.get("CLAUDE_ENV_FILE"))
65
+ if env_file:
66
+ with open(env_file, "a", encoding="utf-8") as handle:
67
+ handle.write(f"export {URL_ENV}={url}\n")
68
+ return result
69
+
70
+
71
+ def main(argv: list[str] | None = None) -> int:
72
+ parser = argparse.ArgumentParser(description="skillwiki HTTP MCP readiness probe")
73
+ parser.add_argument("--json", action="store_true", help="print JSON verdict")
74
+ parser.add_argument(
75
+ "--apply",
76
+ action="store_true",
77
+ help="set SKILLWIKI_MCP_URL in this child process and Claude's CLAUDE_ENV_FILE when TOKEN is set",
78
+ )
79
+ args = parser.parse_args(argv)
80
+ result = apply() if args.apply else probe()
81
+ print(json.dumps(result, separators=(",", ":")))
82
+ return 0 if result["status"] == "in_sync" else 2
83
+
84
+
85
+ if __name__ == "__main__":
86
+ sys.exit(main())
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: skillwiki-mcp
3
+ description: Use when capturing a note, idea, or bug into the wiki, appending log.md, or using wiki MCP tools. Writes via wiki_capture / wiki_log_append; never local raw/transcripts.
4
+ ---
5
+
6
+ # SkillWiki HTTP MCP
7
+
8
+ Use this skill to capture a note, idea, bug, or task into the wiki, append `log.md`, or call SkillWiki HTTP MCP tools.
9
+
10
+ SkillWiki captures are HTTP MCP only (`type: http`). Claude/Grok use `SKILLWIKI_MCP_URL` as an optional override and otherwise default to `https://wiki.karldigi.dev/mcp`. Every host requires an operator-provided bearer as `SKILLWIKI_MCP_TOKEN` before MCP load. Do not start a local stdio `skillwiki mcp` / `skillwiki-mcp` server for captures.
11
+
12
+ ## First-run readiness
13
+
14
+ - Resolve the installed plugin root from `GROK_PLUGIN_ROOT`, falling back to `CLAUDE_PLUGIN_ROOT`, and run `python3 "$PLUGIN_ROOT/scripts/check_readiness.py" --apply --json` before the first SkillWiki MCP call.
15
+ - `missing_prereq` means `SKILLWIKI_MCP_TOKEN` is absent from process environment; stop and ask for a bearer. Do not invent a stdio MCP.
16
+ - `in_sync` means the probe has a usable URL/token decision.
17
+ - A 401 is an MCP handshake failure, not a readiness-probe status. Report that the token is missing or rejected and stop.
18
+ - Grok SessionStart cannot inject the parent MCP environment. A restart cannot supply a missing token.
19
+ - Never auto-source `mcp.env` or auto-write `~/.cursor/mcp.json`, Grok `config.toml`, or `mcp.env`.
20
+ - Never print the bearer token.
21
+
22
+ ## Writes (captures-only)
23
+
24
+ On leaf hosts, wiki captures go through MCP. Do **not** write `raw/transcripts/` or `log.md` as local files.
25
+
26
+ 1. Call MCP `wiki_capture` with `kind` (`task` | `idea` | `bug` | `note`), `project`, `title`, and `content`. Optional `agent_note`.
27
+ 2. Call MCP `wiki_log_append` when a structural `log.md` line is needed. Pass append-only `content`. Do not rewrite log history.
28
+ 3. Write surface is captures-only. Do not call unpublished Tier 2 tools. Do not `git commit` / `wiki-push` against `~/wiki` for these captures.
29
+
30
+ ## Reads
31
+
32
+ Local `~/wiki` (or `skillwiki path`) is fine for reads. MCP read tools are optional. Prefer ordinary file reads of the local mirror.
33
+
34
+ ## Errors
35
+
36
+ Report handshake, capture, and append failures literally. If tools are missing after a 401 or `missing_prereq`, stop and tell the operator to export `SKILLWIKI_MCP_TOKEN`, run `grok plugin update skillwiki`, and start a new session. Do not fall back to local `raw/transcripts/` writes.
@@ -76,7 +76,7 @@ raw/
76
76
  ├── archived/{articles,papers,transcripts}/
77
77
  └── duplicates/{articles,papers,transcripts}/
78
78
  ```
79
- Use explicit vault-root asset embeds such as `![[raw/assets/example/diagram.png]]`. Agents may choose flat or URL-friendly nested paths. Once an immutable capture references an asset, that path freezes; routine source archive/dedup never moves the asset. Remote images remain external dependencies unless separately captured.
79
+ Use explicit vault-root asset embeds such as `![[raw/assets/example/diagram.png]]`. Agents may choose flat or URL-friendly nested paths. Once an immutable capture references an asset, that path freezes; routine source archive/dedup never moves the asset. Remote images remain external dependencies unless separately captured. When storing binaries under `raw/assets/`, also write a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that embeds each file. Never use `.txt` as the only index; Obsidian opens Markdown notes.
80
80
  Raw frontmatter:
81
81
  ```yaml
82
82
  ---
@@ -10,7 +10,7 @@ Capture ad-hoc ideas, bugs, tasks, and notes into the vault. Three entry points
10
10
  | Filesystem drop | Hermes Agent compact mode (no slash commands available) | Same as above — create `.md` in `raw/transcripts/`, dev-loop discovers it |
11
11
  | Filesystem drop | You're NOT in a Claude session (Obsidian, editor, sync) | Create a new `.md` file in `raw/transcripts/` using the vault template — dev-loop discovers it on next cycle |
12
12
  | Dev-loop discovery | Automatic, next cycle | Scans `raw/transcripts/` for new files since last cycle, surfaces as claimable work |
13
- **Path Rule:** Captures ALWAYS go to `$(skillwiki path)/raw/transcripts/` (Layer 1). Never under `projects/{slug}/raw/` — that violates SCHEMA.md Layer 1 immutability.
13
+ **Path Rule:** Captures ALWAYS go to `$(skillwiki path)/raw/transcripts/` (Layer 1). Never under `projects/{slug}/raw/` — that violates SCHEMA.md Layer 1 immutability. Text captures stay in `raw/transcripts/`. If the capture includes images or other binaries, store those files under `raw/assets/` with a sibling Markdown note that embeds them; never use a .txt sidecar (such as `README.txt`) as the only index; Obsidian opens Markdown notes.
14
14
  ### Exception: Explicit project task requests
15
15
  When the user explicitly says "raise task to project X", "add a task for X", "create a feature request for X", or uses a directive structure like "raise task to {project} {description}", the intent is a **work item**, not a capture:
16
16
  | User wording | Action | Target |
@@ -92,6 +92,7 @@ Ad-hoc captures may omit `sha256`; omission does not grant mutation authority. O
92
92
  - Creating a work item — this is capture-only. Use `proj-work` for full work items.
93
93
  - Writing to any Layer 2 or Layer 3 location. Captures are Layer 1 (raw).
94
94
  - Writing live credentials, access keys, tokens, passwords, cookies, bearer headers, private keys, or other authenticating secrets to the vault.
95
+ - Indexing `raw/assets/` binaries with only a `.txt` sidecar.
95
96
  ## Filesystem drop (offline capture)
96
97
  When you're not in a Claude session, drop files directly into `raw/transcripts/`:
97
98
  1. Create a `.md` file in `raw/transcripts/` — name it descriptively (e.g., `2026-05-08-idea-fix-template.md`)
@@ -65,6 +65,7 @@ Raw ephemeral data (market feeds, logs, transient JSON) must be written to the *
65
65
  - Writing raw ephemeral data directly to cloud-mounted wiki paths (`~/wiki/`).
66
66
  - Writing host-local absolute paths as canonical durable source references (see `using-skillwiki` → Portable Source References).
67
67
  - Writing `[[wikilinks]]` to pages that don't exist in the vault. Before linking, verify the target exists: check `index.md` or `ls` the target directory. If the target doesn't exist yet, use plain text instead of a wikilink.
68
+ - Indexing `raw/assets/` binaries with only a `.txt` sidecar. Write a sibling Markdown note that embeds each file with `![[ ]]`.
68
69
  ## Batch Mode
69
70
  When the user provides multiple sources (a directory of files, a list of URLs, or a multi-document input):
70
71
  1. **Loop per source.** Execute steps 1–8 for each source individually, using one `skillwiki ingest` command per source.
@@ -37,7 +37,9 @@ None for the first run.
37
37
  images remain external dependencies. An attended local-asset capture may
38
38
  choose any URL-friendly path under `raw/assets/`, but it must write the asset,
39
39
  emit an explicit vault-qualified `![[raw/assets/...]]` embed, verify
40
- resolution/preview, and only then finalize the immutable raw note.
40
+ resolution/preview, and only then finalize the immutable raw note. Also write
41
+ a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that
42
+ embeds each file. Never use `.txt` as the only index.
41
43
  8. **Suggest first sources.** Propose 3–5 initial sources (URLs, papers, articles) appropriate to the domain. Prompt the user to provide the first one to ingest, then hand off to wiki-ingest.
42
44
 
43
45
  ## Stop conditions
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: skillwiki-mcp
3
+ description: Use when capturing a note, idea, or bug into the wiki, appending log.md, or using wiki MCP tools. Writes via wiki_capture / wiki_log_append; never local raw/transcripts.
4
+ ---
5
+
6
+ # SkillWiki HTTP MCP
7
+
8
+ Use this skill to capture a note, idea, bug, or task into the wiki, append `log.md`, or call SkillWiki HTTP MCP tools.
9
+
10
+ SkillWiki captures are HTTP MCP only (`type: http`). Claude/Grok use `SKILLWIKI_MCP_URL` as an optional override and otherwise default to `https://wiki.karldigi.dev/mcp`. Every host requires an operator-provided bearer as `SKILLWIKI_MCP_TOKEN` before MCP load. Do not start a local stdio `skillwiki mcp` / `skillwiki-mcp` server for captures.
11
+
12
+ ## First-run readiness
13
+
14
+ - Resolve the installed plugin root from `GROK_PLUGIN_ROOT`, falling back to `CLAUDE_PLUGIN_ROOT`, and run `python3 "$PLUGIN_ROOT/scripts/check_readiness.py" --apply --json` before the first SkillWiki MCP call.
15
+ - `missing_prereq` means `SKILLWIKI_MCP_TOKEN` is absent from process environment; stop and ask for a bearer. Do not invent a stdio MCP.
16
+ - `in_sync` means the probe has a usable URL/token decision.
17
+ - A 401 is an MCP handshake failure, not a readiness-probe status. Report that the token is missing or rejected and stop.
18
+ - Grok SessionStart cannot inject the parent MCP environment. A restart cannot supply a missing token.
19
+ - Never auto-source `mcp.env` or auto-write `~/.cursor/mcp.json`, Grok `config.toml`, or `mcp.env`.
20
+ - Never print the bearer token.
21
+
22
+ ## Writes (captures-only)
23
+
24
+ On leaf hosts, wiki captures go through MCP. Do **not** write `raw/transcripts/` or `log.md` as local files.
25
+
26
+ 1. Call MCP `wiki_capture` with `kind` (`task` | `idea` | `bug` | `note`), `project`, `title`, and `content`. Optional `agent_note`.
27
+ 2. Call MCP `wiki_log_append` when a structural `log.md` line is needed. Pass append-only `content`. Do not rewrite log history.
28
+ 3. Write surface is captures-only. Do not call unpublished Tier 2 tools. Do not `git commit` / `wiki-push` against `~/wiki` for these captures.
29
+
30
+ ## Reads
31
+
32
+ Local `~/wiki` (or `skillwiki path`) is fine for reads. MCP read tools are optional. Prefer ordinary file reads of the local mirror.
33
+
34
+ ## Errors
35
+
36
+ Report handshake, capture, and append failures literally. If tools are missing after a 401 or `missing_prereq`, stop and tell the operator to export `SKILLWIKI_MCP_TOKEN`, run `grok plugin update skillwiki`, and start a new session. Do not fall back to local `raw/transcripts/` writes.
@@ -76,7 +76,7 @@ raw/
76
76
  ├── archived/{articles,papers,transcripts}/
77
77
  └── duplicates/{articles,papers,transcripts}/
78
78
  ```
79
- Use explicit vault-root asset embeds such as `![[raw/assets/example/diagram.png]]`. Agents may choose flat or URL-friendly nested paths. Once an immutable capture references an asset, that path freezes; routine source archive/dedup never moves the asset. Remote images remain external dependencies unless separately captured.
79
+ Use explicit vault-root asset embeds such as `![[raw/assets/example/diagram.png]]`. Agents may choose flat or URL-friendly nested paths. Once an immutable capture references an asset, that path freezes; routine source archive/dedup never moves the asset. Remote images remain external dependencies unless separately captured. When storing binaries under `raw/assets/`, also write a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that embeds each file. Never use `.txt` as the only index; Obsidian opens Markdown notes.
80
80
  Raw frontmatter:
81
81
  ```yaml
82
82
  ---
@@ -10,7 +10,7 @@ Capture ad-hoc ideas, bugs, tasks, and notes into the vault. Three entry points
10
10
  | Filesystem drop | Hermes Agent compact mode (no slash commands available) | Same as above — create `.md` in `raw/transcripts/`, dev-loop discovers it |
11
11
  | Filesystem drop | You're NOT in a Claude session (Obsidian, editor, sync) | Create a new `.md` file in `raw/transcripts/` using the vault template — dev-loop discovers it on next cycle |
12
12
  | Dev-loop discovery | Automatic, next cycle | Scans `raw/transcripts/` for new files since last cycle, surfaces as claimable work |
13
- **Path Rule:** Captures ALWAYS go to `$(skillwiki path)/raw/transcripts/` (Layer 1). Never under `projects/{slug}/raw/` — that violates SCHEMA.md Layer 1 immutability.
13
+ **Path Rule:** Captures ALWAYS go to `$(skillwiki path)/raw/transcripts/` (Layer 1). Never under `projects/{slug}/raw/` — that violates SCHEMA.md Layer 1 immutability. Text captures stay in `raw/transcripts/`. If the capture includes images or other binaries, store those files under `raw/assets/` with a sibling Markdown note that embeds them; never use a .txt sidecar (such as `README.txt`) as the only index; Obsidian opens Markdown notes.
14
14
  ### Exception: Explicit project task requests
15
15
  When the user explicitly says "raise task to project X", "add a task for X", "create a feature request for X", or uses a directive structure like "raise task to {project} {description}", the intent is a **work item**, not a capture:
16
16
  | User wording | Action | Target |
@@ -92,6 +92,7 @@ Ad-hoc captures may omit `sha256`; omission does not grant mutation authority. O
92
92
  - Creating a work item — this is capture-only. Use `proj-work` for full work items.
93
93
  - Writing to any Layer 2 or Layer 3 location. Captures are Layer 1 (raw).
94
94
  - Writing live credentials, access keys, tokens, passwords, cookies, bearer headers, private keys, or other authenticating secrets to the vault.
95
+ - Indexing `raw/assets/` binaries with only a `.txt` sidecar.
95
96
  ## Filesystem drop (offline capture)
96
97
  When you're not in a Claude session, drop files directly into `raw/transcripts/`:
97
98
  1. Create a `.md` file in `raw/transcripts/` — name it descriptively (e.g., `2026-05-08-idea-fix-template.md`)
@@ -65,6 +65,7 @@ Raw ephemeral data (market feeds, logs, transient JSON) must be written to the *
65
65
  - Writing raw ephemeral data directly to cloud-mounted wiki paths (`~/wiki/`).
66
66
  - Writing host-local absolute paths as canonical durable source references (see `using-skillwiki` → Portable Source References).
67
67
  - Writing `[[wikilinks]]` to pages that don't exist in the vault. Before linking, verify the target exists: check `index.md` or `ls` the target directory. If the target doesn't exist yet, use plain text instead of a wikilink.
68
+ - Indexing `raw/assets/` binaries with only a `.txt` sidecar. Write a sibling Markdown note that embeds each file with `![[ ]]`.
68
69
  ## Batch Mode
69
70
  When the user provides multiple sources (a directory of files, a list of URLs, or a multi-document input):
70
71
  1. **Loop per source.** Execute steps 1–8 for each source individually, using one `skillwiki ingest` command per source.
@@ -37,7 +37,9 @@ None for the first run.
37
37
  images remain external dependencies. An attended local-asset capture may
38
38
  choose any URL-friendly path under `raw/assets/`, but it must write the asset,
39
39
  emit an explicit vault-qualified `![[raw/assets/...]]` embed, verify
40
- resolution/preview, and only then finalize the immutable raw note.
40
+ resolution/preview, and only then finalize the immutable raw note. Also write
41
+ a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that
42
+ embeds each file. Never use `.txt` as the only index.
41
43
  8. **Suggest first sources.** Propose 3–5 initial sources (URLs, papers, articles) appropriate to the domain. Prompt the user to provide the first one to ingest, then hand off to wiki-ingest.
42
44
 
43
45
  ## Stop conditions
@@ -117,6 +117,7 @@ project: # optional: "[[slug]]" for cross-reference
117
117
  - **Stable asset pool:** binary assets may use any flat or URL-friendly nested path under `raw/assets/`; no fixed internal taxonomy such as papers/transcripts is required.
118
118
  - Use explicit vault-root embeds such as `![[raw/assets/example/diagram.png]]` so Obsidian preview and GitHub browsing remain unambiguous.
119
119
  - Resolve and preview a new local embed before finalizing its raw capture. Once referenced, the asset path freezes; source archive/dedup does not move it. Remote HTTP(S) images remain external dependencies unless separately captured.
120
+ - **Asset notes:** When storing binaries under `raw/assets/`, also write a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that embeds each file with `![[filename.png]]` or vault-root `![[raw/assets/<dir>/<file>]]`. A `.txt` sidecar is never the only index; Obsidian opens Markdown notes, not `.txt`.
120
121
  - **Dataview queries** (read-only; do not replace index.md):
121
122
 
122
123
  ```dataview