@noteplanco/noteplan-mcp 1.1.1

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 (155) hide show
  1. package/README.md +257 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +8 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/noteplan/embeddings.d.ts +170 -0
  7. package/dist/noteplan/embeddings.d.ts.map +1 -0
  8. package/dist/noteplan/embeddings.js +684 -0
  9. package/dist/noteplan/embeddings.js.map +1 -0
  10. package/dist/noteplan/file-reader.d.ts +77 -0
  11. package/dist/noteplan/file-reader.d.ts.map +1 -0
  12. package/dist/noteplan/file-reader.js +488 -0
  13. package/dist/noteplan/file-reader.js.map +1 -0
  14. package/dist/noteplan/file-writer.d.ts +108 -0
  15. package/dist/noteplan/file-writer.d.ts.map +1 -0
  16. package/dist/noteplan/file-writer.js +621 -0
  17. package/dist/noteplan/file-writer.js.map +1 -0
  18. package/dist/noteplan/filter-store.d.ts +28 -0
  19. package/dist/noteplan/filter-store.d.ts.map +1 -0
  20. package/dist/noteplan/filter-store.js +180 -0
  21. package/dist/noteplan/filter-store.js.map +1 -0
  22. package/dist/noteplan/frontmatter-parser.d.ts +45 -0
  23. package/dist/noteplan/frontmatter-parser.d.ts.map +1 -0
  24. package/dist/noteplan/frontmatter-parser.js +259 -0
  25. package/dist/noteplan/frontmatter-parser.js.map +1 -0
  26. package/dist/noteplan/fuzzy-search.d.ts +7 -0
  27. package/dist/noteplan/fuzzy-search.d.ts.map +1 -0
  28. package/dist/noteplan/fuzzy-search.js +66 -0
  29. package/dist/noteplan/fuzzy-search.js.map +1 -0
  30. package/dist/noteplan/markdown-parser.d.ts +87 -0
  31. package/dist/noteplan/markdown-parser.d.ts.map +1 -0
  32. package/dist/noteplan/markdown-parser.js +519 -0
  33. package/dist/noteplan/markdown-parser.js.map +1 -0
  34. package/dist/noteplan/preferences.d.ts +44 -0
  35. package/dist/noteplan/preferences.d.ts.map +1 -0
  36. package/dist/noteplan/preferences.js +156 -0
  37. package/dist/noteplan/preferences.js.map +1 -0
  38. package/dist/noteplan/ripgrep-search.d.ts +29 -0
  39. package/dist/noteplan/ripgrep-search.d.ts.map +1 -0
  40. package/dist/noteplan/ripgrep-search.js +110 -0
  41. package/dist/noteplan/ripgrep-search.js.map +1 -0
  42. package/dist/noteplan/sqlite-reader.d.ts +77 -0
  43. package/dist/noteplan/sqlite-reader.d.ts.map +1 -0
  44. package/dist/noteplan/sqlite-reader.js +605 -0
  45. package/dist/noteplan/sqlite-reader.js.map +1 -0
  46. package/dist/noteplan/sqlite-writer.d.ts +63 -0
  47. package/dist/noteplan/sqlite-writer.d.ts.map +1 -0
  48. package/dist/noteplan/sqlite-writer.js +574 -0
  49. package/dist/noteplan/sqlite-writer.js.map +1 -0
  50. package/dist/noteplan/types.d.ts +97 -0
  51. package/dist/noteplan/types.d.ts.map +1 -0
  52. package/dist/noteplan/types.js +33 -0
  53. package/dist/noteplan/types.js.map +1 -0
  54. package/dist/noteplan/unified-store.d.ts +289 -0
  55. package/dist/noteplan/unified-store.d.ts.map +1 -0
  56. package/dist/noteplan/unified-store.js +1308 -0
  57. package/dist/noteplan/unified-store.js.map +1 -0
  58. package/dist/server.d.ts +4 -0
  59. package/dist/server.d.ts.map +1 -0
  60. package/dist/server.js +2468 -0
  61. package/dist/server.js.map +1 -0
  62. package/dist/tools/calendar.d.ts +311 -0
  63. package/dist/tools/calendar.d.ts.map +1 -0
  64. package/dist/tools/calendar.js +504 -0
  65. package/dist/tools/calendar.js.map +1 -0
  66. package/dist/tools/embeddings.d.ts +244 -0
  67. package/dist/tools/embeddings.d.ts.map +1 -0
  68. package/dist/tools/embeddings.js +226 -0
  69. package/dist/tools/embeddings.js.map +1 -0
  70. package/dist/tools/events.d.ts +176 -0
  71. package/dist/tools/events.d.ts.map +1 -0
  72. package/dist/tools/events.js +326 -0
  73. package/dist/tools/events.js.map +1 -0
  74. package/dist/tools/filters.d.ts +205 -0
  75. package/dist/tools/filters.d.ts.map +1 -0
  76. package/dist/tools/filters.js +347 -0
  77. package/dist/tools/filters.js.map +1 -0
  78. package/dist/tools/memory.d.ts +6 -0
  79. package/dist/tools/memory.d.ts.map +1 -0
  80. package/dist/tools/memory.js +161 -0
  81. package/dist/tools/memory.js.map +1 -0
  82. package/dist/tools/notes.d.ts +1221 -0
  83. package/dist/tools/notes.d.ts.map +1 -0
  84. package/dist/tools/notes.js +1868 -0
  85. package/dist/tools/notes.js.map +1 -0
  86. package/dist/tools/plugins.d.ts +140 -0
  87. package/dist/tools/plugins.d.ts.map +1 -0
  88. package/dist/tools/plugins.js +782 -0
  89. package/dist/tools/plugins.js.map +1 -0
  90. package/dist/tools/reminders.d.ts +207 -0
  91. package/dist/tools/reminders.d.ts.map +1 -0
  92. package/dist/tools/reminders.js +323 -0
  93. package/dist/tools/reminders.js.map +1 -0
  94. package/dist/tools/search.d.ts +58 -0
  95. package/dist/tools/search.d.ts.map +1 -0
  96. package/dist/tools/search.js +373 -0
  97. package/dist/tools/search.js.map +1 -0
  98. package/dist/tools/spaces.d.ts +484 -0
  99. package/dist/tools/spaces.d.ts.map +1 -0
  100. package/dist/tools/spaces.js +870 -0
  101. package/dist/tools/spaces.js.map +1 -0
  102. package/dist/tools/tasks.d.ts +313 -0
  103. package/dist/tools/tasks.d.ts.map +1 -0
  104. package/dist/tools/tasks.js +690 -0
  105. package/dist/tools/tasks.js.map +1 -0
  106. package/dist/tools/themes.d.ts +91 -0
  107. package/dist/tools/themes.d.ts.map +1 -0
  108. package/dist/tools/themes.js +294 -0
  109. package/dist/tools/themes.js.map +1 -0
  110. package/dist/tools/ui.d.ts +89 -0
  111. package/dist/tools/ui.d.ts.map +1 -0
  112. package/dist/tools/ui.js +137 -0
  113. package/dist/tools/ui.js.map +1 -0
  114. package/dist/utils/applescript.d.ts +5 -0
  115. package/dist/utils/applescript.d.ts.map +1 -0
  116. package/dist/utils/applescript.js +27 -0
  117. package/dist/utils/applescript.js.map +1 -0
  118. package/dist/utils/confirmation-tokens.d.ts +19 -0
  119. package/dist/utils/confirmation-tokens.d.ts.map +1 -0
  120. package/dist/utils/confirmation-tokens.js +58 -0
  121. package/dist/utils/confirmation-tokens.js.map +1 -0
  122. package/dist/utils/date-filters.d.ts +15 -0
  123. package/dist/utils/date-filters.d.ts.map +1 -0
  124. package/dist/utils/date-filters.js +129 -0
  125. package/dist/utils/date-filters.js.map +1 -0
  126. package/dist/utils/date-utils.d.ts +113 -0
  127. package/dist/utils/date-utils.d.ts.map +1 -0
  128. package/dist/utils/date-utils.js +341 -0
  129. package/dist/utils/date-utils.js.map +1 -0
  130. package/dist/utils/folder-matcher.d.ts +14 -0
  131. package/dist/utils/folder-matcher.d.ts.map +1 -0
  132. package/dist/utils/folder-matcher.js +191 -0
  133. package/dist/utils/folder-matcher.js.map +1 -0
  134. package/dist/utils/version.d.ts +10 -0
  135. package/dist/utils/version.d.ts.map +1 -0
  136. package/dist/utils/version.js +88 -0
  137. package/dist/utils/version.js.map +1 -0
  138. package/docs/plugin-api/Calendar.md +448 -0
  139. package/docs/plugin-api/CalendarItem.md +198 -0
  140. package/docs/plugin-api/Clipboard.md +101 -0
  141. package/docs/plugin-api/CommandBar.md +251 -0
  142. package/docs/plugin-api/DataStore.md +700 -0
  143. package/docs/plugin-api/Editor.md +982 -0
  144. package/docs/plugin-api/HTMLView.md +337 -0
  145. package/docs/plugin-api/NoteObject.md +588 -0
  146. package/docs/plugin-api/NotePlan.md +398 -0
  147. package/docs/plugin-api/ParagraphObject.md +242 -0
  148. package/docs/plugin-api/RangeObject.md +56 -0
  149. package/docs/plugin-api/getting-started.md +545 -0
  150. package/docs/plugin-api/plugin-api-condensed.md +526 -0
  151. package/docs/plugin-api/plugin.json +26 -0
  152. package/docs/plugin-api/script.js +542 -0
  153. package/package.json +60 -0
  154. package/scripts/calendar-helper +0 -0
  155. package/scripts/reminders-helper +0 -0
@@ -0,0 +1,87 @@
1
+ import { Task, TaskStatus, ParagraphType, ParagraphMetadata } from './types.js';
2
+ /**
3
+ * Parse a note's content to extract tasks
4
+ */
5
+ export declare function parseTasks(content: string): Task[];
6
+ /**
7
+ * Parse a single line to extract task information
8
+ * Handles both checkbox style (e.g., * [ ] task) and plain marker style (e.g., * task)
9
+ */
10
+ export declare function parseTaskLine(line: string, lineIndex: number): Task | null;
11
+ /**
12
+ * Extract hashtags from a single line / content fragment.
13
+ * Attributes are stripped, hierarchies are expanded.
14
+ */
15
+ export declare function extractTags(content: string): string[];
16
+ /**
17
+ * Extract @mentions from a single line / content fragment.
18
+ * Attributes are stripped, hierarchies are expanded.
19
+ */
20
+ export declare function extractMentions(content: string): string[];
21
+ /**
22
+ * Extract all unique tags (both # and @) from full note content.
23
+ * Handles code fences, inline code, markdown links, boundary checks,
24
+ * Unicode / emoji support, hierarchy expansion, and special-tag filtering.
25
+ * Used by file-reader and sqlite-reader for global tag listing.
26
+ */
27
+ export declare function extractTagsFromContent(content: string): string[];
28
+ /**
29
+ * Extract scheduled date from content (>YYYY-MM-DD pattern)
30
+ */
31
+ export declare function extractScheduledDate(content: string): string | undefined;
32
+ /**
33
+ * Extract priority from content (! = low, !! = medium, !!! = high)
34
+ */
35
+ export declare function extractPriority(content: string): number | undefined;
36
+ /**
37
+ * Extract title from note content (first line, strips # if heading)
38
+ */
39
+ export declare function extractTitle(content: string): string;
40
+ /**
41
+ * Update a task's status in the note content
42
+ * Handles both checkbox-style and plain marker tasks
43
+ */
44
+ export declare function updateTaskStatus(content: string, lineIndex: number, newStatus: TaskStatus): string;
45
+ /**
46
+ * Update a task's content in the note
47
+ * Handles both checkbox-style and plain marker tasks
48
+ */
49
+ export declare function updateTaskContent(content: string, lineIndex: number, newTaskContent: string): string;
50
+ /**
51
+ * Add a task to note content
52
+ * Uses user's configured task marker format from NotePlan preferences
53
+ */
54
+ export declare function addTask(content: string, taskContent: string, position?: 'start' | 'end' | 'after-heading', heading?: string, options?: {
55
+ status?: TaskStatus;
56
+ priority?: number;
57
+ indentLevel?: number;
58
+ }): string;
59
+ /**
60
+ * Extract all headings from content
61
+ */
62
+ export declare function extractHeadings(content: string): {
63
+ level: number;
64
+ text: string;
65
+ lineIndex: number;
66
+ }[];
67
+ /**
68
+ * Parse a single line and classify it as a paragraph type with metadata.
69
+ * Reuses parseTaskLine() detection patterns and extract* helpers.
70
+ */
71
+ export declare function parseParagraphLine(line: string, lineIndex: number, isFirstLine: boolean): ParagraphMetadata;
72
+ /**
73
+ * Build a properly formatted markdown line from structured input.
74
+ * Uses user preferences for task marker style.
75
+ */
76
+ export declare function buildParagraphLine(content: string, type: ParagraphType, options?: {
77
+ headingLevel?: number;
78
+ taskStatus?: TaskStatus;
79
+ indentLevel?: number;
80
+ priority?: number;
81
+ hasCheckbox?: boolean;
82
+ }): string;
83
+ /**
84
+ * Filter tasks by status
85
+ */
86
+ export declare function filterTasksByStatus(tasks: Task[], status?: TaskStatus | TaskStatus[]): Task[];
87
+ //# sourceMappingURL=markdown-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../src/noteplan/markdown-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAqC,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGnH;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,CAalD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAqD1E;AA0FD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKzD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAInE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,MAAM,CA8BlG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAuBpG;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,OAAO,GAAG,KAAK,GAAG,eAAuB,EACnD,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,MAAM,CA8CR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,CAgBrG;AAqBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,iBAAiB,CAwH3G;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,MAAM,CAwCR;AASD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,EAAE,CAK7F"}
@@ -0,0 +1,519 @@
1
+ // NotePlan Markdown Parser
2
+ import { TASK_STATUS_MAP, STATUS_TO_MARKER } from './types.js';
3
+ import { getTaskPrefix, getTaskMarkerConfigCached } from './preferences.js';
4
+ /**
5
+ * Parse a note's content to extract tasks
6
+ */
7
+ export function parseTasks(content) {
8
+ const lines = content.split('\n');
9
+ const tasks = [];
10
+ for (let i = 0; i < lines.length; i++) {
11
+ const line = lines[i];
12
+ const task = parseTaskLine(line, i);
13
+ if (task) {
14
+ tasks.push(task);
15
+ }
16
+ }
17
+ return tasks;
18
+ }
19
+ /**
20
+ * Parse a single line to extract task information
21
+ * Handles both checkbox style (e.g., * [ ] task) and plain marker style (e.g., * task)
22
+ */
23
+ export function parseTaskLine(line, lineIndex) {
24
+ const config = getTaskMarkerConfigCached();
25
+ // First try checkbox-style tasks: * [ ], * [x], * [-], * [>], - [ ], + [ ]
26
+ const checkboxMatch = line.match(/^(\s*)([*+\-])\s*\[(.)\]\s*(.*)$/);
27
+ if (checkboxMatch) {
28
+ const [, indent, marker, statusChar, content] = checkboxMatch;
29
+ const status = TASK_STATUS_MAP[`[${statusChar}]`];
30
+ if (!status)
31
+ return null;
32
+ return {
33
+ lineIndex,
34
+ content: content.trim(),
35
+ rawLine: line,
36
+ status,
37
+ indentLevel: indent.length,
38
+ hasCheckbox: true,
39
+ marker: marker,
40
+ tags: extractTags(content),
41
+ mentions: extractMentions(content),
42
+ scheduledDate: extractScheduledDate(content),
43
+ priority: extractPriority(content),
44
+ };
45
+ }
46
+ // Then try plain marker style tasks (no checkbox): * task, - task
47
+ // Only match if the marker is configured as a task marker
48
+ const plainMatch = line.match(/^(\s*)([*\-])\s+(.+)$/);
49
+ if (plainMatch) {
50
+ const [, indent, marker, content] = plainMatch;
51
+ // Check if this marker is configured as a task marker
52
+ const isTaskMarker = (marker === '*' && config.isAsteriskTodo) || (marker === '-' && config.isDashTodo);
53
+ if (isTaskMarker) {
54
+ return {
55
+ lineIndex,
56
+ content: content.trim(),
57
+ rawLine: line,
58
+ status: 'open', // Plain marker tasks are always open
59
+ indentLevel: indent.length,
60
+ hasCheckbox: false,
61
+ marker: marker,
62
+ tags: extractTags(content),
63
+ mentions: extractMentions(content),
64
+ scheduledDate: extractScheduledDate(content),
65
+ priority: extractPriority(content),
66
+ };
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Tag / mention extraction — aligned with Swift DataStore.parseTags behaviour
73
+ // ---------------------------------------------------------------------------
74
+ /**
75
+ * Strip code fences (``` … ```) from full note content so that tags
76
+ * inside fenced code blocks are not extracted.
77
+ */
78
+ function stripCodeFences(content) {
79
+ return content.replace(/```[\s\S]*?```/g, '');
80
+ }
81
+ /**
82
+ * Strip inline regions that must be ignored during tag extraction:
83
+ * - Inline code (`…`)
84
+ * - Markdown link URLs [text](url) → keeps the link text
85
+ */
86
+ function stripInlineExclusions(text) {
87
+ let result = text.replace(/`[^`\n]+`/g, '');
88
+ result = result.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1');
89
+ return result;
90
+ }
91
+ /**
92
+ * Remove parenthesised attributes from a tag.
93
+ * e.g. #tag(value) → #tag, @repeat(1/1/2025) → @repeat
94
+ */
95
+ function cleanTagAttributes(tag) {
96
+ const idx = tag.indexOf('(');
97
+ return idx > 0 ? tag.substring(0, idx) : tag;
98
+ }
99
+ /**
100
+ * Expand hierarchical (nested) tags into every intermediate level.
101
+ * Matches Swift DataStore.parseTags which produces:
102
+ * #parent/child/grandchild → [#parent, #parent/child, #parent/child/grandchild]
103
+ */
104
+ function expandHierarchicalTags(tags) {
105
+ const expanded = new Set();
106
+ for (const tag of tags) {
107
+ const prefix = tag.charAt(0); // # or @
108
+ const parts = tag.substring(1).split('/');
109
+ let current = prefix;
110
+ for (let i = 0; i < parts.length; i++) {
111
+ current += (i > 0 ? '/' : '') + parts[i];
112
+ expanded.add(current);
113
+ }
114
+ }
115
+ return Array.from(expanded);
116
+ }
117
+ /** Special @-tags excluded from global tag listings (mirrors Swift NoteCache). */
118
+ const EXCLUDED_AT_TAGS = ['@done', '@repeat', '@final-repeat'];
119
+ function isExcludedTag(tag) {
120
+ const lower = tag.toLowerCase();
121
+ // Note: attributes are already stripped by cleanTagAttributes before this is called,
122
+ // so we only need exact match and hierarchy-child match.
123
+ return EXCLUDED_AT_TAGS.some((ex) => lower === ex || lower.startsWith(ex + '/'));
124
+ }
125
+ // Core regex — mirrors Swift DataStore.tag:
126
+ // Boundary: start-of-line | whitespace | one of ' ( [ { * _
127
+ // Negative lookahead: reject purely-numeric / purely-punctuation tags (#123, #---)
128
+ // Tag body: Unicode letters, digits, symbols (incl. emoji) via [^\p{P}\s`],
129
+ // plus explicitly allowed punctuation: - _ /
130
+ // Optional attribute: (...) at the end
131
+ const TAG_PATTERN = /(^|[\s'(\[{*_])(?![@#][\d\p{P}]+(?:\s|$))([@#](?:[^\p{P}\s`]|[-_/])+(?:\([^)]*\))?)/gmu;
132
+ /**
133
+ * Low-level: extract raw tag strings (# and @) from a text fragment.
134
+ * Handles inline-code and markdown-link exclusion but NOT code fences
135
+ * (the caller must strip those when processing full note content).
136
+ */
137
+ function extractRawTags(text) {
138
+ const cleaned = stripInlineExclusions(text);
139
+ const tags = [];
140
+ TAG_PATTERN.lastIndex = 0;
141
+ let match;
142
+ while ((match = TAG_PATTERN.exec(cleaned)) !== null) {
143
+ // Trim trailing separators to avoid ghost hierarchy levels from typos like #tag/
144
+ const tag = match[2].replace(/\/+$/, '');
145
+ if (tag.length > 1)
146
+ tags.push(tag); // must have at least one body char after # or @
147
+ }
148
+ return tags;
149
+ }
150
+ /**
151
+ * Extract hashtags from a single line / content fragment.
152
+ * Attributes are stripped, hierarchies are expanded.
153
+ */
154
+ export function extractTags(content) {
155
+ const raw = extractRawTags(content)
156
+ .filter((t) => t.startsWith('#'))
157
+ .map(cleanTagAttributes);
158
+ return expandHierarchicalTags(raw);
159
+ }
160
+ /**
161
+ * Extract @mentions from a single line / content fragment.
162
+ * Attributes are stripped, hierarchies are expanded.
163
+ */
164
+ export function extractMentions(content) {
165
+ const raw = extractRawTags(content)
166
+ .filter((t) => t.startsWith('@'))
167
+ .map(cleanTagAttributes);
168
+ return expandHierarchicalTags(raw);
169
+ }
170
+ /**
171
+ * Extract all unique tags (both # and @) from full note content.
172
+ * Handles code fences, inline code, markdown links, boundary checks,
173
+ * Unicode / emoji support, hierarchy expansion, and special-tag filtering.
174
+ * Used by file-reader and sqlite-reader for global tag listing.
175
+ */
176
+ export function extractTagsFromContent(content) {
177
+ const withoutFences = stripCodeFences(content);
178
+ const raw = extractRawTags(withoutFences).map(cleanTagAttributes);
179
+ const expanded = expandHierarchicalTags(raw);
180
+ return expanded.filter((tag) => !isExcludedTag(tag));
181
+ }
182
+ /**
183
+ * Extract scheduled date from content (>YYYY-MM-DD pattern)
184
+ */
185
+ export function extractScheduledDate(content) {
186
+ const match = content.match(/>(\d{4}-\d{2}-\d{2})/);
187
+ return match ? match[1] : undefined;
188
+ }
189
+ /**
190
+ * Extract priority from content (! = low, !! = medium, !!! = high)
191
+ */
192
+ export function extractPriority(content) {
193
+ const match = content.match(/(!{1,3})(?!\w)/);
194
+ if (!match)
195
+ return undefined;
196
+ return match[1].length;
197
+ }
198
+ /**
199
+ * Extract title from note content (first line, strips # if heading)
200
+ */
201
+ export function extractTitle(content) {
202
+ const firstLine = content.split('\n')[0] || '';
203
+ // Remove heading markers
204
+ return firstLine.replace(/^#{1,6}\s*/, '').trim() || 'Untitled';
205
+ }
206
+ /**
207
+ * Update a task's status in the note content
208
+ * Handles both checkbox-style and plain marker tasks
209
+ */
210
+ export function updateTaskStatus(content, lineIndex, newStatus) {
211
+ const lines = content.split('\n');
212
+ if (lineIndex < 0 || lineIndex >= lines.length) {
213
+ throw new Error(`Invalid line index: ${lineIndex}`);
214
+ }
215
+ const line = lines[lineIndex];
216
+ const statusMarkers = {
217
+ open: '[ ]',
218
+ done: '[x]',
219
+ cancelled: '[-]',
220
+ scheduled: '[>]',
221
+ };
222
+ // Check if line has a checkbox
223
+ if (/\[.\]/.test(line)) {
224
+ // Replace the existing status marker
225
+ lines[lineIndex] = line.replace(/\[.\]/, statusMarkers[newStatus]);
226
+ }
227
+ else {
228
+ // Plain marker task (e.g., "* task") - need to add checkbox
229
+ const match = line.match(/^(\s*)([*\-])\s+(.*)$/);
230
+ if (match) {
231
+ const [, indent, marker, taskContent] = match;
232
+ lines[lineIndex] = `${indent}${marker} ${statusMarkers[newStatus]} ${taskContent}`;
233
+ }
234
+ else {
235
+ throw new Error(`Line ${lineIndex} is not a task`);
236
+ }
237
+ }
238
+ return lines.join('\n');
239
+ }
240
+ /**
241
+ * Update a task's content in the note
242
+ * Handles both checkbox-style and plain marker tasks
243
+ */
244
+ export function updateTaskContent(content, lineIndex, newTaskContent) {
245
+ const lines = content.split('\n');
246
+ if (lineIndex < 0 || lineIndex >= lines.length) {
247
+ throw new Error(`Invalid line index: ${lineIndex}`);
248
+ }
249
+ const line = lines[lineIndex];
250
+ // First try checkbox-style task: * [ ] task
251
+ const checkboxMatch = line.match(/^(\s*[*+\-]\s*\[.\]\s*)/);
252
+ if (checkboxMatch) {
253
+ lines[lineIndex] = checkboxMatch[1] + newTaskContent;
254
+ return lines.join('\n');
255
+ }
256
+ // Then try plain marker task: * task
257
+ const plainMatch = line.match(/^(\s*[*\-]\s+)/);
258
+ if (plainMatch) {
259
+ lines[lineIndex] = plainMatch[1] + newTaskContent;
260
+ return lines.join('\n');
261
+ }
262
+ throw new Error(`Line ${lineIndex} is not a task`);
263
+ }
264
+ /**
265
+ * Add a task to note content
266
+ * Uses user's configured task marker format from NotePlan preferences
267
+ */
268
+ export function addTask(content, taskContent, position = 'end', heading, options) {
269
+ let taskLine;
270
+ if (options && (options.status !== undefined || options.priority !== undefined || options.indentLevel !== undefined)) {
271
+ taskLine = buildParagraphLine(taskContent, 'task', {
272
+ taskStatus: options.status ?? 'open',
273
+ priority: options.priority,
274
+ indentLevel: options.indentLevel,
275
+ });
276
+ }
277
+ else {
278
+ const taskPrefix = getTaskPrefix();
279
+ taskLine = `${taskPrefix}${taskContent}`;
280
+ }
281
+ const lines = content.split('\n');
282
+ if (position === 'start') {
283
+ // Add after frontmatter if present
284
+ let insertIndex = 0;
285
+ if (lines[0]?.trim() === '---') {
286
+ for (let i = 1; i < lines.length; i++) {
287
+ if (lines[i]?.trim() === '---') {
288
+ insertIndex = i + 1;
289
+ break;
290
+ }
291
+ }
292
+ }
293
+ lines.splice(insertIndex, 0, taskLine);
294
+ }
295
+ else if (position === 'after-heading' && heading) {
296
+ // Find the heading and insert after it (matches ATX headings and bold section markers)
297
+ const headingIndex = lines.findIndex((line) => {
298
+ if (line.match(new RegExp(`^#{1,6}\\s*${escapeRegex(heading)}\\s*$`, 'i')))
299
+ return true;
300
+ const boldMatch = line.match(/^\s*\*\*(.+?)\*\*:?\s*$/);
301
+ if (boldMatch && boldMatch[1].trim().toLowerCase() === heading.toLowerCase())
302
+ return true;
303
+ return false;
304
+ });
305
+ if (headingIndex !== -1) {
306
+ lines.splice(headingIndex + 1, 0, taskLine);
307
+ }
308
+ else {
309
+ // Heading not found, add at end
310
+ lines.push(taskLine);
311
+ }
312
+ }
313
+ else {
314
+ // Add at end
315
+ lines.push(taskLine);
316
+ }
317
+ return lines.join('\n');
318
+ }
319
+ /**
320
+ * Extract all headings from content
321
+ */
322
+ export function extractHeadings(content) {
323
+ const lines = content.split('\n');
324
+ const headings = [];
325
+ for (let i = 0; i < lines.length; i++) {
326
+ const match = lines[i].match(/^(#{1,6})\s+(.+)$/);
327
+ if (match) {
328
+ headings.push({
329
+ level: match[1].length,
330
+ text: match[2].trim(),
331
+ lineIndex: i,
332
+ });
333
+ }
334
+ }
335
+ return headings;
336
+ }
337
+ /**
338
+ * Count indent level from leading whitespace.
339
+ * Tabs count as 1 each; every 2 leading spaces convert to 1 tab-equivalent.
340
+ */
341
+ function countIndentLevel(line) {
342
+ let tabs = 0;
343
+ let spaces = 0;
344
+ for (const ch of line) {
345
+ if (ch === '\t') {
346
+ tabs += 1;
347
+ }
348
+ else if (ch === ' ') {
349
+ spaces += 1;
350
+ }
351
+ else {
352
+ break;
353
+ }
354
+ }
355
+ return tabs + Math.floor(spaces / 2);
356
+ }
357
+ /**
358
+ * Parse a single line and classify it as a paragraph type with metadata.
359
+ * Reuses parseTaskLine() detection patterns and extract* helpers.
360
+ */
361
+ export function parseParagraphLine(line, lineIndex, isFirstLine) {
362
+ const config = getTaskMarkerConfigCached();
363
+ const trimmed = line.trim();
364
+ // 1. Empty
365
+ if (trimmed === '') {
366
+ return { type: 'empty', indentLevel: 0, tags: [], mentions: [] };
367
+ }
368
+ // 2. Separator (---, ***, ___)
369
+ if (/^(?:---+|\*\*\*+|___+)$/.test(trimmed)) {
370
+ return { type: 'separator', indentLevel: 0, tags: [], mentions: [] };
371
+ }
372
+ // Helper to extract optional content metadata and conditionally spread
373
+ function contentMeta(text) {
374
+ const scheduledDate = extractScheduledDate(text);
375
+ const priority = extractPriority(text);
376
+ return {
377
+ tags: extractTags(text),
378
+ mentions: extractMentions(text),
379
+ ...(scheduledDate !== undefined && { scheduledDate }),
380
+ ...(priority !== undefined && { priority }),
381
+ };
382
+ }
383
+ // Helper to build a marker-line result (task, checklist, or bullet)
384
+ function markerResult(type, text, indent, typedMarker, hasCheckbox, taskStatus) {
385
+ return {
386
+ type,
387
+ indentLevel: countIndentLevel(indent),
388
+ marker: typedMarker,
389
+ hasCheckbox,
390
+ ...(taskStatus && { taskStatus }),
391
+ ...contentMeta(text),
392
+ };
393
+ }
394
+ // 3. Heading (# through ######)
395
+ const headingMatch = trimmed.match(/^(#{1,6})\s+(.+)$/);
396
+ if (headingMatch) {
397
+ const level = headingMatch[1].length;
398
+ const content = headingMatch[2];
399
+ const type = isFirstLine ? 'title' : 'heading';
400
+ return {
401
+ type,
402
+ headingLevel: level,
403
+ indentLevel: 0,
404
+ ...contentMeta(content),
405
+ };
406
+ }
407
+ // 4. First line without # → title
408
+ if (isFirstLine) {
409
+ return {
410
+ type: 'title',
411
+ headingLevel: 1,
412
+ indentLevel: 0,
413
+ tags: extractTags(trimmed),
414
+ mentions: extractMentions(trimmed),
415
+ };
416
+ }
417
+ // 5. Quote (> ...)
418
+ if (/^>\s?/.test(trimmed)) {
419
+ const quoteContent = trimmed.replace(/^>\s?/, '');
420
+ const scheduledDate = extractScheduledDate(quoteContent);
421
+ return {
422
+ type: 'quote',
423
+ indentLevel: 0,
424
+ tags: extractTags(quoteContent),
425
+ mentions: extractMentions(quoteContent),
426
+ ...(scheduledDate !== undefined && { scheduledDate }),
427
+ };
428
+ }
429
+ // 6. Checkbox line (* [x], - [ ], + [-])
430
+ const checkboxMatch = line.match(/^(\s*)([*+\-])\s*\[(.)\]\s*(.*)$/);
431
+ if (checkboxMatch) {
432
+ const [, indent, marker, statusChar, content] = checkboxMatch;
433
+ const status = TASK_STATUS_MAP[`[${statusChar}]`];
434
+ const typedMarker = marker;
435
+ const type = typedMarker === '+' ? 'checklist' : 'task';
436
+ return markerResult(type, content, indent, typedMarker, true, status);
437
+ }
438
+ // 7. Plain marker line (* item, - item, + item)
439
+ const plainMatch = line.match(/^(\s*)([*+\-])\s+(.+)$/);
440
+ if (plainMatch) {
441
+ const [, indent, marker, content] = plainMatch;
442
+ const typedMarker = marker;
443
+ if (typedMarker === '+') {
444
+ return markerResult('checklist', content, indent, typedMarker, false);
445
+ }
446
+ const isTaskMarkerChar = (typedMarker === '*' && config.isAsteriskTodo) || (typedMarker === '-' && config.isDashTodo);
447
+ if (isTaskMarkerChar) {
448
+ return markerResult('task', content, indent, typedMarker, false, 'open');
449
+ }
450
+ // It's a bullet
451
+ return markerResult('bullet', content, indent, typedMarker, false);
452
+ }
453
+ // 8. Everything else → text
454
+ return {
455
+ type: 'text',
456
+ indentLevel: countIndentLevel(line),
457
+ ...contentMeta(trimmed),
458
+ };
459
+ }
460
+ /**
461
+ * Build a properly formatted markdown line from structured input.
462
+ * Uses user preferences for task marker style.
463
+ */
464
+ export function buildParagraphLine(content, type, options) {
465
+ const config = getTaskMarkerConfigCached();
466
+ const indent = '\t'.repeat(options?.indentLevel ?? 0);
467
+ const prioritySuffix = options?.priority ? ' ' + '!'.repeat(options.priority) : '';
468
+ switch (type) {
469
+ case 'title':
470
+ case 'heading': {
471
+ const level = options?.headingLevel ?? (type === 'title' ? 1 : 2);
472
+ return `${'#'.repeat(level)} ${content}`;
473
+ }
474
+ case 'task': {
475
+ const marker = config.defaultTodoCharacter;
476
+ const status = options?.taskStatus ?? 'open';
477
+ const wantCheckbox = options?.hasCheckbox ?? config.useCheckbox;
478
+ if (wantCheckbox || status !== 'open') {
479
+ return `${indent}${marker} ${STATUS_TO_MARKER[status]} ${content}${prioritySuffix}`;
480
+ }
481
+ return `${indent}${marker} ${content}${prioritySuffix}`;
482
+ }
483
+ case 'checklist': {
484
+ const status = options?.taskStatus ?? 'open';
485
+ const wantCheckbox = options?.hasCheckbox ?? true;
486
+ if (wantCheckbox || status !== 'open') {
487
+ return `${indent}+ ${STATUS_TO_MARKER[status]} ${content}${prioritySuffix}`;
488
+ }
489
+ return `${indent}+ ${content}${prioritySuffix}`;
490
+ }
491
+ case 'bullet':
492
+ return `${indent}- ${content}`;
493
+ case 'quote':
494
+ return `> ${content}`;
495
+ case 'separator':
496
+ return '---';
497
+ case 'empty':
498
+ return '';
499
+ case 'text':
500
+ default:
501
+ return content;
502
+ }
503
+ }
504
+ /**
505
+ * Escape special regex characters
506
+ */
507
+ function escapeRegex(str) {
508
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
509
+ }
510
+ /**
511
+ * Filter tasks by status
512
+ */
513
+ export function filterTasksByStatus(tasks, status) {
514
+ if (!status)
515
+ return tasks;
516
+ const statuses = Array.isArray(status) ? status : [status];
517
+ return tasks.filter((task) => statuses.includes(task.status));
518
+ }
519
+ //# sourceMappingURL=markdown-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../src/noteplan/markdown-parser.ts"],"names":[],"mappings":"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"}