@jayjiang/byoao 2.0.1 → 2.0.3
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/dist/assets/presets/common/AGENTS.md.hbs +10 -0
- package/dist/assets/presets/common/SCHEMA.md.hbs +4 -0
- package/dist/cli/installer.js +24 -0
- package/dist/cli/installer.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/vault/manifest.js +1 -1
- package/dist/vault/self-update.js +1 -1
- package/package.json +1 -1
- package/src/assets/presets/common/AGENTS.md.hbs +10 -0
- package/src/assets/presets/common/SCHEMA.md.hbs +4 -0
- package/dist/assets/skills/ask.md +0 -133
- package/dist/assets/skills/challenge.md +0 -132
- package/dist/assets/skills/connect.md +0 -125
- package/dist/assets/skills/cook.md +0 -167
- package/dist/assets/skills/diagnose.md +0 -131
- package/dist/assets/skills/drift.md +0 -122
- package/dist/assets/skills/health.md +0 -63
- package/dist/assets/skills/ideas.md +0 -173
- package/dist/assets/skills/organize.md +0 -107
- package/dist/assets/skills/prep.md +0 -63
- package/dist/assets/skills/trace.md +0 -141
- package/dist/assets/skills/wiki.md +0 -126
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: organize
|
|
3
|
-
description: >
|
|
4
|
-
Directory organization based on frontmatter metadata. Suggests and applies file moves to
|
|
5
|
-
keep the vault structured. Use when the user wants to reorganize notes, fix directory
|
|
6
|
-
placement, or clean up the vault structure.
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# /organize — Directory Organization
|
|
10
|
-
|
|
11
|
-
You are a librarian. Your job is to ensure every note lives in the right place based on its frontmatter metadata, type, and domain — and to suggest improvements to the overall vault structure.
|
|
12
|
-
|
|
13
|
-
## Prerequisites Check
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
obsidian --version
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
If this fails, STOP and display the Obsidian CLI availability message (see /prep).
|
|
20
|
-
|
|
21
|
-
## Parameters
|
|
22
|
-
|
|
23
|
-
- **scope** (optional): `all` (full vault), `agents` (agent pages only), `sources` (user notes), or a specific directory. Default: `all`.
|
|
24
|
-
- **dry_run** (optional): `true` to only suggest, `false` to apply changes. Default: `true`.
|
|
25
|
-
|
|
26
|
-
## Process
|
|
27
|
-
|
|
28
|
-
### Step 1: Scan Current Structure
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
obsidian list
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Build a picture of:
|
|
35
|
-
- Current directory structure
|
|
36
|
-
- Notes in each directory
|
|
37
|
-
- Notes that seem misplaced based on their frontmatter
|
|
38
|
-
|
|
39
|
-
### Step 2: Check Agent Pages
|
|
40
|
-
|
|
41
|
-
Agent pages should live in their designated directories:
|
|
42
|
-
|
|
43
|
-
| `type` frontmatter | Expected directory |
|
|
44
|
-
|-------------------|-------------------|
|
|
45
|
-
| `entity` | `entities/` |
|
|
46
|
-
| `concept` | `concepts/` |
|
|
47
|
-
| `comparison` | `comparisons/` |
|
|
48
|
-
| `query` | `queries/` |
|
|
49
|
-
|
|
50
|
-
For each agent page, check:
|
|
51
|
-
- Does its current directory match its `type`?
|
|
52
|
-
- If not, suggest a move
|
|
53
|
-
|
|
54
|
-
### Step 3: Check User Notes
|
|
55
|
-
|
|
56
|
-
User notes should **remain** in their existing directories (`Projects/`, `Daily/`, personal folders, etc.). Do not suggest moving them into agent directories. Suggest organization only if:
|
|
57
|
-
|
|
58
|
-
- A user note has been placed in an agent directory (`entities/`, `concepts/`, `comparisons/`, `queries/`) — this is likely a mistake; propose moving it back to an appropriate user area
|
|
59
|
-
- Multiple user notes about the same topic are scattered across **user** directories when they could be grouped there (never into agent dirs unless they are true agent pages with correct `type` frontmatter)
|
|
60
|
-
|
|
61
|
-
### Step 4: Check Naming Conventions
|
|
62
|
-
|
|
63
|
-
Per SCHEMA.md conventions:
|
|
64
|
-
- File names should be lowercase with hyphens, no spaces
|
|
65
|
-
- Names should match the page title (abbreviated, hyphenated)
|
|
66
|
-
- No duplicate names with different suffixes (e.g., `feature-a.md` and `feature-a-1.md`)
|
|
67
|
-
|
|
68
|
-
Flag any naming violations.
|
|
69
|
-
|
|
70
|
-
### Step 5: Suggest Moves
|
|
71
|
-
|
|
72
|
-
For each misplaced file:
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
Move: entities/wrong-place.md → concepts/wrong-place.md
|
|
76
|
-
Reason: type=concept but currently in entities/
|
|
77
|
-
|
|
78
|
-
Move: Projects/random-notes.md → Projects/feature-a/
|
|
79
|
-
Reason: Content is about Feature A, should be grouped with other Feature A notes
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Step 6: Apply Moves (If Confirmed)
|
|
83
|
-
|
|
84
|
-
Use Obsidian CLI to rename/move files:
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
obsidian rename file="old-path.md" new_name="new-path.md"
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Always show the full plan before applying. Never move files silently.
|
|
91
|
-
|
|
92
|
-
### Step 7: Update Wikilinks
|
|
93
|
-
|
|
94
|
-
After moving files, check that all wikilinks to the moved files are still valid:
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
obsidian backlinks "moved-file"
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
Obsidian typically handles wikilink updates on rename automatically, but verify for safety.
|
|
101
|
-
|
|
102
|
-
## Key Principles
|
|
103
|
-
|
|
104
|
-
- **Suggest first, act second.** Default to dry_run mode. Show the full plan before making any changes.
|
|
105
|
-
- **Agent directories are sacred.** Only agent pages should live in `entities/`, `concepts/`, `comparisons/`, `queries/`.
|
|
106
|
-
- **User notes are user territory.** Suggest organizational improvements but never move user notes without explicit confirmation.
|
|
107
|
-
- **Obsidian is first workbench.** All note operations go through Obsidian CLI.
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: prep
|
|
3
|
-
description: >
|
|
4
|
-
Shared prerequisites check — verifies Obsidian CLI is available and displays a correct
|
|
5
|
-
error message with installation guidance. Referenced by all skills via "(see /prep)".
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# /prep — Prerequisites Check
|
|
9
|
-
|
|
10
|
-
## Obsidian CLI Availability
|
|
11
|
-
|
|
12
|
-
Before using any BYOAO skill, verify the Obsidian CLI is available:
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
obsidian --version
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
If this fails, STOP and display:
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
Obsidian CLI is not available. The Obsidian CLI is bundled with the Obsidian
|
|
22
|
-
app (v1.12+) and cannot be installed separately.
|
|
23
|
-
|
|
24
|
-
1. Install or update Obsidian from: https://obsidian.md/download
|
|
25
|
-
2. Open Obsidian and enable the CLI:
|
|
26
|
-
Settings → General → Advanced → Command-line interface
|
|
27
|
-
3. Make sure Obsidian is running, then try again.
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Graph Enrichment
|
|
31
|
-
|
|
32
|
-
Scan all user notes and enrich frontmatter, suggest cross-references.
|
|
33
|
-
|
|
34
|
-
### Step 1: Scan Notes
|
|
35
|
-
- Read all `.md` files outside agent directories
|
|
36
|
-
- Extract entities, key terms, and potential wikilink targets
|
|
37
|
-
|
|
38
|
-
### Step 2: Enrich Frontmatter
|
|
39
|
-
For each note missing frontmatter:
|
|
40
|
-
- Add `title` (from filename or first heading)
|
|
41
|
-
- Add `date` (from file creation time or content)
|
|
42
|
-
- Suggest `tags` based on content
|
|
43
|
-
|
|
44
|
-
For notes with partial frontmatter:
|
|
45
|
-
- Fill in missing required fields
|
|
46
|
-
- Never overwrite existing values
|
|
47
|
-
|
|
48
|
-
### Step 3: Suggest Cross-References
|
|
49
|
-
- Identify recurring terms mentioned across notes
|
|
50
|
-
- Suggest converting mentions to `[[wikilinks]]`
|
|
51
|
-
- Propose new entries for `SCHEMA.md` tag taxonomy
|
|
52
|
-
|
|
53
|
-
### Step 4: Report
|
|
54
|
-
Present a summary:
|
|
55
|
-
- Notes enriched: X
|
|
56
|
-
- Wikilinks suggested: Y
|
|
57
|
-
- New schema terms proposed: Z
|
|
58
|
-
Ask for approval before applying any changes.
|
|
59
|
-
|
|
60
|
-
### Key Behaviors
|
|
61
|
-
- Idempotent — running twice won't duplicate changes
|
|
62
|
-
- Never overwrites existing frontmatter values
|
|
63
|
-
- Asks before applying wikilink suggestions
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: trace
|
|
3
|
-
description: >
|
|
4
|
-
Chronological timeline of an idea across notes. Detects phases, turning points, and
|
|
5
|
-
contradictions in how a topic evolved. Use when the user asks "how did X evolve",
|
|
6
|
-
"trace the history of Y", "timeline of Z", or wants to understand how an idea changed over time.
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# /trace — Chronological Timeline
|
|
10
|
-
|
|
11
|
-
You are a historical detective. Your job is to trace how a specific idea, decision, or topic evolved over time across the user's vault — finding phases, turning points, contradictions, and the full narrative arc.
|
|
12
|
-
|
|
13
|
-
## Prerequisites Check
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
obsidian --version
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
If this fails, STOP and display the Obsidian CLI availability message (see /prep).
|
|
20
|
-
|
|
21
|
-
## Parameters
|
|
22
|
-
|
|
23
|
-
- **topic** (required): The idea, decision, or concept to trace.
|
|
24
|
-
- **depth** (optional): `summary` (key milestones only) or `detailed` (all mentions with context). Default: `summary`.
|
|
25
|
-
|
|
26
|
-
## Process
|
|
27
|
-
|
|
28
|
-
### Step 1: Locate All Mentions
|
|
29
|
-
|
|
30
|
-
Search for the topic across all notes:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
obsidian search "<topic>"
|
|
34
|
-
obsidian tags "<topic>"
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Also search agent-maintained pages under `entities/`, `concepts/`, `comparisons/`, and `queries/`:
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
obsidian read file="entities/<topic>.md"
|
|
41
|
-
obsidian read file="concepts/<topic>.md"
|
|
42
|
-
obsidian read file="comparisons/<topic>.md"
|
|
43
|
-
obsidian read file="queries/<topic>.md"
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Read `INDEX.base` to check if there's already a compiled page for this topic.
|
|
47
|
-
|
|
48
|
-
### Step 2: Build Timeline
|
|
49
|
-
|
|
50
|
-
For each note that mentions the topic:
|
|
51
|
-
|
|
52
|
-
1. Read the full content using `obsidian read`
|
|
53
|
-
2. Extract the date (from frontmatter or filename for daily notes)
|
|
54
|
-
3. Identify what the note says about the topic:
|
|
55
|
-
- **New idea proposed** — first mention of the concept
|
|
56
|
-
- **Decision made** — commitment to a specific approach
|
|
57
|
-
- **Change/evolution** — modification of previous understanding
|
|
58
|
-
- **Contradiction** — statement that conflicts with an earlier note
|
|
59
|
-
- **Confirmation** — validation of a previous position
|
|
60
|
-
- **Abandoned** — idea dropped or superseded
|
|
61
|
-
|
|
62
|
-
### Step 3: Detect Phases
|
|
63
|
-
|
|
64
|
-
Group the timeline into phases:
|
|
65
|
-
|
|
66
|
-
- **Inception** — topic first appears, initial framing
|
|
67
|
-
- **Exploration** — multiple approaches considered, debate
|
|
68
|
-
- **Decision** — specific approach chosen
|
|
69
|
-
- **Implementation** — execution details, adjustments
|
|
70
|
-
- **Resolution** — outcome, lessons learned (or abandonment)
|
|
71
|
-
|
|
72
|
-
A topic may skip phases, cycle back, or have multiple parallel tracks.
|
|
73
|
-
|
|
74
|
-
### Step 4: Identify Turning Points
|
|
75
|
-
|
|
76
|
-
Highlight moments where the trajectory changed:
|
|
77
|
-
|
|
78
|
-
- "We switched from X to Y" — explicit change
|
|
79
|
-
- Data or evidence that contradicted previous assumptions
|
|
80
|
-
- New stakeholder or constraint that shifted direction
|
|
81
|
-
- External event (tech release, policy change) that affected the topic
|
|
82
|
-
|
|
83
|
-
### Step 5: Find Contradictions
|
|
84
|
-
|
|
85
|
-
Compare statements across time:
|
|
86
|
-
|
|
87
|
-
- "In Note A (March 1): we decided X"
|
|
88
|
-
- "In Note B (April 15): actually Y is better because..."
|
|
89
|
-
- Is this a genuine contradiction, an evolution of thinking, or a context-dependent difference?
|
|
90
|
-
|
|
91
|
-
Flag genuine contradictions. Note the dates, sources, and nature of the conflict.
|
|
92
|
-
|
|
93
|
-
### Step 6: Present Timeline
|
|
94
|
-
|
|
95
|
-
```markdown
|
|
96
|
-
# Timeline: {topic}
|
|
97
|
-
|
|
98
|
-
Traced across {N} notes spanning {start date} to {end date}.
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Phase 1: {Phase Name} ({date range})
|
|
103
|
-
|
|
104
|
-
**What was happening**: {brief context}
|
|
105
|
-
|
|
106
|
-
- **{date}** — [[Note A]]: {what happened / what was decided}
|
|
107
|
-
- **{date}** — [[Note B]]: {what changed / what was added}
|
|
108
|
-
|
|
109
|
-
**Key insight**: {what this phase reveals}
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## Phase 2: {Phase Name} ({date range})
|
|
114
|
-
...
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Turning Points
|
|
119
|
-
|
|
120
|
-
1. **{date}**: {what changed and why it mattered} — [[source note]]
|
|
121
|
-
|
|
122
|
-
## Contradictions Found
|
|
123
|
-
|
|
124
|
-
- ⚠ [[Note A]] says X, but [[Note B]] says Y — {resolution if known}
|
|
125
|
-
|
|
126
|
-
## Current State
|
|
127
|
-
|
|
128
|
-
{Where things stand now — the most recent position on this topic}
|
|
129
|
-
|
|
130
|
-
## Unanswered Questions
|
|
131
|
-
|
|
132
|
-
{What the vault doesn't tell us about this topic's evolution}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## Key Principles
|
|
136
|
-
|
|
137
|
-
- **Chronology is authority.** The timeline must follow actual note dates, not inferred order.
|
|
138
|
-
- **Evidence-based.** Every claim in the timeline must cite a specific note.
|
|
139
|
-
- **Show the messiness.** Ideas rarely evolve linearly. Show the false starts, reversals, and parallel tracks.
|
|
140
|
-
- **Flag contradictions.** Don't resolve them — present both sides and let the user decide.
|
|
141
|
-
- **Obsidian is first workbench.** All note operations go through Obsidian CLI.
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wiki
|
|
3
|
-
description: >
|
|
4
|
-
Generate and maintain INDEX.base — the dynamic knowledge map for v2 agent pages (`type`:
|
|
5
|
-
entity | concept | comparison | query). Uses Obsidian Base queries to list agent-maintained
|
|
6
|
-
pages; SCHEMA.md defines tag taxonomy. Use when the user runs /wiki or wants to see the current
|
|
7
|
-
state of the knowledge base.
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# /wiki — Knowledge Map
|
|
11
|
-
|
|
12
|
-
**Metaphor:** The menu board — shows what's been prepared and what's on offer.
|
|
13
|
-
|
|
14
|
-
## Purpose
|
|
15
|
-
|
|
16
|
-
Generate and maintain `INDEX.base`, the dynamic knowledge map that lists all agent-maintained pages grouped by v2 `type` (`entity`, `concept`, `comparison`, `query`). Unlike static index files, INDEX.base uses Obsidian Base queries to stay current automatically. Use `SCHEMA.md` for tag taxonomy when summarizing or grouping entries.
|
|
17
|
-
|
|
18
|
-
## Process
|
|
19
|
-
|
|
20
|
-
### Step 1: Prerequisites Check
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
obsidian --version
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
If this fails, STOP and display the Obsidian CLI availability message (see /prep).
|
|
27
|
-
|
|
28
|
-
### Step 2: Read SCHEMA.md
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
obsidian read file="SCHEMA.md"
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Understand the current tag taxonomy, domain definitions, and page conventions.
|
|
35
|
-
|
|
36
|
-
### Step 3: Generate INDEX.base Content
|
|
37
|
-
|
|
38
|
-
Query all agent-maintained pages by v2 frontmatter `type` (`entity`, `concept`, `comparison`, `query`) so each page is listed under the correct section:
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
obsidian properties type=entity
|
|
42
|
-
obsidian properties type=concept
|
|
43
|
-
obsidian properties type=comparison
|
|
44
|
-
obsidian properties type=query
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
For each type, compile entries with:
|
|
48
|
-
- Page name (as wikilink)
|
|
49
|
-
- Title from frontmatter
|
|
50
|
-
- Brief summary (from content's first paragraph or definition section)
|
|
51
|
-
- Tags and domain
|
|
52
|
-
|
|
53
|
-
Format by section:
|
|
54
|
-
|
|
55
|
-
```markdown
|
|
56
|
-
# Knowledge Index
|
|
57
|
-
|
|
58
|
-
## Entities
|
|
59
|
-
- [[feature-a]] — Response time monitoring feature (tags: monitoring, backend)
|
|
60
|
-
- [[zhang-san]] — Senior engineer on Feature A team (tags: team, engineering)
|
|
61
|
-
|
|
62
|
-
## Concepts
|
|
63
|
-
- [[response-time-metrics]] — Why median replaced avg for trigger calculation (tags: metrics, decisions)
|
|
64
|
-
- [[search-trigger-rules]] — Search trigger rule design principles (tags: search, configuration)
|
|
65
|
-
|
|
66
|
-
## Comparisons
|
|
67
|
-
- [[avg-vs-median-for-trigger]] — Side-by-side analysis of avg vs median as trigger metrics (tags: metrics, decisions)
|
|
68
|
-
|
|
69
|
-
## Queries
|
|
70
|
-
- [[why-did-we-choose-median]] — "Why did we choose median over avg?" — detailed answer (tags: metrics, history)
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### Step 4: Check Obsidian Base Configuration
|
|
74
|
-
|
|
75
|
-
INDEX.base relies on Obsidian Base (saved search) configuration. Verify:
|
|
76
|
-
|
|
77
|
-
1. The Base query covers all four agent directories
|
|
78
|
-
2. The query filters by `type` frontmatter field
|
|
79
|
-
3. Results are grouped by type
|
|
80
|
-
|
|
81
|
-
If the Base doesn't exist or is misconfigured, guide the user to set it up:
|
|
82
|
-
- Open Obsidian → Bases → Create new base
|
|
83
|
-
- Name it "Knowledge Index"
|
|
84
|
-
- Query: `path:entities/ OR path:concepts/ OR path:comparisons/ OR path:queries/`
|
|
85
|
-
- Group by: `type`
|
|
86
|
-
|
|
87
|
-
### Step 5: Present the Index
|
|
88
|
-
|
|
89
|
-
Show the current INDEX.base content to the user:
|
|
90
|
-
|
|
91
|
-
```markdown
|
|
92
|
-
# Knowledge Index
|
|
93
|
-
|
|
94
|
-
Generated on YYYY-MM-DD
|
|
95
|
-
|
|
96
|
-
Total pages: N (X entities, Y concepts, Z comparisons, W queries)
|
|
97
|
-
|
|
98
|
-
## By Domain
|
|
99
|
-
- backend: N pages
|
|
100
|
-
- frontend: M pages
|
|
101
|
-
- infrastructure: K pages
|
|
102
|
-
|
|
103
|
-
## Most Connected
|
|
104
|
-
- [[page-name]] — N inbound links
|
|
105
|
-
- [[page-name]] — M inbound links
|
|
106
|
-
|
|
107
|
-
## Recently Updated
|
|
108
|
-
- [[page-name]] — updated YYYY-MM-DD
|
|
109
|
-
- [[page-name]] — updated YYYY-MM-DD
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Step 6: Suggest Gaps
|
|
113
|
-
|
|
114
|
-
Based on the index, identify knowledge gaps:
|
|
115
|
-
- Entity mentioned in multiple concepts but no entity page exists
|
|
116
|
-
- Concept referenced in entity pages but no concept page exists
|
|
117
|
-
- Domains with very few pages (under-represented areas)
|
|
118
|
-
- Tags used frequently but no corresponding concept page
|
|
119
|
-
|
|
120
|
-
## Key Principles
|
|
121
|
-
|
|
122
|
-
- **INDEX.base is dynamic.** The Obsidian Base query keeps it current — no manual regeneration needed on every cook cycle.
|
|
123
|
-
- **Summary quality.** Each entry's one-line summary should be genuinely informative, not just the page title repeated.
|
|
124
|
-
- **Navigation first.** INDEX.base exists to help humans find knowledge quickly. Structure it for scanning, not completeness.
|
|
125
|
-
- **Obsidian is first workbench.** All note operations go through Obsidian CLI.
|
|
126
|
-
- **Agent pages only.** INDEX.base covers only `entities/`, `concepts/`, `comparisons/`, `queries/` — not user notes.
|