@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,621 @@
1
+ // File system writer for local NotePlan notes
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { getNotePlanPath, getNotesPath, getFileExtension, buildCalendarNotePath, getCalendarNote, } from './file-reader.js';
5
+ function ensurePathInsideRoot(candidatePath, rootPath, label) {
6
+ const resolvedCandidate = path.resolve(candidatePath);
7
+ const resolvedRoot = path.resolve(rootPath);
8
+ if (resolvedCandidate !== resolvedRoot &&
9
+ !resolvedCandidate.startsWith(`${resolvedRoot}${path.sep}`)) {
10
+ throw new Error(`${label} must be inside ${path.basename(rootPath)}`);
11
+ }
12
+ }
13
+ function toLocalNoteAbsolutePath(filePath) {
14
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(getNotePlanPath(), filePath);
15
+ ensurePathInsideRoot(fullPath, getNotePlanPath(), 'File path');
16
+ return fullPath;
17
+ }
18
+ function normalizeLocalFolderPath(folderPath, label = 'Folder path') {
19
+ const notesRoot = path.resolve(getNotesPath());
20
+ let normalized = folderPath.trim().replace(/\\/g, '/');
21
+ if (!normalized) {
22
+ throw new Error(`${label} is required`);
23
+ }
24
+ if (path.isAbsolute(folderPath)) {
25
+ const absoluteInput = path.resolve(folderPath);
26
+ ensurePathInsideRoot(absoluteInput, notesRoot, label);
27
+ normalized = path.relative(notesRoot, absoluteInput).replace(/\\/g, '/');
28
+ }
29
+ normalized = normalized.replace(/^\/+|\/+$/g, '');
30
+ if (!normalized || normalized === '.') {
31
+ return '';
32
+ }
33
+ if (normalized === 'Notes') {
34
+ return '';
35
+ }
36
+ if (normalized.startsWith('Notes/')) {
37
+ normalized = normalized.slice('Notes/'.length);
38
+ }
39
+ if (!normalized || normalized === '.') {
40
+ return '';
41
+ }
42
+ if (normalized.split('/').some((segment) => segment === '' || segment === '.' || segment === '..')) {
43
+ throw new Error(`${label} is invalid`);
44
+ }
45
+ return normalized;
46
+ }
47
+ function normalizeFolderInput(folderPath) {
48
+ let normalized = folderPath.trim().replace(/\\/g, '/');
49
+ normalized = normalized.replace(/^\/+|\/+$/g, '');
50
+ if (!normalized) {
51
+ throw new Error('Destination folder is required');
52
+ }
53
+ if (!normalized.startsWith('Notes/')) {
54
+ normalized = normalized === 'Notes' ? normalized : `Notes/${normalized}`;
55
+ }
56
+ return normalized;
57
+ }
58
+ function normalizeMoveDestinationFolderInput(destinationFolder, sourceFilename) {
59
+ let normalized = destinationFolder.trim().replace(/\\/g, '/');
60
+ normalized = normalized.replace(/^\/+|\/+$/g, '');
61
+ if (!normalized) {
62
+ throw new Error('Destination folder is required');
63
+ }
64
+ const sourceBasename = path.basename(sourceFilename).toLowerCase();
65
+ const lastSegment = path.posix.basename(normalized);
66
+ const hasFileExtension = path.posix.extname(lastSegment).length > 0;
67
+ if (hasFileExtension) {
68
+ if (lastSegment.toLowerCase() === sourceBasename) {
69
+ normalized = path.posix.dirname(normalized);
70
+ if (normalized === '.' || normalized.trim().length === 0) {
71
+ throw new Error('Destination folder is required');
72
+ }
73
+ }
74
+ else {
75
+ throw new Error('destinationFolder must be a folder path, not a filename. Use noteplan_rename_note_file to change filenames.');
76
+ }
77
+ }
78
+ return normalizeFolderInput(normalized);
79
+ }
80
+ function resolveRenameInputInCurrentFolder(currentFullPath, newFilename) {
81
+ const notePlanRoot = path.resolve(getNotePlanPath());
82
+ const currentFolderRelative = path
83
+ .relative(notePlanRoot, path.dirname(currentFullPath))
84
+ .replace(/\\/g, '/');
85
+ const normalizedCurrentFolder = currentFolderRelative === '.' ? '' : currentFolderRelative;
86
+ let normalizedInput = newFilename.trim().replace(/\\/g, '/');
87
+ if (!normalizedInput) {
88
+ throw new Error('New filename is required');
89
+ }
90
+ if (path.isAbsolute(newFilename)) {
91
+ const absoluteInput = path.resolve(newFilename);
92
+ ensurePathInsideRoot(absoluteInput, notePlanRoot, 'New filename path');
93
+ normalizedInput = path.relative(notePlanRoot, absoluteInput).replace(/\\/g, '/');
94
+ }
95
+ normalizedInput = normalizedInput.replace(/^\/+|\/+$/g, '');
96
+ if (!normalizedInput) {
97
+ throw new Error('New filename is required');
98
+ }
99
+ const hasPathSegments = normalizedInput.includes('/');
100
+ if (!hasPathSegments) {
101
+ return normalizedInput;
102
+ }
103
+ const inputDirRaw = path.posix.dirname(normalizedInput);
104
+ const inputBase = path.posix.basename(normalizedInput);
105
+ if (!inputBase || inputBase === '.') {
106
+ throw new Error('New filename is invalid');
107
+ }
108
+ let normalizedInputDir = inputDirRaw === '.' ? '' : inputDirRaw;
109
+ if (normalizedInputDir && !normalizedInputDir.startsWith('Notes/')) {
110
+ normalizedInputDir = normalizedInputDir === 'Notes' ? 'Notes' : `Notes/${normalizedInputDir}`;
111
+ }
112
+ if (normalizedCurrentFolder &&
113
+ normalizedInputDir &&
114
+ normalizedInputDir !== normalizedCurrentFolder) {
115
+ throw new Error('newFilename must stay in the same folder. Use noteplan_move_note to move across folders.');
116
+ }
117
+ return inputBase;
118
+ }
119
+ function resolveRenamedFilename(currentFullPath, newFilename, keepExtension) {
120
+ const currentFilename = path.basename(currentFullPath);
121
+ const currentExt = path.extname(currentFilename);
122
+ const requestedInput = resolveRenameInputInCurrentFolder(currentFullPath, newFilename);
123
+ const requested = sanitizeFilename(requestedInput);
124
+ if (!requested) {
125
+ throw new Error('New filename is required');
126
+ }
127
+ const requestedExt = path.extname(requested);
128
+ const requestedBase = path.basename(requested, requestedExt);
129
+ if (!requestedBase) {
130
+ throw new Error('New filename is invalid');
131
+ }
132
+ if (keepExtension || !requestedExt) {
133
+ return `${requestedBase}${currentExt}`;
134
+ }
135
+ return `${requestedBase}${requestedExt}`;
136
+ }
137
+ /**
138
+ * Write content to a note file atomically
139
+ * NotePlan's FolderMonitor will detect the change within ~300ms.
140
+ *
141
+ * Important: use in-place writes for existing files so filesystem birthtime
142
+ * (used as createdAt in MCP responses) does not reset on every edit.
143
+ */
144
+ export function writeNoteFile(filePath, content) {
145
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(getNotePlanPath(), filePath);
146
+ ensurePathInsideRoot(fullPath, getNotePlanPath(), 'File path');
147
+ // Ensure directory exists
148
+ const dir = path.dirname(fullPath);
149
+ if (!fs.existsSync(dir)) {
150
+ fs.mkdirSync(dir, { recursive: true });
151
+ }
152
+ // Normalize line endings to Unix style
153
+ const normalizedContent = content.replace(/\r\n/g, '\n');
154
+ // Preserve createdAt for existing notes by avoiding temp-file rename.
155
+ // Renaming a temp file replaces the inode and resets birthtime.
156
+ if (fs.existsSync(fullPath)) {
157
+ fs.writeFileSync(fullPath, normalizedContent, { encoding: 'utf-8' });
158
+ return;
159
+ }
160
+ // For new files, create exclusively to avoid accidental overwrite races.
161
+ try {
162
+ fs.writeFileSync(fullPath, normalizedContent, { encoding: 'utf-8', flag: 'wx' });
163
+ }
164
+ catch (error) {
165
+ const maybeErrno = error;
166
+ if (maybeErrno.code === 'EEXIST') {
167
+ fs.writeFileSync(fullPath, normalizedContent, { encoding: 'utf-8' });
168
+ return;
169
+ }
170
+ throw error;
171
+ }
172
+ }
173
+ /**
174
+ * Create a new project note
175
+ */
176
+ export function createProjectNote(title, content = '', folder) {
177
+ // Sanitize title for filename
178
+ const safeTitle = sanitizeFilename(title);
179
+ const folderPath = folder ? path.join('Notes', folder) : 'Notes';
180
+ const ext = getFileExtension(); // Use detected extension
181
+ const filePath = path.join(folderPath, `${safeTitle}${ext}`);
182
+ // Check if file already exists (with any extension)
183
+ const fullPath = path.join(getNotePlanPath(), filePath);
184
+ const altExt = ext === '.txt' ? '.md' : '.txt';
185
+ const altPath = path.join(getNotePlanPath(), folderPath, `${safeTitle}${altExt}`);
186
+ if (fs.existsSync(fullPath)) {
187
+ throw new Error(`Note already exists: ${filePath}`);
188
+ }
189
+ if (fs.existsSync(altPath)) {
190
+ throw new Error(`Note already exists: ${path.join(folderPath, `${safeTitle}${altExt}`)}`);
191
+ }
192
+ // Create content with title as heading if content is empty
193
+ const noteContent = content || `# ${title}\n\n`;
194
+ writeNoteFile(filePath, noteContent);
195
+ return filePath;
196
+ }
197
+ /**
198
+ * Create or update a calendar note
199
+ */
200
+ export function createCalendarNote(dateStr, content) {
201
+ // Use the detected configuration for file path
202
+ const filePath = buildCalendarNotePath(dateStr);
203
+ writeNoteFile(filePath, content);
204
+ return filePath;
205
+ }
206
+ /**
207
+ * Append content to a note
208
+ */
209
+ export function appendToNote(filePath, content) {
210
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(getNotePlanPath(), filePath);
211
+ ensurePathInsideRoot(fullPath, getNotePlanPath(), 'File path');
212
+ if (!fs.existsSync(fullPath)) {
213
+ throw new Error(`Note not found: ${filePath}`);
214
+ }
215
+ const existingContent = fs.readFileSync(fullPath, 'utf-8');
216
+ const newContent = existingContent.endsWith('\n')
217
+ ? existingContent + content
218
+ : existingContent + '\n' + content;
219
+ writeNoteFile(filePath, newContent);
220
+ }
221
+ /**
222
+ * Prepend content to a note (after frontmatter if present)
223
+ */
224
+ export function prependToNote(filePath, content) {
225
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(getNotePlanPath(), filePath);
226
+ ensurePathInsideRoot(fullPath, getNotePlanPath(), 'File path');
227
+ if (!fs.existsSync(fullPath)) {
228
+ throw new Error(`Note not found: ${filePath}`);
229
+ }
230
+ const existingContent = fs.readFileSync(fullPath, 'utf-8');
231
+ const lines = existingContent.split('\n');
232
+ // Find end of frontmatter if present
233
+ let insertIndex = 0;
234
+ if (lines[0]?.trim() === '---') {
235
+ for (let i = 1; i < lines.length; i++) {
236
+ if (lines[i]?.trim() === '---') {
237
+ insertIndex = i + 1;
238
+ break;
239
+ }
240
+ }
241
+ }
242
+ // Insert content
243
+ lines.splice(insertIndex, 0, content);
244
+ writeNoteFile(filePath, lines.join('\n'));
245
+ }
246
+ /**
247
+ * Update a note's content
248
+ */
249
+ export function updateNote(filePath, content) {
250
+ const fullPath = toLocalNoteAbsolutePath(filePath);
251
+ if (!fs.existsSync(fullPath)) {
252
+ throw new Error(`Note not found: ${filePath}`);
253
+ }
254
+ writeNoteFile(filePath, content);
255
+ }
256
+ /**
257
+ * Delete a note (move to trash)
258
+ */
259
+ export function deleteNote(filePath) {
260
+ const fullPath = toLocalNoteAbsolutePath(filePath);
261
+ if (!fs.existsSync(fullPath)) {
262
+ throw new Error(`Note not found: ${filePath}`);
263
+ }
264
+ // Move to @Trash folder
265
+ const trashPath = path.join(getNotePlanPath(), '@Trash');
266
+ if (!fs.existsSync(trashPath)) {
267
+ fs.mkdirSync(trashPath, { recursive: true });
268
+ }
269
+ const filename = path.basename(fullPath);
270
+ const trashFilePath = path.join(trashPath, filename);
271
+ // Handle duplicate filenames in trash
272
+ let finalTrashPath = trashFilePath;
273
+ let counter = 1;
274
+ while (fs.existsSync(finalTrashPath)) {
275
+ const ext = path.extname(filename);
276
+ const base = path.basename(filename, ext);
277
+ finalTrashPath = path.join(trashPath, `${base}-${counter}${ext}`);
278
+ counter++;
279
+ }
280
+ fs.renameSync(fullPath, finalTrashPath);
281
+ return path.relative(getNotePlanPath(), finalTrashPath);
282
+ }
283
+ /**
284
+ * Preview local note move target without mutating the filesystem
285
+ */
286
+ export function previewMoveLocalNote(filePath, destinationFolder) {
287
+ const fullPath = toLocalNoteAbsolutePath(filePath);
288
+ if (!fs.existsSync(fullPath)) {
289
+ throw new Error(`Note not found: ${filePath}`);
290
+ }
291
+ if (fs.statSync(fullPath).isDirectory()) {
292
+ throw new Error(`Not a note file: ${filePath}`);
293
+ }
294
+ const notesRoot = getNotesPath();
295
+ ensurePathInsideRoot(fullPath, notesRoot, 'Source note');
296
+ const normalizedDestinationFolder = normalizeMoveDestinationFolderInput(destinationFolder, path.basename(fullPath));
297
+ const destinationDir = path.join(getNotePlanPath(), normalizedDestinationFolder);
298
+ ensurePathInsideRoot(destinationDir, notesRoot, 'Destination folder');
299
+ const nextAbsolutePath = path.join(destinationDir, path.basename(fullPath));
300
+ if (path.resolve(nextAbsolutePath) === path.resolve(fullPath)) {
301
+ throw new Error('Note is already in the destination folder');
302
+ }
303
+ if (fs.existsSync(nextAbsolutePath)) {
304
+ throw new Error(`A note already exists at destination: ${path.relative(getNotePlanPath(), nextAbsolutePath)}`);
305
+ }
306
+ return {
307
+ fromFilename: path.relative(getNotePlanPath(), fullPath),
308
+ toFilename: path.relative(getNotePlanPath(), nextAbsolutePath),
309
+ destinationFolder: normalizedDestinationFolder,
310
+ };
311
+ }
312
+ /**
313
+ * Move a local note to another folder
314
+ */
315
+ export function moveLocalNote(filePath, destinationFolder) {
316
+ const preview = previewMoveLocalNote(filePath, destinationFolder);
317
+ const sourcePath = path.join(getNotePlanPath(), preview.fromFilename);
318
+ const targetPath = path.join(getNotePlanPath(), preview.toFilename);
319
+ const targetDir = path.dirname(targetPath);
320
+ if (!fs.existsSync(targetDir)) {
321
+ fs.mkdirSync(targetDir, { recursive: true });
322
+ }
323
+ fs.renameSync(sourcePath, targetPath);
324
+ return preview.toFilename;
325
+ }
326
+ /**
327
+ * Preview restoring a local note from @Trash into Notes
328
+ */
329
+ export function previewRestoreLocalNoteFromTrash(filePath, destinationFolder) {
330
+ const fullPath = toLocalNoteAbsolutePath(filePath);
331
+ if (!fs.existsSync(fullPath)) {
332
+ throw new Error(`Note not found: ${filePath}`);
333
+ }
334
+ if (fs.statSync(fullPath).isDirectory()) {
335
+ throw new Error(`Not a note file: ${filePath}`);
336
+ }
337
+ const trashRoot = path.join(getNotePlanPath(), '@Trash');
338
+ ensurePathInsideRoot(fullPath, trashRoot, 'Source note');
339
+ const normalizedDestinationFolder = normalizeFolderInput(destinationFolder);
340
+ const destinationDir = path.join(getNotePlanPath(), normalizedDestinationFolder);
341
+ ensurePathInsideRoot(destinationDir, getNotesPath(), 'Destination folder');
342
+ const nextAbsolutePath = path.join(destinationDir, path.basename(fullPath));
343
+ if (fs.existsSync(nextAbsolutePath)) {
344
+ throw new Error(`A note already exists at destination: ${path.relative(getNotePlanPath(), nextAbsolutePath)}`);
345
+ }
346
+ return {
347
+ fromFilename: path.relative(getNotePlanPath(), fullPath),
348
+ toFilename: path.relative(getNotePlanPath(), nextAbsolutePath),
349
+ destinationFolder: normalizedDestinationFolder,
350
+ };
351
+ }
352
+ /**
353
+ * Restore a local note from @Trash into Notes
354
+ */
355
+ export function restoreLocalNoteFromTrash(filePath, destinationFolder) {
356
+ const preview = previewRestoreLocalNoteFromTrash(filePath, destinationFolder);
357
+ const sourcePath = path.join(getNotePlanPath(), preview.fromFilename);
358
+ const targetPath = path.join(getNotePlanPath(), preview.toFilename);
359
+ const targetDir = path.dirname(targetPath);
360
+ if (!fs.existsSync(targetDir)) {
361
+ fs.mkdirSync(targetDir, { recursive: true });
362
+ }
363
+ fs.renameSync(sourcePath, targetPath);
364
+ return preview.toFilename;
365
+ }
366
+ /**
367
+ * Preview local note rename target without mutating the filesystem
368
+ */
369
+ export function previewRenameLocalNoteFile(filePath, newFilename, keepExtension = true) {
370
+ const fullPath = toLocalNoteAbsolutePath(filePath);
371
+ if (!fs.existsSync(fullPath)) {
372
+ throw new Error(`Note not found: ${filePath}`);
373
+ }
374
+ if (fs.statSync(fullPath).isDirectory()) {
375
+ throw new Error(`Not a note file: ${filePath}`);
376
+ }
377
+ const notesRoot = getNotesPath();
378
+ ensurePathInsideRoot(fullPath, notesRoot, 'Source note');
379
+ const nextBasename = resolveRenamedFilename(fullPath, newFilename, keepExtension);
380
+ const nextAbsolutePath = path.join(path.dirname(fullPath), nextBasename);
381
+ if (path.resolve(nextAbsolutePath) === path.resolve(fullPath)) {
382
+ throw new Error('New filename matches current filename');
383
+ }
384
+ if (fs.existsSync(nextAbsolutePath)) {
385
+ throw new Error(`A note already exists with filename: ${path.relative(getNotePlanPath(), nextAbsolutePath)}`);
386
+ }
387
+ return {
388
+ fromFilename: path.relative(getNotePlanPath(), fullPath),
389
+ toFilename: path.relative(getNotePlanPath(), nextAbsolutePath),
390
+ };
391
+ }
392
+ /**
393
+ * Rename a local note file inside the same folder
394
+ */
395
+ export function renameLocalNoteFile(filePath, newFilename, keepExtension = true) {
396
+ const preview = previewRenameLocalNoteFile(filePath, newFilename, keepExtension);
397
+ const sourcePath = path.join(getNotePlanPath(), preview.fromFilename);
398
+ const targetPath = path.join(getNotePlanPath(), preview.toFilename);
399
+ fs.renameSync(sourcePath, targetPath);
400
+ return preview.toFilename;
401
+ }
402
+ /**
403
+ * Preview creating a local folder under Notes
404
+ */
405
+ export function previewCreateFolder(folderPath) {
406
+ const normalized = normalizeLocalFolderPath(folderPath, 'Folder path');
407
+ if (!normalized) {
408
+ throw new Error('Folder path is required');
409
+ }
410
+ const fullPath = path.join(getNotesPath(), normalized);
411
+ ensurePathInsideRoot(fullPath, getNotesPath(), 'Folder path');
412
+ if (fs.existsSync(fullPath)) {
413
+ throw new Error(`Folder already exists: ${normalized}`);
414
+ }
415
+ return normalized;
416
+ }
417
+ /**
418
+ * Create a folder in the Notes directory
419
+ */
420
+ export function createFolder(folderPath) {
421
+ const normalized = previewCreateFolder(folderPath);
422
+ const fullPath = path.join(getNotesPath(), normalized);
423
+ if (!fs.existsSync(fullPath)) {
424
+ fs.mkdirSync(fullPath, { recursive: true });
425
+ }
426
+ return normalized;
427
+ }
428
+ /**
429
+ * Preview deleting a local folder (validates and returns normalized path)
430
+ */
431
+ export function previewDeleteLocalFolder(folderPath) {
432
+ const normalized = normalizeLocalFolderPath(folderPath, 'Source folder');
433
+ if (!normalized) {
434
+ throw new Error('Folder path is required');
435
+ }
436
+ const fullPath = path.join(getNotesPath(), normalized);
437
+ ensurePathInsideRoot(fullPath, getNotesPath(), 'Source folder');
438
+ if (!fs.existsSync(fullPath)) {
439
+ throw new Error(`Folder not found: ${normalized}`);
440
+ }
441
+ if (!fs.statSync(fullPath).isDirectory()) {
442
+ throw new Error(`Not a folder: ${normalized}`);
443
+ }
444
+ const folderName = path.basename(fullPath);
445
+ if (folderName.toLowerCase() === '@trash') {
446
+ throw new Error('Cannot delete the @Trash folder');
447
+ }
448
+ return normalized;
449
+ }
450
+ /**
451
+ * Delete a local folder (move to @Trash)
452
+ */
453
+ export function deleteLocalFolder(folderPath) {
454
+ const normalized = previewDeleteLocalFolder(folderPath);
455
+ const fullPath = path.join(getNotesPath(), normalized);
456
+ const folderName = path.basename(fullPath);
457
+ // Move to @Trash folder
458
+ const trashPath = path.join(getNotePlanPath(), '@Trash');
459
+ if (!fs.existsSync(trashPath)) {
460
+ fs.mkdirSync(trashPath, { recursive: true });
461
+ }
462
+ let targetPath = path.join(trashPath, folderName);
463
+ let counter = 1;
464
+ while (fs.existsSync(targetPath)) {
465
+ targetPath = path.join(trashPath, `${folderName}-${counter}`);
466
+ counter++;
467
+ }
468
+ fs.renameSync(fullPath, targetPath);
469
+ return path.relative(getNotePlanPath(), targetPath);
470
+ }
471
+ /**
472
+ * Preview moving a local folder under Notes
473
+ */
474
+ export function previewMoveLocalFolder(sourceFolder, destinationFolder) {
475
+ const normalizedSource = normalizeLocalFolderPath(sourceFolder, 'Source folder');
476
+ if (!normalizedSource) {
477
+ throw new Error('Source folder is required');
478
+ }
479
+ const sourcePath = path.join(getNotesPath(), normalizedSource);
480
+ ensurePathInsideRoot(sourcePath, getNotesPath(), 'Source folder');
481
+ if (!fs.existsSync(sourcePath)) {
482
+ throw new Error(`Source folder not found: ${normalizedSource}`);
483
+ }
484
+ if (!fs.statSync(sourcePath).isDirectory()) {
485
+ throw new Error(`Source is not a folder: ${normalizedSource}`);
486
+ }
487
+ const normalizedDestination = normalizeLocalFolderPath(destinationFolder, 'Destination folder');
488
+ const destinationPath = normalizedDestination
489
+ ? path.join(getNotesPath(), normalizedDestination)
490
+ : getNotesPath();
491
+ ensurePathInsideRoot(destinationPath, getNotesPath(), 'Destination folder');
492
+ if (!fs.existsSync(destinationPath)) {
493
+ throw new Error(`Destination folder not found: ${normalizedDestination || 'Notes'}`);
494
+ }
495
+ if (!fs.statSync(destinationPath).isDirectory()) {
496
+ throw new Error('Destination is not a folder');
497
+ }
498
+ if (path.resolve(destinationPath) === path.resolve(sourcePath) ||
499
+ path.resolve(destinationPath).startsWith(`${path.resolve(sourcePath)}${path.sep}`)) {
500
+ throw new Error('Cannot move a folder into itself or one of its descendants');
501
+ }
502
+ const targetPath = path.join(destinationPath, path.basename(sourcePath));
503
+ if (path.resolve(targetPath) === path.resolve(sourcePath)) {
504
+ throw new Error('Folder is already in the destination');
505
+ }
506
+ if (fs.existsSync(targetPath)) {
507
+ throw new Error(`A folder already exists at destination: ${path.relative(getNotesPath(), targetPath)}`);
508
+ }
509
+ return {
510
+ fromFolder: normalizedSource,
511
+ toFolder: path.relative(getNotesPath(), targetPath).replace(/\\/g, '/'),
512
+ destinationFolder: normalizedDestination || 'Notes',
513
+ };
514
+ }
515
+ /**
516
+ * Move a local folder under Notes
517
+ */
518
+ export function moveLocalFolder(sourceFolder, destinationFolder) {
519
+ const preview = previewMoveLocalFolder(sourceFolder, destinationFolder);
520
+ const sourcePath = path.join(getNotesPath(), preview.fromFolder);
521
+ const targetPath = path.join(getNotesPath(), preview.toFolder);
522
+ fs.renameSync(sourcePath, targetPath);
523
+ return preview;
524
+ }
525
+ /**
526
+ * Preview renaming a local folder in place
527
+ */
528
+ export function previewRenameLocalFolder(sourceFolder, newName) {
529
+ const normalizedSource = normalizeLocalFolderPath(sourceFolder, 'Source folder');
530
+ if (!normalizedSource) {
531
+ throw new Error('Source folder is required');
532
+ }
533
+ const sourcePath = path.join(getNotesPath(), normalizedSource);
534
+ ensurePathInsideRoot(sourcePath, getNotesPath(), 'Source folder');
535
+ if (!fs.existsSync(sourcePath)) {
536
+ throw new Error(`Source folder not found: ${normalizedSource}`);
537
+ }
538
+ if (!fs.statSync(sourcePath).isDirectory()) {
539
+ throw new Error(`Source is not a folder: ${normalizedSource}`);
540
+ }
541
+ let normalizedInput = newName.trim().replace(/\\/g, '/');
542
+ if (!normalizedInput) {
543
+ throw new Error('New folder name is required');
544
+ }
545
+ if (path.isAbsolute(newName)) {
546
+ const absoluteInput = path.resolve(newName);
547
+ ensurePathInsideRoot(absoluteInput, getNotesPath(), 'New folder name path');
548
+ normalizedInput = path.relative(getNotesPath(), absoluteInput).replace(/\\/g, '/');
549
+ }
550
+ normalizedInput = normalizedInput.replace(/^\/+|\/+$/g, '');
551
+ if (!normalizedInput) {
552
+ throw new Error('New folder name is required');
553
+ }
554
+ if (normalizedInput.includes('/')) {
555
+ const expectedParent = path.dirname(normalizedSource).replace(/\\/g, '/');
556
+ let providedParent = path.posix.dirname(normalizedInput);
557
+ if (providedParent === 'Notes') {
558
+ providedParent = '';
559
+ }
560
+ else if (providedParent.startsWith('Notes/')) {
561
+ providedParent = providedParent.slice('Notes/'.length);
562
+ }
563
+ if (providedParent === '.') {
564
+ providedParent = '';
565
+ }
566
+ if ((expectedParent === '.' ? '' : expectedParent) !== providedParent) {
567
+ throw new Error('newName must stay in the same parent folder. Use folder move to change parent.');
568
+ }
569
+ normalizedInput = path.posix.basename(normalizedInput);
570
+ }
571
+ const safeName = sanitizeFilename(normalizedInput);
572
+ if (!safeName) {
573
+ throw new Error('New folder name is invalid');
574
+ }
575
+ const targetPath = path.join(path.dirname(sourcePath), safeName);
576
+ if (path.resolve(targetPath) === path.resolve(sourcePath)) {
577
+ throw new Error('New folder name matches current name');
578
+ }
579
+ if (fs.existsSync(targetPath)) {
580
+ throw new Error(`A folder with this name already exists: ${path.relative(getNotesPath(), targetPath)}`);
581
+ }
582
+ return {
583
+ fromFolder: normalizedSource,
584
+ toFolder: path.relative(getNotesPath(), targetPath).replace(/\\/g, '/'),
585
+ };
586
+ }
587
+ /**
588
+ * Rename a local folder in place
589
+ */
590
+ export function renameLocalFolder(sourceFolder, newName) {
591
+ const preview = previewRenameLocalFolder(sourceFolder, newName);
592
+ const sourcePath = path.join(getNotesPath(), preview.fromFolder);
593
+ const targetPath = path.join(getNotesPath(), preview.toFolder);
594
+ fs.renameSync(sourcePath, targetPath);
595
+ return preview;
596
+ }
597
+ /**
598
+ * Sanitize a string for use as a filename
599
+ */
600
+ function sanitizeFilename(name) {
601
+ return name
602
+ .replace(/[/\\?%*:|"<>]/g, '-') // Replace illegal characters
603
+ .replace(/\s+/g, ' ') // Normalize whitespace
604
+ .trim();
605
+ }
606
+ /**
607
+ * Ensure a calendar note exists, create if not
608
+ * Returns the path to the existing or newly created note
609
+ */
610
+ export function ensureCalendarNote(dateStr) {
611
+ // First try to find an existing note (checks multiple paths/extensions)
612
+ const existingNote = getCalendarNote(dateStr);
613
+ if (existingNote) {
614
+ return existingNote.filename;
615
+ }
616
+ // Create a new one using detected configuration
617
+ const filePath = buildCalendarNotePath(dateStr);
618
+ writeNoteFile(filePath, '');
619
+ return filePath;
620
+ }
621
+ //# sourceMappingURL=file-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-writer.js","sourceRoot":"","sources":["../../src/noteplan/file-writer.ts"],"names":[],"mappings":"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"}