roam-research-mcp 1.0.0 → 1.3.2
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/README.md +84 -17
- package/build/Roam_Markdown_Cheatsheet.md +519 -175
- package/build/cache/page-uid-cache.js +55 -0
- package/build/cli/import-markdown.js +98 -0
- package/build/config/environment.js +4 -2
- package/build/markdown-utils.js +51 -5
- package/build/server/roam-server.js +69 -10
- package/build/shared/errors.js +84 -0
- package/build/shared/index.js +5 -0
- package/build/shared/validation.js +268 -0
- package/build/tools/operations/batch.js +165 -3
- package/build/tools/operations/memory.js +29 -19
- package/build/tools/operations/outline.js +110 -70
- package/build/tools/operations/pages.js +159 -60
- package/build/tools/operations/table.js +142 -0
- package/build/tools/schemas.js +87 -9
- package/build/tools/tool-handlers.js +8 -2
- package/package.json +4 -3
|
@@ -1,182 +1,526 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
1
|
+
# Roam Markdown Cheatsheet — Generic Foundation v2.0.0
|
|
2
|
+
|
|
3
|
+
> ⚠️ **MODEL DIRECTIVE**: Always consult this cheatsheet BEFORE making any Roam tool calls. Syntax errors in Roam are unforgiving.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Quick Reference: Core Syntax
|
|
8
|
+
|
|
9
|
+
### Text Formatting
|
|
10
|
+
| Style | Syntax | Example |
|
|
11
|
+
|-------|--------|---------|
|
|
12
|
+
| Bold | `**text**` | **bold text** |
|
|
13
|
+
| Italic | `__text__` | __italic text__ |
|
|
14
|
+
| Highlight | `^^text^^` | ^^highlighted^^ |
|
|
15
|
+
| Strikethrough | `~~text~~` | ~~struck~~ |
|
|
16
|
+
| Inline code | `` `code` `` | `code` |
|
|
17
|
+
| LaTeX | `$$E=mc^2$$` | rendered math |
|
|
18
|
+
|
|
19
|
+
### Links & References
|
|
20
|
+
| Type | Syntax | Notes |
|
|
21
|
+
|------|--------|-------|
|
|
22
|
+
| Page reference | `[[Page Name]]` | Creates/links to page |
|
|
23
|
+
| Block reference | `((block-uid))` | Embeds block content inline |
|
|
24
|
+
| Block embed | `{{[[embed]]: ((block-uid))}}` | Full block embed with children |
|
|
25
|
+
| External link | `[text](URL)` | Standard markdown |
|
|
26
|
+
| Aliased page ref | `[display text]([[Actual Page]])` | Shows custom text, links to page |
|
|
27
|
+
| Aliased block ref | `[display text](<((block-uid))>)` | Links to specific block |
|
|
28
|
+
| Image embed | `` | Inline image |
|
|
29
|
+
|
|
30
|
+
### Tags & Hashtags
|
|
31
|
+
| Type | Syntax | When to Use |
|
|
32
|
+
|------|--------|-------------|
|
|
33
|
+
| Single word | `#tag` | Simple categorization |
|
|
34
|
+
| Multi-word | `#[[multiple words]]` | Phrases, compound concepts |
|
|
35
|
+
| Hyphenated | `#self-esteem` | Naturally hyphenated terms |
|
|
36
|
+
|
|
37
|
+
⚠️ **CRITICAL**: Never concatenate multi-word tags. `#knowledgemanagement` ≠ `#[[knowledge management]]`
|
|
38
|
+
|
|
39
|
+
### Dates
|
|
40
|
+
- **Always use ordinal format**: `[[January 1st, 2025]]`, `[[December 23rd, 2024]]`
|
|
41
|
+
- Ordinals: 1st, 2nd, 3rd, 4th–20th, 21st, 22nd, 23rd, 24th–30th, 31st
|
|
42
|
+
|
|
43
|
+
### Task Management
|
|
44
|
+
| Status | Syntax |
|
|
45
|
+
|--------|--------|
|
|
46
|
+
| Todo | `{{[[TODO]]}} task description` |
|
|
47
|
+
| Done | `{{[[DONE]]}} task description` |
|
|
48
|
+
|
|
49
|
+
### Attributes (Properties)
|
|
50
|
+
```
|
|
51
|
+
Type:: Book
|
|
52
|
+
Author:: [[Person Name]]
|
|
53
|
+
Rating:: 4/5
|
|
54
|
+
Source:: https://example.com
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Purpose**: Attributes create structured metadata that is **queryable across your entire graph**. The attribute name becomes a page reference, so only use `::` when the attribute is a reusable property that applies to multiple pages or concepts.
|
|
58
|
+
|
|
59
|
+
**When to USE attributes:**
|
|
60
|
+
| Attribute | Why It's Good |
|
|
61
|
+
|-----------|---------------|
|
|
62
|
+
| `Type:: Book` | Reusable across all media you consume |
|
|
63
|
+
| `Author:: [[Person]]` | Links to author page, queryable |
|
|
64
|
+
| `Status:: In Progress` | Standard project states, queryable |
|
|
65
|
+
| `Source:: URL` | Consistent sourcing across notes |
|
|
66
|
+
| `Date:: [[January 1st, 2025]]` | Enables date-based queries |
|
|
67
|
+
|
|
68
|
+
**When NOT to use attributes:**
|
|
69
|
+
| ❌ Wrong | ✅ Use Instead | Why |
|
|
70
|
+
|----------|----------------|-----|
|
|
71
|
+
| `Step 1:: Do this thing` | `**Step 1:** Do this thing` | Step numbers are page-specific, not queryable concepts |
|
|
72
|
+
| `Note:: Some observation` | Just write the text, or use `#note` | One-off labels don't need attribute syntax |
|
|
73
|
+
| `Summary:: The main point` | `**Summary:** The main point` | Section headers are formatting, not metadata |
|
|
74
|
+
| `Definition:: Some text` | `**Term**:: Definition` | Only use for actual definitions you want to query |
|
|
75
|
+
|
|
76
|
+
⚠️ **The Test**: Ask yourself: "Will I ever query for all blocks with this attribute across my graph?" If no, use **bold formatting** (`**Label:**`) instead of `::` syntax.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Block Structures
|
|
81
|
+
|
|
82
|
+
### Bullet Points
|
|
83
|
+
- Use `-` (dash) followed by space
|
|
84
|
+
- Nested bullets: indent with tab or spaces
|
|
85
|
+
```
|
|
86
|
+
- Parent item
|
|
87
|
+
- Child item
|
|
88
|
+
- Grandchild item
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Code Blocks
|
|
92
|
+
````
|
|
93
|
+
```javascript
|
|
94
|
+
const example = () => {
|
|
95
|
+
return "syntax highlighted";
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
````
|
|
99
|
+
|
|
100
|
+
### Queries
|
|
101
|
+
```
|
|
102
|
+
{{[[query]]: {and: [[tag1]] [[tag2]]}}}
|
|
103
|
+
{{[[query]]: {or: [[optionA]] [[optionB]]}}}
|
|
104
|
+
{{[[query]]: {not: [[exclude-this]]}}}
|
|
105
|
+
{{[[query]]: {between: [[January 1st, 2025]] [[January 31st, 2025]]}}}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Calculator
|
|
109
|
+
```
|
|
110
|
+
{{[[calc]]: 2 + 2}}
|
|
111
|
+
{{[[calc]]: 100 * 0.15}}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Complex Structures
|
|
117
|
+
|
|
118
|
+
### Tables
|
|
119
|
+
Tables use nested indentation. Each column header/cell nests ONE LEVEL DEEPER than previous.
|
|
51
120
|
|
|
52
121
|
```
|
|
53
122
|
{{[[table]]}}
|
|
54
123
|
- Header 1
|
|
55
124
|
- Header 2
|
|
56
125
|
- Header 3
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
|
|
126
|
+
- Row 1 Label
|
|
127
|
+
- Cell 1.1
|
|
128
|
+
- Cell 1.2
|
|
129
|
+
- Cell 1.3
|
|
130
|
+
- Row 2 Label
|
|
131
|
+
- Cell 2.1
|
|
132
|
+
- Cell 2.2
|
|
133
|
+
- Cell 2.3
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Rules:**
|
|
137
|
+
- `{{[[table]]}}` is level 1
|
|
138
|
+
- First header/row-label at level 2
|
|
139
|
+
- Each subsequent column nests +1 level deeper
|
|
140
|
+
- Keep tables ≤5 columns for readability
|
|
141
|
+
|
|
142
|
+
### Kanban Boards
|
|
143
|
+
```
|
|
144
|
+
{{[[kanban]]}}
|
|
145
|
+
- Column 1 Title
|
|
146
|
+
- Card 1 content
|
|
147
|
+
- Card 2 content
|
|
148
|
+
- Column 2 Title
|
|
149
|
+
- Card 3 content
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Mermaid Diagrams
|
|
153
|
+
```
|
|
154
|
+
{{[[mermaid]]}}
|
|
86
155
|
- graph TD
|
|
87
|
-
- A[Start] --> B{Decision
|
|
88
|
-
- B -->|Yes| C[
|
|
89
|
-
- B -->|No| D[
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
-
|
|
172
|
-
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
156
|
+
- A[Start] --> B{Decision}
|
|
157
|
+
- B -->|Yes| C[Action]
|
|
158
|
+
- B -->|No| D[Alternative]
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Hiccup (Custom HTML)
|
|
162
|
+
`:hiccup [:iframe {:width "600" :height "400" :src "https://example.com"}]`
|
|
163
|
+
|
|
164
|
+
`:hiccup [:div {:style {:color "red"}} "Custom styled content"]`
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Anti-Patterns — DON'T DO THIS
|
|
169
|
+
|
|
170
|
+
| ❌ Wrong | ✅ Correct | Why |
|
|
171
|
+
|----------|-----------|-----|
|
|
172
|
+
| `Step 1:: Do this` | `**Step 1:** Do this` | `::` creates queryable attributes; use bold for page-specific labels |
|
|
173
|
+
| `#multiplewords` | `#[[multiple words]]` | Concatenated tags create dead references |
|
|
174
|
+
| `[[january 1, 2025]]` | `[[January 1st, 2025]]` | Must use ordinal format with proper capitalization |
|
|
175
|
+
| `[text](((block-uid)))` | `[text](<((block-uid))>)` | Block ref links need angle bracket wrapper |
|
|
176
|
+
| `{{embed: ((uid))}}` | `{{[[embed]]: ((uid))}}` | Embed requires double brackets around keyword |
|
|
177
|
+
| Deeply nested tables (6+ cols) | Max 4-5 columns | Becomes unreadable/unmanageable |
|
|
178
|
+
| `- *bullet` | `- bullet` | Use dash, not asterisk for bullets |
|
|
179
|
+
| `[[TODO]] task` | `{{[[TODO]]}} task` | TODO needs double curly braces |
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Tool Selection Decision Tree
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
CREATING CONTENT IN ROAM:
|
|
187
|
+
|
|
188
|
+
┌─ Is this a NEW standalone page with structure?
|
|
189
|
+
│ └─ YES → roam_create_page (with content array)
|
|
190
|
+
│
|
|
191
|
+
├─ Adding content to EXISTING page/block?
|
|
192
|
+
│ ├─ Simple outline structure → roam_create_outline
|
|
193
|
+
│ │ (provide page_title_uid and/or block_text_uid)
|
|
194
|
+
│ │
|
|
195
|
+
│ └─ Complex/nested markdown → roam_import_markdown
|
|
196
|
+
│ (for deeply nested content, tables, etc.)
|
|
197
|
+
│
|
|
198
|
+
├─ Need to CREATE, UPDATE, MOVE, or DELETE individual blocks?
|
|
199
|
+
│ └─ roam_process_batch_actions
|
|
200
|
+
│ (fine-grained control, temporary UIDs for parent refs)
|
|
201
|
+
│
|
|
202
|
+
├─ Adding a memory/note to remember?
|
|
203
|
+
│ └─ roam_remember (auto-tags with MEMORIES_TAG)
|
|
204
|
+
│
|
|
205
|
+
├─ Adding TODO items to today?
|
|
206
|
+
│ └─ roam_add_todo (creates individual TODO blocks)
|
|
207
|
+
│
|
|
208
|
+
└─ SEARCHING/READING:
|
|
209
|
+
├─ Find by tag → roam_search_for_tag
|
|
210
|
+
├─ Find by text → roam_search_by_text
|
|
211
|
+
├─ Find by date range → roam_search_by_date
|
|
212
|
+
├─ Find by status → roam_search_by_status
|
|
213
|
+
├─ Get page content → roam_fetch_page_by_title
|
|
214
|
+
├─ Get block + children → roam_fetch_block_with_children
|
|
215
|
+
├─ Recall memories → roam_recall
|
|
216
|
+
└─ Complex queries → roam_datomic_query
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## API Efficiency Guidelines (Rate Limit Avoidance)
|
|
222
|
+
|
|
223
|
+
The Roam API has rate limits. Follow these guidelines to minimize API calls:
|
|
224
|
+
|
|
225
|
+
### Tool Efficiency Ranking (Best to Worst)
|
|
226
|
+
1. **`roam_process_batch_actions`** - Single API call for multiple operations (MOST EFFICIENT)
|
|
227
|
+
2. **`roam_create_page`** - Batches content with page creation
|
|
228
|
+
3. **`roam_create_outline` / `roam_import_markdown`** - Include verification queries (use for smaller operations)
|
|
229
|
+
4. **Multiple sequential tool calls** - Each call = multiple API requests (AVOID)
|
|
230
|
+
|
|
231
|
+
### Best Practices for Intensive Operations
|
|
232
|
+
|
|
233
|
+
#### When Updating/Revising a Page:
|
|
234
|
+
1. Fetch the page content ONCE at the start
|
|
235
|
+
2. Plan ALL changes needed (creates, updates, deletes)
|
|
236
|
+
3. Execute ALL changes in a SINGLE `roam_process_batch_actions` call
|
|
237
|
+
4. Do NOT fetch-modify-fetch-modify in a loop
|
|
238
|
+
|
|
239
|
+
#### When Creating Large Content:
|
|
240
|
+
- For 10+ blocks: Use `roam_process_batch_actions` with nested structure
|
|
241
|
+
- For simple outlines (<10 blocks): `roam_create_outline` is fine
|
|
242
|
+
|
|
243
|
+
#### UID Caching:
|
|
244
|
+
- Save UIDs from previous operations - don't re-query for them
|
|
245
|
+
- Use `page_uid` instead of `page_title` when available (avoids lookup query)
|
|
246
|
+
- Use `block_uid` instead of `block_text_uid` when you have it
|
|
247
|
+
|
|
248
|
+
#### UID Placeholders for Nested Blocks:
|
|
249
|
+
When using `roam_process_batch_actions` to create nested blocks, use **placeholder tokens** instead of generating UIDs yourself. The server generates proper random UIDs and returns a mapping.
|
|
250
|
+
|
|
251
|
+
**Syntax:** `{{uid:name}}` where `name` is any identifier you choose.
|
|
252
|
+
|
|
253
|
+
**Example:**
|
|
254
|
+
```json
|
|
255
|
+
[
|
|
256
|
+
{ "action": "create-block", "uid": "{{uid:parent}}", "string": "Parent Block", "location": { "parent-uid": "pageUid123", "order": 0 } },
|
|
257
|
+
{ "action": "create-block", "string": "Child Block", "location": { "parent-uid": "{{uid:parent}}", "order": 0 } }
|
|
258
|
+
]
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Response includes UID mapping:**
|
|
262
|
+
```json
|
|
263
|
+
{
|
|
264
|
+
"success": true,
|
|
265
|
+
"uid_map": {
|
|
266
|
+
"parent": "Xk7mN2pQ9"
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Why placeholders?** LLMs are not reliable random generators. The server uses cryptographically secure randomness to generate proper 9-character Roam UIDs.
|
|
272
|
+
|
|
273
|
+
### Example: Efficient Page Revision
|
|
274
|
+
|
|
275
|
+
**Instead of:**
|
|
276
|
+
```
|
|
277
|
+
1. roam_fetch_page_by_title → get content
|
|
278
|
+
2. roam_create_outline → add section 1
|
|
279
|
+
3. roam_create_outline → add section 2
|
|
280
|
+
4. roam_import_markdown → add more content
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Do this:**
|
|
284
|
+
```
|
|
285
|
+
1. roam_fetch_page_by_title → get page UID and content
|
|
286
|
+
2. roam_process_batch_actions → ALL creates/updates in one call
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Structural Defaults
|
|
292
|
+
|
|
293
|
+
When unsure how to structure output:
|
|
294
|
+
|
|
295
|
+
1. **Hierarchy depth**: Prefer 2-4 levels; rarely exceed 5
|
|
296
|
+
2. **Block length**: Keep blocks atomic — one idea per block
|
|
297
|
+
3. **Page refs vs hashtags**:
|
|
298
|
+
- `[[Page]]` for concepts you'll expand into full pages
|
|
299
|
+
- `#tag` for categorization/filtering
|
|
300
|
+
4. **When to embed vs reference**:
|
|
301
|
+
- `((uid))` — inline reference (shows content)
|
|
302
|
+
- `{{[[embed]]: ((uid))}}` — full block with children
|
|
303
|
+
- `[text](<((uid))>)` — clickable link only
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
## Visual Separation — Hierarchy First, Separators Never
|
|
307
|
+
|
|
308
|
+
Empty blocks and decorative dividers create clutter. Roam's outliner structure provides all the visual separation you need.
|
|
309
|
+
|
|
310
|
+
| ❌ Avoid | ✅ Instead |
|
|
311
|
+
|----------|-----------|
|
|
312
|
+
| Blank blocks | Let hierarchy create space — child blocks are visually indented |
|
|
313
|
+
| `---` dividers | Use a **heading block** to signal section breaks |
|
|
314
|
+
| Decorative lines `───` | Nest content under a parent block as a structural container |
|
|
315
|
+
|
|
316
|
+
**Principle**: If you feel the urge to add visual breathing room, you probably need *better structure*, not more blocks. Promote a block to a heading, or reorganize into parent/child relationships.
|
|
317
|
+
|
|
318
|
+
**The test**: If you'd delete it during cleanup, don't create it.
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Output Format Conventions
|
|
323
|
+
|
|
324
|
+
### Quotes
|
|
325
|
+
```
|
|
326
|
+
<quote text> —[[Author Name]] #quote #[[relevant topic]]
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Definitions
|
|
330
|
+
```
|
|
331
|
+
**Term**:: Definition text #definition #[[domain]]
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Questions for Future
|
|
335
|
+
```
|
|
336
|
+
{{[[TODO]]}} Research: <question> #[[open questions]]
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
*End of Generic Foundation — Personalization section follows during user setup.*
|
|
342
|
+
# Roam Preferences — Personalization Layer
|
|
343
|
+
|
|
344
|
+
> This section contains YOUR specific conventions, tagging philosophy, and graph-specific rules. Customize to match your workflow.
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## Graph-Level Behaviors
|
|
349
|
+
|
|
350
|
+
### On Creating New Pages
|
|
351
|
+
<!-- CUSTOMIZE: What should happen when a new page is created? -->
|
|
352
|
+
- After creating a new page, add a reference block on today's daily page: `Created page: [[New Page Name]]`
|
|
353
|
+
- <!-- Add any naming conventions, required metadata, etc. -->
|
|
354
|
+
|
|
355
|
+
### On Adding Content
|
|
356
|
+
<!-- CUSTOMIZE: Any rules about where/how content gets added? -->
|
|
357
|
+
- Default location for quick captures: Daily page
|
|
358
|
+
- Long-form content: Create dedicated page, link from daily page
|
|
359
|
+
- <!-- Your preferences here -->
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## Tagging Philosophy
|
|
364
|
+
|
|
365
|
+
### Core Principle
|
|
366
|
+
> Tag for **intellectual collision** and **future discovery**, not just categorization. Every tag should maximize potential for unexpected connections.
|
|
367
|
+
|
|
368
|
+
### The Serendipity Test
|
|
369
|
+
Before tagging, ask: *"Could this concept surprise me by connecting to something completely unrelated?"*
|
|
370
|
+
|
|
371
|
+
### What To Tag — Decision Framework
|
|
372
|
+
|
|
373
|
+
```
|
|
374
|
+
ASK YOURSELF:
|
|
375
|
+
┌─ How will Future Me find this?
|
|
376
|
+
│ └─ Tag by retrieval context, not just content
|
|
377
|
+
│
|
|
378
|
+
├─ What domain does this belong to?
|
|
379
|
+
│ └─ Use broad category tags: #[[knowledge management]], #[[decision-making]]
|
|
380
|
+
│
|
|
381
|
+
├─ Is this a proper noun?
|
|
382
|
+
│ └─ YES → Wrap name (no titles): [[Werner Erhard]], [[NASA]]
|
|
383
|
+
│ └─ For abbreviations: [NASA]([[National Aeronautics and Space Administration (NASA)]])
|
|
384
|
+
│
|
|
385
|
+
├─ Could this alias to existing page?
|
|
386
|
+
│ └─ YES → [displayed phrase]([[existing page name]])
|
|
387
|
+
│ └─ Example: [frameworks for decisions]([[decision-making frameworks]])
|
|
388
|
+
│
|
|
389
|
+
└─ Parent block with children?
|
|
390
|
+
└─ Tag parent when category applies to all children
|
|
391
|
+
└─ Tag individual children for specific categorization
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Tag Type Selection
|
|
395
|
+
|
|
396
|
+
| Use This | When |
|
|
397
|
+
|----------|------|
|
|
398
|
+
| `[[Page Reference]]` | Concept deserves its own page, will be expanded |
|
|
399
|
+
| `#[[hashtag]]` | Categorization, filtering, won't be a standalone page |
|
|
400
|
+
| `#single-word` | Simple, unambiguous category |
|
|
401
|
+
| Attribute `Type::` | Structured metadata for queries |
|
|
402
|
+
|
|
403
|
+
### Structural Tagging (Beyond Content)
|
|
404
|
+
|
|
405
|
+
Tag by **patterns and mechanisms**, not just subjects:
|
|
406
|
+
|
|
407
|
+
| Structural Tag | Connects |
|
|
408
|
+
|----------------|----------|
|
|
409
|
+
| `#[[has feedback loops]]` | Systems, habits, markets, conversations |
|
|
410
|
+
| `#[[requires calibration]]` | Instruments, relationships, AI prompts |
|
|
411
|
+
| `#[[exhibits emergence]]` | Complexity, culture, creativity |
|
|
412
|
+
| `#[[perspective switching]]` | Photography, negotiation, analysis |
|
|
413
|
+
| `#[[flow dynamics]]` | Fluids, music, conversation, sequences |
|
|
414
|
+
|
|
415
|
+
### Problem-Oriented Tagging
|
|
416
|
+
|
|
417
|
+
Tag by problems solved, not methods used:
|
|
418
|
+
|
|
419
|
+
- `#[[breaking cognitive constraints]]`
|
|
420
|
+
- `#[[expanding solution spaces]]`
|
|
421
|
+
- `#[[preventing expert blindness]]`
|
|
422
|
+
|
|
423
|
+
### Temporal & State-Based Tags
|
|
424
|
+
|
|
425
|
+
| Tag Type | Examples |
|
|
426
|
+
|----------|----------|
|
|
427
|
+
| Future relevance | `#[[will be relevant in 5 years]]`, `#[[connects to unborn projects]]` |
|
|
428
|
+
| Mental state triggers | `#[[feeling stuck in patterns]]`, `#[[needing fresh perspective]]` |
|
|
429
|
+
| Review scheduling | `[[For review]]: [[August 12th, 2026]]` |
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## Formatting Conventions
|
|
434
|
+
|
|
435
|
+
### Quotes
|
|
436
|
+
```
|
|
437
|
+
<quote text> —[[Author Name]] #quote #[[topic1]] #[[topic2]]
|
|
438
|
+
```
|
|
439
|
+
Always include 2-3 relevant hashtags after quotes.
|
|
440
|
+
|
|
441
|
+
### TODOs and Follow-ups
|
|
442
|
+
```
|
|
443
|
+
{{[[TODO]]}} <action needed>
|
|
444
|
+
{{[[TODO]]}} #researchThis : <topic to investigate>
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### Scheduled Reviews
|
|
448
|
+
```
|
|
449
|
+
[[For review]]: [[Date in ordinal format]]
|
|
450
|
+
```
|
|
451
|
+
Optional labels: "Deadline", "Approved", "Pending", "Deferred", "Postponed until"
|
|
452
|
+
|
|
453
|
+
### Aliasing for Case Sensitivity
|
|
454
|
+
When a tag would awkwardly affect sentence capitalization:
|
|
455
|
+
```
|
|
456
|
+
[Cognitive biases]([[cognitive biases]]) affect decision-making...
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## Constraints & Guardrails
|
|
462
|
+
|
|
463
|
+
### DON'T
|
|
464
|
+
- **Overtag** — Quality over quantity; each tag should earn its place
|
|
465
|
+
- **Tag obvious/redundant** — If parent block is tagged, children inherit context
|
|
466
|
+
- **Use inconsistent capitalization** — Tags are lowercase unless proper nouns
|
|
467
|
+
- **Create orphan tags** — Check if existing page/tag serves the purpose
|
|
468
|
+
|
|
469
|
+
### DO
|
|
470
|
+
- **Think retrieval-first** — How will you search for this later?
|
|
471
|
+
- **Cross-pollinate domains** — Force unlikely intellectual meetings
|
|
472
|
+
- **Update aging tags** — As interests evolve, so should tag vocabulary
|
|
473
|
+
- **Track surprise discoveries** — When unexpected connections yield insights, engineer more of those patterns
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## Custom Rules
|
|
478
|
+
|
|
479
|
+
<!--
|
|
480
|
+
CUSTOMIZE THIS SECTION with your specific conventions:
|
|
481
|
+
- Naming patterns for certain page types
|
|
482
|
+
- Required attributes for books/articles/people
|
|
483
|
+
- Project-specific tagging schemes
|
|
484
|
+
- Integration rules with other tools
|
|
485
|
+
- etc.
|
|
486
|
+
-->
|
|
487
|
+
|
|
488
|
+
### Example Custom Rules (modify as needed):
|
|
489
|
+
|
|
490
|
+
**Books:**
|
|
491
|
+
```
|
|
492
|
+
[[Book: Title by Author]]
|
|
493
|
+
Type:: Book
|
|
494
|
+
Author:: [[Author Name]]
|
|
495
|
+
Status:: Reading | Completed | Abandoned
|
|
496
|
+
Rating:: X/5
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
**People:**
|
|
500
|
+
```
|
|
501
|
+
[[Person Name]]
|
|
502
|
+
Type:: Person
|
|
503
|
+
Context:: How I know them
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
**Projects:**
|
|
507
|
+
```
|
|
508
|
+
[[Project: Name]]
|
|
509
|
+
Status:: Active | Paused | Completed
|
|
510
|
+
Start:: [[Date]]
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
## Integration Notes
|
|
516
|
+
|
|
517
|
+
<!-- CUSTOMIZE: Any rules about how Roam integrates with your other tools/systems -->
|
|
518
|
+
|
|
519
|
+
- Daily pages serve as: <!-- inbox / journal / task list / etc. -->
|
|
520
|
+
- Weekly reviews occur on: <!-- day of week -->
|
|
521
|
+
- Content flows from: <!-- capture tools, read-later apps, etc. -->
|
|
522
|
+
- Content flows to: <!-- publishing, archives, etc. -->
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
*End of Personalization Layer*
|