@jayjiang/byoao 2.0.7 → 2.0.9

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.
Files changed (62) hide show
  1. package/dist/__tests__/plugin-config.test.js +11 -0
  2. package/dist/__tests__/plugin-config.test.js.map +1 -1
  3. package/dist/assets/obsidian-skills/obsidian-cli.md +7 -0
  4. package/dist/assets/presets/common/AGENTS.md.hbs +5 -5
  5. package/dist/assets/presets/common/INDEX.base.example +136 -0
  6. package/dist/assets/presets/common/Start Here.md.hbs +1 -1
  7. package/dist/assets/presets/pm-tpm/preset.json +1 -0
  8. package/dist/assets/skills/ask/SKILL.md +47 -10
  9. package/dist/assets/skills/connect/SKILL.md +1 -1
  10. package/dist/assets/skills/cook/SKILL.md +2 -2
  11. package/dist/assets/skills/diagnose/SKILL.md +1 -1
  12. package/dist/assets/skills/ideas/SKILL.md +2 -2
  13. package/dist/assets/skills/trace/SKILL.md +1 -1
  14. package/dist/assets/skills/wiki/SKILL.md +50 -57
  15. package/dist/cli/cli-program.js +52 -15
  16. package/dist/cli/cli-program.js.map +1 -1
  17. package/dist/e2e/cli-init.e2e.test.js +92 -0
  18. package/dist/e2e/cli-init.e2e.test.js.map +1 -0
  19. package/dist/hooks/idle-suggestions.js +1 -1
  20. package/dist/hooks/idle-suggestions.js.map +1 -1
  21. package/dist/index.js +213 -171
  22. package/dist/plugin-config.js +4 -0
  23. package/dist/plugin-config.js.map +1 -1
  24. package/dist/tools/init-vault.js +1 -1
  25. package/dist/tools/init-vault.js.map +1 -1
  26. package/dist/vault/__tests__/create.test.js +4 -1
  27. package/dist/vault/__tests__/create.test.js.map +1 -1
  28. package/dist/vault/__tests__/doctor.test.js +8 -0
  29. package/dist/vault/__tests__/doctor.test.js.map +1 -1
  30. package/dist/vault/__tests__/index-base-example.test.js +31 -0
  31. package/dist/vault/__tests__/index-base-example.test.js.map +1 -0
  32. package/dist/vault/__tests__/mcp.test.js +1 -0
  33. package/dist/vault/__tests__/mcp.test.js.map +1 -1
  34. package/dist/vault/__tests__/obsidian-plugins.test.js +1 -0
  35. package/dist/vault/__tests__/obsidian-plugins.test.js.map +1 -1
  36. package/dist/vault/__tests__/preset-init-filter.test.js +18 -0
  37. package/dist/vault/__tests__/preset-init-filter.test.js.map +1 -0
  38. package/dist/vault/create.js +4 -0
  39. package/dist/vault/create.js.map +1 -1
  40. package/dist/vault/doctor.js +11 -0
  41. package/dist/vault/doctor.js.map +1 -1
  42. package/dist/vault/index-base-example.js +19 -0
  43. package/dist/vault/index-base-example.js.map +1 -0
  44. package/dist/vault/manifest.js +1 -1
  45. package/dist/vault/preset.js +18 -2
  46. package/dist/vault/preset.js.map +1 -1
  47. package/dist/vault/self-update.js +1 -1
  48. package/dist/vault/upgrade.js +3 -0
  49. package/dist/vault/upgrade.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/assets/obsidian-skills/obsidian-cli.md +7 -0
  52. package/src/assets/presets/common/AGENTS.md.hbs +5 -5
  53. package/src/assets/presets/common/INDEX.base.example +136 -0
  54. package/src/assets/presets/common/Start Here.md.hbs +1 -1
  55. package/src/assets/presets/pm-tpm/preset.json +1 -0
  56. package/src/skills/ask/SKILL.md +47 -10
  57. package/src/skills/connect/SKILL.md +1 -1
  58. package/src/skills/cook/SKILL.md +2 -2
  59. package/src/skills/diagnose/SKILL.md +1 -1
  60. package/src/skills/ideas/SKILL.md +2 -2
  61. package/src/skills/trace/SKILL.md +1 -1
  62. package/src/skills/wiki/SKILL.md +50 -57
@@ -48,6 +48,17 @@ describe("PresetConfigSchema", () => {
48
48
  expect(result.mcpServers).toEqual({});
49
49
  expect(result.templates).toEqual([]);
50
50
  expect(result.frontmatterExtras).toEqual({});
51
+ expect(result.initOfferWhen).toBe("always");
52
+ });
53
+ it("parses initOfferWhen work", () => {
54
+ const result = PresetConfigSchema.parse({
55
+ name: "pm-tpm",
56
+ displayName: "PM / TPM",
57
+ description: "d",
58
+ agentDescription: "a",
59
+ initOfferWhen: "work",
60
+ });
61
+ expect(result.initOfferWhen).toBe("work");
51
62
  });
52
63
  it("validates mcpServers field", () => {
53
64
  const result = PresetConfigSchema.parse({
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-config.test.js","sourceRoot":"","sources":["../../src/__tests__/plugin-config.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-config.test.js","sourceRoot":"","sources":["../../src/__tests__/plugin-config.test.ts"],"names":[],"mappings":"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"}
@@ -59,6 +59,13 @@ obsidian backlinks file="My Note"
59
59
 
60
60
  Use `--copy` on any command to copy output to clipboard. Use `silent` to prevent files from opening. Use `total` on list commands to get a count.
61
61
 
62
+ ## Bases (`.base` files) and CLI retrieval
63
+
64
+ [Obsidian Bases](https://obsidian.md/blog/bases/) use `.base` files (for example `INDEX.base`) as the **vault wiki index**: in the app, each row is a note and columns expose frontmatter, paths, backlinks, dates, and other metadata.
65
+
66
+ - **`obsidian read file="INDEX.base"`** returns the **on-disk Base definition** (views, filters, formulas). Obsidian **evaluates** that definition into the live, sortable table — the definition is the source of truth for *what* is in the index, not a throwaway “config.”
67
+ - **Agents** should read the Base to learn path/property scope, then query the same graph at high speed with **`obsidian properties`**, **`obsidian search`**, **`obsidian tags`**, **`obsidian backlinks`**, and any newer list commands from **`obsidian help`**. Do not maintain a duplicate markdown catalog unless the user explicitly wants one.
68
+
62
69
  ## Plugin development
63
70
 
64
71
  ### Develop/test cycle
@@ -4,7 +4,7 @@
4
4
  This is an LLM Wiki knowledge base. Your notes are raw material — the Agent compiles them into structured knowledge pages via `/cook`. Both coexist in the same vault, connected through wikilinks.
5
5
 
6
6
  ## Getting Started
7
- Run `/wiki` to generate `INDEX.base`, then explore the knowledge structure from there.
7
+ Run `/wiki` to set up or refresh **`INDEX.base`** (Obsidian Bases wiki index), then explore the knowledge structure from there. Agents query the same graph with Obsidian CLI (`obsidian properties`, `search`, `tags`, `backlinks` — see **`/ask`**).
8
8
 
9
9
  ## Note Types
10
10
  User notes: Your existing notes, kept in their original directories (Projects/, Daily/, etc.) — untouched.
@@ -18,17 +18,17 @@ Do not use bash (`cat`, `grep`, `find`, `sed`, etc.) to manipulate note files di
18
18
 
19
19
  For questions that must be answered **from this vault** (not general knowledge), follow this chain. **Authoritative specification: the `/ask` skill** — if this summary diverges, follow `/ask`.
20
20
 
21
- - Read **`INDEX.base`** first when it exists (compiled knowledge map and page discovery).
21
+ - **`INDEX.base`** is the vault Bases wiki index (live query + metadata in Obsidian). Read it via CLI to learn scope; use **`obsidian properties`** by `type` (and `search` / `tags` / `backlinks` as needed) to list and traverse the same compiled pages — no duplicate static index file.
22
22
  - Read **`SCHEMA.md`** when you need tag taxonomy, domain rules, or agent directory conventions.
23
- - Run **`obsidian search`** with each key concept; merge results across queries.
24
- - Run **`obsidian read`** on promising paths. Prefer agent pages under `entities/`, `concepts/`, `comparisons/`, and `queries/`, then pages whose tags or `domain` match the question, `status: reviewed` over `draft`, and more recent `updated`.
23
+ - Run **`obsidian search`** for each key concept and merge results; broaden to user-note paths when the answer may live outside agent directories.
24
+ - Run **`obsidian read`** on promising paths. Prefer agent pages under `entities/`, `concepts/`, `comparisons/`, and `queries/`, then user notes elsewhere. Prefer `status: reviewed` over `draft`, and more recent `updated`.
25
25
  - **Synthesize** a direct answer with `[[wikilink]]` citations and explicit gaps. Every claim should be backed by vault notes.
26
26
 
27
27
  ## Available Skills
28
28
  - **/cook** — Digest notes and external sources, compile knowledge pages
29
29
  - **/health** — Check knowledge page health (orphans, stale content, contradictions)
30
30
  - **/prep** — Fix frontmatter and broken wikilinks
31
- - **/wiki** — Generate INDEX.base knowledge map
31
+ - **/wiki** — Set up or refresh INDEX.base (Bases wiki index) and inventory
32
32
  - **/organize** — Reorganize directory structure as needed
33
33
  - **/ask** — Open-ended Q&A against the knowledge base
34
34
  - **Thinking Tools** — /trace, /connect, /ideas, /challenge, /drift
@@ -0,0 +1,136 @@
1
+ # BYOAO LLM Wiki v2 — copy to vault root as INDEX.base (see /wiki). Bases core plugin required.
2
+ # Quoting: keep each formula value in single quotes; use double quotes inside the expression where needed.
3
+ # Recently Updated: use limit + column order only — do not groupBy on raw `updated` (unique timestamps = one row per group).
4
+
5
+ filters:
6
+ or:
7
+ - file.inFolder("entities")
8
+ - file.inFolder("concepts")
9
+ - file.inFolder("comparisons")
10
+ - file.inFolder("queries")
11
+
12
+ formulas:
13
+ type_label: 'if(type == "entity", "Entity", if(type == "concept", "Concept", if(type == "comparison", "Comparison", if(type == "query", "Query", type))))'
14
+ days_since_update: 'if(updated, (today() - date(updated)).days, "")'
15
+ backlink_count: 'file.backlinks.length'
16
+
17
+ properties:
18
+ file.name:
19
+ displayName: Name
20
+ title:
21
+ displayName: Title
22
+ type:
23
+ displayName: Type
24
+ domain:
25
+ displayName: Domain
26
+ tags:
27
+ displayName: Tags
28
+ updated:
29
+ displayName: Updated
30
+ status:
31
+ displayName: Status
32
+ formula.type_label:
33
+ displayName: Kind
34
+ formula.days_since_update:
35
+ displayName: Days since update
36
+ formula.backlink_count:
37
+ displayName: Backlinks
38
+
39
+ views:
40
+ - type: table
41
+ name: All Pages
42
+ groupBy:
43
+ property: type
44
+ direction: ASC
45
+ order:
46
+ - file.name
47
+ - title
48
+ - formula.type_label
49
+ - domain
50
+ - tags
51
+ - updated
52
+ - formula.days_since_update
53
+ - formula.backlink_count
54
+ - status
55
+ summaries:
56
+ formula.backlink_count: Average
57
+
58
+ - type: table
59
+ name: Entities
60
+ filters:
61
+ and:
62
+ - 'type == "entity"'
63
+ groupBy:
64
+ property: domain
65
+ direction: ASC
66
+ order:
67
+ - file.name
68
+ - title
69
+ - domain
70
+ - tags
71
+ - updated
72
+ - formula.days_since_update
73
+ - formula.backlink_count
74
+ - status
75
+ summaries:
76
+ formula.backlink_count: Average
77
+
78
+ - type: table
79
+ name: Concepts
80
+ filters:
81
+ and:
82
+ - 'type == "concept"'
83
+ groupBy:
84
+ property: domain
85
+ direction: ASC
86
+ order:
87
+ - file.name
88
+ - title
89
+ - domain
90
+ - tags
91
+ - updated
92
+ - formula.days_since_update
93
+ - formula.backlink_count
94
+ - status
95
+
96
+ - type: table
97
+ name: Comparisons
98
+ filters:
99
+ and:
100
+ - 'type == "comparison"'
101
+ order:
102
+ - file.name
103
+ - title
104
+ - domain
105
+ - tags
106
+ - updated
107
+ - formula.days_since_update
108
+ - formula.backlink_count
109
+ - status
110
+
111
+ - type: table
112
+ name: Queries
113
+ filters:
114
+ and:
115
+ - 'type == "query"'
116
+ order:
117
+ - file.name
118
+ - title
119
+ - domain
120
+ - tags
121
+ - updated
122
+ - formula.days_since_update
123
+ - formula.backlink_count
124
+ - status
125
+
126
+ - type: table
127
+ name: Recently Updated
128
+ limit: 10
129
+ order:
130
+ - updated
131
+ - file.name
132
+ - title
133
+ - type
134
+ - domain
135
+ - formula.days_since_update
136
+ - formula.backlink_count
@@ -84,7 +84,7 @@ After cooking, press `Cmd+G` to open Graph View and see the connections.
84
84
  |---------|-------------|
85
85
  | `/cook` | Compile notes into structured knowledge pages |
86
86
  | `/health` | Check knowledge page health |
87
- | `/wiki` | Generate INDEX.base knowledge map |
87
+ | `/wiki` | Set up or refresh INDEX.base (Bases wiki index) |
88
88
  | `/organize` | Reorganize vault directories |
89
89
  | `/ask` | Open-ended Q&A against your knowledge |
90
90
  | `/trace` | Track how an idea evolved over time |
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "pm-tpm",
3
3
  "displayName": "PM / TPM",
4
+ "initOfferWhen": "work",
4
5
  "description": "Adds Atlassian + BigQuery MCP servers, project directories, and PM templates on top of the core LLM Wiki",
5
6
  "directories": ["Projects", "Sprints"],
6
7
  "agentDescription": "LLM Wiki knowledge base with PM/TPM tooling. Use /cook to digest notes and external sources. Use /health to health-check. Atlassian and BigQuery are connected.",
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: ask
3
3
  description: >
4
- Open-ended Q&A against the knowledge base. Agent reads INDEX.base for page discovery
5
- and SCHEMA.md for tag taxonomy, navigates entities/, concepts/, comparisons/, and queries/,
6
- synthesizes answers with citations. Use when the user asks questions about vault content
7
- like "what is X", "why did we decide Y", "explain Z", "what do my notes say about",
8
- "summarize what I know about", or any question that should be answered from accumulated
9
- knowledge rather than general training data.
4
+ Open-ended Q&A against the knowledge base. Uses INDEX.base as the vault Bases wiki index,
5
+ Obsidian CLI (properties, search, tags, backlinks) to traverse the same graph the Base
6
+ shows in Obsidian, SCHEMA.md for taxonomy, then reads and synthesizes with citations.
7
+ Use when the user asks questions about vault content like "what is X", "why did we decide Y",
8
+ "explain Z", "what do my notes say about", "summarize what I know about", or any question
9
+ that should be answered from accumulated knowledge rather than general training data.
10
10
  ---
11
11
 
12
12
  # /ask — Knowledge Q&A
@@ -36,21 +36,56 @@ Identify the key concepts, entities, and intent in the user's question.
36
36
 
37
37
  ### Step 2: Locate Relevant Pages
38
38
 
39
- If `INDEX.base` exists, read it first for page discovery and the compiled knowledge map:
39
+ **Do not delegate this workflow to a generic exploration subagent.** Run the Obsidian CLI steps yourself so searches merge and nothing is skipped.
40
+
41
+ #### 2a — Wiki index: `INDEX.base` (Bases)
42
+
43
+ If `INDEX.base` exists, read it first:
40
44
 
41
45
  ```bash
42
46
  obsidian read file="INDEX.base"
43
47
  ```
44
48
 
45
- Read `SCHEMA.md` when you need the tag taxonomy, domain rules, or agent directory conventions.
49
+ **What this is:** The vault’s **Obsidian Bases wiki index**. In the app, this file drives a **live, query-backed table** of notes with rich metadata (paths, tags, dates, backlinks, and any columns you add). The bytes on disk are the Base definition (views, filters, formulas); Obsidian **evaluates** that definition into the dynamic index you see in the UI.
50
+
51
+ **How to use it as an agent:** Parse the definition to learn **which paths and property filters** define “compiled knowledge” in this vault. Then run CLI commands that query the **same scope** — do not treat the YAML as meaningless “config” or assume the vault has no index when you do not see note titles in the read output.
52
+
53
+ #### 2b — List agent-maintained pages (same scope the Base should cover)
54
+
55
+ Enumerate compiled pages by v2 frontmatter `type` (high-speed retrieval, same notes the Base is meant to index):
56
+
57
+ ```bash
58
+ obsidian properties type=entity
59
+ obsidian properties type=concept
60
+ obsidian properties type=comparison
61
+ obsidian properties type=query
62
+ ```
63
+
64
+ Use paths and titles from this output as candidates. When helpful, add **`obsidian tags`**, **`obsidian backlinks file="..."`**, or other list commands from `obsidian help` to exploit metadata associations the Base surfaces as columns.
65
+
66
+ #### 2c — Taxonomy and conventions
46
67
 
47
- Then search for relevant pages:
68
+ Read `SCHEMA.md` when you need the tag taxonomy, domain rules, or agent directory conventions:
69
+
70
+ ```bash
71
+ obsidian read file="SCHEMA.md"
72
+ ```
73
+
74
+ If the question or `SCHEMA.md` points at specific tags, run targeted searches for those tags in addition to plain terms.
75
+
76
+ #### 2d — Search by key concepts
77
+
78
+ For each key concept in the question:
48
79
 
49
80
  ```bash
50
81
  obsidian search "<key concept>"
51
82
  ```
52
83
 
53
- Search for each key concept mentioned in the question. Combine results across concepts.
84
+ Combine and deduplicate results across queries.
85
+
86
+ #### 2e — User and source notes outside agent directories
87
+
88
+ Answers may live in raw notes (e.g. reports, dailies, `Projects/`) that are **not** under `entities/`, `concepts/`, `comparisons/`, or `queries/`. After agent-scope passes, run broader searches (filename keywords, dates, or tags) until you have checked plausible locations or confirmed the vault has no matching note.
54
89
 
55
90
  ### Step 3: Read Relevant Pages
56
91
 
@@ -61,6 +96,7 @@ obsidian read file="entities/some-page.md"
61
96
  ```
62
97
 
63
98
  Prioritize:
99
+
64
100
  - Agent pages in `entities/`, `concepts/`, `comparisons/`, `queries/`
65
101
  - Pages with matching tags or domain
66
102
  - Pages with `status: reviewed` (over `draft`)
@@ -133,3 +169,4 @@ Use `obsidian create` to save. Ask the user where they'd like it saved.
133
169
  - **Acknowledge gaps**: If the vault doesn't have enough information, say so.
134
170
  - **Respect scope**: Only answer based on vault content, not external knowledge.
135
171
  - **Save on request**: Always offer to save the answer as a note for future reference.
172
+ - **Bases + CLI:** The wiki index is **`INDEX.base`** in Obsidian; discovery via CLI is **`obsidian properties`** (by `type` and other fields), **`obsidian search`**, and related commands — not a duplicate markdown index file.
@@ -34,7 +34,7 @@ obsidian search "<from>"
34
34
  obsidian search "<to>"
35
35
  ```
36
36
 
37
- If `INDEX.base` exists, read it to spot compiled pages for either topic.
37
+ If `INDEX.base` exists, read it to align with the vault Bases index, then use `obsidian properties` / `search` as in **`/ask`**.
38
38
 
39
39
  Read any existing agent pages in `entities/`, `concepts/`, `comparisons/`, and `queries/`:
40
40
 
@@ -70,7 +70,7 @@ When user provides a URL:
70
70
  - Identify entities (named things), concepts (abstract ideas), decisions, contradictions
71
71
 
72
72
  ### Step 2: Match Against Existing Pages
73
- - Check `INDEX.base` or scan `entities/`, `concepts/` for existing pages
73
+ - Check `INDEX.base` (Bases index in Obsidian) or scan `entities/`, `concepts/` for existing pages; use `obsidian properties` by `type` for a fast listing
74
74
  - Determine: create new vs. update existing
75
75
  - Read `SCHEMA.md` (Obsidian CLI) for current tag and domain taxonomy so new pages prefer existing tags when they fit
76
76
 
@@ -98,7 +98,7 @@ After Step 3–4, reconcile agent pages touched this cycle with `SCHEMA.md`:
98
98
  - Stay consistent with SCHEMA rules: singular tags, 2–5 tags per page on agent pages, new tags documented here before (or as soon as) use.
99
99
 
100
100
  ### Step 6: Update Navigation
101
- - `INDEX.base` auto-updates via Obsidian Base query
101
+ - `INDEX.base` stays current in Obsidian via its Base query — suggest **`/wiki`** if views, filters, or columns need tuning after large cooks
102
102
  - Append entry to `log.md`
103
103
 
104
104
  ### Step 7: Report
@@ -84,7 +84,7 @@ Verify vault configuration:
84
84
  - `.opencode/` directory has current skill definitions
85
85
  - `SCHEMA.md` exists and has a defined tag taxonomy
86
86
  - `log.md` exists and has recent entries
87
- - `INDEX.base` exists for compiled knowledge discovery
87
+ - `INDEX.base` exists as the Bases wiki index (run `/wiki` to verify or improve it)
88
88
 
89
89
  ### Step 6: Present Diagnosis
90
90
 
@@ -2,7 +2,7 @@
2
2
  name: ideas
3
3
  description: >
4
4
  Deep vault scan to generate actionable ideas by combining insights across domains, finding gaps,
5
- and proposing concrete next steps. Uses INDEX.base and agent directories (`entities/`, `concepts/`,
5
+ and proposing concrete next steps. Uses INDEX.base (Bases wiki index) and agent directories (`entities/`, `concepts/`,
6
6
  `comparisons/`, `queries/`) for compiled knowledge. Use when the user asks "give me ideas", "what should I work
7
7
  on", "what opportunities do you see", "brainstorm from my notes", or wants creative suggestions
8
8
  grounded in their vault content.
@@ -48,7 +48,7 @@ Read notes across domains, prioritizing:
48
48
  - Recent notes (last 30 days) — what the user is actively thinking about
49
49
  - Highly connected notes (many backlinks) — central concepts
50
50
  - Notes with `status: active` — current work
51
- - `INDEX.base` if it existsfor knowledge structure overview
51
+ - `INDEX.base` and `obsidian properties` / `search` same compiled knowledge scope as **`/ask`**
52
52
  - Agent pages in `entities/`, `concepts/`, `comparisons/`, `queries/` — for compiled knowledge
53
53
 
54
54
  For each domain, read 5-10 representative notes to understand the landscape.
@@ -45,7 +45,7 @@ obsidian read file="comparisons/<topic>.md"
45
45
  obsidian read file="queries/<topic>.md"
46
46
  ```
47
47
 
48
- Read `INDEX.base` to check if there's already a compiled page for this topic.
48
+ Read `INDEX.base` if it exists, then use `obsidian properties` by `type` and `obsidian search` to find compiled pages (see **`/ask`**).
49
49
 
50
50
  ### Step 2: Build Timeline
51
51
 
@@ -1,11 +1,12 @@
1
1
  ---
2
2
  name: wiki
3
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 says "update the index",
7
- "refresh the knowledge map", "show me the wiki", "what's in the knowledge base",
8
- "rebuild INDEX.base", or wants to see the current state of compiled knowledge.
4
+ Generate and maintain INDEX.base — the Obsidian Bases wiki index for v2 agent pages
5
+ (type: entity, concept, comparison, query). Uses Obsidian CLI to inventory pages and
6
+ SCHEMA.md for taxonomy; agents retrieve via the same property/search graph the Base
7
+ evaluates in the UI. Use when the user says "update the index", "refresh the knowledge map",
8
+ "show me the wiki", "what's in the knowledge base", "rebuild INDEX.base", or wants the
9
+ current compiled knowledge overview.
9
10
  ---
10
11
 
11
12
  # /wiki — Knowledge Map
@@ -14,7 +15,13 @@ description: >
14
15
 
15
16
  ## Purpose
16
17
 
17
- 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.
18
+ **`INDEX.base` is the vault wiki index.** In Obsidian, Bases runs a live query and renders each matching note as a row with rich metadata (frontmatter fields, paths, backlinks, dates — whatever columns you configure). That dynamic association model **is** the index; do not duplicate it with a separate static markdown catalog.
19
+
20
+ **Preferred vs fallback:** **Bases + `INDEX.base`** is the preferred index. A **markdown outline in chat** (below) is only a **fallback** when the user has no Bases / no `INDEX.base` (e.g. core plugin off, or vault not yet opened in Obsidian) — it is not a second on-disk index file.
21
+
22
+ For **CLI and AI**, there is no separate index file to maintain beyond `INDEX.base`: use **`obsidian properties`**, **`obsidian search`**, **`obsidian tags`**, and **`obsidian backlinks`** to traverse the same knowledge the Base surfaces. Run `obsidian help` for the latest commands.
23
+
24
+ `SCHEMA.md` defines tag taxonomy when summarizing or grouping entries.
18
25
 
19
26
  ## Process
20
27
 
@@ -34,9 +41,19 @@ obsidian read file="SCHEMA.md"
34
41
 
35
42
  Understand the current tag taxonomy, domain definitions, and page conventions.
36
43
 
37
- ### Step 3: Generate INDEX.base Content
44
+ ### Step 3: Index source (Bases first, markdown outline as fallback)
45
+
46
+ #### Step 3a — Bases / `INDEX.base` (preferred)
47
+
48
+ 1. If the vault has no **`INDEX.base`** at the root, install the template: copy **`INDEX.base.example`** from the BYOAO package to **`INDEX.base`** (same directory as `AGENTS.md`). **`byoao init`** / **`byoao upgrade`** already perform this copy when the file is missing — only copy manually if the user skipped init or removed the file.
49
+ - **Repo path:** `byoao/src/assets/presets/common/INDEX.base.example`
50
+ - **After `npm install`:** `node_modules/@jayjiang/byoao/src/assets/presets/common/INDEX.base.example`
51
+ - **Shell (from vault root, adjust source path):** `cp /path/to/INDEX.base.example ./INDEX.base`
52
+ 2. Ask the user to open **`INDEX.base`** in Obsidian (Bases core plugin on). If YAML errors appear, fix quoting or formulas per the bundled **obsidian-bases** skill.
53
+
54
+ #### Step 3b — CLI inventory (always useful; also fallback summary)
38
55
 
39
- Query all agent-maintained pages by v2 frontmatter `type` (`entity`, `concept`, `comparison`, `query`) so each page is listed under the correct section:
56
+ Run:
40
57
 
41
58
  ```bash
42
59
  obsidian properties type=entity
@@ -46,73 +63,49 @@ obsidian properties type=query
46
63
  ```
47
64
 
48
65
  For each type, compile entries with:
66
+
49
67
  - Page name (as wikilink)
50
68
  - Title from frontmatter
51
69
  - Brief summary (from content's first paragraph or definition section)
52
- - Tags and domain
53
-
54
- Format by section:
70
+ - Tags, domain, `updated` — the same dimensions Bases can show as columns
55
71
 
56
- ```markdown
57
- # Knowledge Index
72
+ **If Bases is unavailable:** Present the inventory in your reply as a structured markdown outline (`# Knowledge Index` → `## Entities` → bullet list, etc.). **Do not** save that outline as a permanent `INDEX.md` unless the user explicitly asks. When the user enables Bases later, **`INDEX.base`** remains the canonical index.
58
73
 
59
- ## Entities
60
- - [[feature-a]] — Response time monitoring feature (tags: monitoring, backend)
61
- - [[zhang-san]] — Senior engineer on Feature A team (tags: team, engineering)
74
+ ### Step 4: Ensure `INDEX.base` matches that scope
62
75
 
63
- ## Concepts
64
- - [[response-time-metrics]] — Why median replaced avg for trigger calculation (tags: metrics, decisions)
65
- - [[search-trigger-rules]] — Search trigger rule design principles (tags: search, configuration)
76
+ Verify or refine the Base at vault root. Prefer a **rich Bases layout** (global scope + formulas + multiple views) over four minimal tables with only 2–4 columns.
66
77
 
67
- ## Comparisons
68
- - [[avg-vs-median-for-trigger]] — Side-by-side analysis of avg vs median as trigger metrics (tags: metrics, decisions)
78
+ **Reference template:** **`INDEX.base.example`** under preset `common/` (`byoao/src/assets/presets/common/INDEX.base.example` in the repo; `node_modules/@jayjiang/byoao/src/assets/presets/common/INDEX.base.example` when installed).
69
79
 
70
- ## Queries
71
- - [[why-did-we-choose-median]] — "Why did we choose median over avg?" — detailed answer (tags: metrics, history)
72
- ```
80
+ **Division of responsibilities — `INDEX.base` vs CLI**
73
81
 
74
- ### Step 4: Check Obsidian Base Configuration
82
+ | Layer | Role |
83
+ |-------|------|
84
+ | **`INDEX.base` (Obsidian)** | Live query, grouping, formulas (staleness, backlink count, labels), column display names — **human** scanning and **definition of scope** (which folders / types count as “compiled wiki”). |
85
+ | **Obsidian CLI** | **Does not** evaluate Base formulas. Agents **read** `INDEX.base` to learn filters/paths, then use **`obsidian properties`** (by `type`, etc.), **`obsidian search`**, **`obsidian tags`**, **`obsidian backlinks`** to list and read notes in the **same** scope. |
75
86
 
76
- INDEX.base relies on Obsidian Base (saved search) configuration. Verify:
87
+ 1. **Global scope (recommended)** Top-level **`filters`** with `or:` so every view inherits the same universe, e.g. `file.inFolder("entities")`, … `file.inFolder("queries")`. Avoid relying only on per-view `type == "entity"` without folder scope. Search-style alternative: `path:entities/ OR …` if your Bases version supports it.
77
88
 
78
- 1. The Base query covers all four agent directories
79
- 2. The query filters by `type` frontmatter field
80
- 3. Results are grouped by type
89
+ 2. **Formulas (optional but valuable)** e.g. `type_label`, `days_since_update` from frontmatter `updated`, `backlink_count` from `file.backlinks.length` (confirm syntax for your Obsidian version).
81
90
 
82
- If the Base doesn't exist or is misconfigured, guide the user to set it up:
83
- - Open Obsidian → Bases → Create new base
84
- - Name it "Knowledge Index"
85
- - Query: `path:entities/ OR path:concepts/ OR path:comparisons/ OR path:queries/`
86
- - Group by: `type`
91
+ 3. **`properties` + `displayName`** Include **`file.name`** (e.g. displayName `"Name"`) plus `title`, `domain`, `tags`, `updated`, `status`, and `formula.*` fields.
87
92
 
88
- ### Step 5: Present the Index
93
+ 4. **Views (suggested six)** — All Pages (`groupBy: type`); Entities / Concepts (`type` filter + `groupBy: domain`); Comparisons; Queries; **Recently Updated** — use **`limit`** and put **`updated` first in `order`**; **do not** `groupBy` raw `updated` (timestamps are too granular). Optional **`summaries`** (e.g. average of `formula.backlink_count` on wide tables).
89
94
 
90
- Show the current INDEX.base content to the user:
95
+ 5. **YAML** Keep formula strings consistently quoted; see comments at the top of **`INDEX.base.example`**.
91
96
 
92
- ```markdown
93
- # Knowledge Index
97
+ If the Base doesn't exist or is misconfigured, guide the user to create it in Obsidian or copy **`INDEX.base.example`** as above.
94
98
 
95
- Generated on YYYY-MM-DD
99
+ **Reading via CLI:** `obsidian read file="INDEX.base"` returns the **on-disk definition**; it **defines** the live index Obsidian evaluates — use it to align CLI queries with paths and properties.
96
100
 
97
- Total pages: N (X entities, Y concepts, Z comparisons, W queries)
101
+ ### Step 5: Present the index to the user
98
102
 
99
- ## By Domain
100
- - backend: N pages
101
- - frontend: M pages
102
- - infrastructure: K pages
103
+ Show a markdown summary in your reply (totals, sections by type, sample lines) — **chat output**; not a substitute for **`INDEX.base`** when Bases is enabled.
103
104
 
104
- ## Most Connected
105
- - [[page-name]] — N inbound links
106
- - [[page-name]] — M inbound links
107
-
108
- ## Recently Updated
109
- - [[page-name]] — updated YYYY-MM-DD
110
- - [[page-name]] — updated YYYY-MM-DD
111
- ```
105
+ ### Step 6: Suggest gaps
112
106
 
113
- ### Step 6: Suggest Gaps
107
+ Based on the inventory, identify knowledge gaps:
114
108
 
115
- Based on the index, identify knowledge gaps:
116
109
  - Entity mentioned in multiple concepts but no entity page exists
117
110
  - Concept referenced in entity pages but no concept page exists
118
111
  - Domains with very few pages (under-represented areas)
@@ -120,8 +113,8 @@ Based on the index, identify knowledge gaps:
120
113
 
121
114
  ## Key Principles
122
115
 
123
- - **INDEX.base is dynamic.** The Obsidian Base query keeps it current no manual regeneration needed on every cook cycle.
116
+ - **One index on disk:** **`INDEX.base`** when Bases is on; use **`INDEX.base.example`** as the default layout. Chat markdown is fallback only.
124
117
  - **Summary quality.** Each entry's one-line summary should be genuinely informative, not just the page title repeated.
125
- - **Navigation first.** INDEX.base exists to help humans find knowledge quickly. Structure it for scanning, not completeness.
118
+ - **Navigation first.** Structure the Base and your summary for scanning, not exhaustive prose.
126
119
  - **Obsidian is first workbench.** All note operations go through Obsidian CLI.
127
- - **Agent pages only.** INDEX.base covers only `entities/`, `concepts/`, `comparisons/`, `queries/` — not user notes.
120
+ - **Agent pages only** in this index: `entities/`, `concepts/`, `comparisons/`, `queries/` — not arbitrary user notes.