@jayjiang/byoao 0.5.0 → 0.7.0

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 (53) hide show
  1. package/dist/__tests__/plugin-config.test.js +11 -8
  2. package/dist/__tests__/plugin-config.test.js.map +1 -1
  3. package/dist/cli/cli-program.js +136 -158
  4. package/dist/cli/cli-program.js.map +1 -1
  5. package/dist/cli/installer.js +4 -11
  6. package/dist/cli/installer.js.map +1 -1
  7. package/dist/hooks/idle-suggestions.js +6 -3
  8. package/dist/hooks/idle-suggestions.js.map +1 -1
  9. package/dist/hooks/system-transform.js +37 -14
  10. package/dist/hooks/system-transform.js.map +1 -1
  11. package/dist/index.js +2 -2
  12. package/dist/plugin-config.js +5 -2
  13. package/dist/plugin-config.js.map +1 -1
  14. package/dist/tools/add-glossary-term.js +2 -0
  15. package/dist/tools/add-glossary-term.js.map +1 -1
  16. package/dist/tools/add-person.js +21 -0
  17. package/dist/tools/add-person.js.map +1 -0
  18. package/dist/tools/init-vault.js +11 -9
  19. package/dist/tools/init-vault.js.map +1 -1
  20. package/dist/vault/__tests__/create.test.js +96 -42
  21. package/dist/vault/__tests__/create.test.js.map +1 -1
  22. package/dist/vault/__tests__/glossary.test.js +25 -14
  23. package/dist/vault/__tests__/glossary.test.js.map +1 -1
  24. package/dist/vault/__tests__/member.test.js +2 -4
  25. package/dist/vault/__tests__/member.test.js.map +1 -1
  26. package/dist/vault/create.js +205 -157
  27. package/dist/vault/create.js.map +1 -1
  28. package/dist/vault/doctor.js +1 -1
  29. package/dist/vault/doctor.js.map +1 -1
  30. package/dist/vault/glossary.js +8 -14
  31. package/dist/vault/glossary.js.map +1 -1
  32. package/dist/vault/member.js +1 -1
  33. package/dist/vault/member.js.map +1 -1
  34. package/dist/vault/project.js +1 -1
  35. package/dist/vault/project.js.map +1 -1
  36. package/dist/vault/vault-detect.js +30 -0
  37. package/dist/vault/vault-detect.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/assets/presets/common/AGENT.md.hbs +34 -67
  40. package/src/assets/presets/common/Glossary.md.hbs +7 -35
  41. package/src/assets/presets/common/Start Here.md.hbs +40 -60
  42. package/src/assets/presets/minimal/preset.json +28 -0
  43. package/src/skills/connect.md +202 -0
  44. package/src/skills/{vault-doctor.md → diagnose.md} +12 -12
  45. package/src/skills/emerge.md +155 -0
  46. package/src/skills/{system-explainer.md → explain.md} +8 -8
  47. package/src/skills/trace.md +141 -0
  48. package/src/skills/weave.md +240 -0
  49. package/src/assets/web-clipper/confluence-page.json +0 -63
  50. package/src/assets/web-clipper/general-article.json +0 -53
  51. package/src/assets/web-clipper/jira-issue.json +0 -68
  52. package/src/assets/web-clipper/meeting-notes.json +0 -53
  53. package/src/skills/enrich-document.md +0 -52
@@ -0,0 +1,240 @@
1
+ ---
2
+ name: weave
3
+ description: Scan vault notes, enrich with frontmatter + wikilinks, maintain the Glossary, create hub notes — building a connected knowledge graph.
4
+ ---
5
+
6
+ # /weave — Connect Your Notes
7
+
8
+ You are a knowledge graph builder. Your job is to scan vault notes, enrich them with frontmatter and wikilinks, maintain the Glossary as an entity dictionary, and create hub notes for frequently referenced topics — turning scattered files into an interconnected knowledge graph.
9
+
10
+ ## Prerequisites Check
11
+
12
+ **Before doing anything else**, verify 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. Please ensure:
22
+ 1. Obsidian is running
23
+ 2. This vault is open in Obsidian
24
+ 3. CLI is enabled: Settings → General → Advanced → Command-line interface
25
+ ```
26
+
27
+ Do NOT proceed with degraded results — graph queries are essential.
28
+
29
+ ## Parameters
30
+
31
+ - **file** (optional): Path to a single file to weave. If omitted, scan the entire vault.
32
+ - **folder** (optional): Path to a folder to scan. If omitted, scan the entire vault.
33
+ - **dry-run** (optional): If set, show proposed changes without applying them.
34
+
35
+ ## File Exclusion Rules
36
+
37
+ When scanning files, skip:
38
+
39
+ | Pattern | Reason |
40
+ |---------|--------|
41
+ | `.obsidian/` | Obsidian internal config |
42
+ | `.git/` | Git internals |
43
+ | `.byoao/` | BYOAO internal data |
44
+ | `node_modules/` | Dependencies |
45
+ | `.env`, `credentials.*`, `*.key` | Sensitive files |
46
+ | Binary files (images, PDFs, etc.) | Cannot add frontmatter/wikilinks |
47
+ | `AGENT.md` | BYOAO-managed file |
48
+ | `Knowledge/templates/` | Template files — not user content |
49
+
50
+ Also respect `.byoaoignore` if present (same format as `.gitignore`).
51
+
52
+ Report skipped non-markdown files at the end: "Skipped N non-markdown files".
53
+
54
+ ## Process
55
+
56
+ Execute these steps in order. Be explicit about each tool call — different LLM providers must execute this consistently.
57
+
58
+ ### Step 1: Load Glossary
59
+
60
+ ```bash
61
+ obsidian read "Knowledge/Glossary.md"
62
+ ```
63
+
64
+ Parse the Glossary table. Extract all existing terms — these are automatic wikilink candidates for every file you scan.
65
+
66
+ ### Step 2: Build Vault Map
67
+
68
+ ```bash
69
+ obsidian list
70
+ ```
71
+
72
+ This gives you the full list of notes. Also run:
73
+
74
+ ```bash
75
+ obsidian properties sort=count counts
76
+ ```
77
+
78
+ This reveals the vault's structure — which properties are used, how many notes have frontmatter.
79
+
80
+ ### Step 3: Scan Target Files
81
+
82
+ For each markdown file in scope (respecting exclusion rules):
83
+
84
+ #### 3a. Read the file
85
+
86
+ ```bash
87
+ obsidian read "<note name>"
88
+ ```
89
+
90
+ #### 3b. Identify entities
91
+
92
+ Scan the content for:
93
+ - **People names** — proper nouns that appear to be people
94
+ - **Project/product names** — capitalized multi-word phrases that recur
95
+ - **Domain concepts** — technical terms, acronyms, recurring themes
96
+ - **Tool/system names** — software, services, platforms mentioned
97
+ - **Dates and events** — meetings, deadlines, milestones
98
+
99
+ #### 3c. Cross-reference against Glossary + existing notes
100
+
101
+ For each entity found:
102
+ 1. Is it already a Glossary term? → Mark as wikilink candidate
103
+ 2. Does a vault note with this name exist? → Mark as wikilink candidate
104
+ 3. Is it a new, unrecognized entity? → Track for Glossary suggestion (Step 5)
105
+
106
+ #### 3d. Propose frontmatter
107
+
108
+ If the file has no frontmatter, or has incomplete frontmatter, propose additions:
109
+
110
+ ```yaml
111
+ ---
112
+ title: "<inferred from content or filename>"
113
+ type: "<inferred: meeting, idea, reference, daily, project, person, etc>"
114
+ date: <if identifiable from content>
115
+ domain: "<knowledge area: analytics, infrastructure, design, etc>"
116
+ references:
117
+ - "[[Related Note]]"
118
+ - "[[Glossary]]"
119
+ tags: [<relevant tags>]
120
+ status: <draft | active | completed | archived>
121
+ ---
122
+ ```
123
+
124
+ **Frontmatter preservation rules:**
125
+ - **Never overwrite** existing fields
126
+ - **Only add** missing fields
127
+ - **Merge arrays** — if file has `tags: [meeting]` and you suggest `tags: [meeting, migration]`, result is `[meeting, migration]`
128
+ - **Warn on conflicts** — if existing value seems wrong, note it but don't change it
129
+
130
+ #### 3e. Propose wikilinks
131
+
132
+ Convert plain text mentions to `[[wikilinks]]`:
133
+ - Glossary terms → `[[Term]]`
134
+ - Existing note names → `[[Note Name]]`
135
+ - People → `[[Person Name]]`
136
+
137
+ Rules:
138
+ - Only link the **first occurrence** of each term in a file
139
+ - Don't link inside code blocks, frontmatter, or existing wikilinks
140
+ - Don't link common English words even if they happen to match a note name
141
+ - Preserve the original text when the casing differs: `rate limiting` → `[[Rate Limiting|rate limiting]]`
142
+
143
+ ### Step 4: Backup Before Modification
144
+
145
+ Before modifying any file, create a backup:
146
+
147
+ ```bash
148
+ mkdir -p .byoao/backups/<timestamp>
149
+ cp "<file path>" ".byoao/backups/<timestamp>/<filename>"
150
+ ```
151
+
152
+ Use the current date-time as the timestamp (e.g., `2026-03-27T20-45`).
153
+
154
+ This is critical for existing folder adoption (Mode B) where files are user-created and irreplaceable.
155
+
156
+ ### Step 5: Apply Changes
157
+
158
+ For each file with proposed changes:
159
+ 1. Show the user a summary of proposed changes (frontmatter additions, wikilinks to add)
160
+ 2. Wait for confirmation before applying
161
+ 3. Apply changes using file edit tools
162
+
163
+ ### Step 6: Glossary Maintenance
164
+
165
+ After scanning all files, analyze entity frequency:
166
+
167
+ **New term suggestions:**
168
+ - An entity appears in 3+ files but is not in the Glossary
169
+ - Present each suggestion: "'Kafka' mentioned in 8 notes. Add to Glossary? (Y/n)"
170
+ - For confirmed terms, use `byoao_add_glossary_term` to add them
171
+
172
+ **Auto-graduation suggestions:**
173
+ - A Glossary term is referenced by 5+ notes
174
+ - Suggest creating a standalone concept note in `Knowledge/`
175
+ - The concept note gets auto-generated frontmatter:
176
+ ```yaml
177
+ domain: <from Glossary>
178
+ references:
179
+ - "[[note1]]"
180
+ - "[[note2]]"
181
+ ```
182
+ - Update the Glossary entry to link to the concept note
183
+
184
+ ### Step 7: Hub Note Creation
185
+
186
+ Identify entities that are frequently mentioned but have no corresponding note:
187
+ - "12 files mention 'Payment Migration' but no note exists — create it?"
188
+ - Hub notes aggregate references and provide a landing page for the topic
189
+ - Hub note template:
190
+
191
+ ```markdown
192
+ ---
193
+ title: "<Topic>"
194
+ type: reference
195
+ domain: "<inferred domain>"
196
+ references:
197
+ - "[[note1]]"
198
+ - "[[note2]]"
199
+ tags: [hub]
200
+ status: active
201
+ ---
202
+
203
+ # <Topic>
204
+
205
+ (Auto-created by /weave — this topic is mentioned across multiple notes)
206
+
207
+ ## Referenced In
208
+
209
+ - [[note1]] — <brief context>
210
+ - [[note2]] — <brief context>
211
+ ```
212
+
213
+ ### Step 8: Report
214
+
215
+ After all changes are applied, provide a summary:
216
+
217
+ ```
218
+ Weave complete:
219
+ - Scanned: N files
220
+ - Enriched: N files (frontmatter + wikilinks)
221
+ - Wikilinks added: N
222
+ - Glossary terms added: N
223
+ - Hub notes created: N
224
+ - Concept notes graduated: N
225
+ - Orphaned files (no links): N
226
+ - Skipped: N non-markdown files
227
+ - Backups: .byoao/backups/<timestamp>/
228
+ ```
229
+
230
+ ## Single File Mode
231
+
232
+ When `file=` is provided, run the same process but only for that one file. Still read the Glossary and check for cross-references, but skip Steps 6-7 (Glossary maintenance and hub note creation are batch operations).
233
+
234
+ ## Important Guidelines
235
+
236
+ - **Be conservative**: When in doubt about a wikilink or frontmatter value, skip it. False positives degrade trust.
237
+ - **Ask, don't assume**: Always present changes for user confirmation before applying.
238
+ - **Preserve user content**: Never delete, rewrite, or reorganize existing text. Only add metadata and convert mentions to links.
239
+ - **Domain inference**: Use Glossary domains and existing note domains to infer the domain for new notes. Consistency matters.
240
+ - **Idempotent**: Running /weave twice on the same file should not add duplicate wikilinks or frontmatter fields.
@@ -1,63 +0,0 @@
1
- {
2
- "schemaVersion": "0.1.0",
3
- "name": "BYOAO — Confluence Page",
4
- "behavior": "create",
5
- "noteContentFormat": "text",
6
- "properties": [
7
- {
8
- "name": "title",
9
- "value": "{{title|safe_name}}",
10
- "type": "text"
11
- },
12
- {
13
- "name": "type",
14
- "value": "confluence-clip",
15
- "type": "text"
16
- },
17
- {
18
- "name": "source",
19
- "value": "{{url}}",
20
- "type": "text"
21
- },
22
- {
23
- "name": "author",
24
- "value": "{{selector:.contributor-list a|wikilink}}",
25
- "type": "text"
26
- },
27
- {
28
- "name": "space",
29
- "value": "{{selector:#breadcrumb-nav a:first-child}}",
30
- "type": "text"
31
- },
32
- {
33
- "name": "labels",
34
- "value": "{{selector:.label-list a}}",
35
- "type": "multitext"
36
- },
37
- {
38
- "name": "last-modified",
39
- "value": "{{selector:.last-modified time}}",
40
- "type": "text"
41
- },
42
- {
43
- "name": "clipped-date",
44
- "value": "{{date}}",
45
- "type": "date"
46
- },
47
- {
48
- "name": "status",
49
- "value": "inbox",
50
- "type": "text"
51
- },
52
- {
53
- "name": "tags",
54
- "value": "[confluence-clip, {{\"Based on this Confluence page content, suggest 3 relevant topic tags as comma-separated values (no # prefix, lowercase, hyphenated). Output ONLY the tags, nothing else.\"|prompt}}]",
55
- "type": "multitext"
56
- }
57
- ],
58
- "noteNameFormat": "{{date}} — {{title|safe_name|truncate:80}}",
59
- "path": "Inbox",
60
- "triggers": ["atlassian.net/wiki", "confluence"],
61
- "context": "{{content}}",
62
- "body": "## Summary\n\n{{\"Summarize the key points of this Confluence page in 3-5 bullet points. Focus on decisions, action items, and important context. Be concise.\"|prompt}}\n\n---\n\n## Original Content\n\n{{content}}"
63
- }
@@ -1,53 +0,0 @@
1
- {
2
- "schemaVersion": "0.1.0",
3
- "name": "BYOAO — General Article",
4
- "behavior": "create",
5
- "noteContentFormat": "text",
6
- "properties": [
7
- {
8
- "name": "title",
9
- "value": "{{title|safe_name}}",
10
- "type": "text"
11
- },
12
- {
13
- "name": "type",
14
- "value": "web-clip",
15
- "type": "text"
16
- },
17
- {
18
- "name": "source",
19
- "value": "{{url}}",
20
- "type": "text"
21
- },
22
- {
23
- "name": "author",
24
- "value": "{% if author %}{{author|wikilink}}{% elseif meta:property:article:author %}{{meta:property:article:author|wikilink}}{% else %}unknown{% endif %}",
25
- "type": "text"
26
- },
27
- {
28
- "name": "published",
29
- "value": "{% if meta:property:article:published_time %}{{meta:property:article:published_time|date:'YYYY-MM-DD'}}{% else %}{{date}}{% endif %}",
30
- "type": "date"
31
- },
32
- {
33
- "name": "clipped-date",
34
- "value": "{{date}}",
35
- "type": "date"
36
- },
37
- {
38
- "name": "status",
39
- "value": "inbox",
40
- "type": "text"
41
- },
42
- {
43
- "name": "tags",
44
- "value": "[web-clip, {{\"Based on this article, suggest 3 relevant topic tags as comma-separated values (no # prefix, lowercase, hyphenated). Output ONLY the tags, nothing else.\"|prompt}}]",
45
- "type": "multitext"
46
- }
47
- ],
48
- "noteNameFormat": "{{date}} — {{title|safe_name|truncate:80}}",
49
- "path": "Inbox",
50
- "triggers": [],
51
- "context": "{{content|truncate:3000}}",
52
- "body": "## Summary\n\n{{\"Summarize this article in 3-5 bullet points. Focus on key insights, conclusions, and actionable takeaways. Be concise.\"|prompt}}\n\n## Key Quotes\n\n{% if highlights %}{% for highlight in highlights %}\n> {{highlight}}\n{% endfor %}{% else %}\n*No highlights selected. Use the Web Clipper highlighter to capture key passages.*\n{% endif %}\n\n---\n\n## Original Content\n\n{{content}}\n\n---\n\n*Clipped from [{{domain}}]({{url}}) on {{date}}*"
53
- }
@@ -1,68 +0,0 @@
1
- {
2
- "schemaVersion": "0.1.0",
3
- "name": "BYOAO — Jira Issue",
4
- "behavior": "create",
5
- "noteContentFormat": "text",
6
- "properties": [
7
- {
8
- "name": "title",
9
- "value": "{{selector:#summary-val|default:title}}",
10
- "type": "text"
11
- },
12
- {
13
- "name": "type",
14
- "value": "jira-clip",
15
- "type": "text"
16
- },
17
- {
18
- "name": "jira-key",
19
- "value": "{{selector:#key-val}}",
20
- "type": "text"
21
- },
22
- {
23
- "name": "source",
24
- "value": "{{url}}",
25
- "type": "text"
26
- },
27
- {
28
- "name": "status",
29
- "value": "{{selector:#status-val span}}",
30
- "type": "text"
31
- },
32
- {
33
- "name": "priority",
34
- "value": "{{selector:#priority-val img|attr:alt}}",
35
- "type": "text"
36
- },
37
- {
38
- "name": "assignee",
39
- "value": "{{selector:#assignee-val span|wikilink}}",
40
- "type": "text"
41
- },
42
- {
43
- "name": "reporter",
44
- "value": "{{selector:#reporter-val span|wikilink}}",
45
- "type": "text"
46
- },
47
- {
48
- "name": "issue-type",
49
- "value": "{{selector:#type-val}}",
50
- "type": "text"
51
- },
52
- {
53
- "name": "clipped-date",
54
- "value": "{{date}}",
55
- "type": "date"
56
- },
57
- {
58
- "name": "tags",
59
- "value": "[jira-clip]",
60
- "type": "multitext"
61
- }
62
- ],
63
- "noteNameFormat": "{{selector:#key-val|default:title|safe_name}} — {{selector:#summary-val|default:title|safe_name|truncate:60}}",
64
- "path": "Inbox",
65
- "triggers": ["atlassian.net/browse", "atlassian.net/jira"],
66
- "context": "{{content}}",
67
- "body": "## Summary\n\n**Status**: {{selector:#status-val span}} | **Priority**: {{selector:#priority-val img|attr:alt}} | **Assignee**: {{selector:#assignee-val span}}\n\n## Description\n\n{{selector:#description-val|markdown}}\n\n{% if selector:.acceptance-criteria %}## Acceptance Criteria\n\n{{selector:.acceptance-criteria|markdown}}\n{% endif %}\n\n---\n\n*Clipped from [Jira]({{url}}) on {{date}}*"
68
- }
@@ -1,53 +0,0 @@
1
- {
2
- "schemaVersion": "0.1.0",
3
- "name": "BYOAO — Meeting Notes",
4
- "behavior": "create",
5
- "noteContentFormat": "text",
6
- "properties": [
7
- {
8
- "name": "title",
9
- "value": "{{title|safe_name}}",
10
- "type": "text"
11
- },
12
- {
13
- "name": "type",
14
- "value": "meeting-notes",
15
- "type": "text"
16
- },
17
- {
18
- "name": "source",
19
- "value": "{{url}}",
20
- "type": "text"
21
- },
22
- {
23
- "name": "date",
24
- "value": "{{date}}",
25
- "type": "date"
26
- },
27
- {
28
- "name": "participants",
29
- "value": "",
30
- "type": "multitext"
31
- },
32
- {
33
- "name": "project",
34
- "value": "",
35
- "type": "text"
36
- },
37
- {
38
- "name": "status",
39
- "value": "inbox",
40
- "type": "text"
41
- },
42
- {
43
- "name": "tags",
44
- "value": "[meeting-notes]",
45
- "type": "multitext"
46
- }
47
- ],
48
- "noteNameFormat": "{{date}} — Meeting — {{title|safe_name|truncate:60}}",
49
- "path": "Inbox",
50
- "triggers": ["meet.google.com", "calendar.google.com", "outlook.office.com"],
51
- "context": "{% if selection %}{{selection}}{% else %}{{content|truncate:3000}}{% endif %}",
52
- "body": "## Meeting Info\n\n- **Date**: {{date}}\n- **Participants**: *fill in after meeting*\n- **Project**: *link to project*\n\n## Agenda / Context\n\n{% if selection %}{{selection|markdown}}{% else %}{{content|markdown}}{% endif %}\n\n## Notes\n\n- \n\n## Action Items\n\n- [ ] \n\n## Decisions\n\n- \n\n---\n\n*Clipped from [{{domain}}]({{url}}) on {{date}}*"
53
- }
@@ -1,52 +0,0 @@
1
- ---
2
- name: enrich-document
3
- description: Auto-enrich an Obsidian note with frontmatter properties and wikilinks. Reads existing vault context to suggest connections.
4
- ---
5
-
6
- # Enrich Document
7
-
8
- You are a document enrichment assistant. Your job is to improve Obsidian notes by adding proper frontmatter and wikilinks based on the vault's existing content.
9
-
10
- ## Process
11
-
12
- 1. **Read the target note** that needs enrichment.
13
-
14
- 2. **Scan the vault** for context:
15
- - Use `byoao_vault_status` to understand what's in the vault
16
- - Read `AGENT.md` for project/people index
17
- - Read `Knowledge/Glossary.md` for domain terms
18
-
19
- 3. **Add/fix frontmatter**:
20
- - Ensure `title`, `type`, `status`, `date`, `tags` are present
21
- - Infer `type` from content: meeting → "meeting", feature spec → "feature", etc.
22
- - Add `team`, `project`, `stakeholders` if identifiable from content
23
-
24
- 4. **Add wikilinks**:
25
- - Link mentions of people names to `[[Person Name]]`
26
- - Link mentions of projects to `[[Project Name]]`
27
- - Link domain terms to `[[Glossary]]` or concept notes
28
- - Link related system references to `Systems/` docs
29
-
30
- 5. **Preserve content**: Never delete or rewrite user content. Only add frontmatter and convert plain text mentions to wikilinks.
31
-
32
- ## Example
33
-
34
- Before:
35
- ```markdown
36
- Met with Alice and Bob about the payment migration. Need to check with the platform team about API rate limits.
37
- ```
38
-
39
- After:
40
- ```markdown
41
- ---
42
- title: "Payment Migration Discussion"
43
- type: meeting
44
- date: 2026-03-12
45
- team: HDR Operations
46
- project: Payment Migration
47
- stakeholders: [Alice, Bob]
48
- tags: [meeting, payment, migration]
49
- ---
50
-
51
- Met with [[Alice]] and [[Bob]] about the [[Payment Migration]]. Need to check with the [[Platform Team]] about API rate limits.
52
- ```